[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.