[picocontainer-scm] [scm-git][4] Update to Pico 2 svn bugfix version 5799

Michael Rimov <git-yCVjj/[email protected]> Fri, 29 Jun 2012 12:26:13 -0500 (CDT)
Newsgroups gmane.comp.java.picocontainer.cvs
Message-ID <[email protected]>
commit f430a4e69b24a2bbfd09c3d1a10888346094ef83
Author:     Michael Rimov <[email protected]>
AuthorDate: Mon Jun 25 06:41:39 2012 -0700
Commit:     Michael Rimov <[email protected]>
CommitDate: Mon Jun 25 06:41:39 2012 -0700

    Update to Pico 2 svn bugfix version 5799

diff --git a/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjection.java b/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjection.java
index b353f6f..014ddbe 100644
--- a/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjection.java
+++ b/pico/container/src/java/org/picocontainer/injectors/AnnotatedFieldInjection.java
@@ -34,6 +34,7 @@ import java.lang.annotation.Annotation;
 import static org.picocontainer.injectors.AnnotatedMethodInjection.getInjectionAnnotation;
 import static org.picocontainer.injectors.AnnotatedMethodInjection.AnnotatedMethodInjector.makeAnnotationNames;
 
+
 /**
  * A {@link org.picocontainer.InjectionType} for Guice-style annotated fields.
  * The factory creates {@link AnnotatedFieldInjector}.
diff --git a/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java b/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java
index 6e3e5d5..8585ace 100644
--- a/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java
+++ b/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java
@@ -40,7 +40,7 @@ public abstract class IterativeInjector<T> extends AbstractInjector<T> {
     protected transient Annotation[] bindings;
 
     private transient Paranamer paranamer;
-
+    private transient boolean initialized;
     /**
      * Constructs a IterativeInjector
      *
@@ -78,9 +78,9 @@ public abstract class IterativeInjector<T> extends AbstractInjector<T> {
     }
 
     private Parameter[] getMatchingParameterListForSetters(PicoContainer container) throws PicoCompositionException {
-        if (injectionMembers == null) {
+        if (initialized == false) {
         	synchronized(this) {
-        		if (injectionMembers == null) {
+        		if (initialized == false) {
         			initializeInjectionMembersAndTypeLists();
         		}
         	}
@@ -258,6 +258,7 @@ public abstract class IterativeInjector<T> extends AbstractInjector<T> {
 
     protected void initializeInjectionMembersAndTypeLists() {
         injectionMembers = new ArrayList<AccessibleObject>();
+        Set<String> injectionMemberNames = new HashSet<String>();
         List<Annotation> bingingIds = new ArrayList<Annotation>();
         final List<String> nameList = new ArrayList<String>();
         final List<Type> typeList = new ArrayList<Type>();
@@ -266,11 +267,16 @@ public abstract class IterativeInjector<T> extends AbstractInjector<T> {
             final Type[] parameterTypes = method.getGenericParameterTypes();
             fixGenericParameterTypes(method, parameterTypes);
 
+            String methodSignature = crudeMethodSignature(method);            
+            
             // We're only interested if there is only one parameter and the method name is bean-style.
             if (parameterTypes.length == 1) {
                 boolean isInjector = isInjectorMethod(method);
-                if (isInjector) {
+                // ... and the method name is bean-style.
+                // We're also not interested in dupes from parent classes (not all JDK impls)
+                if (isInjector && !injectionMemberNames.contains(methodSignature)) {
                     injectionMembers.add(method);
+                    injectionMemberNames.add(methodSignature);
                     nameList.add(getName(method));
                     typeList.add(box(parameterTypes[0]));
                     bingingIds.add(getBindings(method, 0));
@@ -279,8 +285,20 @@ public abstract class IterativeInjector<T> extends AbstractInjector<T> {
         }
         injectionTypes = typeList.toArray(new Type[0]);
         bindings = bingingIds.toArray(new Annotation[0]);
+        initialized = true;
+    }
+    
+    public static String crudeMethodSignature(Method method) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(method.getReturnType().getName());
+        sb.append(method.getName());
+        for (Class<?> pType : method.getParameterTypes()) {
+            sb.append(pType.getName());
+        }
+        return sb.toString();
     }
 
+
     protected String getName(Method method) {
         return null;
     }
diff --git a/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java b/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java
index dcfb1dd..ed9cd8e 100644
--- a/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java
+++ b/pico/container/src/test/org/picocontainer/injectors/TypedFieldInjectorTestCase.java
@@ -25,7 +25,7 @@ public class TypedFieldInjectorTestCase {
     public static class PogoStick {
     }
 
-    @Test public void testFieldInjectionByType() {
+    @Test public void testFieldInjectionByTypeWhereMatch() {
         MutablePicoContainer pico = new DefaultPicoContainer();
         pico.addAdapter(new TypedFieldInjection.TypedFieldInjector(Helicopter.class, Helicopter.class, new NullComponentMonitor(), Integer.class.getName() + " " + PogoStick.class.getName() + " " + Float.class.getName(), null
         ));
@@ -36,4 +36,5 @@ public class TypedFieldInjectorTestCase {
     }
 
 
+
 }
\ No newline at end of file