Clover coverage report - PMD - 3.7 Coverage timestamp: Wed May 31 2006 09:25:59 EDT FRAMES NO FRAMES |

file stats: | LOC: | 104 |  | Methods: | 8
| NCLOC: | 84 |  | Classes: | 2

Source file | Conditionals | Statements | Methods | TOTAL
AttributeAxisIterator.java | 94.4% | 97.1% | 100% | 96.7% |

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.lang.reflect.Method;
9 |  | import java.util.ArrayList;
10 |  | import java.util.HashMap;
11 |  | import java.util.Iterator;
12 |  | import java.util.List;
13 |  | import java.util.Map;
14 |  |
15 |  | public class AttributeAxisIterator implements Iterator {
16 |  |
17 |  | private static class MethodWrapper {
18 |  | public Method method;
19 |  | public String name;
20 |  |
21 | 1575 | public MethodWrapper(Method m) {
22 | 1575 | this.method = m;
23 | 1575 | this.name = truncateMethodName(m.getName());
24 |  | }
25 |  |
26 | 1575 | private String truncateMethodName(String n) {
27 |  | // about 70% of the methods start with 'get', so this case goes first
28 | 1575 | if (n.startsWith("get")) {
29 | 976 | n = n.substring("get".length());
30 | 599 | } else if (n.startsWith("is")) {
31 | 583 | n = n.substring("is".length());
32 | 16 | } else if (n.startsWith("has")) {
33 | 2 | n = n.substring("has".length());
34 | 14 | } else if (n.startsWith("uses")) {
35 | 8 | n = n.substring("uses".length());
36 |  | }
37 | 1575 | return n;
38 |  | }
39 |  | }
40 |  |
41 |  | private Object currObj;
42 |  | private MethodWrapper[] methodWrappers;
43 |  | private int position;
44 |  | private Node node;
45 |  |
46 |  | private static Map methodCache = new HashMap();
47 |  |
48 | 974 | public AttributeAxisIterator(Node contextNode) {
49 | 974 | this.node = contextNode;
50 | 974 | if (!methodCache.containsKey(contextNode.getClass())) {
51 | 176 | Method[] preFilter = contextNode.getClass().getMethods();
52 | 176 | List postFilter = new ArrayList();
53 | 176 | for (int i = 0; i < preFilter.length; i++) {
54 | 9486 | if (isAttribute(preFilter[i])) {
55 | 1575 | postFilter.add(new MethodWrapper(preFilter[i]));
56 |  | }
57 |  | }
58 | 176 | methodCache.put(contextNode.getClass(), (MethodWrapper[]) postFilter.toArray(new MethodWrapper[postFilter.size()]));
59 |  | }
60 | 974 | this.methodWrappers = (MethodWrapper[]) methodCache.get(contextNode.getClass());
61 |  |
62 | 974 | this.position = 0;
63 | 974 | this.currObj = getNextAttribute();
64 |  | }
65 |  |
66 | 8742 | public Object next() {
67 | 8742 | if (currObj == null) {
68 | 0 | throw new IndexOutOfBoundsException();
69 |  | }
70 | 8742 | Object ret = currObj;
71 | 8742 | currObj = getNextAttribute();
72 | 8742 | return ret;
73 |  | }
74 |  |
75 | 10688 | public boolean hasNext() {
76 | 10688 | return currObj != null;
77 |  | }
78 |  |
79 | 1 | public void remove() {
80 | 1 | throw new UnsupportedOperationException();
81 |  | }
82 |  |
83 | 9716 | private Attribute getNextAttribute() {
84 | 9716 | if (position == methodWrappers.length) {
85 | 973 | return null;
86 |  | }
87 | 8743 | MethodWrapper m = methodWrappers[position];
88 | 8743 | position++;
89 | 8743 | return new Attribute(node, m.name, m.method);
90 |  | }
91 |  |
92 | 9486 | protected boolean isAttribute(Method method) {
93 | 9486 | return (Integer.TYPE == method.getReturnType() || Boolean.TYPE == method.getReturnType() || String.class == method.getReturnType())
94 |  | && (method.getParameterTypes().length == 0)
95 |  | && (Void.TYPE != method.getReturnType())
96 |  | && !method.getName().startsWith("jjt")
97 |  | && !method.getName().equals("toString")
98 |  | && !method.getName().equals("getScope")
99 |  | && !method.getName().equals("getClass")
100 |  | && !method.getName().equals("getTypeNameNode")
101 |  | && !method.getName().equals("getImportedNameNode")
102 |  | && !method.getName().equals("hashCode");
103 |  | }
104 |  | }