OSDN Git Service

a4dab8237c036c1355dea2cff40c5fb881ac3c0b
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / filter / FilteredComparisonResultSet.java
1 package jp.sourceforge.stigmata.filter;
2
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import jp.sourceforge.stigmata.BirthmarkContext;
8 import jp.sourceforge.stigmata.BirthmarkEnvironment;
9 import jp.sourceforge.stigmata.BirthmarkSet;
10 import jp.sourceforge.stigmata.ComparisonPair;
11 import jp.sourceforge.stigmata.ComparisonPairFilterSet;
12 import jp.sourceforge.stigmata.ComparisonResultSet;
13
14 /**
15  * Filtering {@link ComparisonResultSet <code>ComparisonResultSet</code>}.
16  * 
17  * @author Haruaki TAMADA
18  */
19 public class FilteredComparisonResultSet implements ComparisonResultSet{
20     private ComparisonResultSet resultset;
21     private List<ComparisonPairFilterSet> filters = new ArrayList<ComparisonPairFilterSet>(); 
22
23     /**
24      * constructor.
25      * 
26      * @param resultset filtering target
27      */
28     public FilteredComparisonResultSet(ComparisonResultSet resultset){
29         this.resultset = resultset;
30     }
31
32     /**
33      * constructor.
34      * @param resultset filtering target
35      * @param filters filtering rule
36      */
37     public FilteredComparisonResultSet(ComparisonResultSet resultset, ComparisonPairFilterSet[] filters){
38         this.resultset = resultset;
39         for(int i = 0; i < filters.length; i++){
40             addFilterSet(filters[i]);
41         }
42     }
43
44     public void addFilterSet(ComparisonPairFilterSet filter){
45         filters.add(filter);
46     }
47
48     public void removeFilterSet(ComparisonPairFilterSet filter){
49         filters.remove(filter);
50     }
51
52     @Override
53     public ComparisonPair getPairAt(int index){
54         int currentIndex = 0;
55         for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){
56             ComparisonPair pair = i.next();
57             if(currentIndex == index){
58                 return pair;
59             }
60             currentIndex++;
61         }
62         return null;
63     }
64
65     @Override
66     public ComparisonPair[] getPairs(){
67         List<ComparisonPair> list = new ArrayList<ComparisonPair>();
68         for(Iterator<ComparisonPair> i = iterator(); i.hasNext(); ){
69             list.add(i.next());
70         }
71         return list.toArray(new ComparisonPair[list.size()]);
72     }
73
74     @Override
75     public int getPairCount(){
76         return resultset.getPairCount();
77     }
78
79     @Override
80     public BirthmarkContext getContext(){
81         return resultset.getContext();
82     }
83
84     @Override
85     public BirthmarkEnvironment getEnvironment(){
86         return resultset.getEnvironment();
87     }
88
89     @Override
90     public Iterator<ComparisonPair> iterator(){
91         return new FilteredIterator(resultset.iterator());
92     }
93
94     @Override
95     public synchronized BirthmarkSet[] getPairSources(){
96         List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();
97         for(Iterator<BirthmarkSet> i = pairSources(); i.hasNext(); ){
98             list.add(i.next());
99         }
100         return list.toArray(new BirthmarkSet[list.size()]);
101     }
102
103     @Override
104     public Iterator<BirthmarkSet> pairSources(){
105         return resultset.pairSources();
106     }
107
108     private class FilteredIterator implements Iterator<ComparisonPair>{
109         private Iterator<ComparisonPair> iterator;
110         private ComparisonPair next;
111
112         public FilteredIterator(Iterator<ComparisonPair> iterator){
113             this.iterator = iterator;
114             
115             next = findNext();
116         }
117
118         @Override
119         public boolean hasNext(){
120             return next != null;
121         }
122
123         @Override
124         public ComparisonPair next(){
125             ComparisonPair returnValue = next;
126             next = findNext();
127             return returnValue;
128         }
129
130         @Override
131         public void remove(){
132             throw new InternalError("not implemented");
133         }
134
135         private ComparisonPair findNext(){
136             boolean nowFinding = true;
137             while(nowFinding && iterator.hasNext()){
138                 ComparisonPair nextPair = iterator.next();
139                 // return the pair which the all filters is passed
140                 if(isAllFilterPassed(nextPair)){
141                     nowFinding = false; // found next value!
142                     next = nextPair;
143                 }
144             }
145             if(nowFinding && !iterator.hasNext()){
146                 next = null;
147             }
148             return next;
149         }
150
151         private boolean isAllFilterPassed(ComparisonPair pair){
152             boolean flag = true;
153             for(Iterator<ComparisonPairFilterSet> i = filters.iterator(); i.hasNext(); ){
154                 ComparisonPairFilterSet filter = i.next();
155                 if(!filter.isFiltered(pair)){
156                     flag = false;
157                     break;
158                 }
159             }
160             return flag;
161         }
162     };
163 }