1 4 package com.tcspring; 5 6 import org.apache.commons.logging.Log; 7 import org.apache.commons.logging.LogFactory; 8 9 import com.tc.asm.signature.SignatureReader; 10 import com.tc.asm.signature.SignatureVisitor; 11 import com.tc.aspectwerkz.reflect.ClassInfo; 12 import com.tc.aspectwerkz.reflect.FieldInfo; 13 import com.tc.aspectwerkz.reflect.impl.asm.AsmClassInfo; 14 import com.tc.object.bytecode.hook.DSOContext; 15 16 import java.lang.reflect.Modifier ; 17 import java.util.HashSet ; 18 import java.util.LinkedList ; 19 import java.util.Set ; 20 21 public class ClassHierarchyWalker { 22 private final transient Log logger = LogFactory.getLog(getClass()); 23 24 private final String id; 25 private final DSOContext dsoContext; 26 27 private final LinkedList queue = new LinkedList (); 28 private final Set processed = new HashSet (); 30 public ClassHierarchyWalker(String id, DSOContext dsoContext) { 31 this.id = id; 32 this.dsoContext = dsoContext; 33 } 34 35 public void walkClass(ClassInfo classInfo) { 36 addClassIfNeeded(classInfo); 37 walkThroughClassHierarchy(); 38 } 39 40 public void walkClass(String className, ClassLoader loader) { 41 try { 42 walkClass(AsmClassInfo.getClassInfo(className, loader)); 43 } catch (Exception e) { 44 logger.warn("Unable to read class " + className, e); 46 } 47 } 48 49 private void walkThroughClassHierarchy() { 50 while (queue.size() > 0) { 51 ClassInfo classInfo = (ClassInfo) queue.removeFirst(); 52 processed.add(classInfo.getName()); 53 54 addClassGenerics(classInfo.getGenericsSignature(), classInfo.getClassLoader()); 55 56 String className = classInfo.getName(); 57 logger.info(this.id + " registering include for " + className); 58 dsoContext.addInclude(className, true, "* " + className + ".*(..)"); 59 60 62 addClassIfNeeded(classInfo.getSuperclass()); 63 64 FieldInfo[] fields = classInfo.getFields(); 65 for (int i = 0; i < fields.length; i++) { 66 FieldInfo fieldInfo = fields[i]; 67 int modifiers = fieldInfo.getModifiers(); 68 if ((modifiers & (Modifier.TRANSIENT | Modifier.STATIC)) == 0) { 69 ClassInfo fieldType = fieldInfo.getType(); 70 if (fieldType.isArray()) { 71 fieldType = fieldType.getComponentType(); 72 } 73 addClassIfNeeded(fieldType); 74 75 addFieldGenerics(fieldInfo.getGenericsSignature(), fieldType.getClassLoader()); 76 } 77 } 78 } 79 } 80 81 private void addClassIfNeeded(String name, ClassLoader loader) { 82 addClassIfNeeded(AsmClassInfo.getClassInfo(name, loader)); 83 } 84 85 private void addClassIfNeeded(ClassInfo classInfo) { 86 if (classInfo == null) { return; } 87 String className = classInfo.getName(); 88 if (!classInfo.isInterface() && !classInfo.isPrimitive() 89 && !"org.springframework.context.ApplicationEvent".equals(className) && !"java.lang.Object".equals(className)) { 91 if (!processed.contains(className) && !queue.contains(classInfo)) { 92 queue.add(classInfo); 93 } 94 } 95 } 96 97 98 99 private void addClassGenerics(String signature, ClassLoader loader) { 100 if(signature!=null) { 101 SignatureReader signatureReader = new SignatureReader(signature); 102 signatureReader.accept(new GenericsCollector(loader)); 103 } 104 } 105 106 private void addFieldGenerics(String signature, ClassLoader loader) { 107 if(signature!=null) { 108 SignatureReader signatureReader = new SignatureReader(signature); 109 signatureReader.accept(new GenericsCollector(loader)); 110 } 111 } 112 113 114 private final class GenericsCollector implements SignatureVisitor { 115 private final ClassLoader loader; 116 117 public GenericsCollector(ClassLoader loader) { 118 this.loader = loader; 119 } 120 121 public void visitClassType(String name) { 122 addClassIfNeeded(name, loader); 123 } 124 125 public void visitInnerClassType(String name) { 126 addClassIfNeeded(name, loader); 127 } 128 129 public void visitFormalTypeParameter(String name) { 130 } 132 133 public void visitTypeVariable(String name) { 134 } 136 137 public SignatureVisitor visitArrayType() { 138 return this; 139 } 140 141 public SignatureVisitor visitClassBound() { 142 return this; 143 } 144 145 public SignatureVisitor visitExceptionType() { 146 return this; 147 } 148 149 public SignatureVisitor visitInterface() { 150 return this; 151 } 152 153 public SignatureVisitor visitInterfaceBound() { 154 return this; 155 } 156 157 public SignatureVisitor visitParameterType() { 158 return this; 159 } 160 161 public SignatureVisitor visitReturnType() { 162 return this; 163 } 164 165 public SignatureVisitor visitSuperclass() { 166 return this; 167 } 168 169 public SignatureVisitor visitTypeArgument(char wildcard) { 170 return this; 171 } 172 173 public void visitBaseType(char descriptor) { 174 } 176 177 public void visitTypeArgument() { 178 } 180 181 public void visitEnd() { 182 } 184 } 185 186 } 187
| Popular Tags
|