/*
* FindBugs - Find Bugs in Java programs
* Copyright (C) 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.gui2;
import java.util.ArrayList;
import java.util.Iterator;
import edu.umd.cs.findbugs.filter.Matcher;
/**
* These are the branches in our tree, each branch forms a complete query that could be sent
* to the main bugset to return all the bugs it contains
* For example, a single bugAspects could be <priority,high> or it could be <priority,high>,
* <designation,must fix>,<class,fishpond>,<package,default>
*
* In this implementation, <priority,high>,<designation,unclassified> is different from
* <designation,unclassified>,<priority,high>. (I'm not talking about the fact we use the .equals
* from ArrayList, I'm talking about what a query would return, though both are true)
* For a speed boost, this class could be rewritten to make these equal, BugSet could be rewritten
* to cache full queries off the main BugSet, (instead of caching each part of the query separately
* in the BugSets created) and resetData could be rewritten to work more like Swing's validate, only
* clearing data if the data is wrong. This would save time after changing certain aspects of the tree.
* Just an idea, I wouldn't suggest it unless its absolutely necessary. -Dan
*
*
* @author All of us
*/
public class BugAspects implements Iterable<BugAspects.SortableValue>
{
private static final long serialVersionUID = -5503915081879996968L;
private int count=-1;
private ArrayList<BugAspects.SortableValue> lst = new ArrayList<BugAspects.SortableValue>();
public SortableValue last() {
return lst.get(lst.size() - 1);
}
public int size() {
return lst.size();
}
public SortableValue get(int i) {
return lst.get(i);
}
@Override
public String toString()
{
if (lst.isEmpty())
return edu.umd.cs.findbugs.L10N.getLocalString("tree.bugs", "Bugs") + " (" + count + ")";
else
{
if (count==-1)
return last().value;
else
return last().key.formatValue(last().value) + " (" + count + ")";
}
}
/**
* This is how the numbers after the branches contain the number of bugs in them, even if they aren't the final branch
* @param count
*/
public void setCount(int count)
{
this.count=count;
}
public int getCount()
{
return count;
}
public BugAspects()
{
super();
}
public BugAspects(BugAspects a)
{
lst = new ArrayList<SortableValue>(a.lst);
count = a.count;
}
public void add(SortableValue sp) {
lst.add(sp);
}
public BugAspects addToNew(SortableValue sp)
{
BugAspects result = new BugAspects(this);
result.lst.add(sp);
return result;
}
public Matcher getMatcher() {
return FilterFactory.makeAndMatcher(lst);
}
public StackedFilterMatcher getStackedFilterMatcher(){
FilterMatcher[] filters = new FilterMatcher[lst.size()];
for (int i = 0; i < filters.length; i++)
filters[i] = new FilterMatcher(lst.get(i));
StackedFilterMatcher sfm = new StackedFilterMatcher(filters);
return sfm;
}
public BugSet getMatchingBugs(BugSet theSet)
{
return theSet.getBugsMatchingFilter(this.getStackedFilterMatcher());
}
static class SortableValue
{
final public Sortables key;
final public String value;
public SortableValue(Sortables key, String value)
{
this.key = key;
this.value = value;
}
@Override
public int hashCode()
{
return key.hashCode() + value.hashCode();
}
@Override
public boolean equals(Object that)
{
if (!(that instanceof SortableValue))
return false;
SortableValue thatStringPair = ((SortableValue)that);
return this.key.equals(thatStringPair.key) && this.value.equals(thatStringPair.value);
}
@Override
public String toString()
{
return key +":"+ value;
}
}
public Iterator<SortableValue> iterator() {
return lst.iterator();
}
}