[picocontainer-scm] [5830] java/2.x/trunk/pico: PICO-392 - improved ambiguous messaging
paul-yCVjj/[email protected] Thu, 18 Oct 2012 10:10:59 -0500 (CDT)
| Newsgroups | gmane.comp.java.picocontainer.cvs |
|---|---|
| Message-ID | <[email protected]> |
Revision 5830
Author paul
Date 2012-10-18 10:10:59 -0500 (Thu, 18 Oct 2012)
Log Message
PICO-392 - improved ambiguous messaging
Modified Paths
- java/2.x/trunk/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/adapters/InstanceAdapter.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/AbstractInjector.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/ConstructorInjector.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjector.java
- java/2.x/trunk/pico/container/src/java/org/picocontainer/parameters/BasicComponentParameter.java
- java/2.x/trunk/pico/container/src/test/org/picocontainer/DefaultPicoContainerTestCase.java
- java/2.x/trunk/pico/container/src/test/org/picocontainer/behaviors/AdaptingBehaviorTestCase.java
- java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedMethodInjectorTestCase.java
- java/2.x/trunk/pico/container/src/test/org/picocontainer/tck/AbstractPicoContainerTest.java
- java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/constraints/AbstractConstraint.java
Diff
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java (5829 => 5830)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/DefaultPicoContainer.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -46,6 +46,9 @@
import java.util.Properties;
import java.util.Set;
+import static org.picocontainer.parameters.BasicComponentParameter.findInjectorOrInstanceAdapter;
+import static org.picocontainer.parameters.BasicComponentParameter.makeFoundAmbiguousStrings;
+
/**
* <p/>
* The Standard {@link PicoContainer}/{@link MutablePicoContainer} implementation.
@@ -394,12 +397,8 @@
}
}
}
- Class<?>[] foundClasses = new Class[found.size()];
- for (int i = 0; i < foundClasses.length; i++) {
- foundClasses[i] = found.get(i).getComponentImplementation();
- }
-
- throw new AbstractInjector.AmbiguousComponentResolutionException(componentType, foundClasses);
+ String[] foundStrings = makeFoundAmbiguousStrings(found);
+ throw new AbstractInjector.AmbiguousComponentResolutionException(componentType, foundStrings);
}
}
@@ -636,17 +635,24 @@
}
public Object getComponent(final Object componentKeyOrType, final Class<? extends Annotation> annotation) {
- ComponentAdapter<?> componentAdapter;
+ ComponentAdapter<?> componentAdapter = null;
Object component;
- if (annotation != null) {
- componentAdapter = getComponentAdapter((Class<?>)componentKeyOrType, annotation);
- component = componentAdapter == null ? null : getInstance(componentAdapter, null);
- } else if (componentKeyOrType instanceof Class) {
- componentAdapter = getComponentAdapter((Class<?>)componentKeyOrType, (NameBinding) null);
- component = componentAdapter == null ? null : getInstance(componentAdapter, (Class<?>)componentKeyOrType);
- } else {
- componentAdapter = getComponentAdapter(componentKeyOrType);
- component = componentAdapter == null ? null : getInstance(componentAdapter, null);
+ try {
+ if (annotation != null) {
+ componentAdapter = getComponentAdapter((Class<?>)componentKeyOrType, annotation);
+ component = componentAdapter == null ? null : getInstance(componentAdapter, null);
+ } else if (componentKeyOrType instanceof Class) {
+ componentAdapter = getComponentAdapter((Class<?>)componentKeyOrType, (NameBinding) null);
+ component = componentAdapter == null ? null : getInstance(componentAdapter, (Class<?>)componentKeyOrType);
+ } else {
+ componentAdapter = getComponentAdapter(componentKeyOrType);
+ component = componentAdapter == null ? null : getInstance(componentAdapter, null);
+ }
+ } catch (AbstractInjector.AmbiguousComponentResolutionException e) {
+ if (componentAdapter != null) {
+ e.setComponent(findInjectorOrInstanceAdapter(componentAdapter).toString());
+ }
+ throw e;
}
return decorateComponent(component, componentAdapter);
}
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/adapters/InstanceAdapter.java (5829 => 5830)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/adapters/InstanceAdapter.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/adapters/InstanceAdapter.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -9,8 +9,13 @@
*****************************************************************************/
package org.picocontainer.adapters;
-import org.picocontainer.*;
-import org.picocontainer.adapters.AbstractAdapter;
+import org.picocontainer.Behavior;
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.ComponentLifecycle;
+import org.picocontainer.ComponentMonitor;
+import org.picocontainer.LifecycleStrategy;
+import org.picocontainer.PicoCompositionException;
+import org.picocontainer.PicoContainer;
import org.picocontainer.lifecycle.NullLifecycleStrategy;
import org.picocontainer.monitors.NullComponentMonitor;
@@ -82,6 +87,15 @@
return "Instance-";
}
+ @Override
+ public String toString() {
+ Object componentKey = getComponentKey();
+ if (componentKey instanceof Class) {
+ componentKey = "of " + ((Class) componentKey).getName();
+ }
+ return getDescriptor() + componentKey;
+ }
+
public void start(PicoContainer container) {
start(componentInstance);
}
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/AbstractInjector.java (5829 => 5830)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/AbstractInjector.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/AbstractInjector.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -324,9 +324,9 @@
public static final class AmbiguousComponentResolutionException extends PicoCompositionException {
- private Class<?> component;
+ private String component;
private final Class<?> ambiguousDependency;
- private final Object[] ambiguousComponentKeys;
+ private final String[] ambiguousComponentKeys;
private AccessibleObject accessibleObject;
@@ -336,11 +336,10 @@
* @param ambiguousDependency the unresolved dependency type
* @param componentKeys the ambiguous keys.
*/
- public AmbiguousComponentResolutionException(final Class<?> ambiguousDependency, final Object[] componentKeys) {
+ public AmbiguousComponentResolutionException(final Class<?> ambiguousDependency, final String[] componentKeys) {
super("");
this.ambiguousDependency = ambiguousDependency;
- this.ambiguousComponentKeys = new Class[componentKeys.length];
- System.arraycopy(componentKeys, 0, ambiguousComponentKeys, 0, componentKeys.length);
+ this.ambiguousComponentKeys = componentKeys;
}
/**
@@ -363,12 +362,14 @@
/**
* @return Returns the ambiguous component keys as array.
*/
- public Object[] getAmbiguousComponentKeys() {
+ public String[] getAmbiguousComponentKeys() {
return ambiguousComponentKeys;
}
- public void setComponent(final Class<?> component) {
- this.component = component;
+ public void setComponent(final String component) {
+ if (this.component == null) {
+ this.component = component;
+ }
}
public void setMember(AccessibleObject accessibleObject) {
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/ConstructorInjector.java (5829 => 5830)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/ConstructorInjector.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/ConstructorInjector.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -106,20 +106,15 @@
private CtorAndAdapters<T> getGreediestSatisfiableConstructor(PicoContainer guardedContainer, @SuppressWarnings("unused") Class<? extends T> componentImplementation) {
CtorAndAdapters<T> ctor = null;
- try {
+ if (chosenConstructor == null) {
+ ctor = getGreediestSatisfiableConstructor(guardedContainer);
+ }
+ if (rememberChosenConstructor) {
if (chosenConstructor == null) {
- ctor = getGreediestSatisfiableConstructor(guardedContainer);
+ chosenConstructor = ctor;
+ } else {
+ ctor = chosenConstructor;
}
- if (rememberChosenConstructor) {
- if (chosenConstructor == null) {
- chosenConstructor = ctor;
- } else {
- ctor = chosenConstructor;
- }
- }
- } catch (AmbiguousComponentResolutionException e) {
- e.setComponent(getComponentImplementation());
- throw e;
}
return ctor;
}
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java (5829 => 5830)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -129,7 +129,6 @@
return true;
}
} catch (AmbiguousComponentResolutionException e) {
- e.setComponent(getComponentImplementation());
e.setMember(injectionMembers.get(j));
throw e;
}
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjector.java (5829 => 5830)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjector.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/NamedMethodInjector.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -12,12 +12,9 @@
import org.picocontainer.ComponentMonitor;
import org.picocontainer.NameBinding;
import org.picocontainer.Parameter;
-import org.picocontainer.PicoContainer;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.Set;
@SuppressWarnings("serial")
public class NamedMethodInjector<T> extends SetterInjector<T> {
@@ -66,7 +63,7 @@
@Override
public String getDescriptor() {
- return "NamedMethodInjection";
+ return "NamedMethodInjection:";
}
}
\ No newline at end of file
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/parameters/BasicComponentParameter.java (5829 => 5830)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/parameters/BasicComponentParameter.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/parameters/BasicComponentParameter.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -9,18 +9,30 @@
*****************************************************************************/
package org.picocontainer.parameters;
+import org.picocontainer.Behavior;
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.Converters;
+import org.picocontainer.Converting;
+import org.picocontainer.DefaultPicoContainer;
+import org.picocontainer.LifecycleStrategy;
+import org.picocontainer.NameBinding;
+import org.picocontainer.Parameter;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.PicoVisitor;
+import org.picocontainer.adapters.InstanceAdapter;
+import org.picocontainer.injectors.AbstractInjector;
+import org.picocontainer.injectors.InjectInto;
+
import java.io.Serializable;
+import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
-import java.lang.annotation.Annotation;
+import java.util.Collection;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Set;
-import org.picocontainer.*;
-import org.picocontainer.injectors.AbstractInjector;
-import org.picocontainer.injectors.InjectInto;
-
/**
* A BasicComponentParameter should be used to pass in a particular component as argument to a
* different component's constructor. This is particularly useful in cases where several
@@ -243,14 +255,27 @@
}
private <T> AbstractInjector.AmbiguousComponentResolutionException tooManyMatchingAdaptersFound(Class<T> expectedType, List<ComponentAdapter<T>> found) {
- Class[] foundClasses = new Class[found.size()];
- for (int i = 0; i < foundClasses.length; i++) {
- foundClasses[i] = found.get(i).getComponentImplementation();
+ String[] foundStrings = makeFoundAmbiguousStrings(found);
+ return new AbstractInjector.AmbiguousComponentResolutionException(expectedType, foundStrings);
+ }
+
+ public static <T> String[] makeFoundAmbiguousStrings(Collection<ComponentAdapter<T>> found) {
+ String[] foundStrings = new String[found.size()];
+ int ix = 0;
+ for (ComponentAdapter<?> f : found) {
+ f = findInjectorOrInstanceAdapter(f);
+ foundStrings[ix++] = f.toString();
}
- AbstractInjector.AmbiguousComponentResolutionException exception = new AbstractInjector.AmbiguousComponentResolutionException(expectedType, foundClasses);
- return exception;
+ return foundStrings;
}
+ public static ComponentAdapter<?> findInjectorOrInstanceAdapter(ComponentAdapter<?> f) {
+ while (f instanceof Behavior || (f instanceof LifecycleStrategy && !(f instanceof InstanceAdapter))) {
+ f = f.getDelegate();
+ }
+ return f;
+ }
+
private <T> void removeExcludedAdapterIfApplicable(Object excludeKey, List<ComponentAdapter<T>> found) {
ComponentAdapter exclude = null;
for (ComponentAdapter work : found) {
Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/DefaultPicoContainerTestCase.java (5829 => 5830)
--- java/2.x/trunk/pico/container/src/test/org/picocontainer/DefaultPicoContainerTestCase.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/DefaultPicoContainerTestCase.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -9,37 +9,12 @@
*****************************************************************************/
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.picocontainer.Characteristics.CDI;
-import static org.picocontainer.Characteristics.SDI;
-
-import java.io.Serializable;
-import java.io.StringWriter;
-import java.lang.StringBuilder;
-import java.lang.reflect.Member;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Type;
-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;
-
import org.junit.Test;
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.lifecycle.NullLifecycleStrategy;
import org.picocontainer.monitors.NullComponentMonitor;
import org.picocontainer.monitors.WriterComponentMonitor;
import org.picocontainer.parameters.ConstantParameter;
@@ -49,6 +24,29 @@
import org.picocontainer.testmodel.SimpleTouchable;
import org.picocontainer.testmodel.Touchable;
+import java.io.Serializable;
+import java.io.StringWriter;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Member;
+import java.lang.reflect.Type;
+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;
+
+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.picocontainer.Characteristics.CDI;
+import static org.picocontainer.Characteristics.SDI;
+
/**
* @author Aslak Hellesøp;y
* @author Paul Hammant
@@ -219,9 +217,9 @@
} catch (AbstractInjector.AmbiguousComponentResolutionException expected) {
String doc = DependsOnCollection.class.getName();
assertEquals(
- "class "
+ "ConstructorInjector-class "
+ doc
- + " needs a 'java.util.Collection' injected via 'public org.picocontainer.DefaultPicoContainerTestCase$DependsOnCollection(java.util.Collection)', but there are too many choices to inject. These:[class java.util.ArrayList, class java.util.LinkedList], refer http://picocontainer.org/ambiguous-injectable-help.html",
+ + " needs a 'java.util.Collection' injected via 'public org.picocontainer.DefaultPicoContainerTestCase$DependsOnCollection(java.util.Collection)', but there are too many choices to inject. These:[Instance-of java.util.ArrayList, Instance-of java.util.LinkedList], refer http://picocontainer.org/ambiguous-injectable-help.html",
expected.getMessage());
}
}
Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/behaviors/AdaptingBehaviorTestCase.java (5829 => 5830)
--- java/2.x/trunk/pico/container/src/test/org/picocontainer/behaviors/AdaptingBehaviorTestCase.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/behaviors/AdaptingBehaviorTestCase.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -9,17 +9,7 @@
*****************************************************************************/
package org.picocontainer.behaviors;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
+import com.thoughtworks.xstream.XStream;
import org.junit.Test;
import org.picocontainer.Characteristics;
import org.picocontainer.ComponentAdapter;
@@ -30,8 +20,17 @@
import org.picocontainer.lifecycle.NullLifecycleStrategy;
import org.picocontainer.monitors.NullComponentMonitor;
-import com.thoughtworks.xstream.XStream;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
@SuppressWarnings("serial")
public class AdaptingBehaviorTestCase {
@@ -198,7 +197,7 @@
assertTrue(foo.indexOf("<" + Cached.class.getName() + ">", 0) > -1); // xml does start with CB
assertFalse(foo.indexOf("<" + Cached.class.getName() + ">", 1) > -1); // but only contains it once.
- assertEquals("Cached:Hidden:Synchronized:Instance-interface java.util.Map",ca.toString());
+ assertEquals("Cached:Hidden:Synchronized:Instance-of java.util.Map",ca.toString());
}
Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedMethodInjectorTestCase.java (5829 => 5830)
--- java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedMethodInjectorTestCase.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/injectors/NamedMethodInjectorTestCase.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -48,9 +48,9 @@
.getComponent(Windmill.class);
fail("should have barfed");
} catch (AbstractInjector.AmbiguousComponentResolutionException e) {
- Assert.assertEquals(Windmill.class + " needs a 'java.lang.String' injected via 'public void org.picocontainer.injectors.NamedMethodInjectorTestCase$Windmill.setWind(java.lang.String)', " +
+ Assert.assertEquals("NamedMethodInjection:" + Windmill.class + " needs a 'java.lang.String' injected via 'public void org.picocontainer.injectors.NamedMethodInjectorTestCase$Windmill.setWind(java.lang.String)', " +
"but there are too many choices to inject. " +
- "These:[class java.lang.String, class java.lang.String], " +
+ "These:[Instance-attemptToConfusePicoContainer, Instance-woo look here another], " +
"refer http://picocontainer.org/ambiguous-injectable-help.html", e.getMessage());
}
}
Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/tck/AbstractPicoContainerTest.java (5829 => 5830)
--- java/2.x/trunk/pico/container/src/test/org/picocontainer/tck/AbstractPicoContainerTest.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/tck/AbstractPicoContainerTest.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -9,43 +9,12 @@
*****************************************************************************/
package org.picocontainer.tck;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import org.picocontainer.injectors.IterativeInjector;
-import org.picocontainer.parameters.ComponentParameter;
-
-import org.picocontainer.Converting;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
import org.junit.Test;
import org.picocontainer.Behavior;
import org.picocontainer.Characteristics;
import org.picocontainer.ComponentAdapter;
import org.picocontainer.ComponentFactory;
+import org.picocontainer.Converting;
import org.picocontainer.DefaultPicoContainer;
import org.picocontainer.Disposable;
import org.picocontainer.MutablePicoContainer;
@@ -61,12 +30,13 @@
import org.picocontainer.behaviors.AbstractBehavior;
import org.picocontainer.behaviors.AdaptingBehavior;
import org.picocontainer.injectors.AbstractInjector;
-import org.picocontainer.injectors.ConstructorInjector;
import org.picocontainer.injectors.AbstractInjector.UnsatisfiableDependenciesException;
+import org.picocontainer.injectors.ConstructorInjector;
import org.picocontainer.injectors.SingleMemberInjector.ParameterCannotBeNullException;
import org.picocontainer.lifecycle.NullLifecycleStrategy;
import org.picocontainer.monitors.NullComponentMonitor;
import org.picocontainer.parameters.BasicComponentParameter;
+import org.picocontainer.parameters.ComponentParameter;
import org.picocontainer.parameters.ConstantParameter;
import org.picocontainer.parameters.NullParameter;
import org.picocontainer.testmodel.DependsOnTouchable;
@@ -78,6 +48,31 @@
import org.picocontainer.visitors.TraversalCheckingVisitor;
import org.picocontainer.visitors.VerifyingVisitor;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+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;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
/** This test tests (at least it should) all the methods in MutablePicoContainer. */
@SuppressWarnings("serial")
public abstract class AbstractPicoContainerTest {
@@ -841,8 +836,8 @@
fail("DependsOnTouchable should have been confused about the two Touchables");
} catch (AbstractInjector.AmbiguousComponentResolutionException e) {
List componentImplementations = Arrays.asList(e.getAmbiguousComponentKeys());
- assertTrue(componentImplementations.contains(DerivedTouchable.class));
- assertTrue(componentImplementations.contains(SimpleTouchable.class));
+ assertTrue(componentImplementations.contains("ConstructorInjector-" + DerivedTouchable.class));
+ assertTrue(componentImplementations.contains("ConstructorInjector-" + SimpleTouchable.class));
assertTrue(e.getMessage().indexOf(DerivedTouchable.class.getName()) != -1);
assertTrue(e.getMessage().indexOf("public org.picocontainer.testmodel.DependsOnTouchable(org.picocontainer.testmodel.Touchable)") != -1);
Modified: java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/constraints/AbstractConstraint.java (5829 => 5830)
--- java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/constraints/AbstractConstraint.java 2012-10-18 13:54:38 UTC (rev 5829)
+++ java/2.x/trunk/pico/gems/src/java/org/picocontainer/gems/constraints/AbstractConstraint.java 2012-10-18 15:10:59 UTC (rev 5830)
@@ -8,17 +8,21 @@
package org.picocontainer.gems.constraints;
+import org.picocontainer.Behavior;
import org.picocontainer.ComponentAdapter;
+import org.picocontainer.LifecycleStrategy;
import org.picocontainer.NameBinding;
+import org.picocontainer.Parameter;
+import org.picocontainer.PicoCompositionException;
import org.picocontainer.PicoContainer;
-import org.picocontainer.PicoCompositionException;
-import org.picocontainer.Parameter;
+import org.picocontainer.adapters.InstanceAdapter;
import org.picocontainer.injectors.AbstractInjector;
import org.picocontainer.parameters.CollectionComponentParameter;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Array;
import java.lang.reflect.Type;
-import java.lang.annotation.Annotation;
+import java.util.Collection;
import java.util.Map;
/**
@@ -71,11 +75,25 @@
final Map<Object, ComponentAdapter<?>> map =
super.getMatchingComponentAdapters(container, adapter, keyType, valueType);
if (map.size() > 1) {
- throw new AbstractInjector.AmbiguousComponentResolutionException(valueType, map.keySet().toArray(new Object[map.size()]));
+ String[] foundStrings = makeFoundAmbiguousStrings(map.values());
+ throw new AbstractInjector.AmbiguousComponentResolutionException(valueType, foundStrings);
}
return map;
}
+ public static String[] makeFoundAmbiguousStrings(Collection<ComponentAdapter<?>> found) {
+ String[] foundStrings = new String[found.size()];
+ int ix = 0;
+ for (ComponentAdapter<?> f : found) {
+ while (f instanceof Behavior || (f instanceof LifecycleStrategy && !(f instanceof InstanceAdapter))) {
+ f = f.getDelegate();
+ }
+ foundStrings[ix++] = f.toString();
+ }
+ return foundStrings;
+ }
+
+
private Type getArrayType(final Class expectedType) {
return Array.newInstance(expectedType, 0).getClass();
}
----------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email