1 package jp.sourceforge.stigmata.birthmarks.kgram;
3 import java.util.Iterator;
5 import jp.sourceforge.stigmata.Birthmark;
6 import jp.sourceforge.stigmata.BirthmarkContext;
7 import jp.sourceforge.stigmata.BirthmarkElement;
8 import jp.sourceforge.stigmata.ExtractionUnit;
9 import jp.sourceforge.stigmata.birthmarks.ASMBirthmarkExtractor;
10 import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
11 import jp.sourceforge.stigmata.spi.BirthmarkService;
12 import jp.sourceforge.stigmata.utils.ArrayIterator;
14 import org.objectweb.asm.ClassWriter;
17 * @author Haruaki TAMADA
19 public class KGramBasedBirthmarkExtractor extends ASMBirthmarkExtractor{
20 private int kvalue = 4;
22 public KGramBasedBirthmarkExtractor(BirthmarkService spi){
26 public KGramBasedBirthmarkExtractor(){
31 public Iterator<String> getPropertyKeys(){
32 return new ArrayIterator<String>(new String[] { "KValue" });
36 public void setProperty(String key, Object value){
37 if(key.equalsIgnoreCase("kvalue")){
38 if(value instanceof Integer){
39 kvalue = ((Integer)value).intValue();
41 else if(value instanceof String){
42 kvalue = Integer.parseInt((String)value);
47 public void setKValue(int kvalue){
51 public int getKValue(){
56 public BirthmarkExtractVisitor createExtractVisitor(ClassWriter writer,
57 Birthmark birthmark, BirthmarkContext context){
58 KGramBasedBirthmarkExtractVisitor extractor =
59 new KGramBasedBirthmarkExtractVisitor(writer, birthmark, context);
60 extractor.setKValue(getKValue());
65 public ExtractionUnit[] getAcceptableUnits(){
66 return new ExtractionUnit[] {
67 ExtractionUnit.CLASS, ExtractionUnit.PACKAGE,
68 ExtractionUnit.ARCHIVE,
74 public BirthmarkElement buildElement(String value) {
77 value.substring(1, value.length() - 1).split(" *");
78 KGram<Integer> kgram = new KGram<Integer>(param.length);
79 for(int i = 0; i < param.length; i++){
80 kgram.set(i, new Integer(param[i].trim()));
82 return new KGramBasedBirthmarkElement<Integer>(kgram);