package org.wamblee.system; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 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 List _provided; private List _required; 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. */ protected AbstractSubSystem(String aName, ServiceDescriptor[] aProvided, ServiceDescriptor[] aRequired) { _name = aName; _provided = new ArrayList(); _provided.addAll(Arrays.asList(aProvided)); _required = new ArrayList(); _required.addAll(Arrays.asList(aRequired)); _running = new HashMap(); } @Override public final String getName() { return _name; } @Override public final ServiceDescriptor[] getProvidedServices() { return _provided.toArray(new ServiceDescriptor[0]); } @Override public final ServiceDescriptor[] getRequiredServices() { return _required.toArray(new ServiceDescriptor[0]); } @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); 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. */ 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. */ protected final void addService(String aContext, Service aService) { LOG.info(aContext + ": service '" + aService + "' started."); _running.put(aService.getDescriptor(), aService); } @Override public Service[] getRunningServices() { return _running.values().toArray(new Service[0]); } @Override public String toString() { return _name; } }