import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 ServiceRegistry _registry;
private List<ServiceDescriptor> _provided;
private List<ServiceDescriptor> _required;
- private Map<ServiceDescriptor, Service> _running;
+ private Map<ServiceDescriptor, Service> _running;
/**
- * Constructs the subsystem.
- * @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<ServiceDescriptor>();
+ protected AbstractSubSystem(String aName, ServiceRegistry aRegistry, ServiceDescriptor[] aProvided,
+ ServiceDescriptor[] aRequired) {
+ _name = aName;
+ _registry = aRegistry;
+ _provided = new ArrayList<ServiceDescriptor>();
_provided.addAll(Arrays.asList(aProvided));
- _required = new ArrayList<ServiceDescriptor>();
+ _required = new ArrayList<ServiceDescriptor>();
_required.addAll(Arrays.asList(aRequired));
- _running = new HashMap<ServiceDescriptor, Service>();
+ _running = new HashMap<ServiceDescriptor, Service>();
}
@Override
public final String getName() {
- return _name;
+ return _name;
+ }
+
+ public ServiceRegistry getRegistry() {
+ return _registry;
}
@Override
- public final ServiceDescriptor[] getProvidedServices() {
- return _provided.toArray(new ServiceDescriptor[0]);
+ public final ProvidedServiceDescriptor[] getProvidedServices() {
+ return _provided.toArray(new ProvidedServiceDescriptor[0]);
}
@Override
- public final ServiceDescriptor[] getRequiredServices() {
- return _required.toArray(new ServiceDescriptor[0]);
+ public final RequiredServiceDescriptor[] getRequiredServices() {
+ return _required.toArray(new RequiredServiceDescriptor[0]);
}
@Override
- public final Service[] initialize(String aContext, Service[] aRequiredServices) {
- LOG.info("Initializing '" + aContext + "." + _name + "' with " + Arrays.asList(aRequiredServices));
- doInitialize(aContext + "." + getName(), aRequiredServices);
+ public final Service[] start(String aContext,
+ Service[] aRequiredServices) {
+ LOG.info("Initializing '" + aContext + "." + _name + "' with "
+ + Arrays.asList(aRequiredServices));
+ doStart(aContext + "." + getName(), 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 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 aRequiredServices
+ * Services that are already running from other subsystems that
+ * may be used.
*/
- protected abstract void doInitialize(String aContext, Service[] aRequiredServices);
-
+ protected abstract void doStart(String aContext,
+ 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,
+ ProvidedServiceDescriptor aDescriptor, Object aService) {
LOG.info(aContext + ": service '" + aService + "' started.");
- _running.put(aService.getDescriptor(), aService);
+ Service svc = getRegistry().register(aDescriptor, aService);
+ _running.put(svc.getDescriptor(), svc);
}
@Override
return _running.values().toArray(new Service[0]);
}
+ @Override
+ public void stop() {
+ doStop();
+ for (Service svc: _running.values()) {
+ getRegistry().remove(svc);
+ }
+ }
+
+ protected abstract void doStop();
+
@Override
public String toString() {
- return _name;
+ return _name;
}
}