OSDN Git Service

change internal process method, which introducing ExtractionResultSet
[stigmata/stigmata.git] / src / main / java / jp / naist / se / stigmata / result / RoundRobinComparisonResultSet.java
1 package jp.naist.se.stigmata.result;\r
2 \r
3 /*\r
4  * $Id$\r
5  */\r
6 \r
7 import java.net.URL;\r
8 import java.util.ArrayList;\r
9 import java.util.HashMap;\r
10 import java.util.Iterator;\r
11 import java.util.List;\r
12 import java.util.Map;\r
13 \r
14 import jp.naist.se.stigmata.BirthmarkContext;\r
15 import jp.naist.se.stigmata.BirthmarkEnvironment;\r
16 import jp.naist.se.stigmata.BirthmarkSet;\r
17 import jp.naist.se.stigmata.ComparisonPair;\r
18 import jp.naist.se.stigmata.ExtractionResultSet;\r
19 import jp.naist.se.stigmata.ExtractionTarget;\r
20 \r
21 /**\r
22  * Concrete class for ComparisonResultSet. This instance compare class files by round robin.\r
23  *\r
24  * @author  Haruaki TAMADA\r
25  * @version  $Revision$ $Date$\r
26  */\r
27 public class RoundRobinComparisonResultSet extends AbstractComparisonResultSet{\r
28     private int compareCount = -1;\r
29     private boolean tableType;\r
30     private boolean samePair = false;\r
31 \r
32     /**\r
33      * constructor.  if user gives { a, b, c, } as holders1, then\r
34      * the instance (created by this constructor) compares { a<->b, a<->c,\r
35      * b<->c, }.\r
36      */\r
37     public RoundRobinComparisonResultSet(ExtractionResultSet resultset){\r
38         this(resultset, false);\r
39     }\r
40 \r
41     /**\r
42      * constructor.  if user gives { a, b, c, } as holders1, then the\r
43      * instance (created by this constructor when samePair is true)\r
44      * compares { a<->a, b<->a, b<->b, c<->a, c<->b, c<->c, }.\r
45      * Otherwise, the instance compares { a<->b, a<->c, b<->c, } when\r
46      * samePair is false.\r
47      */\r
48     public RoundRobinComparisonResultSet(ExtractionResultSet resultset, boolean samePair){\r
49         super(resultset);\r
50         this.tableType = resultset.isTableType();\r
51         setCompareSamePair(samePair);\r
52     }\r
53 \r
54     /**\r
55      * @return  environment\r
56      */\r
57     public BirthmarkEnvironment getEnvironment(){\r
58         return extraction.getEnvironment();\r
59     }\r
60 \r
61     public BirthmarkContext getContext(){\r
62         return extraction.getContext();\r
63     }\r
64 \r
65     /**\r
66      * update same pair comparing flag unless two birthmark array is setted.\r
67      */\r
68     public void setCompareSamePair(boolean flag){\r
69         samePair = flag;\r
70         if(!extraction.isTableType()){\r
71             int size = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_XY);\r
72             if(flag){\r
73                 if(size > 1)       compareCount = (size - 1) * (size - 2) + 1;\r
74                 else if(size == 1) compareCount = 0;\r
75                 else throw new IllegalStateException("no extraction result");\r
76             }\r
77             else{\r
78                 if(size > 1)       compareCount = (size - 1) * (size - 2) + 1 + size;\r
79                 else if(size == 1) compareCount = 1;\r
80                 else throw new IllegalStateException("no extraction result");\r
81             }\r
82         }\r
83         else if(compareCount == -1){\r
84             compareCount = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X)\r
85                     * extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_Y); \r
86         }\r
87     }\r
88 \r
89     public boolean isCompareSamePair(){\r
90         return samePair;\r
91     }\r
92 \r
93     /**\r
94      * returns the compare count of birthmark sets.\r
95      */\r
96     public int getPairCount(){\r
97         return compareCount;\r
98     }\r
99 \r
100     /**\r
101      * return a iterator of whole comparison.\r
102      */\r
103     public Iterator<ComparisonPair> iterator(){\r
104         if(tableType){\r
105             return new CompareTableIterator();\r
106         }\r
107         else{\r
108             return new CompareTriangleIterator();\r
109         }\r
110     }\r
111 \r
112     public BirthmarkSet[] getPairSources(){\r
113         List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();\r
114         for(Iterator<BirthmarkSet> i = pairSources(); i.hasNext(); ){\r
115             list.add(i.next());\r
116         }\r
117 \r
118         return list.toArray(new BirthmarkSet[list.size()]);\r
119     }\r
120 \r
121     public Iterator<BirthmarkSet> pairSources(){\r
122         Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();\r
123         if(extraction.isTableType()){\r
124             for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){\r
125                 BirthmarkSet bs = i.next();\r
126                 map.put(bs.getLocation(), bs);\r
127             }\r
128             for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){\r
129                 BirthmarkSet bs = i.next();\r
130                 map.put(bs.getLocation(), bs);\r
131             }\r
132         }\r
133         else{\r
134             for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_XY); i.hasNext(); ){\r
135                 BirthmarkSet bs = i.next();\r
136                 map.put(bs.getLocation(), bs);\r
137             }\r
138         }\r
139         return map.values().iterator();\r
140     }\r
141 \r
142     private class CompareTableIterator implements Iterator<ComparisonPair>{\r
143         private Iterator<BirthmarkSet> ix = extraction.birthmarkSets(ExtractionTarget.TARGET_X);\r
144         private Iterator<BirthmarkSet> iy = extraction.birthmarkSets(ExtractionTarget.TARGET_Y);\r
145         private BirthmarkSet x = ix.next();\r
146 \r
147         public boolean hasNext(){\r
148             return ix.hasNext() || iy.hasNext();\r
149         }\r
150 \r
151         public ComparisonPair next(){\r
152             if(!iy.hasNext()){\r
153                 iy = extraction.birthmarkSets(ExtractionTarget.TARGET_Y);\r
154                 x = ix.next();\r
155             }\r
156             BirthmarkSet y = iy.next();\r
157 \r
158             return new ComparisonPair(x, y, extraction.getContext());\r
159         }\r
160 \r
161         public void remove(){\r
162         }\r
163     }\r
164 \r
165     /**\r
166      * iterator class.\r
167      */\r
168     private class CompareTriangleIterator implements Iterator<ComparisonPair>{\r
169         private List<String> names = new ArrayList<String>();\r
170         private Iterator<BirthmarkSet> iterator;\r
171         private int index = 0;\r
172         private BirthmarkSet bs;\r
173         private ComparisonPair next;\r
174 \r
175         public CompareTriangleIterator(){\r
176             iterator = extraction.birthmarkSets(ExtractionTarget.TARGET_XY);\r
177             next = findNext();\r
178         }\r
179         public boolean hasNext(){\r
180             return next != null;\r
181         }\r
182 \r
183         public ComparisonPair next(){\r
184             ComparisonPair returnValue = next;\r
185             next = findNext();\r
186             return returnValue;\r
187         }\r
188 \r
189         private ComparisonPair findNext(){\r
190             if(bs == null && iterator.hasNext()){\r
191                 bs = iterator.next();\r
192                 names.add(bs.getName());\r
193             }\r
194             if((isCompareSamePair() && index == names.size()) || (!isCompareSamePair() && index == (names.size() - 1))){\r
195                 index = 0;\r
196                 if(iterator.hasNext()){\r
197                     bs = iterator.next();\r
198                     names.add(bs.getName());\r
199                 }\r
200                 else{\r
201                     return null;\r
202                 }\r
203             }\r
204             String name = names.get(index);\r
205             BirthmarkSet bsX = extraction.getBirthmarkSet(ExtractionTarget.TARGET_XY, name);\r
206             ComparisonPair pair = null;\r
207             if(bsX != null){\r
208                 pair = new ComparisonPair(bsX, bs, extraction.getContext());\r
209             }\r
210             index++;\r
211 \r
212             if(pair == null){\r
213                 pair = findNext();\r
214             }\r
215             \r
216             return pair;\r
217         }\r
218 \r
219         public void remove(){\r
220         }\r
221     }\r
222 }\r