KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > samples > callgraph > CallGraphMonitor


1 package samples.callgraph;
2
3 import java.awt.Dimension JavaDoc;
4 import java.awt.GridLayout JavaDoc;
5 import java.awt.Toolkit JavaDoc;
6 import java.awt.event.WindowAdapter JavaDoc;
7 import java.awt.event.WindowEvent JavaDoc;
8 import java.io.InputStream JavaDoc;
9 import java.io.BufferedInputStream JavaDoc;
10 import java.io.FileInputStream JavaDoc;
11 import java.util.EmptyStackException JavaDoc;
12 import java.util.HashMap JavaDoc;
13 import java.util.Map JavaDoc;
14 import java.util.Properties JavaDoc;
15 import java.util.Stack JavaDoc;
16
17 import javax.swing.JFrame JavaDoc;
18
19 import org.apache.log4j.Category;
20 import org.apache.log4j.PropertyConfigurator;
21
22 import salvo.jesus.graph.DirectedEdgeImpl;
23 import salvo.jesus.graph.EdgeImpl;
24   import salvo.jesus.graph.Graph;
25 // import salvo.jesus.graph.GraphImpl;
26
import salvo.jesus.graph.Tree;
27 import salvo.jesus.graph.TreeImpl;
28 import salvo.jesus.graph.Vertex;
29 import salvo.jesus.graph.visual.GraphEditor;
30 import salvo.jesus.graph.visual.VisualGraph;
31 //import salvo.jesus.graph.visual.layout.ForceDirectedLayout;
32
import salvo.jesus.graph.visual.layout.GraphLayoutManager;
33 import salvo.jesus.graph.visual.layout.LayeredTreeLayout;
34 //import salvo.jesus.graph.visual.layout.OrthogonalLineLayout;
35

36 import alt.jiapi.InstrumentationContext;
37 import alt.jiapi.InstrumentationDescriptor;
38 import alt.jiapi.event.MethodEvent;
39 import alt.jiapi.event.MethodEventProducer;
40 import alt.jiapi.event.MethodListener;
41 import alt.jiapi.reflect.Loader;
42 import alt.jiapi.util.InstrumentingClassLoader;
43
44 public class CallGraphMonitor extends JFrame JavaDoc implements MethodListener {
45     private static Category log = Category.getInstance(CallGraphMonitor.class.getName());
46     
47     private Stack JavaDoc callStack;
48     private Map JavaDoc createdClasses;
49     private int count = 1;
50
51     // private Graph graph;
52
private Tree tree;
53     private VisualGraph visual;
54     private GraphEditor editor;
55     //private ForceDirectedLayout layout;
56
// private OrthogonalLineLayout layout;
57
private GraphLayoutManager layout;
58
59     public CallGraphMonitor(Properties JavaDoc props) throws Exception JavaDoc {
60         PropertyConfigurator.configure(props);
61
62         editor = new GraphEditor();
63         // graph = new GraphImpl();
64
tree = new TreeImpl();
65         visual = editor.getVisualGraph();
66         callStack = new Stack JavaDoc();
67         createdClasses = new HashMap JavaDoc();
68
69         // visual.setGraph(graph);
70
editor.setGraph(tree);
71
72         this.getContentPane().setLayout(new GridLayout JavaDoc(1,2));
73         this.getContentPane().add(editor);
74
75         //layout = new OrthogonalLineLayout(visual);
76
// layout = new ForceDirectedLayout(visual);
77
// layout.setIncrement(0.001);
78
layout = new LayeredTreeLayout(visual);
79         editor.setGraphLayoutManager(layout);
80
81         this.addWindowListener(new WindowAdapter JavaDoc() {
82                 public void windowClosing(WindowEvent JavaDoc e) { System.exit(0); }
83             });
84         
85         Dimension JavaDoc screenSize = Toolkit.getDefaultToolkit().getScreenSize();
86         Dimension JavaDoc frameSize = new Dimension JavaDoc(screenSize.width - 80,
87                                             screenSize.height - 200);
88
89         this.setSize(frameSize);
90         this.setLocation((int)(screenSize.getWidth() - frameSize.getWidth()) / 2, (int)(screenSize.getHeight() - frameSize.getHeight()) / 2);
91
92         // layout.layout();
93
}
94
95
96     // MethodListener callbacks
97
public void constructorEntered(MethodEvent event) {
98     }
99
100     public void constructorExited(MethodEvent event) {
101     }
102
103     public void methodEntered(MethodEvent event) {
104         enterMethod(event.getClassName(), event.getMethodName());
105     }
106
107     public void methodExited(MethodEvent event){
108         exitMethod(event.getClassName(), event.getMethodName());
109     }
110
111     private void enterMethod(String JavaDoc className, String JavaDoc methodName) {
112 // try {
113
// Thread.currentThread().sleep(1000);
114
// } catch (Exception e) {
115
// }
116

117         log.debug(className + "." + methodName + " entered");
118         // ClassVertex classVertex = (ClassVertex) createdClasses.get(className);
119
// if (classVertex == null) {
120
// createdClasses.put(className, classVertex);
121
// try {
122
// tree.add(classVertex);
123
// } catch (Exception e) {
124
// log.error(e.getMessage(), e);
125
// }
126
// }
127

128         ClassVertex classVertex = null;
129         if (!callStack.empty()) {
130             ClassVertex parent = (ClassVertex) callStack.peek();
131             if (parent.hasChild(className)) {
132                 classVertex = parent.getChild(className);
133                 MethodEdge edge = parent.getEdge(className);
134                 edge.addMethodCall(methodName, count);
135                 // NOTE! A kludge to refresh edge name.
136
try {
137                     tree.removeEdge(edge);
138                     tree.addEdge(edge);
139                 } catch (Exception JavaDoc e) {
140                     log.error(e.getMessage(), e);
141                 }
142             }
143             else {
144                 classVertex = new ClassVertex(className);
145                 MethodEdge edge = null;
146                 try {
147                     tree.add(classVertex);
148                     edge = new MethodEdge(parent, classVertex);
149                     edge.addMethodCall(methodName, count);
150                     tree.addEdge(edge);
151                 } catch (Exception JavaDoc e) {
152                     log.error(e.getMessage(), e);
153                 }
154
155                 parent.addChild(classVertex, edge);
156             }
157             
158             log.debug("added edge from " + parent.getName() +
159                       " to " + classVertex.getName());
160         }
161         else {
162             try {
163                 classVertex = new ClassVertex(className);
164                 tree.addNode(null, classVertex);
165             } catch (Exception JavaDoc e) {
166                 log.error(e.getMessage(), e);
167             }
168         }
169         
170         callStack.push(classVertex);
171         count++;
172         visual.layout();
173     }
174
175     private void exitMethod(String JavaDoc className, String JavaDoc methodName) {
176         log.debug(className + "." + methodName + " exited");
177         // This cannot be null since it is impossible to exit a method
178
// without first entering it.
179
// ClassVertex classVertex = (ClassVertex) createdClasses.get(className);
180

181         try {
182             ClassVertex parent = (ClassVertex) callStack.pop();
183 // if (parent != null) {
184
// parent.finishMethodCall();
185
// }
186
} catch (EmptyStackException JavaDoc ese) {
187         }
188     }
189
190     public static void main(String JavaDoc[] args) throws Exception JavaDoc {
191         InputStream JavaDoc config = new BufferedInputStream JavaDoc(new FileInputStream JavaDoc(args[0]));
192         Properties JavaDoc props = new Properties JavaDoc();
193         props.load(config);
194
195         CallGraphMonitor monitor = new CallGraphMonitor(props);
196         monitor.setTitle("CallGraphMonitor");
197         monitor.setVisible(true);
198
199         log.debug("created CallGraphMonitor");
200         try {
201             Thread.currentThread().sleep(1000);
202         }
203         catch (Exception JavaDoc e) {
204         }
205
206         log.debug("creating the InstrumentationDescriptor");
207         InstrumentationContext ctx = new InstrumentationContext();
208         
209         InstrumentationDescriptor id = new InstrumentationDescriptor();
210         id.addInclusionRule("test.callgraph");
211         MethodEventProducer eventProducer = new MethodEventProducer(id);
212         eventProducer.addMethodListener(monitor);
213         ctx.addInstrumentationDescriptor(id);
214
215         log.debug("creating a class loader");
216         ClassLoader JavaDoc cl = InstrumentingClassLoader.createClassLoader(ctx);
217         
218         log.debug("loading classes");
219         Class JavaDoc clazz = cl.loadClass("test.callgraph.Main");
220
221         log.debug("starting program");
222         java.lang.reflect.Method JavaDoc m =
223             clazz.getMethod("main", new Class JavaDoc[] {String JavaDoc[].class});
224
225         String JavaDoc []restArgs = new String JavaDoc[args.length - 1];
226         for (int i = 1; i < args.length; i++) {
227             restArgs[i - 1] = args[i];
228         }
229
230         for (int i = 0; i < restArgs.length; i++) {
231             System.out.println(i + ": " + restArgs[i]);
232         }
233
234         m.invoke(clazz, new Object JavaDoc[] {restArgs});
235
236         log.debug("main thread dying");
237     }
238 }
239
Popular Tags