import com.sun.jdi.VMDisconnectedException; import com.sun.jdi.event.Event; import com.sun.jdi.event.MethodEntryEvent; import com.sun.jdi.event.MethodExitEvent; import com.sun.jdi.event.VMStartEvent; import com.sun.jdi.event.EventIterator; import com.sun.jdi.event.EventQueue; import com.sun.jdi.event.EventSet; /** * This class supports {@link Seq}. Its constructor spawns a thread to * poll the virtual machine event queue. When an event is found, it * removes the event from the queue and dispatches it the calling Seq * instance. */ public class SeqEventHandler implements Runnable { Seq boss; boolean connected = true; /** * Spawns a thread to tell the supplied {@link Seq} instance when * virtual machine start, method entry, and exit events need to be * handled. */ public SeqEventHandler(Seq boss) { this.boss = boss; Thread thread = new Thread(this, "Sequencer Event Thread"); thread.start(); } /** * Continually polls the virtual machine event queue, removing * and dispatching events to its controlling {@link Seq} instance. */ public void run() { EventQueue queue = boss.getVM().eventQueue(); while (connected) { try { EventSet eventSet = queue.remove(); EventIterator it = eventSet.eventIterator(); while (it.hasNext()) { handleEvent(it.nextEvent()); } } catch (InterruptedException ie) { } catch (VMDisconnectedException vmde) { connected = false; } } } // dispatches events of interest to the caller private void handleEvent(Event event){ if (event instanceof MethodEntryEvent) { boss.methodEntryEvent((MethodEntryEvent)event); } else if (event instanceof MethodExitEvent) { boss.methodExitEvent((MethodExitEvent)event); } else if (event instanceof VMStartEvent) { boss.vmStartEvent(event); } } }