KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tcspring > ClassHierarchyWalker


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

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 JavaDoc;
17 import java.util.HashSet JavaDoc;
18 import java.util.LinkedList JavaDoc;
19 import java.util.Set JavaDoc;
20
21 public class ClassHierarchyWalker {
22   private final transient Log logger = LogFactory.getLog(getClass());
23
24   private final String JavaDoc id;
25   private final DSOContext dsoContext;
26
27   private final LinkedList JavaDoc queue = new LinkedList JavaDoc();
28   private final Set JavaDoc processed = new HashSet JavaDoc(); // collection of class names
29

30   public ClassHierarchyWalker(String JavaDoc 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 JavaDoc className, ClassLoader JavaDoc loader) {
41     try {
42       walkClass(AsmClassInfo.getClassInfo(className, loader));
43     } catch (Exception JavaDoc e) {
44       // System.err.println("### ClassHierarchyWalker.walkClass() "+e.getException());
45
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 JavaDoc className = classInfo.getName();
57       logger.info(this.id + " registering include for " + className);
58       dsoContext.addInclude(className, true, "* " + className + ".*(..)");
59
60       // TODO should we continue walking class hierarchy if include had been ignored?
61

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 JavaDoc name, ClassLoader JavaDoc loader) {
82     addClassIfNeeded(AsmClassInfo.getClassInfo(name, loader));
83   }
84   
85   private void addClassIfNeeded(ClassInfo classInfo) {
86     if (classInfo == null) { return; }
87     String JavaDoc className = classInfo.getName();
88     if (!classInfo.isInterface() && !classInfo.isPrimitive()
89         && !"org.springframework.context.ApplicationEvent".equals(className) // XXX this must not be here
90
&& !"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 JavaDoc signature, ClassLoader JavaDoc 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 JavaDoc signature, ClassLoader JavaDoc 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 JavaDoc loader;
116
117     public GenericsCollector(ClassLoader JavaDoc loader) {
118       this.loader = loader;
119     }
120
121     public void visitClassType(String JavaDoc name) {
122       addClassIfNeeded(name, loader);
123     }
124
125     public void visitInnerClassType(String JavaDoc name) {
126       addClassIfNeeded(name, loader);
127     }
128     
129     public void visitFormalTypeParameter(String JavaDoc name) {
130       //
131
}
132
133     public void visitTypeVariable(String JavaDoc name) {
134       //
135
}
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       //
175
}
176
177     public void visitTypeArgument() {
178       //
179
}
180
181     public void visitEnd() {
182       //
183
}
184   }
185   
186 }
187
Popular Tags