OSDN Git Service

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