001 package org.shiftone.jrat.inject.bytecode.asm; 002 003 004 import org.objectweb.asm.*; 005 import org.shiftone.jrat.inject.bytecode.Modifier; 006 import org.shiftone.jrat.util.log.Logger; 007 008 009 /** 010 * @author jeff@shiftone.org (Jeff Drost) 011 */ 012 public class IfInterfaceClassVisitor implements ClassVisitor { 013 014 private static final Logger LOG = Logger.getLogger(IfInterfaceClassVisitor.class); 015 private ClassVisitor interfaceClassVisitor; 016 private ClassVisitor concreteClassVisitor; 017 private ClassVisitor currentVisitor; 018 019 public IfInterfaceClassVisitor(ClassVisitor interfaceClassVisitor, ClassVisitor concreteClassVisitor) { 020 this.interfaceClassVisitor = interfaceClassVisitor; 021 this.concreteClassVisitor = concreteClassVisitor; 022 } 023 024 025 public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { 026 027 if (Modifier.isInterface(access)) { 028 currentVisitor = interfaceClassVisitor; 029 030 // LOG.debug("is interface " + name); 031 } else { 032 currentVisitor = concreteClassVisitor; 033 034 // LOG.debug("is NOT interface " + name); 035 } 036 037 currentVisitor.visit(version, access, name, signature, superName, interfaces); 038 } 039 040 041 public void visitSource(String source, String debug) { 042 currentVisitor.visitSource(source, debug); 043 } 044 045 046 public void visitOuterClass(String owner, String name, String desc) { 047 currentVisitor.visitOuterClass(owner, name, desc); 048 } 049 050 051 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 052 return currentVisitor.visitAnnotation(desc, visible); 053 } 054 055 056 public void visitAttribute(Attribute attr) { 057 currentVisitor.visitAttribute(attr); 058 } 059 060 061 public void visitInnerClass(String name, String outerName, String innerName, int access) { 062 currentVisitor.visitInnerClass(name, outerName, innerName, access); 063 } 064 065 066 public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { 067 return currentVisitor.visitField(access, name, desc, signature, value); 068 } 069 070 071 public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { 072 return currentVisitor.visitMethod(access, name, desc, signature, exceptions); 073 } 074 075 076 public void visitEnd() { 077 078 currentVisitor.visitEnd(); 079 080 currentVisitor = null; 081 } 082 }