KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sourceforge > pmd > jaxen > NodeIterator


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 JavaDoc;
9 import java.util.NoSuchElementException JavaDoc;
10
11 /**
12  * @author daniels
13  */

14 public abstract class NodeIterator implements Iterator JavaDoc {
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 JavaDoc next() {
27         if (node == null)
28             throw new NoSuchElementException JavaDoc();
29         Node ret = node;
30         node = getNextNode(node);
31         return ret;
32     }
33
34     public void remove() {
35         throw new UnsupportedOperationException JavaDoc();
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 JavaDoc("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