package org.wamblee.system.spring;
import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
/**
* Represents a system configured based on spring.
+ * The spring config files that are configured should not contain any PropertyPlaceholderConfigurer
+ * objects.
*
* @author Erik Brakkee
*/
-public class SpringSystem extends AbstractComponent {
+public class SpringComponent extends AbstractComponent {
/**
* Singleton access to the service registry. Required while starting up.
*/
static ThreadLocal<ServiceRegistry> REGISTRY = new ThreadLocal<ServiceRegistry>();
+ private Properties _properties;
private String[] _configFiles;
private Map<String, ProvidedInterfaceDescriptor> _provided;
private Map<RequiredInterfaceDescriptor, String> _required;
private AbstractApplicationContext _context;
/**
- * Construcst a spring system.
+ * Constructs a spring system.
*
* @param aName
* Name of the system.
- * @param aConfigFiles
+ * @param aConfigFil
* Spring config files to read.
* @param aProvided
* Map of bean name to service descriptor describing the bean
* names that the spring config files use for each required
* service.
*/
- public SpringSystem(String aName, ServiceRegistry aRegistry, String[] aConfigFiles,
+ public SpringComponent(String aName, ServiceRegistry aRegistry, String[] aConfigFiles,
Map<String, ProvidedInterfaceDescriptor> aProvided,
Map<RequiredInterfaceDescriptor, String> aRequired) {
super(aName, aRegistry, aProvided.values().toArray(new InterfaceDescriptor[0]),
aRequired.keySet().toArray(new InterfaceDescriptor[0]));
+ _properties = new Properties();
_configFiles = aConfigFiles;
_provided = aProvided;
_required = aRequired;
}
+
+ /**
+ * Must be called to make a property available in the application context.
+ * @param aKey Property key.
+ * @param aValue Property value.
+ */
+ public void setProperty(String aKey, String aValue) {
+ _properties.put(aKey, aValue);
+ }
+
+ public void addProperties(Properties aProperties) {
+ for (Object key: aProperties.keySet()) {
+ setProperty((String)key, aProperties.getProperty((String)key));
+ }
+ }
@Override
protected void doStart(String aContext,
Service[] aRequiredServices) {
- ServiceRegistry old = REGISTRY.get();
+ ServiceRegistry oldRegistry = REGISTRY.get();
try {
- REGISTRY.set(getRegistry());
+ REGISTRY.set(getRegistry());
try {
+ _parentContext = new GenericApplicationContext();
registerRequiredServices(aRequiredServices);
+
+ _parentContext.refresh();
parseConfigFiles();
+
+ _context.addBeanFactoryPostProcessor(new PropertySetter(_properties));
+ _context.refresh();
exposeProvidedServices(aContext);
} catch (Exception e) {
"Failed to assemble spring system", e);
}
} finally {
- REGISTRY.set(old);
+ REGISTRY.set(oldRegistry);
}
}
private void registerRequiredServices(Service[] aRequiredServices) {
// Register required services in a parent context
- // Register the Hibernate mapping files as a bean.
- _parentContext = new GenericApplicationContext();
-
for (Service svc: aRequiredServices) {
String id = svc.getId();
ProvidedInterfaceDescriptor descriptor = svc.getDescriptor();
String beanName = _required.get(required);
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
cargs.addGenericArgumentValue(id);
- BeanDefinition definition = new RootBeanDefinition(ProvidedServiceBean.class, cargs,
+ BeanDefinition definition = new RootBeanDefinition(RequiredServiceBean.class, cargs,
new MutablePropertyValues());
_parentContext.registerBeanDefinition(beanName, definition);
}
}
- _parentContext.refresh();
}
@Override