OSDN Git Service

7c0f29a6bb83cf323a2e425d708e74b44d31a56f
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / birthmarks / ASMBirthmarkExtractor.java
1 package jp.sourceforge.stigmata.birthmarks;
2
3 /*
4  * $Id$
5  */
6
7 import java.io.IOException;
8 import java.io.InputStream;
9
10 import jp.sourceforge.stigmata.Birthmark;
11 import jp.sourceforge.stigmata.BirthmarkContext;
12 import jp.sourceforge.stigmata.BirthmarkExtractionFailedException;
13 import jp.sourceforge.stigmata.spi.BirthmarkSpi;
14
15 import org.objectweb.asm.ClassReader;
16 import org.objectweb.asm.ClassWriter;
17
18 /**
19  * Abstract birthmark extractor using ASM.
20  *
21  * @author Haruaki TAMADA
22  * @version $Revision$
23  */
24 public abstract class ASMBirthmarkExtractor extends AbstractBirthmarkExtractor{
25     public ASMBirthmarkExtractor(BirthmarkSpi spi){
26         super(spi);
27     }
28
29     @SuppressWarnings("deprecation")
30     public ASMBirthmarkExtractor(){
31         super();
32     }
33
34     public abstract BirthmarkExtractVisitor
35         createExtractVisitor(ClassWriter writer, Birthmark birthmark, BirthmarkContext context);
36
37     @Override
38     public Birthmark extract(Birthmark birthmark, InputStream in,
39             BirthmarkContext context) throws BirthmarkExtractionFailedException{
40         BirthmarkExtractionFailedException bee = new BirthmarkExtractionFailedException();
41
42         try{
43             ClassReader reader = new ClassReader(in);
44             ClassWriter writer = new ClassWriter(0);
45             BirthmarkExtractVisitor visitor = createExtractVisitor(writer, birthmark, context);
46             reader.accept(visitor, 0);
47
48             if(!visitor.isSuccess()){
49                 bee.addCauses(visitor.getCauses());
50             }
51
52             return visitor.getBirthmark();
53         } catch(IOException e){
54             bee.addCause(e);
55             throw bee;
56         }
57     }
58 }