OSDN Git Service

014b22ca3278174618030d3a105c593c5e565785
[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  */
27 public class InheritanceStructureBirthmarkExtractor extends AbstractBirthmarkExtractor{
28     public InheritanceStructureBirthmarkExtractor(BirthmarkSpi spi){
29         super(spi);
30     }
31
32     @SuppressWarnings("deprecation")
33     public InheritanceStructureBirthmarkExtractor(){
34         super();
35     }
36
37     @Override
38     public Birthmark extract(Birthmark birthmark, InputStream in, BirthmarkContext context) throws BirthmarkExtractionFailedException{
39         BirthmarkElementClassNotFoundException e = new BirthmarkElementClassNotFoundException();
40
41         try{
42             ClassReader reader = new ClassReader(in);
43             ClassWriter writer = new ClassWriter(0);
44             BirthmarkExtractVisitor visitor = new InheritanceStructureBirthmarkExtractVisitor(writer, birthmark, context);
45             reader.accept(visitor, 0);
46
47             if(!visitor.isSuccess()){
48                 for(Throwable t: visitor.getCauses()){
49                     if(t instanceof ClassNotFoundException){
50                         e.addClassName(t.getMessage());
51                     }
52                     else{
53                         e.addCause(t);
54                     }
55                 }
56             }
57         } catch(IOException ee){
58             e.addCause(ee);
59         } finally{
60             if(e.isFailed()){
61                 System.out.printf("fail: %s%n", e.getMessage());
62                 throw e;
63             }
64         }
65         return birthmark;
66      }
67
68     @Override
69     public ExtractionUnit[] getAcceptableUnits(){
70         return new ExtractionUnit[] { ExtractionUnit.CLASS, };
71     }
72 }