Fix null-pointer dereference in Delta.java.
[cfb.git] / prod / net / jaekl / cfb / analyze / Delta.java
1 package net.jaekl.cfb.analyze;
2
3 import java.io.PrintWriter;
4 import java.util.HashSet;
5
6 import net.jaekl.cfb.store.Run;
7 import net.jaekl.cfb.xml.BugInstance;
8
9 // Compute and store the delta (difference) between two analyses
10
11 public class Delta {
12         Run                  m_earlier;
13         Run                  m_later;
14         
15         HashSet<BugInstance> m_fixed;           // bugs that have been fixed
16         HashSet<BugInstance> m_common;  // bugs that are present in both versions
17         HashSet<BugInstance> m_new;             // bugs introduced in the new version
18         
19         public Delta(Analysis before, Analysis after)
20         {
21                 if (null == before) {
22                         m_earlier = null;
23                 }
24                 else {
25                         m_earlier = new Run(before);
26                 }
27                 m_later = new Run(after);
28                 
29                 m_fixed = new HashSet<BugInstance>();
30                 m_common = new HashSet<BugInstance>();
31                 m_new = new HashSet<BugInstance>();
32                 
33                 computeDelta(before, after);
34         }
35         
36         public BugInstance[] getFixed() { return m_fixed.toArray(new BugInstance[m_fixed.size()]); }
37         public int getNumFixed() { return m_fixed.size(); }
38         
39         public BugInstance[] getCommon() { return m_common.toArray(new BugInstance[m_common.size()]); }
40         public int getNumCommon() { return m_common.size(); }
41         
42         public BugInstance[] getNew() { return m_new.toArray(new BugInstance[m_new.size()]); }
43         public int getNumNew() { return m_new.size(); }
44         
45         public Run getEarlier() { return m_earlier; } 
46         public Run getLater() { return m_later; }
47         
48         public void dump(PrintWriter pw) {
49                 pw.println("=========================");
50                 pw.println("  NEW BUGS (" + m_new.size() + ")");
51                 pw.println("-------------------------");
52                 for (BugInstance bug : m_new) {
53                         bug.dump(pw, 2);
54                 }
55                 
56                 pw.println("=========================");
57                 pw.println("  FIXED BUGS (" + m_fixed.size() + ")");
58                 pw.println("-------------------------");
59                 for (BugInstance bug : m_fixed) {
60                         bug.dump(pw, 2);
61                 }
62                 
63                 pw.println("=========================");
64                 pw.println("  OLD BUGS (" + m_common.size() + ")");
65                 pw.println("-------------------------");
66                 for (BugInstance bug : m_common) {
67                         bug.dump(pw, 2);
68                 }
69         }
70         
71         void computeDelta(Analysis before, Analysis after)
72         {
73                 m_fixed.clear();
74                 m_common.clear();
75                 m_new.clear();
76                 
77                 HashSet<BugInstance> beforeBugs = new HashSet<BugInstance>();
78                 
79                 if (null != before) {
80                         beforeBugs.addAll(before.getBugCollection().getBugs());
81                 }
82                 
83                 for (BugInstance bug : after.getBugCollection().getBugs()) {
84                         if (beforeBugs.contains(bug)) {
85                                 m_common.add(bug);
86                         }
87                         else {
88                                 m_new.add(bug);
89                         }
90                 }
91                 
92                 if (null == before) {
93                         return;
94                 }
95                 
96                 for (BugInstance bug : before.getBugCollection().getBugs()) {
97                         if (! m_common.contains(bug)) {
98                                 m_fixed.add(bug);
99                         }
100                 }
101         }
102 }