/*
* 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.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import edu.umd.cs.findbugs.BugCollection;
import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.DetectorFactoryCollection;
import edu.umd.cs.findbugs.FindBugs;
import edu.umd.cs.findbugs.SortedBugCollection;
/**
* Mine historical information from a BugCollection. The BugCollection should be
* built using UpdateBugCollection to record the history of analyzing all
* versions over time.
*
* @author David Hovemeyer
* @author William Pugh
*/
public class RebornIssues {
BugCollection bugCollection;
public RebornIssues() {
}
public RebornIssues(BugCollection bugCollection) {
this.bugCollection = bugCollection;
}
public void setBugCollection(BugCollection bugCollection) {
this.bugCollection = bugCollection;
}
public RebornIssues execute() {
Map<String, List<BugInstance>> map = new HashMap<String, List<BugInstance>>();
for (BugInstance b : bugCollection.getCollection())
if (b.getFirstVersion() != 0 || b.getLastVersion() != -1) {
List<BugInstance> lst = map.get(b.getInstanceHash());
if (lst == null) {
lst = new LinkedList<BugInstance>();
map.put(b.getInstanceHash(), lst);
}
lst.add(b);
}
for (List<BugInstance> lst : map.values()) {
if (lst.size() > 1) {
TreeSet<Long> removalTimes = new TreeSet<Long>();
TreeSet<Long> additionTimes = new TreeSet<Long>();
String bugPattern = "XXX";
for (BugInstance b : lst) {
bugPattern = b.getBugPattern().getType();
if (b.getFirstVersion() > 0)
additionTimes.add(b.getFirstVersion());
if (b.getLastVersion() != -1)
removalTimes.add(b.getLastVersion());
}
Iterator<Long> aI = additionTimes.iterator();
if (!aI.hasNext())
continue;
long a = aI.next();
loop: for (Long removed : removalTimes) {
while (a <= removed) {
if (!aI.hasNext())
break loop;
a = aI.next();
}
System.out.printf("%5d %5d %s%n", removed, a, bugPattern);
}
}
}
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 {
FindBugs.setNoAnalysis();
DetectorFactoryCollection.instance(); // load plugins
RebornIssues reborn = new RebornIssues();
CommandLine commandLine = new CommandLine();
int argCount = commandLine.parse(args, 0, 2, "Usage: " + RebornIssues.class.getName()
+ " [options] [<xml results> [<history]] ");
SortedBugCollection bugCollection = new SortedBugCollection();
if (argCount < args.length)
bugCollection.readXML(args[argCount++]);
else
bugCollection.readXML(System.in);
reborn.setBugCollection(bugCollection);
reborn.execute();
}
}