1 package jp.sourceforge.stigmata.filter;
7 import java.util.ArrayList;
10 import jp.sourceforge.stigmata.ComparisonPair;
11 import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
15 * @author Haruaki TAMADA
16 * @version $Revision$ $Date$
18 public class BirthmarkElementCountComparisonPairFilter extends AbstractComparisonPairFilter{
19 private static final List<Criterion> CRITERIA = new ArrayList<Criterion>();
21 private int threshold = 0;
22 private FilterTarget target;
23 private String birthmarkType;
26 CRITERIA.add(Criterion.GREATER_EQUALS);
27 CRITERIA.add(Criterion.GREATER_THAN);
28 CRITERIA.add(Criterion.LESS_EQUALS);
29 CRITERIA.add(Criterion.LESS_THAN);
30 CRITERIA.add(Criterion.EQUALS_AS);
31 CRITERIA.add(Criterion.NOT_EQUALS_AS);
34 public BirthmarkElementCountComparisonPairFilter(ComparisonPairFilterSpi service){
38 public String getBirthmarkType(){
42 public void setBirthmarkType(String birthmarkType){
43 this.birthmarkType = birthmarkType;
46 public static Criterion[] getValidCriteria(){
47 return CRITERIA.toArray(new Criterion[CRITERIA.size()]);
50 public Criterion[] getAcceptableCriteria(){
51 return getValidCriteria();
54 private boolean isFilteredTwo(ComparisonPair pair){
57 String type = getBirthmarkType();
58 if(pair.getTarget1().hasBirthmark(type) && pair.getTarget2().hasBirthmark(type)){
59 int elem1 = pair.getTarget1().getBirthmark(type).getElementCount();
60 int elem2 = pair.getTarget2().getBirthmark(type).getElementCount();
62 switch(getCriterion()){
64 flag = (target == FilterTarget.BOTH_TARGETS && elem1 >= threshold && elem2 >= threshold) ||
65 (target == FilterTarget.ONE_OF_TARGETS && (elem1 >= threshold || elem2 >= threshold));
68 flag = (target == FilterTarget.BOTH_TARGETS && elem1 > threshold && elem2 > threshold) ||
69 (target == FilterTarget.ONE_OF_TARGETS && (elem1 > threshold || elem2 > threshold));
72 flag = (target == FilterTarget.BOTH_TARGETS && elem1 <= threshold && elem2 <= threshold) ||
73 (target == FilterTarget.ONE_OF_TARGETS && (elem1 <= threshold || elem2 <= threshold));
76 flag = (target == FilterTarget.BOTH_TARGETS && elem1 < threshold && elem2 < threshold) ||
77 (target == FilterTarget.ONE_OF_TARGETS && (elem1 < threshold || elem2 < threshold));
80 flag = (target == FilterTarget.BOTH_TARGETS && elem1 == threshold && elem2 == threshold) ||
81 (target == FilterTarget.ONE_OF_TARGETS && (elem1 == threshold || elem2 == threshold));
84 flag = (target == FilterTarget.BOTH_TARGETS && elem1 != threshold && elem2 != threshold) ||
85 (target == FilterTarget.ONE_OF_TARGETS && (elem1 != threshold || elem2 != threshold));
95 public boolean isFiltered(ComparisonPair pair){
96 if(target == FilterTarget.BOTH_TARGETS || target == FilterTarget.ONE_OF_TARGETS){
97 return isFilteredTwo(pair);
100 String type = getBirthmarkType();
101 if(pair.getTarget1().hasBirthmark(type) && pair.getTarget2().hasBirthmark(type)){
103 int threshold = getThreshold();
104 if(target == FilterTarget.TARGET_1){
105 total = pair.getTarget1().getBirthmark(type).getElementCount();
107 if(target == FilterTarget.TARGET_2){
108 total = pair.getTarget2().getBirthmark(type).getElementCount();
110 switch(getCriterion()){
112 flag = total >= threshold;
115 flag = total > threshold;
118 flag = total <= threshold;
121 flag = total < threshold;
124 flag = total == threshold;
127 flag = total != threshold;
137 public int getThreshold(){
141 public void setThreshold(int threshold){
143 throw new IllegalArgumentException("threshold must be positive value: " + threshold);
145 this.threshold = threshold;
148 public FilterTarget getTarget(){
152 public void setTarget(FilterTarget target){
153 this.target = target;
156 public String toString(){
157 StringBuilder sb = new StringBuilder();
159 case TARGET_1: sb.append("target1"); break;
160 case TARGET_2: sb.append("target2"); break;
161 case BOTH_TARGETS: sb.append("(target1&target2)"); break;
162 case ONE_OF_TARGETS: sb.append("(target1|target2)");
164 sb.append(".").append(birthmarkType);
166 switch(getCriterion()){
167 case GREATER_EQUALS: sb.append(" >= "); break;
168 case GREATER_THAN: sb.append(" > "); break;
169 case LESS_EQUALS: sb.append(" <= "); break;
170 case LESS_THAN: sb.append(" < "); break;
171 case EQUALS_AS: sb.append(" == "); break;
172 case NOT_EQUALS_AS: sb.append(" != "); break;
174 sb.append(Integer.toString(getThreshold()));
176 return new String(sb);