From e7aa00a2eebaa1f8f9d7d1c407a5e8a7cbe899f7 Mon Sep 17 00:00:00 2001 From: Erik Brakkee Date: Mon, 24 Mar 2008 13:15:54 +0000 Subject: [PATCH] --- .../org/wamblee/system/AbstractSubSystem.java | 96 ++++++++++++------- .../org/wamblee/system/CompositeSystem.java | 7 +- .../system/DefaultServiceRegistry.java | 8 ++ .../org/wamblee/system/ServiceRegistry.java | 2 + .../java/org/wamblee/system/SubSystem.java | 7 ++ .../java/org/wamblee/system/Application.java | 6 +- .../java/org/wamblee/system/Environment.java | 11 ++- .../wamblee/system/SystemAssemblerTest.java | 6 ++ system/pom.xml | 1 + system/spring/pom.xml | 24 +++++ 10 files changed, 127 insertions(+), 41 deletions(-) create mode 100644 system/spring/pom.xml diff --git a/system/general/src/main/java/org/wamblee/system/AbstractSubSystem.java b/system/general/src/main/java/org/wamblee/system/AbstractSubSystem.java index 06fd5bb8..7a6724f3 100644 --- a/system/general/src/main/java/org/wamblee/system/AbstractSubSystem.java +++ b/system/general/src/main/java/org/wamblee/system/AbstractSubSystem.java @@ -10,43 +10,47 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** - * Abstract subsystem class making it easy to implement new - * subsystems. + * Abstract subsystem class making it easy to implement new subsystems. */ public abstract class AbstractSubSystem implements SubSystem { - + private static final Log LOG = LogFactory.getLog(AbstractSubSystem.class); - private String _name; + private String _name; private List _provided; private List _required; - private Map _running; + private Map _running; /** - * Constructs the subsystem. - * @param aRegistry Registry of services. - * @param aName Name of the system. - * @param aProvided Provided services. - * @param aRequired Required services. + * Constructs the subsystem. + * + * @param aRegistry + * Registry of services. + * @param aName + * Name of the system. + * @param aProvided + * Provided services. + * @param aRequired + * Required services. */ - protected AbstractSubSystem(String aName, ServiceDescriptor[] aProvided, - ServiceDescriptor[] aRequired) { - _name = aName; - _provided = new ArrayList(); + protected AbstractSubSystem(String aName, ServiceDescriptor[] aProvided, + ServiceDescriptor[] aRequired) { + _name = aName; + _provided = new ArrayList(); _provided.addAll(Arrays.asList(aProvided)); - _required = new ArrayList(); + _required = new ArrayList(); _required.addAll(Arrays.asList(aRequired)); - _running = new HashMap(); + _running = new HashMap(); } @Override public final String getName() { - return _name; + return _name; } @Override public final ServiceDescriptor[] getProvidedServices() { - return _provided.toArray(new ServiceDescriptor[0]); + return _provided.toArray(new ServiceDescriptor[0]); } @Override @@ -55,30 +59,40 @@ public abstract class AbstractSubSystem implements SubSystem { } @Override - public final Service[] start(String aContext, ServiceRegistry aRegistry, Service[] aRequiredServices) { - LOG.info("Initializing '" + aContext + "." + _name + "' with " + Arrays.asList(aRequiredServices)); - doStart(aContext + "." + getName(), aRegistry, aRequiredServices); + public final Service[] start(String aContext, ServiceRegistry aRegistry, + Service[] aRequiredServices) { + LOG.info("Initializing '" + aContext + "." + _name + "' with " + + Arrays.asList(aRequiredServices)); + doStart(aContext + "." + getName(), aRegistry, aRequiredServices); return _running.values().toArray(new Service[0]); } - + /** - * Must be implemented for initializing the subsystem. - * The implementation must call {@link #addService(Service)} - * for each service that is started. - * @param aRegistry Registry to which the subsystem must register its services. - * @param aRequiredServices Services that are already running - * from other subsystems that may be used. + * Must be implemented for initializing the subsystem. The implementation + * must call {@link #addService(Service)} for each service that is started. + * + * @param aRegistry Service registry. + * @param aRequiredServices + * Services that are already running from other subsystems that + * may be used. */ - protected abstract void doStart(String aContext, ServiceRegistry aRegistry, Service[] aRequiredServices); - + protected abstract void doStart(String aContext, + ServiceRegistry aRegistry, + Service[] aRequiredServices); + /** - * Implementations must call this method to indicate that - * a new service has been started. - * @param aService Service. + * Implementations must call this method to indicate that a new service has + * been started. + * + * @param aService + * Service. */ - protected final void addService(String aContext, Service aService) { + protected final void addService(String aContext, + ServiceRegistry aRegistry, + ServiceDescriptor aDescriptor, Object aService) { LOG.info(aContext + ": service '" + aService + "' started."); - _running.put(aService.getDescriptor(), aService); + Service svc = aRegistry.register(aDescriptor, aService); + _running.put(svc.getDescriptor(), svc); } @Override @@ -86,9 +100,19 @@ public abstract class AbstractSubSystem implements SubSystem { return _running.values().toArray(new Service[0]); } + @Override + public void stop(String aContext, ServiceRegistry aRegistry) { + doStop(aContext); + for (Service svc: _running.values()) { + aRegistry.remove(svc); + } + } + + protected abstract void doStop(String aContext); + @Override public String toString() { - return _name; + return _name; } } diff --git a/system/general/src/main/java/org/wamblee/system/CompositeSystem.java b/system/general/src/main/java/org/wamblee/system/CompositeSystem.java index b3abf071..32551498 100644 --- a/system/general/src/main/java/org/wamblee/system/CompositeSystem.java +++ b/system/general/src/main/java/org/wamblee/system/CompositeSystem.java @@ -83,10 +83,15 @@ public class CompositeSystem extends AbstractSubSystem { for (Service service : aRequiredServices) { descriptors.add(service.getDescriptor()); } - SystemAssembler assembler = new SystemAssembler(getName(), _systems, + SystemAssembler assembler = new SystemAssembler(aContext + "." + getName(), _systems, descriptors.toArray(new ServiceDescriptor[0])); assembler.start(aRegistry, aRequiredServices); } + + @Override + protected void doStop(String aContext) { + // Empty. + } private void info(String aMsg) { LOG.info(getName() + ": " + aMsg); diff --git a/system/general/src/main/java/org/wamblee/system/DefaultServiceRegistry.java b/system/general/src/main/java/org/wamblee/system/DefaultServiceRegistry.java index 3fe5c71d..4d8bd465 100644 --- a/system/general/src/main/java/org/wamblee/system/DefaultServiceRegistry.java +++ b/system/general/src/main/java/org/wamblee/system/DefaultServiceRegistry.java @@ -23,6 +23,14 @@ public class DefaultServiceRegistry implements ServiceRegistry { _services.put(id, svc); return svc; } + + @Override + public void remove(Service aService) { + Service svc = _services.remove(aService.getId()); + if ( svc == null ) { + throw new IllegalArgumentException("Service '" + aService.getId() + "' does not exist"); + } + } @Override public synchronized Service find(String id) { diff --git a/system/general/src/main/java/org/wamblee/system/ServiceRegistry.java b/system/general/src/main/java/org/wamblee/system/ServiceRegistry.java index 62224dd3..ebe7229e 100644 --- a/system/general/src/main/java/org/wamblee/system/ServiceRegistry.java +++ b/system/general/src/main/java/org/wamblee/system/ServiceRegistry.java @@ -4,6 +4,8 @@ public interface ServiceRegistry { Service register(ServiceDescriptor aDescriptor, Object aService); + void remove(Service aService); + Service find(String aId); Service[] listAllServices(); diff --git a/system/general/src/main/java/org/wamblee/system/SubSystem.java b/system/general/src/main/java/org/wamblee/system/SubSystem.java index babb9e02..16b37aab 100644 --- a/system/general/src/main/java/org/wamblee/system/SubSystem.java +++ b/system/general/src/main/java/org/wamblee/system/SubSystem.java @@ -37,6 +37,13 @@ public interface SubSystem { */ Service[] start(String aContext, ServiceRegistry aRegistry, Service[] aRequiredServices); + /** + * Stops a service. + * @param aContext Context + * @param aRegistry Registry from which services must be removed. + */ + void stop(String aContext, ServiceRegistry aRegistry); + /** * Gets the list of running services in the subsystem. * diff --git a/system/general/src/test/java/org/wamblee/system/Application.java b/system/general/src/test/java/org/wamblee/system/Application.java index 77c76cb3..3587917b 100644 --- a/system/general/src/test/java/org/wamblee/system/Application.java +++ b/system/general/src/test/java/org/wamblee/system/Application.java @@ -17,5 +17,9 @@ public class Application extends AbstractSubSystem { protected void doStart(String aContext, ServiceRegistry aRegistry, Service[] aRequiredServices) { // Empty, no services provided externally. } - + + @Override + protected void doStop(String aContext) { + // Empty. + } } diff --git a/system/general/src/test/java/org/wamblee/system/Environment.java b/system/general/src/test/java/org/wamblee/system/Environment.java index 7209c273..901c67d7 100644 --- a/system/general/src/test/java/org/wamblee/system/Environment.java +++ b/system/general/src/test/java/org/wamblee/system/Environment.java @@ -10,14 +10,19 @@ public class Environment extends AbstractSubSystem { new DefaultServiceDescriptor(DataSource.class), new DefaultServiceDescriptor(Integer.class) }; - + public Environment() { super("environment", PROVIDED, new ServiceDescriptor[0]); } @Override protected void doStart(String aContext, ServiceRegistry aRegistry, Service[] aRequiredServices) { - addService(aContext, aRegistry.register(PROVIDED[0], new Integer(1))); - addService(aContext, aRegistry.register(PROVIDED[1], new Integer(2))); + addService(aContext, aRegistry, PROVIDED[0], new Integer(1)); + addService(aContext, aRegistry, PROVIDED[1], new Integer(2)); + } + + @Override + protected void doStop(String aContext) { + // Empty. } } 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 60d1b587..70558250 100644 --- a/system/general/src/test/java/org/wamblee/system/SystemAssemblerTest.java +++ b/system/general/src/test/java/org/wamblee/system/SystemAssemblerTest.java @@ -23,6 +23,12 @@ public class SystemAssemblerTest extends TestCase { Service[] appServices = environment.getRunningServices(); assertEquals(2, appServices.length); assertEquals(2, _registry.listAllServices().length); + + environment.stop("", _registry); + assertEquals(0, _registry.listAllServices().length); + + application.stop("", _registry); + assertEquals(0, _registry.listAllServices().length); } public void testApplicationEnvironment() { diff --git a/system/pom.xml b/system/pom.xml index 202365ef..c79ad312 100644 --- a/system/pom.xml +++ b/system/pom.xml @@ -16,5 +16,6 @@ http://wamblee.org general + spring diff --git a/system/spring/pom.xml b/system/spring/pom.xml new file mode 100644 index 00000000..bc1737e9 --- /dev/null +++ b/system/spring/pom.xml @@ -0,0 +1,24 @@ + + + + org.wamblee + wamblee-utils + 0.2-SNAPSHOT + + + 4.0.0 + org.wamblee + wamblee-system-spring + jar + wamblee.org system general + http://wamblee.org + + + commons-logging + commons-logging + + + + -- 2.31.1