1 |
| |
2 |
| |
3 |
| |
4 |
| package net.sourceforge.pmd; |
5 |
| |
6 |
| import net.sourceforge.pmd.dfa.report.ReportTree; |
7 |
| import net.sourceforge.pmd.stat.Metric; |
8 |
| |
9 |
| import java.util.ArrayList; |
10 |
| import java.util.HashMap; |
11 |
| import java.util.HashSet; |
12 |
| import java.util.Iterator; |
13 |
| import java.util.List; |
14 |
| import java.util.Map; |
15 |
| import java.util.Set; |
16 |
| import java.util.TreeSet; |
17 |
| |
18 |
| public class Report { |
19 |
| |
20 |
| public static class ReadableDuration { |
21 |
| private long duration; |
22 |
| |
23 |
10
| public ReadableDuration(long duration) {
|
24 |
10
| this.duration = duration;
|
25 |
| } |
26 |
| |
27 |
10
| public String getTime() {
|
28 |
10
| long seconds = 0;
|
29 |
10
| long minutes = 0;
|
30 |
10
| long hours = 0;
|
31 |
| |
32 |
10
| if (duration > 1000) {
|
33 |
4
| seconds = duration / 1000;
|
34 |
| } |
35 |
| |
36 |
10
| if (seconds > 60) {
|
37 |
3
| minutes = seconds / 60;
|
38 |
3
| seconds = seconds % 60;
|
39 |
| } |
40 |
| |
41 |
10
| if (minutes > 60) {
|
42 |
1
| hours = minutes / 60;
|
43 |
1
| minutes = minutes % 60;
|
44 |
| } |
45 |
| |
46 |
10
| StringBuffer res = new StringBuffer();
|
47 |
10
| if (hours > 0) {
|
48 |
1
| res.append(hours + "h ");
|
49 |
| } |
50 |
10
| if (hours > 0 || minutes > 0) {
|
51 |
3
| res.append(minutes + "m ");
|
52 |
| } |
53 |
10
| res.append(seconds + "s");
|
54 |
10
| return res.toString();
|
55 |
| } |
56 |
| } |
57 |
| |
58 |
| public static class ProcessingError { |
59 |
| private String msg; |
60 |
| private String file; |
61 |
| |
62 |
1
| public ProcessingError(String msg, String file) {
|
63 |
1
| this.msg = msg;
|
64 |
1
| this.file = file;
|
65 |
| } |
66 |
| |
67 |
1
| public String getMsg() {
|
68 |
1
| return msg;
|
69 |
| } |
70 |
| |
71 |
1
| public String getFile() {
|
72 |
1
| return file;
|
73 |
| } |
74 |
| } |
75 |
| |
76 |
| public static class SuppressedViolation { |
77 |
| private IRuleViolation rv; |
78 |
| private boolean isNOPMD; |
79 |
| |
80 |
13
| public SuppressedViolation(IRuleViolation rv, boolean isNOPMD) {
|
81 |
13
| this.isNOPMD = isNOPMD;
|
82 |
13
| this.rv = rv;
|
83 |
| } |
84 |
| |
85 |
0
| public boolean suppressedByNOPMD() {
|
86 |
0
| return this.isNOPMD;
|
87 |
| } |
88 |
| |
89 |
0
| public boolean suppressedByAnnotation() {
|
90 |
0
| return !this.isNOPMD;
|
91 |
| } |
92 |
| |
93 |
0
| public IRuleViolation getRuleViolation() {
|
94 |
0
| return this.rv;
|
95 |
| } |
96 |
| } |
97 |
| |
98 |
| |
99 |
| |
100 |
| |
101 |
| |
102 |
| |
103 |
| private ReportTree violationTree = new ReportTree(); |
104 |
| |
105 |
| |
106 |
| private Set violations = new TreeSet(new RuleViolation.RuleViolationComparator()); |
107 |
| private Set metrics = new HashSet(); |
108 |
| private List listeners = new ArrayList(); |
109 |
| private List errors = new ArrayList(); |
110 |
| private Set linesToExclude = new HashSet(); |
111 |
| private long start; |
112 |
| private long end; |
113 |
| |
114 |
| private List suppressedRuleViolations = new ArrayList(); |
115 |
| |
116 |
1056
| public void exclude(Set lines) {
|
117 |
1056
| linesToExclude = lines;
|
118 |
| } |
119 |
| |
120 |
0
| public Map getCountSummary() {
|
121 |
0
| Map summary = new HashMap();
|
122 |
0
| for (Iterator iter = violationTree.iterator(); iter.hasNext();) {
|
123 |
0
| IRuleViolation rv = (IRuleViolation) iter.next();
|
124 |
0
| String key = (rv.getPackageName() == "" ? "" : (rv.getPackageName() + ".")) + rv.getClassName();
|
125 |
0
| Object o = summary.get(key);
|
126 |
0
| if (o == null) {
|
127 |
0
| Integer value = new Integer(1);
|
128 |
0
| summary.put(key, value);
|
129 |
| } else { |
130 |
0
| Integer value = (Integer) o;
|
131 |
0
| summary.put(key, new Integer(value.intValue() + 1));
|
132 |
| } |
133 |
| } |
134 |
0
| return summary;
|
135 |
| } |
136 |
| |
137 |
0
| public ReportTree getViolationTree() {
|
138 |
0
| return this.violationTree;
|
139 |
| } |
140 |
| |
141 |
| |
142 |
| |
143 |
| |
144 |
| |
145 |
0
| public Map getSummary() {
|
146 |
0
| Map summary = new HashMap();
|
147 |
0
| for (Iterator i = violations.iterator(); i.hasNext();) {
|
148 |
0
| IRuleViolation rv = (IRuleViolation) i.next();
|
149 |
0
| if (!summary.containsKey(rv.getRule().getName())) {
|
150 |
0
| summary.put(rv.getRule().getName(), new Integer(0));
|
151 |
| } |
152 |
0
| Integer count = (Integer) summary.get(rv.getRule().getName());
|
153 |
0
| count = new Integer(count.intValue() + 1);
|
154 |
0
| summary.put(rv.getRule().getName(), count);
|
155 |
| } |
156 |
0
| return summary;
|
157 |
| } |
158 |
| |
159 |
1
| public void addListener(ReportListener listener) {
|
160 |
1
| listeners.add(listener);
|
161 |
| } |
162 |
| |
163 |
7
| public List getSuppressedRuleViolations() {
|
164 |
7
| return this.suppressedRuleViolations;
|
165 |
| } |
166 |
| |
167 |
2673
| public void addRuleViolation(IRuleViolation violation) {
|
168 |
| |
169 |
2673
| if (linesToExclude.contains(new Integer(violation.getBeginLine()))) {
|
170 |
3
| suppressedRuleViolations.add(new SuppressedViolation(violation, true));
|
171 |
3
| return;
|
172 |
| } |
173 |
| |
174 |
2670
| if (violation.isSuppressed()) {
|
175 |
10
| suppressedRuleViolations.add(new SuppressedViolation(violation, false));
|
176 |
10
| return;
|
177 |
| } |
178 |
| |
179 |
| |
180 |
2660
| violations.add(violation);
|
181 |
2660
| violationTree.addRuleViolation(violation);
|
182 |
2660
| for (Iterator i = listeners.iterator(); i.hasNext();) {
|
183 |
1
| ReportListener listener = (ReportListener) i.next();
|
184 |
1
| listener.ruleViolationAdded(violation);
|
185 |
| } |
186 |
| } |
187 |
| |
188 |
176
| public void addMetric(Metric metric) {
|
189 |
176
| metrics.add(metric);
|
190 |
176
| for (Iterator i = listeners.iterator(); i.hasNext();) {
|
191 |
0
| ReportListener listener = (ReportListener) i.next();
|
192 |
0
| listener.metricAdded(metric);
|
193 |
| } |
194 |
| } |
195 |
| |
196 |
1
| public void addError(ProcessingError error) {
|
197 |
1
| errors.add(error);
|
198 |
| } |
199 |
| |
200 |
3
| public boolean hasMetrics() {
|
201 |
3
| return !metrics.isEmpty();
|
202 |
| } |
203 |
| |
204 |
2
| public Iterator metrics() {
|
205 |
2
| return metrics.iterator();
|
206 |
| } |
207 |
| |
208 |
5
| public boolean isEmpty() {
|
209 |
5
| return !violations.iterator().hasNext() && errors.isEmpty();
|
210 |
| } |
211 |
| |
212 |
0
| public boolean treeIsEmpty() {
|
213 |
0
| return !violationTree.iterator().hasNext();
|
214 |
| } |
215 |
| |
216 |
0
| public Iterator treeIterator() {
|
217 |
0
| return violationTree.iterator();
|
218 |
| } |
219 |
| |
220 |
13
| public Iterator iterator() {
|
221 |
13
| return violations.iterator();
|
222 |
| } |
223 |
| |
224 |
5
| public Iterator errors() {
|
225 |
5
| return errors.iterator();
|
226 |
| } |
227 |
| |
228 |
0
| public int treeSize() {
|
229 |
0
| return violationTree.size();
|
230 |
| } |
231 |
| |
232 |
1246
| public int size() {
|
233 |
1246
| return violations.size();
|
234 |
| } |
235 |
| |
236 |
0
| public void start() {
|
237 |
0
| start = System.currentTimeMillis();
|
238 |
| } |
239 |
| |
240 |
0
| public void end() {
|
241 |
0
| end = System.currentTimeMillis();
|
242 |
| } |
243 |
| |
244 |
5
| public long getElapsedTimeInMillis() {
|
245 |
5
| return end - start;
|
246 |
| } |
247 |
| } |