1 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 ; 53 import java.util.Iterator ; 54 import java.util.List ; 55 import javax.swing.SwingUtilities ; 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 64 { 65 private final Jdb jdb; 66 private final Thread 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 (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 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 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 r = new Runnable () { 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 e) { 126 } 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 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 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 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 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 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 |