import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Assembler to control multiple subsystems. It makes sure that all dependencies
* are met and controls the order in which systems are initialized.
+ *
+ * @author Erik Brakkee
*/
public class SystemAssembler {
private static final String ROOT_CONTEXT_NAME = "root";
private String _context;
- private SubSystem[] _systems;
-
- public static RequiredServiceDescriptor[] filterRequiredServices(
- ProvidedServiceDescriptor aProvided,
- Collection<RequiredServiceDescriptor> aDescriptors) {
- List<RequiredServiceDescriptor> required = new ArrayList<RequiredServiceDescriptor>();
- for (RequiredServiceDescriptor descriptor : aDescriptors) {
+ private Component[] _systems;
+ private ProvidedInterface[] _required;
+
+ public static RequiredInterface[] filterRequiredServices(
+ ProvidedInterface aProvided,
+ Collection<RequiredInterface> aDescriptors) {
+ List<RequiredInterface> required = new ArrayList<RequiredInterface>();
+ for (RequiredInterface descriptor : aDescriptors) {
if (descriptor.implementedBy(aProvided)) {
required.add(descriptor);
}
}
- return required.toArray(new RequiredServiceDescriptor[0]);
+ return required.toArray(new RequiredInterface[0]);
}
- public static ProvidedServiceDescriptor[] filterProvidedServices(
- RequiredServiceDescriptor aRequired,
- Collection<ProvidedServiceDescriptor> aProvided) {
- List<ProvidedServiceDescriptor> provided = new ArrayList<ProvidedServiceDescriptor>();
- for (ProvidedServiceDescriptor descriptor : aProvided) {
+ public static ProvidedInterface[] filterProvidedServices(
+ RequiredInterface aRequired,
+ Collection<ProvidedInterface> aProvided) {
+ List<ProvidedInterface> provided = new ArrayList<ProvidedInterface>();
+ for (ProvidedInterface descriptor : aProvided) {
if (aRequired.implementedBy(descriptor)) {
provided.add(descriptor);
}
}
- return provided.toArray(new ProvidedServiceDescriptor[0]);
+ return provided.toArray(new ProvidedInterface[0]);
}
/**
* Available services from other systems outside of the systems
* that this assembler manages.
*/
- public SystemAssembler(SubSystem[] aSystems,
- ProvidedServiceDescriptor[] aAvailableServices) {
+ public SystemAssembler(Component[] aSystems,
+ ProvidedInterface[] aAvailableServices) {
this(ROOT_CONTEXT_NAME, aSystems, aAvailableServices);
}
* Available services from other systems outside of the systems
* that this assembler manages.
*/
- public SystemAssembler(String aContext, SubSystem[] aSystems,
- ProvidedServiceDescriptor[] aAvailableServices) {
+ public SystemAssembler(String aContext, Component[] aSystems,
+ ProvidedInterface[] aAvailableServices) {
_context = aContext;
_systems = aSystems;
- validate(aAvailableServices);
+ _required = aAvailableServices;
+ validate();
}
/**
* Determines if the systems are ordered appropriately so that all
* dependencies are met.
*/
- private void validate(ProvidedServiceDescriptor[] aDescriptors)
+ private void validate()
throws SystemAssemblyException {
- List<ProvidedServiceDescriptor> allProvided = new ArrayList<ProvidedServiceDescriptor>();
- for (ProvidedServiceDescriptor descriptor : aDescriptors) {
+ List<ProvidedInterface> allProvided = new ArrayList<ProvidedInterface>();
+ for (ProvidedInterface descriptor : _required) {
allProvided.add(descriptor);
}
- for (SubSystem system : _systems) {
+ for (Component system : _systems) {
// Check if all required services are already provided by earlier
// systems.
- RequiredServiceDescriptor[] required = system.getRequiredServices();
+ RequiredInterface[] required = system.getRequiredServices();
- for (RequiredServiceDescriptor descriptor : required) {
- ProvidedServiceDescriptor[] filtered = filterProvidedServices(
+ for (RequiredInterface descriptor : required) {
+ ProvidedInterface[] filtered = filterProvidedServices(
descriptor, allProvided);
if (filtered.length == 0) {
}
// add all provided services
- ProvidedServiceDescriptor[] provided = system.getProvidedServices();
+ ProvidedInterface[] provided = system.getProvidedServices();
allProvided.addAll(Arrays.asList(provided));
}
}
/**
* Starts the subsystems.
*
- * @param aRegistry
- * Service registry to which created services must be registered.
* @param aRequiredServices
* Services that are available from other systems that have been
* started before.
*/
- public void start(ServiceRegistry aRegistry, Service[] aRequiredServices) {
+ public void start() {
LOG.info("Starting '" + _context + "'");
- Map<ProvidedServiceDescriptor, Service> allProvided = new HashMap<ProvidedServiceDescriptor, Service>();
-
- for (Service service : aRequiredServices) {
- allProvided.put(service.getDescriptor(), service);
- }
- for (SubSystem system : _systems) {
+ Set<ProvidedInterface> allProvided = new HashSet<ProvidedInterface>();
+ allProvided.addAll(Arrays.asList(_required));
+
+ for (Component system : _systems) {
// Compose a list of the required services required for the subsystem.
- RequiredServiceDescriptor[] descriptors = system
+ RequiredInterface[] descriptors = system
.getRequiredServices();
- List<Service> services = new ArrayList<Service>();
- for (RequiredServiceDescriptor descriptor : descriptors) {
- ProvidedServiceDescriptor[] provided = filterProvidedServices(
- descriptor, allProvided.keySet());
- services.add(allProvided.get(provided[0]));
+ List<ProvidedInterface> services = new ArrayList<ProvidedInterface>();
+ for (RequiredInterface required : descriptors) {
+ ProvidedInterface[] provided = filterProvidedServices(
+ required, allProvided);
+ assert provided.length == 1;
+ services.add(provided[0]);
+ required.setProvider(provided[0]);
}
// Start the service.
- Service[] provided = system.start(_context, services
- .toArray(new Service[0]));
+ system.start(_context);
- // Add started services to the map of started services.
- for (Service service : provided) {
- allProvided.put(service.getDescriptor(), service);
+ // Add started services to the set of started services.
+ for (ProvidedInterface service : system.getProvidedServices()) {
+ allProvided.add(service);
}
}