private void processProducerAndDisposerMethodsDependencies(final DependencyGraphBuilder builder, final Collection<MetaMethod> disposesMethods, final MetaMethod method, final Injectable producedInjectable) { final MetaParameter[] params = method.getParameters(); for (int i = 0; i < params.length; i++) { final MetaParameter param = params[i]; builder.addProducerParamDependency(producedInjectable, param.getType(), qualFactory.forSink(param), i, param); } final Collection<MetaMethod> matchingDisposes = getMatchingMethods(method, disposesMethods); if (matchingDisposes.size() > 1) { // TODO descriptive message with names of disposers found. throw new RuntimeException(); } else if (!matchingDisposes.isEmpty()) { addDisposerDependencies(producedInjectable, matchingDisposes.iterator().next(), builder); } }
private void addConstructorInjectionPoints(final Injectable concreteInjectable, final MetaConstructor injectableConstructor, final DependencyGraphBuilder builder) { final MetaParameter[] params = injectableConstructor.getParameters(); for (int i = 0; i < params.length; i++) { final MetaParameter param = params[i]; builder.addConstructorDependency(concreteInjectable, param.getType(), qualFactory.forSink(param), i, param); } }
private Collection<MetaMethod> getMatchingMethods(final MetaClassMember member, final Collection<MetaMethod> disposesMethods) { final Collection<MetaMethod> matching = new ArrayList<>(); final Qualifier memberQual = qualFactory.forSource(member); final MetaClass producedType = getProducedType(member); for (final MetaMethod candidate : disposesMethods) { final MetaParameter disposesParam = candidate.getParametersAnnotatedWith(Disposes.class).iterator().next(); if (producedType.isAssignableTo(disposesParam.getType())) { final Qualifier paramQual = qualFactory.forSink(disposesParam); if (paramQual.isSatisfiedBy(memberQual)) { matching.add(candidate); } } } return matching; }
private void addDisposerDependencies(final Injectable producedInjectable, final MetaMethod disposer, final DependencyGraphBuilder builder) { for (final MetaParameter param : disposer.getParameters()) { if (param.isAnnotationPresent(Disposes.class)) { builder.addDisposesMethodDependency(producedInjectable, disposer.getDeclaringClass(), qualFactory.forSink(disposer.getDeclaringClass()), disposer); } else { builder.addDisposesParamDependency(producedInjectable, param.getType(), qualFactory.forSink(param), param.getIndex(), param); } } }
private void addFieldInjectionPoints(final Injectable typeInjectable, final DependencyGraphBuilder builder, final List<String> problems) { final boolean noPublicFieldsAllowed = typeInjectable.getWiringElementTypes().contains(WiringElementType.NormalScopedBean); final MetaClass type = typeInjectable.getInjectedType(); final Collection<Class<? extends Annotation>> injectAnnotations = injectionContext.getAnnotationsForElementType(WiringElementType.InjectionPoint); for (final Class<? extends Annotation> inject : injectAnnotations) { for (final MetaField field : type.getFieldsAnnotatedWith(inject)) { if (noPublicFieldsAllowed && field.isPublic()) { problems.add("The normal scoped bean " + type.getFullyQualifiedName() + " has a public field " + field.getName()); } builder.addFieldDependency(typeInjectable, field.getType(), qualFactory.forSink(field), field); } } }
private void addMethodInjectionPoints(final Injectable typeInjectable, final DependencyGraphBuilder builder, final List<String> problems) { final MetaClass type = typeInjectable.getInjectedType(); final Collection<Class<? extends Annotation>> injectAnnotations = injectionContext.getAnnotationsForElementType(WiringElementType.InjectionPoint); for (final Class<? extends Annotation> inject : injectAnnotations) { for (final MetaMethod setter : type.getMethodsAnnotatedWith(inject)) { if (setter.getParameters().length != 1) { problems.add("The method injection point " + setter.getName() + " in " + setter.getDeclaringClass().getFullyQualifiedName() + " should have exactly one parameter, not " + setter.getParameters().length + "."); } else { final MetaParameter metaParam = setter.getParameters()[0]; builder.addSetterMethodDependency(typeInjectable, metaParam.getType(), qualFactory.forSink(setter.getParameters()[0]), setter); } } } }