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    }