Also fixed several bugs in SpringComponent.
* @param aProps Properties.
*/
public PropertySetter(Properties aProps) {
* @param aProps Properties.
*/
public PropertySetter(Properties aProps) {
- StringBuffer buf = new StringBuffer();
+ String propFile = createPropertyFile(aProps);
+ setLocation(new StringResource(propFile));
+ }
+
+ private static String createPropertyFile(Properties aProps) {
+ StringBuffer buf = new StringBuffer();
for (Object key: aProps.keySet()) {
buf.append(key);
buf.append("=");
buf.append(aProps.get(key));
buf.append("\n");
for (Object key: aProps.keySet()) {
buf.append(key);
buf.append("=");
buf.append(aProps.get(key));
buf.append("\n");
- }
- setLocation(new StringResource(buf.toString()));
- }
+ }
+ return buf.toString();
+ }
setProperty((String) key, aProperties.getProperty((String) key));
}
}
setProperty((String) key, aProperties.getProperty((String) key));
}
}
-
- public Scope start() {
- return super.start(new DefaultScope(new ProvidedInterface[0]));
- }
@Override
protected Scope doStart(Scope aExternalScope) {
@Override
protected Scope doStart(Scope aExternalScope) {
registerRequiredServices(parentContext);
parentContext.refresh();
registerRequiredServices(parentContext);
parentContext.refresh();
+
+ System.out.println("Parent context " + parentContext);
+
AbstractApplicationContext context = parseConfigFiles(parentContext);
context
.addBeanFactoryPostProcessor(new PropertySetter(_properties));
context.refresh();
AbstractApplicationContext context = parseConfigFiles(parentContext);
context
.addBeanFactoryPostProcessor(new PropertySetter(_properties));
context.refresh();
- exposeProvidedServices(context, scope);
+ exposeProvidedServices(context, aExternalScope);
scope.put(CONTEXT_KEY, context);
return scope;
scope.put(CONTEXT_KEY, context);
return scope;
}
addInterface(_provided.get(name), svc, aScope);
System.out.println("addService " + _provided.get(name) + " " + svc);
}
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,
// Parse spring config files
return new ClassPathXmlApplicationContext((String[]) _configFiles,
+ false, aParentContext);
}
private void registerRequiredServices(GenericApplicationContext aParentContext) {
}
private void registerRequiredServices(GenericApplicationContext aParentContext) {
- public HelloService(String aMsg) {
+ public HelloService(String aMsg) {
+ SpringComponentTest.EVENT_TRACKER.eventOccurred(aMsg);
import org.wamblee.system.core.RequiredInterface;
import org.wamblee.system.core.Scope;
import org.wamblee.system.core.SystemAssemblyException;
import org.wamblee.system.core.RequiredInterface;
import org.wamblee.system.core.Scope;
import org.wamblee.system.core.SystemAssemblyException;
+import org.wamblee.test.EventTracker;
public class SpringComponentTest extends TestCase {
public class SpringComponentTest extends TestCase {
private static final String HELLO_SERVICE_SPRING_WITH_REQS_XML = "test.org.wamblee.system.springWithRequirements.xml";
private static final String HELLO_SERVICE_SPRING_WITH_PROPERTIES_XML = "test.org.wamblee.system.springWithProperties.xml";
private static final String PROPERTY_FILE = "test.org.wamblee.system.spring.properties";
private static final String HELLO_SERVICE_SPRING_WITH_REQS_XML = "test.org.wamblee.system.springWithRequirements.xml";
private static final String HELLO_SERVICE_SPRING_WITH_PROPERTIES_XML = "test.org.wamblee.system.springWithProperties.xml";
private static final String PROPERTY_FILE = "test.org.wamblee.system.spring.properties";
+
+ public static EventTracker<String> EVENT_TRACKER;
+
+ private Scope _externalScope;
@Override
protected void setUp() throws Exception {
super.setUp();
@Override
protected void setUp() throws Exception {
super.setUp();
+ EVENT_TRACKER = new EventTracker<String>();
+ _externalScope = new DefaultScope(new ProvidedInterface[0]);
}
public void testBlackboxSystem() {
}
public void testBlackboxSystem() {
new String[] { HELLO_SERVICE_SPRING_XML },
new HashMap<String, ProvidedInterface>(),
new HashMap<RequiredInterface, String>());
new String[] { HELLO_SERVICE_SPRING_XML },
new HashMap<String, ProvidedInterface>(),
new HashMap<RequiredInterface, String>());
- Scope runtime = system.start();
- assertEquals(0, runtime.getProvidedInterfaces().length);
+
+ Scope runtime = system.start(_externalScope);
+ assertEquals(0, _externalScope.getProvidedInterfaces().length);
SpringComponent system = new SpringComponent("system",
new String[] { HELLO_SERVICE_SPRING_XML }, provided,
new HashMap<RequiredInterface, String>());
SpringComponent system = new SpringComponent("system",
new String[] { HELLO_SERVICE_SPRING_XML }, provided,
new HashMap<RequiredInterface, String>());
- Scope runtime = system.start();
+ Scope runtime = system.start(_externalScope);
ProvidedInterface[] services = runtime.getProvidedInterfaces();
ProvidedInterface[] services = runtime.getProvidedInterfaces();
assertEquals(1, services.length);
Object service = runtime.getInterfaceImplementation(services[0], Object.class);
assertTrue(service instanceof HelloService);
assertEquals(1, services.length);
Object service = runtime.getInterfaceImplementation(services[0], Object.class);
assertTrue(service instanceof HelloService);
+
+ // BUG; Provided services should be made available in the external scope.
+ Object service2 = _externalScope.getInterfaceImplementation(provided.get("helloService"), Object.class);
+ assertSame(service, service2);
+
assertEquals("Hello world!", ((HelloService) service).say());
system.stop(runtime);
}
assertEquals("Hello world!", ((HelloService) service).say());
system.stop(runtime);
}
props.load(new ClassPathResource(PROPERTY_FILE).getInputStream());
system.addProperties(props);
props.load(new ClassPathResource(PROPERTY_FILE).getInputStream());
system.addProperties(props);
- Scope scope = system.start();
+ Scope scope = system.start(_externalScope);
+ // BUG: Hello service was constructed multiple times. Once with the unprocessed property
+ // and another time with the processed property.
+ assertEquals(1, EVENT_TRACKER.getEventCount());
ProvidedInterface[] services = scope.getProvidedInterfaces();
assertEquals("Property Value", scope.getInterfaceImplementation(services[0], HelloService.class).say());
}
ProvidedInterface[] services = scope.getProvidedInterfaces();
assertEquals("Property Value", scope.getInterfaceImplementation(services[0], HelloService.class).say());
}
new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML },
new HashMap<String, ProvidedInterface>(),
new HashMap<RequiredInterface, String>());
new String[] { HELLO_SERVICE_SPRING_WITH_REQS_XML },
new HashMap<String, ProvidedInterface>(),
new HashMap<RequiredInterface, String>());
+ system.start(_externalScope);
} catch (SystemAssemblyException e) {
// e.printStackTrace();
return;
} catch (SystemAssemblyException e) {
// e.printStackTrace();
return;