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 }