Clover coverage report - PMD - 3.9 Coverage timestamp: Tue Dec 19 2006 09:38:44 EST FRAMES NO FRAMES |
file stats: | LOC: | 324 |  | Methods: | 37
| NCLOC: | 247 |  | Classes: | 1
Source file | Conditionals | Statements | Methods | TOTAL
SimpleNode.java | 69.4% | 69.9% | 83.8% | 72.2% |

1 |  | /* Generated By:JJTree: Do not edit this line. SimpleNode.java */
2 |  | package net.sourceforge.pmd.ast;
3 |  |
4 |  | import net.sourceforge.pmd.dfa.IDataFlowNode;
5 |  | import net.sourceforge.pmd.jaxen.Attribute;
6 |  | import net.sourceforge.pmd.jaxen.DocumentNavigator;
7 |  | import net.sourceforge.pmd.symboltable.Scope;
8 |  | import org.jaxen.BaseXPath;
9 |  | import org.jaxen.JaxenException;
10 |  | import org.w3c.dom.Document;
11 |  | import org.w3c.dom.Element;
12 |  |
13 |  | import javax.xml.parsers.DocumentBuilderFactory;
14 |  | import javax.xml.parsers.DocumentBuilder;
15 |  | import javax.xml.parsers.ParserConfigurationException;
16 |  | import java.util.ArrayList;
17 |  | import java.util.Iterator;
18 |  | import java.util.List;
19 |  |
20 |  | public abstract class SimpleNode implements Node {
21 |  |
22 |  | protected Node parent;
23 |  | protected Node[] children;
24 |  | protected int id;
25 |  | protected JavaParser parser;
26 |  | private String image;
27 |  | protected int beginLine = -1;
28 |  | protected int endLine;
29 |  | protected int beginColumn = -1;
30 |  | protected int endColumn;
31 |  | private Scope scope;
32 |  | private IDataFlowNode dataFlowNode;
33 |  |
34 | 127 | public IDataFlowNode getDataFlowNode() {
35 | 127 | if (this.dataFlowNode == null) {
36 | 37 | if (this.parent != null) {
37 | 37 | return ((SimpleNode) parent).getDataFlowNode();
38 |  | }
39 | 0 | return null; //TODO wise?
40 |  | }
41 | 90 | return dataFlowNode;
42 |  | }
43 |  |
44 | 230 | public void setDataFlowNode(IDataFlowNode dataFlowNode) {
45 | 230 | this.dataFlowNode = dataFlowNode;
46 |  | }
47 |  |
48 | 108659 | public SimpleNode(int i) {
49 | 108659 | id = i;
50 |  | }
51 |  |
52 | 84409 | public SimpleNode(JavaParser p, int i) {
53 | 84409 | this(i);
54 | 84409 | parser = p;
55 |  | }
56 |  |
57 | 29745 | public void setScope(Scope scope) {
58 | 29745 | this.scope = scope;
59 |  | }
60 |  |
61 | 48289 | public Scope getScope() {
62 | 48289 | if (scope == null) {
63 | 34195 | return ((SimpleNode) parent).getScope();
64 |  | }
65 | 14094 | return scope;
66 |  | }
67 |  |
68 | 3219 | public int getBeginLine() {
69 | 3219 | return beginLine;
70 |  | }
71 |  |
72 |  | // A label is a more visually useful image, e.g.
73 |  | // int[[ for a primary suffix that's a 2D array of ints
74 |  | // this is used only by the Designer to show nodes more helpfully
75 | 0 | public String getLabel() {
76 | 0 | return null;
77 |  | }
78 |  |
79 | 207 | public boolean hasImageEqualTo(String arg) {
80 | 207 | return image != null && image.equals(arg);
81 |  | }
82 |  |
83 | 25605 | public void testingOnly__setBeginLine(int i) {
84 | 25605 | this.beginLine = i;
85 |  | }
86 |  |
87 | 45403 | public void testingOnly__setBeginColumn(int i) {
88 | 45403 | this.beginColumn = i;
89 |  | }
90 |  |
91 | 2900 | public int getBeginColumn() {
92 | 2900 | if (beginColumn != -1) {
93 | 2900 | return beginColumn;
94 |  | } else {
95 | 0 | if ((children != null) && (children.length > 0)) {
96 | 0 | return ((SimpleNode) children[0]).getBeginColumn();
97 |  | } else {
98 | 0 | throw new RuntimeException("Unable to determine begining line of Node.");
99 |  | }
100 |  | }
101 |  | }
102 |  |
103 | 34388 | public String getImage() {
104 | 34388 | return image;
105 |  | }
106 |  |
107 | 10338 | public void setImage(String image) {
108 | 10338 | this.image = image;
109 |  | }
110 |  |
111 | 2955 | public int getEndLine() {
112 | 2955 | return endLine;
113 |  | }
114 |  |
115 | 2900 | public int getEndColumn() {
116 | 2900 | return endColumn;
117 |  | }
118 |  |
119 | 27 | public Node getNthParent(int n) {
120 | 27 | Node result = null;
121 | 27 | for (int i = 0; i < n; i++) {
122 | 127 | if (result == null) {
123 | 27 | result = this.jjtGetParent();
124 |  | } else {
125 | 100 | result = result.jjtGetParent();
126 |  | }
127 |  | }
128 | 27 | return result;
129 |  | }
130 |  |
131 |  | /**
132 |  | * Traverses up the tree to find the first parent instance of type parentType
133 |  | *
134 |  | * @param parentType class which you want to find.
135 |  | * @return Node of type parentType. Returns null if none found.
136 |  | */
137 | 7224 | public Node getFirstParentOfType(Class parentType) {
138 | 7224 | Node parentNode = jjtGetParent();
139 | 7224 | while (parentNode != null && parentNode.getClass() != parentType) {
140 | 11976 | parentNode = parentNode.jjtGetParent();
141 |  | }
142 | 7224 | return parentNode;
143 |  | }
144 |  |
145 |  | /**
146 |  | * Traverses up the tree to find all of the parent instances of type parentType
147 |  | *
148 |  | * @param parentType classes which you want to find.
149 |  | * @return List of parentType instances found.
150 |  | */
151 | 11599 | public List getParentsOfType(Class parentType) {
152 | 11599 | List parents = new ArrayList();
153 | 11599 | Node parentNode = jjtGetParent();
154 | 11599 | while (parentNode != null) {
155 | 22963 | if (parentNode.getClass() == parentType) {
156 | 1298 | parents.add(parentNode);
157 |  | }
158 | 22963 | parentNode = parentNode.jjtGetParent();
159 |  | }
160 | 11599 | return parents;
161 |  | }
162 |  |
163 | 2639 | public List findChildrenOfType(Class targetType) {
164 | 2639 | List list = new ArrayList();
165 | 2639 | findChildrenOfType(targetType, list);
166 | 2639 | return list;
167 |  | }
168 |  |
169 | 2662 | public void findChildrenOfType(Class targetType, List results) {
170 | 2662 | findChildrenOfType(this, targetType, results, true);
171 |  | }
172 |  |
173 | 58 | public void findChildrenOfType(Class targetType, List results, boolean descendIntoNestedClasses) {
174 | 58 | this.findChildrenOfType(this, targetType, results, descendIntoNestedClasses);
175 |  | }
176 |  |
177 | 47835 | private void findChildrenOfType(Node node, Class targetType, List results, boolean descendIntoNestedClasses) {
178 | 47835 | if (node.getClass().equals(targetType)) {
179 | 383 | results.add(node);
180 |  | }
181 |  |
182 | 47835 | if (!descendIntoNestedClasses) {
183 | 650 | if (node instanceof ASTClassOrInterfaceDeclaration && ((ASTClassOrInterfaceDeclaration) node).isNested()) {
184 | 0 | return;
185 |  | }
186 |  |
187 | 650 | if (node instanceof ASTClassOrInterfaceBodyDeclaration && ((ASTClassOrInterfaceBodyDeclaration) node).isAnonymousInnerClass()) {
188 | 4 | return;
189 |  | }
190 |  | }
191 |  |
192 | 47831 | for (int i = 0; i < node.jjtGetNumChildren(); i++) {
193 | 59246 | Node child = node.jjtGetChild(i);
194 | 59246 | if (child.jjtGetNumChildren() > 0) {
195 | 45115 | findChildrenOfType(child, targetType, results, descendIntoNestedClasses);
196 |  | } else {
197 | 14131 | if (child.getClass().equals(targetType)) {
198 | 626 | results.add(child);
199 |  | }
200 |  | }
201 |  | }
202 |  | }
203 |  |
204 | 46133 | public void jjtSetParent(Node n) {
205 | 46133 | parent = n;
206 |  | }
207 |  |
208 | 103190 | public Node jjtGetParent() {
209 | 103190 | return parent;
210 |  | }
211 |  |
212 | 46143 | public void jjtAddChild(Node n, int i) {
213 | 46143 | if (children == null) {
214 | 37070 | children = new Node[i + 1];
215 | 9073 | } else if (i >= children.length) {
216 | 4 | Node c[] = new Node[i + 1];
217 | 4 | System.arraycopy(children, 0, c, 0, children.length);
218 | 4 | children = c;
219 |  | }
220 | 46143 | children[i] = n;
221 |  | }
222 |  |
223 | 123406 | public Node jjtGetChild(int i) {
224 | 123406 | return children[i];
225 |  | }
226 |  |
227 | 242997 | public int jjtGetNumChildren() {
228 | 242997 | return (children == null) ? 0 : children.length;
229 |  | }
230 |  |
231 | 0 | public String toString(String prefix) {
232 | 0 | return prefix + toString();
233 |  | }
234 |  |
235 | 0 | public Document asXml() {
236 | 0 | try {
237 | 0 | DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
238 | 0 | DocumentBuilder db = dbf.newDocumentBuilder();
239 | 0 | Document document = db.newDocument();
240 | 0 | appendElement(document);
241 | 0 | return document;
242 |  | } catch (ParserConfigurationException pce) {
243 | 0 | throw new RuntimeException(pce);
244 |  | }
245 |  | }
246 |  |
247 | 0 | protected void appendElement(org.w3c.dom.Node parentNode) {
248 | 0 | DocumentNavigator docNav = new DocumentNavigator();
249 | 0 | Document ownerDocument = parentNode.getOwnerDocument();
250 | 0 | if (ownerDocument == null) {
251 |  | //If the parentNode is a Document itself, it's ownerDocument is null
252 | 0 | ownerDocument = (Document) parentNode;
253 |  | }
254 | 0 | String elementName = docNav.getElementName(this);
255 | 0 | Element element = ownerDocument.createElement(elementName);
256 | 0 | parentNode.appendChild(element);
257 | 0 | for (Iterator iter = docNav.getAttributeAxisIterator(this); iter.hasNext();) {
258 | 0 | Attribute attr = (Attribute) iter.next();
259 | 0 | element.setAttribute(attr.getName(), attr.getValue());
260 |  | }
261 | 0 | for (Iterator iter = docNav.getChildAxisIterator(this); iter.hasNext();) {
262 | 0 | SimpleNode child = (SimpleNode) iter.next();
263 | 0 | child.appendElement(element);
264 |  | }
265 |  | }
266 |  |
267 |  | /* Override this method if you want to customize how the node dumps
268 |  | out its children. */
269 | 0 | public void dump(String prefix) {
270 | 0 | System.out.println(toString(prefix) + (image == null ? "" : ":" + image));
271 | 0 | dumpChildren(prefix);
272 |  | }
273 |  |
274 | 0 | protected void dumpChildren(String prefix) {
275 | 0 | if (children != null) {
276 | 0 | for (int i = 0; i < children.length; ++i) {
277 | 0 | SimpleNode n = (SimpleNode) children[i];
278 | 0 | if (n != null) {
279 | 0 | n.dump(prefix + " ");
280 |  | }
281 |  | }
282 |  | }
283 |  | }
284 |  |
285 |  |
286 |  | /**
287 |  | * Traverses down the tree to find the first child instance of type childType
288 |  | *
289 |  | * @param childType class which you want to find.
290 |  | * @return Node of type childType. Returns <code>null</code> if none found.
291 |  | */
292 | 2175 | public Node getFirstChildOfType(Class childType) {
293 | 2175 | return getFirstChildOfType(childType, this);
294 |  | }
295 |  |
296 | 7568 | private Node getFirstChildOfType(Class childType, Node node) {
297 | 7568 | for (int i = 0; i < node.jjtGetNumChildren(); i++) {
298 | 7454 | Node n = node.jjtGetChild(i);
299 | 7454 | if (n != null) {
300 | 7452 | if (n.getClass().equals(childType))
301 | 2059 | return n;
302 | 5393 | Node n2 = getFirstChildOfType(childType, n);
303 | 5393 | if (n2 != null)
304 | 1894 | return n2;
305 |  | }
306 |  | }
307 | 3615 | return null;
308 |  | }
309 |  |
310 |  | /**
311 |  | * Finds if this node contains a child of the given type.
312 |  | * This is an utility method that uses {@link #findChildrenOfType(Class)}
313 |  | *
314 |  | * @param type the node type to search
315 |  | * @return <code>true</code> if there is at lease on child of the given type and <code>false</code> in any other case
316 |  | */
317 | 14 | public final boolean containsChildOfType(Class type) {
318 | 14 | return !findChildrenOfType(type).isEmpty();
319 |  | }
320 |  |
321 | 7 | public List findChildNodesWithXPath(String xpathString) throws JaxenException {
322 | 7 | return new BaseXPath(xpathString, new DocumentNavigator()).selectNodes(this);
323 |  | }
324 |  | }