X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fspring%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fspring%2FSpringComponent.java;h=88746a5ecc4a94f50a0af17653a49a05bce7f51d;hb=32a8562695029cf13d915bc7941a61fe07ff0005;hp=aea9b15aa1a548eacfe9e7c1a39667f684606003;hpb=dea786c9d49228a37cb5fd5b4113b86d9f6cddbf;p=utils diff --git a/system/spring/src/main/java/org/wamblee/system/spring/SpringComponent.java b/system/spring/src/main/java/org/wamblee/system/spring/SpringComponent.java index aea9b15a..88746a5e 100644 --- a/system/spring/src/main/java/org/wamblee/system/spring/SpringComponent.java +++ b/system/spring/src/main/java/org/wamblee/system/spring/SpringComponent.java @@ -15,6 +15,7 @@ */ package org.wamblee.system.spring; +import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -49,6 +50,7 @@ public class SpringComponent extends AbstractComponent { private String[] _configFiles; private Map _provided; private Map _required; + private Map _propertyObjects; /** * Constructs a spring system. @@ -75,6 +77,8 @@ public class SpringComponent extends AbstractComponent { _configFiles = aConfigFiles; _provided = aProvided; _required = aRequired; + _propertyObjects = new HashMap(); + } /** @@ -95,8 +99,12 @@ public class SpringComponent extends AbstractComponent { } } - public Scope start() { - return super.start(new DefaultScope(new ProvidedInterface[0])); + public void addProperties(String aBeanname, Properties aProperties) { + _propertyObjects.put(aBeanname, aProperties); + } + + public Properties getProperties(String aBeanname) { + return _propertyObjects.get(aBeanname); } @Override @@ -105,28 +113,31 @@ public class SpringComponent extends AbstractComponent { SpringComponent old = THIS.get(); Scope oldScope = SCOPE.get(); THIS.set(this); - Scope scope = new DefaultScope(getProvidedInterfaces(), aExternalScope); + Scope scope = new DefaultScope(getProvidedInterfaces().toArray(new ProvidedInterface[0]), aExternalScope); SCOPE.set(scope); try { GenericApplicationContext parentContext = new GenericApplicationContext(); registerRequiredServices(parentContext); + registerPropertyObjects(parentContext); parentContext.refresh(); - + + System.out.println("Parent context " + parentContext); + AbstractApplicationContext context = parseConfigFiles(parentContext); context .addBeanFactoryPostProcessor(new PropertySetter(_properties)); context.refresh(); - exposeProvidedServices(context, scope); + exposeProvidedServices(context, aExternalScope); scope.put(CONTEXT_KEY, context); return scope; } catch (Exception e) { throw new SystemAssemblyException( - "Failed to assemble spring system", e); + "Failed to assemble spring system " + getName(), e); } finally { THIS.set(old); SCOPE.set(oldScope); @@ -144,7 +155,6 @@ public class SpringComponent extends AbstractComponent { } addInterface(_provided.get(name), svc, aScope); System.out.println("addService " + _provided.get(name) + " " + svc); - aScope.publishInterface(_provided.get(name), svc); } } @@ -152,21 +162,37 @@ public class SpringComponent extends AbstractComponent { // Parse spring config files return new ClassPathXmlApplicationContext((String[]) _configFiles, - aParentContext); + false, aParentContext); } private void registerRequiredServices(GenericApplicationContext aParentContext) { // Register required services in a parent context for (RequiredInterface required: getRequiredInterfaces()) { String beanName = _required.get(required); - ConstructorArgumentValues cargs = new ConstructorArgumentValues(); - cargs.addGenericArgumentValue(required.getName()); - BeanDefinition definition = new RootBeanDefinition( - RequiredServiceBean.class, cargs, - new MutablePropertyValues()); - aParentContext.registerBeanDefinition(beanName, definition); + if ( beanName != null && beanName.length() > 0) { + ConstructorArgumentValues cargs = new ConstructorArgumentValues(); + cargs.addGenericArgumentValue(required.getName()); + BeanDefinition definition = new RootBeanDefinition( + RequiredServiceBean.class, cargs, + new MutablePropertyValues()); + aParentContext.registerBeanDefinition(beanName, definition); + } else { + // The required interface is not required by the spring config but by the sub-class directly. + } } } + + private void registerPropertyObjects(GenericApplicationContext aParentContext) { + for (String beanName: _propertyObjects.keySet()) { + ConstructorArgumentValues cargs = new ConstructorArgumentValues(); + cargs.addGenericArgumentValue(PropertySetter.createPropertyFile(_propertyObjects.get(beanName))); + BeanDefinition definition = new RootBeanDefinition( + ConfiguredProperties.class, cargs, + new MutablePropertyValues()); + aParentContext.registerBeanDefinition(beanName, definition); + } + } + @Override protected void doStop(Scope aRuntime) {