OSDN Git Service

add listener in order to notify birthmarking process start/end
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Fri, 13 Jul 2007 04:18:27 +0000 (04:18 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Fri, 13 Jul 2007 04:18:27 +0000 (04:18 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@163 acee48c3-7b26-0410-bdac-b3d0e5314bbc

16 files changed:
src/main/java/jp/naist/se/stigmata/Stigmata.java
src/main/java/jp/naist/se/stigmata/event/OperationAdapter.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/event/OperationEvent.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/event/OperationListener.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/event/OperationStage.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/event/OperationType.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/event/WarningMessages.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/reader/JarClassFileArchive.java
src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java
src/main/java/jp/naist/se/stigmata/ui/swing/mds/mark/RhombusDrawer.java
src/main/resources/resources/messages.properties
src/main/resources/resources/messages_ja.source
src/site/site.xml
src/test/java/jp/naist/se/stigmata/birthmarks/BirthmarkCompareTest.java
src/test/java/jp/naist/se/stigmata/birthmarks/cvfv/CVFVBirthmarkExtractorTest.java
src/test/java/jp/naist/se/stigmata/birthmarks/uc/UCBirthmarkExtractorTest.java

index 747a153..cbb523e 100644 (file)
@@ -18,10 +18,16 @@ import java.util.HashMap;
 import java.util.Iterator;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.Stack;\r
 import java.util.logging.Logger;\r
 \r
 import javax.imageio.spi.ServiceRegistry;\r
 \r
+import jp.naist.se.stigmata.event.OperationEvent;\r
+import jp.naist.se.stigmata.event.OperationListener;\r
+import jp.naist.se.stigmata.event.OperationStage;\r
+import jp.naist.se.stigmata.event.OperationType;\r
+import jp.naist.se.stigmata.event.WarningMessages;\r
 import jp.naist.se.stigmata.filter.ComparisonPairFilterManager;\r
 import jp.naist.se.stigmata.filter.FilteredComparisonResultSet;\r
 import jp.naist.se.stigmata.reader.ClassFileArchive;\r
@@ -46,6 +52,9 @@ public final class Stigmata{
 \r
     private BirthmarkContext defaultContext = BirthmarkContext.getDefaultContext();\r
     private boolean configDone = false;\r
+    private Stack<WarningMessages> stack = new Stack<WarningMessages>();\r
+    private WarningMessages warnings;\r
+    private List<OperationListener> listeners = new ArrayList<OperationListener>();\r
 \r
     private Stigmata(){\r
     }\r
@@ -54,8 +63,22 @@ public final class Stigmata{
         return instance;\r
     }\r
 \r
+    public void addOperationListener(OperationListener listener){\r
+        listeners.add(listener);\r
+    }\r
+\r
+    public void removeOperationListener(OperationListener listener){\r
+        listeners.remove(listener);\r
+    }\r
+\r
+    public WarningMessages getWarnings(){\r
+        return warnings;\r
+    }\r
+\r
     public void configuration(){\r
+        operationStart(OperationType.CONFIGURATION);\r
         configuration(null);\r
+        operationDone(OperationType.CONFIGURATION);\r
     }\r
 \r
     public void configuration(String filePath){\r
@@ -95,193 +118,73 @@ public final class Stigmata{
      * create a new {@link BirthmarkContext <code>BirthmarkContext</code>}.\r
      */\r
     public BirthmarkContext createContext(){\r
-        if(!configDone){\r
-            configuration();\r
-        }\r
-        return new BirthmarkContext();\r
+        operationStart(OperationType.CREATE_CONTEXT);\r
+        BirthmarkContext context = new BirthmarkContext();\r
+        operationDone(OperationType.EXTRACT_BIRTHMARKS);\r
+        return context;\r
     }\r
 \r
     public BirthmarkSet[] extract(String[] birthmarks, String[] files) throws BirthmarkExtractionException{\r
-        if(!configDone){\r
-            configuration();\r
-        }\r
-        return extract(birthmarks, files, createContext());\r
+        operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
+        BirthmarkSet[] set = extract(birthmarks, files, createContext());\r
+        operationDone(OperationType.EXTRACT_BIRTHMARKS);\r
+\r
+        return set;\r
     }\r
 \r
     public BirthmarkSet[] extract(String[] birthmarks, String[] files,\r
                                   BirthmarkContext context) throws BirthmarkExtractionException{\r
-        if(!configDone){\r
-            configuration();\r
-        }\r
+        operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
         try{\r
             return extractImpl(birthmarks, files, context);\r
         } catch(IOException e){\r
-               throw new BirthmarkExtractionException(e);\r
-        }\r
-    }\r
-\r
-    private BirthmarkSet[] extractImpl(String[] birthmarks, String[] files, BirthmarkContext context) throws IOException, BirthmarkExtractionException{\r
-        ClassFileArchive[] archives = createArchives(files, context);\r
-        BirthmarkExtractor[] extractors = createExtractors(birthmarks, context);\r
-        ExtractionUnit unit = context.getExtractionUnit();\r
-        \r
-        if(unit == ExtractionUnit.CLASS){\r
-            return extractFromClass(archives, extractors, context);\r
-        }\r
-        else if(unit == ExtractionUnit.PACKAGE){\r
-            return extractFromPackage(archives, extractors, context);\r
-        }\r
-        else if(unit == ExtractionUnit.ARCHIVE){\r
-            return extractFromProduct(archives, extractors, context);\r
-        }\r
-        return null;\r
-    }\r
-\r
-    private BirthmarkSet[] extractFromPackage(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkContext context) throws IOException, BirthmarkExtractionException{\r
-        Map<String, BirthmarkSet> list = new HashMap<String, BirthmarkSet>();\r
-        \r
-        for(ClassFileArchive archive: archives){\r
-            for(ClassFileEntry entry: archive){\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
-            }\r
-        }\r
-\r
-        BirthmarkSet[] bslist = new BirthmarkSet[list.size()];\r
-        int index = 0;\r
-        for(BirthmarkSet bs: list.values()){\r
-            bslist[index] = bs;\r
-            index++;\r
-        }\r
-        return bslist;\r
-    }\r
-\r
-    private String parsePackageName(String name){\r
-        String n = name.replace('/', '.');\r
-        int index = n.lastIndexOf('.');\r
-        if(index > 0){\r
-            n = n.substring(0, index - 1);\r
-        }\r
-\r
-        return n;\r
-    }\r
-\r
-    private BirthmarkSet[] extractFromClass(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkContext context) throws IOException, BirthmarkExtractionException{\r
-        List<BirthmarkSet> list = new ArrayList<BirthmarkSet>();\r
-\r
-        for(ClassFileArchive archive: archives){\r
-            for(ClassFileEntry entry: archive){\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
-            }\r
+            throw new BirthmarkExtractionException(e);\r
+        } finally{\r
+            operationDone(OperationType.EXTRACT_BIRTHMARKS);\r
         }\r
-        return list.toArray(new BirthmarkSet[list.size()]);\r
-    }\r
-\r
-    private BirthmarkSet[] extractFromProduct(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkContext context) throws IOException, BirthmarkExtractionException{\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
-                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
-            }\r
-        }\r
-\r
-        return list.toArray(new BirthmarkSet[list.size()]);\r
-    }\r
-\r
-    private ClassFileArchive[] createArchives(String[] files, BirthmarkContext context) throws IOException, MalformedURLException{\r
-        ClasspathContext bytecode = context.getClasspathContext();\r
-        List<ClassFileArchive> archives = new ArrayList<ClassFileArchive>();\r
-        for(int i = 0; i < files.length; i++){\r
-            if(files[i].endsWith(".class")){\r
-                archives.add(new DefaultClassFileArchive(files[i]));\r
-            }\r
-            else if(files[i].endsWith(".jar") || files[i].endsWith(".zip")){\r
-                archives.add(new JarClassFileArchive(files[i]));\r
-                bytecode.addClasspath(new File(files[i]).toURI().toURL());\r
-            }\r
-            else if(files[i].endsWith(".war")){\r
-                archives.add(new WarClassFileArchive(files[i]));\r
-            }\r
-        }\r
-        return archives.toArray(new ClassFileArchive[archives.size()]);\r
     }\r
 \r
     public ComparisonResultSet compare(BirthmarkSet[] holders) throws IOException{\r
-        if(!configDone){\r
-            configuration();\r
-        }\r
-        return compare(holders, createContext());\r
+        operationStart(OperationType.COMPARE_BIRTHMARKS);\r
+        ComparisonResultSet crs = compare(holders, createContext());\r
+        operationDone(OperationType.COMPARE_BIRTHMARKS);\r
+\r
+        return crs;\r
     }\r
 \r
     public ComparisonResultSet compare(BirthmarkSet[] holders, BirthmarkContext context) throws IOException{\r
-        if(!configDone){\r
-            configuration();\r
-        }\r
+        operationStart(OperationType.COMPARE_BIRTHMARKS);\r
         ComparisonResultSet result = new RoundRobinComparisonResultSet(holders, context, true);\r
+        operationDone(OperationType.COMPARE_BIRTHMARKS);\r
 \r
         return result;\r
     }\r
 \r
     public ComparisonResultSet compare(BirthmarkSet[] holders1, BirthmarkSet[] holders2) throws IOException{\r
-        if(!configDone){\r
-            configuration();\r
-        }\r
-        return compare(holders1, holders2, createContext());\r
+        operationStart(OperationType.COMPARE_BIRTHMARKS);\r
+        ComparisonResultSet crs = compare(holders1, holders2, createContext());\r
+        operationDone(OperationType.COMPARE_BIRTHMARKS);\r
+        return crs;\r
     }\r
 \r
     public ComparisonResultSet compare(BirthmarkSet[] holders1, BirthmarkSet[] holders2, BirthmarkContext context) throws IOException{\r
-        if(!configDone){\r
-            configuration();\r
-        }\r
+        operationStart(OperationType.COMPARE_BIRTHMARKS);\r
         ComparisonResultSet result = new RoundRobinComparisonResultSet(holders1, holders2, context);\r
+        operationDone(OperationType.COMPARE_BIRTHMARKS);\r
 \r
         return result;\r
     }\r
 \r
     public ComparisonResultSet filter(ComparisonResultSet resultset, String[] filters){\r
-        return filter(resultset, filters, createContext());\r
+        operationStart(OperationType.FILTER_BIRTHMARKS);\r
+        ComparisonResultSet crs = filter(resultset, filters, createContext());\r
+        operationDone(OperationType.FILTER_BIRTHMARKS);\r
+\r
+        return crs;\r
     }\r
 \r
     public ComparisonResultSet filter(ComparisonResultSet resultset, String[] filters, BirthmarkContext context){\r
+        operationStart(OperationType.FILTER_BIRTHMARKS);\r
         if(filters != null){\r
             List<ComparisonPairFilterSet> filterList = new ArrayList<ComparisonPairFilterSet>();\r
             ComparisonPairFilterManager manager = context.getFilterManager();\r
@@ -298,30 +201,35 @@ public final class Stigmata{
 \r
             return filter(resultset, filterList.toArray(new ComparisonPairFilterSet[filterList.size()]));\r
         }\r
+        operationDone(OperationType.FILTER_BIRTHMARKS);\r
         return resultset;\r
     }\r
 \r
     public ComparisonResultSet filter(ComparisonResultSet resultset, ComparisonPairFilterSet[] filters){\r
-        return filter(resultset, filters, createContext());\r
+        operationStart(OperationType.FILTER_BIRTHMARKS);\r
+        ComparisonResultSet crs = filter(resultset, filters, createContext());\r
+        operationDone(OperationType.FILTER_BIRTHMARKS);\r
+\r
+        return crs;\r
     }\r
 \r
     public ComparisonResultSet filter(ComparisonResultSet resultset, ComparisonPairFilterSet[] filters, BirthmarkContext context){\r
+        operationStart(OperationType.FILTER_BIRTHMARKS);\r
         FilteredComparisonResultSet filterResultSet = new FilteredComparisonResultSet(resultset);\r
-        \r
+        operationDone(OperationType.FILTER_BIRTHMARKS);\r
+\r
         return filterResultSet;\r
     }\r
 \r
-    public double compare(BirthmarkSet h1, BirthmarkSet h2){\r
-        if(!configDone){\r
-            configuration();\r
-        }\r
-        return compare(h1, h2, createContext());\r
+    public double compareDetails(BirthmarkSet h1, BirthmarkSet h2){\r
+        operationStart(OperationType.COMPARE_DETAIL_BIRTHMARKS);\r
+        double similarity = compareDetails(h1, h2, createContext());\r
+        operationDone(OperationType.COMPARE_DETAIL_BIRTHMARKS);\r
+        return similarity;\r
     }\r
 \r
-    public double compare(BirthmarkSet h1, BirthmarkSet h2, BirthmarkContext context){\r
-        if(!configDone){\r
-            configuration();\r
-        }\r
+    public double compareDetails(BirthmarkSet h1, BirthmarkSet h2, BirthmarkContext context){\r
+        operationStart(OperationType.COMPARE_DETAIL_BIRTHMARKS);\r
 \r
         List<Double> list = new ArrayList<Double>();\r
         int count = 0;\r
@@ -347,6 +255,7 @@ public final class Stigmata{
                 similarity += d.doubleValue();\r
             }\r
         }\r
+        operationDone(OperationType.COMPARE_DETAIL_BIRTHMARKS);\r
         return similarity / count;\r
     }\r
 \r
@@ -411,4 +320,187 @@ public final class Stigmata{
         }\r
         configDone = true;\r
     }\r
+\r
+    private void operationStart(OperationType type){\r
+        if(type != OperationType.CONFIGURATION && !configDone){\r
+            configuration();\r
+        }\r
+        if(warnings == null){\r
+            warnings = new WarningMessages(type);\r
+            fireEvent(new OperationEvent(OperationStage.OPERATION_START, type, warnings));\r
+        }\r
+        stack.push(warnings);\r
+        fireEvent(new OperationEvent(OperationStage.SUB_OPERATION_START, type, warnings));\r
+    }\r
+\r
+    private void operationDone(OperationType type){\r
+        fireEvent(new OperationEvent(OperationStage.SUB_OPERATION_DONE, type, warnings));\r
+        stack.pop();\r
+        if(stack.size() == 0){\r
+            fireEvent(new OperationEvent(OperationStage.OPERATION_DONE, type, warnings));\r
+            warnings = null;\r
+        }\r
+    }\r
+\r
+    private void fireEvent(OperationEvent e){\r
+        for(OperationListener listener: listeners){\r
+            switch(e.getStage()){\r
+            case OPERATION_START:\r
+                listener.operationStart(e);\r
+                break;\r
+            case SUB_OPERATION_START:\r
+                listener.subOperationStart(e);\r
+                break;\r
+            case SUB_OPERATION_DONE:\r
+                listener.subOperationDone(e);\r
+                break;\r
+            case OPERATION_DONE:\r
+                listener.operationDone(e);\r
+                break;\r
+            default:\r
+                throw new InternalError("unknown stage: " + e.getStage());\r
+            }\r
+        }\r
+    }\r
+\r
+    private BirthmarkSet[] extractImpl(String[] birthmarks, String[] files, BirthmarkContext context) throws IOException, BirthmarkExtractionException{\r
+        ClassFileArchive[] archives = createArchives(files, context);\r
+        BirthmarkExtractor[] extractors = createExtractors(birthmarks, context);\r
+        ExtractionUnit unit = context.getExtractionUnit();\r
+\r
+        if(unit == ExtractionUnit.CLASS){\r
+            return extractFromClass(archives, extractors, context);\r
+        }\r
+        else if(unit == ExtractionUnit.PACKAGE){\r
+            return extractFromPackage(archives, extractors, context);\r
+        }\r
+        else if(unit == ExtractionUnit.ARCHIVE){\r
+            return extractFromProduct(archives, extractors, context);\r
+        }\r
+        return null;\r
+    }\r
+\r
+    private BirthmarkSet[] extractFromPackage(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkContext context) throws IOException, BirthmarkExtractionException{\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
+        if(index > 0){\r
+            n = n.substring(0, index - 1);\r
+        }\r
+\r
+        return n;\r
+    }\r
+\r
+    private BirthmarkSet[] extractFromClass(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkContext context) throws IOException, BirthmarkExtractionException{\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 BirthmarkSet[] extractFromProduct(ClassFileArchive[] archives, BirthmarkExtractor[] extractors, BirthmarkContext context) throws IOException, BirthmarkExtractionException{\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, BirthmarkContext context) throws IOException, MalformedURLException{\r
+        ClasspathContext bytecode = context.getClasspathContext();\r
+        List<ClassFileArchive> archives = new ArrayList<ClassFileArchive>();\r
+        for(int i = 0; i < files.length; i++){\r
+            try{\r
+                if(files[i].endsWith(".class")){\r
+                    archives.add(new DefaultClassFileArchive(files[i]));\r
+                }\r
+                else if(files[i].endsWith(".jar") || files[i].endsWith(".zip")){\r
+                    archives.add(new JarClassFileArchive(files[i]));\r
+                    bytecode.addClasspath(new File(files[i]).toURI().toURL());\r
+                }\r
+                else if(files[i].endsWith(".war")){\r
+                    archives.add(new WarClassFileArchive(files[i]));\r
+                }\r
+            } catch(IOException e){\r
+                warnings.addMessage(e, files[i]);\r
+            }\r
+        }\r
+        return archives.toArray(new ClassFileArchive[archives.size()]);\r
+    }\r
 }\r
diff --git a/src/main/java/jp/naist/se/stigmata/event/OperationAdapter.java b/src/main/java/jp/naist/se/stigmata/event/OperationAdapter.java
new file mode 100755 (executable)
index 0000000..b809031
--- /dev/null
@@ -0,0 +1,24 @@
+package jp.naist.se.stigmata.event;\r
+\r
+/*\r
+ * $Id$\r
+ */\r
+\r
+/**\r
+ * @author Haruaki Tamada\r
+ * @version $Revision$ $Date$\r
+ */\r
+public class OperationAdapter implements OperationListener{\r
+\r
+    public void operationDone(OperationEvent e){\r
+    }\r
+\r
+    public void operationStart(OperationEvent e){\r
+    }\r
+\r
+    public void subOperationDone(OperationEvent e){\r
+    }\r
+\r
+    public void subOperationStart(OperationEvent e){\r
+    }\r
+}\r
diff --git a/src/main/java/jp/naist/se/stigmata/event/OperationEvent.java b/src/main/java/jp/naist/se/stigmata/event/OperationEvent.java
new file mode 100755 (executable)
index 0000000..2d78180
--- /dev/null
@@ -0,0 +1,30 @@
+package jp.naist.se.stigmata.event;\r
+\r
+import java.util.EventObject;\r
+\r
+public class OperationEvent extends EventObject{\r
+    private static final long serialVersionUID = -1260793588721638917L;\r
+\r
+    private OperationType type;\r
+    private OperationStage stage;\r
+    private WarningMessages message;\r
+\r
+    public OperationEvent(OperationStage stage, OperationType type, WarningMessages message){\r
+        super(type.ordinal());\r
+        this.type = type;\r
+        this.stage = stage;\r
+        this.message = message;\r
+    }\r
+\r
+    public OperationStage getStage(){\r
+        return stage;\r
+    }\r
+\r
+    public OperationType getType(){\r
+        return type;\r
+    }\r
+\r
+    public WarningMessages getMessage(){\r
+        return message;\r
+    }\r
+}\r
diff --git a/src/main/java/jp/naist/se/stigmata/event/OperationListener.java b/src/main/java/jp/naist/se/stigmata/event/OperationListener.java
new file mode 100755 (executable)
index 0000000..954f5b6
--- /dev/null
@@ -0,0 +1,13 @@
+package jp.naist.se.stigmata.event;\r
+\r
+import java.util.EventListener;\r
+\r
+public interface OperationListener extends EventListener{\r
+    public void operationStart(OperationEvent e);\r
+\r
+    public void subOperationStart(OperationEvent e);\r
+\r
+    public void subOperationDone(OperationEvent e);\r
+\r
+    public void operationDone(OperationEvent e);\r
+}\r
diff --git a/src/main/java/jp/naist/se/stigmata/event/OperationStage.java b/src/main/java/jp/naist/se/stigmata/event/OperationStage.java
new file mode 100755 (executable)
index 0000000..845d423
--- /dev/null
@@ -0,0 +1,8 @@
+package jp.naist.se.stigmata.event;\r
+\r
+public enum OperationStage{\r
+    OPERATION_START,\r
+    SUB_OPERATION_START,\r
+    SUB_OPERATION_DONE,\r
+    OPERATION_DONE,\r
+}\r
diff --git a/src/main/java/jp/naist/se/stigmata/event/OperationType.java b/src/main/java/jp/naist/se/stigmata/event/OperationType.java
new file mode 100755 (executable)
index 0000000..17abb2f
--- /dev/null
@@ -0,0 +1,10 @@
+package jp.naist.se.stigmata.event;\r
+\r
+public enum OperationType{\r
+    CONFIGURATION,\r
+    EXTRACT_BIRTHMARKS,\r
+    COMPARE_BIRTHMARKS,\r
+    COMPARE_DETAIL_BIRTHMARKS,\r
+    FILTER_BIRTHMARKS,\r
+    CREATE_CONTEXT,\r
+}\r
diff --git a/src/main/java/jp/naist/se/stigmata/event/WarningMessages.java b/src/main/java/jp/naist/se/stigmata/event/WarningMessages.java
new file mode 100755 (executable)
index 0000000..5413cf4
--- /dev/null
@@ -0,0 +1,47 @@
+package jp.naist.se.stigmata.event;\r
+\r
+/*\r
+ * $Id$\r
+ */\r
+\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.Map;\r
+\r
+/**\r
+ * \r
+ * @author Haruaki Tamada\r
+ * @version $Revision$ $Date$\r
+ */\r
+public class WarningMessages{\r
+    private OperationType type;\r
+    private Map<Exception, String> messages = new HashMap<Exception, String>();\r
+\r
+    public WarningMessages(OperationType type){\r
+        this.type = type;\r
+    }\r
+\r
+    public void addMessage(Exception e, String string){\r
+        messages.put(e, string);\r
+    }\r
+\r
+    public Iterator<Exception> exceptions(){\r
+        return messages.keySet().iterator();\r
+    }\r
+\r
+    public String getString(Exception e){\r
+        return messages.get(e);\r
+    }\r
+\r
+    public OperationType getType(){\r
+        return type;\r
+    }\r
+\r
+    public void setType(OperationType type){\r
+        this.type = type;\r
+    }\r
+\r
+    public int getWarningCount(){\r
+        return messages.size();\r
+    }\r
+}\r
index dc2f63f..3e96860 100644 (file)
@@ -25,7 +25,7 @@ public class JarClassFileArchive implements ClassFileArchive{
     private File file;\r
     private JarFile jarfile;\r
     private URL jarfileLocation;\r
-    \r
+\r
     public JarClassFileArchive(String jarfile) throws IOException{\r
         this.file = new File(jarfile);\r
         this.jarfile = new JarFile(jarfile);\r
index 8e5513c..1743836 100644 (file)
@@ -14,6 +14,7 @@ import java.io.IOException;
 import java.io.PrintWriter;\r
 import java.io.StringWriter;\r
 import java.util.HashMap;\r
+import java.util.Iterator;\r
 import java.util.Map;\r
 \r
 import javax.swing.ButtonGroup;\r
@@ -46,6 +47,9 @@ import jp.naist.se.stigmata.ComparisonPair;
 import jp.naist.se.stigmata.ComparisonPairFilterSet;\r
 import jp.naist.se.stigmata.ComparisonResultSet;\r
 import jp.naist.se.stigmata.Stigmata;\r
+import jp.naist.se.stigmata.event.OperationAdapter;\r
+import jp.naist.se.stigmata.event.OperationEvent;\r
+import jp.naist.se.stigmata.event.WarningMessages;\r
 import jp.naist.se.stigmata.filter.FilteredComparisonResultSet;\r
 import jp.naist.se.stigmata.ui.swing.actions.AboutAction;\r
 import jp.naist.se.stigmata.ui.swing.actions.LicenseAction;\r
@@ -72,11 +76,7 @@ public class StigmataFrame extends JFrame{
     private Map<String, Integer> countmap = new HashMap<String, Integer>();\r
 \r
     public StigmataFrame(){\r
-        stigmata = Stigmata.getInstance();\r
-        context = stigmata.createContext();\r
-        fileio = new FileIOManager(this);\r
-\r
-        initLayouts();\r
+        this(Stigmata.getInstance());\r
     }\r
 \r
     public StigmataFrame(Stigmata stigmata){\r
@@ -88,6 +88,13 @@ public class StigmataFrame extends JFrame{
         this.context = context;\r
         this.fileio = new FileIOManager(this);\r
 \r
+        stigmata.addOperationListener(new OperationAdapter(){\r
+            @Override\r
+            public void operationDone(OperationEvent e){\r
+                showWarnings(e.getMessage());\r
+            }\r
+        });\r
+\r
         initLayouts();\r
     }\r
 \r
@@ -354,6 +361,24 @@ public class StigmataFrame extends JFrame{
         setSize(900, 600);\r
     }\r
 \r
+    private void showWarnings(WarningMessages warnings){\r
+        if(warnings.getWarningCount() > 0){\r
+            StringBuilder sb = new StringBuilder("<html><body><dl>");\r
+            for(Iterator<Exception> i = warnings.exceptions(); i.hasNext(); ){\r
+                Exception e = i.next();\r
+                sb.append("<dt>").append(e.getClass().getName()).append("</dt>");\r
+                sb.append("<dd>").append(e.getMessage()).append("</dd>");\r
+                sb.append("<dd>").append(warnings.getString(e)).append("</dd>");\r
+            }\r
+            sb.append("</dl></body></html>");\r
+\r
+            JOptionPane.showMessageDialog(\r
+                this, new String(sb), Messages.getString("warning.dialog.title"),\r
+                JOptionPane.WARNING_MESSAGE\r
+            );\r
+        }\r
+    }\r
+\r
     private void initComponents(){\r
         setDefaultUI();\r
         JMenuBar menubar = new JMenuBar();\r
index e75d158..17811f3 100644 (file)
@@ -45,8 +45,8 @@ class RhombusDrawer extends AbstractMarkDrawer{
         GeneralPath path = new GeneralPath();\r
         path.moveTo(ww,     0);\r
         path.lineTo(0,      hh);\r
-        path.lineTo(ww,     h - 1f);\r
-        path.lineTo(w - 1f, hh);\r
+        path.lineTo(ww,     h);\r
+        path.lineTo(w,      hh);\r
         path.lineTo(ww,     0);\r
 \r
         return path;\r
index 6a59f83..b33efab 100755 (executable)
@@ -285,7 +285,7 @@ similarity.border=Similarity
 elementcount.border=Element count\r
 comparisoncount.border=Comparison count\r
 matchcount.border=Match count\r
-numberofclasses.border=\# of classes\r
+numberofclasses.border=\# of units\r
 distinctionratio.border=Distinction ratio\r
 average.border=Average\r
 minimum.border=Minimum\r
@@ -479,6 +479,7 @@ target.TARGET_2=target 2
 target.BOTH_TARGET=target 1 and target 2\r
 target.ONE_OF_TARGET=target 1 or target 2\r
 \r
+warning.dialog.title=Warnings\r
 error.dialog.title=Error\r
 error.message.classpath=<html><body><p>Failed proccessed operation because following classes did not found.<br>Please examine your classpath settings at ``Control'' tab.</p></body></html>\r
 error.message.contactus=<html><body><p>Failed proccessed operation because following exception.<br>Please report to developer with following error messages.</p></body></html>\r
index 2fe3b54..bc1aa75 100755 (executable)
@@ -198,7 +198,7 @@ similarity.border=
 elementcount.border=\83o\81[\83X\83}\81[\83N\82Ì\97v\91f\90\94\r
 comparisoncount.border=\94ä\8ar\89ñ\90\94\r
 matchcount.border=\97v\91f\82Ì\88ê\92v\89ñ\90\94\r
-numberofclasses.border=\83N\83\89\83X\90\94\r
+numberofclasses.border=\83\86\83j\83b\83g\90\94(\83N\83\89\83X\81C\83p\83b\83P\81[\83W\81C\83v\83\8d\83_\83N\83g)\r
 distinctionratio.border=\8e¯\95Ê\97¦\r
 average.border=\95½\8bÏ\r
 minimum.border=\8dÅ\8f¬\r
index d73ae1a..c03c3c2 100755 (executable)
 
     <menu name="Stigmata">
       <item name="Introduction"        href="index.html"/>
-      <item name="Tutorial"            href="tutorial.html"/>
       <item name="Download"            href="download.html" />
-      <item name="Definition"          href="definition.html" />
-      <item name="DTD"                 href="dtd.html" />
-      <item name="FAQ"                 href="faq.html"/>
-      <item name="Survey"              href="survey.html"/>
       <item name="License"             href="license.html"/>
+      <item name="Tutorial"            href="tutorial.html"/>
       <item name="Tutorial (pdf)"      href="tutorial.pdf"/>
+      <item name="FAQ"                 href="faq.html"/>
+      <item name="DTD"                 href="dtd.html" />
+      <item name="Definition"          href="definition.html" />
+      <item name="Survey"              href="survey.html"/>
       <item name="Project Page"        href="http://sourceforge.jp/projects/stigmata/"/>
     </menu>
 
index 6dcf812..c3e5f84 100755 (executable)
@@ -28,8 +28,8 @@ public class BirthmarkCompareTest{
     public void equalsTest() throws Exception{\r
         Assert.assertEquals(3, birthmarks.length);\r
 \r
-        Assert.assertEquals(1d, stigmata.compare(birthmarks[0], birthmarks[0]), 1E-6);\r
-        Assert.assertEquals(1d, stigmata.compare(birthmarks[1], birthmarks[1]), 1E-6);\r
-        Assert.assertEquals(1d, stigmata.compare(birthmarks[2], birthmarks[2]), 1E-6);\r
+        Assert.assertEquals(1d, stigmata.compareDetails(birthmarks[0], birthmarks[0]), 1E-6);\r
+        Assert.assertEquals(1d, stigmata.compareDetails(birthmarks[1], birthmarks[1]), 1E-6);\r
+        Assert.assertEquals(1d, stigmata.compareDetails(birthmarks[2], birthmarks[2]), 1E-6);\r
     }\r
 }\r
index 524258c..c777414 100755 (executable)
@@ -38,7 +38,7 @@ public class CVFVBirthmarkExtractorTest{
 \r
         Birthmark birthmark = array[0].getBirthmark("cvfv");\r
         Assert.assertEquals("cvfv", birthmark.getType());\r
-        Assert.assertEquals(3, birthmark.getElementCount());\r
+        Assert.assertEquals(7, birthmark.getElementCount());\r
 \r
         BirthmarkElement[] elements = birthmark.getElements();\r
         Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
@@ -47,6 +47,14 @@ public class CVFVBirthmarkExtractorTest{
                             elements[1].getClass().getName());\r
         Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
                             elements[2].getClass().getName());\r
+        Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
+                            elements[3].getClass().getName());\r
+        Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
+                            elements[4].getClass().getName());\r
+        Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
+                            elements[5].getClass().getName());\r
+        Assert.assertEquals("jp.naist.se.stigmata.birthmarks.cvfv.TypeAndValueBirthmarkElement",\r
+                            elements[6].getClass().getName());\r
 \r
         Assert.assertEquals("Ljp/naist/se/stigmata/Stigmata;",\r
                             ((TypeAndValueBirthmarkElement)elements[0]).getSignature());\r
@@ -56,6 +64,14 @@ public class CVFVBirthmarkExtractorTest{
         Assert.assertEquals(null, ((TypeAndValueBirthmarkElement)elements[1]).getValue());\r
         Assert.assertEquals("Z",   ((TypeAndValueBirthmarkElement)elements[2]).getSignature());\r
         Assert.assertEquals(0,     ((TypeAndValueBirthmarkElement)elements[2]).getValue());\r
+\r
+        Assert.assertEquals("Ljava/util/Stack;", ((TypeAndValueBirthmarkElement)elements[3]).getSignature());\r
+        Assert.assertNull(((TypeAndValueBirthmarkElement)elements[3]).getValue());\r
+        Assert.assertEquals("Ljp/naist/se/stigmata/event/WarningMessages;",\r
+                            ((TypeAndValueBirthmarkElement)elements[4]).getSignature());\r
+        Assert.assertNull(((TypeAndValueBirthmarkElement)elements[4]).getValue());\r
+        Assert.assertEquals("Ljava/util/List;", ((TypeAndValueBirthmarkElement)elements[5]).getSignature());\r
+        Assert.assertNull(((TypeAndValueBirthmarkElement)elements[5]).getValue());\r
     }\r
 \r
     @Test\r
index 4ef9862..6293cd3 100755 (executable)
@@ -38,7 +38,7 @@ public class UCBirthmarkExtractorTest{
 \r
         Birthmark birthmark = array[0].getBirthmark("uc");\r
         Assert.assertEquals("uc", birthmark.getType());\r
-        Assert.assertEquals(23, birthmark.getElementCount());\r
+        Assert.assertEquals(24, birthmark.getElementCount());\r
 \r
         BirthmarkElement[] elements = birthmark.getElements();\r
         int index = 0;\r
@@ -62,6 +62,7 @@ public class UCBirthmarkExtractorTest{
         Assert.assertEquals("java.util.List",                              elements[index++].getValue());\r
         Assert.assertEquals("java.util.Map",                               elements[index++].getValue());\r
         Assert.assertEquals("java.util.Set",                               elements[index++].getValue());\r
+        Assert.assertEquals("java.util.Stack",                             elements[index++].getValue());\r
         Assert.assertEquals("java.util.logging.Logger",                    elements[index++].getValue());\r
         Assert.assertEquals("javax.imageio.spi.ServiceRegistry",           elements[index++].getValue());\r
         Assert.assertEquals("org.apache.commons.beanutils.BeanUtils",      elements[index++].getValue());\r