private <T> AbstractInjector.AmbiguousComponentResolutionException tooManyMatchingAdaptersFound(final Generic<T> expectedType, final List<ComponentAdapter<T>> found) { Class[] foundClasses = new Class[found.size()]; for (int i = 0; i < foundClasses.length; i++) { foundClasses[i] = found.get(i).getComponentImplementation(); } AbstractInjector.AmbiguousComponentResolutionException exception = new AbstractInjector.AmbiguousComponentResolutionException(expectedType, foundClasses); return exception; }
msg.append(Arrays.asList(getAmbiguousComponentKeys())); msg.append(", refer http://picocontainer.org/ambiguous-injectable-help.html"); return msg.toString();
protected List<Method> getInjectorMethods() { Class<?> toIntrospect = null; //Method[] methods = new Method[0]; try { //methods = super.getComponentImplementation().getMethods(); toIntrospect = super.getComponentImplementation(); } catch (AmbiguousComponentResolutionException e) { e.setComponent(getComponentImplementation()); throw e; } if (toIntrospect == null) { throw new NullPointerException("No implementation class defined for " + this); } HashMap<String, Set<Method>> allMethodsAnalyzed = new HashMap<String,Set<Method>>(); List<Method> methodz = new ArrayList<Method>(); recursiveCheckInjectorMethods(toIntrospect, toIntrospect, methodz, allMethodsAnalyzed); //Inject in JSR330 compliant order. Collections.sort(methodz, new JSR330AccessibleObjectOrderComparator()); return methodz; }
e.setMember(sortedMatchingConstructor); e.setParameterNumber(lastParameterTested); throw e;
e.setMember(sortedMatchingConstructor); e.setParameterNumber(lastParameterTested); throw e;
msg.append(Arrays.asList(getAmbiguousComponentKeys())); msg.append(", refer http://picocontainer.org/ambiguous-injectable-help.html"); return msg.toString();
throw new AbstractInjector.AmbiguousComponentResolutionException(componentType, foundClasses);
throw new AbstractInjector.AmbiguousComponentResolutionException(componentType, foundClasses);
private boolean matchParameter(final PicoContainer container, final List<Object> matchingParameterList, final AccessibleObjectParameterSet parameter) { for (int j = 0; j < injectionTypes.length; j++) { Object o = matchingParameterList.get(j); AccessibleObject targetInjectionMember = getTargetInjectionMember(injectionMembers, j, parameter.getParams()[0]); if (targetInjectionMember == null) { return false; } AccessibleObjectParameterSet paramToUse = getParameterToUseForObject(targetInjectionMember, parameter); if (paramToUse == null) { paramToUse = constructAccessibleObjectParameterSet(targetInjectionMember); } try { if (o == null && paramToUse.getParams()[0].resolve(container, this, null, injectionTypes[j], makeParameterNameImpl(targetInjectionMember), useNames(), bindings[j]).isResolved()) { matchingParameterList.set(j, new ParameterToAccessibleObjectPair(targetInjectionMember, paramToUse)); return true; } } catch (AmbiguousComponentResolutionException e) { e.setComponent(getComponentImplementation()); e.setMember(injectionMembers.get(j)); throw e; } } return false; }
private boolean matchParameter(final PicoContainer container, final List<Object> matchingParameterList, final AccessibleObjectParameterSet parameter) { for (int j = 0; j < injectionTypes.length; j++) { Object o = matchingParameterList.get(j); AccessibleObject targetInjectionMember = getTargetInjectionMember(injectionMembers, j, parameter.getParams()[0]); if (targetInjectionMember == null) { return false; } AccessibleObjectParameterSet paramToUse = getParameterToUseForObject(targetInjectionMember, parameter); if (paramToUse == null) { paramToUse = constructAccessibleObjectParameterSet(targetInjectionMember); } try { if (o == null && paramToUse.getParams()[0].resolve(container, this, null, injectionTypes[j], makeParameterNameImpl(targetInjectionMember), useNames(), bindings[j]).isResolved()) { matchingParameterList.set(j, new ParameterToAccessibleObjectPair(targetInjectionMember, paramToUse)); return true; } } catch (AmbiguousComponentResolutionException e) { e.setComponent(getComponentImplementation()); e.setMember(injectionMembers.get(j)); throw e; } } return false; }
protected Object[] getMemberArguments(final PicoContainer container, final AccessibleObject member, final Type[] parameterTypes, final Annotation[] bindings, final Type into) { boxParameters(parameterTypes); //Object[] result = new Object[parameterTypes.length]; List<Object> result = new ArrayList<Object>(parameterTypes.length); AccessibleObjectParameterSet objectParameterSet = this.getParameterToUseForObject(member, parameters); Parameter[] currentParameters = objectParameterSet.getParams(); for (int i = 0; i < currentParameters.length; i++) { try { Object parameterResult = getParameter(container, member, i, parameterTypes[i], bindings[i], currentParameters[i], null, into); if (parameterResult != Parameter.NULL_RESULT) { result.add(parameterResult); } } catch (AmbiguousComponentResolutionException e) { e.setComponent(getComponentImplementation()); e.setMember(member); e.setParameterNumber(i); throw e; } } return result.toArray(); }
protected Object[] getMemberArguments(final PicoContainer container, final AccessibleObject member, final Type[] parameterTypes, final Annotation[] bindings, final Type into) { boxParameters(parameterTypes); //Object[] result = new Object[parameterTypes.length]; List<Object> result = new ArrayList<Object>(parameterTypes.length); AccessibleObjectParameterSet objectParameterSet = this.getParameterToUseForObject(member, parameters); Parameter[] currentParameters = objectParameterSet.getParams(); for (int i = 0; i < currentParameters.length; i++) { try { Object parameterResult = getParameter(container, member, i, parameterTypes[i], bindings[i], currentParameters[i], null, into); if (parameterResult != Parameter.NULL_RESULT) { result.add(parameterResult); } } catch (AmbiguousComponentResolutionException e) { e.setComponent(getComponentImplementation()); e.setMember(member); e.setParameterNumber(i); throw e; } } return result.toArray(); }
protected List<Method> getInjectorMethods() { Class<?> toIntrospect = null; //Method[] methods = new Method[0]; try { //methods = super.getComponentImplementation().getMethods(); toIntrospect = super.getComponentImplementation(); } catch (AmbiguousComponentResolutionException e) { e.setComponent(getComponentImplementation()); throw e; } if (toIntrospect == null) { throw new NullPointerException("No implementation class defined for " + this); } HashMap<String, Set<Method>> allMethodsAnalyzed = new HashMap<String,Set<Method>>(); List<Method> methodz = new ArrayList<Method>(); recursiveCheckInjectorMethods(toIntrospect, toIntrospect, methodz, allMethodsAnalyzed); //Inject in JSR330 compliant order. Collections.sort(methodz, new JSR330AccessibleObjectOrderComparator()); return methodz; }
private CtorAndAdapters<T> getGreediestSatisfiableConstructor(final PicoContainer guardedContainer, final Class<? extends T> impl) { CtorAndAdapters<T> ctor = null; try { if (chosenConstructor == null) { ctor = getGreediestSatisfiableConstructor(guardedContainer); } if (rememberChosenConstructor) { if (chosenConstructor == null) { chosenConstructor = ctor; } else { ctor = chosenConstructor; } } } catch (AmbiguousComponentResolutionException e) { e.setComponent(getComponentImplementation()); throw e; } return ctor; }
private CtorAndAdapters<T> getGreediestSatisfiableConstructor(final PicoContainer guardedContainer, final Class<? extends T> impl) { CtorAndAdapters<T> ctor = null; try { if (chosenConstructor == null) { ctor = getGreediestSatisfiableConstructor(guardedContainer); } if (rememberChosenConstructor) { if (chosenConstructor == null) { chosenConstructor = ctor; } else { ctor = chosenConstructor; } } } catch (AmbiguousComponentResolutionException e) { e.setComponent(getComponentImplementation()); throw e; } return ctor; }
@Test public void testAmbiguousDependencies() throws PicoCompositionException { MutablePicoContainer pico = this.createPicoContainer(null); // Register two Touchables that Fred will be confused about pico.addComponent(SimpleTouchable.class); pico.addComponent(DerivedTouchable.class); // Register a confused DependsOnTouchable pico.addComponent(DependsOnTouchable.class); try { pico.getComponent(DependsOnTouchable.class); fail("DependsOnTouchable should have been confused about the two Touchables"); } catch (AbstractInjector.AmbiguousComponentResolutionException e) { List impls = Arrays.asList(e.getAmbiguousComponentKeys()); assertTrue(impls.contains(DerivedTouchable.class)); assertTrue(impls.contains(SimpleTouchable.class)); assertTrue(e.getMessage().indexOf(DerivedTouchable.class.getName()) != -1); assertTrue(e.getMessage().indexOf("public com.picocontainer.testmodel.DependsOnTouchable(com.picocontainer.testmodel.Touchable)") != -1); } }
@Test public void testAmbiguousResolution() throws PicoCompositionException { MutablePicoContainer pico = createPicoContainer(null); pico.addComponent("ping", String.class); pico.addComponent("pong", "pang"); try { pico.getComponent(String.class); } catch (AbstractInjector.AmbiguousComponentResolutionException e) { assertTrue(e.getMessage().indexOf("java.lang.String") != -1); assertTrue(e.getMessage().indexOf("<not-specified>") != -1); assertTrue(e.getMessage().indexOf("<unknown>") != -1); } }
@Override protected Map<Object, ComponentAdapter<?>> getMatchingComponentAdapters(final PicoContainer container, final ComponentAdapter adapter, final Class keyType, final Generic<?> valueType) { 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()])); } return map; }
private <T> AbstractInjector.AmbiguousComponentResolutionException tooManyMatchingAdaptersFound(final Generic<T> expectedType, final List<ComponentAdapter<T>> found) { Class[] foundClasses = new Class[found.size()]; for (int i = 0; i < foundClasses.length; i++) { foundClasses[i] = found.get(i).getComponentImplementation(); } AbstractInjector.AmbiguousComponentResolutionException exception = new AbstractInjector.AmbiguousComponentResolutionException(expectedType, foundClasses); return exception; }