1 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 14 public abstract class NodeIterator implements Iterator { 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 Object 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 } | Popular Tags |