/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.jaxen; import net.sourceforge.pmd.ast.Node; import java.util.Iterator; import java.util.NoSuchElementException; /** * @author daniels * * To change this generated comment go to * Window>Preferences>Java>Code Generation>Code Template */ public abstract class NodeIterator implements Iterator { private Node node; public NodeIterator(Node contextNode) { this.node = getFirstNode(contextNode); } public boolean hasNext() { return node != null; } public Object next() { if (node == null) throw new NoSuchElementException(); Node ret = node; node = getNextNode(node); return ret; } public void remove() { throw new UnsupportedOperationException(); } protected abstract Node getFirstNode(Node contextNode); protected abstract Node getNextNode(Node contextNode); protected Node getPreviousSibling(Node contextNode) { Node parentNode = contextNode.jjtGetParent(); if(parentNode != null) { int prevPosition = getPositionFromParent(contextNode) - 1; if (prevPosition >= 0) { return parentNode.jjtGetChild(prevPosition); } } return null; } private int getPositionFromParent(Node contextNode) { Node parentNode = contextNode.jjtGetParent(); for (int i = 0; i < parentNode.jjtGetNumChildren(); i++) { if (parentNode.jjtGetChild(i) == contextNode) { return i; } } throw new RuntimeException("Node was not a child of it's parent ???"); } protected Node getNextSibling(Node contextNode) { Node parentNode = contextNode.jjtGetParent(); if(parentNode != null) { int nextPosition = getPositionFromParent(contextNode) + 1; if (nextPosition < parentNode.jjtGetNumChildren()) { return parentNode.jjtGetChild(nextPosition); } } return null; } protected Node getFirstChild(Node contextNode) { if (contextNode.jjtGetNumChildren() > 0) { return contextNode.jjtGetChild(0); } else { return null; } } protected Node getLastChild(Node contextNode) { if (contextNode.jjtGetNumChildren() > 0) { return contextNode.jjtGetChild(contextNode.jjtGetNumChildren() - 1); } else { return null; } } }