OSDN Git Service

add preprocessor
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Tue, 2 Dec 2008 10:35:33 +0000 (10:35 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Tue, 2 Dec 2008 10:35:33 +0000 (10:35 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/plugins/trunk@333 acee48c3-7b26-0410-bdac-b3d0e5314bbc

wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/CurrentDepth.java
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/Opcode.java
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkComparator.java
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkExtractor.java
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkPreprocessor.java [new file with mode: 0644]
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkService.java

index b23fc17..4a4bf0e 100644 (file)
@@ -1,5 +1,14 @@
 package jp.sourceforge.stigmata.birthmarks.wsp;
 
+/*
+ * $Id$
+ */
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
 public class CurrentDepth{
     private Opcode opcode;
     private int depth;
index d167fb4..00358fb 100644 (file)
@@ -27,6 +27,7 @@ public class Opcode implements Serializable{
     private String name;
     private int argumentCount;
     private int act;
+    private int weight;
     private Category category;
     private List<Label> labels = new ArrayList<Label>();
 
@@ -46,6 +47,11 @@ public class Opcode implements Serializable{
         this.category = category;
     }
 
+    Opcode(int opcode, String name, int argumentCount, int act, Category category, int weight){
+        this(opcode, name, argumentCount, act, category);
+        setWeight(weight);
+    }
+
     public int getOpcode(){
         return opcode;
     }
@@ -92,4 +98,12 @@ public class Opcode implements Serializable{
     public Category getCategory(){
         return category;
     }
+
+    public void setWeight(int weight){
+        this.weight = weight;
+    }
+
+    public int getWeight(){
+        return weight;
+    }
 }
index a01a493..d47b2e4 100644 (file)
@@ -5,6 +5,7 @@ package jp.sourceforge.stigmata.birthmarks.wsp;
  */
 
 import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkContext;
 import jp.sourceforge.stigmata.birthmarks.comparators.AbstractBirthmarkComparator;
 import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
@@ -19,7 +20,7 @@ public class StackPatternBasedBirthmarkComparator extends AbstractBirthmarkCompa
     }
 
     @Override
-    public double compare(Birthmark b1, Birthmark b2){
+    public double compare(Birthmark b1, Birthmark b2, BirthmarkContext context){
         // TODO implement this method.
         return 0;
     }
index 183306f..8ca70d6 100644 (file)
@@ -11,8 +11,8 @@ import java.util.List;
 import java.util.Map;
 
 import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkContext;
 import jp.sourceforge.stigmata.BirthmarkElement;
-import jp.sourceforge.stigmata.BirthmarkEnvironment;
 import jp.sourceforge.stigmata.ExtractionUnit;
 import jp.sourceforge.stigmata.birthmarks.ASMBirthmarkExtractor;
 import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
@@ -34,19 +34,19 @@ public class StackPatternBasedBirthmarkExtractor extends ASMBirthmarkExtractor{
     }
 
     @Override
-    public BirthmarkExtractVisitor createExtractVisitor(ClassWriter writer, Birthmark birthmark, BirthmarkEnvironment environment){
-        return new Visitor(writer, birthmark, environment);
+    public BirthmarkExtractVisitor createExtractVisitor(ClassWriter writer, Birthmark birthmark, BirthmarkContext context){
+        return new Visitor(writer, birthmark, context);
     }
 
     @Override
     public ExtractionUnit[] getAcceptableUnits(){
         return new ExtractionUnit[] {
-            ExtractionUnit.ARCHIVE, ExtractionUnit.PACKAGE, ExtractionUnit.CLASS,
+            ExtractionUnit.CLASS,
         };
     }
 
-    private BirthmarkElement[] buildElement(List<Opcode> opcodes){
-        StackPattern pattern = buildStackPattern(opcodes);
+    private BirthmarkElement[] buildElement(List<Opcode> opcodes, BirthmarkContext context){
+        StackPattern pattern = buildStackPattern(opcodes, context);
         List<BirthmarkElement> elements = new ArrayList<BirthmarkElement>();
 
         StackPattern subpattern = new StackPattern();
@@ -62,13 +62,16 @@ public class StackPatternBasedBirthmarkExtractor extends ASMBirthmarkExtractor{
         return elements.toArray(new BirthmarkElement[elements.size()]);
     }
 
-    private StackPattern buildStackPattern(List<Opcode> opcodes){ 
+    @SuppressWarnings("unchecked")
+    private StackPattern buildStackPattern(List<Opcode> opcodes, BirthmarkContext context){ 
         Map<Label, Integer> tableMap = new HashMap<Label, Integer>();
         StackPattern pattern = new StackPattern();
+        Map<Integer, Integer> weights = (Map<Integer, Integer>)context.getProperty("birthmarks.wsp.weights");
 
         int currentDepth = 0;
         Integer forwardedStatus = null;
         for(Opcode opcode: opcodes){
+            opcode.setWeight(weights.get(opcode.getOpcode()));
             if(opcode.getCategory() == Opcode.Category.TARGETER){
                 forwardedStatus = tableMap.get(((LabelOpcode)opcode).getLabel());
             }
@@ -96,12 +99,12 @@ public class StackPatternBasedBirthmarkExtractor extends ASMBirthmarkExtractor{
     private class Visitor extends BirthmarkExtractVisitor{
         private List<Opcode> opcodeList = new ArrayList<Opcode>();
 
-        public Visitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){
-            super(visitor, birthmark, environment);
+        public Visitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkContext context){
+            super(visitor, birthmark, context);
         }
 
         public void visitEnd(){
-            BirthmarkElement[] elements = buildElement(opcodeList);
+            BirthmarkElement[] elements = buildElement(opcodeList, getContext());
             for(BirthmarkElement element: elements){
                 addElement(element);
             }
diff --git a/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkPreprocessor.java b/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkPreprocessor.java
new file mode 100644 (file)
index 0000000..c6b3589
--- /dev/null
@@ -0,0 +1,94 @@
+package jp.sourceforge.stigmata.birthmarks.wsp;
+
+/*
+ * $Id$
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkPreprocessor;
+import jp.sourceforge.stigmata.digger.ClassFileArchive;
+import jp.sourceforge.stigmata.digger.ClassFileEntry;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+import org.objectweb.asm.ClassAdapter;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class StackPatternBasedBirthmarkPreprocessor extends AbstractBirthmarkPreprocessor{
+    public StackPatternBasedBirthmarkPreprocessor(BirthmarkSpi spi){
+        super(spi);
+    }
+
+    @Override
+    public void preprocess(ClassFileArchive[] targets, BirthmarkContext context){
+        Map<Integer, Integer> targetMap = new HashMap<Integer, Integer>();
+
+        int classCount = readOpcodes(targets, targetMap);
+
+        Map<Integer, Integer> weights = new HashMap<Integer, Integer>();
+        for(Map.Entry<Integer, Integer> entry: targetMap.entrySet()){
+            int opcode = entry.getKey();
+            Integer count = entry.getValue();
+            int c = 0;
+            if(count != null){
+                c = count;
+            }
+
+            weights.put(opcode, (int)Math.log(classCount / c));
+        }
+
+        context.putProperty("birthmarks.wsp.weights", weights);
+    }
+
+    private int readOpcodes(ClassFileArchive[] targets, Map<Integer, Integer> targetMap){
+        int count = 0;
+        for(ClassFileArchive archive: targets){
+            for(ClassFileEntry entry: archive){
+                count++;
+                final List<Opcode> opcodes = new ArrayList<Opcode>();
+                try{
+                    InputStream in = entry.getLocation().openStream();
+
+                    ClassReader reader = new ClassReader(in);
+                    ClassWriter writer = new ClassWriter(false);
+                    ClassAdapter opcodeExtractVisitor = new ClassAdapter(writer){
+                        @Override
+                        public MethodVisitor visitMethod(int arg0, String arg1, String arg2, String arg3, String[] arg4){
+                            OpcodeExtractionMethodVisitor visitor =
+                                new OpcodeExtractionMethodVisitor(super.visitMethod(arg0, arg1, arg2, arg3, arg4), opcodes);
+                            return visitor;
+                        }
+                    };
+                    reader.accept(opcodeExtractVisitor, false);
+
+                    for(Opcode opcode: opcodes){
+                        if(opcode.getCategory() != Opcode.Category.TARGETER){
+                            Integer i = targetMap.get(opcode.getOpcode());
+                            if(i == null){
+                                i = 0;
+                            }
+                            i = i + 1;
+                            targetMap.put(opcode.getOpcode(), i);
+                        }
+                    }
+
+                } catch(IOException e){
+                }
+            }
+        }
+        return count;
+    }
+}
index 8d557c0..ea00338 100644 (file)
@@ -6,6 +6,7 @@ package jp.sourceforge.stigmata.birthmarks.wsp;
 
 import jp.sourceforge.stigmata.BirthmarkComparator;
 import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.BirthmarkPreprocessor;
 import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkService;
 
 /**
@@ -28,6 +29,7 @@ import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkService;
 public class StackPatternBasedBirthmarkService extends AbstractBirthmarkService{
     private BirthmarkComparator comparator = new StackPatternBasedBirthmarkComparator(this);
     private BirthmarkExtractor extractor = new StackPatternBasedBirthmarkExtractor(this);
+    private BirthmarkPreprocessor preprocessor = new StackPatternBasedBirthmarkPreprocessor(this);
 
     @Override
     public String getDefaultDescription(){
@@ -49,4 +51,8 @@ public class StackPatternBasedBirthmarkService extends AbstractBirthmarkService{
         return extractor;
     }
 
+    @Override
+    public BirthmarkPreprocessor getPreprocessor(){
+        return preprocessor;
+    }
 }