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
-package jp.naist.se.stigmata;
+package jp.naist.se.stigmata.birthmarks;
/*
* $Id$
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>}
*
-package jp.naist.se.stigmata;\r
+package jp.naist.se.stigmata.birthmarks;\r
\r
/*\r
* $Id$\r
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
--- /dev/null
+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
--- /dev/null
+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
* $Id$\r
*/\r
\r
-import jp.naist.se.stigmata.AbstractBirthmark;\r
import jp.naist.se.stigmata.BirthmarkElement;\r
\r
/**\r
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
}\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
--- /dev/null
+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
--- /dev/null
+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
+++ /dev/null
-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
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
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
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;
@Override
public Birthmark createBirthmark(){
- return new FrequencyMethodCallBirthmark(getProvider().getType());
+ return new FrequencyBirthmark(getProvider().getType());
}
}
+++ /dev/null
-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
--- /dev/null
+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());
+ }
+}
--- /dev/null
+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
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;
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
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
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
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