1 package jp.sourceforge.stigmata.birthmarks.wsp;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.util.ArrayList;
10 import java.util.HashMap;
11 import java.util.HashSet;
12 import java.util.List;
16 import jp.sourceforge.stigmata.BirthmarkContext;
17 import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkPreprocessor;
18 import jp.sourceforge.stigmata.digger.ClassFileArchive;
19 import jp.sourceforge.stigmata.digger.ClassFileEntry;
20 import jp.sourceforge.stigmata.spi.BirthmarkSpi;
22 import org.objectweb.asm.ClassAdapter;
23 import org.objectweb.asm.ClassReader;
24 import org.objectweb.asm.ClassWriter;
25 import org.objectweb.asm.MethodVisitor;
29 * @author Haruaki Tamada
32 public class OpcodeWeightCalculatePreprocessor extends AbstractBirthmarkPreprocessor{
33 public OpcodeWeightCalculatePreprocessor(BirthmarkSpi spi){
38 public void preprocess(ClassFileArchive[] targets, BirthmarkContext context){
39 Map<Integer, Integer> targetMap = new HashMap<Integer, Integer>();
42 for(ClassFileArchive archive: targets){
43 classCount += readOpcodes(archive, targetMap);
46 Map<Integer, Integer> weights = new HashMap<Integer, Integer>();
47 for(Map.Entry<Integer, Integer> entry: targetMap.entrySet()){
48 int opcode = entry.getKey();
49 Integer count = entry.getValue();
55 weights.put(opcode, (int)Math.round(Math.log(classCount / c)));
58 context.putProperty("birthmarks.wsp.weights", weights);
61 private int readOpcodes(ClassFileArchive archive, Map<Integer, Integer> targetMap){
63 for(ClassFileEntry entry: archive){
65 final List<Opcode> opcodes = new ArrayList<Opcode>();
67 InputStream in = entry.getLocation().openStream();
69 ClassReader reader = new ClassReader(in);
70 ClassWriter writer = new ClassWriter(0);
71 ClassAdapter opcodeExtractVisitor = new ClassAdapter(writer){
73 public MethodVisitor visitMethod(int arg0, String arg1, String arg2, String arg3, String[] arg4){
74 OpcodeExtractionMethodVisitor visitor =
75 new OpcodeExtractionMethodVisitor(super.visitMethod(arg0, arg1, arg2, arg3, arg4), opcodes);
79 reader.accept(opcodeExtractVisitor, 0);
81 Set<Integer> set = new HashSet<Integer>();
82 for(Opcode opcode: opcodes){
83 if(opcode.getCategory() != Opcode.Category.TARGETER){
84 set.add(opcode.getOpcode());
89 Integer v = targetMap.get(i);
96 } catch(IOException e){