-
Notifications
You must be signed in to change notification settings - Fork 578
/
BugCollectionBugReporter.java
146 lines (125 loc) · 4.07 KB
/
BugCollectionBugReporter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
* FindBugs - Find bugs in Java programs
* Copyright (C) 2003-2006 University of Maryland
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package edu.umd.cs.findbugs;
import java.io.PrintWriter;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import edu.umd.cs.findbugs.ba.Debug;
import edu.umd.cs.findbugs.ba.MethodUnprofitableException;
import edu.umd.cs.findbugs.ba.MissingClassException;
import edu.umd.cs.findbugs.classfile.ClassDescriptor;
public class BugCollectionBugReporter extends TextUIBugReporter implements Debug {
private final SortedBugCollection bugCollection;
private final Project project;
@CheckForNull private final PrintWriter writer;
public BugCollectionBugReporter(Project project) {
this(project, null);
}
public BugCollectionBugReporter(Project project, @CheckForNull PrintWriter writer) {
this.project = project;
this.bugCollection = new SortedBugCollection(getProjectStats(), project);
bugCollection.setTimestamp(System.currentTimeMillis());
this.writer = writer;
}
public Project getProject() {
return project;
}
@Override
public @Nonnull
BugCollection getBugCollection() {
return bugCollection;
}
@Override
public void observeClass(ClassDescriptor classDescriptor) {
}
@Override
public void logError(String message) {
bugCollection.addError(message);
super.logError(message);
}
@Override
public void logError(String message, Throwable e) {
if (e instanceof MissingClassException) {
MissingClassException e2 = (MissingClassException) e;
reportMissingClass(e2.getClassNotFoundException());
return;
}
if (e instanceof MethodUnprofitableException) {
// TODO: log this
return;
}
bugCollection.addError(message, e);
super.logError(message, e);
}
@Override
public void reportMissingClass(ClassNotFoundException ex) {
String missing = AbstractBugReporter.getMissingClassName(ex);
if (!isValidMissingClassMessage(missing)) {
return;
}
bugCollection.addMissingClass(missing);
super.reportMissingClass(ex);
}
@Override
public void doReportBug(BugInstance bugInstance) {
if (VERIFY_INTEGRITY) {
checkBugInstance(bugInstance);
}
if (bugCollection.add(bugInstance)) {
notifyObservers(bugInstance);
}
}
/*
* (non-Javadoc)
*
* @see edu.umd.cs.findbugs.BugReporter#getRealBugReporter()
*/
@Override
public BugReporter getRealBugReporter() {
return this;
}
/*
* (non-Javadoc)
*
* @see edu.umd.cs.findbugs.BugReporter#finish()
*/
@Override
public void finish() {
bugCollection.bugsPopulated();
if (writer != null) {
writer.flush();
}
}
/**
* Emit one line of the error message report. By default, error messages are
* printed to System.err. Subclasses may override.
*
* @param line
* one line of the error report
*/
@Override
protected void emitLine(String line) {
if (writer == null) {
super.emitLine(line);
return;
}
line = line.replaceAll("\t", " ");
writer.println(line);
}
}