OSDN Git Service

必要のないクラスを削除し,クラスの整理を行った.
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / filter / BirthmarkElementCountComparisonPairFilter.java
1 package jp.sourceforge.stigmata.filter;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import jp.sourceforge.stigmata.ComparisonPair;
7 import jp.sourceforge.stigmata.spi.ComparisonPairFilterService;
8
9 /**
10  * 
11  * @author Haruaki TAMADA
12  */
13 public class BirthmarkElementCountComparisonPairFilter extends AbstractComparisonPairFilter{
14     private static final List<Criterion> CRITERIA = new ArrayList<Criterion>();
15
16     private int threshold = 0;
17     private FilterTarget target;
18     private String birthmarkType;
19
20     static{
21         CRITERIA.add(Criterion.GREATER_EQUALS);
22         CRITERIA.add(Criterion.GREATER_THAN);
23         CRITERIA.add(Criterion.LESS_EQUALS);
24         CRITERIA.add(Criterion.LESS_THAN);
25         CRITERIA.add(Criterion.EQUALS_AS);
26         CRITERIA.add(Criterion.NOT_EQUALS_AS);
27     }
28
29     public BirthmarkElementCountComparisonPairFilter(ComparisonPairFilterService service){
30         super(service);
31     }
32
33     public String getBirthmarkType(){
34         return birthmarkType;
35     }
36
37     public void setBirthmarkType(String birthmarkType){
38         this.birthmarkType = birthmarkType;
39     }
40
41     public static Criterion[] getValidCriteria(){
42         return CRITERIA.toArray(new Criterion[CRITERIA.size()]);
43     }
44
45     @Override
46     public Criterion[] getAcceptableCriteria(){
47         return getValidCriteria();
48     }
49
50     private boolean isFilteredTwo(ComparisonPair pair){
51         boolean flag = false;
52
53         String type = getBirthmarkType();
54         if(pair.getTarget1().hasBirthmark(type) && pair.getTarget2().hasBirthmark(type)){
55             int elem1 = pair.getTarget1().getBirthmark(type).getElementCount();
56             int elem2 = pair.getTarget2().getBirthmark(type).getElementCount();
57
58             switch(getCriterion()){
59             case GREATER_EQUALS:
60                 flag = (target == FilterTarget.BOTH_TARGETS && elem1 >= threshold && elem2 >= threshold) ||
61                 (target == FilterTarget.ONE_OF_TARGETS && (elem1 >= threshold || elem2 >= threshold));
62                 break;
63             case GREATER_THAN:
64                 flag = (target == FilterTarget.BOTH_TARGETS && elem1 > threshold && elem2 > threshold) ||
65                     (target == FilterTarget.ONE_OF_TARGETS && (elem1 > threshold || elem2 > threshold));
66                 break;
67             case LESS_EQUALS:
68                 flag = (target == FilterTarget.BOTH_TARGETS && elem1 <= threshold && elem2 <= threshold) ||
69                 (target == FilterTarget.ONE_OF_TARGETS && (elem1 <= threshold || elem2 <= threshold));
70                 break;
71             case LESS_THAN:
72                 flag = (target == FilterTarget.BOTH_TARGETS && elem1 < threshold && elem2 < threshold) ||
73                     (target == FilterTarget.ONE_OF_TARGETS && (elem1 < threshold || elem2 < threshold));
74                 break;
75             case EQUALS_AS:
76                 flag = (target == FilterTarget.BOTH_TARGETS && elem1 == threshold && elem2 == threshold) ||
77                 (target == FilterTarget.ONE_OF_TARGETS && (elem1 == threshold || elem2 == threshold));
78                 break;
79             case NOT_EQUALS_AS:
80                 flag = (target == FilterTarget.BOTH_TARGETS && elem1 != threshold && elem2 != threshold) ||
81                     (target == FilterTarget.ONE_OF_TARGETS && (elem1 != threshold || elem2 != threshold));
82                 break;
83             default:
84                 flag = false;
85                 break;
86             }
87         }
88         return flag;
89     }
90
91     @Override
92     public boolean isFiltered(ComparisonPair pair){
93         if(target == FilterTarget.BOTH_TARGETS || target == FilterTarget.ONE_OF_TARGETS){
94             return isFilteredTwo(pair);
95         }
96         boolean flag = false;
97         String type = getBirthmarkType();
98         if(pair.getTarget1().hasBirthmark(type) && pair.getTarget2().hasBirthmark(type)){
99             int total = 0;
100             int threshold = getThreshold();
101             if(target == FilterTarget.TARGET_1){
102                 total = pair.getTarget1().getBirthmark(type).getElementCount();
103             }
104             if(target == FilterTarget.TARGET_2){
105                 total = pair.getTarget2().getBirthmark(type).getElementCount();
106             }
107             switch(getCriterion()){
108             case GREATER_EQUALS:
109                 flag = total >= threshold;
110                 break;
111             case GREATER_THAN:
112                 flag = total > threshold;
113                 break;
114             case LESS_EQUALS:
115                 flag = total <= threshold;
116                 break;
117             case LESS_THAN:
118                 flag = total < threshold;
119                 break;
120             case EQUALS_AS:
121                 flag = total == threshold;
122                 break;
123             case NOT_EQUALS_AS:
124                 flag = total != threshold;
125                 break;
126             default:
127                 flag = false;
128                 break;
129             }
130         }
131         return flag;
132     }
133
134     public int getThreshold(){
135         return threshold;
136     }
137
138     public void setThreshold(int threshold){
139         if(threshold < 0){
140             throw new IllegalArgumentException("threshold must be positive value: " + threshold);
141         }
142         this.threshold = threshold;
143     }
144
145     public FilterTarget getTarget(){
146         return target;
147     }
148
149     public void setTarget(FilterTarget target){
150         this.target = target;
151     }
152
153     @Override
154     public String toString(){
155         StringBuilder sb = new StringBuilder();
156         switch(getTarget()){
157         case TARGET_1:       sb.append("target1"); break;
158         case TARGET_2:       sb.append("target2"); break;
159         case BOTH_TARGETS:   sb.append("(target1&target2)");    break;
160         case ONE_OF_TARGETS: sb.append("(target1|target2)");
161         }
162         sb.append(".").append(birthmarkType);
163         sb.append(".size");
164         switch(getCriterion()){
165         case GREATER_EQUALS: sb.append(" >= "); break;
166         case GREATER_THAN:   sb.append(" >  "); break;
167         case LESS_EQUALS:    sb.append(" <= "); break;
168         case LESS_THAN:      sb.append(" <  "); break;
169         case EQUALS_AS:      sb.append(" == "); break;
170         case NOT_EQUALS_AS:  sb.append(" != "); break;
171         }
172         sb.append(Integer.toString(getThreshold()));
173
174         return new String(sb);
175     }
176 }