KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > armedbear > j > jdb > EventHandler


1 /*
2  * EventHandler.java
3  *
4  * Copyright (C) 2002-2003 Peter Graves
5  * $Id: EventHandler.java,v 1.8 2003/05/28 16:11:49 piso Exp $
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */

21
22 package org.armedbear.j.jdb;
23
24 import com.sun.jdi.IncompatibleThreadStateException;
25 import com.sun.jdi.Method;
26 import com.sun.jdi.ObjectReference;
27 import com.sun.jdi.ReferenceType;
28 import com.sun.jdi.StackFrame;
29 import com.sun.jdi.ThreadReference;
30 import com.sun.jdi.VMDisconnectedException;
31 import com.sun.jdi.Value;
32 import com.sun.jdi.event.BreakpointEvent;
33 import com.sun.jdi.event.ClassPrepareEvent;
34 import com.sun.jdi.event.ClassUnloadEvent;
35 import com.sun.jdi.event.Event;
36 import com.sun.jdi.event.EventIterator;
37 import com.sun.jdi.event.EventQueue;
38 import com.sun.jdi.event.EventSet;
39 import com.sun.jdi.event.ExceptionEvent;
40 import com.sun.jdi.event.LocatableEvent;
41 import com.sun.jdi.event.MethodEntryEvent;
42 import com.sun.jdi.event.MethodExitEvent;
43 import com.sun.jdi.event.StepEvent;
44 import com.sun.jdi.event.ThreadDeathEvent;
45 import com.sun.jdi.event.ThreadStartEvent;
46 import com.sun.jdi.event.VMDeathEvent;
47 import com.sun.jdi.event.VMDisconnectEvent;
48 import com.sun.jdi.event.VMStartEvent;
49 import com.sun.jdi.event.WatchpointEvent;
50 import com.sun.jdi.request.BreakpointRequest;
51 import com.sun.jdi.request.EventRequest;
52 import java.util.ArrayList JavaDoc;
53 import java.util.Iterator JavaDoc;
54 import java.util.List JavaDoc;
55 import javax.swing.SwingUtilities JavaDoc;
56 import org.armedbear.j.Buffer;
57 import org.armedbear.j.Editor;
58 import org.armedbear.j.FastStringBuffer;
59 import org.armedbear.j.File;
60 import org.armedbear.j.Log;
61 import org.armedbear.j.Platform;
62
63 public final class EventHandler implements Runnable JavaDoc
64 {
65     private final Jdb jdb;
66     private final Thread JavaDoc eventHandlerThread;
67     private boolean connected = true;
68     private boolean completed;
69
70     public EventHandler(Jdb jdb)
71     {
72         this.jdb = jdb;
73         eventHandlerThread = new Thread JavaDoc(this, "jdb event handler");
74         eventHandlerThread.start();
75     }
76
77     public void run()
78     {
79         EventQueue queue = jdb.getVM().eventQueue();
80         while (connected) {
81             try {
82                 boolean resume = true;
83                 EventSet eventSet = queue.remove();
84                 EventIterator iter = eventSet.eventIterator();
85                 while (iter.hasNext()) {
86                     Event event = iter.nextEvent();
87                     resume &= handleEvent(event);
88                 }
89                 if (resume)
90                     eventSet.resume();
91                 else {
92                     jdb.setSuspended(true);
93                     // Set current thread and stack frame.
94
if (eventSet.size() > 0) {
95                         Event event = (Event) eventSet.iterator().next();
96                         ThreadReference threadRef = getThreadForEvent(event);
97                         if (threadRef != null) {
98                             jdb.setCurrentThread(threadRef);
99                             try {
100                                 List JavaDoc frames = threadRef.frames();
101                                 if (frames.size() > 0)
102                                     jdb.setCurrentStackFrame((StackFrame)frames.get(0));
103                             }
104                             catch (IncompatibleThreadStateException e) {
105                                 Log.error(e);
106                             }
107                         } else {
108                             Log.debug("threadRef is null");
109                             Log.debug("event = " + event);
110                         }
111                     }
112                     jdb.fireContextChanged();
113                     jdb.prompt();
114                     Runnable JavaDoc r = new Runnable JavaDoc() {
115                         public void run()
116                         {
117                             if (!Platform.isPlatformWindows())
118                                 Editor.getCurrentFrame().toFront();
119                             jdb.getControlDialog().toFront();
120                         }
121                     };
122                     SwingUtilities.invokeLater(r);
123                 }
124             }
125             catch (InterruptedException JavaDoc e) {
126                 // Do nothing.
127
}
128             catch (VMDisconnectedException disconnect) {
129                 break;
130             }
131         }
132         synchronized (this) {
133             completed = true;
134             notifyAll();
135         }
136         jdb.setVM(null);
137     }
138
139     private static ThreadReference getThreadForEvent(Event event)
140     {
141         if (event instanceof ClassPrepareEvent)
142             return ((ClassPrepareEvent)event).thread();
143         else if (event instanceof LocatableEvent)
144             return ((LocatableEvent)event).thread();
145         else if (event instanceof ThreadStartEvent)
146             return ((ThreadStartEvent)event).thread();
147         else if (event instanceof ThreadDeathEvent)
148             return ((ThreadDeathEvent)event).thread();
149         else if (event instanceof VMStartEvent)
150             return ((VMStartEvent)event).thread();
151         else
152             return null;
153     }
154
155     // Return true to resume.
156
private boolean handleEvent(Event event)
157     {
158         if (event instanceof ExceptionEvent)
159             return handleExceptionEvent(event);
160         else if (event instanceof BreakpointEvent)
161             return handleBreakpointEvent(event);
162         else if (event instanceof WatchpointEvent)
163             return handleFieldWatchEvent(event);
164         else if (event instanceof StepEvent)
165             return handleStepEvent(event);
166         else if (event instanceof MethodEntryEvent)
167             return handleMethodEntryEvent(event);
168         else if (event instanceof MethodExitEvent)
169             return handleMethodExitEvent(event);
170         else if (event instanceof ClassPrepareEvent)
171             return handleClassPrepareEvent(event);
172         else if (event instanceof ClassUnloadEvent)
173             return handleClassUnloadEvent(event);
174         else if (event instanceof ThreadStartEvent)
175             return handleThreadStartEvent(event);
176         else if (event instanceof ThreadDeathEvent)
177             return handleThreadDeathEvent(event);
178         else if (event instanceof VMStartEvent)
179             return handleVMStartEvent(event);
180         else if (event instanceof VMDeathEvent)
181             return handleVMDeathEvent(event);
182         else if (event instanceof VMDisconnectEvent)
183             return handleVMDisconnectEvent(event);
184         jdb.log("handleEvent " + event.toString());
185         return false;
186     }
187
188     private boolean handleExceptionEvent(Event event)
189     {
190         ExceptionEvent ee = (ExceptionEvent) event;
191         if (ee.catchLocation() != null)
192             jdb.log("Exception encountered: " + ee.exception());
193         else
194             jdb.log("Uncaught exception encountered " + ee.exception());
195         jdb.printCurrentLocation(ee);
196         jdb.setLocation(ee.location());
197         jdb.source();
198         // Suspend the VM.
199
return false;
200     }
201
202     private boolean handleBreakpointEvent(Event event)
203     {
204         jdb.log("Breakpoint hit");
205         BreakpointEvent evt = (BreakpointEvent) event;
206         jdb.printCurrentLocation(evt);
207         jdb.setLocation(evt.location());
208         jdb.source();
209         // If breakpoint is temporary, delete it.
210
EventRequest er = evt.request();
211         if (er instanceof BreakpointRequest) {
212             BreakpointRequest br = (BreakpointRequest) er;
213             for (Iterator it = jdb.getBreakpoints().iterator(); it.hasNext();) {
214                 ResolvableBreakpoint bp = (ResolvableBreakpoint) it.next();
215                 if (bp.getEventRequest() == br) {
216                     if (bp.isTemporary()) {
217                         jdb.deleteBreakpoint(bp);
218                         File file = bp.getFile();
219                         if (file != null) {
220                             Buffer buffer =
221                                 Editor.getBufferList().findBuffer(file);
222                             if (buffer != null)
223                                 buffer.repaint();
224                         }
225                         jdb.fireBreakpointChanged();
226                     }
227                     break;
228                 }
229             }
230         }
231         // Suspend the VM.
232
return false;
233     }
234
235     private boolean handleFieldWatchEvent(Event event)
236     {
237         jdb.log("handleFieldWatchEvent");
238         return true;
239     }
240
241     private boolean handleStepEvent(Event event)
242     {
243         StepEvent evt = (StepEvent) event;
244         jdb.printCurrentLocation(evt);
245         jdb.setLocation(evt.location());
246         jdb.source();
247         // Suspend the VM.
248
return false;
249     }
250
251     private boolean handleMethodEntryEvent(Event event)
252     {
253         MethodEntryEvent evt = (MethodEntryEvent) event;
254         Method method = evt.method();
255         FastStringBuffer sb = new FastStringBuffer("Method entered: ");
256         sb.append(method.declaringType().name());
257         sb.append('.');
258         sb.append(method.name());
259         jdb.log(sb.toString());
260         return true;
261     }
262
263     private boolean handleMethodExitEvent(Event event)
264     {
265         MethodExitEvent evt = (MethodExitEvent) event;
266         Method method = evt.method();
267         FastStringBuffer sb = new FastStringBuffer("Method exited: ");
268         sb.append(method.declaringType().name());
269         sb.append('.');
270         sb.append(method.name());
271         jdb.log(sb.toString());
272         return true;
273     }
274
275     private boolean handleClassPrepareEvent(Event event)
276     {
277         ClassPrepareEvent evt = (ClassPrepareEvent) event;
278         jdb.log("Class loaded: ".concat(evt.referenceType().name()));
279         jdb.resolveDeferredRequests(evt);
280         return true;
281     }
282
283     private boolean handleClassUnloadEvent(Event event)
284     {
285         ClassUnloadEvent evt = (ClassUnloadEvent) event;
286         jdb.log("Class unloaded: ".concat(evt.className()));
287         return true;
288     }
289
290     private boolean handleThreadStartEvent(Event event)
291     {
292         ThreadStartEvent evt = (ThreadStartEvent) event;
293         ThreadReference threadRef = evt.thread();
294         jdb.log("Thread started: ".concat(threadRef.name()));
295         return true;
296     }
297
298     private boolean handleThreadDeathEvent(Event event)
299     {
300         ThreadDeathEvent evt = (ThreadDeathEvent) event;
301         ThreadReference threadRef = evt.thread();
302         jdb.log("Thread exited: ".concat(threadRef.name()));
303         return true;
304     }
305
306     private boolean handleVMStartEvent(Event event)
307     {
308         jdb.log("VM loaded");
309         if (jdb.isSuspended()) {
310             jdb.log("VM suspended");
311             jdb.prompt();
312         }
313         return true;
314     }
315
316     private boolean handleVMDeathEvent(Event event)
317     {
318         jdb.log("VM exited");
319         return true;
320     }
321
322     private boolean handleVMDisconnectEvent(Event event)
323     {
324         jdb.log("VM disconnected");
325         return true;
326     }
327 }
328
Popular Tags