import java.io.File;\r
import java.io.IOException;\r
import java.io.InputStream;\r
-import java.lang.reflect.InvocationTargetException;\r
import java.net.MalformedURLException;\r
import java.util.ArrayList;\r
import java.util.HashMap;\r
-import java.util.Iterator;\r
import java.util.List;\r
import java.util.Map;\r
import java.util.Stack;\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
\r
/**\r
+ * This class is birthmarking engine. \r
+ * This class extracts birthmarks from given Java class files, compares results of extractions, and filters results of comparisons.\r
+ * \r
+ * This class is not thread safe.\r
* \r
* @author Haruaki Tamada\r
* @version $Revision$ $Date$\r
private OperationType targetType;\r
private BirthmarkExtractorFactory factory;\r
\r
+ /**\r
+ * constructor.\r
+ */\r
public BirthmarkEngine(BirthmarkEnvironment env){\r
this.environment = env;\r
factory = new BirthmarkExtractorFactory(env);\r
}\r
\r
+ /**\r
+ * returns an environment of this object.\r
+ */\r
public BirthmarkEnvironment getEnvironment(){\r
return environment;\r
}\r
listeners.remove(listener);\r
}\r
\r
- public ComparisonResultSet filter(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ /**\r
+ * filters comparison of birthmarks from target files.\r
+ * @see #extract(String[], BirthmarkContext)\r
+ * @see #compare(String[], BirthmarkContext)\r
+ * @see #filter(ComparisonResultSet)\r
+ * @see BirthmarkContext#getFilterTypes()\r
+ */\r
+ public synchronized ComparisonResultSet filter(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.FILTER_BIRTHMARKS);\r
\r
ComparisonResultSet crs = compare(target, context);\r
return crs;\r
}\r
\r
- public ComparisonResultSet filter(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ /**\r
+ * filters comparison of birthmarks from given two targets targetx, and targetY\r
+ * @see #extract(String[], String[], BirthmarkContext)\r
+ * @see #compare(String[], String[], BirthmarkContext)\r
+ * @see #filter(ComparisonResultSet)\r
+ * @see BirthmarkContext#getFilterTypes()\r
+ */\r
+ public synchronized ComparisonResultSet filter(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.FILTER_BIRTHMARKS);\r
\r
ComparisonResultSet crs = compare(targetX, targetY, context);\r
return crs;\r
}\r
\r
- public ComparisonResultSet filter(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ /**\r
+ * filters comparison of birthmarks from given extraction result set.\r
+ * @see #compare(ExtractionResultSet)\r
+ * @see #filter(ComparisonResultSet)\r
+ * @see ExtractionResultSet#getContext()\r
+ * @see BirthmarkContext#getFilterTypes()\r
+ */\r
+ public synchronized ComparisonResultSet filter(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.FILTER_BIRTHMARKS);\r
\r
ComparisonResultSet crs = compare(er);\r
return crs;\r
}\r
\r
- public ComparisonResultSet filter(ComparisonResultSet crs) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ /**\r
+ * filters comparison of birthmarks.\r
+ * @see ExtractionResultSet#getContext()\r
+ * @see BirthmarkContext#getFilterTypes()\r
+ */\r
+ public synchronized ComparisonResultSet filter(ComparisonResultSet crs) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.FILTER_BIRTHMARKS);\r
\r
String[] filterTypes = crs.getContext().getFilterTypes();\r
return crs;\r
}\r
\r
- public ComparisonPair compareDetails(BirthmarkSet bs1, BirthmarkSet bs2, BirthmarkContext context) throws BirthmarkComparisonFailedException{\r
+ /**\r
+ * compares two given birthmarks and returns comparison pair.\r
+ */\r
+ public synchronized 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
+ public synchronized ComparisonResultSet compare(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.COMPARE_BIRTHMARKS);\r
\r
ExtractionResultSet er = extract(target, context);\r
return crs;\r
}\r
\r
- public ComparisonResultSet compare(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ public synchronized ComparisonResultSet compare(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.COMPARE_BIRTHMARKS);\r
\r
ExtractionResultSet er = extract(targetX, targetY, context);\r
return crs;\r
}\r
\r
- public ComparisonResultSet compare(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+ public synchronized ComparisonResultSet compare(ExtractionResultSet er) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
operationStart(OperationType.COMPARE_BIRTHMARKS);\r
BirthmarkContext context = er.getContext();\r
\r
return crs;\r
}\r
\r
- public ExtractionResultSet extract(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
+ public synchronized ExtractionResultSet extract(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
ExtractionResultSet er = extract(target, null, context);\r
operationDone(OperationType.EXTRACT_BIRTHMARKS);\r
return er;\r
}\r
\r
- public ExtractionResultSet extract(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
- 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
+ public synchronized ExtractionResultSet extract(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
ExtractionResultSet er = ExtractionResultSetFactory.getInstance().createResultSet(context);\r
\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.setBirthmarkSets(ExtractionTarget.TARGET_XY, s);\r
+ extractImpl(targetXY, er, ExtractionTarget.TARGET_XY);\r
break;\r
case GUESSED_PAIR:\r
case SPECIFIED_PAIR:\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.setBirthmarkSets(ExtractionTarget.TARGET_X, extractResultX);\r
- er.setBirthmarkSets(ExtractionTarget.TARGET_Y, extractResultY);\r
+ extractImpl(targetX, er, ExtractionTarget.TARGET_X);\r
+ extractImpl(targetY, er, ExtractionTarget.TARGET_Y);\r
break;\r
}\r
return er;\r
}\r
}\r
\r
- private BirthmarkSet[] extractImpl2(String[] target, ExtractionResultSet er, ExtractionTarget et) throws BirthmarkExtractionFailedException, IOException{\r
+ private BirthmarkSet[] extractImpl(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
+ extractFromClass(archives, er, et);\r
}\r
else if(unit == ExtractionUnit.PACKAGE){\r
- extractFromPackage2(archives, er, et);\r
+ extractFromPackage(archives, er, et);\r
}\r
else if(unit == ExtractionUnit.ARCHIVE){\r
- extractFromProduct2(archives, er, et);\r
+ extractFromProduct(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
- ExtractionUnit unit = context.getExtractionUnit();\r
-\r
- BirthmarkSet[] extractResult = null;\r
- if(unit == ExtractionUnit.CLASS){\r
- extractResult = extractFromClass(archives, extractors, environment);\r
- }\r
- else if(unit == ExtractionUnit.PACKAGE){\r
- extractResult = extractFromPackage(archives, extractors, environment);\r
- }\r
- else if(unit == ExtractionUnit.ARCHIVE){\r
- extractResult = extractFromProduct(archives, extractors, environment);\r
- }\r
-\r
- return extractResult;\r
- }\r
-\r
- private BirthmarkExtractor[] createExtractors(String[] birthmarkTypes, BirthmarkEnvironment environment){\r
- List<BirthmarkExtractor> list = new ArrayList<BirthmarkExtractor>();\r
- for(String type: birthmarkTypes){\r
- BirthmarkExtractor extractor = createExtractor(type, environment);\r
- list.add(extractor);\r
- }\r
- return list.toArray(new BirthmarkExtractor[list.size()]);\r
- }\r
-\r
- @SuppressWarnings("unchecked")\r
- private BirthmarkExtractor createExtractor(String birthmarkType, BirthmarkEnvironment environment){\r
- BirthmarkSpi spi = environment.getService(birthmarkType);\r
- BirthmarkExtractor extractor = null;\r
- if(spi != null){\r
- extractor = spi.getExtractor();\r
- try{\r
- if(extractor != null){\r
- Map props = BeanUtils.describe(extractor);\r
- props.remove("class");\r
- props.remove("provider");\r
- for(Object keyObject: props.keySet()){\r
- String key = "extractor." + spi.getType() + "." + String.valueOf(keyObject);\r
- if(environment.getProperty(key) != null){\r
- BeanUtils.setProperty(\r
- extractor, (String)keyObject, environment.getProperty(key)\r
- );\r
- }\r
- }\r
- }\r
- } catch(InvocationTargetException e){\r
- throw new InternalError(e.getMessage());\r
- } catch(NoSuchMethodException e){\r
- throw new InternalError(e.getMessage());\r
- } catch(IllegalAccessException e){\r
- throw new InternalError(e.getMessage());\r
- }\r
- }\r
- if(extractor == null){\r
- warnings.addMessage(new ExtractorNotFoundException("extractor not found"), birthmarkType);\r
- }\r
-\r
- return extractor;\r
- }\r
-\r
private byte[] inputStreamToByteArray(InputStream in) throws IOException{\r
ByteArrayOutputStream bout = new ByteArrayOutputStream();\r
int read;\r
return data;\r
}\r
\r
- private void extractFromPackage2(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
+ private void extractFromPackage(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
}\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
- for(ClassFileArchive archive: archives){\r
- for(ClassFileEntry entry: archive){\r
- try{\r
- String name = entry.getClassName();\r
- String packageName = parsePackageName(name);\r
- BirthmarkSet bs = list.get(packageName);\r
- if(bs == null){\r
- bs = new BirthmarkSet(packageName, archive.getLocation());\r
- list.put(packageName, bs);\r
- }\r
-\r
- byte[] data = inputStreamToByteArray(entry.getLocation().openStream());\r
- for(BirthmarkExtractor extractor: extractors){\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), context);\r
- }\r
- }\r
- } catch(IOException e){\r
- warnings.addMessage(e, archive.getName());\r
- }\r
- }\r
- }\r
-\r
- return list.values().toArray(new BirthmarkSet[list.size()]);\r
- }\r
-\r
private String parsePackageName(String name){\r
String n = name.replace('/', '.');\r
int index = n.lastIndexOf('.');\r
return n;\r
}\r
\r
- private void extractFromClass2(ClassFileArchive[] archives, ExtractionResultSet er,\r
+ private void extractFromClass(ClassFileArchive[] archives, ExtractionResultSet er,\r
ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
BirthmarkContext context = er.getContext();\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
- for(ClassFileEntry entry: archive){\r
- try{\r
- BirthmarkSet birthmarkset = new BirthmarkSet(entry.getClassName(), entry.getLocation());\r
- list.add(birthmarkset);\r
- byte[] data = inputStreamToByteArray(entry.getLocation().openStream());\r
- for(BirthmarkExtractor extractor: extractors){\r
- if(extractor.isAcceptable(ExtractionUnit.CLASS)){\r
- Birthmark b = extractor.extract(new ByteArrayInputStream(data), context);\r
- birthmarkset.addBirthmark(b);\r
- }\r
- }\r
- } catch(IOException e){\r
- warnings.addMessage(e, entry.getClassName());\r
- }\r
- }\r
- }\r
- return list.toArray(new BirthmarkSet[list.size()]);\r
- }\r
-\r
- private void extractFromProduct2(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
+ private void extractFromProduct(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
BirthmarkContext context = er.getContext();\r
\r
for(ClassFileArchive archive: archives){\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
- for(ClassFileArchive archive: archives){\r
- BirthmarkSet birthmarkset = new BirthmarkSet(archive.getName(), archive.getLocation());\r
- list.add(birthmarkset);\r
-\r
- for(ClassFileEntry entry: archive){\r
- try{\r
- byte[] data = inputStreamToByteArray(entry.getLocation().openStream());\r
- for(BirthmarkExtractor extractor: extractors){\r
- if(extractor.isAcceptable(ExtractionUnit.ARCHIVE)){\r
- Birthmark b = birthmarkset.getBirthmark(extractor.getProvider().getType());\r
- if(b == null){\r
- b = extractor.createBirthmark();\r
- birthmarkset.addBirthmark(b);\r
- }\r
- extractor.extract(b, new ByteArrayInputStream(data), context);\r
- }\r
- }\r
- } catch(IOException e){\r
- warnings.addMessage(e, entry.getClassName());\r
- }\r
- }\r
- }\r
- for(Iterator<BirthmarkSet> i = list.iterator(); i.hasNext(); ){\r
- BirthmarkSet set = i.next();\r
- if(set.getBirthmarksCount() == 0){\r
- i.remove();\r
- }\r
- }\r
-\r
- return list.toArray(new BirthmarkSet[list.size()]);\r
- }\r
-\r
private ClassFileArchive[] createArchives(String[] files, BirthmarkEnvironment environment) throws IOException, MalformedURLException{\r
ClasspathContext bytecode = environment.getClasspathContext();\r
List<ClassFileArchive> archives = new ArrayList<ClassFileArchive>();\r