From 10e7da782907a75317220d513cc44a204edc6682 Mon Sep 17 00:00:00 2001 From: tama3 Date: Sun, 23 Sep 2007 03:46:59 +0000 Subject: [PATCH] change internal process method, which introducing ExtractionResultSet git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@204 acee48c3-7b26-0410-bdac-b3d0e5314bbc --- pom.xml | 4 +- .../jp/naist/se/stigmata/BirthmarkContext.java | 88 ++++- .../java/jp/naist/se/stigmata/BirthmarkEngine.java | 246 ++++++++++-- .../jp/naist/se/stigmata/BirthmarkEnvironment.java | 21 - .../jp/naist/se/stigmata/BirthmarkStoreTarget.java | 19 + .../stigmata/CertainPairComparisonResultSet.java | 129 ------ .../jp/naist/se/stigmata/ComparisonMethod.java | 7 +- .../java/jp/naist/se/stigmata/ComparisonPair.java | 11 +- .../jp/naist/se/stigmata/ComparisonResultSet.java | 12 +- .../jp/naist/se/stigmata/ExtractionResultSet.java | 47 +++ .../jp/naist/se/stigmata/ExtractionTarget.java | 17 + src/main/java/jp/naist/se/stigmata/Main.java | 118 ++++-- .../se/stigmata/RoundRobinComparisonResultSet.java | 155 -------- src/main/java/jp/naist/se/stigmata/Stigmata.java | 436 ++------------------- src/main/java/jp/naist/se/stigmata/Stigmata2.java | 107 ----- .../extractors/BirthmarkExtractorFactory.java | 74 ++++ .../filter/FilteredComparisonResultSet.java | 41 +- .../AbstractBirthmarkExtractionResultFormat.java | 8 +- .../format/BirthmarkExtractionResultFormat.java | 6 +- .../csv/BirthmarkComparisonResultCsvFormat.java | 6 +- .../csv/BirthmarkExtractionResultCsvFormat.java | 10 +- .../xml/BirthmarkComparisonResultXmlFormat.java | 2 + .../xml/BirthmarkExtractionListXmlFormat.java | 9 +- .../result/AbstractComparisonResultSet.java | 93 +++++ .../result/AbstractExtractionResultSet.java | 130 ++++++ .../result/CertainPairComparisonResultSet.java | 250 ++++++++++++ .../result/ExtractionResultSetFactory.java | 42 ++ .../se/stigmata/result/MemoryExtractionResult.java | 62 --- .../stigmata/result/MemoryExtractionResultSet.java | 158 ++++++++ .../result/RoundRobinComparisonResultSet.java | 222 +++++++++++ .../stigmata/result/SingleExtractionResultSet.java | 97 +++++ .../ui/swing/BirthmarkExtractionResultPane.java | 16 +- .../stigmata/ui/swing/ClasspathSettingsPane.java | 3 +- .../jp/naist/se/stigmata/ui/swing/ControlPane.java | 60 +-- .../ui/swing/PairComparisonResultSetPane.java | 48 ++- .../ui/swing/RoundRobinComparisonResultPane.java | 133 ++++--- .../naist/se/stigmata/ui/swing/StigmataFrame.java | 85 ++-- .../se/stigmata/ui/swing/mds/MDSGraphPanel.java | 22 +- .../se/stigmata/utils/ConfigFileImporter.java | 3 +- .../naist/se/stigmata/utils/MultipleIterator.java | 89 +++++ .../jp/naist/se/stigmata/utils/NullIterator.java | 26 ++ .../services/jp.naist.se.stigmata.spi.BirthmarkSpi | 1 + .../resources/resources/description.properties | 3 + src/main/resources/resources/description_ja.source | 2 + src/main/resources/resources/options.xml | 18 +- src/main/resources/resources/stigmata.xml | 12 + src/site/apt/download.apt | 12 +- src/site/apt/experts.apt | 2 +- src/site/apt/faq.apt | 4 +- .../java/jp/naist/se/stigmata/StigmataTest.java | 27 +- .../stigmata/birthmarks/BirthmarkCompareTest.java | 25 +- .../cvfv/CVFVBirthmarkExtractorTest.java | 79 ++-- .../birthmarks/is/ISBirthmarkExtractorTest.java | 38 +- .../birthmarks/smc/SmcBirthmarkExtractorTest.java | 38 +- .../birthmarks/uc/UCBirthmarkExtractorTest.java | 82 ++-- 55 files changed, 2112 insertions(+), 1343 deletions(-) create mode 100755 src/main/java/jp/naist/se/stigmata/BirthmarkStoreTarget.java delete mode 100644 src/main/java/jp/naist/se/stigmata/CertainPairComparisonResultSet.java create mode 100755 src/main/java/jp/naist/se/stigmata/ExtractionResultSet.java create mode 100755 src/main/java/jp/naist/se/stigmata/ExtractionTarget.java delete mode 100644 src/main/java/jp/naist/se/stigmata/RoundRobinComparisonResultSet.java mode change 100644 => 100755 src/main/java/jp/naist/se/stigmata/Stigmata.java delete mode 100755 src/main/java/jp/naist/se/stigmata/Stigmata2.java create mode 100755 src/main/java/jp/naist/se/stigmata/birthmarks/extractors/BirthmarkExtractorFactory.java create mode 100755 src/main/java/jp/naist/se/stigmata/result/AbstractComparisonResultSet.java create mode 100755 src/main/java/jp/naist/se/stigmata/result/AbstractExtractionResultSet.java create mode 100644 src/main/java/jp/naist/se/stigmata/result/CertainPairComparisonResultSet.java create mode 100755 src/main/java/jp/naist/se/stigmata/result/ExtractionResultSetFactory.java delete mode 100755 src/main/java/jp/naist/se/stigmata/result/MemoryExtractionResult.java create mode 100755 src/main/java/jp/naist/se/stigmata/result/MemoryExtractionResultSet.java create mode 100644 src/main/java/jp/naist/se/stigmata/result/RoundRobinComparisonResultSet.java create mode 100755 src/main/java/jp/naist/se/stigmata/result/SingleExtractionResultSet.java create mode 100755 src/main/java/jp/naist/se/stigmata/utils/MultipleIterator.java create mode 100755 src/main/java/jp/naist/se/stigmata/utils/NullIterator.java diff --git a/pom.xml b/pom.xml index 9f99539..98d5c16 100755 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 jp.naist.se stigmata - 1.1.0 + 1.2.0 stigmata Java birthmark toolkit http://stigmata.sourceforge.jp/ @@ -194,7 +194,9 @@ + + diff --git a/src/main/java/jp/naist/se/stigmata/BirthmarkContext.java b/src/main/java/jp/naist/se/stigmata/BirthmarkContext.java index aa33d45..d5d1b82 100755 --- a/src/main/java/jp/naist/se/stigmata/BirthmarkContext.java +++ b/src/main/java/jp/naist/se/stigmata/BirthmarkContext.java @@ -11,36 +11,51 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import jp.naist.se.stigmata.event.OperationType; - /** * Runtime properties. * * @author Haruaki Tamada * @version $Revision$ $Date$ */ -class BirthmarkContext{ - public enum ExtractionTarget{ - TARGET_X, TARGET_Y, TARGET_XY; - }; +public class BirthmarkContext{ + private BirthmarkEnvironment environment; private List birthmarkTypes = new ArrayList(); - private ComparisonMethod method = ComparisonMethod.ROUND_ROBIN; - private ExtractionTarget et = ExtractionTarget.TARGET_X; + private ComparisonMethod method = ComparisonMethod.ROUND_ROBIN_SAME_PAIR; private List filterTypes = new ArrayList(); private Map nameMappings = new HashMap(); private ExtractionUnit unit = ExtractionUnit.CLASS; - private OperationType operation; + private BirthmarkStoreTarget store = BirthmarkStoreTarget.MEMORY; + + /** + * self constructor. + */ + public BirthmarkContext(BirthmarkContext context){ + this.environment = context.getEnvironment(); + this.method = context.getComparisonMethod(); + this.unit = context.getExtractionUnit(); + this.birthmarkTypes = new ArrayList(context.birthmarkTypes); + this.filterTypes = new ArrayList(context.filterTypes); + this.nameMappings = new HashMap(context.nameMappings); + } + + public BirthmarkContext(BirthmarkEnvironment environment){ + this.environment = environment; + } - public BirthmarkContext(OperationType type){ - setOperation(type); + public BirthmarkEnvironment getEnvironment(){ + return environment; } - public OperationType getOperation(){ - return operation; + public boolean hasNameMapping(){ + return getNameMappingCount() > 0; } - public void setOperation(OperationType operation){ - this.operation = operation; + public int getNameMappingCount(){ + return nameMappings.size(); + } + + public String getNameMapping(String key){ + return nameMappings.get(key); } public void addNameMapping(String name1, String name2){ @@ -55,12 +70,23 @@ class BirthmarkContext{ return Collections.unmodifiableMap(nameMappings); } - public void setExtractionTarget(ExtractionTarget target){ - this.et = target; + public Iterator> nameMappingEntries(){ + return getNameMappings().entrySet().iterator(); + } + + public void setNameMappings(Map mappings){ + nameMappings.clear(); + for(Iterator> i = mappings.entrySet().iterator(); i.hasNext(); ){ + Map.Entry entry = i.next(); + addNameMapping(entry.getKey(), entry.getValue()); + } } - public ExtractionTarget getExtractionTarget(){ - return et; + public void setExtractionTypes(String[] types){ + birthmarkTypes.clear(); + for(int i = 0; i < types.length; i++){ + addExtractionType(types[i]); + } } public void addExtractionType(String type){ @@ -95,8 +121,30 @@ class BirthmarkContext{ this.unit = unit; } + public BirthmarkStoreTarget getStoreTarget(){ + return store; + } + + public void setStoreTarget(BirthmarkStoreTarget store){ + this.store = store; + } + + public boolean hasFilter(){ + return filterTypes.size() > 0; + } + + public void setFilterTypes(String[] filterTypes){ + if(filterTypes != null){ + for(int i = 0; i < filterTypes.length; i++){ + addFilterType(filterTypes[i]); + } + } + } + public void addFilterType(String filterType){ - filterTypes.add(filterType); + if(filterType != null){ + filterTypes.add(filterType); + } } public void removeFilterType(String filterType){ diff --git a/src/main/java/jp/naist/se/stigmata/BirthmarkEngine.java b/src/main/java/jp/naist/se/stigmata/BirthmarkEngine.java index 846fa5e..b690a57 100755 --- a/src/main/java/jp/naist/se/stigmata/BirthmarkEngine.java +++ b/src/main/java/jp/naist/se/stigmata/BirthmarkEngine.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Map; import java.util.Stack; +import jp.naist.se.stigmata.birthmarks.extractors.BirthmarkExtractorFactory; import jp.naist.se.stigmata.event.BirthmarkEngineEvent; import jp.naist.se.stigmata.event.BirthmarkEngineListener; import jp.naist.se.stigmata.event.OperationStage; @@ -31,6 +32,9 @@ import jp.naist.se.stigmata.reader.ClasspathContext; import jp.naist.se.stigmata.reader.DefaultClassFileArchive; import jp.naist.se.stigmata.reader.JarClassFileArchive; import jp.naist.se.stigmata.reader.WarClassFileArchive; +import jp.naist.se.stigmata.result.CertainPairComparisonResultSet; +import jp.naist.se.stigmata.result.ExtractionResultSetFactory; +import jp.naist.se.stigmata.result.RoundRobinComparisonResultSet; import jp.naist.se.stigmata.spi.BirthmarkSpi; import org.apache.commons.beanutils.BeanUtils; @@ -47,13 +51,15 @@ public class BirthmarkEngine{ private WarningMessages warnings; private OperationType latestOperationType; private OperationType targetType; - - public BirthmarkEngine(){ - this(BirthmarkEnvironment.getDefaultEnvironment()); - } + private BirthmarkExtractorFactory factory; public BirthmarkEngine(BirthmarkEnvironment env){ this.environment = env; + factory = new BirthmarkExtractorFactory(env); + } + + public BirthmarkEnvironment getEnvironment(){ + return environment; } public void addBirthmarkEngineListener(BirthmarkEngineListener listener){ @@ -68,8 +74,8 @@ public class BirthmarkEngine{ operationStart(OperationType.FILTER_BIRTHMARKS); ComparisonResultSet crs = compare(target, context); - crs = filter(crs, context); - + crs = filter(crs); + operationDone(OperationType.FILTER_BIRTHMARKS); return crs; @@ -79,28 +85,28 @@ public class BirthmarkEngine{ operationStart(OperationType.FILTER_BIRTHMARKS); ComparisonResultSet crs = compare(targetX, targetY, context); - crs = filter(crs, context); + crs = filter(crs); operationDone(OperationType.FILTER_BIRTHMARKS); return crs; } - public ComparisonResultSet filter(ExtractionResult er, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{ + public ComparisonResultSet filter(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{ operationStart(OperationType.FILTER_BIRTHMARKS); - ComparisonResultSet crs = compare(er, context); - crs = filter(crs, context); + ComparisonResultSet crs = compare(er); + crs = filter(crs); operationDone(OperationType.FILTER_BIRTHMARKS); return crs; } - public ComparisonResultSet filter(ComparisonResultSet crs, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{ + public ComparisonResultSet filter(ComparisonResultSet crs) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{ operationStart(OperationType.FILTER_BIRTHMARKS); - String[] filterTypes = context.getFilterTypes(); + String[] filterTypes = crs.getContext().getFilterTypes(); if(filterTypes != null){ List filterList = new ArrayList(); @@ -123,11 +129,15 @@ public class BirthmarkEngine{ return crs; } + public ComparisonPair compareDetails(BirthmarkSet bs1, BirthmarkSet bs2, BirthmarkContext context) throws BirthmarkComparisonFailedException{ + return new ComparisonPair(bs1, bs2, context); + } + public ComparisonResultSet compare(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{ operationStart(OperationType.COMPARE_BIRTHMARKS); - ExtractionResult er = extract(target, context); - ComparisonResultSet crs = compare(er, context); + ExtractionResultSet er = extract(target, context); + ComparisonResultSet crs = compare(er); operationDone(OperationType.COMPARE_BIRTHMARKS); @@ -137,38 +147,33 @@ public class BirthmarkEngine{ public ComparisonResultSet compare(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{ operationStart(OperationType.COMPARE_BIRTHMARKS); - ExtractionResult er = extract(targetX, targetY, context); - ComparisonResultSet crs = compare(er, context); + ExtractionResultSet er = extract(targetX, targetY, context); + ComparisonResultSet crs = compare(er); operationDone(OperationType.COMPARE_BIRTHMARKS); return crs; } - public ComparisonResultSet compare(ExtractionResult er, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{ + public ComparisonResultSet compare(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{ operationStart(OperationType.COMPARE_BIRTHMARKS); + BirthmarkContext context = er.getContext(); ComparisonResultSet crs = null; switch(context.getComparisonMethod()){ - case ROUND_ROBIN: - crs = new RoundRobinComparisonResultSet( - er.getBirthmarkSetXY(), environment, true - ); + case ROUND_ROBIN_SAME_PAIR: + crs = new RoundRobinComparisonResultSet(er, true); + break; + case ROUND_ROBIN_WITHOUT_SAME_PAIR: + crs = new RoundRobinComparisonResultSet(er, false); break; case ROUND_ROBIN_XY: - crs = new RoundRobinComparisonResultSet( - er.getBirthmarkSetX(), er.getBirthmarkSetY(), environment - ); + crs = new RoundRobinComparisonResultSet(er, true); case GUESSED_PAIR: - crs = new CertainPairComparisonResultSet( - er.getBirthmarkSetX(), er.getBirthmarkSetY(), environment - ); + crs = new CertainPairComparisonResultSet(er); break; case SPECIFIED_PAIR: - crs = new CertainPairComparisonResultSet( - er.getBirthmarkSetX(), er.getBirthmarkSetY(), - context.getNameMappings(), environment - ); + crs = new CertainPairComparisonResultSet(er, context.getNameMappings()); break; } @@ -176,23 +181,57 @@ public class BirthmarkEngine{ return crs; } - public ExtractionResult extract(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException{ + public ExtractionResultSet extract(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException{ operationStart(OperationType.EXTRACT_BIRTHMARKS); - ExtractionResult er = extract(target, null, context); + ExtractionResultSet er = extract(target, null, context); operationDone(OperationType.EXTRACT_BIRTHMARKS); return er; } - public ExtractionResult extract(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException{ + public ExtractionResultSet extract(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException{ operationStart(OperationType.EXTRACT_BIRTHMARKS); - ExtractionResult er = new ExtractionResult(); + ExtractionResultSet er = ExtractionResultSetFactory.getInstance().createResultSet(context); try{ switch(context.getComparisonMethod()){ - case ROUND_ROBIN: + case ROUND_ROBIN_SAME_PAIR: + case ROUND_ROBIN_WITHOUT_SAME_PAIR: + er.setTableType(false); + String[] targetXY = mergeTarget(targetX, targetY); + extractImpl2(targetXY, er, ExtractionTarget.TARGET_XY); + break; + case GUESSED_PAIR: + case SPECIFIED_PAIR: + case ROUND_ROBIN_XY: + default: + if(targetX == null || targetY == null){ + throw new BirthmarkExtractionFailedException("targetX or targetY is null"); + } + er.setTableType(true); + extractImpl2(targetX, er, ExtractionTarget.TARGET_X); + extractImpl2(targetY, er, ExtractionTarget.TARGET_Y); + break; + } + return er; + } catch(IOException e){ + throw new BirthmarkExtractionFailedException(e); + } finally{ + operationDone(OperationType.EXTRACT_BIRTHMARKS); + } + } + + public ExtractionResultSet extract2(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException{ + operationStart(OperationType.EXTRACT_BIRTHMARKS); + ExtractionResultSet er = ExtractionResultSetFactory.getInstance().createResultSet(context); + + try{ + switch(context.getComparisonMethod()){ + case ROUND_ROBIN_SAME_PAIR: + case ROUND_ROBIN_WITHOUT_SAME_PAIR: + er.setTableType(false); String[] targetXY = mergeTarget(targetX, targetY); BirthmarkSet[] s = extractImpl(targetXY, context); - er.setBirthmarkSetXY(s); + er.setBirthmarkSets(ExtractionTarget.TARGET_XY, s); break; case GUESSED_PAIR: case SPECIFIED_PAIR: @@ -201,11 +240,12 @@ public class BirthmarkEngine{ if(targetX == null || targetY == null){ throw new BirthmarkExtractionFailedException("targetX or targetY is null"); } + er.setTableType(true); BirthmarkSet[] extractResultX = extractImpl(targetX, context); BirthmarkSet[] extractResultY = extractImpl(targetY, context); - er.setBirthmarkSetX(extractResultX); - er.setBirthmarkSetY(extractResultY); + er.setBirthmarkSets(ExtractionTarget.TARGET_X, extractResultX); + er.setBirthmarkSets(ExtractionTarget.TARGET_Y, extractResultY); break; } return er; @@ -232,6 +272,25 @@ public class BirthmarkEngine{ } } + private BirthmarkSet[] extractImpl2(String[] target, ExtractionResultSet er, ExtractionTarget et) throws BirthmarkExtractionFailedException, IOException{ + ClassFileArchive[] archives = createArchives(target, environment); + BirthmarkContext context = er.getContext(); + ExtractionUnit unit = context.getExtractionUnit(); + + BirthmarkSet[] extractResult = null; + if(unit == ExtractionUnit.CLASS){ + extractFromClass2(archives, er, et); + } + else if(unit == ExtractionUnit.PACKAGE){ + extractFromPackage2(archives, er, et); + } + else if(unit == ExtractionUnit.ARCHIVE){ + extractFromProduct2(archives, er, et); + } + + return extractResult; + } + private BirthmarkSet[] extractImpl(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, IOException{ ClassFileArchive[] archives = createArchives(target, environment); BirthmarkExtractor[] extractors = createExtractors(context.getExtractionTypes(), environment); @@ -292,7 +351,7 @@ public class BirthmarkEngine{ warnings.addMessage(new ExtractorNotFoundException("extractor not found"), birthmarkType); } - return null; + return extractor; } private byte[] inputStreamToByteArray(InputStream in) throws IOException{ @@ -308,6 +367,47 @@ public class BirthmarkEngine{ return data; } + private void extractFromPackage2(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{ + Map map = new HashMap(); + BirthmarkContext context = er.getContext(); + + for(ClassFileArchive archive: archives){ + for(ClassFileEntry entry: archive){ + try{ + String name = entry.getClassName(); + String packageName = parsePackageName(name); + BirthmarkSet bs = map.get(packageName); + if(bs == null){ + bs = new BirthmarkSet(packageName, archive.getLocation()); + map.put(packageName, bs); + } + + byte[] data = inputStreamToByteArray(entry.getLocation().openStream()); + for(String birthmarkType: context.getExtractionTypes()){ + try{ + BirthmarkExtractor extractor = factory.getExtractor(birthmarkType); + if(extractor.isAcceptable(ExtractionUnit.PACKAGE)){ + Birthmark b = bs.getBirthmark(extractor.getProvider().getType()); + if(b == null){ + b = extractor.createBirthmark(); + bs.addBirthmark(b); + } + extractor.extract(b, new ByteArrayInputStream(data), er.getEnvironment()); + } + } catch(ExtractorNotFoundException e){ + warnings.addMessage(e, birthmarkType); + } + } + } catch(IOException e){ + warnings.addMessage(e, archive.getName()); + } + } + } + for(BirthmarkSet bs: map.values()){ + er.addBirthmarkSet(et, bs); + } + } + private BirthmarkSet[] extractFromPackage(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkEnvironment context) throws IOException, BirthmarkExtractionFailedException{ Map list = new HashMap(); @@ -352,7 +452,37 @@ public class BirthmarkEngine{ return n; } - private BirthmarkSet[] extractFromClass(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkEnvironment context) throws IOException, BirthmarkExtractionFailedException{ + private void extractFromClass2(ClassFileArchive[] archives, ExtractionResultSet er, + ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{ + BirthmarkContext context = er.getContext(); + + for(ClassFileArchive archive: archives){ + for(ClassFileEntry entry: archive){ + try{ + BirthmarkSet birthmarkset = new BirthmarkSet(entry.getClassName(), entry.getLocation()); + byte[] data = inputStreamToByteArray(entry.getLocation().openStream()); + + for(String birthmarkType: context.getExtractionTypes()){ + try{ + BirthmarkExtractor extractor = factory.getExtractor(birthmarkType); + if(extractor.isAcceptable(ExtractionUnit.CLASS)){ + Birthmark b = extractor.extract(new ByteArrayInputStream(data), er.getEnvironment()); + birthmarkset.addBirthmark(b); + } + } catch(ExtractorNotFoundException e){ + warnings.addMessage(e, birthmarkType); + } + } + er.addBirthmarkSet(et, birthmarkset); + } catch(IOException e){ + warnings.addMessage(e, entry.getClassName()); + } + } + } + } + + private BirthmarkSet[] extractFromClass(ClassFileArchive[] archives, + BirthmarkExtractor[] extractors, BirthmarkEnvironment context) throws IOException, BirthmarkExtractionFailedException{ List list = new ArrayList(); for(ClassFileArchive archive: archives){ @@ -375,6 +505,40 @@ public class BirthmarkEngine{ return list.toArray(new BirthmarkSet[list.size()]); } + private void extractFromProduct2(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{ + BirthmarkContext context = er.getContext(); + + for(ClassFileArchive archive: archives){ + BirthmarkSet birthmarkset = new BirthmarkSet(archive.getName(), archive.getLocation()); + + for(ClassFileEntry entry: archive){ + try{ + byte[] data = inputStreamToByteArray(entry.getLocation().openStream()); + for(String birthmarkType: context.getExtractionTypes()){ + try{ + BirthmarkExtractor extractor = factory.getExtractor(birthmarkType); + if(extractor.isAcceptable(ExtractionUnit.ARCHIVE)){ + Birthmark b = birthmarkset.getBirthmark(birthmarkType); + if(b == null){ + b = extractor.createBirthmark(); + birthmarkset.addBirthmark(b); + } + extractor.extract(b, new ByteArrayInputStream(data), er.getEnvironment()); + } + } catch(ExtractorNotFoundException e){ + warnings.addMessage(e, birthmarkType); + } + } + } catch(IOException e){ + warnings.addMessage(e, entry.getClassName()); + } + } + if(birthmarkset.getBirthmarksCount() != 0){ + er.addBirthmarkSet(et, birthmarkset); + } + } + } + private BirthmarkSet[] extractFromProduct(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkEnvironment context) throws IOException, BirthmarkExtractionFailedException{ List list = new ArrayList(); diff --git a/src/main/java/jp/naist/se/stigmata/BirthmarkEnvironment.java b/src/main/java/jp/naist/se/stigmata/BirthmarkEnvironment.java index bb45e4c..c48c9ad 100644 --- a/src/main/java/jp/naist/se/stigmata/BirthmarkEnvironment.java +++ b/src/main/java/jp/naist/se/stigmata/BirthmarkEnvironment.java @@ -71,11 +71,6 @@ public class BirthmarkEnvironment{ private ComparisonPairFilterManager filterManager; /** - * @deprecated moved to BirthmarkContext - */ - private ExtractionUnit unit; - - /** * constructor for root environment */ private BirthmarkEnvironment(boolean flag){ @@ -85,14 +80,6 @@ public class BirthmarkEnvironment{ } /** - * default constructor. The instance constructed by this constructor has - * default environment as the parent. - */ - public BirthmarkEnvironment(){ - this(getDefaultEnvironment()); - } - - /** * constructor for specifying parent environment. */ public BirthmarkEnvironment(BirthmarkEnvironment parent){ @@ -270,12 +257,4 @@ public class BirthmarkEnvironment{ public ComparisonPairFilterManager getFilterManager(){ return filterManager; } - - public void setExtractionUnit(ExtractionUnit unit){ - this.unit = unit; - } - - public ExtractionUnit getExtractionUnit(){ - return unit; - } } diff --git a/src/main/java/jp/naist/se/stigmata/BirthmarkStoreTarget.java b/src/main/java/jp/naist/se/stigmata/BirthmarkStoreTarget.java new file mode 100755 index 0000000..baba9d1 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/BirthmarkStoreTarget.java @@ -0,0 +1,19 @@ +package jp.naist.se.stigmata; + +/* + * $Id$ + */ + +/** + * This class represents how to store extracted birthmarks. + * memory?, databases?, or files? + * + * @author Haruaki Tamada + * @version $Revision$ $Date$ + */ +public enum BirthmarkStoreTarget{ + MEMORY, +// FILE, +// MYSQL, +// POSTGRESQL, +} diff --git a/src/main/java/jp/naist/se/stigmata/CertainPairComparisonResultSet.java b/src/main/java/jp/naist/se/stigmata/CertainPairComparisonResultSet.java deleted file mode 100644 index 9207816..0000000 --- a/src/main/java/jp/naist/se/stigmata/CertainPairComparisonResultSet.java +++ /dev/null @@ -1,129 +0,0 @@ -package jp.naist.se.stigmata; - -/* - * $Id$ - */ - -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -/** - * Concrete class for ComparisonResultSet. This instance compare class - * files by certain pair. The pair is guessed by system with class - * name, or specified by user. - * - * @author Haruaki TAMADA - * @version $Revision$ $Date$ - */ -public class CertainPairComparisonResultSet implements ComparisonResultSet{ - private BirthmarkEnvironment environment; - private List pairList = new ArrayList(); - private Map sources = new HashMap(); - - /** - * This constructor is the comparison pair list is specified. - */ - public CertainPairComparisonResultSet(ComparisonPair[] pairs, BirthmarkEnvironment environment){ - this.environment = environment; - for(int i = 0; i < pairs.length; i++){ - pairList.add(pairs[i]); - sources.put(pairs[i].getTarget1().getLocation(), pairs[i].getTarget1()); - sources.put(pairs[i].getTarget2().getLocation(), pairs[i].getTarget2()); - } - } - - /** - * This constructor is the comparison pair was guessed with class name. - */ - public CertainPairComparisonResultSet(BirthmarkSet[] targetX, BirthmarkSet[] targetY, BirthmarkEnvironment environment){ - this.environment = environment; - for(int i = 0; i < targetX.length; i++){ - BirthmarkSet target2 = findTarget(targetX[i].getName(), targetY); - - if(target2 != null){ - pairList.add(new ComparisonPair(targetX[i], target2, environment)); - } - } - addSources(targetX); - addSources(targetY); - } - - /** - * This constructor is the comparison pair was specified as mapping. - */ - public CertainPairComparisonResultSet(BirthmarkSet[] targetX, BirthmarkSet[] targetY, Map mapping, BirthmarkEnvironment environment){ - this.environment = environment; - for(Map.Entry entry: mapping.entrySet()){ - BirthmarkSet target1 = findTarget(entry.getKey(), targetX); - BirthmarkSet target2 = findTarget(entry.getValue(), targetY); - if(target1 == null && target2 == null){ - target1 = findTarget(entry.getKey(), targetY); - target2 = findTarget(entry.getValue(), targetX); - if(target1 != null && target2 != null){ - // mapping table is swapped. - BirthmarkSet[] tmp = targetX; - targetX = targetY; - targetY = tmp; - } - } - if(target1 != null && target2 != null){ - pairList.add(new ComparisonPair(target1, target2, environment)); - } - } - addSources(targetX); - addSources(targetY); - } - - /** - * return the environment. - */ - public BirthmarkEnvironment getEnvironment(){ - return environment; - } - - /** - * return comparison count. - */ - public int getComparisonCount(){ - return pairList.size(); - } - - /** - * return the iterator of each pair. - */ - public Iterator iterator(){ - return pairList.iterator(); - } - - public BirthmarkSet[] getComparisonSources(){ - BirthmarkSet[] entries = new BirthmarkSet[sources.size()]; - int index = 0; - for(Map.Entry entry: sources.entrySet()){ - entries[index] = entry.getValue(); - index++; - } - return entries; - } - - /** - * find BirthmarkSet from given array by given class name. - */ - private BirthmarkSet findTarget(String className, BirthmarkSet[] target){ - for(int i = 0; i < target.length; i++){ - if(className.equals(target[i].getName())){ - return target[i]; - } - } - return null; - } - - private void addSources(BirthmarkSet[] bs){ - for(BirthmarkSet s: bs){ - sources.put(s.getLocation(), s); - } - } -} diff --git a/src/main/java/jp/naist/se/stigmata/ComparisonMethod.java b/src/main/java/jp/naist/se/stigmata/ComparisonMethod.java index bc581c9..1935f82 100755 --- a/src/main/java/jp/naist/se/stigmata/ComparisonMethod.java +++ b/src/main/java/jp/naist/se/stigmata/ComparisonMethod.java @@ -22,7 +22,12 @@ public enum ComparisonMethod{ * This constants represents comparing all combination between X. * x1 - x1, x1 - x2, x1 - x3, ..., xn - xn-1 xn, xn. */ - ROUND_ROBIN, + ROUND_ROBIN_SAME_PAIR, + /** + * This constants represents comparing all combination between X. + * x1 - x1, x1 - x2, x1 - x3, ..., xn - xn-1 xn, xn. + */ + ROUND_ROBIN_WITHOUT_SAME_PAIR, /** * This constants represents comparing some pairs. The pair is guessed by * its name. If x1 and y3 have same name, then the pair of x1 and y3 is diff --git a/src/main/java/jp/naist/se/stigmata/ComparisonPair.java b/src/main/java/jp/naist/se/stigmata/ComparisonPair.java index 091a6d8..ff9f229 100644 --- a/src/main/java/jp/naist/se/stigmata/ComparisonPair.java +++ b/src/main/java/jp/naist/se/stigmata/ComparisonPair.java @@ -16,15 +16,15 @@ import java.util.List; public class ComparisonPair implements Iterable{ private BirthmarkSet target1; private BirthmarkSet target2; - private BirthmarkEnvironment environment; + private BirthmarkContext context; /** * constructor. */ - public ComparisonPair(BirthmarkSet target1, BirthmarkSet target2, BirthmarkEnvironment environment){ + public ComparisonPair(BirthmarkSet target1, BirthmarkSet target2, BirthmarkContext context){ this.target1 = target1; this.target2 = target2; - this.environment = environment; + this.context = context; if(target1.getBirthmarksCount() != target2.getBirthmarksCount()){ throw new IllegalArgumentException("birthmark count is not matched"); @@ -76,13 +76,16 @@ public class ComparisonPair implements Iterable{ */ public synchronized Iterator iterator(){ List list = new ArrayList(); + BirthmarkEnvironment env = context.getEnvironment(); for(Iterator i = target1.birthmarkTypes(); i.hasNext(); ){ String type = i.next(); Birthmark b1 = target1.getBirthmark(type); Birthmark b2 = target2.getBirthmark(type); if(b1 != null && b2 != null){ - list.add(new ComparisonPairElement(b1, b2, environment.getService(type).getComparator())); + list.add(new ComparisonPairElement( + b1, b2, env.getService(type).getComparator() + )); } } return list.iterator(); diff --git a/src/main/java/jp/naist/se/stigmata/ComparisonResultSet.java b/src/main/java/jp/naist/se/stigmata/ComparisonResultSet.java index 3893454..922d0f2 100644 --- a/src/main/java/jp/naist/se/stigmata/ComparisonResultSet.java +++ b/src/main/java/jp/naist/se/stigmata/ComparisonResultSet.java @@ -18,12 +18,20 @@ public interface ComparisonResultSet extends Iterable{ */ public BirthmarkEnvironment getEnvironment(); + public BirthmarkContext getContext(); + /** * returns a iterator for {@link ComparisonPair ComparisonPair}. */ public Iterator iterator(); - public int getComparisonCount(); + public ComparisonPair getPairAt(int index); + + public ComparisonPair[] getPairs(); + + public int getPairCount(); + + public BirthmarkSet[] getPairSources(); - public BirthmarkSet[] getComparisonSources(); + public Iterator pairSources(); } diff --git a/src/main/java/jp/naist/se/stigmata/ExtractionResultSet.java b/src/main/java/jp/naist/se/stigmata/ExtractionResultSet.java new file mode 100755 index 0000000..3c24392 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/ExtractionResultSet.java @@ -0,0 +1,47 @@ +package jp.naist.se.stigmata; + +import java.util.Iterator; + +public interface ExtractionResultSet extends Iterable{ + public boolean isTableType(); + + public void setTableType(boolean flag); + + public BirthmarkEnvironment getEnvironment(); + + public BirthmarkContext getContext(); + + public String[] getBirthmarkTypes(); + + public int getBirthmarkSetSize(); + + public Iterator iterator(); + + public BirthmarkSet getBirthmarkSet(int index); + + public BirthmarkSet getBirthmarkSet(String name); + + public BirthmarkSet[] getBirthmarkSets(); + + public int getBirthmarkSetSize(ExtractionTarget target); + + public void removeBirthmarkSet(BirthmarkSet bs); + + public void removeAllBirthmarkSets(); + + public Iterator birthmarkSets(ExtractionTarget target); + + public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index); + + public BirthmarkSet getBirthmarkSet(ExtractionTarget target, String setname); + + public BirthmarkSet[] getBirthmarkSets(ExtractionTarget target); + + public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set); + + public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets); + + public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set); + + public void removeAllBirthmarkSets(ExtractionTarget target); +} diff --git a/src/main/java/jp/naist/se/stigmata/ExtractionTarget.java b/src/main/java/jp/naist/se/stigmata/ExtractionTarget.java new file mode 100755 index 0000000..f16d17d --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/ExtractionTarget.java @@ -0,0 +1,17 @@ +package jp.naist.se.stigmata; + +/* + * $Id$ + */ + +/** + * + * @author Haruaki Tamada + * @version $Revision$ $Date$ + */ +public enum ExtractionTarget{ + TARGET_X, + TARGET_Y, + TARGET_XY, + TARGET_BOTH, +} \ No newline at end of file diff --git a/src/main/java/jp/naist/se/stigmata/Main.java b/src/main/java/jp/naist/se/stigmata/Main.java index 055023e..a03825e 100644 --- a/src/main/java/jp/naist/se/stigmata/Main.java +++ b/src/main/java/jp/naist/se/stigmata/Main.java @@ -14,8 +14,12 @@ import java.io.PrintWriter; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import jp.naist.se.stigmata.event.BirthmarkEngineAdapter; +import jp.naist.se.stigmata.event.BirthmarkEngineEvent; +import jp.naist.se.stigmata.event.WarningMessages; import jp.naist.se.stigmata.format.BirthmarkComparisonResultFormat; import jp.naist.se.stigmata.format.BirthmarkExtractionResultFormat; import jp.naist.se.stigmata.format.BirthmarkServiceListFormat; @@ -45,7 +49,6 @@ import org.xml.sax.SAXException; */ public final class Main{ private FormatManager manager = FormatManager.getInstance(); - private BirthmarkEnvironment environment; /** * main process. @@ -57,11 +60,7 @@ public final class Main{ Stigmata stigmata = Stigmata.getInstance(); stigmata.configuration(commandLine.getOptionValue("config-file")); - environment = stigmata.createEnvironment(); - addClasspath(environment.getClasspathContext(), commandLine); - - String[] birthmarks = getTargetBirthmarks(commandLine); String[] arguments = commandLine.getArgs(); String mode = commandLine.getOptionValue("mode"); @@ -73,31 +72,29 @@ public final class Main{ if(mode == null){ mode = "gui"; } + BirthmarkContext context = stigmata.createContext(); + updateContext(context, commandLine); - boolean exitFlag = executeOption(commandLine, options); + boolean exitFlag = executeOption(context.getEnvironment(), commandLine, options); if(!exitFlag){ if(!("gui".equals(mode) || "list".equals(mode)) && (arguments == null || arguments.length == 0)){ - printHelp(options); + printHelp(context.getEnvironment(), options); return; } if(mode.equals("list")){ - listBirthmarks(stigmata, format); + listBirthmarks(context, format); } else if(mode.equals("extract")){ - extractBirthmarks(stigmata, birthmarks, arguments, format); + extractBirthmarks(stigmata, arguments, format, context); } else if(mode.equals("compare")){ - String[] filters = null; - if(commandLine.hasOption("filter")){ - filters = commandLine.getOptionValues("filter"); - } - compareBirthmarks(stigmata, birthmarks, filters, arguments, format); + compareBirthmarks(stigmata, arguments, format, context); } else if(mode.equals("gui")){ - StigmataFrame frame = new StigmataFrame(stigmata, environment); + StigmataFrame frame = new StigmataFrame(stigmata, context.getEnvironment()); frame.setVisible(true); } } @@ -106,14 +103,25 @@ public final class Main{ /** * extract birthmarks. */ - private void extractBirthmarks(Stigmata stigmata, String[] birthmarks, - String[] args, String format){ + private void extractBirthmarks(Stigmata stigmata, String[] args, String format, + BirthmarkContext context){ try{ - BirthmarkSet[] sets = stigmata.extract(birthmarks, args, environment); + context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_SAME_PAIR); + BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment()); + + engine.addBirthmarkEngineListener(new BirthmarkEngineAdapter(){ + public void operationDone(BirthmarkEngineEvent e){ + WarningMessages warnings = e.getMessage(); + for(Iterator i = warnings.exceptions(); i.hasNext(); ){ + i.next().printStackTrace(); + } + } + }); + ExtractionResultSet ers = engine.extract(args, context); ResultFormatSpi spi = manager.getService(format); BirthmarkExtractionResultFormat formatter = spi.getExtractionResultFormat(); - formatter.printResult(new PrintWriter(System.out), sets); + formatter.printResult(new PrintWriter(System.out), ers); }catch(Exception ex){ ex.printStackTrace(); } @@ -122,13 +130,24 @@ public final class Main{ /** * */ - private void compareBirthmarks(Stigmata stigmata, String[] birthmarks, - String[] filters, String[] args, String format){ + private void compareBirthmarks(Stigmata stigmata, String[] args, String format, + BirthmarkContext context){ try{ - BirthmarkSet[] sets = stigmata.extract(birthmarks, args, environment); - ComparisonResultSet resultset = stigmata.compare(sets, environment); - if(filters != null){ - resultset = stigmata.filter(resultset, filters); + BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment()); + context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_SAME_PAIR); + engine.addBirthmarkEngineListener(new BirthmarkEngineAdapter(){ + public void operationDone(BirthmarkEngineEvent e){ + WarningMessages warnings = e.getMessage(); + for(Iterator i = warnings.exceptions(); i.hasNext(); ){ + i.next().printStackTrace(); + } + } + }); + + ExtractionResultSet rs = engine.extract(args, context); + ComparisonResultSet resultset = engine.compare(rs); + if(context.hasFilter()){ + resultset = engine.filter(resultset); } ResultFormatSpi spi = manager.getService(format); @@ -139,9 +158,9 @@ public final class Main{ } } - private void listBirthmarks(Stigmata stigmata, String format){ + private void listBirthmarks(BirthmarkContext context, String format){ try{ - BirthmarkSpi[] spis = stigmata.createEnvironment().findServices(); + BirthmarkSpi[] spis = context.getEnvironment().findServices(); ResultFormatSpi spi = manager.getService(format); BirthmarkServiceListFormat formatter = spi.getBirthmarkServiceListFormat(); @@ -151,11 +170,32 @@ public final class Main{ } } - private String[] getTargetBirthmarks(CommandLinePlus cl){ + private void updateContext(BirthmarkContext context, CommandLinePlus cl){ + BirthmarkEnvironment env = context.getEnvironment(); + + String[] birthmarks = getTargetBirthmarks(env, cl); + for(int i = 0; i < birthmarks.length; i++){ + context.addExtractionType(birthmarks[i]); + } + if(cl.hasOption("filter")){ + String[] filters = cl.getOptionValues("filter"); + for(int i = 0; i < filters.length; i++){ + context.addFilterType(filters[i]); + } + } + if(cl.hasOption("extraction-unit")){ + ExtractionUnit unit = ExtractionUnit.valueOf(cl.getOptionValue("extraction-unit")); + context.setExtractionUnit(unit); + } + + addClasspath(env.getClasspathContext(), cl); + } + + private String[] getTargetBirthmarks(BirthmarkEnvironment env, CommandLinePlus cl){ String[] birthmarks = cl.getOptionValues("birthmark"); if(birthmarks == null || birthmarks.length == 0){ List birthmarkList = new ArrayList(); - for(BirthmarkSpi service: environment.getServices()){ + for(BirthmarkSpi service: env.getServices()){ if(!service.isExpert()){ birthmarkList.add(service.getType()); } @@ -181,10 +221,10 @@ public final class Main{ } } - private boolean executeOption(CommandLinePlus commandLine, Options options){ + private boolean executeOption(BirthmarkEnvironment env, CommandLinePlus commandLine, Options options){ boolean exitFlag = false; if(commandLine.hasOption("help")){ - printHelp(options); + printHelp(env, options); exitFlag = true; } if(commandLine.hasOption("version")){ @@ -196,7 +236,7 @@ public final class Main{ exitFlag = true; } if(commandLine.hasOption("export-config")){ - exportConfiguration(commandLine.getOptionValue("export-config")); + exportConfiguration(env, commandLine.getOptionValue("export-config")); exitFlag = true; } return exitFlag; @@ -220,7 +260,7 @@ public final class Main{ return null; } - private void exportConfiguration(String file){ + public void exportConfiguration(BirthmarkEnvironment env, String file){ try{ PrintWriter out; if(file == null){ @@ -233,13 +273,13 @@ public final class Main{ out = new PrintWriter(new FileWriter(file)); } - new ConfigFileExporter(environment).export(out); + new ConfigFileExporter(env).export(out); out.close(); }catch(IOException e){ } } - private void printHelp(Options options){ + public void printHelp(BirthmarkEnvironment env, Options options){ Package p = getClass().getPackage(); HelpFormatter formatter = new HelpFormatter(); formatter.printHelp( @@ -252,7 +292,7 @@ public final class Main{ ); System.out.println(); System.out.println("Available birthmarks:"); - for(BirthmarkSpi service: environment.getServices()){ + for(BirthmarkSpi service: env.getServices()){ if(!service.isExpert()){ System.out.printf(" %-5s (%s): %s%n", service.getType(), service.getDisplayType(), service.getDescription()); @@ -260,7 +300,7 @@ public final class Main{ } System.out.println(); System.out.println("Available filers:"); - for(ComparisonPairFilterSet filterset: environment.getFilterManager() + for(ComparisonPairFilterSet filterset: env.getFilterManager() .getFilterSets()){ System.out.printf(" %s (%s)%n", filterset.getName(), filterset.isMatchAll()? "match all": "match any"); for(ComparisonPairFilter filter: filterset){ @@ -272,7 +312,7 @@ public final class Main{ System.out.println("Please notify us some bugs and requests to "); } - private void printLicense(){ + public void printLicense(){ try{ InputStream in = getClass().getResourceAsStream("/META-INF/license.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); @@ -287,7 +327,7 @@ public final class Main{ } } - private void printVersion(){ + public void printVersion(){ Package p = getClass().getPackage(); System.out.println("stigmata version " + p.getImplementationVersion()); } diff --git a/src/main/java/jp/naist/se/stigmata/RoundRobinComparisonResultSet.java b/src/main/java/jp/naist/se/stigmata/RoundRobinComparisonResultSet.java deleted file mode 100644 index 9429915..0000000 --- a/src/main/java/jp/naist/se/stigmata/RoundRobinComparisonResultSet.java +++ /dev/null @@ -1,155 +0,0 @@ -package jp.naist.se.stigmata; - -/* - * $Id$ - */ - -import java.net.URL; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -/** - * Concrete class for ComparisonResultSet. This instance compare class files by round robin. - * - * @author Haruaki TAMADA - * @version $Revision$ $Date$ - */ -public class RoundRobinComparisonResultSet implements ComparisonResultSet{ - private List holders1; - private List holders2; - private BirthmarkEnvironment environment; - - private int compareCount; - private boolean tablePair = true; - private boolean samePair = false; - - /** - * constructor. if user gives { a, b, c, } as holders1, then - * the instance (created by this constructor) compares { a<->b, a<->c, - * b<->c, }. - */ - public RoundRobinComparisonResultSet(BirthmarkSet[] holders1, BirthmarkEnvironment environment){ - this(holders1, environment, false); - } - - /** - * constructor. if user gives { a, b, c, } as holders1, then the - * instance (created by this constructor when samePair is true) - * compares { a<->a, b<->a, b<->b, c<->a, c<->b, c<->c, }. - * Otherwise, the instance compares { a<->b, a<->c, b<->c, } when - * samePair is false. - */ - public RoundRobinComparisonResultSet(BirthmarkSet[] holders1, BirthmarkEnvironment environment, - boolean samePair){ - this.holders1 = Arrays.asList(holders1); - this.holders2 = Arrays.asList(holders1); - this.environment = environment; - - tablePair = false; - setCompareSamePair(samePair); - } - - /** - * constructor. if user gives { a, b, c, } as holders1 and { x, - * y, z, } as holders2, then the instance compares { a<->x, a<->y, - * a<->z, b<->x, b<->y, b<->z, c<->x, c<->y, c<->z, }. - */ - public RoundRobinComparisonResultSet(final BirthmarkSet[] holders1, final BirthmarkSet[] holders2, - BirthmarkEnvironment environment){ - this.holders1 = Arrays.asList(holders1); - this.holders2 = Arrays.asList(holders2); - this.environment = environment; - tablePair = true; - - this.compareCount = holders1.length * holders2.length; - } - - /** - * @return environment - */ - public BirthmarkEnvironment getEnvironment(){ - return environment; - } - - /** - * update same pair comparing flag unless two birthmark array is setted. - */ - public void setCompareSamePair(boolean flag){ - samePair = flag; - if(samePair){ - compareCount = holders1.size() * (holders1.size() + 1) / 2; - } - else{ - compareCount = holders1.size() * (holders1.size() - 1) / 2; - } - } - - public boolean isCompareSamePair(){ - return samePair; - } - - /** - * returns the compare count of birthmark sets. - */ - public int getComparisonCount(){ - return compareCount; - } - - /** - * return a iterator of whole comparison. - */ - public Iterator iterator(){ - return new ComparisonIterator(); - } - - public BirthmarkSet[] getComparisonSources(){ - Map map = new HashMap(); - for(BirthmarkSet set: holders1){ - map.put(set.getLocation(), set); - } - for(BirthmarkSet set: holders2){ - map.put(set.getLocation(), set); - } - - BirthmarkSet[] entries = new BirthmarkSet[map.size()]; - int index = 0; - for(Map.Entry entry: map.entrySet()){ - entries[index] = entry.getValue(); - index++; - } - - return entries; - } - - /** - * iterator class. - */ - private class ComparisonIterator implements Iterator{ - private int i = 0; - private int j = 0; - private int count = 0; - - public boolean hasNext(){ - return count < getComparisonCount(); - } - - public ComparisonPair next(){ - if((tablePair && i == holders1.size()) || - (!tablePair && !samePair && i == j) || - (!tablePair && samePair && i > j)){ - i = 0; - j++; - } - ComparisonPair pair = new ComparisonPair(holders1.get(i), holders2.get(j), environment); - count++; - i++; - return pair; - } - - public void remove(){ - } - } -} diff --git a/src/main/java/jp/naist/se/stigmata/Stigmata.java b/src/main/java/jp/naist/se/stigmata/Stigmata.java old mode 100644 new mode 100755 index 4219c71..824ee3b --- a/src/main/java/jp/naist/se/stigmata/Stigmata.java +++ b/src/main/java/jp/naist/se/stigmata/Stigmata.java @@ -4,63 +4,58 @@ package jp.naist.se.stigmata; * $Id$ */ -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.net.MalformedURLException; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.Map; -import java.util.Stack; -import java.util.logging.Logger; import javax.imageio.spi.ServiceRegistry; -import jp.naist.se.stigmata.event.BirthmarkEngineEvent; import jp.naist.se.stigmata.event.BirthmarkEngineListener; -import jp.naist.se.stigmata.event.OperationStage; -import jp.naist.se.stigmata.event.OperationType; -import jp.naist.se.stigmata.event.WarningMessages; -import jp.naist.se.stigmata.filter.ComparisonPairFilterManager; -import jp.naist.se.stigmata.filter.FilteredComparisonResultSet; -import jp.naist.se.stigmata.reader.ClassFileArchive; -import jp.naist.se.stigmata.reader.ClassFileEntry; -import jp.naist.se.stigmata.reader.ClasspathContext; -import jp.naist.se.stigmata.reader.DefaultClassFileArchive; -import jp.naist.se.stigmata.reader.JarClassFileArchive; -import jp.naist.se.stigmata.reader.WarClassFileArchive; import jp.naist.se.stigmata.spi.BirthmarkSpi; import jp.naist.se.stigmata.utils.ConfigFileImporter; -import org.apache.commons.beanutils.BeanUtils; - /** - * Birthmarking engine. - * - * @author Haruaki TAMADA - * @version $Revision$ $Date$ + * + * @author Haruaki Tamada + * @version $Revision$ $Date$ */ -public final class Stigmata{ - private static final Stigmata instance = new Stigmata(); - - private BirthmarkEnvironment defaultEnvironment = BirthmarkEnvironment.getDefaultEnvironment(); - private boolean configDone = false; - private Stack stack = new Stack(); - private WarningMessages warnings; +public class Stigmata{ + private static Stigmata stigmata; + private BirthmarkEnvironment defaultEnvironment; private List listeners = new ArrayList(); private Stigmata(){ + configuration(); + } + + public static synchronized Stigmata getInstance(){ + if(stigmata == null){ + stigmata = new Stigmata(); + } + return stigmata; + } + + public BirthmarkContext createContext(){ + return new BirthmarkContext(createEnvironment()); + } + + public BirthmarkEnvironment createEnvironment(){ + return new BirthmarkEnvironment(defaultEnvironment); + } + + public BirthmarkEngine createEngine(){ + BirthmarkEngine engine = new BirthmarkEngine(createEnvironment()); + return engine; } - public static Stigmata getInstance(){ - return instance; + public BirthmarkEngine createEngine(BirthmarkEnvironment environment){ + BirthmarkEngine engine = new BirthmarkEngine(environment); + return engine; } public void addBirthmarkEngineListener(BirthmarkEngineListener listener){ @@ -71,14 +66,8 @@ public final class Stigmata{ listeners.remove(listener); } - public WarningMessages getWarnings(){ - return warnings; - } - public void configuration(){ - operationStart(OperationType.CONFIGURATION); configuration(null); - operationDone(OperationType.CONFIGURATION); } public void configuration(String filePath){ @@ -90,7 +79,8 @@ public final class Stigmata{ filePath = null; } } - else{ + + if(filePath == null){ File file = new File("stigmata.xml"); if(!file.exists()){ file = new File(System.getProperty("user.home"), ".stigmata.xml"); @@ -113,179 +103,10 @@ public final class Stigmata{ initConfiguration(target); } - /** - * create a new {@link BirthmarkEnvironment BirthmarkEnvironment}. - */ - public BirthmarkEnvironment createEnvironment(){ - operationStart(OperationType.CREATE_ENVIRONMENT); - BirthmarkEnvironment environment = new BirthmarkEnvironment(); - operationDone(OperationType.CREATE_ENVIRONMENT); - return environment; - } - - public BirthmarkSet[] extract(String[] birthmarks, String[] files) throws BirthmarkExtractionFailedException{ - operationStart(OperationType.EXTRACT_BIRTHMARKS); - BirthmarkSet[] set = extract(birthmarks, files, createEnvironment()); - operationDone(OperationType.EXTRACT_BIRTHMARKS); - - return set; - } - - public BirthmarkSet[] extract(String[] birthmarks, String[] files, - BirthmarkEnvironment environment) throws BirthmarkExtractionFailedException{ - operationStart(OperationType.EXTRACT_BIRTHMARKS); - try{ - return extractImpl(birthmarks, files, environment); - } catch(IOException e){ - throw new BirthmarkExtractionFailedException(e); - } finally{ - operationDone(OperationType.EXTRACT_BIRTHMARKS); - } - } - - public ComparisonResultSet compare(BirthmarkSet[] holders) throws IOException{ - operationStart(OperationType.COMPARE_BIRTHMARKS); - ComparisonResultSet crs = compare(holders, createEnvironment()); - operationDone(OperationType.COMPARE_BIRTHMARKS); - - return crs; - } - - public ComparisonResultSet compare(BirthmarkSet[] holders, BirthmarkEnvironment environment) throws IOException{ - operationStart(OperationType.COMPARE_BIRTHMARKS); - ComparisonResultSet result = new RoundRobinComparisonResultSet(holders, environment, true); - operationDone(OperationType.COMPARE_BIRTHMARKS); - - return result; - } - - public ComparisonResultSet compare(BirthmarkSet[] holders1, BirthmarkSet[] holders2) throws IOException{ - operationStart(OperationType.COMPARE_BIRTHMARKS); - ComparisonResultSet crs = compare(holders1, holders2, createEnvironment()); - operationDone(OperationType.COMPARE_BIRTHMARKS); - return crs; - } - - public ComparisonResultSet compare(BirthmarkSet[] holders1, BirthmarkSet[] holders2, BirthmarkEnvironment environment) throws IOException{ - operationStart(OperationType.COMPARE_BIRTHMARKS); - ComparisonResultSet result = new RoundRobinComparisonResultSet(holders1, holders2, environment); - operationDone(OperationType.COMPARE_BIRTHMARKS); - - return result; - } - - public ComparisonResultSet filter(ComparisonResultSet resultset, String[] filters){ - operationStart(OperationType.FILTER_BIRTHMARKS); - ComparisonResultSet crs = filter(resultset, filters, createEnvironment()); - operationDone(OperationType.FILTER_BIRTHMARKS); - - return crs; - } - - public ComparisonResultSet filter(ComparisonResultSet resultset, String[] filters, BirthmarkEnvironment environment){ - operationStart(OperationType.FILTER_BIRTHMARKS); - if(filters != null){ - List filterList = new ArrayList(); - ComparisonPairFilterManager manager = environment.getFilterManager(); - for(int i = 0; i < filters.length; i++){ - ComparisonPairFilterSet fset = manager.getFilterSet(filters[i]); - if(fset != null){ - filterList.add(fset); - } - else{ - Logger logger = Logger.getLogger(getClass().getName()); - logger.warning(filters[i] + ": filter not found"); - } - } - - return filter(resultset, filterList.toArray(new ComparisonPairFilterSet[filterList.size()])); - } - operationDone(OperationType.FILTER_BIRTHMARKS); - return resultset; - } - - public ComparisonResultSet filter(ComparisonResultSet resultset, ComparisonPairFilterSet[] filters){ - operationStart(OperationType.FILTER_BIRTHMARKS); - ComparisonResultSet crs = filter(resultset, filters, createEnvironment()); - operationDone(OperationType.FILTER_BIRTHMARKS); - - return crs; - } - - public ComparisonResultSet filter(ComparisonResultSet resultset, ComparisonPairFilterSet[] filters, BirthmarkEnvironment environment){ - operationStart(OperationType.FILTER_BIRTHMARKS); - FilteredComparisonResultSet filterResultSet = new FilteredComparisonResultSet(resultset); - operationDone(OperationType.FILTER_BIRTHMARKS); - - return filterResultSet; - } - - public double compareDetails(BirthmarkSet h1, BirthmarkSet h2){ - operationStart(OperationType.COMPARE_DETAIL_BIRTHMARKS); - double similarity = compareDetails(h1, h2, createEnvironment()); - operationDone(OperationType.COMPARE_DETAIL_BIRTHMARKS); - return similarity; - } - - public double compareDetails(BirthmarkSet h1, BirthmarkSet h2, BirthmarkEnvironment environment){ - operationStart(OperationType.COMPARE_DETAIL_BIRTHMARKS); - ComparisonPair pair = new ComparisonPair(h1, h2, environment); - double sim = pair.calculateSimilarity(); - operationDone(OperationType.COMPARE_DETAIL_BIRTHMARKS); - - return sim; - } - - private BirthmarkExtractor[] createExtractors(String[] birthmarkTypes, BirthmarkEnvironment environment){ - List list = new ArrayList(); - for(String type: birthmarkTypes){ - BirthmarkExtractor extractor = createExtractor(type, environment); - list.add(extractor); - } - return list.toArray(new BirthmarkExtractor[list.size()]); - } - - @SuppressWarnings("unchecked") - private BirthmarkExtractor createExtractor(String birthmarkType, BirthmarkEnvironment environment){ - BirthmarkSpi spi = environment.getService(birthmarkType); - if(spi != null){ - BirthmarkExtractor extractor = spi.getExtractor(); - try{ - Map props = BeanUtils.describe(extractor); - props.remove("class"); - props.remove("provider"); - for(Object keyObject: props.keySet()){ - String key = "extractor." + spi.getType() + "." + String.valueOf(keyObject); - if(environment.getProperty(key) != null){ - BeanUtils.setProperty(extractor, (String)keyObject, environment.getProperty(key)); - } - } - } catch(InvocationTargetException e){ - throw new InternalError(e.getMessage()); - } catch(NoSuchMethodException e){ - throw new InternalError(e.getMessage()); - } catch(IllegalAccessException e){ - throw new InternalError(e.getMessage()); - } - return extractor; - } - return null; - } - - private byte[] inputStreamToByteArray(InputStream in) throws IOException{ - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - int read; - byte[] dataBuffer = new byte[512]; - while((read = in.read(dataBuffer, 0, dataBuffer.length)) != -1){ - bout.write(dataBuffer, 0, read); - } - byte[] data = bout.toByteArray(); - - bout.close(); - return data; - } - private void initConfiguration(InputStream in){ + if(defaultEnvironment == null){ + defaultEnvironment = BirthmarkEnvironment.getDefaultEnvironment(); + } try { ConfigFileImporter parser = new ConfigFileImporter(defaultEnvironment); parser.parse(in); @@ -296,192 +117,5 @@ public final class Stigmata{ BirthmarkSpi service = i.next(); defaultEnvironment.addService(service); } - configDone = true; - } - - private void operationStart(OperationType type){ - if(type != OperationType.CONFIGURATION && !configDone){ - configuration(); - } - if(warnings == null){ - warnings = new WarningMessages(type); - fireEvent(new BirthmarkEngineEvent(OperationStage.OPERATION_START, type, warnings)); - } - stack.push(warnings); - fireEvent(new BirthmarkEngineEvent(OperationStage.SUB_OPERATION_START, type, warnings)); - } - - private void operationDone(OperationType type){ - fireEvent(new BirthmarkEngineEvent(OperationStage.SUB_OPERATION_DONE, type, warnings)); - stack.pop(); - if(stack.size() == 0){ - fireEvent(new BirthmarkEngineEvent(OperationStage.OPERATION_DONE, type, warnings)); - warnings = null; - } - } - - private void fireEvent(BirthmarkEngineEvent e){ - for(BirthmarkEngineListener listener: listeners){ - switch(e.getStage()){ - case OPERATION_START: - listener.operationStart(e); - break; - case SUB_OPERATION_START: - listener.subOperationStart(e); - break; - case SUB_OPERATION_DONE: - listener.subOperationDone(e); - break; - case OPERATION_DONE: - listener.operationDone(e); - break; - default: - throw new InternalError("unknown stage: " + e.getStage()); - } - } - } - - private BirthmarkSet[] extractImpl(String[] birthmarks, String[] files, BirthmarkEnvironment environment) throws IOException, BirthmarkExtractionFailedException{ - ClasspathContext context = environment.getClasspathContext(); - for(int i = 0; i < files.length; i++){ - context.addClasspath(new File(files[i]).toURI().toURL()); - } - ClassFileArchive[] archives = createArchives(files, environment); - BirthmarkExtractor[] extractors = createExtractors(birthmarks, environment); - ExtractionUnit unit = environment.getExtractionUnit(); - - if(unit == ExtractionUnit.PACKAGE){ - return extractFromPackage(archives, extractors, environment); - } - else if(unit == ExtractionUnit.ARCHIVE){ - return extractFromProduct(archives, extractors, environment); - } - else{ - return extractFromClass(archives, extractors, environment); - } - } - - private BirthmarkSet[] extractFromPackage(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkEnvironment environment) throws IOException, BirthmarkExtractionFailedException{ - Map list = new HashMap(); - - for(ClassFileArchive archive: archives){ - for(ClassFileEntry entry: archive){ - try{ - String name = entry.getClassName(); - String packageName = parsePackageName(name); - BirthmarkSet bs = list.get(packageName); - if(bs == null){ - bs = new BirthmarkSet(packageName, archive.getLocation()); - list.put(packageName, bs); - } - - byte[] data = inputStreamToByteArray(entry.getLocation().openStream()); - for(BirthmarkExtractor extractor: extractors){ - if(extractor.isAcceptable(ExtractionUnit.PACKAGE)){ - Birthmark b = bs.getBirthmark(extractor.getProvider().getType()); - if(b == null){ - b = extractor.createBirthmark(); - bs.addBirthmark(b); - } - extractor.extract(b, new ByteArrayInputStream(data), environment); - } - } - } catch(IOException e){ - warnings.addMessage(e, archive.getName()); - } - } - } - - return list.values().toArray(new BirthmarkSet[list.size()]); - } - - private String parsePackageName(String name){ - String n = name.replace('/', '.'); - int index = n.lastIndexOf('.'); - if(index > 0){ - n = n.substring(0, index - 1); - } - - return n; - } - - private BirthmarkSet[] extractFromClass(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkEnvironment environment) throws IOException, BirthmarkExtractionFailedException{ - List list = new ArrayList(); - - for(ClassFileArchive archive: archives){ - for(ClassFileEntry entry: archive){ - try{ - BirthmarkSet birthmarkset = new BirthmarkSet(entry.getClassName(), entry.getLocation()); - list.add(birthmarkset); - byte[] data = inputStreamToByteArray(entry.getLocation().openStream()); - for(BirthmarkExtractor extractor: extractors){ - if(extractor.isAcceptable(ExtractionUnit.CLASS)){ - Birthmark b = extractor.extract(new ByteArrayInputStream(data), environment); - birthmarkset.addBirthmark(b); - } - } - } catch(IOException e){ - warnings.addMessage(e, entry.getClassName()); - } - } - } - return list.toArray(new BirthmarkSet[list.size()]); - } - - private BirthmarkSet[] extractFromProduct(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkEnvironment environment) throws IOException, BirthmarkExtractionFailedException{ - List list = new ArrayList(); - - for(ClassFileArchive archive: archives){ - BirthmarkSet birthmarkset = new BirthmarkSet(archive.getName(), archive.getLocation()); - list.add(birthmarkset); - - for(ClassFileEntry entry: archive){ - try{ - byte[] data = inputStreamToByteArray(entry.getLocation().openStream()); - for(BirthmarkExtractor extractor: extractors){ - if(extractor.isAcceptable(ExtractionUnit.ARCHIVE)){ - Birthmark b = birthmarkset.getBirthmark(extractor.getProvider().getType()); - if(b == null){ - b = extractor.createBirthmark(); - birthmarkset.addBirthmark(b); - } - extractor.extract(b, new ByteArrayInputStream(data), environment); - } - } - } catch(IOException e){ - warnings.addMessage(e, entry.getClassName()); - } - } - } - for(Iterator i = list.iterator(); i.hasNext(); ){ - BirthmarkSet set = i.next(); - if(set.getBirthmarksCount() == 0){ - i.remove(); - } - } - - return list.toArray(new BirthmarkSet[list.size()]); - } - - private ClassFileArchive[] createArchives(String[] files, BirthmarkEnvironment environment) throws IOException, MalformedURLException{ - ClasspathContext bytecode = environment.getClasspathContext(); - List archives = new ArrayList(); - for(int i = 0; i < files.length; i++){ - try{ - if(files[i].endsWith(".class")){ - archives.add(new DefaultClassFileArchive(files[i])); - } - else if(files[i].endsWith(".jar") || files[i].endsWith(".zip")){ - archives.add(new JarClassFileArchive(files[i])); - bytecode.addClasspath(new File(files[i]).toURI().toURL()); - } - else if(files[i].endsWith(".war")){ - archives.add(new WarClassFileArchive(files[i])); - } - } catch(IOException e){ - warnings.addMessage(e, files[i]); - } - } - return archives.toArray(new ClassFileArchive[archives.size()]); } } diff --git a/src/main/java/jp/naist/se/stigmata/Stigmata2.java b/src/main/java/jp/naist/se/stigmata/Stigmata2.java deleted file mode 100755 index fb832fb..0000000 --- a/src/main/java/jp/naist/se/stigmata/Stigmata2.java +++ /dev/null @@ -1,107 +0,0 @@ -package jp.naist.se.stigmata; - -/* - * $Id$ - */ - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.Iterator; - -import javax.imageio.spi.ServiceRegistry; - -import jp.naist.se.stigmata.event.BirthmarkEngineListener; -import jp.naist.se.stigmata.spi.BirthmarkSpi; -import jp.naist.se.stigmata.utils.ConfigFileImporter; - -/** - * - * @author Haruaki Tamada - * @version $Revision$ $Date$ - */ -public class Stigmata2{ - private static Stigmata2 stigmata = new Stigmata2(); - private BirthmarkEnvironment defaultEnvironment; - private BirthmarkEngine engine; - - private Stigmata2(){ - configuration(); - engine = new BirthmarkEngine(defaultEnvironment); - } - - public static Stigmata2 getInstance(){ - return stigmata; - } - - public void addBirthmarkEngineListener(BirthmarkEngineListener listener){ - engine.addBirthmarkEngineListener(listener); - } - - public void removeBirthmarkEngineListener(BirthmarkEngineListener listener){ - engine.removeBirthmarkEngineListener(listener); - } - - public ComparisonResultSet compare(String[] files, BirthmarkContext context) throws BirthmarkException{ - return engine.compare(files, context); - } - - public ComparisonResultSet compare(String[] fileX, String[] fileY, BirthmarkContext context) throws BirthmarkException{ - return engine.compare(fileX, fileY, context); - } - - public void configuration(){ - configuration(null); - } - - public void configuration(String filePath){ - InputStream target = null; - if(filePath != null){ - try{ - target = new FileInputStream(filePath); - } catch(FileNotFoundException e){ - filePath = null; - } - } - - if(filePath == null){ - File file = new File("stigmata.xml"); - if(!file.exists()){ - file = new File(System.getProperty("user.home"), ".stigmata.xml"); - if(!file.exists()){ - file = null; - } - } - if(file != null){ - try { - target = new FileInputStream(file); - } catch (FileNotFoundException ex) { - // never throwed this exception; - throw new InternalError(ex.getMessage()); - } - } - } - if(target == null){ - target = getClass().getResourceAsStream("/resources/stigmata.xml"); - } - initConfiguration(target); - } - - private void initConfiguration(InputStream in){ - if(defaultEnvironment == null){ - defaultEnvironment = BirthmarkEnvironment.getDefaultEnvironment(); - } - try { - ConfigFileImporter parser = new ConfigFileImporter(defaultEnvironment); - parser.parse(in); - } catch(IOException e){ - throw new ApplicationInitializationError(e); - } - for(Iterator i = ServiceRegistry.lookupProviders(BirthmarkSpi.class); i.hasNext(); ){ - BirthmarkSpi service = i.next(); - defaultEnvironment.addService(service); - } - } -} diff --git a/src/main/java/jp/naist/se/stigmata/birthmarks/extractors/BirthmarkExtractorFactory.java b/src/main/java/jp/naist/se/stigmata/birthmarks/extractors/BirthmarkExtractorFactory.java new file mode 100755 index 0000000..5d9b8a8 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/birthmarks/extractors/BirthmarkExtractorFactory.java @@ -0,0 +1,74 @@ +package jp.naist.se.stigmata.birthmarks.extractors; + +/* + * $Id$ + */ + +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import jp.naist.se.stigmata.BirthmarkEnvironment; +import jp.naist.se.stigmata.BirthmarkExtractor; +import jp.naist.se.stigmata.ExtractorNotFoundException; +import jp.naist.se.stigmata.spi.BirthmarkSpi; + +import org.apache.commons.beanutils.BeanUtils; + +/** + * + * @author Haruaki Tamada + * @version $Revision$ $Date$ + */ +public class BirthmarkExtractorFactory{ + private BirthmarkEnvironment environment; + private Map extractors = new HashMap(); + + public BirthmarkExtractorFactory(BirthmarkEnvironment env){ + this.environment = env; + } + + public BirthmarkExtractor getExtractor(String name) throws ExtractorNotFoundException{ + BirthmarkExtractor extractor = extractors.get(name); + if(extractor == null){ + extractor = buildExtractor(name); + extractors.put(name, extractor); + } + return extractor; + } + + @SuppressWarnings("unchecked") + private BirthmarkExtractor buildExtractor(String birthmarkType) throws ExtractorNotFoundException{ + BirthmarkSpi spi = environment.getService(birthmarkType); + BirthmarkExtractor extractor = null; + if(spi != null){ + extractor = spi.getExtractor(); + try{ + if(extractor != null){ + Map props = BeanUtils.describe(extractor); + props.remove("class"); + props.remove("provider"); + for(Object keyObject: props.keySet()){ + String key = "extractor." + spi.getType() + "." + String.valueOf(keyObject); + if(environment.getProperty(key) != null){ + BeanUtils.setProperty( + extractor, (String)keyObject, environment.getProperty(key) + ); + } + } + } + } catch(InvocationTargetException e){ + throw new InternalError(e.getMessage()); + } catch(NoSuchMethodException e){ + throw new InternalError(e.getMessage()); + } catch(IllegalAccessException e){ + throw new InternalError(e.getMessage()); + } + } + if(extractor == null){ + throw new ExtractorNotFoundException("extractor not found: " + birthmarkType); + } + + return extractor; + } +} diff --git a/src/main/java/jp/naist/se/stigmata/filter/FilteredComparisonResultSet.java b/src/main/java/jp/naist/se/stigmata/filter/FilteredComparisonResultSet.java index 55c7a2f..22eb19a 100644 --- a/src/main/java/jp/naist/se/stigmata/filter/FilteredComparisonResultSet.java +++ b/src/main/java/jp/naist/se/stigmata/filter/FilteredComparisonResultSet.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import jp.naist.se.stigmata.BirthmarkContext; import jp.naist.se.stigmata.BirthmarkEnvironment; import jp.naist.se.stigmata.BirthmarkSet; import jp.naist.se.stigmata.ComparisonPair; @@ -53,8 +54,32 @@ public class FilteredComparisonResultSet implements ComparisonResultSet{ filters.remove(filter); } - public int getComparisonCount(){ - return resultset.getComparisonCount(); + public ComparisonPair getPairAt(int index){ + int currentIndex = 0; + for(Iterator i = iterator(); i.hasNext(); ){ + ComparisonPair pair = i.next(); + if(currentIndex == index){ + return pair; + } + currentIndex++; + } + return null; + } + + public ComparisonPair[] getPairs(){ + List list = new ArrayList(); + for(Iterator i = iterator(); i.hasNext(); ){ + list.add(i.next()); + } + return list.toArray(new ComparisonPair[list.size()]); + } + + public int getPairCount(){ + return resultset.getPairCount(); + } + + public BirthmarkContext getContext(){ + return resultset.getContext(); } public BirthmarkEnvironment getEnvironment(){ @@ -65,8 +90,16 @@ public class FilteredComparisonResultSet implements ComparisonResultSet{ return new FilteredIterator(resultset.iterator()); } - public BirthmarkSet[] getComparisonSources(){ - return resultset.getComparisonSources(); + public synchronized BirthmarkSet[] getPairSources(){ + List list = new ArrayList(); + for(Iterator i = pairSources(); i.hasNext(); ){ + list.add(i.next()); + } + return list.toArray(new BirthmarkSet[list.size()]); + } + + public Iterator pairSources(){ + return resultset.pairSources(); } private class FilteredIterator implements Iterator{ diff --git a/src/main/java/jp/naist/se/stigmata/format/AbstractBirthmarkExtractionResultFormat.java b/src/main/java/jp/naist/se/stigmata/format/AbstractBirthmarkExtractionResultFormat.java index 37eb7f3..e3cf95a 100644 --- a/src/main/java/jp/naist/se/stigmata/format/AbstractBirthmarkExtractionResultFormat.java +++ b/src/main/java/jp/naist/se/stigmata/format/AbstractBirthmarkExtractionResultFormat.java @@ -7,7 +7,7 @@ package jp.naist.se.stigmata.format; import java.io.PrintWriter; import java.io.StringWriter; -import jp.naist.se.stigmata.BirthmarkSet; +import jp.naist.se.stigmata.ExtractionResultSet; /** * @@ -17,13 +17,13 @@ import jp.naist.se.stigmata.BirthmarkSet; * @version $Revision$ $Date$ */ public abstract class AbstractBirthmarkExtractionResultFormat implements BirthmarkExtractionResultFormat{ - public abstract void printResult(PrintWriter out, BirthmarkSet[] holders); + public abstract void printResult(PrintWriter out, ExtractionResultSet ers); - public String getResult(BirthmarkSet[] holders){ + public String getResult(ExtractionResultSet ers){ StringWriter writer = new StringWriter(); PrintWriter out = new PrintWriter(writer); - printResult(out, holders); + printResult(out, ers); out.close(); return writer.toString(); diff --git a/src/main/java/jp/naist/se/stigmata/format/BirthmarkExtractionResultFormat.java b/src/main/java/jp/naist/se/stigmata/format/BirthmarkExtractionResultFormat.java index 8333192..0599eb7 100644 --- a/src/main/java/jp/naist/se/stigmata/format/BirthmarkExtractionResultFormat.java +++ b/src/main/java/jp/naist/se/stigmata/format/BirthmarkExtractionResultFormat.java @@ -6,7 +6,7 @@ package jp.naist.se.stigmata.format; import java.io.PrintWriter; -import jp.naist.se.stigmata.BirthmarkSet; +import jp.naist.se.stigmata.ExtractionResultSet; /** * @@ -16,7 +16,7 @@ import jp.naist.se.stigmata.BirthmarkSet; * @version $Revision$ $Date$ */ public interface BirthmarkExtractionResultFormat{ - public void printResult(PrintWriter out, BirthmarkSet[] holders); + public void printResult(PrintWriter out, ExtractionResultSet ers); - public String getResult(BirthmarkSet[] holders); + public String getResult(ExtractionResultSet ers); } diff --git a/src/main/java/jp/naist/se/stigmata/format/csv/BirthmarkComparisonResultCsvFormat.java b/src/main/java/jp/naist/se/stigmata/format/csv/BirthmarkComparisonResultCsvFormat.java index a133dc5..f9f5303 100644 --- a/src/main/java/jp/naist/se/stigmata/format/csv/BirthmarkComparisonResultCsvFormat.java +++ b/src/main/java/jp/naist/se/stigmata/format/csv/BirthmarkComparisonResultCsvFormat.java @@ -14,8 +14,8 @@ import java.util.Map; import jp.naist.se.stigmata.ComparisonPair; import jp.naist.se.stigmata.ComparisonPairElement; import jp.naist.se.stigmata.ComparisonResultSet; -import jp.naist.se.stigmata.CertainPairComparisonResultSet; import jp.naist.se.stigmata.format.AbstractBirthmarkComparisonResultFormat; +import jp.naist.se.stigmata.result.CertainPairComparisonResultSet; /** * @@ -33,8 +33,8 @@ public class BirthmarkComparisonResultCsvFormat extends AbstractBirthmarkCompari @Override public void printResult(PrintWriter out, ComparisonPair pair){ - list.printBirthmarkHolder(out, pair.getTarget1()); - list.printBirthmarkHolder(out, pair.getTarget2()); + list.printBirthmarkSet(out, pair.getTarget1()); + list.printBirthmarkSet(out, pair.getTarget2()); for(ComparisonPairElement element: pair){ out.print("compare,"); diff --git a/src/main/java/jp/naist/se/stigmata/format/csv/BirthmarkExtractionResultCsvFormat.java b/src/main/java/jp/naist/se/stigmata/format/csv/BirthmarkExtractionResultCsvFormat.java index 56064be..f5c3635 100644 --- a/src/main/java/jp/naist/se/stigmata/format/csv/BirthmarkExtractionResultCsvFormat.java +++ b/src/main/java/jp/naist/se/stigmata/format/csv/BirthmarkExtractionResultCsvFormat.java @@ -10,6 +10,8 @@ import java.util.Iterator; import jp.naist.se.stigmata.Birthmark; import jp.naist.se.stigmata.BirthmarkElement; import jp.naist.se.stigmata.BirthmarkSet; +import jp.naist.se.stigmata.ExtractionResultSet; +import jp.naist.se.stigmata.ExtractionTarget; import jp.naist.se.stigmata.format.AbstractBirthmarkExtractionResultFormat; /** @@ -20,14 +22,14 @@ import jp.naist.se.stigmata.format.AbstractBirthmarkExtractionResultFormat; * @version $Revision$ $Date$ */ public class BirthmarkExtractionResultCsvFormat extends AbstractBirthmarkExtractionResultFormat{ - public void printResult(PrintWriter out, BirthmarkSet[] holders){ - for(int i = 0; i < holders.length; i++){ - printBirthmarkHolder(out, holders[i]); + public void printResult(PrintWriter out, ExtractionResultSet ers){ + for(Iterator i = ers.birthmarkSets(ExtractionTarget.TARGET_BOTH); i.hasNext(); ){ + printBirthmarkSet(out, i.next()); } out.flush(); } - protected void printBirthmarkHolder(PrintWriter out, BirthmarkSet holder){ + protected void printBirthmarkSet(PrintWriter out, BirthmarkSet holder){ for(String type: holder.getBirthmarkTypes()){ out.print(holder.getName()); out.print(","); diff --git a/src/main/java/jp/naist/se/stigmata/format/xml/BirthmarkComparisonResultXmlFormat.java b/src/main/java/jp/naist/se/stigmata/format/xml/BirthmarkComparisonResultXmlFormat.java index fd845bc..e1139e0 100644 --- a/src/main/java/jp/naist/se/stigmata/format/xml/BirthmarkComparisonResultXmlFormat.java +++ b/src/main/java/jp/naist/se/stigmata/format/xml/BirthmarkComparisonResultXmlFormat.java @@ -38,6 +38,7 @@ public class BirthmarkComparisonResultXmlFormat extends AbstractBirthmarkCompari printComparisonPair(out, pair); out.println(" "); out.println(""); + out.flush(); } @Override @@ -50,6 +51,7 @@ public class BirthmarkComparisonResultXmlFormat extends AbstractBirthmarkCompari } out.println(" "); out.println(""); + out.flush(); } private void printComparisonPair(PrintWriter out, ComparisonPair pair){ diff --git a/src/main/java/jp/naist/se/stigmata/format/xml/BirthmarkExtractionListXmlFormat.java b/src/main/java/jp/naist/se/stigmata/format/xml/BirthmarkExtractionListXmlFormat.java index 806fe2c..1aa9443 100644 --- a/src/main/java/jp/naist/se/stigmata/format/xml/BirthmarkExtractionListXmlFormat.java +++ b/src/main/java/jp/naist/se/stigmata/format/xml/BirthmarkExtractionListXmlFormat.java @@ -10,6 +10,8 @@ import java.util.Iterator; import jp.naist.se.stigmata.Birthmark; import jp.naist.se.stigmata.BirthmarkElement; import jp.naist.se.stigmata.BirthmarkSet; +import jp.naist.se.stigmata.ExtractionResultSet; +import jp.naist.se.stigmata.ExtractionTarget; import jp.naist.se.stigmata.format.AbstractBirthmarkExtractionResultFormat; /** @@ -20,15 +22,16 @@ import jp.naist.se.stigmata.format.AbstractBirthmarkExtractionResultFormat; * @version $Revision$ $Date$ */ public class BirthmarkExtractionListXmlFormat extends AbstractBirthmarkExtractionResultFormat{ - public void printResult(PrintWriter out, BirthmarkSet[] holders){ + public void printResult(PrintWriter out, ExtractionResultSet ers){ out.println(""); out.println(""); out.println(" "); - for(int i = 0; i < holders.length; i++){ - printBirthmarkSet(out, holders[i]); + for(Iterator i = ers.birthmarkSets(ExtractionTarget.TARGET_BOTH); i.hasNext(); ){ + printBirthmarkSet(out, i.next()); } out.println(" "); out.println(""); + out.flush(); } protected void printBirthmarkSet(PrintWriter out, BirthmarkSet set){ diff --git a/src/main/java/jp/naist/se/stigmata/result/AbstractComparisonResultSet.java b/src/main/java/jp/naist/se/stigmata/result/AbstractComparisonResultSet.java new file mode 100755 index 0000000..b6ec010 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/result/AbstractComparisonResultSet.java @@ -0,0 +1,93 @@ +package jp.naist.se.stigmata.result; + +/* + * $Id$ + */ + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import jp.naist.se.stigmata.BirthmarkContext; +import jp.naist.se.stigmata.BirthmarkEnvironment; +import jp.naist.se.stigmata.BirthmarkSet; +import jp.naist.se.stigmata.ComparisonPair; +import jp.naist.se.stigmata.ComparisonResultSet; +import jp.naist.se.stigmata.ExtractionResultSet; + +/** + * Abstract class for ComparisonResultSet. + * + * @author Haruaki Tamada + * @version $Revision$ $Date$ + */ +public abstract class AbstractComparisonResultSet implements ComparisonResultSet{ + protected ExtractionResultSet extraction; + private int count = -1; + + public AbstractComparisonResultSet(ExtractionResultSet extraction){ + this.extraction = extraction; + } + + public abstract Iterator iterator(); + + public abstract Iterator pairSources(); + + public synchronized BirthmarkSet[] getPairSources(){ + return AbstractComparisonResultSet.getArrays(pairSources()); + } + + public int getPairCount(){ + if(count < 0){ + int calculateCount = 0; + for(Iterator i = iterator(); i.hasNext(); ){ + calculateCount++; + i.next(); + } + this.count = calculateCount; + } + return count; + } + + public synchronized ComparisonPair[] getPairs(){ + return AbstractComparisonResultSet.getArrays(iterator()); + } + + public ComparisonPair getPairAt(int index){ + int currentIndex = 0; + for(Iterator i = iterator(); i.hasNext(); ){ + ComparisonPair pair = i.next(); + if(currentIndex == index){ + return pair; + } + currentIndex++; + } + return null; + } + + public BirthmarkContext getContext(){ + return extraction.getContext(); + } + + public BirthmarkEnvironment getEnvironment(){ + return extraction.getEnvironment(); + } + + @SuppressWarnings("unchecked") + static synchronized T[] getArrays(Iterator i){ + List list = new ArrayList(); + Object o = null; + while(i.hasNext()){ + o = i.next(); + list.add(i.next()); + } + int size = 0; + if(o != null) size = list.size(); + T[] array = (T[])Array.newInstance(o.getClass(), size); + for(int index = 0; index < list.size(); index++){ + array[index] = (T)list.get(index); + } + return array; + } +} diff --git a/src/main/java/jp/naist/se/stigmata/result/AbstractExtractionResultSet.java b/src/main/java/jp/naist/se/stigmata/result/AbstractExtractionResultSet.java new file mode 100755 index 0000000..d424fc4 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/result/AbstractExtractionResultSet.java @@ -0,0 +1,130 @@ +package jp.naist.se.stigmata.result; + +/* + * $Id$ + */ + +import java.util.Iterator; + +import jp.naist.se.stigmata.BirthmarkContext; +import jp.naist.se.stigmata.BirthmarkEnvironment; +import jp.naist.se.stigmata.BirthmarkSet; +import jp.naist.se.stigmata.ExtractionResultSet; +import jp.naist.se.stigmata.ExtractionTarget; + +/** + * Abstract class for ExtractionResultSet. + * + * @author Haruaki Tamada + * @version $Revision$ $Date$ + */ +public abstract class AbstractExtractionResultSet implements ExtractionResultSet{ + private BirthmarkContext context; + private boolean tableType = true; + + /** + * constructor. + */ + public AbstractExtractionResultSet(BirthmarkContext context){ + this(context, true); + } + + /** + * constructor. + */ + public AbstractExtractionResultSet(BirthmarkContext context, boolean tableType){ + this.context = context; + } + + public BirthmarkEnvironment getEnvironment(){ + return context.getEnvironment(); + } + + public BirthmarkContext getContext(){ + return context; + } + + public abstract void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set); + + public abstract void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set); + + public abstract void removeAllBirthmarkSets(ExtractionTarget target); + + public abstract int getBirthmarkSetSize(ExtractionTarget target); + + public abstract Iterator birthmarkSets(ExtractionTarget target); + + public int getBirthmarkSetSize(){ + return getBirthmarkSetSize(ExtractionTarget.TARGET_BOTH); + } + + public Iterator iterator(){ + return birthmarkSets(ExtractionTarget.TARGET_BOTH); + } + + public BirthmarkSet getBirthmarkSet(int index){ + return getBirthmarkSet(ExtractionTarget.TARGET_BOTH, index); + } + + public BirthmarkSet getBirthmarkSet(String name){ + return getBirthmarkSet(ExtractionTarget.TARGET_BOTH, name); + } + + public BirthmarkSet[] getBirthmarkSets(){ + return getBirthmarkSets(ExtractionTarget.TARGET_BOTH); + } + + public void removeBirthmarkSet(BirthmarkSet bs){ + removeBirthmarkSet(ExtractionTarget.TARGET_BOTH, bs); + } + + public void removeAllBirthmarkSets(){ + removeAllBirthmarkSets(ExtractionTarget.TARGET_BOTH); + } + + public String[] getBirthmarkTypes(){ + return context.getExtractionTypes(); + } + + public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index){ + int currentIndex = 0; + for(Iterator i = birthmarkSets(target); i.hasNext(); ){ + if(currentIndex == index){ + return i.next(); + } + i.next(); + currentIndex++; + } + return null; + } + + public BirthmarkSet getBirthmarkSet(ExtractionTarget target, String setname){ + for(Iterator i = birthmarkSets(target); i.hasNext(); ){ + BirthmarkSet bs = i.next(); + if(bs.getName().equals(setname)){ + return bs; + } + } + return null; + } + + public synchronized BirthmarkSet[] getBirthmarkSets(ExtractionTarget target){ + return AbstractComparisonResultSet.getArrays(birthmarkSets(target)); + } + + public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets){ + removeAllBirthmarkSets(target); + for(int i = 0; i < sets.length; i++){ + addBirthmarkSet(target, sets[i]); + } + } + + public boolean isTableType(){ + return tableType; + } + + public void setTableType(boolean flag){ + this.tableType = flag; + } + +} diff --git a/src/main/java/jp/naist/se/stigmata/result/CertainPairComparisonResultSet.java b/src/main/java/jp/naist/se/stigmata/result/CertainPairComparisonResultSet.java new file mode 100644 index 0000000..e0dc2c1 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/result/CertainPairComparisonResultSet.java @@ -0,0 +1,250 @@ +package jp.naist.se.stigmata.result; + +/* + * $Id$ + */ + +import java.net.URL; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import jp.naist.se.stigmata.BirthmarkContext; +import jp.naist.se.stigmata.BirthmarkSet; +import jp.naist.se.stigmata.ComparisonPair; +import jp.naist.se.stigmata.ExtractionResultSet; +import jp.naist.se.stigmata.ExtractionTarget; + +/** + * Concrete class for ComparisonResultSet. This instance compare class files by + * certain pair. The pair is guessed by system with class name, or specified by + * user. + * + * @author Haruaki TAMADA + * @version $Revision$ $Date$ + */ +public class CertainPairComparisonResultSet extends AbstractComparisonResultSet{ + private int compareCount = -1; + private Collection sources = null; + + public CertainPairComparisonResultSet(ExtractionResultSet extraction){ + super(extraction); + } + + public CertainPairComparisonResultSet(ExtractionResultSet extraction, Map nameMap){ + super(extraction); + BirthmarkContext context = extraction.getContext(); + for(Map.Entry entry: nameMap.entrySet()){ + context.addNameMapping(entry.getKey(), entry.getValue()); + } + } + + /** + * This constructor is the comparison pair list is specified. + */ + public CertainPairComparisonResultSet(ComparisonPair[] pairs, BirthmarkContext context){ + super(createExtractionResultSet(pairs, context)); + } + + /** + * This constructor is the comparison pair was guessed with class name. + */ + public CertainPairComparisonResultSet(BirthmarkSet[] targetX, + BirthmarkSet[] targetY, BirthmarkContext context){ + super(createExtractionResultSet(targetX, targetY, context)); + } + + /** + * This constructor is the comparison pair was specified as mapping. + */ + public CertainPairComparisonResultSet(BirthmarkSet[] targetX, BirthmarkSet[] targetY, + Map mapping, BirthmarkContext context){ + super(createExtractionResultSet(targetX, targetY, context)); + + for(Map.Entry entry : mapping.entrySet()){ + context.addNameMapping(entry.getKey(), entry.getValue()); + } + } + + /** + * return comparison count. + */ + @Override + public int getPairCount(){ + BirthmarkContext context = getContext(); + if(compareCount < 0){ + int count = 0; + if(context.hasNameMapping()){ + count = context.getNameMappingCount(); + } + else{ + count = super.getPairCount(); + } + compareCount = count; + } + return compareCount; + } + + /** + * return the iterator of each pair. + */ + @Override + public Iterator iterator(){ + Iterator iterator = null; + final BirthmarkContext context = getContext(); + if(context.hasNameMapping()){ + iterator = new NameMappingIterator(extraction); + } + else{ + iterator = new NameFindIterator(extraction); + } + return iterator; + } + + @Override + public Iterator pairSources(){ + if(sources == null){ + sources = createSources(); + } + return sources.iterator(); + } + + public BirthmarkSet[] getPairSources(){ + if(sources == null){ + sources = createSources(); + } + return sources.toArray(new BirthmarkSet[sources.size()]); + } + + private Collection createSources(){ + Map map = new HashMap(); + for(Iterator i = iterator(); i.hasNext(); ){ + ComparisonPair pair = i.next(); + addToMap(map, pair.getTarget1()); + addToMap(map, pair.getTarget2()); + } + return map.values(); + } + + private void addToMap(Map map, BirthmarkSet set){ + map.put(set.getLocation(), set); + } + + private static ExtractionResultSet createExtractionResultSet(ComparisonPair[] pairs, BirthmarkContext context){ + ExtractionResultSet ers = new MemoryExtractionResultSet(context, false); + for(int i = 0; i < pairs.length; i++){ + ers.addBirthmarkSet(ExtractionTarget.TARGET_X, pairs[i].getTarget1()); + ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, pairs[i].getTarget2()); + } + return ers; + } + + private static ExtractionResultSet createExtractionResultSet(BirthmarkSet[] targetX, BirthmarkSet[] targetY, BirthmarkContext context){ + ExtractionResultSet ers = new MemoryExtractionResultSet(context, true); + ers.setBirthmarkSets(ExtractionTarget.TARGET_X, targetX); + ers.setBirthmarkSets(ExtractionTarget.TARGET_Y, targetY); + return ers; + } + + private static class NameFindIterator implements Iterator{ + private ComparisonPair next; + private BirthmarkSet setX = null; + private Iterator iteratorX; + private Iterator iteratorY; + private ExtractionResultSet extraction; + + public NameFindIterator(ExtractionResultSet extraction){ + this.extraction = extraction; + iteratorX = extraction.birthmarkSets(ExtractionTarget.TARGET_X); + setX = iteratorX.next(); + next = findNext(); + } + + public boolean hasNext(){ + return next != null; + } + + public ComparisonPair next(){ + ComparisonPair returnValue = next; + next = findNext(); + return returnValue; + } + + public void remove(){ + } + + private ComparisonPair findNext(){ + ComparisonPair next = null; + if(iteratorY == null || !iteratorY.hasNext()){ + iteratorY = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); + } + + if(setX != null){ + for(; iteratorY.hasNext(); ){ + BirthmarkSet setY = iteratorY.next(); + if(setX.getName().equals(setY.getName())){ + next = new ComparisonPair(setX, setY, extraction.getContext()); + break; + } + } + + if(iteratorX.hasNext()){ + setX = iteratorX.next(); + } + else{ + setX = null; + } + if(next == null){ + next = findNext(); + } + } + return next; + } + }; + + private static class NameMappingIterator implements Iterator{ + private Iterator> names; + private ComparisonPair nextPair; + private ExtractionResultSet ers; + + public NameMappingIterator(ExtractionResultSet ers){ + this.ers = ers; + names = ers.getContext().nameMappingEntries(); + nextPair = findNextPair(); + } + + public ComparisonPair next(){ + ComparisonPair cp = nextPair; + nextPair = findNextPair(); + return cp; + } + + public boolean hasNext(){ + return nextPair != null; + } + + public void remove(){ + } + + private ComparisonPair findNextPair(){ + ComparisonPair pair = null; + if(names.hasNext()){ + Map.Entry entry = names.next(); + String n1 = entry.getKey(); + String n2 = entry.getValue(); + + BirthmarkSet bs1 = ers.getBirthmarkSet(ExtractionTarget.TARGET_X, n1); + BirthmarkSet bs2 = ers.getBirthmarkSet(ExtractionTarget.TARGET_Y, n2); + + if(bs1 == null || bs2 == null){ + pair = findNextPair(); + } + else{ + pair = new ComparisonPair(bs1, bs2, ers.getContext()); + } + } + return pair; + } + }; +} diff --git a/src/main/java/jp/naist/se/stigmata/result/ExtractionResultSetFactory.java b/src/main/java/jp/naist/se/stigmata/result/ExtractionResultSetFactory.java new file mode 100755 index 0000000..654a82b --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/result/ExtractionResultSetFactory.java @@ -0,0 +1,42 @@ +package jp.naist.se.stigmata.result; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import jp.naist.se.stigmata.BirthmarkContext; +import jp.naist.se.stigmata.BirthmarkStoreTarget; +import jp.naist.se.stigmata.ExtractionResultSet; + +public class ExtractionResultSetFactory{ + private static ExtractionResultSetFactory instance = new ExtractionResultSetFactory(); + private Map> map = new HashMap>(); + + private ExtractionResultSetFactory(){ + map.put(BirthmarkStoreTarget.MEMORY.name(), MemoryExtractionResultSet.class); + } + + public static ExtractionResultSetFactory getInstance(){ + return instance; + } + + public ExtractionResultSet createResultSet(BirthmarkContext context){ + return createResultSet(context.getStoreTarget(), context); + } + + public ExtractionResultSet createResultSet(BirthmarkStoreTarget store, BirthmarkContext context){ + try{ + Class clazz = map.get(store.name()); + Constructor constructor = clazz.getConstructor(BirthmarkContext.class); + return constructor.newInstance(context); + + }catch(NoSuchMethodException e){ + }catch(IllegalArgumentException e){ + }catch(InstantiationException e){ + }catch(IllegalAccessException e){ + }catch(InvocationTargetException e){ + } + return null; + } +} diff --git a/src/main/java/jp/naist/se/stigmata/result/MemoryExtractionResult.java b/src/main/java/jp/naist/se/stigmata/result/MemoryExtractionResult.java deleted file mode 100755 index 1e0d2fb..0000000 --- a/src/main/java/jp/naist/se/stigmata/result/MemoryExtractionResult.java +++ /dev/null @@ -1,62 +0,0 @@ -package jp.naist.se.stigmata; - -/* - * $Id$ - */ - -import jp.naist.se.stigmata.BirthmarkContext.ExtractionTarget; - -/** - * - * @author Haruaki Tamada - * @version $Revision$ $Date$ - */ -public class ExtractionResult{ - private BirthmarkSet[] targetX; - private BirthmarkSet[] targetY; - private ExtractionTarget target = ExtractionTarget.TARGET_X; - - public BirthmarkSet[] getBirthmarkSetXY(){ - if(target != ExtractionTarget.TARGET_XY){ - throw new IllegalStateException("extraction mode is not XY"); - } - return targetX; - } - - public void setBirthmarkSetXY(BirthmarkSet[] targetXY){ - target = ExtractionTarget.TARGET_XY; - this.targetX = targetXY; - } - - public BirthmarkSet[] getBirthmarkSetX(){ - if(target == ExtractionTarget.TARGET_XY){ - throw new IllegalStateException("extraction mode is XY"); - } - return targetX; - } - - public void setBirthmarkSetX(BirthmarkSet[] targetX){ - target = ExtractionTarget.TARGET_X; - this.targetX = targetX; - } - - public BirthmarkSet[] getBirthmarkSetY(){ - if(target == ExtractionTarget.TARGET_XY){ - throw new IllegalStateException("extraction mode is XY"); - } - return targetY; - } - - public void setBirthmarkSetY(BirthmarkSet[] targetY){ - target = ExtractionTarget.TARGET_Y; - this.targetY = targetY; - } - - public ExtractionTarget getExtractionTarget(){ - return target; - } - - public void setExtractionTarget(ExtractionTarget target){ - this.target = target; - } -} diff --git a/src/main/java/jp/naist/se/stigmata/result/MemoryExtractionResultSet.java b/src/main/java/jp/naist/se/stigmata/result/MemoryExtractionResultSet.java new file mode 100755 index 0000000..7eb745c --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/result/MemoryExtractionResultSet.java @@ -0,0 +1,158 @@ +package jp.naist.se.stigmata.result; + +/* + * $Id$ + */ + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import jp.naist.se.stigmata.BirthmarkContext; +import jp.naist.se.stigmata.BirthmarkSet; +import jp.naist.se.stigmata.ExtractionTarget; +import jp.naist.se.stigmata.utils.MultipleIterator; + +/** + * + * @author Haruaki Tamada + * @version $Revision$ $Date$ + */ +public class MemoryExtractionResultSet extends AbstractExtractionResultSet{ + private List targetX = new ArrayList(); + private List targetY = new ArrayList(); + + public MemoryExtractionResultSet(BirthmarkContext context){ + this(context, true); + } + + public MemoryExtractionResultSet(BirthmarkContext context, boolean tableType){ + super(context, tableType); + } + + public void removeAllBirthmarkSets(ExtractionTarget target){ + switch(target){ + case TARGET_X: + case TARGET_XY: + targetX.clear(); + break; + case TARGET_Y: + targetY.clear(); + break; + case TARGET_BOTH: + default: + throw new IllegalArgumentException("unknown target: " + target); + } + } + + public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){ + switch(target){ + case TARGET_X: + case TARGET_XY: + targetX.remove(set); + break; + case TARGET_Y: + targetY.remove(set); + break; + case TARGET_BOTH: + default: + throw new IllegalArgumentException("unknown target: " + target); + } + } + + public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set){ + switch(target){ + case TARGET_X: + case TARGET_XY: + targetX.add(set); + break; + case TARGET_Y: + targetY.add(set); + break; + case TARGET_BOTH: + default: + throw new IllegalArgumentException("unknown target: " + target); + } + } + + public Iterator birthmarkSets(ExtractionTarget target){ + Iterator iterator; + switch(target){ + case TARGET_X: + case TARGET_XY: + iterator = targetX.iterator(); + break; + case TARGET_Y: + iterator = targetY.iterator(); + break; + case TARGET_BOTH: + default: + MultipleIterator i = new MultipleIterator(); + i.add(targetX.iterator()); + i.add(targetY.iterator()); + iterator = i; + break; + } + return iterator; + } + public int getBirthmarkSetSize(ExtractionTarget target){ + int count = 0; + switch(target){ + case TARGET_X: + case TARGET_XY: + count = targetX.size(); + break; + case TARGET_Y: + count = targetY.size(); + break; + case TARGET_BOTH: + default: + count = targetX.size() + targetY.size(); + break; + } + return count; + } + + public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index){ + BirthmarkSet set; + switch(target){ + case TARGET_X: + set = targetX.get(index); + break; + case TARGET_Y: + set = targetY.get(index); + break; + case TARGET_XY: + case TARGET_BOTH: + default: + if(index < targetX.size()){ + set = targetX.get(index); + } + else{ + set = targetY.get(index - targetX.size()); + } + break; + } + return set; + } + + public BirthmarkSet[] getBirthmarkSets(ExtractionTarget target){ + BirthmarkSet[] sets; + switch(target){ + case TARGET_X: + case TARGET_XY: + sets = targetX.toArray(new BirthmarkSet[targetX.size()]); + break; + case TARGET_Y: + sets = targetY.toArray(new BirthmarkSet[targetX.size()]); + break; + case TARGET_BOTH: + default: + sets = new BirthmarkSet[targetX.size() + targetY.size()]; + System.arraycopy(targetX.toArray(new BirthmarkSet[targetX.size()]), 0, sets, 0, targetX.size()); + System.arraycopy(targetY.toArray(new BirthmarkSet[targetY.size()]), 0, sets, targetX.size(), targetY.size()); + break; + } + return sets; + } +} diff --git a/src/main/java/jp/naist/se/stigmata/result/RoundRobinComparisonResultSet.java b/src/main/java/jp/naist/se/stigmata/result/RoundRobinComparisonResultSet.java new file mode 100644 index 0000000..bd9c633 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/result/RoundRobinComparisonResultSet.java @@ -0,0 +1,222 @@ +package jp.naist.se.stigmata.result; + +/* + * $Id$ + */ + +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import jp.naist.se.stigmata.BirthmarkContext; +import jp.naist.se.stigmata.BirthmarkEnvironment; +import jp.naist.se.stigmata.BirthmarkSet; +import jp.naist.se.stigmata.ComparisonPair; +import jp.naist.se.stigmata.ExtractionResultSet; +import jp.naist.se.stigmata.ExtractionTarget; + +/** + * Concrete class for ComparisonResultSet. This instance compare class files by round robin. + * + * @author Haruaki TAMADA + * @version $Revision$ $Date$ + */ +public class RoundRobinComparisonResultSet extends AbstractComparisonResultSet{ + private int compareCount = -1; + private boolean tableType; + private boolean samePair = false; + + /** + * constructor. if user gives { a, b, c, } as holders1, then + * the instance (created by this constructor) compares { a<->b, a<->c, + * b<->c, }. + */ + public RoundRobinComparisonResultSet(ExtractionResultSet resultset){ + this(resultset, false); + } + + /** + * constructor. if user gives { a, b, c, } as holders1, then the + * instance (created by this constructor when samePair is true) + * compares { a<->a, b<->a, b<->b, c<->a, c<->b, c<->c, }. + * Otherwise, the instance compares { a<->b, a<->c, b<->c, } when + * samePair is false. + */ + public RoundRobinComparisonResultSet(ExtractionResultSet resultset, boolean samePair){ + super(resultset); + this.tableType = resultset.isTableType(); + setCompareSamePair(samePair); + } + + /** + * @return environment + */ + public BirthmarkEnvironment getEnvironment(){ + return extraction.getEnvironment(); + } + + public BirthmarkContext getContext(){ + return extraction.getContext(); + } + + /** + * update same pair comparing flag unless two birthmark array is setted. + */ + public void setCompareSamePair(boolean flag){ + samePair = flag; + if(!extraction.isTableType()){ + int size = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_XY); + if(flag){ + if(size > 1) compareCount = (size - 1) * (size - 2) + 1; + else if(size == 1) compareCount = 0; + else throw new IllegalStateException("no extraction result"); + } + else{ + if(size > 1) compareCount = (size - 1) * (size - 2) + 1 + size; + else if(size == 1) compareCount = 1; + else throw new IllegalStateException("no extraction result"); + } + } + else if(compareCount == -1){ + compareCount = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X) + * extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_Y); + } + } + + public boolean isCompareSamePair(){ + return samePair; + } + + /** + * returns the compare count of birthmark sets. + */ + public int getPairCount(){ + return compareCount; + } + + /** + * return a iterator of whole comparison. + */ + public Iterator iterator(){ + if(tableType){ + return new CompareTableIterator(); + } + else{ + return new CompareTriangleIterator(); + } + } + + public BirthmarkSet[] getPairSources(){ + List list = new ArrayList(); + for(Iterator i = pairSources(); i.hasNext(); ){ + list.add(i.next()); + } + + return list.toArray(new BirthmarkSet[list.size()]); + } + + public Iterator pairSources(){ + Map map = new HashMap(); + if(extraction.isTableType()){ + for(Iterator i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){ + BirthmarkSet bs = i.next(); + map.put(bs.getLocation(), bs); + } + for(Iterator i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){ + BirthmarkSet bs = i.next(); + map.put(bs.getLocation(), bs); + } + } + else{ + for(Iterator i = extraction.birthmarkSets(ExtractionTarget.TARGET_XY); i.hasNext(); ){ + BirthmarkSet bs = i.next(); + map.put(bs.getLocation(), bs); + } + } + return map.values().iterator(); + } + + private class CompareTableIterator implements Iterator{ + private Iterator ix = extraction.birthmarkSets(ExtractionTarget.TARGET_X); + private Iterator iy = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); + private BirthmarkSet x = ix.next(); + + public boolean hasNext(){ + return ix.hasNext() || iy.hasNext(); + } + + public ComparisonPair next(){ + if(!iy.hasNext()){ + iy = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); + x = ix.next(); + } + BirthmarkSet y = iy.next(); + + return new ComparisonPair(x, y, extraction.getContext()); + } + + public void remove(){ + } + } + + /** + * iterator class. + */ + private class CompareTriangleIterator implements Iterator{ + private List names = new ArrayList(); + private Iterator iterator; + private int index = 0; + private BirthmarkSet bs; + private ComparisonPair next; + + public CompareTriangleIterator(){ + iterator = extraction.birthmarkSets(ExtractionTarget.TARGET_XY); + next = findNext(); + } + public boolean hasNext(){ + return next != null; + } + + public ComparisonPair next(){ + ComparisonPair returnValue = next; + next = findNext(); + return returnValue; + } + + private ComparisonPair findNext(){ + if(bs == null && iterator.hasNext()){ + bs = iterator.next(); + names.add(bs.getName()); + } + if((isCompareSamePair() && index == names.size()) || (!isCompareSamePair() && index == (names.size() - 1))){ + index = 0; + if(iterator.hasNext()){ + bs = iterator.next(); + names.add(bs.getName()); + } + else{ + return null; + } + } + String name = names.get(index); + BirthmarkSet bsX = extraction.getBirthmarkSet(ExtractionTarget.TARGET_XY, name); + ComparisonPair pair = null; + if(bsX != null){ + pair = new ComparisonPair(bsX, bs, extraction.getContext()); + } + index++; + + if(pair == null){ + pair = findNext(); + } + + return pair; + } + + public void remove(){ + } + } +} diff --git a/src/main/java/jp/naist/se/stigmata/result/SingleExtractionResultSet.java b/src/main/java/jp/naist/se/stigmata/result/SingleExtractionResultSet.java new file mode 100755 index 0000000..20547ff --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/result/SingleExtractionResultSet.java @@ -0,0 +1,97 @@ +package jp.naist.se.stigmata.result; + +/* + * $Id$ + */ + +import java.util.Iterator; +import java.util.NoSuchElementException; + +import jp.naist.se.stigmata.BirthmarkContext; +import jp.naist.se.stigmata.BirthmarkSet; +import jp.naist.se.stigmata.ExtractionTarget; +import jp.naist.se.stigmata.utils.NullIterator; + +/** + * + * @author Haruaki Tamada + * @version $Revision$ $Date$ + */ +public class SingleExtractionResultSet extends AbstractExtractionResultSet{ + private BirthmarkSet bs; + + public SingleExtractionResultSet(BirthmarkContext context, BirthmarkSet bs){ + super(context, false); + this.bs = bs; + } + + public SingleExtractionResultSet(BirthmarkContext context){ + super(context, false); + } + + public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set){ + this.bs = set; + } + + public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets){ + this.bs = sets[0]; + } + + public Iterator birthmarkSets(ExtractionTarget target){ + if(bs != null){ + return new SingleIterator(bs); + } + return new NullIterator(); + } + + public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){ + bs = null; + } + + public void removeAllBirthmarkSets(ExtractionTarget target){ + bs = null; + } + + public BirthmarkSet getBirthmarkSet(ExtractionTarget target, int index){ + if(index != 0){ + throw new IndexOutOfBoundsException("illegal index: " + index); + } + return bs; + } + + public BirthmarkSet getBirthmarkSet(ExtractionTarget target, String name){ + if(bs.getName().equals(name)){ + return bs; + } + return null; + } + + public int getBirthmarkSetSize(ExtractionTarget target){ + return 1; + } + + private static class SingleIterator implements Iterator{ + private boolean first = true; + private BirthmarkSet bs; + + public SingleIterator(BirthmarkSet bs){ + this.bs = bs; + } + + public BirthmarkSet next(){ + if(first){ + return bs; + } + throw new NoSuchElementException(); + } + + public boolean hasNext(){ + boolean flag = first; + first = false; + return flag; + } + + public void remove(){ + } + } +} diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkExtractionResultPane.java b/src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkExtractionResultPane.java index 379109e..5201315 100644 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkExtractionResultPane.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkExtractionResultPane.java @@ -6,8 +6,6 @@ package jp.naist.se.stigmata.ui.swing; import java.awt.BorderLayout; import java.io.PrintWriter; -import java.util.Arrays; -import java.util.List; import javax.swing.Box; import javax.swing.JButton; @@ -15,8 +13,8 @@ import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; -import jp.naist.se.stigmata.BirthmarkEnvironment; -import jp.naist.se.stigmata.BirthmarkSet; +import jp.naist.se.stigmata.ExtractionResultSet; +import jp.naist.se.stigmata.ExtractionTarget; import jp.naist.se.stigmata.format.BirthmarkExtractionResultFormat; import jp.naist.se.stigmata.format.FormatManager; import jp.naist.se.stigmata.spi.ResultFormatSpi; @@ -30,12 +28,12 @@ import jp.naist.se.stigmata.utils.AsciiDataWritable; public class BirthmarkExtractionResultPane extends JPanel{ private static final long serialVersionUID = 239084365756236543L; - private List birthmarks; private StigmataFrame frame; + private ExtractionResultSet extraction; - public BirthmarkExtractionResultPane(StigmataFrame stigmataFrame, BirthmarkEnvironment environment, BirthmarkSet[] sets){ + public BirthmarkExtractionResultPane(StigmataFrame stigmataFrame, ExtractionResultSet ers){ this.frame = stigmataFrame; - this.birthmarks = Arrays.asList(sets); + this.extraction = ers; JComponent southPanel = Box.createHorizontalBox(); JButton saveButton = Utility.createButton("savebirthmark", new SaveAction(frame, new AsciiDataWritable(){ @@ -46,12 +44,12 @@ public class BirthmarkExtractionResultPane extends JPanel{ } BirthmarkExtractionResultFormat list = service.getExtractionResultFormat(); - list.printResult(new PrintWriter(out), birthmarks.toArray(new BirthmarkSet[birthmarks.size()])); + list.printResult(new PrintWriter(out), extraction); } })); JScrollPane scroll = new JScrollPane(); - scroll.setViewportView(new BirthmarkTree(birthmarks.toArray(new BirthmarkSet[birthmarks.size()]))); + scroll.setViewportView(new BirthmarkTree(ers.getBirthmarkSets(ExtractionTarget.TARGET_BOTH))); setLayout(new BorderLayout()); add(scroll, BorderLayout.CENTER); diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/ClasspathSettingsPane.java b/src/main/java/jp/naist/se/stigmata/ui/swing/ClasspathSettingsPane.java index aa238e1..b1c8e7d 100644 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/ClasspathSettingsPane.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/ClasspathSettingsPane.java @@ -25,6 +25,7 @@ import javax.swing.border.TitledBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import jp.naist.se.stigmata.Stigmata; import jp.naist.se.stigmata.reader.ClasspathContext; /** @@ -89,7 +90,7 @@ public class ClasspathSettingsPane extends JPanel{ private boolean findClass(String className){ try{ - ClasspathContext b = stigmata.getStigmata().createEnvironment().getClasspathContext(); + ClasspathContext b = Stigmata.getInstance().createEnvironment().getClasspathContext(); ClasspathContext bytecode = new ClasspathContext(b); String[] path = classpath.getValues(); for(String cp: path){ diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java b/src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java index ad8a405..d7697d2 100644 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java @@ -27,8 +27,11 @@ import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.border.TitledBorder; +import jp.naist.se.stigmata.BirthmarkContext; import jp.naist.se.stigmata.BirthmarkEnvironment; +import jp.naist.se.stigmata.ComparisonMethod; import jp.naist.se.stigmata.ExtractionUnit; +import jp.naist.se.stigmata.Stigmata; import jp.naist.se.stigmata.filter.ComparisonPairFilterManager; import jp.naist.se.stigmata.reader.ClasspathContext; import jp.naist.se.stigmata.utils.ConfigFileExporter; @@ -222,7 +225,8 @@ public class ControlPane extends JPanel{ } private void extractButtonActionPerformed(ActionEvent e){ - BirthmarkEnvironment environment = generateEnvironment(); + BirthmarkContext context = generateContext(); + String[] fileX = targetX.getValues(); String[] fileY = targetY.getValues(); Set targets = new HashSet(); @@ -237,16 +241,14 @@ public class ControlPane extends JPanel{ } } - stigmata.extract( - birthmarks.getSelectedServiceTypes(), - targets.toArray(new String[targets.size()]), environment - ); + stigmata.extract(targets.toArray(new String[targets.size()]), context); } private void compareRoundRobinWithFiltering(){ - BirthmarkEnvironment environment = generateEnvironment(); + BirthmarkContext context = generateContext(); + context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY); FilterSelectionPane pane = new FilterSelectionPane( - environment.getFilterManager() + context.getEnvironment().getFilterManager() ); int returnValue = JOptionPane.showConfirmDialog( stigmata, pane, Messages.getString("filterselection.dialog.title"), @@ -255,49 +257,55 @@ public class ControlPane extends JPanel{ ); if(returnValue == JOptionPane.OK_OPTION){ String[] filterSetList = pane.getSelectedFilters(); + context.setFilterTypes(filterSetList); - stigmata.compareRoundRobin( - birthmarks.getSelectedServiceTypes(), targetX.getValues(), - targetY.getValues(), filterSetList, environment - ); + String[] fileX = targetX.getValues(); + String[] fileY = targetY.getValues(); + stigmata.compareRoundRobinFilter(fileX, fileY, context); } } private void compareRoundRobin(){ - BirthmarkEnvironment environment = generateEnvironment(); + BirthmarkContext context = generateContext(); + context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_XY); + String[] fileX = targetX.getValues(); + String[] fileY = targetY.getValues(); - stigmata.compareRoundRobin( - birthmarks.getSelectedServiceTypes(), targetX.getValues(), - targetY.getValues(), environment - ); + stigmata.compareRoundRobin(fileX, fileY, context); } private void compareSpecifiedPair(){ - BirthmarkEnvironment environment = generateEnvironment(); + BirthmarkContext context = generateContext(); + context.setComparisonMethod(ComparisonMethod.SPECIFIED_PAIR); String[] fileX = targetX.getValues(); String[] fileY = targetY.getValues(); - stigmata.compareSpecifiedPair( - birthmarks.getSelectedServiceTypes(), fileX, fileY, environment - ); + stigmata.compareSpecifiedPair(fileX, fileY, context); } private void compareGuessedPair(){ - BirthmarkEnvironment environment = generateEnvironment(); + BirthmarkContext context = generateContext(); + context.setComparisonMethod(ComparisonMethod.GUESSED_PAIR); String[] fileX = targetX.getValues(); String[] fileY = targetY.getValues(); - stigmata.compareGuessedPair( - birthmarks.getSelectedServiceTypes(), fileX, fileY, environment - ); + stigmata.compareGuessedPair(fileX, fileY, context); + } + + private BirthmarkContext generateContext(){ + BirthmarkContext context = new BirthmarkContext(generateEnvironment()); + context.setExtractionTypes(birthmarks.getSelectedServiceTypes()); + context.setExtractionUnit(parseExtractionUnit()); + + return context; } private BirthmarkEnvironment generateEnvironment(){ - BirthmarkEnvironment environment = stigmata.getStigmata().createEnvironment(); + BirthmarkEnvironment environment = Stigmata.getInstance().createEnvironment(); ClasspathContext bytecode = environment.getClasspathContext(); WellknownClassManager manager = environment.getWellknownClassManager(); ComparisonPairFilterManager filterManager = environment.getFilterManager(); - environment.setExtractionUnit(parseExtractionUnit()); + // environment.setExtractionUnit(parseExtractionUnit()); classpath.updateClasspathContext(bytecode); wellknownClassses.setWellknownClasses(manager); filters.updateFilterManager(filterManager); diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/PairComparisonResultSetPane.java b/src/main/java/jp/naist/se/stigmata/ui/swing/PairComparisonResultSetPane.java index ed29c08..4a4302c 100644 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/PairComparisonResultSetPane.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/PairComparisonResultSetPane.java @@ -14,6 +14,7 @@ import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import javax.swing.Box; @@ -27,12 +28,12 @@ import javax.swing.JTable; import javax.swing.border.TitledBorder; import javax.swing.table.DefaultTableModel; -import jp.naist.se.stigmata.BirthmarkEnvironment; +import jp.naist.se.stigmata.BirthmarkContext; import jp.naist.se.stigmata.BirthmarkSet; -import jp.naist.se.stigmata.CertainPairComparisonResultSet; import jp.naist.se.stigmata.ComparisonPair; import jp.naist.se.stigmata.ComparisonResultSet; import jp.naist.se.stigmata.format.FormatManager; +import jp.naist.se.stigmata.result.CertainPairComparisonResultSet; import jp.naist.se.stigmata.spi.ResultFormatSpi; import jp.naist.se.stigmata.ui.swing.actions.SaveAction; import jp.naist.se.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction; @@ -48,33 +49,32 @@ public class PairComparisonResultSetPane extends JPanel{ private static final long serialVersionUID = 3298346465652354302L; private StigmataFrame frame; - private BirthmarkEnvironment environment; + private ComparisonResultSet comparison; private DefaultTableModel model = new PairComparisonResultSetTableModel(); private JTable table = new JTable(model); private JLabel averageLabel, maximumLabel, minimumLabel; - private List list = new ArrayList(); private double average, maximum, minimum; public PairComparisonResultSetPane(StigmataFrame frame, ComparisonResultSet resultset){ this.frame = frame; - this.environment = resultset.getEnvironment(); - - for(ComparisonPair pair: resultset){ - list.add(pair); - } + this.comparison = resultset; initComponent(); - initData(model, list); + initData(model, resultset); } private void obfuscateClassNames(){ ClassNameObfuscator obfuscator = new ClassNameObfuscator(); List newList = new ArrayList(); - for(ComparisonPair pair: list){ + BirthmarkContext context = comparison.getContext(); + + for(Iterator i = comparison.iterator(); i.hasNext(); ){ + ComparisonPair pair = i.next(); BirthmarkSet set1 = obfuscator.obfuscateClassName(pair.getTarget1()); BirthmarkSet set2 = obfuscator.obfuscateClassName(pair.getTarget2()); - newList.add(new ComparisonPair(set1, set2, environment)); + context = comparison.getContext(); + newList.add(new ComparisonPair(set1, set2, context)); } try{ @@ -93,19 +93,19 @@ public class PairComparisonResultSetPane extends JPanel{ } DefaultTableModel newModel = new PairComparisonResultSetTableModel(); - initData(newModel, newList); - list = newList; + initData(newModel, new CertainPairComparisonResultSet(newList.toArray(new ComparisonPair[newList.size()]), context)); model = newModel; table.setModel(newModel); } - private void initData(DefaultTableModel model, List list){ + private void initData(DefaultTableModel model, ComparisonResultSet comparison){ maximum = 0d; minimum = 1d; average = 0d; model.setColumnIdentifiers(Messages.getStringArray("comparepair.table.columns")); - for(ComparisonPair pair: list){ + for(Iterator i = comparison.iterator(); i.hasNext(); ){ + ComparisonPair pair = i.next(); double similarity = pair.calculateSimilarity(); if(similarity > maximum) maximum = similarity; if(similarity < minimum) minimum = similarity; @@ -114,7 +114,7 @@ public class PairComparisonResultSetPane extends JPanel{ model.addRow(new Object[] { pair.getTarget1().getName(), pair.getTarget2().getName(), new Double(similarity) }); } - average = average / list.size(); + average = average / comparison.getPairCount(); averageLabel.setText(Double.toString(average)); maximumLabel.setText(Double.toString(maximum)); @@ -132,16 +132,12 @@ public class PairComparisonResultSetPane extends JPanel{ if(service == null){ service = FormatManager.getDefaultFormatService(); } - service.getComparisonResultFormat().printResult( - out, new CertainPairComparisonResultSet( - list.toArray(new ComparisonPair[list.size()]), environment - ) - ); + service.getComparisonResultFormat().printResult(out, comparison); } }) ); JButton updateColorButton = Utility.createButton( - "updatecellcolor", new UpdateBirthmarkCellColorAction(this, environment) + "updatecellcolor", new UpdateBirthmarkCellColorAction(this, comparison.getEnvironment()) ); JButton obfuscateButton = Utility.createButton("obfuscate"); JScrollPane scroll = new JScrollPane(); @@ -150,7 +146,7 @@ public class PairComparisonResultSetPane extends JPanel{ minimumLabel = new JLabel(Double.toString(minimum), JLabel.RIGHT); scroll.setViewportView(table); - table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(environment)); + table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(comparison.getEnvironment())); similarityPane.setBorder(new TitledBorder(Messages.getString("similarity.border"))); averageLabel.setBorder(new TitledBorder(Messages.getString("average.border"))); maximumLabel.setBorder(new TitledBorder(Messages.getString("maximum.border"))); @@ -179,9 +175,9 @@ public class PairComparisonResultSetPane extends JPanel{ int col = table.columnAtPoint(e.getPoint()); if(col >= 1 && col < table.getColumnCount() && row >= 0 && row < table.getRowCount()){ - ComparisonPair pair = list.get(row); + ComparisonPair pair = comparison.getPairAt(row); - frame.compareDetails(pair.getTarget1(), pair.getTarget2(), environment); + frame.compareDetails(pair.getTarget1(), pair.getTarget2(), comparison.getContext()); } } } diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/RoundRobinComparisonResultPane.java b/src/main/java/jp/naist/se/stigmata/ui/swing/RoundRobinComparisonResultPane.java index d427df4..f4cdda3 100644 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/RoundRobinComparisonResultPane.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/RoundRobinComparisonResultPane.java @@ -15,9 +15,8 @@ import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.net.URL; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; +import java.util.Iterator; import java.util.Map; import javax.swing.Box; @@ -36,11 +35,14 @@ import jp.naist.se.stigmata.Birthmark; import jp.naist.se.stigmata.BirthmarkComparator; import jp.naist.se.stigmata.BirthmarkEnvironment; import jp.naist.se.stigmata.BirthmarkSet; -import jp.naist.se.stigmata.CertainPairComparisonResultSet; import jp.naist.se.stigmata.ComparisonResultSet; -import jp.naist.se.stigmata.RoundRobinComparisonResultSet; +import jp.naist.se.stigmata.ExtractionResultSet; +import jp.naist.se.stigmata.ExtractionTarget; import jp.naist.se.stigmata.filter.FilteredComparisonResultSet; import jp.naist.se.stigmata.format.FormatManager; +import jp.naist.se.stigmata.result.CertainPairComparisonResultSet; +import jp.naist.se.stigmata.result.MemoryExtractionResultSet; +import jp.naist.se.stigmata.result.RoundRobinComparisonResultSet; import jp.naist.se.stigmata.spi.ResultFormatSpi; import jp.naist.se.stigmata.ui.swing.actions.SaveAction; import jp.naist.se.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction; @@ -54,46 +56,59 @@ import jp.naist.se.stigmata.utils.AsciiDataWritable; public class RoundRobinComparisonResultPane extends JPanel{ private static final long serialVersionUID = 2134574576543623L; - private List birthmarksX; - private List birthmarksY; + private ExtractionResultSet extraction; + // private List birthmarksX; + // private List birthmarksY; private JTable table; private DefaultTableModel model; private JLabel classCount, comparisonCount, distinctionRatio; private JLabel average, minimum, maximum; private StigmataFrame stigmataFrame; - private BirthmarkEnvironment environment; + // private BirthmarkEnvironment environment; + public RoundRobinComparisonResultPane(StigmataFrame stigmata, ExtractionResultSet resultset){ + this.stigmataFrame = stigmata; + this.extraction = resultset; + initialize(); + compare(model); + } + + @Deprecated public RoundRobinComparisonResultPane(StigmataFrame stigmata, BirthmarkEnvironment environment, BirthmarkSet[] birthmarksX, BirthmarkSet[] birthmarksY){ this.stigmataFrame = stigmata; - this.environment = environment; - this.birthmarksX = Arrays.asList(birthmarksX); - this.birthmarksY = Arrays.asList(birthmarksY); initialize(); compare(model); } private void compare(DefaultTableModel model){ - int comparison = birthmarksX.size() * birthmarksY.size(); + int countX = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X); + int countY = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_Y); + int comparisonCount = countX * countY; - classCount.setText(Integer.toString(birthmarksX.size() + birthmarksY.size())); - comparisonCount.setText(Integer.toString(comparison)); + classCount.setText(Integer.toString(countX + countY)); + this.comparisonCount.setText(Integer.toString(comparisonCount)); int correct = 0; double avg = 0d; double max = 0d; double min = 100d; model.addColumn(""); - for(BirthmarkSet x: birthmarksX){ + for(Iterator i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){ + BirthmarkSet x = i.next(); model.addColumn(x.getName()); } - for(int j = 0; j < birthmarksY.size(); j++){ - Object[] rows = new Object[birthmarksX.size() + 1]; - rows[0] = birthmarksY.get(j).getName(); - - for(int i = 0; i < birthmarksX.size(); i++){ - double similarity = compare(environment, birthmarksX.get(i), birthmarksY.get(j)); - rows[i + 1] = new Double(similarity); + int sizeX = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X); + for(Iterator i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){ + Object[] rows = new Object[sizeX + 1]; + BirthmarkSet setY = i.next(); + rows[0] = setY.getName(); + + int index = 0; + for(Iterator j = extraction.birthmarkSets(ExtractionTarget.TARGET_X); j.hasNext(); ){ + BirthmarkSet setX = j.next(); + double similarity = compare(setX, setY, extraction.getEnvironment()); + rows[index + 1] = new Double(similarity); if(Math.abs(similarity - 1) < 1E-8){ correct += 1; @@ -101,19 +116,20 @@ public class RoundRobinComparisonResultPane extends JPanel{ avg += similarity; if(max < similarity) max = similarity; if(min > similarity) min = similarity; + index++; } model.addRow(rows); } distinctionRatio.setText( - Double.toString((double)(comparison - correct) / (double)comparison) + Double.toString((double)(comparisonCount - correct) / (double)comparisonCount) ); - avg = avg / comparison; + avg = avg / comparisonCount; average.setText(Double.toString(avg)); minimum.setText(Double.toString(min)); maximum.setText(Double.toString(max)); } - private double compare(BirthmarkEnvironment environment, BirthmarkSet x, BirthmarkSet y){ + private double compare(BirthmarkSet x, BirthmarkSet y, BirthmarkEnvironment environment){ double similarity = 0d; int count = 0; @@ -123,7 +139,7 @@ public class RoundRobinComparisonResultPane extends JPanel{ if(b1 != null && b2 != null){ BirthmarkComparator comparator = environment.getService(type).getComparator(); double result = comparator.compare(b1, b2); - if(result != Double.NaN){ + if(!Double.isNaN(result)){ similarity += result; count++; } @@ -138,7 +154,7 @@ public class RoundRobinComparisonResultPane extends JPanel{ model = new RoundRobinComparisonResultSetTableModel(); table = new JTable(model); - table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(environment)); + table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(extraction.getEnvironment())); table.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ if(e.getClickCount() == 2){ @@ -146,10 +162,10 @@ public class RoundRobinComparisonResultPane extends JPanel{ int col = table.columnAtPoint(e.getPoint()); if(col >= 1 && col < table.getColumnCount() && row >= 0 && row < table.getRowCount()){ - BirthmarkSet b1 = birthmarksX.get(col - 1); - BirthmarkSet b2 = birthmarksY.get(row); + BirthmarkSet b1 = extraction.getBirthmarkSet(ExtractionTarget.TARGET_X, col - 1); + BirthmarkSet b2 = extraction.getBirthmarkSet(ExtractionTarget.TARGET_Y, row); - stigmataFrame.compareDetails(b1, b2, environment); + stigmataFrame.compareDetails(b1, b2, extraction.getContext()); } } } @@ -187,10 +203,12 @@ public class RoundRobinComparisonResultPane extends JPanel{ private void mdsButtonActionPerformed(ActionEvent e){ Map map = new HashMap(); - for(BirthmarkSet bs: birthmarksX){ + for(Iterator i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){ + BirthmarkSet bs = i.next(); map.put(bs.getLocation(), bs); } - for(BirthmarkSet bs: birthmarksY){ + for(Iterator i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){ + BirthmarkSet bs = i.next(); map.put(bs.getLocation(), bs); } int index = 0; @@ -199,8 +217,8 @@ public class RoundRobinComparisonResultPane extends JPanel{ set[index] = entry.getValue(); index++; } - - stigmataFrame.showMDSGraph(set); + + stigmataFrame.showMDSGraph(set, extraction.getContext()); } private void graphButtonActionPerformed(ActionEvent e){ @@ -229,11 +247,8 @@ public class RoundRobinComparisonResultPane extends JPanel{ service = FormatManager.getDefaultFormatService(); } - service.getComparisonResultFormat().printResult(out, - new RoundRobinComparisonResultSet( - birthmarksX.toArray(new BirthmarkSet[birthmarksX.size()]), - birthmarksY.toArray(new BirthmarkSet[birthmarksY.size()]), environment - ) + service.getComparisonResultFormat().printResult( + out, new RoundRobinComparisonResultSet(extraction) ); } } @@ -242,7 +257,7 @@ public class RoundRobinComparisonResultPane extends JPanel{ JButton obfuscate = Utility.createButton("obfuscate"); JButton compare = Utility.createButton("guessedpair"); JButton updateColor = Utility.createButton( - "updatecellcolor", new UpdateBirthmarkCellColorAction(this, environment) + "updatecellcolor", new UpdateBirthmarkCellColorAction(this, extraction.getEnvironment()) ); JMenuItem mdsMenu = Utility.createJMenuItem("mdsmap"); @@ -310,7 +325,7 @@ public class RoundRobinComparisonResultPane extends JPanel{ private void compareRoundRobinWithFiltering(){ FilterSelectionPane pane = new FilterSelectionPane( - environment.getFilterManager() + extraction.getEnvironment().getFilterManager() ); int returnValue = JOptionPane.showConfirmDialog( stigmataFrame, pane, Messages.getString("filterselection.dialog.title"), @@ -320,27 +335,18 @@ public class RoundRobinComparisonResultPane extends JPanel{ if(returnValue == JOptionPane.OK_OPTION){ String[] filterSetList = pane.getSelectedFilters(); - ComparisonResultSet resultset = new RoundRobinComparisonResultSet( - birthmarksX.toArray(new BirthmarkSet[birthmarksX.size()]), - birthmarksY.toArray(new BirthmarkSet[birthmarksY.size()]), - environment - ); + ComparisonResultSet rs = new RoundRobinComparisonResultSet(extraction); ComparisonResultSet filterResultSet = new FilteredComparisonResultSet( - resultset, - environment.getFilterManager().getFilterSets(filterSetList) + rs, extraction.getEnvironment().getFilterManager().getFilterSets(filterSetList) ); stigmataFrame.showComparisonResultSet(filterResultSet); } } private void compareGuessedPair(){ - ComparisonResultSet resultset = new CertainPairComparisonResultSet( - birthmarksX.toArray(new BirthmarkSet[birthmarksX.size()]), - birthmarksY.toArray(new BirthmarkSet[birthmarksY.size()]), - environment - ); - stigmataFrame.showComparisonResultSet(resultset); + ComparisonResultSet rs = new CertainPairComparisonResultSet(extraction); + stigmataFrame.showComparisonResultSet(rs); } private void compareSpecifiedPair(){ @@ -351,12 +357,8 @@ public class RoundRobinComparisonResultPane extends JPanel{ if(file != null){ Map mapping = stigmataFrame.constructMapping(file); - ComparisonResultSet resultset = new CertainPairComparisonResultSet( - birthmarksX.toArray(new BirthmarkSet[birthmarksX.size()]), - birthmarksY.toArray(new BirthmarkSet[birthmarksY.size()]), - mapping, environment - ); - stigmataFrame.showComparisonResultSet(resultset); + ComparisonResultSet comparison = new CertainPairComparisonResultSet(extraction, mapping); + stigmataFrame.showComparisonResultSet(comparison); } } @@ -369,13 +371,16 @@ public class RoundRobinComparisonResultPane extends JPanel{ Messages.getString("obfuscationmapping.description") ); if(file != null){ - for(int i = 0; i < birthmarksX.size(); i++){ - birthmarksX.set(i, obfuscator.obfuscateClassName(birthmarksX.get(i))); + ExtractionResultSet ers = new MemoryExtractionResultSet(extraction.getContext(), extraction.isTableType()); + for(Iterator i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){ + BirthmarkSet bs = i.next(); + ers.addBirthmarkSet(ExtractionTarget.TARGET_X, obfuscator.obfuscateClassName(bs)); } - for(int i = 0; i < birthmarksY.size(); i++){ - birthmarksY.set(i, obfuscator.obfuscateClassName(birthmarksY.get(i))); + for(Iterator i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){ + BirthmarkSet bs = i.next(); + ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, obfuscator.obfuscateClassName(bs)); } - + this.extraction = ers; obfuscator.outputNameMappings(file); } }catch(IOException e){ diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java b/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java index e53d636..3c16cf2 100644 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java @@ -39,19 +39,20 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.filechooser.FileFilter; +import jp.naist.se.stigmata.BirthmarkContext; import jp.naist.se.stigmata.BirthmarkElementClassNotFoundException; +import jp.naist.se.stigmata.BirthmarkEngine; import jp.naist.se.stigmata.BirthmarkEnvironment; import jp.naist.se.stigmata.BirthmarkExtractionFailedException; import jp.naist.se.stigmata.BirthmarkSet; -import jp.naist.se.stigmata.CertainPairComparisonResultSet; import jp.naist.se.stigmata.ComparisonPair; -import jp.naist.se.stigmata.ComparisonPairFilterSet; import jp.naist.se.stigmata.ComparisonResultSet; +import jp.naist.se.stigmata.ExtractionResultSet; import jp.naist.se.stigmata.Stigmata; import jp.naist.se.stigmata.event.BirthmarkEngineAdapter; import jp.naist.se.stigmata.event.BirthmarkEngineEvent; import jp.naist.se.stigmata.event.WarningMessages; -import jp.naist.se.stigmata.filter.FilteredComparisonResultSet; +import jp.naist.se.stigmata.result.CertainPairComparisonResultSet; import jp.naist.se.stigmata.ui.swing.actions.AboutAction; import jp.naist.se.stigmata.ui.swing.actions.LicenseAction; import jp.naist.se.stigmata.ui.swing.graph.SimilarityDistributionGraphPane; @@ -80,7 +81,7 @@ public class StigmataFrame extends JFrame{ } public StigmataFrame(Stigmata stigmata){ - this(stigmata, stigmata.createEnvironment()); + this(stigmata, BirthmarkEnvironment.getDefaultEnvironment()); } public StigmataFrame(Stigmata stigmata, BirthmarkEnvironment environment){ @@ -156,9 +157,9 @@ public class StigmataFrame extends JFrame{ control.removeBirthmarkServiceListener(listener); } - public void compareDetails(BirthmarkSet target1, BirthmarkSet target2, BirthmarkEnvironment environment){ + public void compareDetails(BirthmarkSet target1, BirthmarkSet target2, BirthmarkContext context){ PairComparisonPane detail = new PairComparisonPane( - this, new ComparisonPair(target1, target2, environment) + this, new ComparisonPair(target1, target2, context) ); int compareDetail = getNextCount("compare_detail"); @@ -173,19 +174,19 @@ public class StigmataFrame extends JFrame{ tabPane.setSelectedIndex(tabPane.getTabCount() - 1); } - public void compareRoundRobin(String[] birthmarks, String[] targetX, String[] targetY, - BirthmarkEnvironment environment){ + public void compareRoundRobin(String[] targetX, String[] targetY, + BirthmarkContext context){ try{ - BirthmarkSet[] x = stigmata.extract(birthmarks, targetX, environment); - BirthmarkSet[] y = stigmata.extract(birthmarks, targetY, environment); + BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment()); + ExtractionResultSet ers = engine.extract(targetX, targetY, context); - RoundRobinComparisonResultPane compare = new RoundRobinComparisonResultPane(this, environment, x, y); + RoundRobinComparisonResultPane compare = new RoundRobinComparisonResultPane(this, ers); int compareCount = getNextCount("compare"); Utility.addNewTab( "compare", tabPane, compare, new Object[] { new Integer(compareCount), }, new Object[] { - Utility.array2String(birthmarks), + Utility.array2String(context.getExtractionTypes()), Utility.array2String(targetX), Utility.array2String(targetY), } @@ -196,21 +197,22 @@ public class StigmataFrame extends JFrame{ } } - public void compareRoundRobin(String[] birthmarks, String[] targetX, String[] targetY, - String[] filterNames, BirthmarkEnvironment environment){ + public void compareRoundRobinFilter(String[] targetX, String[] targetY, + BirthmarkContext context){ try{ - BirthmarkSet[] x = stigmata.extract(birthmarks, targetX, environment); - BirthmarkSet[] y = stigmata.extract(birthmarks, targetY, environment); - ComparisonPairFilterSet[] filters = environment.getFilterManager().getFilterSets(filterNames); + BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment()); - ComparisonResultSet resultset = stigmata.compare(x, y, environment); - FilteredComparisonResultSet fcrs = new FilteredComparisonResultSet(resultset, filters); + ExtractionResultSet ers = engine.extract(targetX, targetY, context); + ComparisonResultSet resultset = engine.compare(ers); + if(context.hasFilter()){ + resultset = engine.filter(resultset); + } int compareCount = getNextCount("compare"); Utility.addNewTab( - "compare", tabPane, new PairComparisonResultSetPane(this, fcrs), + "compare", tabPane, new PairComparisonResultSetPane(this, resultset), new Object[] { new Integer(compareCount), }, new Object[] { - Utility.array2String(birthmarks), + Utility.array2String(context.getExtractionTypes()), Utility.array2String(targetX), Utility.array2String(targetY), } @@ -221,19 +223,18 @@ public class StigmataFrame extends JFrame{ } } - public void compareGuessedPair(String[] birthmarks, String[] targetX, String[] targetY, - BirthmarkEnvironment environment){ + public void compareGuessedPair(String[] targetX, String[] targetY, BirthmarkContext context){ try{ - BirthmarkSet[] x = stigmata.extract(birthmarks, targetX, environment); - BirthmarkSet[] y = stigmata.extract(birthmarks, targetY, environment); + BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment()); + ExtractionResultSet extraction = engine.extract(targetX, targetY, context); int comparePair = getNextCount("compare_pair"); - ComparisonResultSet resultset = new CertainPairComparisonResultSet(x, y, environment); + ComparisonResultSet resultset = new CertainPairComparisonResultSet(extraction); Utility.addNewTab("comparepair", tabPane, new PairComparisonResultSetPane(this, resultset), new Object[] { new Integer(comparePair), }, new Object[] { - Utility.array2String(birthmarks), + Utility.array2String(context.getExtractionTypes()), Utility.array2String(targetX), Utility.array2String(targetY), } @@ -244,8 +245,7 @@ public class StigmataFrame extends JFrame{ } } - public void compareSpecifiedPair(String[] birthmarks, String[] targetX, String[] targetY, - BirthmarkEnvironment environment){ + public void compareSpecifiedPair(String[] targetX, String[] targetY, BirthmarkContext context){ File file = getOpenFile(Messages.getStringArray("comparemapping.extension"), Messages.getString("comparemapping.description")); @@ -253,17 +253,17 @@ public class StigmataFrame extends JFrame{ Map mapping = constructMapping(file); try{ - BirthmarkSet[] x = stigmata.extract(birthmarks, targetX, environment); - BirthmarkSet[] y = stigmata.extract(birthmarks, targetY, environment); + BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment()); + context.setNameMappings(mapping); + ComparisonResultSet crs = engine.compare(targetX, targetY, context); int comparePair = getNextCount("compare_pair"); - ComparisonResultSet resultset = new CertainPairComparisonResultSet(x, y, mapping, environment); Utility.addNewTab( "comparepair", tabPane, - new PairComparisonResultSetPane(this, resultset), + new PairComparisonResultSetPane(this, crs), new Object[] { new Integer(comparePair), }, new Object[] { - Utility.array2String(birthmarks), + Utility.array2String(context.getExtractionTypes()), Utility.array2String(targetX), Utility.array2String(targetY), } @@ -285,9 +285,9 @@ public class StigmataFrame extends JFrame{ tabPane.setSelectedIndex(tabPane.getTabCount() - 1); } - public void showMDSGraph(BirthmarkSet[] set){ + public void showMDSGraph(BirthmarkSet[] set, BirthmarkContext context){ try{ - MDSGraphPanel panel = new MDSGraphPanel(this, set, environment); + MDSGraphPanel panel = new MDSGraphPanel(this, set, context); int mappingGraphCount = getNextCount("mds_graph"); Utility.addNewTab("mappinggraph", tabPane, panel, new Object[] { new Integer(mappingGraphCount), }, null); tabPane.setSelectedIndex(tabPane.getTabCount() - 1); @@ -304,22 +304,23 @@ public class StigmataFrame extends JFrame{ tabPane.setSelectedIndex(tabPane.getTabCount() - 1); } - public void showExtractionResult(BirthmarkSet[] set, BirthmarkEnvironment environment){ + public void showExtractionResult(ExtractionResultSet ers){ int extractCount = getNextCount("extract"); - BirthmarkExtractionResultPane viewer = new BirthmarkExtractionResultPane(this, environment, set); + BirthmarkExtractionResultPane viewer = new BirthmarkExtractionResultPane(this, ers); Utility.addNewTab( "extract", tabPane, viewer, new Object[] { new Integer(extractCount), }, - new Object[] { Utility.array2String(set[0].getBirthmarkTypes()), } + new Object[] { Utility.array2String(ers.getBirthmarkTypes()), } ); tabPane.setSelectedIndex(tabPane.getTabCount() - 1); } - public void extract(String[] birthmarks, String[] targets, BirthmarkEnvironment environment){ + public void extract(String[] targets, BirthmarkContext context){ try{ - BirthmarkSet[] holders = stigmata.extract(birthmarks, targets, environment); - showExtractionResult(holders, environment); + BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment()); + ExtractionResultSet ers = engine.extract(targets, context); + showExtractionResult(ers); }catch(Throwable e){ showExceptionMessage(e); } diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/mds/MDSGraphPanel.java b/src/main/java/jp/naist/se/stigmata/ui/swing/mds/MDSGraphPanel.java index a6306e7..62b49b3 100644 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/mds/MDSGraphPanel.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/mds/MDSGraphPanel.java @@ -22,9 +22,12 @@ import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; +import jp.naist.se.stigmata.BirthmarkContext; import jp.naist.se.stigmata.BirthmarkEnvironment; import jp.naist.se.stigmata.BirthmarkSet; import jp.naist.se.stigmata.ComparisonPair; +import jp.naist.se.stigmata.ExtractionResultSet; +import jp.naist.se.stigmata.result.SingleExtractionResultSet; import jp.naist.se.stigmata.ui.swing.ClippedLRListCellRenderer; import jp.naist.se.stigmata.ui.swing.Messages; import jp.naist.se.stigmata.ui.swing.PopupButton; @@ -45,28 +48,26 @@ public class MDSGraphPanel extends JPanel{ private StigmataFrame stigmata; private BirthmarkSet[] set; + private BirthmarkContext context; private LabelMap labels; private MDSGraphViewer viewer; - public MDSGraphPanel(StigmataFrame stigmata, BirthmarkSet[] set){ - this(stigmata, set, stigmata.getEnvironment()); - } - - public MDSGraphPanel(StigmataFrame stigmata, BirthmarkSet[] set, BirthmarkEnvironment environment){ + public MDSGraphPanel(StigmataFrame stigmata, BirthmarkSet[] set, BirthmarkContext context){ this.stigmata = stigmata; + this.context = context; this.set = set; - double[][] matrix = initData(set, environment); + double[][] matrix = initData(set, context); initLayouts(matrix); } - private double[][] initData(BirthmarkSet[] set, BirthmarkEnvironment environment){ + private double[][] initData(BirthmarkSet[] set, BirthmarkContext context){ labels = new LabelMap(); double[][] matrix = new double[set.length][set.length]; for(int i = 0; i < set.length; i++){ for(int j = 0; j <= i; j++){ - ComparisonPair pair = new ComparisonPair(set[i], set[j], environment); + ComparisonPair pair = new ComparisonPair(set[i], set[j], context); matrix[i][j] = 1d - pair.calculateSimilarity(); if(i != j){ matrix[j][i] = matrix[i][j]; @@ -102,9 +103,8 @@ public class MDSGraphPanel extends JPanel{ String c = e.getActionCommand(); for(int i = 0; i < set.length; i++){ if(c.equals(set[i].getName())){ - stigmata.showExtractionResult( - new BirthmarkSet[]{ set[i], }, stigmata.getEnvironment() - ); + ExtractionResultSet ers = new SingleExtractionResultSet(context, set[i]); + stigmata.showExtractionResult(ers); } } } diff --git a/src/main/java/jp/naist/se/stigmata/utils/ConfigFileImporter.java b/src/main/java/jp/naist/se/stigmata/utils/ConfigFileImporter.java index c1dafb3..237588f 100644 --- a/src/main/java/jp/naist/se/stigmata/utils/ConfigFileImporter.java +++ b/src/main/java/jp/naist/se/stigmata/utils/ConfigFileImporter.java @@ -18,6 +18,7 @@ import javax.xml.parsers.SAXParserFactory; import jp.naist.se.stigmata.BirthmarkEnvironment; import jp.naist.se.stigmata.ComparisonPairFilter; import jp.naist.se.stigmata.ComparisonPairFilterSet; +import jp.naist.se.stigmata.Stigmata; import jp.naist.se.stigmata.birthmarks.BirthmarkService; import org.xml.sax.Attributes; @@ -80,7 +81,7 @@ public class ConfigFileImporter{ public Handler(BirthmarkEnvironment environment){ if(environment == null){ - environment = new BirthmarkEnvironment(); + environment = Stigmata.getInstance().createEnvironment(); } this.environment = environment; this.manager = environment.getWellknownClassManager(); diff --git a/src/main/java/jp/naist/se/stigmata/utils/MultipleIterator.java b/src/main/java/jp/naist/se/stigmata/utils/MultipleIterator.java new file mode 100755 index 0000000..adf8cd2 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/utils/MultipleIterator.java @@ -0,0 +1,89 @@ +package jp.naist.se.stigmata.utils; + +/* + * $Id$ + */ + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Iterator; +import java.util.NoSuchElementException; + +/** + * + * @author Haruaki Tamada + * @version $Revision$ $Date$ + */ +public class MultipleIterator implements Iterator{ + private List> iterators = new ArrayList>(); + private int index = 0; + private Iterator current; + private boolean finished = false; + + public MultipleIterator(){ + } + + public MultipleIterator(Iterator[] iteratorArray){ + for(Iterator iterator: iteratorArray){ + iterators.add(iterator); + } + } + + public MultipleIterator(Iterator> iterator){ + while(iterator.hasNext()){ + iterators.add(iterator.next()); + } + } + + public MultipleIterator(Collection> collection){ + this(collection.iterator()); + } + + public void add(Iterator iterator){ + iterators.add(iterator); + } + + public void remove(Iterator iterator){ + iterators.remove(iterator); + } + + private void nextIterator(){ + if(index >= iterators.size()){ + current = null; + finished = true; + return; + } + current = iterators.get(index); + index++; + } + + public void remove(){ + current.remove(); + } + + /** + */ + public boolean hasNext(){ + if(current == null){ + nextIterator(); + } + boolean flag = current.hasNext(); + + if(!flag){ + nextIterator(); + } + + return finished || current.hasNext(); + } + + /** + */ + public T next(){ + if(hasNext()){ + return current.next(); + } + + throw new NoSuchElementException(); + } +} diff --git a/src/main/java/jp/naist/se/stigmata/utils/NullIterator.java b/src/main/java/jp/naist/se/stigmata/utils/NullIterator.java new file mode 100755 index 0000000..35a0d6a --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/utils/NullIterator.java @@ -0,0 +1,26 @@ +package jp.naist.se.stigmata.utils; + +/* + * $Id$ + */ + +import java.util.Iterator; +import java.util.NoSuchElementException; + +/** + * + * @author Haruaki Tamada + * @version $Revision$ $Date$ + */ +public class NullIterator implements Iterator{ + public boolean hasNext(){ + return false; + } + + public T next(){ + throw new NoSuchElementException("no more object"); + } + + public void remove(){ + } +} diff --git a/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkSpi b/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkSpi index 0760b1b..af5f771 100755 --- a/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkSpi +++ b/src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkSpi @@ -5,3 +5,4 @@ jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkService jp.naist.se.stigmata.birthmarks.kgram.KGramBasedBirthmarkService jp.naist.se.stigmata.birthmarks.fmc.FrequencyMethodCallBirthmarkService jp.naist.se.stigmata.birthmarks.fuc.FrequencyUsedClassesBirthmarkService +jp.naist.se.stigmata.birthmarks.kmc.KGramOfMethodCallBirthmarkService diff --git a/src/main/resources/resources/description.properties b/src/main/resources/resources/description.properties index dd41e4b..9d2da1b 100644 --- a/src/main/resources/resources/description.properties +++ b/src/main/resources/resources/description.properties @@ -12,6 +12,8 @@ birthmark.fmc.display.type=Frequency of Method Calls birthmark.fmc.description=Frequency of method calls. birthmark.fuc.display.type=Frequency of Used Classes birthmark.fuc.description=Frequency of used classes. +birthmark.kmc.display.type=K-gram of Method Calls +birthmark.kmc.description=K-gram of method calls. comparator.dpmatching.description= comparator.editdistance.description= @@ -25,6 +27,7 @@ extractor.uc.description= extractor.is.description= extractor.kgram.description= extractor.fmc.description= +extractor.kmc.description= formatter.xml.description= formatter.csv.description= diff --git a/src/main/resources/resources/description_ja.source b/src/main/resources/resources/description_ja.source index da06bbe..62dc053 100644 --- a/src/main/resources/resources/description_ja.source +++ b/src/main/resources/resources/description_ja.source @@ -12,6 +12,8 @@ birthmark.fmc.display.type= birthmark.fmc.description=ƒƒ\ƒbƒhŒÄo‚µ‚̏oŒ»•p“x birthmark.fuc.display.type=ˆË‘¶ƒNƒ‰ƒX‚Ì•p“x birthmark.fuc.description=ˆË‘¶ƒNƒ‰ƒX‚̏oŒ»•p“x +birthmark.kmc.display.type=ƒƒ\ƒbƒhŒÄo‚ÌK-gram +birthmark.kmc.description=Ã“I‚ȃƒ\ƒbƒhŒÄo‚ÌŒn—ñ‚©‚çì¬‚µ‚½K-gram filter.similarity.display.type=—ÞŽ—“x‚ł̃tƒBƒ‹ƒ^ƒŠƒ“ƒO filter.name.display.type=ƒNƒ‰ƒX–¼‚ł̃tƒBƒ‹ƒ^ƒŠƒ“ƒO diff --git a/src/main/resources/resources/options.xml b/src/main/resources/resources/options.xml index 51f0951..dd95a5d 100755 --- a/src/main/resources/resources/options.xml +++ b/src/main/resources/resources/options.xml @@ -88,12 +88,19 @@ NONE - + e - extract-type + extraction-unit REQUIRED - EXTRACT_TYPE - extract birthmark from EXTRACT_TYPE. Available values are CLASS, PACKAGE, and ARCHIVE. Default is CLASS + EXTRACT_UNIT + extract birthmark from EXTRACT_UNIT. Available values are CLASS, PACKAGE, and ARCHIVE. Default is CLASS + + + + store-target + REQUIRED + STORE_TARGET + This option represents how to store extracted birthmarks. Available value is only MEMORY. @@ -108,6 +115,7 @@ - + + diff --git a/src/main/resources/resources/stigmata.xml b/src/main/resources/resources/stigmata.xml index e080643..82f42d7 100755 --- a/src/main/resources/resources/stigmata.xml +++ b/src/main/resources/resources/stigmata.xml @@ -13,6 +13,7 @@ $Id$ jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor jp.naist.se.stigmata.birthmarks.comparators.PlainBirthmarkComparator + uc_dp Used Classes (DP matching) @@ -20,6 +21,7 @@ $Id$ jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor jp.naist.se.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator + uc_ed Used Classes (Edit distance) @@ -27,6 +29,7 @@ $Id$ jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractor jp.naist.se.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator + is_ed Inheritance Structure (Edit distance) @@ -34,6 +37,7 @@ $Id$ jp.naist.se.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor jp.naist.se.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator + is_dp Inheritance Structure (DP matching) @@ -41,6 +45,7 @@ $Id$ jp.naist.se.stigmata.birthmarks.is.InheritanceStructureBirthmarkExtractor jp.naist.se.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator + smc_ed Sequence of Method Calls (Edit distance) @@ -48,6 +53,7 @@ $Id$ jp.naist.se.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor jp.naist.se.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator + smc_dp Sequence of Method Calls (DP matching) @@ -55,6 +61,7 @@ $Id$ jp.naist.se.stigmata.birthmarks.smc.SequentialMethodCallBirthmarkExtractor jp.naist.se.stigmata.birthmarks.comparators.DPMatchingBirthmarkComparator + cvfv_ed Constant Value of Field Variable (Edit distance) @@ -62,6 +69,7 @@ $Id$ jp.naist.se.stigmata.birthmarks.cvfv.ConstantValueOfFieldVariableBirthmarkExtractor jp.naist.se.stigmata.birthmarks.comparators.EditDistanceBirthmarkComparator + cvfv_dp Constant Value of Field Variable (DP matching) @@ -187,6 +195,10 @@ $Id$ extractor.kgram.KValue 4 + + extractor.kmc.KValue + 4 +