/*
* FindBugs - Find Bugs in Java programs
* Copyright (C) 2005, 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.workflow;
import java.util.ArrayList;
import java.util.Map;
import edu.umd.cs.findbugs.BugCollection;
import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.DetectorFactoryCollection;
import edu.umd.cs.findbugs.ProjectPackagePrefixes;
import edu.umd.cs.findbugs.SortedBugCollection;
import edu.umd.cs.findbugs.util.Bag;
public class TestingGround {
BugCollection bugCollection;
public TestingGround() {
}
public TestingGround(BugCollection bugCollection) {
this.bugCollection = bugCollection;
}
public void setBugCollection(BugCollection bugCollection) {
this.bugCollection = bugCollection;
}
public TestingGround execute() {
ProjectPackagePrefixes foo = new ProjectPackagePrefixes();
for (BugInstance b : bugCollection.getCollection())
foo.countBug(b);
foo.report();
return this;
}
static class CommandLine extends edu.umd.cs.findbugs.config.CommandLine {
@Override
public void handleOption(String option, String optionalExtraPart) {
throw new IllegalArgumentException("unknown option: " + option);
}
@Override
public void handleOptionWithArgument(String option, String argument) {
throw new IllegalArgumentException("unknown option: " + option);
}
}
public static void main(String[] args) throws Exception {
DetectorFactoryCollection.instance(); // load plugins
CommandLine commandLine = new CommandLine();
int argCount = commandLine.parse(args, 0, 2, "Usage: " + TestingGround.class.getName() + " [options] [<xml results>] ");
SortedBugCollection bugCollection = new SortedBugCollection();
if (argCount < args.length)
bugCollection.readXML(args[argCount++]);
else
bugCollection.readXML(System.in);
ArrayList<Bag<String>> live = new ArrayList<Bag<String>>();
ArrayList<Bag<String>> died = new ArrayList<Bag<String>>();
Bag<String> allBugs = new Bag<String>();
for (int i = 0; i <= bugCollection.getSequenceNumber(); i++) {
live.add(new Bag<String>());
died.add(new Bag<String>());
}
for (BugInstance b : bugCollection) {
int first = (int) b.getFirstVersion();
int buried = (int) b.getLastVersion() + 1;
int finish = buried;
if (finish == 0)
finish = (int) bugCollection.getSequenceNumber();
String bugPattern = b.getBugPattern().getType();
allBugs.add(bugPattern);
for (int i = first; i <= finish; i++)
live.get(i).add(bugPattern);
if (buried > 0)
died.get(buried).add(bugPattern);
}
for (int i = 0; i < bugCollection.getSequenceNumber(); i++) {
for (Map.Entry<String, Integer> e : died.get(i).entrySet()) {
Integer buried = e.getValue();
int total = live.get(i).getCount(e.getKey());
if (buried > 30 && buried * 3 > total) {
System.out.printf("%d/%d died at %d for %s%n", buried, total, i, e.getKey());
}
}
}
SortedBugCollection results = bugCollection.createEmptyCollectionWithMetadata();
for (BugInstance b : bugCollection) {
int buried = (int) b.getLastVersion() + 1;
String bugPattern = b.getBugPattern().getType();
if (buried > 0) {
int buriedCount = died.get(buried).getCount(bugPattern);
int total = live.get(buried).getCount(bugPattern);
if (buriedCount > 30 && buriedCount * 3 > total)
continue;
}
int survied = live.get((int) bugCollection.getSequenceNumber()).getCount(bugPattern);
if (survied == 0 && allBugs.getCount(bugPattern) > 100)
continue;
results.add(b, false);
}
if (argCount == args.length) {
results.writeXML(System.out);
} else {
results.writeXML(args[argCount++]);
}
}
}