OSDN Git Service

Spiという名前をすべてServiceに変更した.
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / filter / TotalElementCountComparisonPairFilter.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 TotalElementCountComparisonPairFilter extends AbstractComparisonPairFilter{
14     private static final List<Criterion> CRITERIA = new ArrayList<Criterion>();
15     static{
16         CRITERIA.add(Criterion.GREATER_EQUALS);
17         CRITERIA.add(Criterion.GREATER_THAN);
18         CRITERIA.add(Criterion.LESS_EQUALS);
19         CRITERIA.add(Criterion.LESS_THAN);
20         CRITERIA.add(Criterion.EQUALS_AS);
21         CRITERIA.add(Criterion.NOT_EQUALS_AS); 
22         CRITERIA.add(Criterion.MATCH);
23         CRITERIA.add(Criterion.NOT_MATCH);
24     };
25
26     private int threshold = 0;
27     private FilterTarget target;
28
29     public TotalElementCountComparisonPairFilter(ComparisonPairFilterService service){
30         super(service);
31     }
32
33     @Override
34     public Criterion[] getAcceptableCriteria(){
35         return getValidCriteria();
36     }
37
38     public static Criterion[] getValidCriteria(){
39         return CRITERIA.toArray(new Criterion[CRITERIA.size()]);
40     }
41
42     @Override
43     public boolean isFiltered(ComparisonPair pair){
44         boolean flag;
45         if(getTarget() == FilterTarget.TARGET_1){
46             flag = checkFiltered(pair.getTarget1().getSumOfElementCount());
47         }
48         else if(getTarget() == FilterTarget.TARGET_2){
49             flag = checkFiltered(pair.getTarget2().getSumOfElementCount());
50         }
51         else{
52             flag = checkFiltered(pair.getTarget1().getSumOfElementCount(), pair.getTarget2().getSumOfElementCount());
53         }
54         return flag;
55     }
56
57     private boolean checkFiltered(int e1, int e2){
58         boolean flag1;
59         boolean flag2;
60         int t = getThreshold();
61         switch(getCriterion()){
62         case GREATER_EQUALS:
63             flag1 = e1 >= t; flag2 = e2 >= t;
64             break;
65         case GREATER_THAN:
66             flag1 = e1 > t;  flag2 = e2 > t;
67             break;
68         case LESS_EQUALS:
69             flag1 = e1 <= t; flag2 = e2 <= t;
70             break;
71         case LESS_THAN:
72             flag1 = e1 < t;  flag2 = e2 < t;
73             break;
74         case EQUALS_AS:
75             flag1 = e1 == t; flag2 = e2 == t;
76             break;
77         case NOT_EQUALS_AS:
78             flag1 = e1 != t; flag2 = e2 != t;
79             break;
80         case MATCH:
81             flag1 = e1 == e2; flag2 = flag1;
82             break;
83         case NOT_MATCH:
84             flag1 = e1 != e2; flag2 = flag1;
85             break;
86         default:
87             flag1 = false;
88             flag2 = false;
89             break;
90         }
91         return (getTarget() == FilterTarget.BOTH_TARGETS && flag1 && flag2) ||
92             (getTarget() == FilterTarget.ONE_OF_TARGETS && (flag1 || flag2));
93     }
94
95     private boolean checkFiltered(int total){
96         boolean flag = false;
97         switch(getCriterion()){
98         case GREATER_EQUALS:
99             flag = total >= getThreshold();
100             break;
101         case GREATER_THAN:
102             flag = total > getThreshold();
103             break;
104         case LESS_EQUALS:
105             flag = total <= getThreshold();
106             break;
107         case LESS_THAN:
108             flag = total < getThreshold();
109             break;
110         case EQUALS_AS:
111             flag = total == getThreshold();
112             break;
113         case NOT_EQUALS_AS:
114             flag = total != getThreshold();
115             break;
116         default:
117             flag = false;
118             break;
119         }
120         return flag;
121     }
122
123     public int getThreshold(){
124         return threshold;
125     }
126
127     public void setThreshold(int threshold){
128         if(threshold < 0){
129             throw new IllegalArgumentException("threshold must be positive value: " + threshold);
130         }
131         this.threshold = threshold;
132     }
133
134     public FilterTarget getTarget(){
135         return target;
136     }
137
138     public void setTarget(FilterTarget target){
139         this.target = target;
140     }
141
142     @Override
143     public String toString(){
144         StringBuilder sb = new StringBuilder();
145         switch(getTarget()){
146         case TARGET_1:       sb.append("target1"); break;
147         case TARGET_2:       sb.append("target2"); break;
148         case BOTH_TARGETS:   sb.append("(target1&target2)"); break;
149         case ONE_OF_TARGETS: sb.append("(target1|target2)"); break;
150         }
151         sb.append(".element");
152         switch(getCriterion()){
153         case GREATER_EQUALS: sb.append(" >= "); break;
154         case GREATER_THAN:   sb.append(" >  "); break;
155         case LESS_EQUALS:    sb.append(" <= "); break;
156         case LESS_THAN:      sb.append(" <  "); break;
157         case EQUALS_AS:      sb.append(" == "); break;
158         case NOT_EQUALS_AS:  sb.append(" != "); break;
159         }
160         sb.append(Integer.toString(getThreshold()));
161
162         return new String(sb);
163     }
164 }