Author: koen.aers(a)jboss.com
Date: 2011-07-05 12:19:02 -0400 (Tue, 05 Jul 2011)
New Revision: 32617
Added:
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
Modified:
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeEmbeddedRuntime.java
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeExternalRuntime.java
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeRuntime.java
trunk/forge/tests/org.jboss.tools.forge.core.test/src/org/jboss/tools/forge/core/process/ForgeExternalRuntimeTest.java
Log:
start and stop functionality of ForgeRuntime is implemented and tested
Added:
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
(rev 0)
+++
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeAbstractRuntime.java 2011-07-05
16:19:02 UTC (rev 32617)
@@ -0,0 +1,101 @@
+package org.jboss.tools.forge.core.process;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.IStreamListener;
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.debug.core.model.IStreamMonitor;
+import org.jboss.tools.forge.core.ForgeCorePlugin;
+
+public abstract class ForgeAbstractRuntime implements ForgeRuntime {
+
+ private static final String PROPERTY_STATE = "state";
+
+ private IProcess process = null;
+ private String state = STATE_NOT_RUNNING;
+
+ private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
+
+ public IProcess getProcess() {
+ return process;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public void start(IProgressMonitor progressMonitor) {
+ IStreamListener streamListener = null;
+ if (progressMonitor == null) {
+ progressMonitor = new NullProgressMonitor();
+ }
+ try {
+ progressMonitor.beginTask("Starting Forge", IProgressMonitor.UNKNOWN);
+ state = STATE_STARTING;
+ propertyChangeSupport.firePropertyChange(PROPERTY_STATE, STATE_NOT_RUNNING,
STATE_STARTING);
+ streamListener = new StartupListener();
+ process = ForgeLaunchHelper.launch(getName(), getLocation());
+ 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;
+ }
+ progressMonitor.done();
+ }
+ }
+
+ public void stop(IProgressMonitor progressMonitor) {
+ if (progressMonitor == null) {
+ progressMonitor = new NullProgressMonitor();
+ }
+ 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();
+ }
+ }
+
+ private void terminate() {
+ try {
+ process.terminate();
+ } catch (DebugException e) {
+ ForgeCorePlugin.log(e);
+ }
+ }
+
+ public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener) {
+ propertyChangeSupport.addPropertyChangeListener(propertyChangeListener);
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener propertyChangeListener)
{
+ propertyChangeSupport.removePropertyChangeListener(propertyChangeListener);
+ }
+
+ private class StartupListener implements IStreamListener {
+ @Override
+ public void streamAppended(String text, IStreamMonitor monitor) {
+ state = STATE_RUNNING;
+ propertyChangeSupport.firePropertyChange(PROPERTY_STATE, STATE_STARTING,
STATE_RUNNING);
+ }
+ }
+
+}
Modified:
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeEmbeddedRuntime.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeEmbeddedRuntime.java 2011-07-05
16:18:38 UTC (rev 32616)
+++
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeEmbeddedRuntime.java 2011-07-05
16:19:02 UTC (rev 32617)
@@ -6,7 +6,7 @@
import org.eclipse.core.runtime.Platform;
import org.jboss.tools.forge.core.ForgeCorePlugin;
-public class ForgeEmbeddedRuntime implements ForgeRuntime {
+public class ForgeEmbeddedRuntime extends ForgeAbstractRuntime {
public static final ForgeRuntime INSTANCE = new ForgeEmbeddedRuntime();
Modified:
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeExternalRuntime.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeExternalRuntime.java 2011-07-05
16:18:38 UTC (rev 32616)
+++
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeExternalRuntime.java 2011-07-05
16:19:02 UTC (rev 32617)
@@ -1,6 +1,6 @@
package org.jboss.tools.forge.core.process;
-public class ForgeExternalRuntime implements ForgeRuntime {
+public class ForgeExternalRuntime extends ForgeAbstractRuntime {
private String name, location;
Modified:
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeRuntime.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeRuntime.java 2011-07-05
16:18:38 UTC (rev 32616)
+++
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/process/ForgeRuntime.java 2011-07-05
16:19:02 UTC (rev 32617)
@@ -1,9 +1,24 @@
package org.jboss.tools.forge.core.process;
+import java.beans.PropertyChangeListener;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.model.IProcess;
+
public interface ForgeRuntime {
+ String STATE_NOT_RUNNING = "org.jboss.tools.forge.notRunning";
+ String STATE_RUNNING = "org.jboss.tools.forge.running";
+ String STATE_STARTING = "org.jboss.tools.forge.starting";
+
String getName();
String getLocation();
String getType();
+ String getState();
+ IProcess getProcess();
+ void start(IProgressMonitor progressMonitor);
+ void stop(IProgressMonitor progressMonitor);
+ void addPropertyChangeListener(PropertyChangeListener propertyChangeListener);
+ void removePropertyChangeListener(PropertyChangeListener propertyChangeListener);
}
Added:
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
(rev 0)
+++
trunk/forge/tests/org.jboss.tools.forge.core.test/src/org/jboss/tools/forge/core/process/ForgeAbstractRuntimeTest.java 2011-07-05
16:19:02 UTC (rev 32617)
@@ -0,0 +1,175 @@
+package org.jboss.tools.forge.core.process;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ForgeAbstractRuntimeTest {
+
+ private ForgeRuntime runtime;
+ private Set<String> calledMethods;
+ private List<PropertyChangeEvent> propertyChangeEvents;
+ private PropertyChangeListener propertyChangeListener;
+ private int amountWorked;
+ private int totalWork;
+ private String taskName;
+
+ @Before
+ public void setUp() {
+ propertyChangeEvents = new ArrayList<PropertyChangeEvent>();
+ calledMethods = new HashSet<String>();
+ runtime = new ForgeTestRuntime();
+ propertyChangeListener = new TestPropertyChangeListener();
+ runtime.addPropertyChangeListener(propertyChangeListener);
+ amountWorked = 0;
+ totalWork = 0;
+ taskName = null;
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ if (runtime.getProcess() != null) {
+ runtime.getProcess().terminate();
+ }
+ runtime.removePropertyChangeListener(propertyChangeListener);
+ propertyChangeListener = null;
+ runtime = null;
+ calledMethods = null;
+ propertyChangeEvents = null;
+ }
+
+ @Test
+ public void testStartComplete() {
+ runtime.start(null);
+ assertEquals(ForgeRuntime.STATE_RUNNING, runtime.getState());
+ assertNotNull(runtime.getProcess());
+ assertEquals(2, propertyChangeEvents.size());
+ for (PropertyChangeEvent evt : propertyChangeEvents) {
+ if (ForgeRuntime.STATE_NOT_RUNNING.equals(evt.getOldValue())) {
+ assertEquals(ForgeRuntime.STATE_STARTING, evt.getNewValue());
+ } else if (ForgeRuntime.STATE_STARTING.equals(evt.getOldValue())) {
+ assertEquals(ForgeRuntime.STATE_RUNNING, evt.getNewValue());
+ }
+ }
+ }
+
+ @Test
+ public void testStartWithProgressMonitor() {
+ runtime.start(new TestProgressMonitor());
+ assertEquals(ForgeRuntime.STATE_NOT_RUNNING, runtime.getState());
+ assertNull(runtime.getProcess());
+ assertEquals("Starting Forge", taskName);
+ assertEquals(IProgressMonitor.UNKNOWN, totalWork);
+ assertEquals(4, calledMethods.size());
+ assertTrue(calledMethods.contains("beginTask"));
+ assertTrue(calledMethods.contains("isCanceled"));
+ assertTrue(calledMethods.contains("worked"));
+ assertTrue(calledMethods.contains("done"));
+ assertEquals(1, amountWorked);
+ assertEquals(2, propertyChangeEvents.size());
+ for (PropertyChangeEvent evt : propertyChangeEvents) {
+ if (ForgeRuntime.STATE_NOT_RUNNING.equals(evt.getOldValue())) {
+ assertEquals(ForgeRuntime.STATE_STARTING, evt.getNewValue());
+ } else if (ForgeRuntime.STATE_STARTING.equals(evt.getOldValue())) {
+ assertEquals(ForgeRuntime.STATE_NOT_RUNNING, evt.getNewValue());
+ }
+ }
+ }
+
+ @Test
+ public void testStopComplete() {
+ runtime.start(null);
+ assertEquals(ForgeRuntime.STATE_RUNNING, runtime.getState());
+ propertyChangeEvents.clear();
+ runtime.stop(null);
+ assertEquals(ForgeRuntime.STATE_NOT_RUNNING, runtime.getState());
+ assertNull(runtime.getProcess());
+ assertEquals(1, propertyChangeEvents.size());
+ for (PropertyChangeEvent evt : propertyChangeEvents) {
+ assertEquals(ForgeRuntime.STATE_RUNNING, evt.getOldValue());
+ assertEquals(ForgeRuntime.STATE_NOT_RUNNING, evt.getNewValue());
+ }
+ }
+
+ @Test
+ public void testStopWithProgressMonitor() {
+ runtime.start(null);
+ assertEquals(ForgeRuntime.STATE_RUNNING, runtime.getState());
+ propertyChangeEvents.clear();
+ runtime.stop(new TestProgressMonitor());
+ assertEquals(ForgeRuntime.STATE_NOT_RUNNING, runtime.getState());
+ assertNull(runtime.getProcess());
+ assertEquals("Stopping Forge", taskName);
+ assertEquals(1, totalWork);
+ assertEquals(2, calledMethods.size());
+ assertTrue(calledMethods.contains("beginTask"));
+ assertTrue(calledMethods.contains("done"));
+ assertEquals(0, amountWorked);
+ 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);
+ }
+ }
+
+ private class TestProgressMonitor extends NullProgressMonitor {
+ public void beginTask(String name, int total) {
+ taskName = name;
+ totalWork = total;
+ calledMethods.add("beginTask");
+ }
+ public void done() {
+ calledMethods.add("done");
+ }
+ public boolean isCanceled() {
+ calledMethods.add("isCanceled");
+ return super.isCanceled();
+ }
+ public void worked(int work) {
+ amountWorked++;
+ calledMethods.add("worked");
+ setCanceled(true);
+ super.worked(work);
+ }
+ }
+
+ private class ForgeTestRuntime extends ForgeAbstractRuntime {
+ public String getName() {
+ return "test";
+ }
+ public String getLocation() {
+ String result = null;
+ try {
+ result =
FileLocator.getBundleFile(Platform.getBundle("org.jboss.tools.forge.runtime")).getAbsolutePath();
+ } catch (IOException e) {}
+ return result;
+ }
+ public String getType() {
+ return "test";
+ }
+ }
+
+}
Modified:
trunk/forge/tests/org.jboss.tools.forge.core.test/src/org/jboss/tools/forge/core/process/ForgeExternalRuntimeTest.java
===================================================================
---
trunk/forge/tests/org.jboss.tools.forge.core.test/src/org/jboss/tools/forge/core/process/ForgeExternalRuntimeTest.java 2011-07-05
16:18:38 UTC (rev 32616)
+++
trunk/forge/tests/org.jboss.tools.forge.core.test/src/org/jboss/tools/forge/core/process/ForgeExternalRuntimeTest.java 2011-07-05
16:19:02 UTC (rev 32617)
@@ -1,6 +1,6 @@
package org.jboss.tools.forge.core.process;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
import org.junit.Test;