View Javadoc

    1   /**
    2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
    3    */
    4   package net.sourceforge.pmd.lang.ast.xpath;
    5
    6   import java.util.Iterator;
    7   import java.util.NoSuchElementException;
    8
    9   import net.sourceforge.pmd.lang.ast.Node;
    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          }
    30          Node ret = node;
    31          node = getNextNode(node);
    32          return ret;
    33      }
    34
    35      public void remove() {
    36          throw new UnsupportedOperationException();
    37      }
    38
    39      protected abstract Node getFirstNode(Node contextNode);
    40
    41      protected abstract Node getNextNode(Node contextNode);
    42
    43      protected Node getPreviousSibling(Node contextNode) {
    44          Node parentNode = contextNode.jjtGetParent();
    45          if (parentNode != null) {
    46              int prevPosition = getPositionFromParent(contextNode) - 1;
    47              if (prevPosition >= 0) {
    48                  return parentNode.jjtGetChild(prevPosition);
    49              }
    50          }
    51          return null;
    52      }
    53
    54      private int getPositionFromParent(Node contextNode) {
    55          Node parentNode = contextNode.jjtGetParent();
    56          for (int i = 0; i < parentNode.jjtGetNumChildren(); i++) {
    57              if (parentNode.jjtGetChild(i) == contextNode) {
    58                  return i;
    59              }
    60          }
    61          throw new RuntimeException("Node was not a child of it's parent ???");
    62      }
    63
    64      protected Node getNextSibling(Node contextNode) {
    65          Node parentNode = contextNode.jjtGetParent();
    66          if (parentNode != null) {
    67              int nextPosition = getPositionFromParent(contextNode) + 1;
    68              if (nextPosition < parentNode.jjtGetNumChildren()) {
    69                  return parentNode.jjtGetChild(nextPosition);
    70              }
    71          }
    72          return null;
    73      }
    74
    75      protected Node getFirstChild(Node contextNode) {
    76          if (contextNode.jjtGetNumChildren() > 0) {
    77              return contextNode.jjtGetChild(0);
    78          } else {
    79              return null;
    80          }
    81      }
    82
    83      protected Node getLastChild(Node contextNode) {
    84          if (contextNode.jjtGetNumChildren() > 0) {
    85              return contextNode.jjtGetChild(contextNode.jjtGetNumChildren() - 1);
    86          } else {
    87              return null;
    88          }
    89      }
    90  }