rename subsystem to component.
[utils] / system / spring / src / main / java / org / wamblee / system / spring / SpringSystem.java
index 5de2a948fadbaca991425a4f9d18cb1945fdcf20..7a8b513ee7b318129f1b643c89a9096d3d7e30fa 100644 (file)
@@ -10,17 +10,22 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.AbstractApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.context.support.GenericApplicationContext;
-import org.wamblee.system.AbstractSubSystem;
+import org.wamblee.system.AbstractComponent;
 import org.wamblee.system.CompositeSystem;
+import org.wamblee.system.ProvidedInterfaceDescriptor;
+import org.wamblee.system.RequiredInterfaceDescriptor;
 import org.wamblee.system.Service;
-import org.wamblee.system.ServiceDescriptor;
+import org.wamblee.system.InterfaceDescriptor;
 import org.wamblee.system.ServiceRegistry;
+import org.wamblee.system.SystemAssembler;
 import org.wamblee.system.SystemAssemblyException;
 
 /**
  * Represents a system configured based on spring.
+ *
+ * @author Erik Brakkee
  */
-public class SpringSystem extends AbstractSubSystem {
+public class SpringSystem extends AbstractComponent {
 
        /**
         * Singleton access to the service registry. Required while starting up.
@@ -28,8 +33,8 @@ public class SpringSystem extends AbstractSubSystem {
        static ThreadLocal<ServiceRegistry> REGISTRY = new ThreadLocal<ServiceRegistry>();
 
        private String[] _configFiles;
-       private Map<String, ServiceDescriptor> _provided;
-       private Map<ServiceDescriptor, String> _required;
+       private Map<String, ProvidedInterfaceDescriptor> _provided;
+       private Map<RequiredInterfaceDescriptor, String> _required;
        /**
         * Parent application context containing required services.
         */
@@ -57,10 +62,10 @@ public class SpringSystem extends AbstractSubSystem {
         *            service.
         */
        public SpringSystem(String aName, ServiceRegistry aRegistry, String[] aConfigFiles,
-                       Map<String, ServiceDescriptor> aProvided,
-                       Map<ServiceDescriptor, String> aRequired) {
-               super(aName, aRegistry, aProvided.values().toArray(new ServiceDescriptor[0]),
-                               aRequired.keySet().toArray(new ServiceDescriptor[0]));
+                       Map<String, ProvidedInterfaceDescriptor> aProvided,
+                       Map<RequiredInterfaceDescriptor, String> aRequired) {
+               super(aName, aRegistry, aProvided.values().toArray(new InterfaceDescriptor[0]),
+                               aRequired.keySet().toArray(new InterfaceDescriptor[0]));
                _configFiles = aConfigFiles;
                _provided = aProvided;
                _required = aRequired;
@@ -116,13 +121,17 @@ public class SpringSystem extends AbstractSubSystem {
                
                for (Service svc: aRequiredServices) { 
                        String id = svc.getId();
-                       ServiceDescriptor descriptor = svc.getDescriptor();
-                       String beanName = _required.get(descriptor);
-                       ConstructorArgumentValues cargs = new ConstructorArgumentValues();
-                       cargs.addGenericArgumentValue(id); 
-                       BeanDefinition definition = new RootBeanDefinition(ProvidedServiceBean.class, cargs,
-                                       new MutablePropertyValues());
-                       _parentContext.registerBeanDefinition(beanName, definition);
+                       ProvidedInterfaceDescriptor descriptor = svc.getDescriptor();
+                       RequiredInterfaceDescriptor[] requiredServices = SystemAssembler.filterRequiredServices(descriptor,
+                                       _required.keySet()); 
+                       for (RequiredInterfaceDescriptor required: requiredServices) { 
+                               String beanName = _required.get(required);
+                               ConstructorArgumentValues cargs = new ConstructorArgumentValues();
+                               cargs.addGenericArgumentValue(id); 
+                               BeanDefinition definition = new RootBeanDefinition(ProvidedServiceBean.class, cargs,
+                                               new MutablePropertyValues());
+                               _parentContext.registerBeanDefinition(beanName, definition);
+                       }
                }
                _parentContext.refresh();
        }