View Javadoc

1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.jaxen;
5   
6   import net.sourceforge.pmd.ast.Node;
7   
8   import java.util.Iterator;
9   import java.util.NoSuchElementException;
10  
11  /**
12   * @author daniels
13   */
14  public abstract class NodeIterator implements Iterator<Node> {
15  
16      private Node node;
17  
18      public NodeIterator(Node contextNode) {
19          this.node = getFirstNode(contextNode);
20      }
21  
22      public boolean hasNext() {
23          return node != null;
24      }
25  
26      public Node next() {
27          if (node == null)
28              throw new NoSuchElementException();
29          Node ret = node;
30          node = getNextNode(node);
31          return ret;
32      }
33  
34      public void remove() {
35          throw new UnsupportedOperationException();
36      }
37  
38      protected abstract Node getFirstNode(Node contextNode);
39  
40      protected abstract Node getNextNode(Node contextNode);
41  
42      protected Node getPreviousSibling(Node contextNode) {
43          Node parentNode = contextNode.jjtGetParent();
44          if (parentNode != null) {
45              int prevPosition = getPositionFromParent(contextNode) - 1;
46              if (prevPosition >= 0) {
47                  return parentNode.jjtGetChild(prevPosition);
48              }
49          }
50          return null;
51      }
52  
53      private int getPositionFromParent(Node contextNode) {
54          Node parentNode = contextNode.jjtGetParent();
55          for (int i = 0; i < parentNode.jjtGetNumChildren(); i++) {
56              if (parentNode.jjtGetChild(i) == contextNode) {
57                  return i;
58              }
59          }
60          throw new RuntimeException("Node was not a child of it's parent ???");
61      }
62  
63      protected Node getNextSibling(Node contextNode) {
64          Node parentNode = contextNode.jjtGetParent();
65          if (parentNode != null) {
66              int nextPosition = getPositionFromParent(contextNode) + 1;
67              if (nextPosition < parentNode.jjtGetNumChildren()) {
68                  return parentNode.jjtGetChild(nextPosition);
69              }
70          }
71          return null;
72      }
73  
74      protected Node getFirstChild(Node contextNode) {
75          if (contextNode.jjtGetNumChildren() > 0) {
76              return contextNode.jjtGetChild(0);
77          } else {
78              return null;
79          }
80      }
81  
82      protected Node getLastChild(Node contextNode) {
83          if (contextNode.jjtGetNumChildren() > 0) {
84              return contextNode.jjtGetChild(contextNode.jjtGetNumChildren() - 1);
85          } else {
86              return null;
87          }
88      }
89  }