*/
package org.wamblee.system.spring;
+import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
private String[] _configFiles;
private Map<String, ProvidedInterface> _provided;
private Map<RequiredInterface, String> _required;
+ private Map<String, Properties> _propertyObjects;
/**
* Constructs a spring system.
_configFiles = aConfigFiles;
_provided = aProvided;
_required = aRequired;
+ _propertyObjects = new HashMap<String, Properties>();
+
}
/**
}
}
- 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
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);
}
addInterface(_provided.get(name), svc, aScope);
System.out.println("addService " + _provided.get(name) + " " + svc);
- aScope.publishInterface(_provided.get(name), svc);
}
}
// 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) {