Title: [waffle-scm] [469] trunk: WAFFLE-11 - added support to select injection type (CDI vs SDI)

Diff

Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/context/pico/PicoLifecycleStrategy.java (468 => 469)

--- trunk/waffle-core/src/main/java/org/codehaus/waffle/context/pico/PicoLifecycleStrategy.java	2007-12-11 23:53:08 UTC (rev 468)
+++ trunk/waffle-core/src/main/java/org/codehaus/waffle/context/pico/PicoLifecycleStrategy.java	2007-12-12 13:48:00 UTC (rev 469)
@@ -32,6 +32,7 @@
         super(monitor);
     }
 
+    @Override
     public void start(Object component) {
         if (component != null && component instanceof Startable) {
             long str = System.currentTimeMillis();
@@ -47,6 +48,7 @@
         }
     }
 
+    @Override
     public void stop(Object component) {
         if (component != null && component instanceof Startable) {
             long str = System.currentTimeMillis();
@@ -62,6 +64,7 @@
         }
     }
 
+    @Override
     public boolean hasLifecycle(Class type) {
         return Startable.class.isAssignableFrom(type) || super.hasLifecycle(type);
     }

Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/AbstractRegistrar.java (468 => 469)

--- trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/AbstractRegistrar.java	2007-12-11 23:53:08 UTC (rev 468)
+++ trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/AbstractRegistrar.java	2007-12-12 13:48:00 UTC (rev 469)
@@ -23,32 +23,43 @@
         this.delegate = delegate;
     }
 
+    public Registrar setInjectionType(InjectionType injectionType) {
+        delegate.setInjectionType(injectionType);
+        return this;
+    }
+
     public boolean isRegistered(Object typeOrInstance){
         return delegate.isRegistered(typeOrInstance);
     }
     
-    public void register(Class<?> type, Object... parameters) {
+    public Registrar register(Class<?> type, Object... parameters) {
         delegate.register(type, parameters);
+        return this;
     }
 
-    public void register(Object key, Class<?> type, Object... parameters) {
+    public Registrar register(Object key, Class<?> type, Object... parameters) {
         delegate.register(key, type, parameters);
+        return this;
     }
 
-    public void registerInstance(Object instance) {
+    public Registrar registerInstance(Object instance) {
         delegate.registerInstance(instance);
+        return this;
     }
 
-    public void registerInstance(Object key, Object instance) {
+    public Registrar registerInstance(Object key, Object instance) {
         delegate.registerInstance(key, instance);
+        return this;
     }
 
-    public void registerNonCaching(Class<?> type, Object... parameters) {
+    public Registrar registerNonCaching(Class<?> type, Object... parameters) {
         delegate.registerNonCaching(type, parameters);
+        return this;
     }
 
-    public void registerNonCaching(Object key, Class<?> type, Object... parameters) {
+    public Registrar registerNonCaching(Object key, Class<?> type, Object... parameters) {
         delegate.registerNonCaching(key, type, parameters);
+        return this;
     }
 
     public void application() {

Added: trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/InjectionType.java (0 => 469)

--- trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/InjectionType.java	                        (rev 0)
+++ trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/InjectionType.java	2007-12-12 13:48:00 UTC (rev 469)
@@ -0,0 +1,6 @@
+package org.codehaus.waffle.registrar;
+
+public enum InjectionType {
+    CONSTRUCTOR, // default
+    SETTER
+}

Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/Registrar.java (468 => 469)

--- trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/Registrar.java	2007-12-11 23:53:08 UTC (rev 468)
+++ trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/Registrar.java	2007-12-12 13:48:00 UTC (rev 469)
@@ -18,28 +18,30 @@
  */
 public interface Registrar {
 
+    Registrar setInjectionType(InjectionType injectionType);
+
     boolean isRegistered(Object typeOrInstance);
 
     /**
      * @param type represent both the key and type the object will be registered under
      * @param parameters any parameters needed to satisfy the component being registered
      */
-    void register(Class<?> type, Object... parameters);
+    Registrar register(Class<?> type, Object... parameters);
 
     /**
      * @param key represent the key the object will be registered under
      * @param type represent the component type
      * @param parameters any parameters needed to satisfy the component being registered
      */
-    void register(Object key, Class<?> type, Object... parameters);
+    Registrar register(Object key, Class<?> type, Object... parameters);
 
-    void registerInstance(Object instance);
+    Registrar registerInstance(Object instance);
 
-    void registerInstance(Object key, Object instance);
+    Registrar registerInstance(Object key, Object instance);
 
-    void registerNonCaching(Class<?> type, Object... parameters);
+    Registrar registerNonCaching(Class<?> type, Object... parameters);
 
-    void registerNonCaching(Object key, Class<?> type, Object... parameters);
+    Registrar registerNonCaching(Object key, Class<?> type, Object... parameters);
 
     void application();
 

Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/pico/PicoRegistrar.java (468 => 469)

--- trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/pico/PicoRegistrar.java	2007-12-11 23:53:08 UTC (rev 468)
+++ trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/pico/PicoRegistrar.java	2007-12-12 13:48:00 UTC (rev 469)
@@ -10,7 +10,9 @@
  *****************************************************************************/
 package org.codehaus.waffle.registrar.pico;
 
+import org.codehaus.waffle.context.pico.PicoLifecycleStrategy;
 import org.codehaus.waffle.monitor.RegistrarMonitor;
+import org.codehaus.waffle.registrar.InjectionType;
 import org.codehaus.waffle.registrar.Registrar;
 import org.codehaus.waffle.registrar.RubyAwareRegistrar;
 import org.picocontainer.ComponentAdapter;
@@ -18,7 +20,9 @@
 import org.picocontainer.Parameter;
 import org.picocontainer.defaults.CachingComponentAdapter;
 import org.picocontainer.defaults.ConstantParameter;
-import org.picocontainer.defaults.ConstructorInjectionComponentAdapter;
+import org.picocontainer.defaults.ConstructorInjectionComponentAdapterFactory;
+import org.picocontainer.defaults.SetterInjectionComponentAdapterFactory;
+import org.picocontainer.monitors.NullComponentMonitor;
 
 /**
  * This Registrar is backed by PicoContainer for managing Dependency Injection.  This registrar
@@ -30,57 +34,64 @@
 public class PicoRegistrar implements Registrar, RubyAwareRegistrar {
     private final MutablePicoContainer picoContainer;
     private final RegistrarMonitor registrarMonitor;
+    private InjectionType injectionType = InjectionType.CONSTRUCTOR;
 
     public PicoRegistrar(MutablePicoContainer picoContainer, RegistrarMonitor registrarMonitor) {
         this.picoContainer = picoContainer;
         this.registrarMonitor = registrarMonitor;
     }
 
+    public Registrar setInjectionType(InjectionType injectionType) {
+        this.injectionType = injectionType;
+        return this;
+    }
+
     public boolean isRegistered(Object typeOrInstance) {
-        if ( typeOrInstance instanceof Class ){
-            Class<?> type = (Class<?>)typeOrInstance;
+        if (typeOrInstance instanceof Class) {
+            Class<?> type = (Class<?>) typeOrInstance;
             return picoContainer.getComponentInstancesOfType(type).size() > 0;
         }
         return picoContainer.getComponentInstance(typeOrInstance) != null;
     }
 
-    public void register(Class<?> type, Object ... parameters) {
+    public Registrar register(Class<?> type, Object... parameters) {
         this.register(type, type, parameters);
+        return this;
     }
 
-    public void register(Object key, Class<?> type, Object ... parameters) {
-        if (parameters.length == 0) {
-            picoContainer.registerComponentImplementation(key, type);
-        } else {
-            picoContainer.registerComponentImplementation(key, type, picoParameters(parameters));
-        }
+    public Registrar register(Object key, Class<?> type, Object... parameters) {
+        ComponentAdapter componentAdapter = buildComponentAdapter(key, type, parameters);
+        CachingComponentAdapter cachingComponentAdapter = new CachingComponentAdapter(componentAdapter);
+        this.registerComponentAdapter(cachingComponentAdapter);
+
         registrarMonitor.componentRegistered(key, type, parameters);
+
+        return this;
     }
 
-    public void registerInstance(Object instance) {
+    public Registrar registerInstance(Object instance) {
         this.registerInstance(instance, instance);
+        return this;
     }
 
-    public void registerInstance(Object key, Object instance) {
+    public Registrar registerInstance(Object key, Object instance) {
         picoContainer.registerComponentInstance(key, instance);
         registrarMonitor.instanceRegistered(key, instance);
+
+        return this;
     }
 
-    public void registerNonCaching(Class<?> type, Object ... parameters) {
+    public Registrar registerNonCaching(Class<?> type, Object... parameters) {
         this.registerNonCaching(type, type, parameters);
+        return this;
     }
 
-    public void registerNonCaching(Object key, Class<?> type, Object ... parameters) {
-        ConstructorInjectionComponentAdapter componentAdapter;
+    public Registrar registerNonCaching(Object key, Class<?> type, Object... parameters) {
+        ComponentAdapter componentAdapter = buildComponentAdapter(key, type, parameters);
 
-        if (parameters.length == 0) {
-            componentAdapter = new ConstructorInjectionComponentAdapter(key, type);
-        } else {
-            componentAdapter = new ConstructorInjectionComponentAdapter(key, type, picoParameters(parameters));
-        }
-
         picoContainer.registerComponent(componentAdapter);
         registrarMonitor.nonCachingComponentRegistered(key, type, parameters);
+        return this;
     }
 
     public void registerRubyScript(String key, String className) {
@@ -88,7 +99,7 @@
         CachingComponentAdapter cachingComponentAdapter = new CachingComponentAdapter(componentAdapter);
         this.registerComponentAdapter(cachingComponentAdapter);
     }
-    
+
     public void registerComponentAdapter(ComponentAdapter componentAdapter) {
         picoContainer.registerComponent(componentAdapter);
     }
@@ -97,10 +108,36 @@
         Parameter[] picoParameters = new Parameter[parameters.length];
         for (int i = 0; i < parameters.length; i++) {
             picoParameters[i] = new ConstantParameter(parameters[i]);
-        }        
+        }
         return picoParameters;
     }
 
+    // TODO PicoLifecycleStrategy should not need to be instantiated each time ... should be passed into this instance?
+    private ComponentAdapter buildComponentAdapter(Object key, Class<?> type, Object... parameters) {
+        if (injectionType == InjectionType.CONSTRUCTOR) {
+            ConstructorInjectionComponentAdapterFactory factory
+                    = new ConstructorInjectionComponentAdapterFactory(false, new PicoLifecycleStrategy(new NullComponentMonitor()));
+
+            if (parameters.length == 0) {
+                return factory.createComponentAdapter(key, type, null);
+            } else {
+                return factory.createComponentAdapter(key, type, picoParameters(parameters));
+            }
+        }
+
+        // handle Setter Injection...
+        SetterInjectionComponentAdapterFactory factory
+                = new SetterInjectionComponentAdapterFactory(false, new PicoLifecycleStrategy(new NullComponentMonitor()));
+
+        if (parameters.length == 0) {
+            return factory.createComponentAdapter(key, type, null);
+        } else {
+            return factory.createComponentAdapter(key, type, picoParameters(parameters));
+
+        }
+
+    }
+
     public void application() {
         // does nothing!
     }

Modified: trunk/waffle-core/src/test/java/org/codehaus/waffle/registrar/pico/PicoRegistrarTest.java (468 => 469)

--- trunk/waffle-core/src/test/java/org/codehaus/waffle/registrar/pico/PicoRegistrarTest.java	2007-12-11 23:53:08 UTC (rev 468)
+++ trunk/waffle-core/src/test/java/org/codehaus/waffle/registrar/pico/PicoRegistrarTest.java	2007-12-12 13:48:00 UTC (rev 469)
@@ -10,17 +10,20 @@
  *****************************************************************************/
 package org.codehaus.waffle.registrar.pico;
 
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
 import org.codehaus.waffle.monitor.RegistrarMonitor;
 import org.codehaus.waffle.monitor.SilentMonitor;
+import static org.codehaus.waffle.registrar.InjectionType.SETTER;
 import org.codehaus.waffle.registrar.Registrar;
+import org.codehaus.waffle.testmodel.ConstructorInjectionComponent;
+import org.codehaus.waffle.testmodel.FakeBean;
 import org.codehaus.waffle.testmodel.FakeController;
+import org.codehaus.waffle.testmodel.SetterInjectionComponent;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.integration.junit4.JMock;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.picocontainer.MutablePicoContainer;
@@ -28,19 +31,18 @@
 import org.picocontainer.defaults.DefaultPicoContainer;
 
 /**
- * 
  * @author Mauro Talevi
  */
 @RunWith(JMock.class)
 public class PicoRegistrarTest {
 
     private Mockery mockery = new Mockery();
-    
+
     @Test
     public void canRegisterComponent() {
 
         MutablePicoContainer pico = new DefaultPicoContainer();
-        
+
         // Mock RegistrarMonitor
         final RegistrarMonitor registrarMonitor = mockery.mock(RegistrarMonitor.class);
         final Class<?> type = FakeController.class;
@@ -48,10 +50,10 @@
             {
                 one(registrarMonitor).componentRegistered(type, type, new Object[]{});
             }
-        });        
-        
-        Registrar registrar = new PicoRegistrar(pico, registrarMonitor);
-        registrar.register(type);
+        });
+
+        Registrar registrar = new PicoRegistrar(pico, registrarMonitor)
+                .register(type);
         assertTrue(registrar.isRegistered(type));
 
         FakeController controllerOne = (FakeController) pico.getComponentInstance(FakeController.class);
@@ -71,12 +73,12 @@
             {
                 one(registrarMonitor).componentRegistered(key, type, new Object[]{});
             }
-        });        
+        });
 
         Registrar registrar = new PicoRegistrar(pico, registrarMonitor);
         registrar.register(key, type);
         assertTrue(registrar.isRegistered(type));
-        
+
         FakeController controllerOne = (FakeController) pico.getComponentInstance(key);
         FakeController controllerTwo = (FakeController) pico.getComponentInstance(key);
 
@@ -86,7 +88,6 @@
 
     @Test
     public void canRegisterInstance() {
-
         MutablePicoContainer pico = new DefaultPicoContainer();
         // Mock RegistrarMonitor
         final RegistrarMonitor registrarMonitor = mockery.mock(RegistrarMonitor.class);
@@ -95,12 +96,12 @@
             {
                 one(registrarMonitor).instanceRegistered(fakeController, fakeController);
             }
-        });   
-        
+        });
+
         Registrar registrar = new PicoRegistrar(pico, registrarMonitor);
         registrar.registerInstance(fakeController);
         assertTrue(registrar.isRegistered(fakeController));
-        
+
         assertSame(fakeController, pico.getComponentInstanceOfType(FakeController.class));
     }
 
@@ -115,16 +116,16 @@
             {
                 one(registrarMonitor).instanceRegistered(key, fakeController);
             }
-        });   
-        
+        });
+
         Registrar registrar = new PicoRegistrar(pico, registrarMonitor);
         registrar.registerInstance(key, fakeController);
         assertTrue(registrar.isRegistered(key));
-        
+
         assertSame(fakeController, pico.getComponentInstance("foobar"));
         assertSame(fakeController, pico.getComponentInstanceOfType(FakeController.class));
     }
-     
+
     @Test
     public void canRegisterNonCachingComponent() {
         MutablePicoContainer pico = new DefaultPicoContainer();
@@ -135,12 +136,12 @@
             {
                 one(registrarMonitor).nonCachingComponentRegistered(type, type, new Object[]{});
             }
-        });        
+        });
 
         Registrar registrar = new PicoRegistrar(pico, registrarMonitor);
         registrar.registerNonCaching(type);
         assertTrue(registrar.isRegistered(type));
-        
+
         FakeController controllerOne = (FakeController) pico.getComponentInstance(FakeController.class);
         FakeController controllerTwo = (FakeController) pico.getComponentInstance(FakeController.class);
 
@@ -158,12 +159,12 @@
             {
                 one(registrarMonitor).nonCachingComponentRegistered(key, type, new Object[]{});
             }
-        });        
+        });
 
         Registrar registrar = new PicoRegistrar(pico, registrarMonitor);
         registrar.registerNonCaching(key, type);
         assertTrue(registrar.isRegistered(type));
-        
+
         FakeController controllerOne = (FakeController) pico.getComponentInstance("foobar");
         FakeController controllerTwo = (FakeController) pico.getComponentInstance("foobar");
 
@@ -173,7 +174,7 @@
     @Test
     public void canRegisterComponentAdapter() {
         MutablePicoContainer pico = new DefaultPicoContainer();
-        
+
         ConstructorInjectionComponentAdapter componentAdapter
                 = new ConstructorInjectionComponentAdapter("a", FakeController.class);
 
@@ -185,4 +186,23 @@
 
         assertNotSame(controllerOne, controllerTwo);
     }
+
+    @Test
+    public void canSwitchInstantiationType() {
+        FakeBean fakeBean = new FakeBean();
+        MutablePicoContainer pico = new DefaultPicoContainer();
+        PicoRegistrar picoRegistrar = new PicoRegistrar(pico, new SilentMonitor());
+
+        picoRegistrar.registerInstance(fakeBean)
+                .register(ConstructorInjectionComponent.class)
+                .setInjectionType(SETTER)
+                .register(SetterInjectionComponent.class);
+
+        ConstructorInjectionComponent cia = (ConstructorInjectionComponent) pico.getComponentInstance(ConstructorInjectionComponent.class);
+        SetterInjectionComponent sia = (SetterInjectionComponent) pico.getComponentInstance(SetterInjectionComponent.class);
+
+        // ensure both constructed correctly
+        assertSame(fakeBean, cia.getFakeBean());
+        assertSame(fakeBean, sia.getFakeBean());
+    }
 }

Added: trunk/waffle-core/src/test/java/org/codehaus/waffle/testmodel/ConstructorInjectionComponent.java (0 => 469)

--- trunk/waffle-core/src/test/java/org/codehaus/waffle/testmodel/ConstructorInjectionComponent.java	                        (rev 0)
+++ trunk/waffle-core/src/test/java/org/codehaus/waffle/testmodel/ConstructorInjectionComponent.java	2007-12-12 13:48:00 UTC (rev 469)
@@ -0,0 +1,13 @@
+package org.codehaus.waffle.testmodel;
+
+public class ConstructorInjectionComponent {
+    private final FakeBean fakeBean;
+
+    public ConstructorInjectionComponent(FakeBean fakeBean) {
+        this.fakeBean = fakeBean;
+    }
+
+    public FakeBean getFakeBean() {
+        return fakeBean;
+    }
+}

Added: trunk/waffle-core/src/test/java/org/codehaus/waffle/testmodel/SetterInjectionComponent.java (0 => 469)

--- trunk/waffle-core/src/test/java/org/codehaus/waffle/testmodel/SetterInjectionComponent.java	                        (rev 0)
+++ trunk/waffle-core/src/test/java/org/codehaus/waffle/testmodel/SetterInjectionComponent.java	2007-12-12 13:48:00 UTC (rev 469)
@@ -0,0 +1,13 @@
+package org.codehaus.waffle.testmodel;
+
+public class SetterInjectionComponent {
+    private FakeBean fakeBean;
+
+    public FakeBean getFakeBean() {
+        return fakeBean;
+    }
+
+    public void setFakeBean(FakeBean fakeBean) {
+        this.fakeBean = fakeBean;
+    }
+}

Modified: trunk/waffle.ipr (468 => 469)

--- trunk/waffle.ipr	2007-12-11 23:53:08 UTC (rev 468)
+++ trunk/waffle.ipr	2007-12-12 13:48:00 UTC (rev 469)
@@ -433,5 +433,8 @@
   <component name="com.intellij.profile.ui.ErrorOptionsConfigurable" proportions="" version="1">
     <option name="myLastEditedConfigurable" />
   </component>
+  <UsedPathMacros>
+    <macro name="M2_REPOSITORY" />
+  </UsedPathMacros>
 </project>
 


To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to