OSDN Git Service

enable extraction resultset storing to xml file
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Thu, 4 Oct 2007 06:17:52 +0000 (06:17 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Thu, 4 Oct 2007 06:17:52 +0000 (06:17 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@233 acee48c3-7b26-0410-bdac-b3d0e5314bbc

39 files changed:
pom.xml
src/main/java/jp/naist/se/stigmata/BirthmarkEngine.java
src/main/java/jp/naist/se/stigmata/BirthmarkStoreException.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/BirthmarkStoreTarget.java
src/main/java/jp/naist/se/stigmata/ExtractionResultSet.java
src/main/java/jp/naist/se/stigmata/Main.java
src/main/java/jp/naist/se/stigmata/birthmarks/AbstractBirthmarkService.java
src/main/java/jp/naist/se/stigmata/birthmarks/FrequencyBirthmarkElement.java
src/main/java/jp/naist/se/stigmata/birthmarks/cvfv/ConstantValueOfFieldVariableBirthmarkExtractVisitor.java
src/main/java/jp/naist/se/stigmata/birthmarks/cvfv/ConstantValueOfFieldVariableBirthmarkService.java
src/main/java/jp/naist/se/stigmata/birthmarks/cvfv/TypeAndValueBirthmarkElement.java
src/main/java/jp/naist/se/stigmata/birthmarks/fmc/FrequencyMethodCallBirthmarkService.java
src/main/java/jp/naist/se/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkExtractor.java
src/main/java/jp/naist/se/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkService.java
src/main/java/jp/naist/se/stigmata/birthmarks/kgram/KGramBasedBirthmarkExtractVisitor.java
src/main/java/jp/naist/se/stigmata/birthmarks/kgram/KGramBasedBirthmarkService.java
src/main/java/jp/naist/se/stigmata/birthmarks/smc/SequentialMethodCallBirthmarkService.java
src/main/java/jp/naist/se/stigmata/format/xml/BirthmarkComparisonResultXmlFormat.java
src/main/java/jp/naist/se/stigmata/format/xml/BirthmarkExtractionListXmlFormat.java
src/main/java/jp/naist/se/stigmata/format/xml/BirthmarkServiceListXmlFormat.java
src/main/java/jp/naist/se/stigmata/result/AbstractComparisonResultSet.java
src/main/java/jp/naist/se/stigmata/result/AbstractExtractionResultSet.java
src/main/java/jp/naist/se/stigmata/result/CertainPairComparisonResultSet.java
src/main/java/jp/naist/se/stigmata/result/ExtractionResultSetFactory.java
src/main/java/jp/naist/se/stigmata/result/MemoryExtractionResultSet.java
src/main/java/jp/naist/se/stigmata/result/SingleExtractionResultSet.java
src/main/java/jp/naist/se/stigmata/result/XmlFileExtractionResultSet.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/spi/BirthmarkSpi.java
src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkTreeNode.java
src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/RoundRobinComparisonResultPane.java
src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java
src/main/java/jp/naist/se/stigmata/ui/swing/Utility.java
src/main/resources/META-INF/birthmark-1.0.dtd
src/main/resources/META-INF/birthmark-1.0.rng
src/main/resources/resources/about.html
src/main/resources/resources/about.html.ja
src/main/resources/resources/options.xml
src/main/resources/resources/stigmata.xml

diff --git a/pom.xml b/pom.xml
index 98d5c16..76fab23 100755 (executable)
--- a/pom.xml
+++ b/pom.xml
       <scope>compile</scope>
     </dependency>
     <dependency>
+      <groupId>stax</groupId>
+      <artifactId>stax</artifactId>
+      <version>1.2.0</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
       <groupId>commons-beanutils</groupId>
       <artifactId>commons-beanutils</artifactId>
       <version>1.7.0</version>
         <executions>
           <execution>
             <id>copy-dependencies</id>
-            <phase>package</phase>
+            <phase>compile</phase>
             <goals>
               <goal>copy-dependencies</goal>
             </goals>
index 6d614f1..bf47f18 100755 (executable)
@@ -81,7 +81,7 @@ public class BirthmarkEngine{
      * @see #filter(ComparisonResultSet)\r
      * @see BirthmarkContext#getFilterTypes()\r
      */\r
-    public synchronized ComparisonResultSet filter(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+    public synchronized ComparisonResultSet filter(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException, BirthmarkStoreException{\r
         operationStart(OperationType.FILTER_BIRTHMARKS);\r
 \r
         ComparisonResultSet crs = compare(target, context);\r
@@ -99,7 +99,7 @@ public class BirthmarkEngine{
      * @see #filter(ComparisonResultSet)\r
      * @see BirthmarkContext#getFilterTypes()\r
      */\r
-    public synchronized ComparisonResultSet filter(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+    public synchronized ComparisonResultSet filter(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException, BirthmarkStoreException{\r
         operationStart(OperationType.FILTER_BIRTHMARKS);\r
 \r
         ComparisonResultSet crs = compare(targetX, targetY, context);\r
@@ -166,7 +166,7 @@ public class BirthmarkEngine{
         return new ComparisonPair(bs1, bs2, context);\r
     }\r
 \r
-    public synchronized ComparisonResultSet compare(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException{\r
+    public synchronized ComparisonResultSet compare(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkComparisonFailedException, BirthmarkStoreException{\r
         operationStart(OperationType.COMPARE_BIRTHMARKS);\r
 \r
         ExtractionResultSet er = extract(target, context);\r
@@ -177,7 +177,7 @@ public class BirthmarkEngine{
         return crs;\r
     }\r
 \r
-    public synchronized 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, BirthmarkStoreException{\r
         operationStart(OperationType.COMPARE_BIRTHMARKS);\r
 \r
         ExtractionResultSet er = extract(targetX, targetY, context);\r
@@ -214,14 +214,14 @@ public class BirthmarkEngine{
         return crs;\r
     }\r
 \r
-    public synchronized ExtractionResultSet extract(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
+    public synchronized ExtractionResultSet extract(String[] target, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkStoreException{\r
         operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
         ExtractionResultSet er = extract(target, null, context);\r
         operationDone(OperationType.EXTRACT_BIRTHMARKS);\r
         return er;\r
     }\r
 \r
-    public synchronized ExtractionResultSet extract(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException{\r
+    public synchronized ExtractionResultSet extract(String[] targetX, String[] targetY, BirthmarkContext context) throws BirthmarkExtractionFailedException, BirthmarkStoreException{\r
         operationStart(OperationType.EXTRACT_BIRTHMARKS);\r
         ExtractionResultSet er = ExtractionResultSetFactory.getInstance().createResultSet(context);\r
 \r
@@ -269,7 +269,7 @@ public class BirthmarkEngine{
         }\r
     }\r
 \r
-    private BirthmarkSet[] extractImpl(String[] target, ExtractionResultSet er, ExtractionTarget et) throws BirthmarkExtractionFailedException, IOException{\r
+    private BirthmarkSet[] extractImpl(String[] target, ExtractionResultSet er, ExtractionTarget et) throws BirthmarkExtractionFailedException, IOException, BirthmarkStoreException{\r
         ClassFileArchive[] archives = createArchives(target, environment);\r
         BirthmarkContext context = er.getContext();\r
         ExtractionUnit unit = context.getExtractionUnit();\r
@@ -337,8 +337,11 @@ public class BirthmarkEngine{
                 }\r
             }\r
         }\r
-        for(BirthmarkSet bs: map.values()){\r
-            er.addBirthmarkSet(et, bs);\r
+        try{\r
+            for(BirthmarkSet bs: map.values()){\r
+                er.addBirthmarkSet(et, bs);\r
+            }\r
+        }catch(BirthmarkStoreException e){\r
         }\r
     }\r
 \r
@@ -353,7 +356,7 @@ public class BirthmarkEngine{
     }\r
 \r
     private void extractFromClass(ClassFileArchive[] archives, ExtractionResultSet er,\r
-            ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
+            ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException, BirthmarkStoreException{\r
         BirthmarkContext context = er.getContext();\r
 \r
         for(ClassFileArchive archive: archives){\r
@@ -381,7 +384,7 @@ public class BirthmarkEngine{
         }\r
     }\r
 \r
-    private void extractFromProduct(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException{\r
+    private void extractFromProduct(ClassFileArchive[] archives, ExtractionResultSet er, ExtractionTarget et) throws IOException, BirthmarkExtractionFailedException, BirthmarkStoreException{\r
         BirthmarkContext context = er.getContext();\r
 \r
         for(ClassFileArchive archive: archives){\r
diff --git a/src/main/java/jp/naist/se/stigmata/BirthmarkStoreException.java b/src/main/java/jp/naist/se/stigmata/BirthmarkStoreException.java
new file mode 100755 (executable)
index 0000000..e554d86
--- /dev/null
@@ -0,0 +1,30 @@
+package jp.naist.se.stigmata;
+
+/*
+ * $Id$
+ */
+
+/**
+ * This exception class will be thrown when birthmark storing is failed.
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class BirthmarkStoreException extends BirthmarkException{
+    private static final long serialVersionUID = -7106053809841281816L;
+
+    public BirthmarkStoreException(){
+    }
+
+    public BirthmarkStoreException(String message, Throwable cause){
+        super(message, cause);
+    }
+
+    public BirthmarkStoreException(String message){
+        super(message);
+    }
+
+    public BirthmarkStoreException(Throwable cause){
+        super(cause);
+    }
+}
index 5d07428..977a0cc 100755 (executable)
@@ -13,6 +13,8 @@ package jp.naist.se.stigmata;
  */\r
 public enum BirthmarkStoreTarget{\r
     MEMORY,\r
+    XMLFILE,\r
+    MEMORY_SINGLE,\r
 //    DERBY,\r
 //    FILE,\r
 //    MYSQL, \r
index e2d86fd..7709456 100755 (executable)
@@ -13,6 +13,8 @@ import java.util.Iterator;
  * @version $Revision$ $Date$\r
  */\r
 public interface ExtractionResultSet extends Iterable<BirthmarkSet>{\r
+    public BirthmarkStoreTarget getStoreTarget();\r
+\r
     /**\r
      * returns an environment of extraction result.\r
      */\r
@@ -107,7 +109,7 @@ public interface ExtractionResultSet extends Iterable<BirthmarkSet>{
      * birthmarks is parsed and store into target database in this method.\r
      * @throws IllegalArgumentsException target is ExtractionTarget.TARGET_BOTH \r
      */\r
-    public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set);\r
+    public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException;\r
 \r
     /**\r
      * remove all of birthmark-set this object has, then, adds each birthmark-sets to this object. \r
@@ -115,7 +117,7 @@ public interface ExtractionResultSet extends Iterable<BirthmarkSet>{
      * @see #addBirthmarkSet(ExtractionTarget, BirthmarkSet)\r
      * @throws IllegalArgumentsException target is ExtractionTarget.TARGET_BOTH \r
      */\r
-    public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets);\r
+    public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets) throws BirthmarkStoreException;\r
 \r
     /**\r
      * remove specified birthmark-set from specified extraction target.\r
index bd23f04..b6272cb 100644 (file)
@@ -184,6 +184,14 @@ public final class Main{
                 context.addFilterType(filters[i]);\r
             }\r
         }\r
+        if(cl.hasOption("store-target")){\r
+            String value = cl.getOptionValue("store-target");\r
+            BirthmarkStoreTarget bst = BirthmarkStoreTarget.valueOf(value);\r
+            if(bst == null){\r
+                bst = BirthmarkStoreTarget.MEMORY;\r
+            }\r
+            context.setStoreTarget(bst);\r
+        }\r
         if(cl.hasOption("extraction-unit")){\r
             ExtractionUnit unit = ExtractionUnit.valueOf(cl.getOptionValue("extraction-unit"));\r
             context.setExtractionUnit(unit);\r
index ac6be84..34409b9 100644 (file)
@@ -6,6 +6,8 @@ package jp.naist.se.stigmata.birthmarks;
 \r
 import java.util.Locale;\r
 \r
+import jp.naist.se.stigmata.Birthmark;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
 import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
 import jp.naist.se.stigmata.utils.LocalizedDescriptionManager;\r
 \r
@@ -69,4 +71,15 @@ public abstract class AbstractBirthmarkService implements BirthmarkSpi{
     public String getVendorName(){\r
         return getClass().getPackage().getImplementationVendor();\r
     }\r
+\r
+    public Birthmark buildBirthmark(){\r
+       return getExtractor().createBirthmark();\r
+    }\r
+\r
+    public BirthmarkElement buildBirthmarkElement(String value){\r
+       if(value == null){\r
+               return NullBirthmarkElement.getInstance();\r
+       }\r
+               return new BirthmarkElement(value);\r
+    }\r
 }\r
index f128726..7269654 100755 (executable)
@@ -17,7 +17,11 @@ public class FrequencyBirthmarkElement extends BirthmarkElement implements Value
     private int count = 1;\r
 \r
     public FrequencyBirthmarkElement(String value){\r
-        this(value, 1);\r
+        super(parseValue(value));\r
+        if(!value.equals(super.getValue())){\r
+            int number = new Integer(value.substring(0, value.indexOf(":")));\r
+            this.count = number;\r
+        }\r
     }\r
 \r
     public FrequencyBirthmarkElement(String value, int count){\r
@@ -65,4 +69,19 @@ public class FrequencyBirthmarkElement extends BirthmarkElement implements Value
     public int getValueCount(){\r
         return count;\r
     }\r
+\r
+    private static String parseValue(String value){\r
+        if(value.indexOf(":") > 0){\r
+            int index = value.indexOf(":");\r
+            String num = value.substring(0, index);\r
+            String val = value.substring(index + 1);\r
+            try{\r
+                // is number?\r
+                new Integer(num);\r
+                return val;\r
+            } catch(NumberFormatException e){\r
+            }\r
+        }\r
+        return value;\r
+    }\r
 }\r
index 5a4b866..c8c3a01 100644 (file)
@@ -55,7 +55,7 @@ public class ConstantValueOfFieldVariableBirthmarkExtractVisitor extends Birthma
 \r
         TypeAndValueBirthmarkElement e = elements.get(name);\r
         if(e == null){\r
-            e = new TypeAndValueBirthmarkElement(name, desc, value);\r
+            e = new TypeAndValueBirthmarkElement(desc, value);\r
         }\r
         else{\r
             if(value != null){\r
@@ -118,7 +118,7 @@ public class ConstantValueOfFieldVariableBirthmarkExtractVisitor extends Birthma
                     if(className.equals(owner) && opcode == Opcodes.PUTFIELD){\r
                         TypeAndValueBirthmarkElement e = elements.get(name);\r
                         if(e == null){\r
-                            e = new TypeAndValueBirthmarkElement(name, desc, constant);\r
+                            e = new TypeAndValueBirthmarkElement(desc, constant);\r
                         }\r
 \r
                         if(e.getValue() == null && constant != null){\r
index e3f8722..f099875 100644 (file)
@@ -5,6 +5,7 @@ package jp.naist.se.stigmata.birthmarks.cvfv;
  */\r
 \r
 import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
 import jp.naist.se.stigmata.BirthmarkExtractor;\r
 import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkService;\r
 import jp.naist.se.stigmata.birthmarks.comparators.PlainBirthmarkComparator;\r
@@ -18,7 +19,7 @@ import jp.naist.se.stigmata.spi.BirthmarkSpi;
  * @version $Revision$ $Date$\r
  */\r
 public class ConstantValueOfFieldVariableBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{\r
-    private BirthmarkComparator comparator = new PlainBirthmarkComparator(this);\r
+       private BirthmarkComparator comparator = new PlainBirthmarkComparator(this);\r
     private BirthmarkExtractor extractor = new ConstantValueOfFieldVariableBirthmarkExtractor(this);\r
 \r
     public String getType(){\r
@@ -44,4 +45,32 @@ public class ConstantValueOfFieldVariableBirthmarkService extends AbstractBirthm
     public boolean isUserDefined(){\r
         return false;\r
     }\r
+\r
+    @Override\r
+       public BirthmarkElement buildBirthmarkElement(String value) {\r
+       String signature = value.substring(0, value.indexOf('='));\r
+       String subValue = value.substring(value.indexOf('=') + 1);\r
+       Object elementValue = subValue;\r
+\r
+        if(subValue.equals("null")){\r
+            elementValue = null;\r
+        }\r
+        else{\r
+            switch(signature.charAt(0)){\r
+            case 'Z':{\r
+                if(value.equals("true")) elementValue = Boolean.TRUE;\r
+                else                     elementValue = Boolean.FALSE;\r
+                break;\r
+            }\r
+            case 'C': elementValue = new Character(subValue.charAt(0)); break;\r
+            case 'D': elementValue = new Double(subValue);  break;\r
+            case 'F': elementValue = new Float(subValue);   break;\r
+            case 'S': elementValue = new Short(subValue);   break;\r
+            case 'B': elementValue = new Byte(subValue);    break;\r
+            case 'I': elementValue = new Integer(subValue); break;\r
+            default:  elementValue = value; break;\r
+            }\r
+       }\r
+       return new TypeAndValueBirthmarkElement(signature, elementValue);\r
+       }\r
 }\r
index d837773..9004f53 100644 (file)
@@ -18,7 +18,6 @@ import jp.naist.se.stigmata.BirthmarkElement;
 public class TypeAndValueBirthmarkElement extends BirthmarkElement implements Serializable{
     private static final long serialVersionUID = 237098465735321L;
 
-    private String fieldName;
     private String signature;
     private Serializable serialValue;
     private transient Object value;
@@ -26,17 +25,12 @@ public class TypeAndValueBirthmarkElement extends BirthmarkElement implements Se
     /**
      * @param value
      */
-    public TypeAndValueBirthmarkElement(String fieldName, String signature, Object value){
-        super(fieldName + "=" + value);
-        this.fieldName = fieldName;
+    public TypeAndValueBirthmarkElement(String signature, Object value){
+        super(signature + "=" + value);
         this.signature = signature;
         setValue(value);
     }
 
-    public String getFieldName(){
-        return fieldName;
-    }
-
     public String getSignature(){
         return signature;
     }
@@ -66,11 +60,11 @@ public class TypeAndValueBirthmarkElement extends BirthmarkElement implements Se
     }
 
     public String toString(){
-        return signature + " = " + value;
+        return signature + "=" + value;
     }
 
     public int hashCode(){
-        return fieldName.hashCode() + signature.hashCode();
+        return signature.hashCode() + value.hashCode();
     }
 
     public boolean equals(Object o){
index e61de16..ca5e336 100755 (executable)
@@ -5,8 +5,10 @@ package jp.naist.se.stigmata.birthmarks.fmc;
  */\r
 \r
 import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
 import jp.naist.se.stigmata.BirthmarkExtractor;\r
 import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkService;\r
+import jp.naist.se.stigmata.birthmarks.FrequencyBirthmarkElement;\r
 import jp.naist.se.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparator;\r
 import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
 \r
@@ -44,4 +46,9 @@ public class FrequencyMethodCallBirthmarkService extends AbstractBirthmarkServic
     public boolean isUserDefined(){\r
         return false;\r
     }\r
+\r
+       @Override\r
+       public BirthmarkElement buildBirthmarkElement(String value) {\r
+       return new FrequencyBirthmarkElement(value);\r
+       }\r
 }\r
index f216812..4cf7426 100755 (executable)
@@ -34,6 +34,7 @@ public class FrequencyUsedClassesBirthmarkExtractor extends ASMBirthmarkExtracto
         return new UsedClassesBirthmarkExtractVisitor(writer, birthmark, environment);
     }
 
+    @Override
     public ExtractionUnit[] getAcceptableUnits(){
         return new ExtractionUnit[] {
             ExtractionUnit.CLASS, ExtractionUnit.PACKAGE, ExtractionUnit.ARCHIVE, 
index 37a4bcb..482bbe2 100755 (executable)
@@ -5,8 +5,10 @@ package jp.naist.se.stigmata.birthmarks.fuc;
  */\r
 \r
 import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
 import jp.naist.se.stigmata.BirthmarkExtractor;\r
 import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkService;\r
+import jp.naist.se.stigmata.birthmarks.FrequencyBirthmarkElement;\r
 import jp.naist.se.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparator;\r
 import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
 \r
@@ -44,4 +46,8 @@ public class FrequencyUsedClassesBirthmarkService extends AbstractBirthmarkServi
     public boolean isUserDefined(){\r
         return false;\r
     }\r
+\r
+    public BirthmarkElement createBirthmarkElement(String value){\r
+       return new FrequencyBirthmarkElement(value);\r
+    }\r
 }\r
index c6a506a..04bc645 100644 (file)
@@ -5,6 +5,7 @@ package jp.naist.se.stigmata.birthmarks.kgram;
  */\r
 \r
 import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
 import jp.naist.se.stigmata.BirthmarkExtractor;\r
 import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkService;\r
 import jp.naist.se.stigmata.birthmarks.comparators.LogicalAndBirthmarkComparator;\r
@@ -44,4 +45,18 @@ public class KGramBasedBirthmarkService extends AbstractBirthmarkService impleme
     public boolean isUserDefined(){\r
         return false;\r
     }\r
+\r
+       @Override\r
+       public BirthmarkElement buildBirthmarkElement(String value) {\r
+               value = value.trim();\r
+               if(value.startsWith("{") && value.endsWith("}")){\r
+                       String[] param = value.substring(1, value.length() - 1).split(", *");\r
+                       KGram<Integer> kgram = new KGram<Integer>(param.length);\r
+                       for(int i = 0; i < param.length; i++){\r
+                               kgram.set(i, new Integer(param[i].trim()));\r
+                       }\r
+                       return new KGramBasedBirthmarkElement<Integer>(kgram);\r
+               }\r
+               return null;\r
+       }\r
 }\r
index 4b30dec..f69fabe 100644 (file)
@@ -5,6 +5,7 @@ package jp.naist.se.stigmata.birthmarks.smc;
  */\r
 \r
 import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
 import jp.naist.se.stigmata.BirthmarkExtractor;\r
 import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkService;\r
 import jp.naist.se.stigmata.birthmarks.comparators.PlainBirthmarkComparator;\r
@@ -44,4 +45,13 @@ public class SequentialMethodCallBirthmarkService extends AbstractBirthmarkServi
     public boolean isUserDefined(){\r
         return false;\r
     }\r
+\r
+       @Override\r
+       public BirthmarkElement buildBirthmarkElement(String value) {\r
+               String className = value.substring(0, value.indexOf('#'));\r
+               String methodName = value.substring(value.indexOf('#') + 1, value.lastIndexOf('!'));\r
+               String signature = value.substring(value.lastIndexOf('!') + 1);\r
+\r
+               return new MethodCallBirthmarkElement(className, methodName, signature);\r
+       }\r
 }\r
index e1139e0..7ca705a 100644 (file)
@@ -29,7 +29,7 @@ public class BirthmarkComparisonResultXmlFormat extends AbstractBirthmarkCompari
     @Override\r
     public void printResult(PrintWriter out, ComparisonPair pair){\r
         out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
-        out.println("<birthmark>");\r
+        out.println("<birthmark-result-set>");\r
         out.println("  <extracted-birthmarks>");\r
         list.printBirthmarkSet(out, pair.getTarget1());\r
         list.printBirthmarkSet(out, pair.getTarget2());\r
@@ -37,20 +37,20 @@ public class BirthmarkComparisonResultXmlFormat extends AbstractBirthmarkCompari
         out.println("  <comparison-result-set>");\r
         printComparisonPair(out, pair);\r
         out.println("  </comparison-result-set>");\r
-        out.println("</birthmark>");\r
+        out.println("</birthmark-result-set>");\r
         out.flush();\r
     }\r
 \r
     @Override\r
     public void printResult(PrintWriter out, ComparisonResultSet resultset){\r
         out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
-        out.println("<birthmark>");\r
+        out.println("<birthmark-result-set>");\r
         out.println("  <comparison-result-set>");\r
         for(ComparisonPair pair: resultset){\r
             printComparisonPair(out, pair);\r
         }\r
         out.println("  </comparison-result-set>");\r
-        out.println("</birthmark>");\r
+        out.println("</birthmark-result-set>");\r
         out.flush();\r
     }\r
 \r
index 1aa9443..2b526b0 100644 (file)
@@ -24,13 +24,13 @@ import jp.naist.se.stigmata.format.AbstractBirthmarkExtractionResultFormat;
 public class BirthmarkExtractionListXmlFormat extends AbstractBirthmarkExtractionResultFormat{\r
     public void printResult(PrintWriter out, ExtractionResultSet ers){\r
         out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
-        out.println("<birthmark>");\r
+        out.println("<birthmark-result-set>");\r
         out.println("  <extracted-birthmarks>");\r
         for(Iterator<BirthmarkSet> i = ers.birthmarkSets(ExtractionTarget.TARGET_BOTH); i.hasNext(); ){\r
             printBirthmarkSet(out, i.next());\r
         }\r
         out.println("  </extracted-birthmarks>");\r
-        out.println("</birthmark>");\r
+        out.println("</birthmark-result-set>");\r
         out.flush();\r
     }\r
 \r
index e7d28c3..fbe2c83 100644 (file)
@@ -19,7 +19,7 @@ import jp.naist.se.stigmata.spi.BirthmarkSpi;
 public class BirthmarkServiceListXmlFormat extends AbstractBirthmarkServiceListFormat{\r
     public void printResult(PrintWriter out, BirthmarkSpi[] spilist){\r
         out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");\r
-        out.println("<birthmark>");\r
+        out.println("<birthmark-result-set>");\r
         out.println("  <birthmark-services>");\r
         for(BirthmarkSpi spi: spilist){\r
             out.println("    <birthmark-service>");\r
@@ -32,7 +32,7 @@ public class BirthmarkServiceListXmlFormat extends AbstractBirthmarkServiceListF
             out.println("    </birthmark-service>");\r
         }\r
         out.println("  </birthmark-services>");\r
-        out.println("</birthmark>");\r
+        out.println("</birthmark-result-set>");\r
 \r
         out.flush();\r
     }\r
index b6ec010..713773b 100755 (executable)
@@ -35,7 +35,7 @@ public abstract class AbstractComparisonResultSet implements ComparisonResultSet
     public abstract Iterator<BirthmarkSet> pairSources();\r
 \r
     public synchronized BirthmarkSet[] getPairSources(){\r
-        return AbstractComparisonResultSet.<BirthmarkSet>getArrays(pairSources());\r
+        return AbstractComparisonResultSet.<BirthmarkSet>getArrays(pairSources(), new BirthmarkSet[0]);\r
     }\r
 \r
     public int getPairCount(){\r
@@ -51,7 +51,7 @@ public abstract class AbstractComparisonResultSet implements ComparisonResultSet
     }\r
 \r
     public synchronized ComparisonPair[] getPairs(){\r
-        return AbstractComparisonResultSet.<ComparisonPair>getArrays(iterator());\r
+        return AbstractComparisonResultSet.<ComparisonPair>getArrays(iterator(), new ComparisonPair[0]);\r
     }\r
 \r
     public ComparisonPair getPairAt(int index){\r
@@ -75,16 +75,15 @@ public abstract class AbstractComparisonResultSet implements ComparisonResultSet
     }\r
 \r
     @SuppressWarnings("unchecked")\r
-    static synchronized <T> T[] getArrays(Iterator<T> i){\r
+    static synchronized <T> T[] getArrays(Iterator<T> i, T[] array){\r
         List<Object> list = new ArrayList<Object>();\r
-        Object o = null;\r
         while(i.hasNext()){\r
-            o = i.next();\r
             list.add(i.next());\r
         }\r
-        int size = 0;\r
-        if(o != null) size = list.size();\r
-        T[] array = (T[])Array.newInstance(o.getClass(), size);\r
+\r
+        if(list.size() > array.length){\r
+            array = (T[])Array.newInstance(array.getClass().getComponentType(), list.size());\r
+        }\r
         for(int index = 0; index < list.size(); index++){\r
             array[index] = (T)list.get(index);\r
         }\r
index 72a8de1..e2599e5 100755 (executable)
@@ -4,11 +4,14 @@ package jp.naist.se.stigmata.result;
  * $Id$\r
  */\r
 \r
+import java.text.SimpleDateFormat;\r
+import java.util.Calendar;\r
 import java.util.Iterator;\r
 \r
 import jp.naist.se.stigmata.BirthmarkContext;\r
 import jp.naist.se.stigmata.BirthmarkEnvironment;\r
 import jp.naist.se.stigmata.BirthmarkSet;\r
+import jp.naist.se.stigmata.BirthmarkStoreException;\r
 import jp.naist.se.stigmata.ExtractionResultSet;\r
 import jp.naist.se.stigmata.ExtractionTarget;\r
 \r
@@ -44,7 +47,7 @@ public abstract class AbstractExtractionResultSet implements ExtractionResultSet
         return context;\r
     }\r
 \r
-    public abstract void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set);\r
+    public abstract void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException;\r
 \r
     public abstract void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set);\r
 \r
@@ -112,10 +115,10 @@ public abstract class AbstractExtractionResultSet implements ExtractionResultSet
      * @return all of BirthmarkSet this instance have. elements is obtained from birthmarkSet.\r
      */\r
     public synchronized BirthmarkSet[] getBirthmarkSets(ExtractionTarget target){\r
-        return AbstractComparisonResultSet.<BirthmarkSet>getArrays(birthmarkSets(target));\r
+        return AbstractComparisonResultSet.<BirthmarkSet>getArrays(birthmarkSets(target), new BirthmarkSet[0]);\r
     }\r
 \r
-    public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets){\r
+    public void setBirthmarkSets(ExtractionTarget target, BirthmarkSet[] sets) throws BirthmarkStoreException{\r
         removeAllBirthmarkSets(target);\r
         for(int i = 0; i < sets.length; i++){\r
             addBirthmarkSet(target, sets[i]);\r
@@ -130,4 +133,8 @@ public abstract class AbstractExtractionResultSet implements ExtractionResultSet
         this.tableType = flag;\r
     }\r
 \r
+    protected String generateId(){\r
+        SimpleDateFormat cdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS");\r
+        return cdf.format(Calendar.getInstance().getTime());\r
+    }\r
 }\r
index e0dc2c1..dea62bb 100644 (file)
@@ -12,6 +12,7 @@ import java.util.Map;
 \r
 import jp.naist.se.stigmata.BirthmarkContext;\r
 import jp.naist.se.stigmata.BirthmarkSet;\r
+import jp.naist.se.stigmata.BirthmarkStoreException;\r
 import jp.naist.se.stigmata.ComparisonPair;\r
 import jp.naist.se.stigmata.ExtractionResultSet;\r
 import jp.naist.se.stigmata.ExtractionTarget;\r
@@ -132,18 +133,28 @@ public class CertainPairComparisonResultSet extends AbstractComparisonResultSet{
     }\r
 \r
     private static ExtractionResultSet createExtractionResultSet(ComparisonPair[] pairs, BirthmarkContext context){\r
-        ExtractionResultSet ers = new MemoryExtractionResultSet(context, false);\r
-        for(int i = 0; i < pairs.length; i++){\r
-            ers.addBirthmarkSet(ExtractionTarget.TARGET_X, pairs[i].getTarget1());\r
-            ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, pairs[i].getTarget2());\r
+        ExtractionResultSet ers = ExtractionResultSetFactory.getInstance().createResultSet(context);\r
+        ers.setTableType(false);\r
+        try{\r
+            for(int i = 0; i < pairs.length; i++){\r
+                ers.addBirthmarkSet(ExtractionTarget.TARGET_X, pairs[i].getTarget1());\r
+                ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, pairs[i].getTarget2());\r
+            }\r
+        }catch(BirthmarkStoreException e){\r
+            throw new InternalError("never thrown BirthmarkStoreException is thrown");\r
         }\r
         return ers;\r
     }\r
 \r
     private static ExtractionResultSet createExtractionResultSet(BirthmarkSet[] targetX, BirthmarkSet[] targetY, BirthmarkContext context){\r
-        ExtractionResultSet ers = new MemoryExtractionResultSet(context, true);\r
-        ers.setBirthmarkSets(ExtractionTarget.TARGET_X, targetX);\r
-        ers.setBirthmarkSets(ExtractionTarget.TARGET_Y, targetY);\r
+        ExtractionResultSet ers = ExtractionResultSetFactory.getInstance().createResultSet(context);\r
+        ers.setTableType(true);\r
+        try{\r
+            ers.setBirthmarkSets(ExtractionTarget.TARGET_X, targetX);\r
+            ers.setBirthmarkSets(ExtractionTarget.TARGET_Y, targetY);\r
+        }catch(BirthmarkStoreException e){\r
+            throw new InternalError("never thrown BirthmarkStoreException is thrown");\r
+        }\r
         return ers;\r
     }\r
 \r
index 5aafca3..d8bbf77 100755 (executable)
@@ -23,7 +23,9 @@ public class ExtractionResultSetFactory{
     private Map<String, Class<? extends ExtractionResultSet>> map = new HashMap<String, Class<? extends ExtractionResultSet>>();\r
 \r
     private ExtractionResultSetFactory(){\r
-        map.put(BirthmarkStoreTarget.MEMORY.name(), MemoryExtractionResultSet.class);\r
+        map.put(BirthmarkStoreTarget.MEMORY.name(),        MemoryExtractionResultSet.class);\r
+        map.put(BirthmarkStoreTarget.XMLFILE.name(),      XmlFileExtractionResultSet.class);\r
+        map.put(BirthmarkStoreTarget.MEMORY_SINGLE.name(), SingleExtractionResultSet.class);\r
     }\r
 \r
     public static ExtractionResultSetFactory getInstance(){\r
index 7eb745c..b38fa63 100755 (executable)
@@ -10,6 +10,7 @@ import java.util.List;
 \r
 import jp.naist.se.stigmata.BirthmarkContext;\r
 import jp.naist.se.stigmata.BirthmarkSet;\r
+import jp.naist.se.stigmata.BirthmarkStoreTarget;\r
 import jp.naist.se.stigmata.ExtractionTarget;\r
 import jp.naist.se.stigmata.utils.MultipleIterator;\r
 \r
@@ -30,6 +31,10 @@ public class MemoryExtractionResultSet extends AbstractExtractionResultSet{
         super(context, tableType);\r
     }\r
 \r
+    public BirthmarkStoreTarget getStoreTarget(){\r
+        return BirthmarkStoreTarget.MEMORY;\r
+    }\r
+\r
     public void removeAllBirthmarkSets(ExtractionTarget target){\r
         switch(target){\r
         case TARGET_X:\r
index 20547ff..d422c3b 100755 (executable)
@@ -9,6 +9,7 @@ import java.util.NoSuchElementException;
 \r
 import jp.naist.se.stigmata.BirthmarkContext;\r
 import jp.naist.se.stigmata.BirthmarkSet;\r
+import jp.naist.se.stigmata.BirthmarkStoreTarget;\r
 import jp.naist.se.stigmata.ExtractionTarget;\r
 import jp.naist.se.stigmata.utils.NullIterator;\r
 \r
@@ -29,6 +30,10 @@ public class SingleExtractionResultSet extends AbstractExtractionResultSet{
         super(context, false);\r
     }\r
 \r
+    public BirthmarkStoreTarget getStoreTarget(){\r
+        return BirthmarkStoreTarget.MEMORY_SINGLE;\r
+    }\r
+\r
     public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set){\r
         this.bs = set;\r
     }\r
diff --git a/src/main/java/jp/naist/se/stigmata/result/XmlFileExtractionResultSet.java b/src/main/java/jp/naist/se/stigmata/result/XmlFileExtractionResultSet.java
new file mode 100755 (executable)
index 0000000..fd4069d
--- /dev/null
@@ -0,0 +1,270 @@
+package jp.naist.se.stigmata.result;
+
+/*
+ * $Id$
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+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 javax.xml.namespace.QName;
+import javax.xml.stream.XMLEventReader;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.events.EndElement;
+import javax.xml.stream.events.StartElement;
+import javax.xml.stream.events.XMLEvent;
+
+import jp.naist.se.stigmata.Birthmark;
+import jp.naist.se.stigmata.BirthmarkContext;
+import jp.naist.se.stigmata.BirthmarkElement;
+import jp.naist.se.stigmata.BirthmarkEnvironment;
+import jp.naist.se.stigmata.BirthmarkSet;
+import jp.naist.se.stigmata.BirthmarkStoreException;
+import jp.naist.se.stigmata.BirthmarkStoreTarget;
+import jp.naist.se.stigmata.ExtractionTarget;
+import jp.naist.se.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$ $Date$
+ */
+public class XmlFileExtractionResultSet extends AbstractExtractionResultSet{
+    private File targetFile;
+    private boolean addmode = true;
+    private int size;
+    private boolean first = true;
+    private List<URL> addList = new ArrayList<URL>();
+    private PrintWriter out;
+
+    public XmlFileExtractionResultSet(BirthmarkContext context, boolean tableType){
+        super(context, tableType);
+
+        createTargetFile();
+    }
+
+    public XmlFileExtractionResultSet(BirthmarkContext context){
+        super(context);
+
+        createTargetFile();
+    }
+
+    public BirthmarkStoreTarget getStoreTarget(){
+        return BirthmarkStoreTarget.XMLFILE;
+    }
+
+    @Override
+    public void addBirthmarkSet(ExtractionTarget target, BirthmarkSet set) throws BirthmarkStoreException{
+        if(addmode){
+            size++;
+            if(first){
+                first = false;
+                try{
+                    out = new PrintWriter(new FileWriter(targetFile));
+                    printHeader(out);
+                }catch(IOException e){
+                    e.printStackTrace();
+                }
+            }
+            if(out == null){
+                first = true;
+                throw new BirthmarkStoreException("destination is closed on some reason");
+            }
+            addList.add(set.getLocation());
+            writeBirthmarkSet(out, set);
+        }
+        else{
+            throw new BirthmarkStoreException("destination is already closed.");
+        }
+    }
+
+    @Override
+    public Iterator<BirthmarkSet> birthmarkSets(ExtractionTarget target){
+        checkMode();
+
+        return new BirthmarkSetStAXIterator(targetFile, addList, getEnvironment());
+    }
+
+    @Override
+    public int getBirthmarkSetSize(ExtractionTarget target){
+        return size;
+    }
+
+    @Override
+    public void removeAllBirthmarkSets(ExtractionTarget target){
+        targetFile.delete();
+        size = 0;
+        addList.clear();
+    }
+
+    @Override
+    public void removeBirthmarkSet(ExtractionTarget target, BirthmarkSet set){
+        boolean removeFlag = addList.remove(set.getLocation());
+        if(removeFlag){
+            size--;
+        }
+    }
+
+    private void writeBirthmarkSet(PrintWriter out, BirthmarkSet set){
+        out.println("    <extracted-birthmark>");
+        out.printf("      <class-name>%s</class-name>%n", set.getName());
+        out.printf("      <location>%s</location>%n", set.getLocation());
+        for(Birthmark birthmark: set){
+            out.printf("      <birthmark type=\"%s\" count=\"%d\">%n", birthmark.getType(), birthmark.getElementCount());
+            for(BirthmarkElement element: birthmark){
+                out.printf("        <element>%s</element>%n", normalize(String.valueOf(element)));
+            }
+            out.printf("      </birthmark>%n");
+        }
+        out.println("    </extracted-birthmark>");
+    }
+
+    private String normalize(String element){
+        element = element.replaceAll("&", "&amp;");
+        element = element.replaceAll("<", "&lt;");
+        element = element.replaceAll(">", "&gt;");
+        element = element.replaceAll("\"", "&quot;");
+        return element;
+    }
+
+    private void createTargetFile(){
+        targetFile = new File(BirthmarkEnvironment.getStigmataHome(), "extracted_birthmarks/" + generateId() + ".xml");
+        if(!targetFile.getParentFile().exists()){
+            targetFile.getParentFile().mkdirs();
+        }
+    }
+
+    private void printHeader(PrintWriter out){
+        out.println("<birthmark-result-set>");
+        out.println("  <extracted-birthmarks>");
+    }
+
+    private void printFooter(PrintWriter out){
+        out.println("  </extracted-birthmarks>");
+        out.println("</birthmark-result-set>");
+    }
+
+    private synchronized void checkMode(){
+        if(addmode){
+            addmode = false;
+            printFooter(out);
+            out.close();
+        }
+    }
+
+    private static class BirthmarkSetStAXIterator implements Iterator<BirthmarkSet>{
+        private XMLEventReader reader = null;
+        private BirthmarkSet nextObject;
+        private List<URL> validItems;
+        private BirthmarkEnvironment env;
+
+        public BirthmarkSetStAXIterator(File file, List<URL> validItems, BirthmarkEnvironment env){
+            try{
+                XMLInputFactory factory = XMLInputFactory.newInstance();
+                BufferedReader in = new BufferedReader(new FileReader(file));
+                reader = factory.createXMLEventReader(in);
+            } catch(FileNotFoundException e){
+            } catch(XMLStreamException e){
+            }
+            this.validItems = validItems;
+            this.env = env;
+            try{
+                nextObject = findNext();
+            } catch(XMLStreamException e){
+                e.printStackTrace();
+            }
+        }
+
+        public boolean hasNext(){
+            boolean flag = nextObject != null;
+            if(!flag){
+                try{
+                    reader.close();
+                } catch(XMLStreamException e){
+                    e.printStackTrace();
+                }
+            }
+            return flag;
+        }
+
+        public BirthmarkSet next(){
+            BirthmarkSet next = nextObject;
+            try{
+                nextObject = findNext();
+            } catch(XMLStreamException e){
+                e.printStackTrace();
+            }
+            return next;
+        }
+
+        public void remove(){
+        }
+
+        private BirthmarkSet findNext() throws XMLStreamException{
+            String className = null;
+            BirthmarkSet bs = null;
+            Birthmark birthmark = null;
+            BirthmarkSpi service = null;
+                
+            while(reader.hasNext()){
+                XMLEvent event = reader.peek();
+                if(event.isStartElement()){
+                    StartElement se = event.asStartElement();
+                    if(se.getName().getLocalPart().equals("class-name")) className = reader.getElementText();
+                    else if(se.getName().getLocalPart().equals("location")){
+                        String location = reader.getElementText();
+                        if(className == null || location == null){
+                            throw new XMLStreamException("incompatible with definition");
+                        }
+                        try{
+                            URL url = new URL(location);
+                            if(!validItems.contains(url)){
+                                while(reader.hasNext()){
+                                    XMLEvent xmlevent = reader.nextTag();
+                                    if(xmlevent.isEndElement() &&
+                                        xmlevent.asEndElement().getName().getLocalPart().equals("extracted-birthmark")){
+                                        break;
+                                    }
+                                }
+                                continue;
+                            }
+                            bs = new BirthmarkSet(className, url);
+                        } catch(MalformedURLException e){
+                            e.printStackTrace();
+                        }
+                    }
+                    else if(se.getName().getLocalPart().equals("element")){
+                        BirthmarkElement be = service.buildBirthmarkElement(reader.getElementText());
+                        birthmark.addElement(be);
+                    }
+                    else if(se.getName().getLocalPart().equals("birthmark")){
+                        String type = se.getAttributeByName(new QName("type")).getValue();
+                        service = env.getService(type);
+                        birthmark = service.buildBirthmark();
+                        bs.addBirthmark(birthmark);
+                    }
+                }
+                else if(event.isEndElement()){
+                    EndElement ee = event.asEndElement();
+                    if(ee.getName().getLocalPart().equals("extracted-birthmark")){
+                        reader.nextEvent();
+                        break;
+                    }
+                }
+                reader.nextEvent();
+            }
+            return bs;
+        }
+    }
+}
index f94f833..38b5d63 100644 (file)
@@ -6,7 +6,9 @@ package jp.naist.se.stigmata.spi;
 \r
 import java.util.Locale;\r
 \r
+import jp.naist.se.stigmata.Birthmark;\r
 import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
 import jp.naist.se.stigmata.BirthmarkExtractor;\r
 \r
 /**\r
@@ -48,6 +50,10 @@ public interface BirthmarkSpi extends ServiceProvider{
 \r
     public String getExtractorClassName();\r
 \r
+    public Birthmark buildBirthmark();\r
+\r
+    public BirthmarkElement buildBirthmarkElement(String elementValue);\r
+\r
     /**\r
      * returns a extractor for the birthmark of this service.\r
      */\r
index e2e01d0..5c1b130 100644 (file)
@@ -19,14 +19,12 @@ public class BirthmarkTreeNode extends DefaultMutableTreeNode{
     private Birthmark birthmark;
 
     public BirthmarkTreeNode(Birthmark birthmark){
-        super(birthmark.getType() + "("
-                + birthmark.getElementCount() + ")");
+        super(String.format("%s (%d)", birthmark.getType(), birthmark.getElementCount()));
         setBirthmark(birthmark);
     }
 
     public BirthmarkTreeNode(BirthmarkSet birthmark){
-        super(birthmark.getName() + "(" +
-                + birthmark.getSumOfElementCount() + ")");
+        super(String.format("%s (%d)", birthmark.getName(), birthmark.getSumOfElementCount()));
         setBirthmark(birthmark);
     }
 
index 0e4caca..497bc71 100644 (file)
@@ -29,6 +29,7 @@ import javax.swing.border.TitledBorder;
 \r
 import jp.naist.se.stigmata.BirthmarkContext;\r
 import jp.naist.se.stigmata.BirthmarkEnvironment;\r
+import jp.naist.se.stigmata.BirthmarkStoreTarget;\r
 import jp.naist.se.stigmata.ComparisonMethod;\r
 import jp.naist.se.stigmata.ExtractionUnit;\r
 import jp.naist.se.stigmata.Stigmata;\r
@@ -298,6 +299,14 @@ public class ControlPane extends JPanel{
         BirthmarkContext context = new BirthmarkContext(generateEnvironment());\r
         context.setBirthmarkTypes(birthmarks.getSelectedServiceTypes());\r
         context.setExtractionUnit(parseExtractionUnit());\r
+        BirthmarkStoreTarget bst = BirthmarkStoreTarget.MEMORY;\r
+        if(context.getEnvironment().getProperty("birthmark.store.target") != null){\r
+            bst = BirthmarkStoreTarget.valueOf(context.getEnvironment().getProperty("birthmark.store.target"));\r
+        }\r
+        if(bst == null){\r
+            bst = BirthmarkStoreTarget.MEMORY;\r
+        }\r
+        context.setStoreTarget(bst);\r
         \r
         return context;\r
     }\r
index f4cdda3..c75cba5 100644 (file)
@@ -35,6 +35,7 @@ import jp.naist.se.stigmata.Birthmark;
 import jp.naist.se.stigmata.BirthmarkComparator;\r
 import jp.naist.se.stigmata.BirthmarkEnvironment;\r
 import jp.naist.se.stigmata.BirthmarkSet;\r
+import jp.naist.se.stigmata.BirthmarkStoreException;\r
 import jp.naist.se.stigmata.ComparisonResultSet;\r
 import jp.naist.se.stigmata.ExtractionResultSet;\r
 import jp.naist.se.stigmata.ExtractionTarget;\r
@@ -372,13 +373,16 @@ public class RoundRobinComparisonResultPane extends JPanel{
             );\r
             if(file != null){\r
                 ExtractionResultSet ers = new MemoryExtractionResultSet(extraction.getContext(), extraction.isTableType());\r
-                for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){\r
-                    BirthmarkSet bs = i.next();\r
-                    ers.addBirthmarkSet(ExtractionTarget.TARGET_X, obfuscator.obfuscateClassName(bs));\r
-                }\r
-                for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){\r
-                    BirthmarkSet bs = i.next();\r
-                    ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, obfuscator.obfuscateClassName(bs));\r
+                try{\r
+                    for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){\r
+                        BirthmarkSet bs = i.next();\r
+                        ers.addBirthmarkSet(ExtractionTarget.TARGET_X, obfuscator.obfuscateClassName(bs));\r
+                    }\r
+                    for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){\r
+                        BirthmarkSet bs = i.next();\r
+                        ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, obfuscator.obfuscateClassName(bs));\r
+                    }\r
+                } catch(BirthmarkStoreException e){\r
                 }\r
                 this.extraction = ers;\r
                 obfuscator.outputNameMappings(file);\r
index 12dc4c9..a7f86d5 100644 (file)
@@ -448,7 +448,7 @@ public class StigmataFrame extends JFrame{
         });\r
         saveMenu.addActionListener(new ActionListener(){\r
             public void actionPerformed(ActionEvent e){\r
-                control.saveSettings(new File(BirthmarkEnvironment.getStigmataHome(), ".stigmata.xml"));\r
+                control.saveSettings(new File(BirthmarkEnvironment.getStigmataHome(), "stigmata.xml"));\r
             }\r
         });\r
 \r
index 1225f32..c7d7dd3 100644 (file)
@@ -42,9 +42,9 @@ public class Utility{
             component.setBorder(new TitledBorder(Messages.getString(label + ".border")));\r
         }\r
         try{\r
-            Method[] methods = component.getClass().getMethods();\r
             Icon icon = getIcon(label + ".icon");\r
             if(icon != null){\r
+                Method[] methods = component.getClass().getMethods();\r
                 for(Method m: methods){\r
                     if(m.getName().equals("setIcon")){\r
                         m.invoke(component, icon);\r
index 18966e6..8a2f534 100755 (executable)
@@ -34,5 +34,5 @@
 <!ELEMENT comparison-result      (target1,target2,birthmark-similarities,similarity)>\r
 <!ELEMENT comparison-result-set  (comparison-result*)>\r
 \r
-<!ELEMENT birthmark              ((birthmark-services|extracted-birthmarks|comparison-result-set)+)>\r
+<!ELEMENT birthmark-result-set   ((birthmark-services|extracted-birthmarks|comparison-result-set)+)>\r
 \r
index 2762f32..3b0c9b9 100755 (executable)
@@ -1,11 +1,11 @@
 <grammar xmlns="http://relaxng.org/ns/structure/1.0"
          datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
   <start>
-    <ref name="birthmark"/>
+    <ref name="birthmark-result-set"/>
   </start>
 
-  <define name="birthmark">
-    <element name="birthmark">
+  <define name="birthmark-result-set">
+    <element name="birthmark-result-set">
       <optional>
         <ref name="birthmark-services"/>
       </optional>
index b91d339..5ba387c 100755 (executable)
@@ -7,6 +7,11 @@ Copyright (C) by Haruaki Tamada, Ph.D.,
 ${implementation.vendor} 2004-2007,\r
 All right reserved.\r
 </p><p>\r
+Latest version is available at\r
+<a href="http://stigmata.sourceforge.jp/">http://stigmata.sourceforge.jp/</a>.\r
+Stigmata is developed on Java SE 5.\r
+</p>\r
+<h2>Dependencies</h2>\r
 Stigmata uses ASM library for engineering Java bytecode.<br>\r
 <a href="http://asm.objectweb.org/">http://asm.objectweb.org/</a>\r
 </p><p>\r
@@ -21,7 +26,7 @@ Stigmata uses BrowserLauncher2 for showing clicked URL in browser<br>
 </p><p>\r
 Stigmata uses icons provided by FAMFAMFAM.<br>\r
 <a href="http://www.famfamfam.com/">http://www.famfamfam.com/</a>\r
-</p><p>\r
+<h2>License &amp; Copyright</h2>\r
 Copyright 2004-2007 Haruaki Tamada\r
 </p><p>\r
 Licensed under the Apache License, Version 2.0 (the "License");\r
index 0ebd1ab..b886006 100755 (executable)
@@ -7,6 +7,11 @@ Copyright (C) by Haruaki Tamada, Ph.D.,
 ${implementation.vendor} 2004-2007,\r
 All right reserved.\r
 </p><p>\r
+Stigmata \82Ì\8dÅ\90V\83o\81[\83W\83\87\83\93\82Í\r
+<a href="http://stigmata.sourceforge.jp/">http://stigmata.sourceforge.jp/</a>\r
+\82©\82ç\8eæ\93¾\89Â\94\\82Å\82·\81D\82Ü\82½\81CStigmata \82Í Java SE 5 \82Å\8aJ\94­\82³\82ê\82Ä\82¢\82Ü\82·\81D\r
+</p>\r
+<h2>\88Ë\91\83\89\83C\83u\83\89\83\8a</h2>\r
 Stigmata\82Í Java \83o\83C\83g\83R\81[\83h\82ð\88µ\82¤\82½\82ß\81CASM\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81D<br>\r
 <a href="http://asm.objectweb.org/">http://asm.objectweb.org/</a>\r
 </p><p>\r
@@ -22,7 +27,7 @@ Stigmata
 Stigmata\82ÍFAMFAMFAM\82ª\92ñ\8b\9f\82µ\82Ä\82¢\82é\83A\83C\83R\83\93\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81D<br>\r
 <a href="http://www.famfamfam.com/">http://www.famfamfam.com/</a>\r
 </p>\r
-<hr>\r
+<h2>\83\89\83C\83Z\83\93\83X&amp;\92\98\8dì\8c </h2>\r
 <p>\r
 Copyright 2004-2007 \8bÊ\93\8ft\8fº (Haruaki Tamada)\r
 </p><p>\r
index 8e9604b..96d122a 100755 (executable)
       <long-option>store-target</long-option>
       <argument>REQUIRED</argument>
       <argument-name>STORE_TARGET</argument-name>
-      <description>This option represents how to store extracted birthmarks.  Available value is only MEMORY.</description>
+      <description>This option represents how to store extracted birthmarks.  Available values are MEMORY, and XMLFILE.</description>
     </definition>
   </definitions>
 
index edc03e9..959c43a 100755 (executable)
@@ -198,6 +198,10 @@ $Id$
       <name>extractor.kmc.KValue</name>
       <value>4</value>
     </property>
+    <property>
+      <name>birthmark.store.target</name>
+      <value>MEMORY</value>
+    </property>
 <!--
     <property>
       <property-name>name</property-name>