[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&oslash;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
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.