1 package org.wamblee.system;
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.HashMap;
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
13 * Abstract subsystem class making it easy to implement new subsystems.
15 public abstract class AbstractSubSystem implements SubSystem {
17 private static final Log LOG = LogFactory.getLog(AbstractSubSystem.class);
20 private ServiceRegistry _registry;
21 private List<ServiceDescriptor> _provided;
22 private List<ServiceDescriptor> _required;
23 private Map<ServiceDescriptor, Service> _running;
26 * Constructs the subsystem.
29 * Registry of services.
37 protected AbstractSubSystem(String aName, ServiceRegistry aRegistry, ServiceDescriptor[] aProvided,
38 ServiceDescriptor[] aRequired) {
40 _registry = aRegistry;
41 _provided = new ArrayList<ServiceDescriptor>();
42 _provided.addAll(Arrays.asList(aProvided));
43 _required = new ArrayList<ServiceDescriptor>();
44 _required.addAll(Arrays.asList(aRequired));
45 _running = new HashMap<ServiceDescriptor, Service>();
49 public final String getName() {
53 public ServiceRegistry getRegistry() {
58 public final ServiceDescriptor[] getProvidedServices() {
59 return _provided.toArray(new ServiceDescriptor[0]);
63 public final ServiceDescriptor[] getRequiredServices() {
64 return _required.toArray(new ServiceDescriptor[0]);
68 public final Service[] start(String aContext,
69 Service[] aRequiredServices) {
70 LOG.info("Initializing '" + aContext + "." + _name + "' with "
71 + Arrays.asList(aRequiredServices));
72 doStart(aContext + "." + getName(), aRequiredServices);
73 return _running.values().toArray(new Service[0]);
77 * Must be implemented for initializing the subsystem. The implementation
78 * must call {@link #addService(Service)} for each service that is started.
80 * @param aRequiredServices
81 * Services that are already running from other subsystems that
84 protected abstract void doStart(String aContext,
85 Service[] aRequiredServices);
88 * Implementations must call this method to indicate that a new service has
94 protected final void addService(String aContext,
95 ServiceDescriptor aDescriptor, Object aService) {
96 LOG.info(aContext + ": service '" + aService + "' started.");
97 Service svc = getRegistry().register(aDescriptor, aService);
98 _running.put(svc.getDescriptor(), svc);
102 public Service[] getRunningServices() {
103 return _running.values().toArray(new Service[0]);
109 for (Service svc: _running.values()) {
110 getRegistry().remove(svc);
114 protected abstract void doStop();
117 public String toString() {