import java.util.Map;\r
import java.util.Stack;\r
\r
+import jp.naist.se.stigmata.birthmarks.extractors.BirthmarkExtractorFactory;\r
import jp.naist.se.stigmata.event.BirthmarkEngineEvent;\r
import jp.naist.se.stigmata.event.BirthmarkEngineListener;\r
import jp.naist.se.stigmata.event.OperationStage;\r
import jp.naist.se.stigmata.reader.DefaultClassFileArchive;\r
import jp.naist.se.stigmata.reader.JarClassFileArchive;\r
import jp.naist.se.stigmata.reader.WarClassFileArchive;\r
+import jp.naist.se.stigmata.result.CertainPairComparisonResultSet;\r
+import jp.naist.se.stigmata.result.ExtractionResultSetFactory;\r
+import jp.naist.se.stigmata.result.RoundRobinComparisonResultSet;\r
import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
\r
import org.apache.commons.beanutils.BeanUtils;\r
private WarningMessages warnings;\r
private OperationType latestOperationType;\r
private OperationType targetType;\r
-\r
- public BirthmarkEngine(){\r
- this(BirthmarkEnvironment.getDefaultEnvironment());\r
- }\r
+ private BirthmarkExtractorFactory factory;\r
\r
public BirthmarkEngine(BirthmarkEnvironment env){\r
this.environment = env;\r
+ factory = new BirthmarkExtractorFactory(env);\r
+ }\r
+\r
+ public BirthmarkEnvironment getEnvironment(){\r
+ return environment;\r
}\r
\r
public void addBirthmarkEngineListener(BirthmarkEngineListener listener){\r
operationStart(OperationType.FILTER_BIRTHMARKS);\r
\r
ComparisonResultSet crs = compare(target, context);\r
- crs = filter(crs, context);\r
- \r
+ crs = filter(crs);\r
+\r
operationDone(OperationType.FILTER_BIRTHMARKS);\r
\r
return crs;\r
operationStart(OperationType.FILTER_BIRTHMARKS);\r
\r
ComparisonResultSet crs = compare(targetX, targetY, context);\r
- crs = filter(crs, context);\r
+ crs = filter(crs);\r
\r
operationDone(OperationType.FILTER_BIRTHMARKS);\r
\r
return crs;\r
}\r
\r
- public ComparisonResultSet filter(ExtractionResult er, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ public ComparisonResultSet filter(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.FILTER_BIRTHMARKS);\r
\r
- ComparisonResultSet crs = compare(er, context);\r
- crs = filter(crs, context);\r
+ ComparisonResultSet crs = compare(er);\r
+ crs = filter(crs);\r
\r
operationDone(OperationType.FILTER_BIRTHMARKS);\r
\r
return crs;\r
}\r
\r
- public ComparisonResultSet filter(ComparisonResultSet crs, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ public ComparisonResultSet filter(ComparisonResultSet crs) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.FILTER_BIRTHMARKS);\r
\r
- String[] filterTypes = context.getFilterTypes();\r
+ String[] filterTypes = crs.getContext().getFilterTypes();\r
\r
if(filterTypes != null){\r
List<ComparisonPairFilterSet> filterList = new ArrayList<ComparisonPairFilterSet>();\r
return crs;\r
}\r
\r
+ public ComparisonPair compareDetails(BirthmarkSet bs1, BirthmarkSet bs2, BirthmarkContext context) throws BirthmarkComparisonFailedException{\r
+ return new ComparisonPair(bs1, bs2, context);\r
+ }\r
+\r
public ComparisonResultSet compare(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.COMPARE_BIRTHMARKS);\r
\r
- ExtractionResult er = extract(target, context);\r
- ComparisonResultSet crs = compare(er, context);\r
+ ExtractionResultSet er = extract(target, context);\r
+ ComparisonResultSet crs = compare(er);\r
\r
operationDone(OperationType.COMPARE_BIRTHMARKS);\r
\r
public ComparisonResultSet compare(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.COMPARE_BIRTHMARKS);\r
\r
- ExtractionResult er = extract(targetX, targetY, context);\r
- ComparisonResultSet crs = compare(er, context);\r
+ ExtractionResultSet er = extract(targetX, targetY, context);\r
+ ComparisonResultSet crs = compare(er);\r
\r
operationDone(OperationType.COMPARE_BIRTHMARKS);\r
\r
return crs;\r
}\r
\r
- public ComparisonResultSet compare(ExtractionResult er, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ public ComparisonResultSet compare(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.COMPARE_BIRTHMARKS);\r
+ BirthmarkContext context = er.getContext();\r
\r
ComparisonResultSet crs = null;\r
switch(context.getComparisonMethod()){\r
- case ROUND_ROBIN:\r
- crs = new RoundRobinComparisonResultSet(\r
- er.getBirthmarkSetXY(), environment, true\r
- );\r
+ case ROUND_ROBIN_SAME_PAIR:\r
+ crs = new RoundRobinComparisonResultSet(er, true);\r
+ break;\r
+ case ROUND_ROBIN_WITHOUT_SAME_PAIR:\r
+ crs = new RoundRobinComparisonResultSet(er, false);\r
break;\r
case ROUND_ROBIN_XY:\r
- crs = new RoundRobinComparisonResultSet(\r
- er.getBirthmarkSetX(), er.getBirthmarkSetY(), environment\r
- );\r
+ crs = new RoundRobinComparisonResultSet(er, true);\r
case GUESSED_PAIR:\r
- crs = new CertainPairComparisonResultSet(\r
- er.getBirthmarkSetX(), er.getBirthmarkSetY(), environment\r
- );\r
+ crs = new CertainPairComparisonResultSet(er);\r
break;\r
case SPECIFIED_PAIR:\r
- crs = new CertainPairComparisonResultSet(\r
- er.getBirthmarkSetX(), er.getBirthmarkSetY(),\r
- context.getNameMappings(), environment\r
- );\r
+ crs = new CertainPairComparisonResultSet(er, context.getNameMappings());\r
break;\r
}\r
\r
return crs;\r
}\r
\r
- public ExtractionResult extract(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
+ public ExtractionResultSet extract(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
- ExtractionResult er = extract(target, null, context);\r
+ ExtractionResultSet er = extract(target, null, context);\r
operationDone(OperationType.EXTRACT_BIRTHMARKS);\r
return er;\r
}\r
\r
- public ExtractionResult extract(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
+ public ExtractionResultSet extract(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
- ExtractionResult er = new ExtractionResult();\r
+ ExtractionResultSet er = ExtractionResultSetFactory.getInstance().createResultSet(context);\r
\r
try{\r
switch(context.getComparisonMethod()){\r
- case ROUND_ROBIN:\r
+ case ROUND_ROBIN_SAME_PAIR:\r
+ case ROUND_ROBIN_WITHOUT_SAME_PAIR:\r
+ er.setTableType(false);\r
+ String[] targetXY = mergeTarget(targetX, targetY);\r
+ extractImpl2(targetXY, er, ExtractionTarget.TARGET_XY);\r
+ break;\r
+ case GUESSED_PAIR:\r
+ case SPECIFIED_PAIR:\r
+ case ROUND_ROBIN_XY:\r
+ default:\r
+ if(targetX == null || targetY == null){\r
+ throw new BirthmarkExtractionFailedException("targetX or targetY is null");\r
+ }\r
+ er.setTableType(true);\r
+ extractImpl2(targetX, er, ExtractionTarget.TARGET_X);\r
+ extractImpl2(targetY, er, ExtractionTarget.TARGET_Y);\r
+ break;\r
+ }\r
+ return er;\r
+ } catch(IOException e){\r
+ throw new BirthmarkExtractionFailedException(e);\r
+ } finally{\r
+ operationDone(OperationType.EXTRACT_BIRTHMARKS);\r
+ }\r
+ }\r
+\r
+ public ExtractionResultSet extract2(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
+ operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
+ ExtractionResultSet er = ExtractionResultSetFactory.getInstance().createResultSet(context);\r
+\r
+ try{\r
+ switch(context.getComparisonMethod()){\r
+ case ROUND_ROBIN_SAME_PAIR:\r
+ case ROUND_ROBIN_WITHOUT_SAME_PAIR:\r
+ er.setTableType(false);\r
String[] targetXY = mergeTarget(targetX, targetY);\r
BirthmarkSet[] s = extractImpl(targetXY, context);\r
- er.setBirthmarkSetXY(s);\r
+ er.setBirthmarkSets(ExtractionTarget.TARGET_XY, s);\r
break;\r
case GUESSED_PAIR:\r
case SPECIFIED_PAIR:\r
if(targetX == null || targetY == null){\r
throw new BirthmarkExtractionFailedException("targetX or targetY is null");\r
}\r
+ er.setTableType(true);\r
BirthmarkSet[] extractResultX = extractImpl(targetX, context);\r
BirthmarkSet[] extractResultY = extractImpl(targetY, context);\r
\r
- er.setBirthmarkSetX(extractResultX);\r
- er.setBirthmarkSetY(extractResultY);\r
+ er.setBirthmarkSets(ExtractionTarget.TARGET_X, extractResultX);\r
+ er.setBirthmarkSets(ExtractionTarget.TARGET_Y, extractResultY);\r
break;\r
}\r
return er;\r
}\r
}\r
\r
+ private BirthmarkSet[] extractImpl2(String[] target, ExtractionResultSet er, ExtractionTarget et) throws BirthmarkExtractionFailedException, IOException{\r
+ ClassFileArchive[] archives = createArchives(target, environment);\r
+ BirthmarkContext context = er.getContext();\r
+ ExtractionUnit unit = context.getExtractionUnit();\r
+\r
+ BirthmarkSet[] extractResult = null;\r
+ if(unit == ExtractionUnit.CLASS){\r
+ extractFromClass2(archives, er, et);\r
+ }\r
+ else if(unit == ExtractionUnit.PACKAGE){\r
+ extractFromPackage2(archives, er, et);\r
+ }\r
+ else if(unit == ExtractionUnit.ARCHIVE){\r
+ extractFromProduct2(archives, er, et);\r
+ }\r
+\r
+ return extractResult;\r
+ }\r
+\r
private BirthmarkSet[] extractImpl(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, IOException{\r
ClassFileArchive[] archives = createArchives(target, environment);\r
BirthmarkExtractor[] extractors = createExtractors(context.getExtractionTypes(), environment);\r
warnings.addMessage(new ExtractorNotFoundException("extractor not found"), birthmarkType);\r
}\r
\r
- return null;\r
+ return extractor;\r
}\r
\r
private byte[] inputStreamToByteArray(InputStream in) throws IOException{\r
return data;\r
}\r
\r
+ private void extractFromPackage2(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
+ Map<String, BirthmarkSet> map = new HashMap<String, BirthmarkSet>();\r
+ BirthmarkContext context = er.getContext();\r
+\r
+ for(ClassFileArchive archive: archives){\r
+ for(ClassFileEntry entry: archive){\r
+ try{\r
+ String name = entry.getClassName();\r
+ String packageName = parsePackageName(name);\r
+ BirthmarkSet bs = map.get(packageName);\r
+ if(bs == null){\r
+ bs = new BirthmarkSet(packageName, archive.getLocation());\r
+ map.put(packageName, bs);\r
+ }\r
+\r
+ byte[] data = inputStreamToByteArray(entry.getLocation().openStream());\r
+ for(String birthmarkType: context.getExtractionTypes()){\r
+ try{\r
+ BirthmarkExtractor extractor = factory.getExtractor(birthmarkType);\r
+ if(extractor.isAcceptable(ExtractionUnit.PACKAGE)){\r
+ Birthmark b = bs.getBirthmark(extractor.getProvider().getType());\r
+ if(b == null){\r
+ b = extractor.createBirthmark();\r
+ bs.addBirthmark(b);\r
+ }\r
+ extractor.extract(b, new ByteArrayInputStream(data), er.getEnvironment());\r
+ }\r
+ } catch(ExtractorNotFoundException e){\r
+ warnings.addMessage(e, birthmarkType);\r
+ }\r
+ }\r
+ } catch(IOException e){\r
+ warnings.addMessage(e, archive.getName());\r
+ }\r
+ }\r
+ }\r
+ for(BirthmarkSet bs: map.values()){\r
+ er.addBirthmarkSet(et, bs);\r
+ }\r
+ }\r
+\r
private BirthmarkSet[] extractFromPackage(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkEnvironment context) throws IOException, BirthmarkExtractionFailedException{\r
Map<String, BirthmarkSet> list = new HashMap<String, BirthmarkSet>();\r
\r
return n;\r
}\r
\r
- private BirthmarkSet[] extractFromClass(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkEnvironment context) throws IOException, BirthmarkExtractionFailedException{\r
+ private void extractFromClass2(ClassFileArchive[] archives, ExtractionResultSet er,\r
+ ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
+ BirthmarkContext context = er.getContext();\r
+\r
+ for(ClassFileArchive archive: archives){\r
+ for(ClassFileEntry entry: archive){\r
+ try{\r
+ BirthmarkSet birthmarkset = new BirthmarkSet(entry.getClassName(), entry.getLocation());\r
+ byte[] data = inputStreamToByteArray(entry.getLocation().openStream());\r
+ \r
+ for(String birthmarkType: context.getExtractionTypes()){\r
+ try{\r
+ BirthmarkExtractor extractor = factory.getExtractor(birthmarkType);\r
+ if(extractor.isAcceptable(ExtractionUnit.CLASS)){\r
+ Birthmark b = extractor.extract(new ByteArrayInputStream(data), er.getEnvironment());\r
+ birthmarkset.addBirthmark(b);\r
+ }\r
+ } catch(ExtractorNotFoundException e){\r
+ warnings.addMessage(e, birthmarkType);\r
+ }\r
+ }\r
+ er.addBirthmarkSet(et, birthmarkset);\r
+ } catch(IOException e){\r
+ warnings.addMessage(e, entry.getClassName());\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ private BirthmarkSet[] extractFromClass(ClassFileArchive[] archives,\r
+ BirthmarkExtractor[] extractors, BirthmarkEnvironment context) throws IOException, BirthmarkExtractionFailedException{\r
List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();\r
\r
for(ClassFileArchive archive: archives){\r
return list.toArray(new BirthmarkSet[list.size()]);\r
}\r
\r
+ private void extractFromProduct2(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
+ BirthmarkContext context = er.getContext();\r
+\r
+ for(ClassFileArchive archive: archives){\r
+ BirthmarkSet birthmarkset = new BirthmarkSet(archive.getName(), archive.getLocation());\r
+\r
+ for(ClassFileEntry entry: archive){\r
+ try{\r
+ byte[] data = inputStreamToByteArray(entry.getLocation().openStream());\r
+ for(String birthmarkType: context.getExtractionTypes()){\r
+ try{\r
+ BirthmarkExtractor extractor = factory.getExtractor(birthmarkType);\r
+ if(extractor.isAcceptable(ExtractionUnit.ARCHIVE)){\r
+ Birthmark b = birthmarkset.getBirthmark(birthmarkType);\r
+ if(b == null){\r
+ b = extractor.createBirthmark();\r
+ birthmarkset.addBirthmark(b);\r
+ }\r
+ extractor.extract(b, new ByteArrayInputStream(data), er.getEnvironment());\r
+ }\r
+ } catch(ExtractorNotFoundException e){\r
+ warnings.addMessage(e, birthmarkType);\r
+ } \r
+ }\r
+ } catch(IOException e){\r
+ warnings.addMessage(e, entry.getClassName());\r
+ }\r
+ }\r
+ if(birthmarkset.getBirthmarksCount() != 0){\r
+ er.addBirthmarkSet(et, birthmarkset);\r
+ }\r
+ }\r
+ }\r
+\r
private BirthmarkSet[] extractFromProduct(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkEnvironment context) throws IOException, BirthmarkExtractionFailedException{\r
List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();\r
\r