[picocontainer-dev] FactoryAdapter patch
Paul Hammant <[email protected]>
| Newsgroups | gmane.comp.java.picocontainer.devel |
|---|---|
| Message-ID | <[email protected]> |
A patch for the things being discussed on the user list.
1) a new ComponentAdapter (FactoryAdapter) attached
2) new method on CA, with its one-arg ancestor being deprecated
T getComponentInstance(PicoContainer container, Class into)
throws PicoCompositionException;
3) a ton of smaller changes to reflect the new method
4) not supplied are the changes to nano/ etc.
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email
factoryadapter.patch
(application/octet-stream, 41.9 KB)
Index: container/src/test/org/picocontainer/tck/AbstractComponentAdapterTest.java
===================================================================
--- container/src/test/org/picocontainer/tck/AbstractComponentAdapterTest.java (revision 4215)
+++ container/src/test/org/picocontainer/tck/AbstractComponentAdapterTest.java (working copy)
@@ -540,7 +540,7 @@
super(delegate);
}
- public Object getComponentInstance(final PicoContainer container) {
+ public Object getComponentInstance(final PicoContainer container, Class into) {
Assert.fail("Not instantiatable");
return null;
}
@@ -558,8 +558,8 @@
this.list = list;
}
- public Object getComponentInstance(final PicoContainer container) {
- final Object result = super.getComponentInstance(container);
+ public Object getComponentInstance(final PicoContainer container, Class into) {
+ final Object result = super.getComponentInstance(container, into);
list.add(result);
return result;
}
@@ -580,13 +580,13 @@
this.reference = reference;
}
- public Object getComponentInstance(final PicoContainer container) {
+ public Object getComponentInstance(final PicoContainer container, Class into) {
if (set.contains(this)) {
reference.set(this);
} else {
set.add(this);
}
- return super.getComponentInstance(container);
+ return super.getComponentInstance(container, into);
}
public String getDescriptor() {
Index: container/src/test/org/picocontainer/behaviors/AdaptingBehaviorTestCase.java
===================================================================
--- container/src/test/org/picocontainer/behaviors/AdaptingBehaviorTestCase.java (revision 4215)
+++ container/src/test/org/picocontainer/behaviors/AdaptingBehaviorTestCase.java (working copy)
@@ -132,7 +132,7 @@
mergeInto(Characteristics.SYNCHRONIZE,cc);
ComponentAdapter ca = abf.createComponentAdapter(new NullComponentMonitor(), new NullLifecycleStrategy(), cc, Map.class, HashMap.class);
assertTrue(ca instanceof Cached);
- Map map = (Map)ca.getComponentInstance(new EmptyPicoContainer());
+ Map map = (Map)ca.getComponentInstance(new EmptyPicoContainer(), null);
assertNotNull(map);
assertTrue(!(map instanceof HashMap));
Index: container/src/test/org/picocontainer/behaviors/CachedTestCase.java
===================================================================
--- container/src/test/org/picocontainer/behaviors/CachedTestCase.java (revision 4215)
+++ container/src/test/org/picocontainer/behaviors/CachedTestCase.java (working copy)
@@ -185,7 +185,7 @@
one(ca).dispose(with(any(Touchable.class)));
}
if (hasLifecycle) {
- one(ca).getComponentInstance(with(any(PicoContainer.class)));
+ one(ca).getComponentInstance(with(any(PicoContainer.class)), with(aNull(Class.class)));
will(returnValue(new SimpleTouchable()));
}
one(ca).getComponentImplementation();
Index: container/src/test/org/picocontainer/behaviors/HiddenImplementationTestCase.java
===================================================================
--- container/src/test/org/picocontainer/behaviors/HiddenImplementationTestCase.java (revision 4215)
+++ container/src/test/org/picocontainer/behaviors/HiddenImplementationTestCase.java (working copy)
@@ -30,7 +30,7 @@
@Test public void testMultipleInterfacesCanBeHidden() {
ComponentAdapter ca = new ConstructorInjector(new Class[]{ActionListener.class, MouseListener.class}, Footle.class, null, new NullComponentMonitor(), new NullLifecycleStrategy(), false);
HiddenImplementation ihca = new HiddenImplementation(ca);
- Object comp = ihca.getComponentInstance(null);
+ Object comp = ihca.getComponentInstance(null, null);
assertNotNull(comp);
assertTrue(comp instanceof ActionListener);
assertTrue(comp instanceof MouseListener);
@@ -40,7 +40,7 @@
ComponentAdapter ca = new ConstructorInjector(new Class[]{String.class}, Footle.class, null, new NullComponentMonitor(), new NullLifecycleStrategy(), false);
HiddenImplementation ihca = new HiddenImplementation(ca);
try {
- ihca.getComponentInstance(null);
+ ihca.getComponentInstance(null, null);
fail("PicoCompositionException expected");
} catch (PicoCompositionException e) {
// expected
Index: container/src/test/org/picocontainer/injectors/AbstractInjectorTestCase.java
===================================================================
--- container/src/test/org/picocontainer/injectors/AbstractInjectorTestCase.java (revision 4215)
+++ container/src/test/org/picocontainer/injectors/AbstractInjectorTestCase.java (working copy)
@@ -149,7 +149,7 @@
public void verify(PicoContainer container) throws PicoCompositionException {
}
- public Object getComponentInstance(PicoContainer container) throws PicoCompositionException {
+ public Object getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
return null;
}
Index: container/src/test/org/picocontainer/adapters/ComponentAdapterTestCase.java
===================================================================
--- container/src/test/org/picocontainer/adapters/ComponentAdapterTestCase.java (revision 4215)
+++ container/src/test/org/picocontainer/adapters/ComponentAdapterTestCase.java (working copy)
@@ -41,9 +41,15 @@
TestAdapter(Object componentKey, Class<T> componentImplementation) {
super(componentKey, componentImplementation);
}
+
public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
return null;
}
+
+
+ public T getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
+ return null;
+ }
public void verify(PicoContainer container) throws PicoVerificationException {
}
@@ -57,9 +63,14 @@
TestMonitoringComponentAdapter(ComponentMonitor componentMonitor) {
super(null, null, componentMonitor);
}
+
public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
return null;
}
+
+ public T getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
+ return null;
+ }
public void verify(PicoContainer container) throws PicoVerificationException {
}
public Object getComponentKey() {
@@ -89,6 +100,10 @@
public void verify(PicoContainer container) throws PicoCompositionException {
}
+ public T getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
+ return null;
+ }
+
public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
return null;
}
Index: container/src/test/org/picocontainer/adapters/SimpleNamedBindingAnnotationTestCase.java
===================================================================
--- container/src/test/org/picocontainer/adapters/SimpleNamedBindingAnnotationTestCase.java (revision 4215)
+++ container/src/test/org/picocontainer/adapters/SimpleNamedBindingAnnotationTestCase.java (working copy)
@@ -131,7 +131,7 @@
// @todo Auto-generated method stub
}
- public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
+ public T getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
final T inst;
try {
inst = getComponentImplementation().newInstance();
Index: container/src/test/org/picocontainer/adapters/InstanceAdapterTestCase.java
===================================================================
--- container/src/test/org/picocontainer/adapters/InstanceAdapterTestCase.java (revision 4215)
+++ container/src/test/org/picocontainer/adapters/InstanceAdapterTestCase.java (working copy)
@@ -43,7 +43,7 @@
final Touchable touchable = new SimpleTouchable();
final ComponentAdapter componentAdapter = new InstanceAdapter(Touchable.class, touchable, new NullLifecycleStrategy(),
new NullComponentMonitor());
- assertSame(touchable, componentAdapter.getComponentInstance(null));
+ assertSame(touchable, componentAdapter.getComponentInstance(null, null));
}
@Test public void testDefaultLifecycleStrategy() {
Index: container/src/test/org/picocontainer/defaults/UserQuestionTestCase.java
===================================================================
--- container/src/test/org/picocontainer/defaults/UserQuestionTestCase.java (revision 4215)
+++ container/src/test/org/picocontainer/defaults/UserQuestionTestCase.java (working copy)
@@ -42,7 +42,7 @@
this.bla = cheeseMap;
}
- public Object getComponentInstance(PicoContainer pico) throws PicoCompositionException {
+ public Object getComponentInstance(PicoContainer pico, Class into) throws PicoCompositionException {
return bla.get("cheese");
}
Index: container/src/test/org/picocontainer/monitors/WriterComponentMonitorTestCase.java
===================================================================
--- container/src/test/org/picocontainer/monitors/WriterComponentMonitorTestCase.java (revision 4215)
+++ container/src/test/org/picocontainer/monitors/WriterComponentMonitorTestCase.java (working copy)
@@ -96,7 +96,11 @@
try {
componentMonitor.lifecycleInvocationFailed(new TransientPicoContainer(),
new AbstractAdapter(Map.class, HashMap.class) {
- public Object getComponentInstance(PicoContainer container)
+ public Object getComponentInstance(PicoContainer container) throws PicoCompositionException {
+ return getComponentInstance(container, null);
+ }
+
+ public Object getComponentInstance(PicoContainer container, Class into)
throws PicoCompositionException {
return "x";
}
Index: container/src/test/org/picocontainer/DefaultPicoContainerTestCase.java
===================================================================
--- container/src/test/org/picocontainer/DefaultPicoContainerTestCase.java (revision 4215)
+++ container/src/test/org/picocontainer/DefaultPicoContainerTestCase.java (working copy)
@@ -9,26 +9,18 @@
*****************************************************************************/
package org.picocontainer;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
+import org.junit.Test;
import static org.picocontainer.Characteristics.CDI;
import static org.picocontainer.Characteristics.SDI;
-
-import java.io.Serializable;
-import java.io.StringWriter;
-import java.lang.reflect.Member;
-import java.util.*;
-
-import org.junit.Test;
+import org.picocontainer.adapters.FactoryAdapter;
+import org.picocontainer.annotations.Inject;
import org.picocontainer.behaviors.Caching;
import org.picocontainer.containers.EmptyPicoContainer;
import org.picocontainer.injectors.AbstractInjector;
import org.picocontainer.injectors.ConstructorInjection;
import org.picocontainer.injectors.ConstructorInjector;
+import org.picocontainer.injectors.MultiInjection;
import org.picocontainer.lifecycle.NullLifecycleStrategy;
import org.picocontainer.monitors.NullComponentMonitor;
import org.picocontainer.monitors.WriterComponentMonitor;
@@ -37,8 +29,19 @@
import org.picocontainer.testmodel.DependsOnTouchable;
import org.picocontainer.testmodel.SimpleTouchable;
import org.picocontainer.testmodel.Touchable;
-import org.picocontainer.adapters.InstanceAdapter;
+import java.io.Serializable;
+import java.io.StringWriter;
+import java.lang.reflect.Member;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
/**
* @author Aslak Hellesøy
* @author Paul Hammant
@@ -383,7 +386,11 @@
return instance.getClass();
}
- public Object getComponentInstance(PicoContainer container)
+ public Object getComponentInstance(PicoContainer container) throws PicoCompositionException {
+ return getComponentInstance(container, null);
+ }
+
+ public Object getComponentInstance(PicoContainer container, Class into)
throws PicoCompositionException {
return instance;
}
@@ -746,6 +753,10 @@
if (abstractInjector.getComponentKey() == List.class) {
return new AbstractInjector(List.class, ArrayList.class, Parameter.DEFAULT, MyNullComponentMonitor.this, null, false) {
public Object getComponentInstance(PicoContainer container) throws PicoCompositionException {
+ return getComponentInstance(container, null);
+ }
+
+ public Object getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
ArrayList list = new ArrayList();
list.add("doppleganger");
return list;
@@ -756,4 +767,47 @@
}
}
}
+
+ public static interface Swede {
+ }
+ public static class Turnip {
+ @Inject
+ Swede swede;
+ private final String foo;
+
+ public Turnip(String foo) {
+ this.foo = foo;
+ }
+
+ public Swede getSwede() {
+ return swede;
+ }
+
+ public String getFoo() {
+ return foo;
+ }
+ }
+
+ @Test public void testThatComponentCanHaveAProvidedDependency() {
+ MutablePicoContainer container = new DefaultPicoContainer(new MultiInjection());
+ container.addComponent(String.class, "foo");
+ container.addComponent(Turnip.class);
+ container.addAdapter(new FactoryAdapter<Swede>() {
+ public Swede getComponentInstance(PicoContainer container, final Class clazz) throws PicoCompositionException {
+ return new Swede() {
+ public String toString() {
+ return "Swede:" + clazz.getName();
+ }
+ };
+ }
+ });
+
+ Turnip t = container.getComponent(Turnip.class);
+ assertNotNull(t);
+ assertEquals("Swede:" + Swede.class.getName(), t.getSwede().toString());
+ assertEquals("foo", t.getFoo());
+
+ }
+
+
}
\ No newline at end of file
Index: container/src/java/org/picocontainer/adapters/AbstractAdapter.java
===================================================================
--- container/src/java/org/picocontainer/adapters/AbstractAdapter.java (revision 4215)
+++ container/src/java/org/picocontainer/adapters/AbstractAdapter.java (working copy)
@@ -13,6 +13,8 @@
import org.picocontainer.PicoVisitor;
import org.picocontainer.ComponentAdapter;
import org.picocontainer.ComponentMonitorStrategy;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.PicoCompositionException;
import org.picocontainer.monitors.AbstractComponentMonitor;
import org.picocontainer.monitors.NullComponentMonitor;
@@ -92,6 +94,10 @@
}
}
+ public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
+ return getComponentInstance(container, null);
+ }
+
/**
* @return Returns the ComponentAdapter's class name and the component's key.
* @see java.lang.Object#toString()
Index: container/src/java/org/picocontainer/adapters/InstanceAdapter.java
===================================================================
--- container/src/java/org/picocontainer/adapters/InstanceAdapter.java (revision 4215)
+++ container/src/java/org/picocontainer/adapters/InstanceAdapter.java (working copy)
@@ -77,7 +77,7 @@
return componentInstance.getClass();
}
- public T getComponentInstance(PicoContainer container) {
+ public T getComponentInstance(PicoContainer container, Class into) {
return componentInstance;
}
Index: container/src/java/org/picocontainer/DefaultPicoContainer.java
===================================================================
--- container/src/java/org/picocontainer/DefaultPicoContainer.java (revision 4215)
+++ container/src/java/org/picocontainer/DefaultPicoContainer.java (working copy)
@@ -9,20 +9,7 @@
*****************************************************************************/
package org.picocontainer;
-import java.io.Serializable;
-import java.lang.annotation.Annotation;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
+import org.picocontainer.adapters.FactoryAdapter;
import org.picocontainer.adapters.InstanceAdapter;
import org.picocontainer.behaviors.AbstractBehaviorFactory;
import org.picocontainer.behaviors.AdaptingBehavior;
@@ -40,6 +27,20 @@
import org.picocontainer.lifecycle.StartableLifecycleStrategy;
import org.picocontainer.monitors.NullComponentMonitor;
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
/**
* <p/>
* The Standard {@link PicoContainer}/{@link MutablePicoContainer} implementation.
@@ -521,13 +522,13 @@
Object retVal;
if (annotation != null) {
final ComponentAdapter<?> componentAdapter = getComponentAdapter((Class<?>)componentKeyOrType, annotation);
- retVal = componentAdapter == null ? null : getInstance(componentAdapter);
+ retVal = componentAdapter == null ? null : getInstance(componentAdapter, null);
} else if (componentKeyOrType instanceof Class) {
final ComponentAdapter<?> componentAdapter = getComponentAdapter((Class<?>)componentKeyOrType, (NameBinding) null);
- retVal = componentAdapter == null ? null : getInstance(componentAdapter);
+ retVal = componentAdapter == null ? null : getInstance(componentAdapter, (Class<?>)componentKeyOrType);
} else {
ComponentAdapter<?> componentAdapter = getComponentAdapter(componentKeyOrType);
- retVal = componentAdapter == null ? null : getInstance(componentAdapter);
+ retVal = componentAdapter == null ? null : getInstance(componentAdapter, null);
}
if (retVal == null) {
retVal = componentMonitor.noComponentFound(this, componentKeyOrType);
@@ -546,7 +547,7 @@
}
- private Object getInstance(final ComponentAdapter<?> componentAdapter) {
+ private Object getInstance(final ComponentAdapter<?> componentAdapter, Class componentKey) {
// check whether this is our adapter
// we need to check this to ensure up-down dependencies cannot be followed
final boolean isLocal = getModifiableComponentAdapterList().contains(componentAdapter);
@@ -554,7 +555,11 @@
if (isLocal) {
Object instance;
try {
- instance = componentAdapter.getComponentInstance(this);
+ if (componentAdapter instanceof FactoryAdapter) {
+ instance = ((FactoryAdapter) componentAdapter).getComponentInstance(this, componentKey);
+ } else {
+ instance = componentAdapter.getComponentInstance(this);
+ }
} catch (AbstractInjector.CyclicDependencyException e) {
if (parent != null) {
instance = parent.getComponent(componentAdapter.getComponentKey());
Index: container/src/java/org/picocontainer/behaviors/Stored.java
===================================================================
--- container/src/java/org/picocontainer/behaviors/Stored.java (revision 4215)
+++ container/src/java/org/picocontainer/behaviors/Stored.java (working copy)
@@ -48,7 +48,7 @@
public void dispose(PicoContainer container) {
if ( delegateHasLifecylce ){
if (disposed) throw new IllegalStateException("Already disposed");
- dispose(getComponentInstance(container));
+ dispose(getComponentInstance(container, null));
disposed = true;
}
}
@@ -77,10 +77,10 @@
instanceReference.set(null);
}
- public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
+ public T getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
T instance = instanceReference.get();
if (instance == null) {
- instance = super.getComponentInstance(container);
+ instance = super.getComponentInstance(container, into);
instanceReference.set(instance);
}
return instance;
@@ -98,7 +98,7 @@
if ( delegateHasLifecylce ){
if (disposed) throw new IllegalStateException("Already disposed");
if (started) throw new IllegalStateException("Already started");
- start(getComponentInstance(container));
+ start(getComponentInstance(container, null));
started = true;
}
}
@@ -111,7 +111,7 @@
if ( delegateHasLifecylce ){
if (disposed) throw new IllegalStateException("Already disposed");
if (!started) throw new IllegalStateException("Not started");
- stop(getComponentInstance(container));
+ stop(getComponentInstance(container, null));
started = false;
}
}
Index: container/src/java/org/picocontainer/behaviors/HiddenImplementation.java
===================================================================
--- container/src/java/org/picocontainer/behaviors/HiddenImplementation.java (revision 4215)
+++ container/src/java/org/picocontainer/behaviors/HiddenImplementation.java (working copy)
@@ -46,7 +46,7 @@
super(delegate);
}
- public T getComponentInstance(final PicoContainer container) throws PicoCompositionException {
+ public T getComponentInstance(final PicoContainer container, Class into) throws PicoCompositionException {
ComponentAdapter<T> delegate = getDelegate();
Object componentKey = delegate.getComponentKey();
@@ -56,7 +56,7 @@
} else if (componentKey instanceof Class[]) {
classes = (Class[]) componentKey;
} else {
- return delegate.getComponentInstance(container);
+ return delegate.getComponentInstance(container, into);
}
Class<?>[] interfaces = verifyInterfacesOnly(classes);
@@ -81,7 +81,7 @@
}
protected Object invokeMethod(Method method, Object[] args, PicoContainer container) throws Throwable {
- Object componentInstance = getDelegate().getComponentInstance(container);
+ Object componentInstance = getDelegate().getComponentInstance(container, null);
ComponentMonitor componentMonitor = currentMonitor();
try {
componentMonitor.invoking(container, this, method, componentInstance);
Index: container/src/java/org/picocontainer/behaviors/Locked.java
===================================================================
--- container/src/java/org/picocontainer/behaviors/Locked.java (revision 4215)
+++ container/src/java/org/picocontainer/behaviors/Locked.java (working copy)
@@ -35,11 +35,11 @@
super(delegate);
}
- public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
+ public T getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
T retVal = null;
lock.lock();
try {
- retVal = super.getComponentInstance(container);
+ retVal = super.getComponentInstance(container, into);
}
finally {
lock.unlock();
Index: container/src/java/org/picocontainer/behaviors/PropertyApplicator.java
===================================================================
--- container/src/java/org/picocontainer/behaviors/PropertyApplicator.java (revision 4215)
+++ container/src/java/org/picocontainer/behaviors/PropertyApplicator.java (working copy)
@@ -73,8 +73,8 @@
* {@inheritDoc}
* @see #setProperties(Map)
*/
- public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
- final T componentInstance = super.getComponentInstance(container);
+ public T getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
+ final T componentInstance = super.getComponentInstance(container, into);
if (setters == null) {
setters = getSetters(getComponentImplementation());
}
Index: container/src/java/org/picocontainer/behaviors/Intercepted.java
===================================================================
--- container/src/java/org/picocontainer/behaviors/Intercepted.java (revision 4215)
+++ container/src/java/org/picocontainer/behaviors/Intercepted.java (working copy)
@@ -37,7 +37,7 @@
}
protected Object invokeMethod(Method method, Object[] args, PicoContainer container) throws Throwable {
- Object componentInstance = getDelegate().getComponentInstance(container);
+ Object componentInstance = getDelegate().getComponentInstance(container, null);
try {
controller.clear();
controller.instance(componentInstance);
Index: container/src/java/org/picocontainer/behaviors/Synchronized.java
===================================================================
--- container/src/java/org/picocontainer/behaviors/Synchronized.java (revision 4215)
+++ container/src/java/org/picocontainer/behaviors/Synchronized.java (working copy)
@@ -30,8 +30,8 @@
super(delegate);
}
- public synchronized T getComponentInstance(PicoContainer container) throws PicoCompositionException {
- return super.getComponentInstance(container);
+ public synchronized T getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
+ return super.getComponentInstance(container, into);
}
public String getDescriptor() {
Index: container/src/java/org/picocontainer/behaviors/AbstractBehavior.java
===================================================================
--- container/src/java/org/picocontainer/behaviors/AbstractBehavior.java (revision 4215)
+++ container/src/java/org/picocontainer/behaviors/AbstractBehavior.java (working copy)
@@ -57,9 +57,13 @@
}
public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
- return (T) delegate.getComponentInstance(container);
+ return getComponentInstance(container, null);
}
+ public T getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
+ return (T) delegate.getComponentInstance(container, into);
+ }
+
public void verify(PicoContainer container) throws PicoCompositionException {
delegate.verify(container);
}
Index: container/src/java/org/picocontainer/ComponentAdapter.java
===================================================================
--- container/src/java/org/picocontainer/ComponentAdapter.java (revision 4215)
+++ container/src/java/org/picocontainer/ComponentAdapter.java (working copy)
@@ -47,10 +47,25 @@
* @throws PicoCompositionException if the component has dependencies which could not be resolved, or
* instantiation of the component lead to an ambigous situation within the
* container.
+ * @deprecated since PicoContainer 2.2
*/
T getComponentInstance(PicoContainer container) throws PicoCompositionException;
/**
+ * Retrieve the component instance. This method will usually create a new instance each time it is called, but that
+ * is not required. For example, {@link org.picocontainer.behaviors.Cached} will always return the
+ * same instance.
+ *
+ * @param container the {@link PicoContainer}, that is used to resolve any possible dependencies of the instance.
+ * @param into the class that is about to be injected into.
+ * @return the component instance.
+ * @throws PicoCompositionException if the component has dependencies which could not be resolved, or
+ * instantiation of the component lead to an ambigous situation within the
+ * container.
+ */
+ T getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException;
+
+ /**
* Verify that all dependencies for this adapter can be satisifed. Normally, the adapter should verify this by
* checking that the associated PicoContainer contains all the needed dependnecies.
*
Index: container/src/java/org/picocontainer/injectors/AbstractInjector.java
===================================================================
--- container/src/java/org/picocontainer/injectors/AbstractInjector.java (revision 4215)
+++ container/src/java/org/picocontainer/injectors/AbstractInjector.java (working copy)
@@ -105,6 +105,12 @@
public void verify(PicoContainer container) throws PicoCompositionException {
}
+ public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
+ return getComponentInstance(container, null);
+ }
+
+ public abstract T getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException;
+
@Override
public void accept(final PicoVisitor visitor) {
super.accept(visitor);
Index: container/src/java/org/picocontainer/injectors/MethodInjector.java
===================================================================
--- container/src/java/org/picocontainer/injectors/MethodInjector.java (revision 4215)
+++ container/src/java/org/picocontainer/injectors/MethodInjector.java (working copy)
@@ -65,7 +65,7 @@
return null;
}
- public Object getComponentInstance(final PicoContainer container) throws PicoCompositionException {
+ public Object getComponentInstance(final PicoContainer container, Class into) throws PicoCompositionException {
if (instantiationGuard == null) {
instantiationGuard = new ThreadLocalCyclicDependencyGuard() {
public Object run() {
Index: container/src/java/org/picocontainer/injectors/ConstructorInjector.java
===================================================================
--- container/src/java/org/picocontainer/injectors/ConstructorInjector.java (revision 4215)
+++ container/src/java/org/picocontainer/injectors/ConstructorInjector.java (working copy)
@@ -145,7 +145,7 @@
}
- public T getComponentInstance(final PicoContainer container) throws PicoCompositionException {
+ public T getComponentInstance(final PicoContainer container, Class into) throws PicoCompositionException {
if (instantiationGuard == null) {
instantiationGuard = new ThreadLocalCyclicDependencyGuard<T>() {
public T run() {
Index: container/src/java/org/picocontainer/injectors/MultiInjector.java
===================================================================
--- container/src/java/org/picocontainer/injectors/MultiInjector.java (revision 4215)
+++ container/src/java/org/picocontainer/injectors/MultiInjector.java (working copy)
@@ -23,6 +23,7 @@
private final ConstructorInjector constuctorInjector;
private final SetterInjector setterInjector;
+ private final AnnotatedFieldInjector annotatedFieldInjector;
private AnnotatedMethodInjector annotatedMethodInjector;
public MultiInjector(Object componentKey,
@@ -59,10 +60,24 @@
protected void unsatisfiedDependencies(PicoContainer container, Set<Class> unsatisfiableDependencyTypes) {
}
};
+ annotatedFieldInjector = new AnnotatedFieldInjector(componentKey, componentImplementation, parameters, componentMonitor, lifecycleStrategy, Inject.class, useNames) {
+ protected Object getOrMakeInstance(PicoContainer container,
+ Constructor constructor,
+ ComponentMonitor componentMonitor) {
+ return annotatedMethodInjector.getComponentInstance(container);
+ }
+
+ protected Constructor getConstructor() {
+ return null;
+ }
+
+ protected void unsatisfiedDependencies(PicoContainer container, Set<Class> unsatisfiableDependencyTypes) {
+ }
+ };
}
- public Object getComponentInstance(PicoContainer container) throws PicoCompositionException {
- return annotatedMethodInjector.getComponentInstance(container);
+ public Object getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
+ return annotatedFieldInjector.getComponentInstance(container, into);
}
@Override
Index: container/src/java/org/picocontainer/injectors/IterativeInjector.java
===================================================================
--- container/src/java/org/picocontainer/injectors/IterativeInjector.java (revision 4215)
+++ container/src/java/org/picocontainer/injectors/IterativeInjector.java (working copy)
@@ -131,7 +131,7 @@
throw new UnsatisfiableDependenciesException(this, null, unsatisfiableDependencyTypes, container);
}
- public Object getComponentInstance(final PicoContainer container) throws PicoCompositionException {
+ public Object getComponentInstance(final PicoContainer container, Class into) throws PicoCompositionException {
final Constructor constructor = getConstructor();
if (instantiationGuard == null) {
instantiationGuard = new ThreadLocalCyclicDependencyGuard() {
Index: gems/src/java/org/picocontainer/gems/behaviors/Assimilated.java
===================================================================
--- gems/src/java/org/picocontainer/gems/behaviors/Assimilated.java (revision 4215)
+++ gems/src/java/org/picocontainer/gems/behaviors/Assimilated.java (working copy)
@@ -110,10 +110,10 @@
*
* @see AbstractBehavior#getComponentInstance(org.picocontainer.PicoContainer)
*/
- public Object getComponentInstance(final PicoContainer container)
+ public Object getComponentInstance(final PicoContainer container, Class into)
throws PicoCompositionException {
- return isCompatible ? super.getComponentInstance(container) : Delegating.object(
- type, super.getComponentInstance(container), proxyFactory);
+ return isCompatible ? super.getComponentInstance(container, into) : Delegating.object(
+ type, super.getComponentInstance(container, into), proxyFactory);
}
public String getDescriptor() {
Index: gems/src/java/org/picocontainer/gems/behaviors/HiddenImplementation.java
===================================================================
--- gems/src/java/org/picocontainer/gems/behaviors/HiddenImplementation.java (revision 4215)
+++ gems/src/java/org/picocontainer/gems/behaviors/HiddenImplementation.java (working copy)
@@ -41,8 +41,8 @@
super(delegate);
}
- public Object getComponentInstance(final PicoContainer container) {
- Object o = getDelegate().getComponentInstance(container);
+ public Object getComponentInstance(final PicoContainer container, Class into) {
+ Object o = getDelegate().getComponentInstance(container, into);
Class[] interfaces = o.getClass().getInterfaces();
if (interfaces.length != 0) {
byte[] bytes = makeProxy("XX", interfaces, true);
Index: gems/src/java/org/picocontainer/gems/behaviors/Pooled.java
===================================================================
--- gems/src/java/org/picocontainer/gems/behaviors/Pooled.java (revision 4215)
+++ gems/src/java/org/picocontainer/gems/behaviors/Pooled.java (working copy)
@@ -269,7 +269,7 @@
* @throws PoolException if the pool is exhausted or waiting for a returning object timed out or
* was interrupted
*/
- public Object getComponentInstance(PicoContainer container) {
+ public Object getComponentInstance(PicoContainer container, Class into) {
if (delegateHasLifecylce) {
if (disposed) throw new IllegalStateException("Already disposed");
}
@@ -283,7 +283,7 @@
break;
}
if (maxPoolSize > pool.size()) {
- final Object component = super.getComponentInstance(container);
+ final Object component = super.getComponentInstance(container, into);
if (delegateHasLifecylce) {
components.add(component);
if (started) {
Index: gems/src/java/org/picocontainer/gems/behaviors/HotSwappable.java
===================================================================
--- gems/src/java/org/picocontainer/gems/behaviors/HotSwappable.java (revision 4215)
+++ gems/src/java/org/picocontainer/gems/behaviors/HotSwappable.java (working copy)
@@ -48,10 +48,10 @@
}
- public Object getComponentInstance(PicoContainer container) {
+ public Object getComponentInstance(PicoContainer container, Class into) {
synchronized (swappable) {
if (instance == null) {
- instance = super.getComponentInstance(container);
+ instance = super.getComponentInstance(container, into);
}
}
return instance;
Index: gems/src/java/org/picocontainer/gems/adapters/StaticFactoryAdapter.java
===================================================================
--- gems/src/java/org/picocontainer/gems/adapters/StaticFactoryAdapter.java (revision 4215)
+++ gems/src/java/org/picocontainer/gems/adapters/StaticFactoryAdapter.java (working copy)
@@ -52,7 +52,7 @@
* @return Returns the component created by the static factory.
* @see org.picocontainer.ComponentAdapter#getComponentInstance(org.picocontainer.PicoContainer)
*/
- public Object getComponentInstance(PicoContainer container) throws PicoCompositionException {
+ public Object getComponentInstance(PicoContainer container, Class into) throws PicoCompositionException {
return staticFactory.get();
}
Index: gems/src/java/org/picocontainer/gems/adapters/ThreadLocalized.java
===================================================================
--- gems/src/java/org/picocontainer/gems/adapters/ThreadLocalized.java (revision 4215)
+++ gems/src/java/org/picocontainer/gems/adapters/ThreadLocalized.java (working copy)
@@ -71,7 +71,7 @@
this(new Cached(delegate, new ThreadLocalReference()), new StandardProxyFactory());
}
- public Object getComponentInstance(final PicoContainer pico) throws PicoCompositionException {
+ public Object getComponentInstance(final PicoContainer pico, Class into) throws PicoCompositionException {
if (interfaces == null) {
interfaces = getInterfaces();
Index: gems/src/java/org/picocontainer/gems/jndi/JNDIProvided.java
===================================================================
--- gems/src/java/org/picocontainer/gems/jndi/JNDIProvided.java (revision 4215)
+++ gems/src/java/org/picocontainer/gems/jndi/JNDIProvided.java (working copy)
@@ -71,10 +71,14 @@
return jndiReference.get().getClass();
}
- /**
+ public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
+ return getComponentInstance(container, null);
+ }
+
+ /**
* retrieve instance out of JNDI
*/
- public T getComponentInstance(PicoContainer container)
+ public T getComponentInstance(PicoContainer container, Class into)
throws PicoCompositionException {
return jndiReference.get();
}
Index: gems/src/java/org/picocontainer/gems/jmx/JMXExposed.java
===================================================================
--- gems/src/java/org/picocontainer/gems/jmx/JMXExposed.java (revision 4215)
+++ gems/src/java/org/picocontainer/gems/jmx/JMXExposed.java (working copy)
@@ -81,11 +81,11 @@
* {@link javax.management.DynamicMBean} in the {@link MBeanServer } fails.
* @see AbstractBehavior#getComponentInstance(org.picocontainer.PicoContainer)
*/
- public Object getComponentInstance(final PicoContainer container)
+ public Object getComponentInstance(final PicoContainer container, Class into)
throws PicoCompositionException
{
final ComponentAdapter componentAdapter = new Cached(getDelegate());
- final Object componentInstance = componentAdapter.getComponentInstance(container);
+ final Object componentInstance = componentAdapter.getComponentInstance(container, into);
for (DynamicMBeanProvider provider : providers) {
final JMXRegistrationInfo info = provider.provide(container, componentAdapter);
if (info != null) {
FactoryAdapter.java
(application/octet-stream, 2.7 KB) - not displayed