View Javadoc

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       * The idea is to store the violations in a tree instead of a list, to do
41       * better and faster sort and filter mechanism and to visualize the result
42       * als tree. (ide plugins).
43       * */
44      private ReportTree violationTree = new ReportTree();
45  
46      // Note that this and the above data structure are both being maintained for a bit
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 }