- Revision
- 469
- Author
- mward
- Date
- 2007-12-12 07:48:00 -0600 (Wed, 12 Dec 2007)
Log Message
WAFFLE-11 - added support to select injection type (CDI vs SDI)
Modified Paths
- trunk/waffle-core/src/main/java/org/codehaus/waffle/context/pico/PicoLifecycleStrategy.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/AbstractRegistrar.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/Registrar.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/registrar/pico/PicoRegistrar.java
- trunk/waffle-core/src/test/java/org/codehaus/waffle/registrar/pico/PicoRegistrarTest.java
- trunk/waffle.ipr
Added Paths
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:
