(no commit message)
[utils] / system / general / src / main / java / org / wamblee / system / SystemAssembler.java
index 80bab167fa1de1bf7c7c071d14f6ad60e93b627a..90a98440ca877d7d98e02fed010a1a6017fa4cb1 100644 (file)
@@ -1,11 +1,28 @@
+/*
+ * Copyright 2007 the original author or authors.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */ 
 package org.wamblee.system;
 
 import java.util.ArrayList;
 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;
@@ -13,6 +30,8 @@ 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 {
 
@@ -20,30 +39,31 @@ 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]);
        }
 
        /**
@@ -55,8 +75,8 @@ public class SystemAssembler {
         *            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);
        }
 
@@ -71,31 +91,32 @@ public class SystemAssembler {
         *            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) {
@@ -118,7 +139,7 @@ public class SystemAssembler {
                        }
 
                        // add all provided services
-                       ProvidedServiceDescriptor[] provided = system.getProvidedServices();
+                       ProvidedInterface[] provided = system.getProvidedServices();
                        allProvided.addAll(Arrays.asList(provided));
                }
        }
@@ -126,39 +147,36 @@ public class SystemAssembler {
        /**
         * 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);
                        }
 
                }