Bug 560682: [Py4J] Debug tests are unstable

  run EventDispatchJob only on events, not permanent

Change-Id: Ia9792109abb1d5501c24183211b9fd9fc61a99f7
diff --git a/plugins/org.eclipse.ease/src/org/eclipse/ease/debugging/dispatcher/EventDispatchJob.java b/plugins/org.eclipse.ease/src/org/eclipse/ease/debugging/dispatcher/EventDispatchJob.java
index c86a934..e08ecd6 100644
--- a/plugins/org.eclipse.ease/src/org/eclipse/ease/debugging/dispatcher/EventDispatchJob.java
+++ b/plugins/org.eclipse.ease/src/org/eclipse/ease/debugging/dispatcher/EventDispatchJob.java
@@ -18,7 +18,6 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugPlugin;
 import org.eclipse.ease.Activator;
 import org.eclipse.ease.Logger;
 import org.eclipse.ease.Script;
@@ -26,7 +25,6 @@
 import org.eclipse.ease.debugging.IScriptRegistry;
 import org.eclipse.ease.debugging.ScriptRegistry;
 import org.eclipse.ease.debugging.events.IDebugEvent;
-import org.eclipse.ease.debugging.events.debugger.EngineTerminatedEvent;
 import org.eclipse.ease.debugging.events.debugger.IDebuggerEvent;
 import org.eclipse.ease.debugging.events.model.IModelRequest;
 import org.eclipse.jface.dialogs.ErrorDialog;
@@ -37,9 +35,6 @@
 	/** Cached events. */
 	private final List<IDebugEvent> fEvents = new ArrayList<>();
 
-	/** Flag indicating this job shall be terminated. */
-	private boolean fTerminated = false;
-
 	/** Debug host. */
 	private final IEventProcessor fModel;
 
@@ -83,7 +78,6 @@
 		fScriptRegistry = scriptRegistry;
 
 		setSystem(true);
-		schedule();
 	}
 
 	/**
@@ -94,37 +88,25 @@
 	}
 
 	public void addEvent(final IDebugEvent event) {
-		synchronized (fEvents) {
-			DebugTracer.debug("Dispatcher", "[+] " + event);
+		DebugTracer.debug("Dispatcher", "[+] " + event);
 
+		synchronized (fEvents) {
 			fEvents.add(event);
-			fEvents.notifyAll();
+			schedule();
 		}
 	}
 
 	@Override
 	protected IStatus run(final IProgressMonitor monitor) {
-		while (!fTerminated) {
-			IDebugEvent event = null;
 
-			// wait for new events
-			synchronized (fEvents) {
-				if (fEvents.isEmpty()) {
-					try {
-						fEvents.wait();
-					} catch (final InterruptedException e) {
-					}
-				}
+		final List<IDebugEvent> events = new ArrayList<>();
+		synchronized (fEvents) {
+			events.addAll(fEvents);
+			fEvents.clear();
+		}
 
-				if (!fEvents.isEmpty())
-					event = fEvents.remove(0);
-			}
-
-			final boolean platformRunning = DebugPlugin.getDefault() != null;
-			if ((monitor.isCanceled()) || (!platformRunning))
-				terminate();
-
-			else if (event != null) {
+		for (final IDebugEvent event : events) {
+			if (!monitor.isCanceled()) {
 				try {
 					handleEvent(event);
 				} catch (final Throwable e) {
@@ -150,9 +132,6 @@
 			DebugTracer.debug("Dispatcher", "debugger -> " + event + " -> model");
 			fModel.handleEvent(event);
 
-			if (event instanceof EngineTerminatedEvent)
-				terminate();
-
 		} else if (event instanceof IModelRequest) {
 			DebugTracer.debug("Dispatcher", "debugger <- " + event + " <- model");
 			fDebugger.handleEvent(event);
@@ -161,15 +140,6 @@
 			throw new RuntimeException("Unknown event detected: " + event);
 	}
 
-	public void terminate() {
-		fTerminated = true;
-
-		// wake up job
-		synchronized (fEvents) {
-			fEvents.notifyAll();
-		}
-	}
-
 	@Override
 	public Script getScript(IResource resource) {
 		return fScriptRegistry.getScript(resource);