OSDN Git Service

9c8e5271a6983bb9a765e1e6c89434f032f4eda0
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / birthmarks / kgram / KGramBasedBirthmarkExtractor.java
1 package jp.sourceforge.stigmata.birthmarks.kgram;
2
3 import jp.sourceforge.stigmata.Birthmark;
4 import jp.sourceforge.stigmata.BirthmarkContext;
5 import jp.sourceforge.stigmata.BirthmarkElement;
6 import jp.sourceforge.stigmata.ExtractionUnit;
7 import jp.sourceforge.stigmata.birthmarks.ASMBirthmarkExtractor;
8 import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
9 import jp.sourceforge.stigmata.spi.BirthmarkService;
10
11 import org.objectweb.asm.ClassWriter;
12
13 /**
14  * @author Haruaki TAMADA
15  */
16 public class KGramBasedBirthmarkExtractor extends ASMBirthmarkExtractor{
17     private int kvalue = 4;
18
19     public KGramBasedBirthmarkExtractor(BirthmarkService spi){
20         super(spi);
21     }
22
23     public KGramBasedBirthmarkExtractor(){
24         super();
25     }
26
27     public void setKValue(int kvalue){
28         this.kvalue = kvalue;
29     }
30
31     public int getKValue(){
32         return kvalue;
33     }
34
35     @Override
36     public BirthmarkExtractVisitor createExtractVisitor(ClassWriter writer, Birthmark birthmark, BirthmarkContext context){
37         KGramBasedBirthmarkExtractVisitor extractor = new KGramBasedBirthmarkExtractVisitor(writer, birthmark, context);
38         extractor.setKValue(getKValue());
39         return extractor;
40     }
41
42     @Override
43     public ExtractionUnit[] getAcceptableUnits(){
44         return new ExtractionUnit[] {
45             ExtractionUnit.CLASS, ExtractionUnit.PACKAGE, ExtractionUnit.ARCHIVE, 
46         };
47     }
48
49
50     @Override
51     public BirthmarkElement buildElement(String value) {
52         value = value.trim();
53         if(value.startsWith("{") && value.endsWith("}")){
54             String[] param = value.substring(1, value.length() - 1).split(", *");
55             KGram<Integer> kgram = new KGram<Integer>(param.length);
56             for(int i = 0; i < param.length; i++){
57                 kgram.set(i, new Integer(param[i].trim()));
58             }
59             return new KGramBasedBirthmarkElement<Integer>(kgram);
60         }
61         return null;
62     }
63 }