[picocontainer-scm] [5604] java/2.x/trunk/pico/container/src/java/org/picocontainer: make named method injection optional
paul-yCVjj/[email protected]
| Newsgroups | gmane.comp.java.picocontainer.cvs |
|---|---|
| Message-ID | <[email protected]> |
Revision 5604
Author paul
Date 2010-02-12 14:58:43 -0600 (Fri, 12 Feb 2010)
Log Message
make named method injection optional
Modified Paths
- java/2.x/trunk/pico/container/src/java/org/picocontainer/ComponentAdapter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/CompositeInjector.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjection.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjector.java
- java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedInjectionTestCase.java
- java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedMethodInjectorTestCase.java
Diff
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/ComponentAdapter.java (5603 => 5604)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/ComponentAdapter.java 2010-02-12 20:24:59 UTC (rev 5603)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/ComponentAdapter.java 2010-02-12 20:58:43 UTC (rev 5604)
@@ -105,15 +105,15 @@
* Locates a component adapter of type <em>componentAdapterType</em> in the ComponentAdapter chain. Will return null
* if there is no adapter of the given type.
* @param <U> the type of ComponentAdapter being located.
- * @param componentAdapterType the class of the adapter type being located. Never null.
+ * @param adapterType the class of the adapter type being located. Never null.
* @return the appropriate component adapter of type <em>U</em>. May return null if the component adapter type is not
* returned.
*/
<U extends ComponentAdapter> U findAdapterOfType(Class<U> adapterType);
/**
- * Get a string key descriptor of the component adapter.
- * @return
+ * Get a string key descriptor of the component adapter for use in toString()
+ * @return the descriptor
*/
String getDescriptor();
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/CompositeInjector.java (5603 => 5604)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/CompositeInjector.java 2010-02-12 20:24:59 UTC (rev 5603)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/CompositeInjector.java 2010-02-12 20:58:43 UTC (rev 5604)
@@ -8,17 +8,15 @@
*****************************************************************************/
package org.picocontainer.injectors;
-import java.lang.reflect.Type;
-
import org.picocontainer.ComponentMonitor;
import org.picocontainer.Injector;
-import org.picocontainer.LifecycleStrategy;
import org.picocontainer.Parameter;
import org.picocontainer.PicoCompositionException;
import org.picocontainer.PicoContainer;
import org.picocontainer.PicoVisitor;
-import org.picocontainer.ComponentAdapter;
+import java.lang.reflect.Type;
+
@SuppressWarnings("serial")
public class CompositeInjector<T> extends AbstractInjector<T> {
@@ -39,10 +37,9 @@
@Override
public T getComponentInstance(PicoContainer container, Type into) throws PicoCompositionException {
T instance = null;
- for (int i = 0; i < injectors.length; i++) {
- Injector<T> injector = injectors[i];
+ for (Injector<T> injector : injectors) {
if (instance == null) {
- instance = injector.getComponentInstance(container, ComponentAdapter.NOTHING.class);
+ instance = injector.getComponentInstance(container, NOTHING.class);
} else {
injector.decorateComponentInstance(container, into, instance);
}
@@ -57,24 +54,24 @@
@Override
public Object decorateComponentInstance(PicoContainer container, Type into, T instance) {
Object result = null;
- for (int i = 0; i < injectors.length; i++) {
- result = injectors[i].decorateComponentInstance(container, into, instance);
+ for (Injector<T> injector : injectors) {
+ result = injector.decorateComponentInstance(container, into, instance);
}
return result;
}
@Override
public void verify(PicoContainer container) throws PicoCompositionException {
- for (int i = 0; i < injectors.length; i++) {
- injectors[i].verify(container);
+ for (Injector<T> injector : injectors) {
+ injector.verify(container);
}
}
@Override
public final void accept(PicoVisitor visitor) {
super.accept(visitor);
- for (int i = 0; i < injectors.length; i++) {
- injectors[i].accept(visitor);
+ for (Injector<T> injector : injectors) {
+ injector.accept(visitor);
}
}
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjection.java (5603 => 5604)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjection.java 2010-02-12 20:24:59 UTC (rev 5603)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjection.java 2010-02-12 20:58:43 UTC (rev 5604)
@@ -10,17 +10,27 @@
public class NamedMethodInjection extends AbstractInjectionFactory {
- private final String prefix;
+ private final String prefix;
+ private final boolean optional;
public NamedMethodInjection(String setterMethodPrefix) {
- this.prefix = setterMethodPrefix;
+ this(setterMethodPrefix, true);
}
public NamedMethodInjection() {
this("set");
}
+ public NamedMethodInjection(boolean optional) {
+ this("set", optional);
+ }
+
+ public NamedMethodInjection(String setterMethodPrefix, boolean optional) {
+ this.prefix = setterMethodPrefix;
+ this.optional = optional;
+ }
+
public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor monitor, LifecycleStrategy lifecycleStrategy, Properties componentProperties, Object componentKey, Class<T> componentImplementation, Parameter... parameters) throws PicoCompositionException {
- return wrapLifeCycle(monitor.newInjector(new NamedMethodInjector(componentKey, componentImplementation, parameters, monitor, prefix)), lifecycleStrategy);
+ return wrapLifeCycle(monitor.newInjector(new NamedMethodInjector(componentKey, componentImplementation, parameters, monitor, prefix, optional)), lifecycleStrategy);
}
}
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjector.java (5603 => 5604)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjector.java 2010-02-12 20:24:59 UTC (rev 5603)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjector.java 2010-02-12 20:58:43 UTC (rev 5604)
@@ -12,19 +12,31 @@
import org.picocontainer.ComponentMonitor;
import org.picocontainer.NameBinding;
import org.picocontainer.Parameter;
+import org.picocontainer.PicoContainer;
import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.Set;
@SuppressWarnings("serial")
public class NamedMethodInjector<T> extends SetterInjector<T> {
+ private final boolean optional;
+
public NamedMethodInjector(Object key,
Class<?> impl,
Parameter[] parameters,
+ ComponentMonitor monitor,
+ boolean optional) {
+ this(key, impl, parameters, monitor, "set", optional);
+ }
+
+ public NamedMethodInjector(Object key,
+ Class<?> impl,
+ Parameter[] parameters,
ComponentMonitor monitor) {
- this(key, impl, parameters, monitor, "set");
+ this(key, impl, parameters, monitor, "set", true);
}
public NamedMethodInjector(Object key,
@@ -32,7 +44,17 @@
Parameter[] parameters,
ComponentMonitor monitor,
String prefix) {
+ this(key, impl, parameters, monitor, prefix, true);
+ }
+
+ public NamedMethodInjector(Object key,
+ Class<?> impl,
+ Parameter[] parameters,
+ ComponentMonitor monitor,
+ String prefix,
+ boolean optional) {
super(key, impl, parameters, monitor, prefix, true);
+ this.optional = optional;
}
@Override
@@ -40,11 +62,18 @@
return new NameBinding() {
public String getName() {
String name = ((Method)member).getName().substring(prefix.length()); // string off 'set' or chosen prefix
- return name.substring(0,1).toLowerCase() + name.substring(1);
+ return name.substring(0,1).toLowerCase() + name.substring(1); // change "SomeThing" to "someThing"
}
};
}
+ @Override
+ protected void unsatisfiedDependencies(PicoContainer container, Set<Type> unsatisfiableDependencyTypes) {
+ if (!optional) {
+ super.unsatisfiedDependencies(container, unsatisfiableDependencyTypes);
+ }
+ }
+
public String toString() {
return "NamedMethodInjection-" + super.toString();
}
Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedInjectionTestCase.java (5603 => 5604)
--- java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedInjectionTestCase.java 2010-02-12 20:24:59 UTC (rev 5603)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedInjectionTestCase.java 2010-02-12 20:58:43 UTC (rev 5604)
@@ -8,31 +8,20 @@
*****************************************************************************/
package org.picocontainer.injectors;
-import org.junit.Before;
import org.junit.Test;
-import org.picocontainer.ComponentFactory;
import org.picocontainer.DefaultPicoContainer;
import org.picocontainer.containers.EmptyPicoContainer;
import org.picocontainer.lifecycle.NullLifecycleStrategy;
-import org.picocontainer.tck.AbstractComponentFactoryTest;
+import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* @author Paul Hammant
*/
-public class NamedInjectionTestCase extends AbstractComponentFactoryTest {
+public class NamedInjectionTestCase {
- @Before
- public void setUp() throws Exception {
- picoContainer = new DefaultPicoContainer(createComponentFactory(), new NullLifecycleStrategy(), new EmptyPicoContainer());
- }
-
- protected ComponentFactory createComponentFactory() {
- return new NamedMethodInjection();
- }
-
public static class Bean {
private String something;
@@ -41,10 +30,20 @@
}
}
- @Test public void testContainerMakesNamedMethodInjector() {
+ @Test
+ public void containerShouldMakeUsableNamedMethodInjector() {
+ DefaultPicoContainer picoContainer = new DefaultPicoContainer(new NamedMethodInjection(), new NullLifecycleStrategy(), new EmptyPicoContainer());
picoContainer.addComponent(Bean.class);
picoContainer.addConfig("something", "hello there");
assertTrue(picoContainer.getComponentAdapter(Bean.class) instanceof NamedMethodInjector);
assertEquals("hello there", picoContainer.getComponent(Bean.class).something);
}
+
+ @Test
+ public void containerShouldMakeNamedMethodInjectorThatIsOptionalInUse() {
+ DefaultPicoContainer picoContainer = new DefaultPicoContainer(new NamedMethodInjection(true), new NullLifecycleStrategy(), new EmptyPicoContainer());
+ picoContainer.addComponent(Bean.class);
+ assertTrue(picoContainer.getComponentAdapter(Bean.class) instanceof NamedMethodInjector);
+ assertNull(picoContainer.getComponent(Bean.class).something);
+ }
}
\ No newline at end of file
Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedMethodInjectorTestCase.java (5603 => 5604)
--- java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedMethodInjectorTestCase.java 2010-02-12 20:24:59 UTC (rev 5603)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedMethodInjectorTestCase.java 2010-02-12 20:58:43 UTC (rev 5604)
@@ -6,6 +6,7 @@
import org.picocontainer.monitors.NullComponentMonitor;
import static com.sun.tools.internal.ws.wsdl.parser.Util.fail;
+import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -19,10 +20,10 @@
}
@Test
- public void shouldMatchBasedOnMethodNameIfComponentAvailable() {
+ public void shouldMatchBasedOnMethodNameIfComponentAvailableAndNonOptional() {
final String expected = "use this one pico, its key matched the method name (ish)";
NamedMethodInjector nmi = new NamedMethodInjector(Windmill.class, Windmill.class, Parameter.DEFAULT,
- new NullComponentMonitor());
+ new NullComponentMonitor(), false);
Windmill windmill = new DefaultPicoContainer()
.addAdapter(nmi)
.addConfig("attemptToConfusePicoContainer", "ha ha, confused you")
@@ -51,9 +52,9 @@
}
@Test
- public void shouldBeUnsatisfiedIfNoComponentAvailableOfTheRightType() {
+ public void shouldBeUnsatisfiedIfNoComponentAvailableOfTheRightTypeAndNonOptional() {
NamedMethodInjector nmi = new NamedMethodInjector(Windmill.class, Windmill.class, Parameter.DEFAULT,
- new NullComponentMonitor());
+ new NullComponentMonitor(), false);
try {
new DefaultPicoContainer()
.addAdapter(nmi)
@@ -67,9 +68,9 @@
}
@Test
- public void withoutNameMatchWillBeOKTooIfOnlyOneOfRightType() {
+ public void withoutNameMatchWillBeOKTooIfOnlyOneOfRightTypeAndNonOptional() {
NamedMethodInjector nmi = new NamedMethodInjector(Windmill.class, Windmill.class, Parameter.DEFAULT,
- new NullComponentMonitor());
+ new NullComponentMonitor(), false);
Windmill windmill = new DefaultPicoContainer()
.addAdapter(nmi)
.addConfig("anything", "hello")
@@ -79,4 +80,15 @@
assertEquals("hello", windmill.wind);
}
+ @Test
+ public void withoutNameMatchWillBeOKTooIfNoneOfRightTypeAndOptional() {
+ NamedMethodInjector nmi = new NamedMethodInjector(Windmill.class, Windmill.class, Parameter.DEFAULT,
+ new NullComponentMonitor(), true);
+ Windmill windmill = new DefaultPicoContainer()
+ .addAdapter(nmi)
+ .getComponent(Windmill.class);
+ assertNotNull(windmill);
+ assertNull(windmill.wind);
+ }
+
}
----------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email