OSDN Git Service

Remove Id tag
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / birthmarks / is / InheritanceStructureBirthmarkExtractor.java
1 package jp.sourceforge.stigmata.birthmarks.is;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5
6 import jp.sourceforge.stigmata.Birthmark;
7 import jp.sourceforge.stigmata.BirthmarkContext;
8 import jp.sourceforge.stigmata.BirthmarkElementClassNotFoundException;
9 import jp.sourceforge.stigmata.BirthmarkExtractionFailedException;
10 import jp.sourceforge.stigmata.ExtractionUnit;
11 import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkExtractor;
12 import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
13 import jp.sourceforge.stigmata.spi.BirthmarkSpi;
14
15 import org.objectweb.asm.ClassReader;
16 import org.objectweb.asm.ClassWriter;
17
18
19 /**
20  * 
21  * @author Haruaki TAMADA
22  */
23 public class InheritanceStructureBirthmarkExtractor extends AbstractBirthmarkExtractor{
24     public InheritanceStructureBirthmarkExtractor(BirthmarkSpi spi){
25         super(spi);
26     }
27
28     @SuppressWarnings("deprecation")
29     public InheritanceStructureBirthmarkExtractor(){
30         super();
31     }
32
33     @Override
34     public Birthmark extract(Birthmark birthmark, InputStream in, BirthmarkContext context) throws BirthmarkExtractionFailedException{
35         BirthmarkElementClassNotFoundException e = new BirthmarkElementClassNotFoundException();
36
37         try{
38             ClassReader reader = new ClassReader(in);
39             ClassWriter writer = new ClassWriter(0);
40             BirthmarkExtractVisitor visitor = new InheritanceStructureBirthmarkExtractVisitor(writer, birthmark, context);
41             reader.accept(visitor, 0);
42
43             if(!visitor.isSuccess()){
44                 for(Throwable t: visitor.getCauses()){
45                     if(t instanceof ClassNotFoundException){
46                         e.addClassName(t.getMessage());
47                     }
48                     else{
49                         e.addCause(t);
50                     }
51                 }
52             }
53         } catch(IOException ee){
54             e.addCause(ee);
55         } finally{
56             if(e.isFailed()){
57                 System.out.printf("fail: %s%n", e.getMessage());
58                 throw e;
59             }
60         }
61         return birthmark;
62      }
63
64     @Override
65     public ExtractionUnit[] getAcceptableUnits(){
66         return new ExtractionUnit[] { ExtractionUnit.CLASS, };
67     }
68 }