[picocontainer-scm] [5777] java/2.x/trunk/pico/container/src/test/org/picocontainer: embellish AmbiguousComponentResolutionException with ctor or method being injected into
paul-yCVjj/[email protected] Fri, 11 Mar 2011 13:14:34 -0600 (CST)
| Newsgroups | gmane.comp.java.picocontainer.cvs |
|---|---|
| Message-ID | <[email protected]> |
Revision 5777
Author paul
Date 2011-03-11 13:14:33 -0600 (Fri, 11 Mar 2011)
Log Message
embellish AmbiguousComponentResolutionException with ctor or method being injected into
Modified Paths
- 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/test/org/picocontainer/DefaultPicoContainerTestCase.java
- java/2.x/trunk/pico/container/src/test/org/picocontainer/tck/AbstractPicoContainerTest.java
Diff
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/AbstractInjector.java (5776 => 5777)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/AbstractInjector.java 2011-03-09 04:03:34 UTC (rev 5776)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/AbstractInjector.java 2011-03-11 19:14:33 UTC (rev 5777)
@@ -19,6 +19,7 @@
import org.picocontainer.adapters.AbstractAdapter;
import org.picocontainer.parameters.ComponentParameter;
+import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Member;
@@ -325,6 +326,7 @@
private Class<?> component;
private final Class<?> ambiguousDependency;
private final Object[] ambiguousComponentKeys;
+ private AccessibleObject accessibleObject;
/**
@@ -349,7 +351,9 @@
msg.append(component != null ? component : "<no-component>");
msg.append(" needs a '");
msg.append(ambiguousDependency.getName());
- msg.append("' injected, but there are too many choices to inject. These:");
+ msg.append("' injected via '");
+ msg.append(accessibleObject != null ? accessibleObject : "<unknown>");
+ msg.append("', but there are too many choices to inject. These:");
msg.append(Arrays.asList(getAmbiguousComponentKeys()));
msg.append(", refer http://picocontainer.org/ambiguous-injectable-help.html");
return msg.toString();
@@ -365,6 +369,10 @@
public void setComponent(final Class<?> component) {
this.component = component;
}
+
+ public void setMember(AccessibleObject accessibleObject) {
+ this.accessibleObject = accessibleObject;
+ }
}
/**
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/ConstructorInjector.java (5776 => 5777)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/ConstructorInjector.java 2011-03-09 04:03:34 UTC (rev 5776)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/ConstructorInjector.java 2011-03-11 19:14:33 UTC (rev 5777)
@@ -137,50 +137,56 @@
int lastSatisfiableConstructorSize = -1;
Type unsatisfiedDependencyType = null;
for (final Constructor<T> sortedMatchingConstructor : sortedMatchingConstructors) {
- boolean failedDependency = false;
- Type[] parameterTypes = sortedMatchingConstructor.getGenericParameterTypes();
- fixGenericParameterTypes(sortedMatchingConstructor, parameterTypes);
- Annotation[] bindings = getBindings(sortedMatchingConstructor.getParameterAnnotations());
- final Parameter[] currentParameters = parameters != null ? parameters : createDefaultParameters(parameterTypes);
- final ComponentAdapter<?>[] currentAdapters = new ComponentAdapter<?>[currentParameters.length];
- // remember: all constructors with less arguments than the given parameters are filtered out already
- for (int j = 0; j < currentParameters.length; j++) {
- // check whether this constructor is satisfiable
- Type expectedType = box(parameterTypes[j]);
- NameBinding expectedNameBinding = new ParameterNameBinding(getParanamer(), sortedMatchingConstructor, j);
- ResolverKey resolverKey = new ResolverKey(expectedType, useNames() ? expectedNameBinding.getName() : null, useNames(), bindings[j], currentParameters[j]);
- Parameter.Resolver resolver = resolvers.get(resolverKey);
- if (resolver == null) {
- resolver = currentParameters[j].resolve(container, this, null, expectedType, expectedNameBinding, useNames(), bindings[j]);
- resolvers.put(resolverKey, resolver);
+ try {
+ boolean failedDependency = false;
+ Type[] parameterTypes = sortedMatchingConstructor.getGenericParameterTypes();
+ fixGenericParameterTypes(sortedMatchingConstructor, parameterTypes);
+ Annotation[] bindings = getBindings(sortedMatchingConstructor.getParameterAnnotations());
+ final Parameter[] currentParameters = parameters != null ? parameters : createDefaultParameters(parameterTypes);
+ final ComponentAdapter<?>[] currentAdapters = new ComponentAdapter<?>[currentParameters.length];
+ // remember: all constructors with less arguments than the given parameters are filtered out already
+ for (int j = 0; j < currentParameters.length; j++) {
+ // check whether this constructor is satisfiable
+ Type expectedType = box(parameterTypes[j]);
+ NameBinding expectedNameBinding = new ParameterNameBinding(getParanamer(), sortedMatchingConstructor, j);
+ ResolverKey resolverKey = new ResolverKey(expectedType, useNames() ? expectedNameBinding.getName() : null, useNames(), bindings[j], currentParameters[j]);
+ Parameter.Resolver resolver = resolvers.get(resolverKey);
+ if (resolver == null) {
+ resolver = currentParameters[j].resolve(container, this, null, expectedType, expectedNameBinding, useNames(), bindings[j]);
+ resolvers.put(resolverKey, resolver);
+ }
+ if (resolver.isResolved()) {
+ currentAdapters[j] = resolver.getComponentAdapter();
+ continue;
+ }
+ unsatisfiableDependencyTypes.add(Arrays.asList(parameterTypes));
+ unsatisfiedDependencyType = box(parameterTypes[j]);
+ failedDependency = true;
+ break;
}
- if (resolver.isResolved()) {
- currentAdapters[j] = resolver.getComponentAdapter();
- continue;
+
+ if (greediestConstructor != null && parameterTypes.length != lastSatisfiableConstructorSize) {
+ if (conflicts.isEmpty()) {
+ // we found our match [aka. greedy and satisfied]
+ return new CtorAndAdapters<T>(greediestConstructor, greediestConstructorsParameters, greediestConstructorsParametersComponentAdapters);
+ }
+ // fits although not greedy
+ conflicts.add(sortedMatchingConstructor);
+ } else if (!failedDependency && lastSatisfiableConstructorSize == parameterTypes.length) {
+ // satisfied and same size as previous one?
+ conflicts.add(sortedMatchingConstructor);
+ conflicts.add(greediestConstructor);
+ } else if (!failedDependency) {
+ greediestConstructor = sortedMatchingConstructor;
+ greediestConstructorsParameters = currentParameters;
+ greediestConstructorsParametersComponentAdapters = currentAdapters;
+ lastSatisfiableConstructorSize = parameterTypes.length;
}
- unsatisfiableDependencyTypes.add(Arrays.asList(parameterTypes));
- unsatisfiedDependencyType = box(parameterTypes[j]);
- failedDependency = true;
- break;
+ } catch (AmbiguousComponentResolutionException e) {
+ // embellish with the constructor being injected into.
+ e.setMember(sortedMatchingConstructor);
+ throw e;
}
-
- if (greediestConstructor != null && parameterTypes.length != lastSatisfiableConstructorSize) {
- if (conflicts.isEmpty()) {
- // we found our match [aka. greedy and satisfied]
- return new CtorAndAdapters<T>(greediestConstructor, greediestConstructorsParameters, greediestConstructorsParametersComponentAdapters);
- }
- // fits although not greedy
- conflicts.add(sortedMatchingConstructor);
- } else if (!failedDependency && lastSatisfiableConstructorSize == parameterTypes.length) {
- // satisfied and same size as previous one?
- conflicts.add(sortedMatchingConstructor);
- conflicts.add(greediestConstructor);
- } else if (!failedDependency) {
- greediestConstructor = sortedMatchingConstructor;
- greediestConstructorsParameters = currentParameters;
- greediestConstructorsParametersComponentAdapters = currentAdapters;
- lastSatisfiableConstructorSize = parameterTypes.length;
- }
}
if (!conflicts.isEmpty()) {
throw new PicoCompositionException(conflicts.size() + " satisfiable constructors is too many for '"+getComponentImplementation()+"'. Constructor List:" + conflicts.toString().replace(getComponentImplementation().getName(),"<init>").replace("public <i","<i"));
Modified: java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java (5776 => 5777)
--- java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java 2011-03-09 04:03:34 UTC (rev 5776)
+++ java/2.x/trunk/pico/container/src/java/org/picocontainer/injectors/IterativeInjector.java 2011-03-11 19:14:33 UTC (rev 5777)
@@ -123,6 +123,7 @@
}
} catch (AmbiguousComponentResolutionException e) {
e.setComponent(getComponentImplementation());
+ e.setMember(injectionMembers.get(j));
throw e;
}
}
Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/DefaultPicoContainerTestCase.java (5776 => 5777)
--- java/2.x/trunk/pico/container/src/test/org/picocontainer/DefaultPicoContainerTestCase.java 2011-03-09 04:03:34 UTC (rev 5776)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/DefaultPicoContainerTestCase.java 2011-03-11 19:14:33 UTC (rev 5777)
@@ -221,7 +221,7 @@
assertEquals(
"class "
+ doc
- + " needs a 'java.util.Collection' injected, 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:[class java.util.ArrayList, class java.util.LinkedList], refer http://picocontainer.org/ambiguous-injectable-help.html",
expected.getMessage());
}
}
Modified: java/2.x/trunk/pico/container/src/test/org/picocontainer/tck/AbstractPicoContainerTest.java (5776 => 5777)
--- java/2.x/trunk/pico/container/src/test/org/picocontainer/tck/AbstractPicoContainerTest.java 2011-03-09 04:03:34 UTC (rev 5776)
+++ java/2.x/trunk/pico/container/src/test/org/picocontainer/tck/AbstractPicoContainerTest.java 2011-03-11 19:14:33 UTC (rev 5777)
@@ -203,6 +203,7 @@
} catch (AbstractInjector.AmbiguousComponentResolutionException e) {
assertTrue(e.getMessage().indexOf("java.lang.String") != -1);
assertTrue(e.getMessage().indexOf("<no-component>") != -1);
+ assertTrue(e.getMessage().indexOf("<unknown>") != -1);
}
}
@@ -870,6 +871,7 @@
assertTrue(componentImplementations.contains(SimpleTouchable.class));
assertTrue(e.getMessage().indexOf(DerivedTouchable.class.getName()) != -1);
+ assertTrue(e.getMessage().indexOf("public org.picocontainer.testmodel.DependsOnTouchable(org.picocontainer.testmodel.Touchable)") != -1);
}
}
----------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email