X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2FAbstractSubSystem.java;h=7a6724f32ea8af702df9d9f45527f1dc53b09c98;hb=e7aa00a2eebaa1f8f9d7d1c407a5e8a7cbe899f7;hp=06fd5bb82c823aa3481e278753a6338504919c66;hpb=4c7e63f11337abfaa6ea13eab4b6ca11891f4977;p=utils 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; } }