OSDN Git Service

new birthmark: frequency of used classes
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Fri, 29 Jun 2007 04:41:49 +0000 (04:41 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Fri, 29 Jun 2007 04:41:49 +0000 (04:41 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@143 acee48c3-7b26-0410-bdac-b3d0e5314bbc

20 files changed:
src/main/java/jp/naist/se/stigmata/birthmarks/ASMBirthmarkExtractor.java
src/main/java/jp/naist/se/stigmata/birthmarks/AbstractBirthmark.java [moved from src/main/java/jp/naist/se/stigmata/AbstractBirthmark.java with 90% similarity]
src/main/java/jp/naist/se/stigmata/birthmarks/AbstractBirthmarkExtractor.java [moved from src/main/java/jp/naist/se/stigmata/AbstractBirthmarkExtractor.java with 89% similarity]
src/main/java/jp/naist/se/stigmata/birthmarks/FrequencyBirthmark.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/birthmarks/FrequencyBirthmarkElement.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/birthmarks/PlainBirthmark.java
src/main/java/jp/naist/se/stigmata/birthmarks/comparators/CosineSimilarityBirthmarkComparator.java
src/main/java/jp/naist/se/stigmata/birthmarks/extractors/FrequencyMethodCallBirthmarkExtractorService.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/birthmarks/extractors/FrequencyUsedClassesBirthmarkExtractorService.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/birthmarks/fmc/FrequencyMethodCallBirthmark.java [deleted file]
src/main/java/jp/naist/se/stigmata/birthmarks/fmc/FrequencyMethodCallBirthmarkExtractVisitor.java
src/main/java/jp/naist/se/stigmata/birthmarks/fmc/FrequencyMethodCallBirthmarkExtractor.java
src/main/java/jp/naist/se/stigmata/birthmarks/fmc/FrequencyOfMethodBirthmarkElement.java [deleted file]
src/main/java/jp/naist/se/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkExtractor.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkService.java [new file with mode: 0755]
src/main/java/jp/naist/se/stigmata/birthmarks/is/InheritanceStructureBirthmarkExtractor.java
src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkExtractorSpi
src/main/resources/META-INF/services/jp.naist.se.stigmata.spi.BirthmarkSpi
src/main/resources/resources/description.properties
src/main/resources/resources/description_ja.source

index ae16d0b..2c25d4d 100644 (file)
@@ -7,7 +7,6 @@ package jp.naist.se.stigmata.birthmarks;
 import java.io.IOException;\r
 import java.io.InputStream;\r
 \r
-import jp.naist.se.stigmata.AbstractBirthmarkExtractor;\r
 import jp.naist.se.stigmata.Birthmark;\r
 import jp.naist.se.stigmata.BirthmarkContext;\r
 import jp.naist.se.stigmata.BirthmarkExtractionException;\r
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata;
+package jp.naist.se.stigmata.birthmarks;
 
 /*
  * $Id$
@@ -9,6 +9,9 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import jp.naist.se.stigmata.Birthmark;
+import jp.naist.se.stigmata.BirthmarkElement;
+
 /**
  * Abstract class for concrete {@link Birthmark <code>Birthmark</code>}
  *
@@ -1,4 +1,4 @@
-package jp.naist.se.stigmata;\r
+package jp.naist.se.stigmata.birthmarks;\r
 \r
 /*\r
  * $Id$\r
@@ -7,7 +7,11 @@ package jp.naist.se.stigmata;
 import java.io.ByteArrayInputStream;\r
 import java.io.InputStream;\r
 \r
-import jp.naist.se.stigmata.birthmarks.PlainBirthmark;\r
+import jp.naist.se.stigmata.Birthmark;\r
+import jp.naist.se.stigmata.BirthmarkContext;\r
+import jp.naist.se.stigmata.BirthmarkExtractionException;\r
+import jp.naist.se.stigmata.BirthmarkExtractor;\r
+import jp.naist.se.stigmata.ExtractionUnit;\r
 import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
 \r
 /**\r
diff --git a/src/main/java/jp/naist/se/stigmata/birthmarks/FrequencyBirthmark.java b/src/main/java/jp/naist/se/stigmata/birthmarks/FrequencyBirthmark.java
new file mode 100755 (executable)
index 0000000..a7fc1cb
--- /dev/null
@@ -0,0 +1,81 @@
+package jp.naist.se.stigmata.birthmarks;\r
+\r
+/*\r
+ * $Id$\r
+ */\r
+\r
+import java.util.Arrays;\r
+import java.util.Comparator;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.Map;\r
+\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
+import jp.naist.se.stigmata.utils.ArrayIterator;\r
+\r
+/**\r
+ * \r
+ * @author Haruaki Tamada\r
+ * @version $Revision$ $Date$\r
+ */\r
+public class FrequencyBirthmark extends AbstractBirthmark{\r
+    private static final long serialVersionUID = 1905526895627693908L;\r
+\r
+    private Map<String, FrequencyBirthmarkElement> counts = new HashMap<String, FrequencyBirthmarkElement>();\r
+    private String type;\r
+\r
+    public FrequencyBirthmark(String type){\r
+        this.type = type;\r
+    }\r
+\r
+    @Override\r
+    public int getElementCount(){\r
+        return counts.size();\r
+    }\r
+\r
+    @Override\r
+    public synchronized BirthmarkElement[] getElements(){\r
+        FrequencyBirthmarkElement[] elements = new FrequencyBirthmarkElement[counts.size()];\r
+        int index = 0;\r
+        for(Map.Entry<String, FrequencyBirthmarkElement> entry: counts.entrySet()){\r
+            elements[index] = entry.getValue();\r
+            index++;\r
+        }\r
+        Arrays.sort(elements, new Comparator<FrequencyBirthmarkElement>(){\r
+            public int compare(FrequencyBirthmarkElement o1, FrequencyBirthmarkElement o2){\r
+                return o1.getValueName().compareTo(o2.getValueName());\r
+            }\r
+        });\r
+        \r
+        return elements;\r
+    }\r
+\r
+    @Override\r
+    public Iterator<BirthmarkElement> iterator(){\r
+        return new ArrayIterator<BirthmarkElement>(getElements());\r
+    }\r
+\r
+    public void addElement(BirthmarkElement element){\r
+        String value;\r
+        if(element instanceof FrequencyBirthmarkElement){\r
+            FrequencyBirthmarkElement e = (FrequencyBirthmarkElement)element;\r
+            value = e.getValueName();\r
+        }\r
+        else{\r
+            value = (String)element.getValue();\r
+        }\r
+        FrequencyBirthmarkElement foundElement = counts.get(value);\r
+        if(foundElement != null){\r
+            foundElement.incrementValueCount();\r
+        }\r
+        else{\r
+            foundElement = new FrequencyBirthmarkElement(value);\r
+        }\r
+        counts.put(value, foundElement);\r
+    }\r
+\r
+    @Override\r
+    public String getType(){\r
+        return type;\r
+    }\r
+}\r
diff --git a/src/main/java/jp/naist/se/stigmata/birthmarks/FrequencyBirthmarkElement.java b/src/main/java/jp/naist/se/stigmata/birthmarks/FrequencyBirthmarkElement.java
new file mode 100755 (executable)
index 0000000..c360acc
--- /dev/null
@@ -0,0 +1,59 @@
+package jp.naist.se.stigmata.birthmarks;\r
+\r
+import jp.naist.se.stigmata.BirthmarkElement;\r
+\r
+public class FrequencyBirthmarkElement extends BirthmarkElement implements ValueCountable{\r
+    private static final long serialVersionUID = 4454345943098520436L;\r
+\r
+    private int count = 1;\r
+\r
+    public FrequencyBirthmarkElement(String value){\r
+        this(value, 1);\r
+    }\r
+\r
+    public FrequencyBirthmarkElement(String value, int count){\r
+        super(value);\r
+        this.count = count;\r
+    }\r
+\r
+    void incrementValueCount(){\r
+        count++;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object o){\r
+        boolean flag = false;\r
+        if(o instanceof FrequencyBirthmarkElement){\r
+            FrequencyBirthmarkElement fmbe = (FrequencyBirthmarkElement)o;\r
+            flag = super.equals(fmbe) && getValueCount() == fmbe.getValueCount();\r
+        }\r
+        return flag;\r
+    }\r
+\r
+    @Override\r
+    public Object getValue(){\r
+        return getValueCount() + ": " + getValueName();\r
+    }\r
+\r
+    @Override\r
+    public int hashCode(){\r
+        int hash = super.hashCode();\r
+        int shift = getValueCount() % 32;\r
+\r
+        // cyclic shift\r
+        for(int i = 0; i < shift; i++){\r
+            int v = hash & 1;\r
+            hash = hash >>> 1 | v << 31;\r
+        }\r
+\r
+        return hash;\r
+    }\r
+\r
+    public String getValueName(){\r
+        return (String)super.getValue();\r
+    }\r
+\r
+    public int getValueCount(){\r
+        return count;\r
+    }\r
+}\r
index 72efd23..25b5ee0 100644 (file)
@@ -4,7 +4,6 @@ package jp.naist.se.stigmata.birthmarks;
  * $Id$\r
  */\r
 \r
-import jp.naist.se.stigmata.AbstractBirthmark;\r
 import jp.naist.se.stigmata.BirthmarkElement;\r
 \r
 /**\r
index 2b17ea9..adf35e5 100755 (executable)
@@ -45,8 +45,15 @@ public class CosineSimilarityBirthmarkComparator extends
         double norm1 = norm(pairs, true);\r
         double norm2 = norm(pairs, false);\r
         double product = innerproduct(pairs);\r
+        double similarity = product / (norm1 * norm2);\r
+        // System.out.printf("%g / (%g * %g) = %g%n", product, norm1, norm2, similarity);\r
 \r
-        return product / (norm1 * norm2);\r
+        // double radian = Math.acos(product / (norm1 * norm2));\r
+        // double angle = 90 - (180 * radian / Math.PI);\r
+        // double sim = angle / 90;\r
+        // System.out.printf("angle: %g (%g\93x, %g)%n", radian, angle, sim);\r
+\r
+        return similarity;\r
     }\r
 \r
     private double innerproduct(Map<String, CountPair> pairs){\r
@@ -99,4 +106,16 @@ public class CosineSimilarityBirthmarkComparator extends
             }\r
         }\r
     }\r
+\r
+    /**\r
+     * This method is used for debugging.\r
+     */\r
+    @SuppressWarnings("unused")\r
+    private void printAll(Map<String, CountPair> pairs){\r
+        System.out.println("----------");\r
+        for(Map.Entry<String, CountPair> entry: pairs.entrySet()){\r
+            CountPair pair = entry.getValue();\r
+            System.out.printf("%40s: %5d, %5d%n", entry.getKey(), pair.get(true), pair.get(false));\r
+        }\r
+    }\r
 }\r
diff --git a/src/main/java/jp/naist/se/stigmata/birthmarks/extractors/FrequencyMethodCallBirthmarkExtractorService.java b/src/main/java/jp/naist/se/stigmata/birthmarks/extractors/FrequencyMethodCallBirthmarkExtractorService.java
new file mode 100755 (executable)
index 0000000..025be18
--- /dev/null
@@ -0,0 +1,36 @@
+package jp.naist.se.stigmata.birthmarks.extractors;\r
+\r
+/*\r
+ * $Id: UsedClassesBirthmarkExtractorService.java 140 2007-06-28 10:48:47Z tama3 $\r
+ */\r
+\r
+import jp.naist.se.stigmata.BirthmarkExtractor;\r
+import jp.naist.se.stigmata.birthmarks.fmc.FrequencyMethodCallBirthmarkExtractor;\r
+import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
+\r
+/**\r
+ * Birthmark Service Provider Interface.\r
+ *\r
+ * @author Haruaki TAMADA\r
+ * @version $Revision: 140 $ $Date: 2007-06-28 19:48:47 +0900 (Thu, 28 Jun 2007) $\r
+ */\r
+public class FrequencyMethodCallBirthmarkExtractorService extends AbstractBirthmarkExtractorService{\r
+\r
+    /**\r
+     * returns a type of the birthmark this service provides.\r
+     */\r
+    public String getType(){\r
+        return "fmc";\r
+    }\r
+\r
+    public String getExtractorClassName(){\r
+        return "jp.naist.se.stigmata.birthmarks.fmc.FrequencyMethodCallBirthmarkExtractor";\r
+    }\r
+\r
+    /**\r
+     * returns a extractor for the birthmark of this service.\r
+     */\r
+    public BirthmarkExtractor getExtractor(BirthmarkSpi service){\r
+        return new FrequencyMethodCallBirthmarkExtractor(service);\r
+    }\r
+}
\ No newline at end of file
diff --git a/src/main/java/jp/naist/se/stigmata/birthmarks/extractors/FrequencyUsedClassesBirthmarkExtractorService.java b/src/main/java/jp/naist/se/stigmata/birthmarks/extractors/FrequencyUsedClassesBirthmarkExtractorService.java
new file mode 100755 (executable)
index 0000000..79991fa
--- /dev/null
@@ -0,0 +1,36 @@
+package jp.naist.se.stigmata.birthmarks.extractors;\r
+\r
+/*\r
+ * $Id: UsedClassesBirthmarkExtractorService.java 140 2007-06-28 10:48:47Z tama3 $\r
+ */\r
+\r
+import jp.naist.se.stigmata.BirthmarkExtractor;\r
+import jp.naist.se.stigmata.birthmarks.fuc.FrequencyUsedClassesBirthmarkExtractor;\r
+import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
+\r
+/**\r
+ * Birthmark Service Provider Interface.\r
+ *\r
+ * @author Haruaki TAMADA\r
+ * @version $Revision: 140 $ $Date: 2007-06-28 19:48:47 +0900 (Thu, 28 Jun 2007) $\r
+ */\r
+public class FrequencyUsedClassesBirthmarkExtractorService extends AbstractBirthmarkExtractorService{\r
+\r
+    /**\r
+     * returns a type of the birthmark this service provides.\r
+     */\r
+    public String getType(){\r
+        return "fuc";\r
+    }\r
+\r
+    public String getExtractorClassName(){\r
+        return "jp.naist.se.stigmata.birthmarks.fuc.FrequencyUsedClassesBirthmarkExtractor";\r
+    }\r
+\r
+    /**\r
+     * returns a extractor for the birthmark of this service.\r
+     */\r
+    public BirthmarkExtractor getExtractor(BirthmarkSpi service){\r
+        return new FrequencyUsedClassesBirthmarkExtractor(service);\r
+    }\r
+}
\ No newline at end of file
diff --git a/src/main/java/jp/naist/se/stigmata/birthmarks/fmc/FrequencyMethodCallBirthmark.java b/src/main/java/jp/naist/se/stigmata/birthmarks/fmc/FrequencyMethodCallBirthmark.java
deleted file mode 100755 (executable)
index 36152bd..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-package jp.naist.se.stigmata.birthmarks.fmc;\r
-\r
-/*\r
- * $Id$\r
- */\r
-\r
-import java.util.Arrays;\r
-import java.util.Comparator;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.Map;\r
-\r
-import jp.naist.se.stigmata.AbstractBirthmark;\r
-import jp.naist.se.stigmata.BirthmarkElement;\r
-import jp.naist.se.stigmata.utils.ArrayIterator;\r
-\r
-/**\r
- * \r
- * @author Haruaki Tamada\r
- * @version $Revision$ $Date$\r
- */\r
-public class FrequencyMethodCallBirthmark extends AbstractBirthmark{\r
-    private static final long serialVersionUID = 1905526895627693908L;\r
-\r
-    private Map<String, FrequencyOfMethodBirthmarkElement> counts = new HashMap<String, FrequencyOfMethodBirthmarkElement>();\r
-    private String type;\r
-\r
-    public FrequencyMethodCallBirthmark(String type){\r
-        this.type = type;\r
-    }\r
-\r
-    @Override\r
-    public int getElementCount(){\r
-        return counts.size();\r
-    }\r
-\r
-    @Override\r
-    public synchronized BirthmarkElement[] getElements(){\r
-        FrequencyOfMethodBirthmarkElement[] elements = new FrequencyOfMethodBirthmarkElement[counts.size()];\r
-        int index = 0;\r
-        for(Map.Entry<String, FrequencyOfMethodBirthmarkElement> entry: counts.entrySet()){\r
-            elements[index] = entry.getValue();\r
-            index++;\r
-        }\r
-        Arrays.sort(elements, new Comparator<FrequencyOfMethodBirthmarkElement>(){\r
-            public int compare(FrequencyOfMethodBirthmarkElement o1, FrequencyOfMethodBirthmarkElement o2){\r
-                return o1.getValueName().compareTo(o2.getValueName());\r
-            }\r
-        });\r
-        \r
-        return elements;\r
-    }\r
-\r
-    @Override\r
-    public Iterator<BirthmarkElement> iterator(){\r
-        return new ArrayIterator<BirthmarkElement>(getElements());\r
-    }\r
-\r
-    public void addElement(BirthmarkElement element){\r
-        if(element instanceof FrequencyOfMethodBirthmarkElement){\r
-            FrequencyOfMethodBirthmarkElement e = (FrequencyOfMethodBirthmarkElement)element;\r
-            FrequencyOfMethodBirthmarkElement foundElement = counts.get(e.getValueName());\r
-            if(foundElement != null){\r
-                foundElement.incrementValueCount();\r
-            }\r
-            else{\r
-                foundElement = e;\r
-            }\r
-            counts.put(e.getValueName(), foundElement);\r
-        }        \r
-    }\r
-\r
-    @Override\r
-    public String getType(){\r
-        return type;\r
-    }\r
-}\r
index 3fd5948..63b6949 100755 (executable)
@@ -7,6 +7,7 @@ package jp.naist.se.stigmata.birthmarks.fmc;
 import jp.naist.se.stigmata.Birthmark;\r
 import jp.naist.se.stigmata.BirthmarkContext;\r
 import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;\r
+import jp.naist.se.stigmata.birthmarks.FrequencyBirthmarkElement;\r
 \r
 import org.objectweb.asm.ClassVisitor;\r
 import org.objectweb.asm.MethodAdapter;\r
@@ -33,7 +34,7 @@ public class FrequencyMethodCallBirthmarkExtractVisitor extends BirthmarkExtract
             public void visitMethodInsn(int opcode, String owner, String name, String desc){\r
                 String className = owner.replace('/', '.');\r
                 if(getContext().getWellknownClassManager().isWellKnownClass(className)){\r
-                    addElement(new FrequencyOfMethodBirthmarkElement(className, name, desc));\r
+                    addElement(new FrequencyBirthmarkElement(className + "#" + name + desc));\r
                 }\r
                 super.visitMethodInsn(opcode, owner, name, desc);\r
             }\r
index 3c4ff6a..30b9891 100755 (executable)
@@ -9,6 +9,7 @@ import jp.naist.se.stigmata.BirthmarkContext;
 import jp.naist.se.stigmata.ExtractionUnit;
 import jp.naist.se.stigmata.birthmarks.ASMBirthmarkExtractor;
 import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;
+import jp.naist.se.stigmata.birthmarks.FrequencyBirthmark;
 import jp.naist.se.stigmata.spi.BirthmarkSpi;
 
 import org.objectweb.asm.ClassWriter;
@@ -39,6 +40,6 @@ public class FrequencyMethodCallBirthmarkExtractor extends ASMBirthmarkExtractor
 
     @Override
     public Birthmark createBirthmark(){
-        return new FrequencyMethodCallBirthmark(getProvider().getType());
+        return new FrequencyBirthmark(getProvider().getType());
     }
 }
diff --git a/src/main/java/jp/naist/se/stigmata/birthmarks/fmc/FrequencyOfMethodBirthmarkElement.java b/src/main/java/jp/naist/se/stigmata/birthmarks/fmc/FrequencyOfMethodBirthmarkElement.java
deleted file mode 100755 (executable)
index 8e7bec8..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-package jp.naist.se.stigmata.birthmarks.fmc;\r
-\r
-import jp.naist.se.stigmata.birthmarks.ValueCountable;\r
-import jp.naist.se.stigmata.birthmarks.smc.MethodCallBirthmarkElement;\r
-\r
-public class FrequencyOfMethodBirthmarkElement extends MethodCallBirthmarkElement implements ValueCountable{\r
-    private static final long serialVersionUID = 4454345943098520436L;\r
-\r
-    private int count = 1;\r
-\r
-    public FrequencyOfMethodBirthmarkElement(String className, String methodName, String signature){\r
-        super(className, methodName, signature);\r
-    }\r
-\r
-    void incrementValueCount(){\r
-        count++;\r
-    }\r
-\r
-    @Override\r
-    public boolean equals(Object o){\r
-        boolean flag = false;\r
-        if(o instanceof FrequencyOfMethodBirthmarkElement){\r
-            FrequencyOfMethodBirthmarkElement fmbe = (FrequencyOfMethodBirthmarkElement)o;\r
-            flag = super.equals(fmbe) && getValueCount() == fmbe.getValueCount();\r
-        }\r
-        return flag;\r
-    }\r
-\r
-    @Override\r
-    public Object getValue(){\r
-        return getValueCount() + ": " + getValueName();\r
-    }\r
-\r
-    @Override\r
-    public int hashCode(){\r
-        return System.identityHashCode(this);\r
-    }\r
-\r
-    public String getValueName(){\r
-        return getClassName() + "#" + getMethodName() + "!" + getSignature();\r
-    }\r
-\r
-    public int getValueCount(){\r
-        return count;\r
-    }\r
-}\r
diff --git a/src/main/java/jp/naist/se/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkExtractor.java b/src/main/java/jp/naist/se/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkExtractor.java
new file mode 100755 (executable)
index 0000000..143fdc7
--- /dev/null
@@ -0,0 +1,47 @@
+package jp.naist.se.stigmata.birthmarks.fuc;
+
+/*
+ * $Id: UsedClassesBirthmarkExtractor.java 140 2007-06-28 10:48:47Z tama3 $
+ */
+
+import jp.naist.se.stigmata.Birthmark;
+import jp.naist.se.stigmata.BirthmarkContext;
+import jp.naist.se.stigmata.ExtractionUnit;
+import jp.naist.se.stigmata.birthmarks.ASMBirthmarkExtractor;
+import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;
+import jp.naist.se.stigmata.birthmarks.FrequencyBirthmark;
+import jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkExtractVisitor;
+import jp.naist.se.stigmata.spi.BirthmarkSpi;
+
+import org.objectweb.asm.ClassWriter;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision: 140 $ $Date: 2007-06-28 19:48:47 +0900 (Thu, 28 Jun 2007) $
+ */
+public class FrequencyUsedClassesBirthmarkExtractor extends ASMBirthmarkExtractor{
+    public FrequencyUsedClassesBirthmarkExtractor(BirthmarkSpi spi){
+        super(spi);
+    }
+
+    public FrequencyUsedClassesBirthmarkExtractor(){
+        super();
+    }
+
+    @Override
+    public BirthmarkExtractVisitor createExtractVisitor(ClassWriter writer, Birthmark birthmark, BirthmarkContext context){
+        return new UsedClassesBirthmarkExtractVisitor(writer, birthmark, context);
+    }
+
+    public ExtractionUnit[] getAcceptableUnits(){
+        return new ExtractionUnit[] {
+            ExtractionUnit.CLASS, ExtractionUnit.PACKAGE, ExtractionUnit.ARCHIVE, 
+        };
+    }
+
+    @Override
+    public Birthmark createBirthmark(){
+        return new FrequencyBirthmark(getProvider().getType());
+    }
+}
diff --git a/src/main/java/jp/naist/se/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkService.java b/src/main/java/jp/naist/se/stigmata/birthmarks/fuc/FrequencyUsedClassesBirthmarkService.java
new file mode 100755 (executable)
index 0000000..7d344b2
--- /dev/null
@@ -0,0 +1,47 @@
+package jp.naist.se.stigmata.birthmarks.fuc;\r
+\r
+/*\r
+ * $Id: UsedClassesBirthmarkService.java 140 2007-06-28 10:48:47Z tama3 $\r
+ */\r
+\r
+import jp.naist.se.stigmata.BirthmarkComparator;\r
+import jp.naist.se.stigmata.BirthmarkExtractor;\r
+import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkService;\r
+import jp.naist.se.stigmata.birthmarks.comparators.CosineSimilarityBirthmarkComparator;\r
+import jp.naist.se.stigmata.spi.BirthmarkSpi;\r
+\r
+/**\r
+ * \r
+ * \r
+ *\r
+ * @author Haruaki TAMADA\r
+ * @version $Revision: 140 $ $Date: 2007-06-28 19:48:47 +0900 (Thu, 28 Jun 2007) $\r
+ */\r
+public class FrequencyUsedClassesBirthmarkService extends AbstractBirthmarkService implements BirthmarkSpi{\r
+    private BirthmarkComparator comparator = new CosineSimilarityBirthmarkComparator(this);\r
+    private BirthmarkExtractor extractor = new FrequencyUsedClassesBirthmarkExtractor(this);\r
+\r
+    public String getType(){\r
+        return "fuc";\r
+    }\r
+\r
+    public String getDefaultDescription(){\r
+        return "Frequency of used classes in target class.";\r
+    }\r
+\r
+    public BirthmarkExtractor getExtractor(){\r
+        return extractor;\r
+    }\r
+\r
+    public BirthmarkComparator getComparator(){\r
+        return comparator;\r
+    }\r
+\r
+    public boolean isExpert(){\r
+        return false;\r
+    }\r
+\r
+    public boolean isUserDefined(){\r
+        return false;\r
+    }\r
+}\r
index 8846b52..de4bfbd 100644 (file)
@@ -7,12 +7,12 @@ package jp.naist.se.stigmata.birthmarks.is;
 import java.io.IOException;
 import java.io.InputStream;
 
-import jp.naist.se.stigmata.AbstractBirthmarkExtractor;
 import jp.naist.se.stigmata.Birthmark;
 import jp.naist.se.stigmata.BirthmarkContext;
 import jp.naist.se.stigmata.BirthmarkElementClassNotFoundException;
 import jp.naist.se.stigmata.BirthmarkExtractionException;
 import jp.naist.se.stigmata.ExtractionUnit;
+import jp.naist.se.stigmata.birthmarks.AbstractBirthmarkExtractor;
 import jp.naist.se.stigmata.birthmarks.BirthmarkExtractVisitor;
 import jp.naist.se.stigmata.spi.BirthmarkSpi;
 
index 5f3f05a..814d715 100755 (executable)
@@ -3,3 +3,5 @@ jp.naist.se.stigmata.birthmarks.extractors.InheritanceStructureBirthmarkExtracto
 jp.naist.se.stigmata.birthmarks.extractors.SequentialMethodCallBirthmarkExtractorService\r
 jp.naist.se.stigmata.birthmarks.extractors.UsedClassesBirthmarkExtractorService\r
 jp.naist.se.stigmata.birthmarks.extractors.KGramBasedBirthmarkExtractorService\r
+jp.naist.se.stigmata.birthmarks.extractors.FrequencyMethodCallBirthmarkExtractorService\r
+jp.naist.se.stigmata.birthmarks.extractors.FrequencyUsedClassesBirthmarkExtractorService\r
index c00bc61..0760b1b 100755 (executable)
@@ -4,3 +4,4 @@ jp.naist.se.stigmata.birthmarks.is.InheritanceStructureBirthmarkService
 jp.naist.se.stigmata.birthmarks.uc.UsedClassesBirthmarkService\r
 jp.naist.se.stigmata.birthmarks.kgram.KGramBasedBirthmarkService\r
 jp.naist.se.stigmata.birthmarks.fmc.FrequencyMethodCallBirthmarkService\r
+jp.naist.se.stigmata.birthmarks.fuc.FrequencyUsedClassesBirthmarkService\r
index c0028b3..dd41e4b 100644 (file)
@@ -10,6 +10,8 @@ birthmark.kgram.display.type=k-gram
 birthmark.kgram.description=Set of extracted k-gram from opcode sequence.\r
 birthmark.fmc.display.type=Frequency of Method Calls\r
 birthmark.fmc.description=Frequency of method calls.\r
+birthmark.fuc.display.type=Frequency of Used Classes\r
+birthmark.fuc.description=Frequency of used classes.\r
 \r
 comparator.dpmatching.description=\r
 comparator.editdistance.description=\r
index d30ddb1..da06bbe 100644 (file)
@@ -10,6 +10,8 @@ birthmark.kgram.display.type=k-gram
 birthmark.kgram.description=opcode\82Ì\95À\82Ñ\82©\82çk-gram\82ð\8eæ\82è\8fo\82µ\82½\8fW\8d\87\r
 birthmark.fmc.display.type=\83\81\83\\83b\83h\8fo\8c»\95p\93x\r
 birthmark.fmc.description=\83\81\83\\83b\83h\8cÄ\8fo\82µ\82Ì\8fo\8c»\95p\93x\r
+birthmark.fuc.display.type=\88Ë\91\83N\83\89\83X\82Ì\95p\93x\r
+birthmark.fuc.description=\88Ë\91\83N\83\89\83X\82Ì\8fo\8c»\95p\93x\r
 \r
 filter.similarity.display.type=\97Þ\8e\97\93x\82Å\82Ì\83t\83B\83\8b\83^\83\8a\83\93\83O\r
 filter.name.display.type=\83N\83\89\83X\96¼\82Å\82Ì\83t\83B\83\8b\83^\83\8a\83\93\83O\r