Project dom4j 1.5.2 [5/2/05 10:13 PM]
 
Coverage - org/dom4j/io/ElementStack.java
  /*
   * Copyright 2001-2004 (C) MetaStuff, Ltd. All Rights Reserved.
   * 
   * This software is open source. 
   * See the bottom of this file for the licence.
   * 
   * $Id: ElementStack.java,v 1.12 2004/08/02 18:44:07 maartenc Exp $
   */
 
  package org.dom4j.io;
 
  import org.dom4j.Element;
  import org.dom4j.ElementHandler;
  import org.dom4j.ElementPath;
 
  /** <p><code>ElementStack</code> is used internally inside the 
    * {@link SAXContentHandler} to maintain a stack of {@link Element} 
    * instances. 
    * It opens an integration possibility allowing derivations to prune the tree
    * when a node is complete.</p>
    *
    * @author <a href="mailto:james.strachan@metastuff.com">James Strachan</a>
    * @version $Revision: 1.12 $
    */
  class ElementStack implements ElementPath {
 
      /** stack of <code>Element</code> objects */
      protected Element[] stack;
      
      /** index of the item at the top of the stack or -1 if the stack is empty */
11186x       protected int lastElementIndex = -1;
      
11186x       private DispatchHandler handler = null;
 
      
      public ElementStack() {
11186x           this(50);
11186x       }
      
11186x       public ElementStack(int defaultCapacity) {
11186x           stack = new Element[defaultCapacity];
11186x       }
      
      public void setDispatchHandler(DispatchHandler handler)
      {
32x           this.handler = handler;   
32x       }
      
      public DispatchHandler getDispatchHandler(){
0x          return this.handler;
      }
      
      /** Peeks at the top element on the stack without changing the contents
        * of the stack.
        * 
        * @return the current element on the stack 
        */
      public void clear() {
22364x           lastElementIndex = -1;
22364x       }
      
      /** Peeks at the top element on the stack without changing the contents
        * of the stack.
        * 
        * @return the current element on the stack 
        */
      public Element peekElement() {
2/2 120748x           if ( lastElementIndex < 0 ) { 
11182x               return null;
          }
109566x           return stack[ lastElementIndex ];
      }
      
      /** Pops the element off the stack
        *
        * @return the element that has just been popped off the stack 
        */
      public Element popElement() {
1/2 120500x           if ( lastElementIndex < 0 ) { 
0x               return null;
          }
120500x           return stack[ lastElementIndex-- ];
      }
      
      /** Pushes a new element onto the stack
        * 
        * @return pushes the new element onto the stack and add it to its parent
        * if there is one.
        */
      public void pushElement(Element element) {
120500x           int length = stack.length;
1/2 120500x           if ( ++lastElementIndex >= length ) {
0x               reallocate( length * 2 );
          }
120500x           stack[lastElementIndex] = element;
120500x       }
      
      /** Reallocates the stack to the given size
        */
      protected void reallocate( int size ) {
0x           Element[] oldStack = stack;
0x           stack = new Element[ size ];
0x           System.arraycopy( oldStack, 0, stack, 0, oldStack.length );
0x       }
      
      // The ElementPath Interface
      //
      public int size()
      {
0x           return lastElementIndex + 1;
      }
      
      public Element getElement(int depth)
      {
          Element element;
          try {
0x               element = (Element)stack[depth];   
          }
          catch (ArrayIndexOutOfBoundsException e)
          {
0x               element = null;   
0x           }
0x           return element;
      }
      
      public String getPath()
      {
0/2 0x           if (handler == null) {
0x               setDispatchHandler(new DispatchHandler());
          }
0x           return handler.getPath();
      }
      
      public Element getCurrent()
      {
248x           return peekElement();   
      }
      
      public void addHandler(String path, ElementHandler handler) {
0x           this.handler.addHandler(getHandlerPath(path), handler);
0x       }
      
      public void removeHandler(String path) {
0x           this.handler.removeHandler(getHandlerPath(path));
0x       }
      
      /** @return true when an <code>ElementHandler</code> is registered for
        * the specified path.
        */
      public boolean containsHandler(String path) {
0x           return this.handler.containsHandler(path);
      }
 
      private String getHandlerPath(String path) {
          String handlerPath;
0/2 0x           if (this.handler == null) {
0x               setDispatchHandler(new DispatchHandler());
          }
0/2 0x           if (path.startsWith("/")) {
0x               handlerPath = path;   
          }
0/2 0x           else if (getPath().equals("/")) {
0x               handlerPath = getPath() + path;
          }
          else {
0x               handlerPath = getPath() + "/" + path;   
          }
0x           return handlerPath;
      }
  }
 
 
 
 
  /*
   * Redistribution and use of this software and associated documentation
   * ("Software"), with or without modification, are permitted provided
   * that the following conditions are met:
   *
   * 1. Redistributions of source code must retain copyright
   *    statements and notices.  Redistributions must also contain a
   *    copy of this document.
   *
   * 2. Redistributions in binary form must reproduce the
   *    above copyright notice, this list of conditions and the
   *    following disclaimer in the documentation and/or other
   *    materials provided with the distribution.
   *
   * 3. The name "DOM4J" must not be used to endorse or promote
   *    products derived from this Software without prior written
   *    permission of MetaStuff, Ltd.  For written permission,
   *    please contact dom4j-info@metastuff.com.
   *
   * 4. Products derived from this Software may not be called "DOM4J"
   *    nor may "DOM4J" appear in their names without prior written
   *    permission of MetaStuff, Ltd. DOM4J is a registered
   *    trademark of MetaStuff, Ltd.
   *
   * 5. Due credit should be given to the DOM4J Project - 
   *    http://www.dom4j.org
   *
   * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS
   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
   * METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * Copyright 2001-2004 (C) MetaStuff, Ltd. All Rights Reserved.
   *
   * $Id: ElementStack.java,v 1.12 2004/08/02 18:44:07 maartenc Exp $
   */