[picocontainer-scm] [scm-git][2] Missing files from previous commits

Michael Rimov <git-yCVjj/[email protected]> Fri, 29 Jun 2012 12:26:02 -0500 (CDT)
Newsgroups gmane.comp.java.picocontainer.cvs
Message-ID <[email protected]>
commit 186778585cd6a0d05b3a963504112b7866322566
Author:     Michael Rimov <[email protected]>
AuthorDate: Fri Jun 29 10:24:06 2012 -0700
Commit:     Michael Rimov <[email protected]>
CommitDate: Fri Jun 29 10:24:06 2012 -0700

    Missing files from previous commits

diff --git a/pico/container/src/java/org/picocontainer/injectors/AbstractFieldInjector.java b/pico/container/src/java/org/picocontainer/injectors/AbstractFieldInjector.java
new file mode 100644
index 0000000..93d6b34
--- /dev/null
+++ b/pico/container/src/java/org/picocontainer/injectors/AbstractFieldInjector.java
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * Copyright (C) 2003-2011 PicoContainer Committers. All rights reserved.    *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the BSD      *
+ * style license a copy of which has been included with this distribution in *
+ * the LICENSE.txt file.                                                     *
+ *                                                                           *
+ * Original code by                                                          *
+ *****************************************************************************/
+package org.picocontainer.injectors;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Field;
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Set;
+
+import org.picocontainer.ComponentMonitor;
+import org.picocontainer.Parameter;
+import org.picocontainer.PicoContainer;
+
+@SuppressWarnings("serial")
+public abstract class AbstractFieldInjector<T> extends IterativeInjector<T> {
+
+	public AbstractFieldInjector(final Object componentKey, final Class<?> componentImplementation,
+			final ComponentMonitor monitor, final boolean useNames, final Parameter... parameters)
+			throws NotConcreteRegistrationException {
+		super(componentKey, componentImplementation, monitor, useNames, parameters);
+	}
+
+	@Override
+	final protected void unsatisfiedDependencies(final PicoContainer container,
+			final Set<Type> unsatisfiableDependencyTypes, final List<AccessibleObject> unsatisfiableDependencyMembers) {
+		final StringBuilder sb = new StringBuilder(this.getComponentImplementation().getName())
+				.append(" has unsatisfied dependency for fields [");
+		for (int i = 0; i < unsatisfiableDependencyMembers.size(); i++) {
+			final AccessibleObject accessibleObject = unsatisfiableDependencyMembers.get(i);
+			final Field m = (Field) accessibleObject;
+			sb.append(m.getType().getName()).append(".").append(m.getName());
+		}
+		final String container1 = container.toString();
+		throw new UnsatisfiableDependenciesException(sb.toString() + "] from " + container1);
+	}
+
+}
\ No newline at end of file
diff --git a/pico/container/src/java/org/picocontainer/parameters/CollectionSearchAlgorithm.java b/pico/container/src/java/org/picocontainer/parameters/CollectionSearchAlgorithm.java
new file mode 100644
index 0000000..5b30a90
--- /dev/null
+++ b/pico/container/src/java/org/picocontainer/parameters/CollectionSearchAlgorithm.java
@@ -0,0 +1,15 @@
+package org.picocontainer.parameters;
+
+import java.util.Map;
+
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.PicoContainer;
+
+import com.googlecode.jtype.Generic;
+
+public interface CollectionSearchAlgorithm {
+    
+	Map<Object, ComponentAdapter<?>> getMatchingComponentAdapters(PicoContainer container, ComponentAdapter adapter,
+                                 Class keyType, Generic<?> valueType);
+
+}
diff --git a/pico/container/src/test/org/picocontainer/GregoryTestCase.java b/pico/container/src/test/org/picocontainer/GregoryTestCase.java
new file mode 100644
index 0000000..24261c3
--- /dev/null
+++ b/pico/container/src/test/org/picocontainer/GregoryTestCase.java
@@ -0,0 +1,64 @@
+package org.picocontainer;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.inject.Inject;
+
+import org.junit.Test;
+import org.picocontainer.behaviors.AdaptingBehavior;
+import org.picocontainer.containers.EmptyPicoContainer;
+import org.picocontainer.injectors.AnnotatedFieldInjection;
+import org.picocontainer.injectors.MultiInjection;
+
+public class GregoryTestCase {
+
+	@Test
+	 public void testComponentCanUseConstructorAndAtInjectWithoutAnInitMethod() {
+		
+	        final MutablePicoContainer pico = new PicoBuilder(new MultiInjection())
+	        		.withBehaviors(new AdaptingBehavior())
+	        		.build();
+	        pico.addComponent(Carrot.class)
+	        	.addComponent(Cheese.class)
+	        	.addComponent(Mixer.class);
+
+	        // fails with org.picocontainer.PicoCompositionException: java.lang.NoSuchMethodException: ...$Mixer.<init>()
+	        final Utensil u = pico.getComponent(Utensil.class);
+	        assertEquals("Mixing carrot with some cheese", u.use());
+	    }
+
+	    public static final class Cheese {
+	    }
+
+	    public static final class Carrot {
+	    }
+
+	    public static interface Utensil {
+	        String use();
+	    }
+
+	    public static class Spoon implements Utensil {
+	        public String use() {
+	            return "there is no spoon";
+	        }
+	    }
+
+	    public static class Mixer implements Utensil {
+	        private final Cheese cheese;
+	        @Inject
+	        private Carrot veg;
+
+	        public Mixer(Cheese cheese) {
+	            this.cheese = cheese;
+	        }
+
+	        public String use() {
+	            return "Mixing " + simpleClassNameOrNull(veg) + " with some " + simpleClassNameOrNull(cheese);
+	        }
+	    }
+
+	    private static String simpleClassNameOrNull(Object o) {
+	        return o == null ? null : o.getClass().getSimpleName().toLowerCase();
+	    }
+
+}