Huge refactoring.
[utils] / system / spring / src / main / java / org / wamblee / system / spring / SpringComponent.java
index 8d50bf280d53b6d09f562519cbecdc20c9526e11..aea9b15aa1a548eacfe9e7c1a39667f684606003 100644 (file)
@@ -26,8 +26,10 @@ import org.springframework.context.support.AbstractApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.context.support.GenericApplicationContext;
 import org.wamblee.system.core.AbstractComponent;
+import org.wamblee.system.core.DefaultScope;
 import org.wamblee.system.core.ProvidedInterface;
 import org.wamblee.system.core.RequiredInterface;
+import org.wamblee.system.core.Scope;
 import org.wamblee.system.core.SystemAssemblyException;
 
 /**
@@ -36,23 +38,17 @@ import org.wamblee.system.core.SystemAssemblyException;
  * 
  * @author Erik Brakkee
  */
-public class SpringComponent extends AbstractComponent {
+public class SpringComponent extends AbstractComponent<Scope> {
+
+       private static final String CONTEXT_KEY = "context";
 
        static final ThreadLocal<SpringComponent> THIS = new ThreadLocal<SpringComponent>();
+       static final ThreadLocal<Scope> SCOPE = new ThreadLocal<Scope>();
 
        private Properties _properties;
        private String[] _configFiles;
        private Map<String, ProvidedInterface> _provided;
        private Map<RequiredInterface, String> _required;
-       /**
-        * Parent application context containing required services.
-        */
-       private GenericApplicationContext _parentContext;
-
-       /**
-        * Application context containing parsed objects.
-        */
-       private AbstractApplicationContext _context;
 
        /**
         * Constructs a spring system.
@@ -98,55 +94,68 @@ public class SpringComponent extends AbstractComponent {
                        setProperty((String) key, aProperties.getProperty((String) key));
                }
        }
+       
+       public Scope start() { 
+               return super.start(new DefaultScope(new ProvidedInterface[0]));
+       }
 
        @Override
-       protected void doStart() {
+       protected Scope doStart(Scope aExternalScope) {
 
                SpringComponent old = THIS.get();
+               Scope oldScope = SCOPE.get();
                THIS.set(this);
+               Scope scope = new DefaultScope(getProvidedInterfaces(), aExternalScope);
+               SCOPE.set(scope);
                try {
-                       _parentContext = new GenericApplicationContext();
+                       GenericApplicationContext parentContext = new GenericApplicationContext();
 
-                       registerRequiredServices();
+                       registerRequiredServices(parentContext);
 
-                       _parentContext.refresh();
+                       parentContext.refresh();
 
-                       parseConfigFiles();
+                       AbstractApplicationContext context = parseConfigFiles(parentContext);
 
-                       _context
+                       context
                                        .addBeanFactoryPostProcessor(new PropertySetter(_properties));
-                       _context.refresh();
+                       context.refresh();
 
-                       exposeProvidedServices();
+                       exposeProvidedServices(context, scope);
+                       
+                       scope.put(CONTEXT_KEY, context);
+                       return scope; 
                } catch (Exception e) {
                        throw new SystemAssemblyException(
                                        "Failed to assemble spring system", e);
                } finally {
                        THIS.set(old);
+                       SCOPE.set(oldScope);
                }
        }
 
-       private void exposeProvidedServices() {
+       private void exposeProvidedServices(AbstractApplicationContext aContext, Scope aScope) {
                // Call addService for each provided service.
 
                for (String name : _provided.keySet()) {
-                       Object svc = _context.getBean(name);
+                       Object svc = aContext.getBean(name);
                        if (svc == null) {
                                throw new IllegalArgumentException(getQualifiedName() + ": service '"
                                                + name + "' is null");
                        }
-                       addInterface(_provided.get(name), svc);
+                       addInterface(_provided.get(name), svc, aScope);
+                       System.out.println("addService " + _provided.get(name) + " " + svc);
+                       aScope.publishInterface(_provided.get(name), svc);
                }
        }
 
-       private void parseConfigFiles() {
+       private AbstractApplicationContext parseConfigFiles(GenericApplicationContext aParentContext) {
                // Parse spring config files
 
-               _context = new ClassPathXmlApplicationContext((String[]) _configFiles,
-                               _parentContext);
+               return new ClassPathXmlApplicationContext((String[]) _configFiles,
+                               aParentContext);
        }
 
-       private void registerRequiredServices() {
+       private void registerRequiredServices(GenericApplicationContext aParentContext) {
                // Register required services in a parent context
                for (RequiredInterface required: getRequiredInterfaces()) { 
                        String beanName = _required.get(required);
@@ -155,15 +164,13 @@ public class SpringComponent extends AbstractComponent {
                        BeanDefinition definition = new RootBeanDefinition(
                                        RequiredServiceBean.class, cargs,
                                        new MutablePropertyValues());
-                       _parentContext.registerBeanDefinition(beanName, definition);
+                       aParentContext.registerBeanDefinition(beanName, definition);
                }
        }
 
        @Override
-       protected void doStop() {
-               _context.close();
-           for (ProvidedInterface provided: getProvidedInterfaces()) { 
-               removeInterface(provided);
-           }
+       protected void doStop(Scope aRuntime) {
+               AbstractApplicationContext context = (AbstractApplicationContext)aRuntime.get(CONTEXT_KEY);
+               context.close();
        }
 }