View Javadoc

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