KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > dynaop > Debug


1 package dynaop;
2
3 import java.io.ByteArrayInputStream JavaDoc;
4 import java.io.ByteArrayOutputStream JavaDoc;
5 import java.io.OutputStream JavaDoc;
6 import java.io.PrintStream JavaDoc;
7 import java.io.Serializable JavaDoc;
8 import java.lang.reflect.Method JavaDoc;
9 import java.util.Arrays JavaDoc;
10 import java.util.HashSet JavaDoc;
11 import java.util.Iterator JavaDoc;
12 import java.util.Map JavaDoc;
13 import java.util.Properties JavaDoc;
14 import java.util.Set JavaDoc;
15
16 import javax.xml.transform.Transformer JavaDoc;
17 import javax.xml.transform.TransformerFactory JavaDoc;
18 import javax.xml.transform.stream.StreamResult JavaDoc;
19 import javax.xml.transform.stream.StreamSource JavaDoc;
20
21 import dynaop.util.ArrayObject;
22 import dynaop.util.Classes;
23
24 /**
25  * Tool for debugging proxy factory configurations.
26  *
27  * <p>Prints aspect configuration for a class in HTML format to stdout. Usage:
28  *
29  * <pre>
30  * Debug [class name]
31  * </pre></p>
32  *
33  * @author Bob Lee (crazybob@crazybob.org)
34  */

35 public class Debug {
36
37     PrintStream JavaDoc out;
38     
39     public Debug(PrintStream JavaDoc out) {
40         this.out = out;
41     };
42     
43     public Debug(OutputStream JavaDoc out) {
44         this.out = new PrintStream JavaDoc(out);
45     };
46     
47     /**
48      * Use <code>System.out</code>.
49      */

50     public Debug() {
51         this.out = System.out;
52     };
53     
54     //********************************************************************
55
// exposes proxy type.
56
//********************************************************************
57

58     /**
59      * Gets immutable proxy type for specified class from default
60      * <code>Aspects</code>.
61      */

62     public static ProxyType getProxyType(Class JavaDoc clazz) {
63         return getProxyType(Aspects.getInstance(), clazz);
64     }
65     
66     /**
67      * Gets immutable proxy type for specified <code>Aspects</code> and class.
68      */

69     public static ProxyType getProxyType(Aspects aspects,
70             Class JavaDoc clazz) {
71         return immutable(aspects.createProxyType(clazz,
72                     new ProxyTypeBuilder(clazz)));
73     }
74
75     static class ImmutableProxyType implements ProxyType, Serializable JavaDoc {
76
77         static long serialVersionUID = 0;
78     
79         private ProxyType proxyType;
80         
81         ImmutableProxyType(ProxyType proxyType) {
82             this.proxyType = proxyType;
83         }
84         
85         public Class JavaDoc[] getInterfaces() {
86             return (Class JavaDoc[]) ArrayObject.clone(
87                     proxyType.getInterfaces());
88         }
89         
90         public InterceptorFactory[] getInterceptorFactories(Method JavaDoc method) {
91             InterceptorFactory[] interceptorFactories =
92                 proxyType.getInterceptorFactories(method);
93             return (interceptorFactories == null) ? null :
94                 (InterceptorFactory[]) ArrayObject.clone(interceptorFactories);
95         }
96         
97         public String JavaDoc toString() {
98             return proxyType.toString();
99         }
100     }
101     
102     static ProxyType immutable(ProxyType proxyType) {
103         return new ImmutableProxyType(proxyType);
104     }
105     
106     //********************************************************************
107
// prints proxy type as XML.
108
//********************************************************************
109

110     void printInterceptorFactory(InterceptorFactory factory) {
111         this.out.println("\t\t\t<interceptorFactory>");
112         
113         Properties JavaDoc p = factory.getProperties();
114         for (Iterator JavaDoc i = p.entrySet().iterator(); i.hasNext();) {
115             Map.Entry JavaDoc entry = (Map.Entry JavaDoc) i.next();
116             this.out.println("\t\t\t\t<property>");
117             this.out.println("\t\t\t\t\t<name>" + entry.getKey() + "</name>");
118             this.out.println("\t\t\t\t\t<value>" + entry.getValue() +
119                 "</value>");
120             this.out.println("\t\t\t\t</property>");
121         }
122
123         this.out.println("\t\t\t</interceptorFactory>");
124     }
125     
126     void printMethod(ProxyType type, Method JavaDoc method) {
127         this.out.println("\t\t<method>");
128         
129         this.out.println("\t\t\t<signature>" +
130             Pointcuts.methodToString(method) + "</signature>");
131
132         InterceptorFactory[] interceptorFactories =
133             type.getInterceptorFactories(method);
134         if (interceptorFactories != null)
135             for (int i = 0; i < interceptorFactories.length; i++)
136                 printInterceptorFactory(interceptorFactories[i]);
137         
138         this.out.println("\t\t</method>");
139     }
140     
141     void printMethods(ProxyType type, Class JavaDoc clazz, Set JavaDoc visited) {
142         Method JavaDoc[] methods = clazz.getMethods();
143
144         this.out.println("\t<interface class=\"" + clazz.getName() + "\">");
145
146         for (int i = 0; i < methods.length; i++) {
147             if (visited.contains(methods[i]))
148                 continue;
149             visited.add(methods[i]);
150             printMethod(type, methods[i]);
151         }
152         
153         this.out.println("\t</interface>");
154     }
155     
156     /**
157      * Prints proxy type for class as XML.
158      */

159     public void printXml(Class JavaDoc clazz, ProxyType type) {
160         this.out.println("<proxyType>");
161
162         this.out.println("\t<class>" + clazz.getName() + "</class>");
163
164         if (type != null) {
165             Class JavaDoc[] interfaces = type.getInterfaces();
166     
167             this.out.println("\t<interface class=\"java.lang.Object\">");
168             for (int i = 0; i < Classes.OBJECT_METHODS.length; i++)
169                 printMethod(type, Classes.OBJECT_METHODS[i]);
170             this.out.println("\t</interface>");
171
172             Set JavaDoc visited = new HashSet JavaDoc();
173             visited.addAll(Arrays.asList(Object JavaDoc.class.getMethods()));
174             
175             printMethods(type, clazz, visited);
176             
177             for (int i = 0; i < interfaces.length; i++)
178                 printMethods(type, interfaces[i], visited);
179         }
180         
181         this.out.println("</proxyType>");
182     }
183     
184     public static void main(String JavaDoc[] args) throws Exception JavaDoc {
185         if (args.length != 1) {
186             System.err.println("Usage: Debug [class name]");
187             System.exit(0);
188         }
189         
190         Class JavaDoc clazz = Class.forName(args[0]);
191         
192         // capture xml.
193
ByteArrayOutputStream JavaDoc out = new ByteArrayOutputStream JavaDoc();
194         new Debug(out).printXml(clazz, getProxyType(clazz));
195         
196         // transform xml using debug.xsl and output to stdout.
197
Transformer JavaDoc t = TransformerFactory.newInstance().newTransformer(
198             new StreamSource JavaDoc(Debug.class.getResourceAsStream("debug.xsl")));
199         t.transform(
200             new StreamSource JavaDoc(new ByteArrayInputStream JavaDoc(out.toByteArray())),
201             new StreamResult JavaDoc(System.out)
202         );
203     }
204 }
Popular Tags