now distinguishing between provided and required service and added
[utils] / system / spring / src / main / java / org / wamblee / system / spring / SpringSystem.java
index 5de2a948fadbaca991425a4f9d18cb1945fdcf20..ba0ccf8833b673055fb70def5decf4a881429b53 100644 (file)
@@ -12,9 +12,12 @@ import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.context.support.GenericApplicationContext;
 import org.wamblee.system.AbstractSubSystem;
 import org.wamblee.system.CompositeSystem;
+import org.wamblee.system.ProvidedServiceDescriptor;
+import org.wamblee.system.RequiredServiceDescriptor;
 import org.wamblee.system.Service;
 import org.wamblee.system.ServiceDescriptor;
 import org.wamblee.system.ServiceRegistry;
+import org.wamblee.system.SystemAssembler;
 import org.wamblee.system.SystemAssemblyException;
 
 /**
@@ -28,8 +31,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, ProvidedServiceDescriptor> _provided;
+       private Map<RequiredServiceDescriptor, String> _required;
        /**
         * Parent application context containing required services.
         */
@@ -57,8 +60,8 @@ public class SpringSystem extends AbstractSubSystem {
         *            service.
         */
        public SpringSystem(String aName, ServiceRegistry aRegistry, String[] aConfigFiles,
-                       Map<String, ServiceDescriptor> aProvided,
-                       Map<ServiceDescriptor, String> aRequired) {
+                       Map<String, ProvidedServiceDescriptor> aProvided,
+                       Map<RequiredServiceDescriptor, String> aRequired) {
                super(aName, aRegistry, aProvided.values().toArray(new ServiceDescriptor[0]),
                                aRequired.keySet().toArray(new ServiceDescriptor[0]));
                _configFiles = aConfigFiles;
@@ -116,13 +119,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);
+                       ProvidedServiceDescriptor descriptor = svc.getDescriptor();
+                       RequiredServiceDescriptor[] requiredServices = SystemAssembler.filterRequiredServices(descriptor,
+                                       _required.keySet()); 
+                       for (RequiredServiceDescriptor 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();
        }