From 1e5be8a4c88bd425203fbd4ee3a4891d4d50234c Mon Sep 17 00:00:00 2001
From: erik <erik@77661180-640e-0410-b3a8-9f9b13e6d0e0>
Date: Mon, 31 Mar 2008 17:03:50 +0000
Subject: [PATCH] Added getStatus() method and now also testing for the correct
 status.

---
 .../org/wamblee/system/AbstractComponent.java | 10 +++++++++
 .../java/org/wamblee/system/Component.java    | 10 +++++++++
 ...iteSystem.java => CompositeComponent.java} | 10 +++++----
 .../wamblee/system/SystemAssemblerTest.java   | 22 ++++++++++++++-----
 .../wamblee/system/spring/SpringSystem.java   |  2 +-
 5 files changed, 44 insertions(+), 10 deletions(-)
 rename system/general/src/main/java/org/wamblee/system/{CompositeSystem.java => CompositeComponent.java} (90%)

diff --git a/system/general/src/main/java/org/wamblee/system/AbstractComponent.java b/system/general/src/main/java/org/wamblee/system/AbstractComponent.java
index 5c96b549..47c82862 100644
--- a/system/general/src/main/java/org/wamblee/system/AbstractComponent.java
+++ b/system/general/src/main/java/org/wamblee/system/AbstractComponent.java
@@ -9,6 +9,7 @@ import java.util.Map;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.wamblee.system.Component.Status;
 
 /**
  * Abstract subsystem class making it easy to implement new subsystems.
@@ -17,6 +18,7 @@ public abstract class AbstractComponent implements Component {
 
 	private static final Log LOG = LogFactory.getLog(AbstractComponent.class);
 
+	private Status _status; 
 	private String _name;
 	private ServiceRegistry _registry; 
 	private List<InterfaceDescriptor> _provided;
@@ -37,6 +39,7 @@ public abstract class AbstractComponent implements Component {
 	 */
 	protected AbstractComponent(String aName, ServiceRegistry aRegistry, InterfaceDescriptor[] aProvided,
 			InterfaceDescriptor[] aRequired) {
+		_status = Status.NOT_STARTED;
 		_name = aName;
 		_registry = aRegistry; 
 		_provided = new ArrayList<InterfaceDescriptor>();
@@ -45,6 +48,11 @@ public abstract class AbstractComponent implements Component {
 		_required.addAll(Arrays.asList(aRequired));
 		_running = new HashMap<InterfaceDescriptor, Service>();
 	}
+	
+	@Override
+	public Status getStatus() {
+		return _status; 
+	}
 
 	@Override
 	public final String getName() {
@@ -71,6 +79,7 @@ public abstract class AbstractComponent implements Component {
 		LOG.info("Initializing '" + aContext + "." + _name + "' with "
 				+ Arrays.asList(aRequiredServices));
 		doStart(aContext + "." + getName(), aRequiredServices);
+		_status = Status.RUNNING;
 		return _running.values().toArray(new Service[0]);
 	}
 
@@ -110,6 +119,7 @@ public abstract class AbstractComponent implements Component {
 		for (Service svc: _running.values()) { 
 			getRegistry().remove(svc);
 		}
+		_status = Status.STOPPED;
 	}
 	
 	protected abstract void doStop(); 
diff --git a/system/general/src/main/java/org/wamblee/system/Component.java b/system/general/src/main/java/org/wamblee/system/Component.java
index 6a31e01d..afbed94c 100644
--- a/system/general/src/main/java/org/wamblee/system/Component.java
+++ b/system/general/src/main/java/org/wamblee/system/Component.java
@@ -8,6 +8,16 @@ package org.wamblee.system;
  */
 public interface Component {
 	
+	enum Status { 
+		NOT_STARTED, RUNNING, STOPPED
+	}
+	
+	/**
+	 * Gets the status of the component. 
+	 * @return Status. 
+	 */
+	Status getStatus();
+	
 	/**
 	 * Gets the name of the subsystem.
 	 * @return Subsystem name. 
diff --git a/system/general/src/main/java/org/wamblee/system/CompositeSystem.java b/system/general/src/main/java/org/wamblee/system/CompositeComponent.java
similarity index 90%
rename from system/general/src/main/java/org/wamblee/system/CompositeSystem.java
rename to system/general/src/main/java/org/wamblee/system/CompositeComponent.java
index 24547a93..7bc120aa 100644
--- a/system/general/src/main/java/org/wamblee/system/CompositeSystem.java
+++ b/system/general/src/main/java/org/wamblee/system/CompositeComponent.java
@@ -14,9 +14,9 @@ import sun.util.LocaleServiceProviderPool.LocalizedObjectGetter;
  *
  * @author Erik Brakkee
  */
-public class CompositeSystem extends AbstractComponent {
+public class CompositeComponent extends AbstractComponent {
 
-	private static final Log LOG = LogFactory.getLog(CompositeSystem.class);
+	private static final Log LOG = LogFactory.getLog(CompositeComponent.class);
 
 	private Component[] _systems;
 
@@ -28,7 +28,7 @@ public class CompositeSystem extends AbstractComponent {
 	 * @param aProvided Provided services of the system. 
 	 * @param aRequired Required services by the system. 
 	 */
-	public CompositeSystem(String aName, ServiceRegistry aRegistry, Component[] aSystems,
+	public CompositeComponent(String aName, ServiceRegistry aRegistry, Component[] aSystems,
 			InterfaceDescriptor[] aProvided, InterfaceDescriptor[] aRequired) {
 		super(aName, aRegistry, aProvided, aRequired);
 		_systems = aSystems;
@@ -93,7 +93,9 @@ public class CompositeSystem extends AbstractComponent {
 	
 	@Override
 	protected void doStop() {
-		// Empty. 	
+		for (int i = _systems.length-1; i >= 0; i--) { 
+			_systems[i].stop();
+		}
 	}
 
 	private void info(String aMsg) {
diff --git a/system/general/src/test/java/org/wamblee/system/SystemAssemblerTest.java b/system/general/src/test/java/org/wamblee/system/SystemAssemblerTest.java
index 885cff39..ab8bae69 100644
--- a/system/general/src/test/java/org/wamblee/system/SystemAssemblerTest.java
+++ b/system/general/src/test/java/org/wamblee/system/SystemAssemblerTest.java
@@ -4,6 +4,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 
+import org.wamblee.system.Component.Status;
 import org.wamblee.test.AssertionUtils;
 
 import junit.framework.TestCase;
@@ -98,21 +99,32 @@ public class SystemAssemblerTest extends TestCase {
 	public void testComposite() {
 		Component environment = new Environment(_registry);
 		Component application = new Application(_registry);
-		CompositeSystem system = new CompositeSystem("all", _registry,
+		assertEquals(Status.NOT_STARTED, environment.getStatus());
+		assertEquals(Status.NOT_STARTED, application.getStatus());
+		CompositeComponent system = new CompositeComponent("all", _registry,
 				new Component[] { environment, application },
 				new InterfaceDescriptor[0], new InterfaceDescriptor[0]);
+		assertEquals(Status.NOT_STARTED, system.getStatus());
 		system.start("root", new Service[0]);
 		InterfaceDescriptor[] required = system.getRequiredServices();
 		assertEquals(0, required.length);
 		InterfaceDescriptor[] provided = system.getProvidedServices();
 		assertEquals(0, provided.length);
+		assertEquals(Status.RUNNING, environment.getStatus());
+		assertEquals(Status.RUNNING, application.getStatus());
+		assertEquals(Status.RUNNING, system.getStatus());
+		
+		system.stop();
+		assertEquals(Status.STOPPED, environment.getStatus());
+		assertEquals(Status.STOPPED, application.getStatus());
+		assertEquals(Status.STOPPED, system.getStatus());
 	}
 
 	public void testCompositeWithWrongProvidedInfo() {
 		try {
 			Component environment = new Environment(_registry);
 			Component application = new Application(_registry);
-			CompositeSystem system = new CompositeSystem(
+			CompositeComponent system = new CompositeComponent(
 					"all",
 					_registry,
 					new Component[] { environment, application },
@@ -128,7 +140,7 @@ public class SystemAssemblerTest extends TestCase {
 	public void testCompositeWithSuperfluousRequiredInfo() {
 		Component environment = new Environment(_registry);
 		Component application = new Application(_registry);
-		CompositeSystem system = new CompositeSystem("all", _registry,
+		CompositeComponent system = new CompositeComponent("all", _registry,
 				new Component[] { environment, application },
 				new InterfaceDescriptor[0],
 				new InterfaceDescriptor[] { new DefaultRequiredInterfaceDescriptor(
@@ -144,7 +156,7 @@ public class SystemAssemblerTest extends TestCase {
 		try {
 			Component environment = new Environment(_registry);
 			Component application = new Application(_registry);
-			CompositeSystem system = new CompositeSystem("all", _registry,
+			CompositeComponent system = new CompositeComponent("all", _registry,
 					new Component[] { application }, new InterfaceDescriptor[0],
 					application.getRequiredServices());
 			system.start("root", new Service[0]);
@@ -159,7 +171,7 @@ public class SystemAssemblerTest extends TestCase {
 
 		Component environment = new Environment(_registry);
 		Component application = new Application(_registry);
-		CompositeSystem system = new CompositeSystem("all", _registry,
+		CompositeComponent system = new CompositeComponent("all", _registry,
 				new Component[] { application }, new InterfaceDescriptor[0],
 				application.getRequiredServices());
 		Service[] envServices = environment.start("env", new Service[0]);
diff --git a/system/spring/src/main/java/org/wamblee/system/spring/SpringSystem.java b/system/spring/src/main/java/org/wamblee/system/spring/SpringSystem.java
index 7a8b513e..05731af8 100644
--- a/system/spring/src/main/java/org/wamblee/system/spring/SpringSystem.java
+++ b/system/spring/src/main/java/org/wamblee/system/spring/SpringSystem.java
@@ -11,7 +11,7 @@ import org.springframework.context.support.AbstractApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.context.support.GenericApplicationContext;
 import org.wamblee.system.AbstractComponent;
-import org.wamblee.system.CompositeSystem;
+import org.wamblee.system.CompositeComponent;
 import org.wamblee.system.ProvidedInterfaceDescriptor;
 import org.wamblee.system.RequiredInterfaceDescriptor;
 import org.wamblee.system.Service;
-- 
2.31.1