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.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 ProcessingError {
21 private String msg;
22 private String file;
23
24 public ProcessingError(String msg, String file) {
25 this.msg = msg;
26 this.file = file;
27 }
28
29 public String getMsg() {
30 return msg;
31 }
32
33 public String getFile() {
34 return file;
35 }
36 }
37
38
39
40
41
42
43
44 private ReportTree violationTree = new ReportTree();
45
46
47 private Set violations = new TreeSet(new RuleViolation.RuleViolationComparator());
48 private Set metrics = new HashSet();
49 private List listeners = new ArrayList();
50 private List errors = new ArrayList();
51 private Set linesToExclude = new HashSet();
52
53 public void exclude(Set lines) {
54 linesToExclude = lines;
55 }
56
57
58 public Map getCountSummary() {
59 Map summary = new HashMap();
60 for (Iterator iter = violationTree.iterator(); iter.hasNext();) {
61 RuleViolation rv = (RuleViolation) iter.next();
62 String key = rv.getPackageName() + "." + rv.getClassName();
63 Object o = summary.get(key);
64 if (o == null) {
65 Integer value = new Integer(1);
66 summary.put(key, value);
67 } else {
68 Integer value = (Integer) o;
69 summary.put(key, new Integer(value.intValue() + 1));
70 }
71 }
72 return summary;
73 }
74
75 public ReportTree getViolationTree() {
76 return this.violationTree;
77 }
78
79
80 /***
81 * @return a Map summarizing the Report: String (rule name) ->Integer (count of violations)
82 */
83 public Map getSummary() {
84 Map summary = new HashMap();
85 for (Iterator i = violations.iterator(); i.hasNext();) {
86 RuleViolation rv = (RuleViolation) i.next();
87 if (!summary.containsKey(rv.getRule().getName())) {
88 summary.put(rv.getRule().getName(), new Integer(0));
89 }
90 Integer count = (Integer) summary.get(rv.getRule().getName());
91 count = new Integer(count.intValue() + 1);
92 summary.put(rv.getRule().getName(), count);
93 }
94 return summary;
95 }
96
97 public void addListener(ReportListener listener) {
98 listeners.add(listener);
99 }
100
101 public void addRuleViolation(RuleViolation violation) {
102 if (linesToExclude.contains(new Integer(violation.getLine()))) {
103 return;
104 }
105 violations.add(violation);
106 violationTree.addRuleViolation(violation);
107 for (Iterator i = listeners.iterator(); i.hasNext();) {
108 ReportListener listener = (ReportListener) i.next();
109 listener.ruleViolationAdded(violation);
110 }
111 }
112
113 public void addMetric(Metric metric) {
114 metrics.add(metric);
115 for (Iterator i = listeners.iterator(); i.hasNext();) {
116 ReportListener listener = (ReportListener) i.next();
117 listener.metricAdded(metric);
118 }
119 }
120
121 public void addError(ProcessingError error) {
122 errors.add(error);
123 }
124
125 public boolean hasMetrics() {
126 return !metrics.isEmpty();
127 }
128
129 public Iterator metrics() {
130 return metrics.iterator();
131 }
132
133 public boolean isEmpty() {
134 return !violations.iterator().hasNext();
135 }
136
137 public boolean treeIsEmpty() {
138 return !violationTree.iterator().hasNext();
139 }
140
141 public Iterator treeIterator() {
142 return violationTree.iterator();
143 }
144
145 public Iterator iterator() {
146 return violations.iterator();
147 }
148
149 public Iterator errors() {
150 return errors.iterator();
151 }
152
153 public int treeSize() {
154 return violationTree.size();
155 }
156
157 public int size() {
158 return violations.size();
159 }
160
161 }