X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fjp%2Fsourceforge%2Fstigmata%2Fbirthmarks%2Fis%2FInheritanceStructureBirthmarkExtractVisitor.java;fp=src%2Fmain%2Fjava%2Fjp%2Fsourceforge%2Fstigmata%2Fbirthmarks%2Fis%2FInheritanceStructureBirthmarkExtractVisitor.java;h=347d19174b6bba934a51ccef8dfff054c8d8af49;hb=59e985b7e3ce878e476ff2c9e8c3227231a4a5dc;hp=3c73e186cf5b0c3c05273c4671f5d991f017e695;hpb=b4c5f64825e1626d32449435a5fb362348897076;p=stigmata%2Fstigmata.git diff --git a/src/main/java/jp/sourceforge/stigmata/birthmarks/is/InheritanceStructureBirthmarkExtractVisitor.java b/src/main/java/jp/sourceforge/stigmata/birthmarks/is/InheritanceStructureBirthmarkExtractVisitor.java index 3c73e18..347d191 100644 --- a/src/main/java/jp/sourceforge/stigmata/birthmarks/is/InheritanceStructureBirthmarkExtractVisitor.java +++ b/src/main/java/jp/sourceforge/stigmata/birthmarks/is/InheritanceStructureBirthmarkExtractVisitor.java @@ -5,10 +5,14 @@ import jp.sourceforge.stigmata.BirthmarkContext; import jp.sourceforge.stigmata.BirthmarkElement; import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor; import jp.sourceforge.stigmata.birthmarks.NullBirthmarkElement; +import jp.sourceforge.stigmata.digger.ClassFileEntry; +import jp.sourceforge.stigmata.digger.ClasspathContext; import jp.sourceforge.stigmata.utils.WellknownClassManager; import org.objectweb.asm.ClassVisitor; +import com.sun.xml.internal.ws.org.objectweb.asm.Opcodes; + /** * * @@ -23,16 +27,44 @@ public class InheritanceStructureBirthmarkExtractVisitor extends BirthmarkExtrac @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces){ - try { - Class c = getEnvironment().getClasspathContext().findClass(name.replace('/', '.')); - if(c != null && !c.isInterface()){ - addISBirthmark(c); + if((access & Opcodes.ACC_INTERFACE) != Opcodes.ACC_INTERFACE){ + ClasspathContext context = getEnvironment().getClasspathContext(); + name = name.replace('/', '.'); + ClassFileEntry entry = context.findEntry(name); + if(entry == null){ + superName = superName.replace('/', '.'); + ClassFileEntry parent = context.findEntry(superName); + if(parent != null){ + addIsBirthmark(name); + addIsBirthmark(superName); + } + else{ + addFailur(new ClassNotFoundException(superName)); + } + } + else{ + try{ + Class clazz = context.findClass(name); + addISBirthmark(clazz); + } catch(ClassNotFoundException e){ + addFailur(e); + } } - } catch (ClassNotFoundException ex){ - addFailur(ex); } } + private void addIsBirthmark(String className){ + WellknownClassManager wcm = getEnvironment().getWellknownClassManager(); + BirthmarkElement element; + if(wcm.isWellKnownClass(className)){ + element = new BirthmarkElement(className); + } + else{ + element = NullBirthmarkElement.getInstance(); + } + addElement(element); + } + private void addISBirthmark(Class c){ WellknownClassManager wcm = getEnvironment().getWellknownClassManager(); do{