Author: koen.aers(a)jboss.com
Date: 2011-07-07 06:33:31 -0400 (Thu, 07 Jul 2011)
New Revision: 32693
Modified:
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeAbstractRuntime.java
trunk/forge/tests/org.jboss.tools.forge.core.test/src/org/jboss/tools/forge/core/process/ForgeAbstractRuntimeTest.java
Log:
add a listener for terminate events
Modified:
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeAbstractRuntime.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeAbstractRuntime.java 2011-07-07
10:27:47 UTC (rev 32692)
+++
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeAbstractRuntime.java 2011-07-07
10:33:31 UTC (rev 32693)
@@ -5,10 +5,14 @@
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IDebugEventSetListener;
import org.eclipse.debug.core.IStreamListener;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.core.model.IStreamMonitor;
+import org.eclipse.debug.core.model.IStreamsProxy;
import org.jboss.tools.forge.core.ForgeCorePlugin;
public abstract class ForgeAbstractRuntime implements ForgeRuntime {
@@ -17,6 +21,7 @@
private IProcess process = null;
private String state = STATE_NOT_RUNNING;
+ private final TerminateListener terminateListener = new TerminateListener();
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
@@ -37,23 +42,26 @@
progressMonitor.beginTask("Starting Forge", IProgressMonitor.UNKNOWN);
streamListener = new StartupListener();
process = ForgeLaunchHelper.launch(getName(), getLocation());
- state = STATE_STARTING;
- propertyChangeSupport.firePropertyChange(PROPERTY_STATE, STATE_NOT_RUNNING,
STATE_STARTING);
+ setNewState(STATE_STARTING);
+ DebugPlugin.getDefault().addDebugEventListener(terminateListener);
process.getStreamsProxy().getOutputStreamMonitor().addListener(streamListener);
progressMonitor.worked(1);
while (STATE_STARTING.equals(state)) {
if (progressMonitor.isCanceled()) {
terminate();
- state = STATE_NOT_RUNNING;
- propertyChangeSupport.firePropertyChange(PROPERTY_STATE, STATE_STARTING,
STATE_NOT_RUNNING);
} else {
progressMonitor.worked(1);
}
}
} finally {
- process.getStreamsProxy().getOutputStreamMonitor().removeListener(streamListener);
- if (STATE_NOT_RUNNING.equals(state)) {
- process = null;
+ if (process != null) {
+ IStreamsProxy streamsProxy = process.getStreamsProxy();
+ if (streamsProxy != null) {
+ IStreamMonitor outputStreamMonitor = streamsProxy.getOutputStreamMonitor();
+ if (outputStreamMonitor != null) {
+ outputStreamMonitor.removeListener(streamListener);
+ }
+ }
}
progressMonitor.done();
}
@@ -66,9 +74,6 @@
try {
progressMonitor.beginTask("Stopping Forge", 1);
terminate();
- process = null;
- state = STATE_NOT_RUNNING;
- propertyChangeSupport.firePropertyChange(PROPERTY_STATE, STATE_RUNNING,
STATE_NOT_RUNNING);
} finally {
progressMonitor.done();
}
@@ -82,6 +87,12 @@
}
}
+ private void setNewState(String newState) {
+ String oldState = state;
+ state = newState;
+ propertyChangeSupport.firePropertyChange(PROPERTY_STATE, oldState, state);
+ }
+
public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener) {
propertyChangeSupport.addPropertyChangeListener(propertyChangeListener);
}
@@ -93,9 +104,25 @@
private class StartupListener implements IStreamListener {
@Override
public void streamAppended(String text, IStreamMonitor monitor) {
- state = STATE_RUNNING;
- propertyChangeSupport.firePropertyChange(PROPERTY_STATE, STATE_STARTING,
STATE_RUNNING);
+ setNewState(STATE_RUNNING);
}
}
+
+ private class TerminateListener implements IDebugEventSetListener {
+ @Override
+ public void handleDebugEvents(DebugEvent[] events) {
+ for (int i = 0; i < events.length; i++) {
+ DebugEvent event = events[i];
+ if (event.getSource().equals(process)) {
+ if (event.getKind() == DebugEvent.TERMINATE) {
+ setNewState(STATE_NOT_RUNNING);
+ process = null;
+ DebugPlugin.getDefault().removeDebugEventListener(terminateListener);
+ }
+ }
+ }
+ }
+
+ }
}
Modified:
trunk/forge/tests/org.jboss.tools.forge.core.test/src/org/jboss/tools/forge/core/process/ForgeAbstractRuntimeTest.java
===================================================================
---
trunk/forge/tests/org.jboss.tools.forge.core.test/src/org/jboss/tools/forge/core/process/ForgeAbstractRuntimeTest.java 2011-07-07
10:27:47 UTC (rev 32692)
+++
trunk/forge/tests/org.jboss.tools.forge.core.test/src/org/jboss/tools/forge/core/process/ForgeAbstractRuntimeTest.java 2011-07-07
10:33:31 UTC (rev 32693)
@@ -17,6 +17,8 @@
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
+import org.eclipse.debug.core.DebugEvent;
+import org.eclipse.debug.core.DebugPlugin;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -129,6 +131,21 @@
}
}
+ @Test
+ public void testTerminateProcess() {
+ runtime.start(null);
+ assertEquals(ForgeRuntime.STATE_RUNNING, runtime.getState());
+ propertyChangeEvents.clear();
+ DebugEvent debugEvent = new DebugEvent(runtime.getProcess(), DebugEvent.TERMINATE);
+ DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { debugEvent });
+ assertNull(runtime.getProcess());
+ assertEquals(1, propertyChangeEvents.size());
+ for (PropertyChangeEvent evt : propertyChangeEvents) {
+ assertEquals(ForgeRuntime.STATE_RUNNING, evt.getOldValue());
+ assertEquals(ForgeRuntime.STATE_NOT_RUNNING, evt.getNewValue());
+ }
+ }
+
private class TestPropertyChangeListener implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent evt) {
propertyChangeEvents.add(evt);
Show replies by date