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 List<ServiceDescriptor> _provided;
21 private List<ServiceDescriptor> _required;
22 private Map<ServiceDescriptor, Service> _running;
25 * Constructs the subsystem.
28 * Registry of services.
36 protected AbstractSubSystem(String aName, ServiceDescriptor[] aProvided,
37 ServiceDescriptor[] aRequired) {
39 _provided = new ArrayList<ServiceDescriptor>();
40 _provided.addAll(Arrays.asList(aProvided));
41 _required = new ArrayList<ServiceDescriptor>();
42 _required.addAll(Arrays.asList(aRequired));
43 _running = new HashMap<ServiceDescriptor, Service>();
47 public final String getName() {
52 public final ServiceDescriptor[] getProvidedServices() {
53 return _provided.toArray(new ServiceDescriptor[0]);
57 public final ServiceDescriptor[] getRequiredServices() {
58 return _required.toArray(new ServiceDescriptor[0]);
62 public final Service[] start(String aContext, ServiceRegistry aRegistry,
63 Service[] aRequiredServices) {
64 LOG.info("Initializing '" + aContext + "." + _name + "' with "
65 + Arrays.asList(aRequiredServices));
66 doStart(aContext + "." + getName(), aRegistry, aRequiredServices);
67 return _running.values().toArray(new Service[0]);
71 * Must be implemented for initializing the subsystem. The implementation
72 * must call {@link #addService(Service)} for each service that is started.
74 * @param aRegistry Service registry.
75 * @param aRequiredServices
76 * Services that are already running from other subsystems that
79 protected abstract void doStart(String aContext,
80 ServiceRegistry aRegistry,
81 Service[] aRequiredServices);
84 * Implementations must call this method to indicate that a new service has
90 protected final void addService(String aContext,
91 ServiceRegistry aRegistry,
92 ServiceDescriptor aDescriptor, Object aService) {
93 LOG.info(aContext + ": service '" + aService + "' started.");
94 Service svc = aRegistry.register(aDescriptor, aService);
95 _running.put(svc.getDescriptor(), svc);
99 public Service[] getRunningServices() {
100 return _running.values().toArray(new Service[0]);
104 public void stop(String aContext, ServiceRegistry aRegistry) {
106 for (Service svc: _running.values()) {
107 aRegistry.remove(svc);
111 protected abstract void doStop(String aContext);
114 public String toString() {