1 package jp.sourceforge.stigmata.result;
8 import java.util.ArrayList;
9 import java.util.HashMap;
10 import java.util.Iterator;
11 import java.util.List;
14 import jp.sourceforge.stigmata.BirthmarkContext;
15 import jp.sourceforge.stigmata.BirthmarkEnvironment;
16 import jp.sourceforge.stigmata.BirthmarkSet;
17 import jp.sourceforge.stigmata.ComparisonPair;
18 import jp.sourceforge.stigmata.ExtractionResultSet;
19 import jp.sourceforge.stigmata.ExtractionTarget;
22 * Concrete class for ComparisonResultSet. This instance compare class files by round robin.
24 * @author Haruaki TAMADA
27 public class RoundRobinComparisonResultSet extends AbstractComparisonResultSet{
28 private int compareCount = -1;
29 private boolean tableType;
30 private boolean samePair = false;
33 * constructor. if user gives { a, b, c, } as holders1, then
34 * the instance (created by this constructor) compares { a<->b, a<->c,
37 public RoundRobinComparisonResultSet(ExtractionResultSet resultset){
38 this(resultset, false);
42 * constructor. if user gives { a, b, c, } as holders1, then the
43 * instance (created by this constructor when samePair is true)
44 * compares { a<->a, b<->a, b<->b, c<->a, c<->b, c<->c, }.
45 * Otherwise, the instance compares { a<->b, a<->c, b<->c, } when
48 public RoundRobinComparisonResultSet(ExtractionResultSet resultset, boolean samePair){
50 this.tableType = resultset.isTableType();
51 setCompareSamePair(samePair);
57 public BirthmarkEnvironment getEnvironment(){
58 return extraction.getEnvironment();
61 public BirthmarkContext getContext(){
62 return extraction.getContext();
66 * update same pair comparing flag unless two birthmark array is setted.
68 public void setCompareSamePair(boolean flag){
70 if(!extraction.isTableType()){
71 int size = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_XY);
73 if(size > 1) compareCount = (size - 1) * (size - 2) + 1;
74 else if(size == 1) compareCount = 0;
75 else throw new IllegalStateException("no extraction result");
78 if(size > 1) compareCount = (size - 1) * (size - 2) + 1 + size;
79 else if(size == 1) compareCount = 1;
80 else throw new IllegalStateException("no extraction result");
83 else if(compareCount == -1){
84 compareCount = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X)
85 * extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_Y);
89 public boolean isCompareSamePair(){
94 * returns the compare count of birthmark sets.
96 public int getPairCount(){
101 * return a iterator of whole comparison.
103 public Iterator<ComparisonPair> iterator(){
105 return new CompareTableIterator();
108 return new CompareTriangleIterator();
112 public BirthmarkSet[] getPairSources(){
113 List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();
114 for(Iterator<BirthmarkSet> i = pairSources(); i.hasNext(); ){
118 return list.toArray(new BirthmarkSet[list.size()]);
121 public Iterator<BirthmarkSet> pairSources(){
122 Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();
123 if(extraction.isTableType()){
124 for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){
125 BirthmarkSet bs = i.next();
126 map.put(bs.getLocation(), bs);
128 for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){
129 BirthmarkSet bs = i.next();
130 map.put(bs.getLocation(), bs);
134 for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_XY); i.hasNext(); ){
135 BirthmarkSet bs = i.next();
136 map.put(bs.getLocation(), bs);
139 return map.values().iterator();
142 private class CompareTableIterator implements Iterator<ComparisonPair>{
143 private Iterator<BirthmarkSet> ix = extraction.birthmarkSets(ExtractionTarget.TARGET_X);
144 private Iterator<BirthmarkSet> iy = extraction.birthmarkSets(ExtractionTarget.TARGET_Y);
145 private BirthmarkSet x = ix.next();
147 public boolean hasNext(){
148 return ix.hasNext() || iy.hasNext();
151 public ComparisonPair next(){
153 iy = extraction.birthmarkSets(ExtractionTarget.TARGET_Y);
156 BirthmarkSet y = iy.next();
158 return new ComparisonPair(x, y, extraction.getContext());
161 public void remove(){
168 private class CompareTriangleIterator implements Iterator<ComparisonPair>{
169 private List<String> names = new ArrayList<String>();
170 private Iterator<BirthmarkSet> iterator;
171 private int index = 0;
172 private BirthmarkSet bs;
173 private ComparisonPair next;
175 public CompareTriangleIterator(){
176 iterator = extraction.birthmarkSets(ExtractionTarget.TARGET_XY);
179 public boolean hasNext(){
183 public ComparisonPair next(){
184 ComparisonPair returnValue = next;
189 private ComparisonPair findNext(){
190 if(bs == null && iterator.hasNext()){
191 bs = iterator.next();
192 names.add(bs.getName());
194 if((isCompareSamePair() && index == names.size()) || (!isCompareSamePair() && index == (names.size() - 1))){
196 if(iterator.hasNext()){
197 bs = iterator.next();
198 names.add(bs.getName());
204 String name = names.get(index);
205 BirthmarkSet bsX = extraction.getBirthmarkSet(ExtractionTarget.TARGET_XY, name);
206 ComparisonPair pair = null;
208 pair = new ComparisonPair(bsX, bs, extraction.getContext());
219 public void remove(){