OSDN Git Service

change internal process method, which introducing ExtractionResultSet
[stigmata/stigmata.git] / src / main / java / jp / naist / se / stigmata / BirthmarkEngine.java
index 846fa5e..b690a57 100755 (executable)
@@ -18,6 +18,7 @@ import java.util.List;
 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
@@ -31,6 +32,9 @@ import jp.naist.se.stigmata.reader.ClasspathContext;
 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
@@ -47,13 +51,15 @@ public class BirthmarkEngine{
     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
@@ -68,8 +74,8 @@ public class BirthmarkEngine{
         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
@@ -79,28 +85,28 @@ public class BirthmarkEngine{
         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
@@ -123,11 +129,15 @@ public class BirthmarkEngine{
         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
@@ -137,38 +147,33 @@ public class BirthmarkEngine{
     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
@@ -176,23 +181,57 @@ public class BirthmarkEngine{
         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
@@ -201,11 +240,12 @@ public class BirthmarkEngine{
                 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
@@ -232,6 +272,25 @@ public class BirthmarkEngine{
         }\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
@@ -292,7 +351,7 @@ public class BirthmarkEngine{
             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
@@ -308,6 +367,47 @@ public class BirthmarkEngine{
         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
@@ -352,7 +452,37 @@ public class BirthmarkEngine{
         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
@@ -375,6 +505,40 @@ public class BirthmarkEngine{
         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