Clover coverage report - PMD - 3.9 Coverage timestamp: Tue Dec 19 2006 09:38:44 EST FRAMES NO FRAMES |
file stats: | LOC: | 169 |  | Methods: | 16
| NCLOC: | 124 |  | Classes: | 2
Source file | Conditionals | Statements | Methods | TOTAL
RuleViolation.java | 89.3% | 92.5% | 81.2% | 89.7% |

1 |  | /**
2 |  | * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 |  | */
4 |  | package net.sourceforge.pmd;
5 |  |
6 |  | import net.sourceforge.pmd.ast.ASTClassOrInterfaceBodyDeclaration;
7 |  | import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
8 |  | import net.sourceforge.pmd.ast.ASTFormalParameter;
9 |  | import net.sourceforge.pmd.ast.ASTLocalVariableDeclaration;
10 |  | import net.sourceforge.pmd.ast.ASTMethodDeclaration;
11 |  | import net.sourceforge.pmd.ast.ASTTypeDeclaration;
12 |  | import net.sourceforge.pmd.ast.CanSuppressWarnings;
13 |  | import net.sourceforge.pmd.ast.SimpleNode;
14 |  | import net.sourceforge.pmd.symboltable.MethodScope;
15 |  |
16 |  | import java.util.Comparator;
17 |  | import java.util.Iterator;
18 |  | import java.util.List;
19 |  |
20 |  | public class RuleViolation implements IRuleViolation {
21 |  |
22 |  | public static class RuleViolationComparator implements Comparator {
23 |  | //
24 |  | // Changed logic of Comparator so that rules in the same file
25 |  | // get grouped together in the output report.
26 |  | // DDP 7/11/2002
27 |  | //
28 | 13353 | public int compare(Object o1, Object o2) {
29 | 13353 | IRuleViolation r1 = (IRuleViolation) o1;
30 | 13353 | IRuleViolation r2 = (IRuleViolation) o2;
31 | 13353 | if (!r1.getFilename().equals(r2.getFilename())) {
32 | 5 | return r1.getFilename().compareTo(r2.getFilename());
33 |  | }
34 |  |
35 | 13348 | if (r1.getBeginLine() != r2.getBeginLine())
36 | 13329 | return r1.getBeginLine() - r2.getBeginLine();
37 |  |
38 | 19 | if (r1.getDescription() != null && r2.getDescription() != null && !r1.getDescription().equals(r2.getDescription())) {
39 | 5 | return r1.getDescription().compareTo(r2.getDescription());
40 |  | }
41 |  |
42 | 14 | if (r1.getBeginLine() == r2.getBeginLine()) {
43 | 14 | return 1;
44 |  | }
45 |  |
46 |  | // line number diff maps nicely to compare()
47 | 0 | return r1.getBeginLine() - r2.getBeginLine();
48 |  | }
49 |  | }
50 |  |
51 |  | private Rule rule;
52 |  | private String description;
53 |  | private String filename;
54 |  |
55 |  | private String className;
56 |  | private String methodName;
57 |  | private String packageName;
58 |  | private int beginLine;
59 |  | private int endLine;
60 |  |
61 |  | private int beginColumn;
62 |  | private int endColumn;
63 |  | private boolean isSuppressed;
64 |  |
65 | 236 | public RuleViolation(Rule rule, RuleContext ctx, SimpleNode node) {
66 | 236 | this(rule, ctx, node, rule.getMessage());
67 |  | }
68 |  |
69 | 2895 | public RuleViolation(Rule rule, RuleContext ctx, SimpleNode node, String specificMsg) {
70 | 2895 | this.rule = rule;
71 | 2895 | this.filename = ctx.getSourceCodeFilename();
72 | 2895 | this.description = specificMsg;
73 |  |
74 | 2895 | if (node.getFirstParentOfType(ASTClassOrInterfaceDeclaration.class) == null) {
75 |  | // This takes care of nodes which are outside a class definition - i.e., import declarations
76 | 2333 | className = "";
77 |  | } else {
78 |  | // default to symbol table lookup
79 | 562 | className = node.getScope().getEnclosingClassScope().getClassName() == null ? "" : node.getScope().getEnclosingClassScope().getClassName();
80 |  | }
81 |  |
82 | 2895 | methodName = node.getFirstParentOfType(ASTMethodDeclaration.class) == null ? "" : ((MethodScope) node.getScope().getEnclosingMethodScope()).getName();
83 |  |
84 | 2895 | packageName = node.getScope().getEnclosingSourceFileScope().getPackageName() == null ? "" : node.getScope().getEnclosingSourceFileScope().getPackageName();
85 |  |
86 | 2895 | beginLine = node.getBeginLine();
87 | 2895 | endLine = node.getEndLine();
88 | 2895 | beginColumn = node.getBeginColumn();
89 | 2895 | endColumn = node.getEndColumn();
90 |  |
91 |  | // TODO combine this duplicated code
92 |  | // TODO same for duplicated code in ASTTypeDeclaration && ASTClassOrInterfaceBodyDeclaration
93 | 2895 | List parentTypes = node.getParentsOfType(ASTTypeDeclaration.class);
94 | 2895 | if (node instanceof ASTTypeDeclaration) {
95 | 1 | parentTypes.add(node);
96 |  | }
97 | 2895 | parentTypes.addAll(node.getParentsOfType(ASTClassOrInterfaceBodyDeclaration.class));
98 | 2895 | if (node instanceof ASTClassOrInterfaceBodyDeclaration) {
99 | 4 | parentTypes.add(node);
100 |  | }
101 | 2895 | parentTypes.addAll(node.getParentsOfType(ASTFormalParameter.class));
102 | 2895 | if (node instanceof ASTFormalParameter) {
103 | 11 | parentTypes.add(node);
104 |  | }
105 | 2895 | parentTypes.addAll(node.getParentsOfType(ASTLocalVariableDeclaration.class));
106 | 2895 | if (node instanceof ASTLocalVariableDeclaration) {
107 | 4 | parentTypes.add(node);
108 |  | }
109 | 2895 | for (Iterator i = parentTypes.iterator(); i.hasNext();) {
110 | 1302 | CanSuppressWarnings t = (CanSuppressWarnings) i.next();
111 | 1302 | if (t.hasSuppressWarningsAnnotationFor(getRule())) {
112 | 11 | isSuppressed = true;
113 |  | }
114 |  | }
115 |  | }
116 |  |
117 | 1368 | public Rule getRule() {
118 | 1368 | return rule;
119 |  | }
120 |  |
121 | 2889 | public boolean isSuppressed() {
122 | 2889 | return this.isSuppressed;
123 |  | }
124 |  |
125 | 0 | public int getBeginColumn() {
126 | 0 | return beginColumn;
127 |  | }
128 |  |
129 | 0 | public int getEndColumn() {
130 | 0 | return endColumn;
131 |  | }
132 |  |
133 | 128 | public String getDescription() {
134 | 128 | return description;
135 |  | }
136 |  |
137 | 132690 | public String getFilename() {
138 | 132690 | return filename;
139 |  | }
140 |  |
141 | 2887 | public String getClassName() {
142 | 2887 | return className;
143 |  | }
144 |  |
145 | 12 | public String getMethodName() {
146 | 12 | return methodName;
147 |  | }
148 |  |
149 | 2890 | public String getPackageName() {
150 | 2890 | return packageName;
151 |  | }
152 |  |
153 | 162212 | public int getBeginLine() {
154 | 162212 | return beginLine;
155 |  | }
156 |  |
157 | 6 | public int getEndLine() {
158 | 6 | return endLine;
159 |  | }
160 |  |
161 | 21 | public String getVariableName() {
162 | 21 | return "";
163 |  | }
164 |  |
165 | 0 | public String toString() {
166 | 0 | return getFilename() + ":" + getRule() + ":" + getDescription() + ":" + beginLine;
167 |  | }
168 |  |
169 |  | }