1 package jp.naist.se.stigmata.result;
\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
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
22 * Concrete class for ComparisonResultSet. This instance compare class files by round robin.
\r
24 * @author Haruaki TAMADA
\r
25 * @version $Revision$ $Date$
\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
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
37 public RoundRobinComparisonResultSet(ExtractionResultSet resultset){
\r
38 this(resultset, false);
\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
48 public RoundRobinComparisonResultSet(ExtractionResultSet resultset, boolean samePair){
\r
50 this.tableType = resultset.isTableType();
\r
51 setCompareSamePair(samePair);
\r
55 * @return environment
\r
57 public BirthmarkEnvironment getEnvironment(){
\r
58 return extraction.getEnvironment();
\r
61 public BirthmarkContext getContext(){
\r
62 return extraction.getContext();
\r
66 * update same pair comparing flag unless two birthmark array is setted.
\r
68 public void setCompareSamePair(boolean flag){
\r
70 if(!extraction.isTableType()){
\r
71 int size = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_XY);
\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
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
83 else if(compareCount == -1){
\r
84 compareCount = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X)
\r
85 * extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_Y);
\r
89 public boolean isCompareSamePair(){
\r
94 * returns the compare count of birthmark sets.
\r
96 public int getPairCount(){
\r
97 return compareCount;
\r
101 * return a iterator of whole comparison.
\r
103 public Iterator<ComparisonPair> iterator(){
\r
105 return new CompareTableIterator();
\r
108 return new CompareTriangleIterator();
\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
118 return list.toArray(new BirthmarkSet[list.size()]);
\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
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
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
139 return map.values().iterator();
\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
147 public boolean hasNext(){
\r
148 return ix.hasNext() || iy.hasNext();
\r
151 public ComparisonPair next(){
\r
153 iy = extraction.birthmarkSets(ExtractionTarget.TARGET_Y);
\r
156 BirthmarkSet y = iy.next();
\r
158 return new ComparisonPair(x, y, extraction.getContext());
\r
161 public void remove(){
\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
175 public CompareTriangleIterator(){
\r
176 iterator = extraction.birthmarkSets(ExtractionTarget.TARGET_XY);
\r
179 public boolean hasNext(){
\r
180 return next != null;
\r
183 public ComparisonPair next(){
\r
184 ComparisonPair returnValue = next;
\r
186 return returnValue;
\r
189 private ComparisonPair findNext(){
\r
190 if(bs == null && iterator.hasNext()){
\r
191 bs = iterator.next();
\r
192 names.add(bs.getName());
\r
194 if((isCompareSamePair() && index == names.size()) || (!isCompareSamePair() && index == (names.size() - 1))){
\r
196 if(iterator.hasNext()){
\r
197 bs = iterator.next();
\r
198 names.add(bs.getName());
\r
204 String name = names.get(index);
\r
205 BirthmarkSet bsX = extraction.getBirthmarkSet(ExtractionTarget.TARGET_XY, name);
\r
206 ComparisonPair pair = null;
\r
208 pair = new ComparisonPair(bsX, bs, extraction.getContext());
\r
219 public void remove(){
\r