1
2
3
4 package net.sourceforge.pmd.lang.ast.xpath;
5
6 import java.util.ArrayList;
7 import java.util.Iterator;
8
9 import net.sourceforge.pmd.lang.ast.Node;
10 import net.sourceforge.pmd.lang.ast.RootNode;
11
12 import org.jaxen.DefaultNavigator;
13 import org.jaxen.XPath;
14 import org.jaxen.util.SingleObjectIterator;
15
16
17
18
19 public class DocumentNavigator extends DefaultNavigator {
20
21 private final static Iterator<Node> EMPTY_ITERATOR = new ArrayList<Node>().iterator();
22
23 public String getAttributeName(Object arg0) {
24 return ((Attribute) arg0).getName();
25 }
26
27 public String getAttributeNamespaceUri(Object arg0) {
28 return "";
29 }
30
31 public String getAttributeQName(Object arg0) {
32 return ((Attribute) arg0).getName();
33 }
34
35 public String getAttributeStringValue(Object arg0) {
36 return ((Attribute) arg0).getStringValue();
37 }
38
39 public String getCommentStringValue(Object arg0) {
40 return "";
41 }
42
43 public String getElementName(Object node) {
44 return node.toString();
45 }
46
47 public String getElementNamespaceUri(Object arg0) {
48 return "";
49 }
50
51 public String getElementQName(Object arg0) {
52 return getElementName(arg0);
53 }
54
55 public String getElementStringValue(Object arg0) {
56 return "";
57 }
58
59 public String getNamespacePrefix(Object arg0) {
60 return "";
61 }
62
63 public String getNamespaceStringValue(Object arg0) {
64 return "";
65 }
66
67 public String getTextStringValue(Object arg0) {
68 return "";
69 }
70
71 public boolean isAttribute(Object arg0) {
72 return arg0 instanceof Attribute;
73 }
74
75 public boolean isComment(Object arg0) {
76 return false;
77 }
78
79 public boolean isDocument(Object arg0) {
80 return arg0 instanceof RootNode;
81 }
82
83 public boolean isElement(Object arg0) {
84 return arg0 instanceof Node;
85 }
86
87 public boolean isNamespace(Object arg0) {
88 return false;
89 }
90
91 public boolean isProcessingInstruction(Object arg0) {
92 return false;
93 }
94
95 public boolean isText(Object arg0) {
96 return false;
97 }
98
99 public XPath parseXPath(String arg0) {
100 return null;
101 }
102
103 @Override
104 public Object getParentNode(Object arg0) {
105 if (arg0 instanceof Node) {
106 return ((Node) arg0).jjtGetParent();
107 }
108 return ((Attribute) arg0).getParent();
109 }
110
111 @Override
112 public Iterator<Attribute> getAttributeAxisIterator(Object arg0) {
113 if (arg0 instanceof AttributeNode) {
114 return ((AttributeNode) arg0).getAttributeIterator();
115 } else {
116 return new AttributeAxisIterator((Node) arg0);
117 }
118 }
119
120
121
122
123
124
125
126 @Override
127 public Iterator<Node> getChildAxisIterator(Object contextNode) {
128 return new NodeIterator((Node) contextNode) {
129 @Override
130 protected Node getFirstNode(Node node) {
131 return getFirstChild(node);
132 }
133
134 @Override
135 protected Node getNextNode(Node node) {
136 return getNextSibling(node);
137 }
138 };
139 }
140
141
142
143
144
145
146
147 @Override
148 public Iterator<Node> getParentAxisIterator(Object contextNode) {
149 if (isAttribute(contextNode)) {
150 return new SingleObjectIterator(((Attribute) contextNode).getParent());
151 }
152 Node parent = ((Node) contextNode).jjtGetParent();
153 if (parent != null) {
154 return new SingleObjectIterator(parent);
155 } else {
156 return EMPTY_ITERATOR;
157 }
158 }
159
160
161
162
163
164
165
166 @Override
167 public Iterator<Node> getFollowingSiblingAxisIterator(Object contextNode) {
168 return new NodeIterator((Node) contextNode) {
169 @Override
170 protected Node getFirstNode(Node node) {
171 return getNextNode(node);
172 }
173
174 @Override
175 protected Node getNextNode(Node node) {
176 return getNextSibling(node);
177 }
178 };
179 }
180
181
182
183
184
185
186
187 @Override
188 public Iterator<Node> getPrecedingSiblingAxisIterator(Object contextNode) {
189 return new NodeIterator((Node) contextNode) {
190 @Override
191 protected Node getFirstNode(Node node) {
192 return getNextNode(node);
193 }
194
195 @Override
196 protected Node getNextNode(Node node) {
197 return getPreviousSibling(node);
198 }
199 };
200 }
201
202
203
204
205
206
207
208 @Override
209 public Iterator<Node> getFollowingAxisIterator(Object contextNode) {
210 return new NodeIterator((Node) contextNode) {
211 @Override
212 protected Node getFirstNode(Node node) {
213 if (node == null) {
214 return null;
215 } else {
216 Node sibling = getNextSibling(node);
217 if (sibling == null) {
218 return getFirstNode(node.jjtGetParent());
219 } else {
220 return sibling;
221 }
222 }
223 }
224
225 @Override
226 protected Node getNextNode(Node node) {
227 if (node == null) {
228 return null;
229 } else {
230 Node n = getFirstChild(node);
231 if (n == null) {
232 n = getNextSibling(node);
233 }
234 if (n == null) {
235 return getFirstNode(node.jjtGetParent());
236 } else {
237 return n;
238 }
239 }
240 }
241 };
242 }
243
244
245
246
247
248
249
250 @Override
251 public Iterator<Node> getPrecedingAxisIterator(Object contextNode) {
252 return new NodeIterator((Node) contextNode) {
253 @Override
254 protected Node getFirstNode(Node node) {
255 if (node == null) {
256 return null;
257 } else {
258 Node sibling = getPreviousSibling(node);
259 if (sibling == null) {
260 return getFirstNode(node.jjtGetParent());
261 } else {
262 return sibling;
263 }
264 }
265 }
266
267 @Override
268 protected Node getNextNode(Node node) {
269 if (node == null) {
270 return null;
271 } else {
272 Node n = getLastChild(node);
273 if (n == null) {
274 n = getPreviousSibling(node);
275 }
276 if (n == null) {
277 return getFirstNode(node.jjtGetParent());
278 } else {
279 return n;
280 }
281 }
282 }
283 };
284 }
285
286 @Override
287 public Object getDocumentNode(Object contextNode) {
288 if (isDocument(contextNode)) {
289 return contextNode;
290 }
291 return getDocumentNode(getParentNode(contextNode));
292 }
293 }