private Collection<MetaMethod> getAllDisposesMethods(final MetaClass type, final boolean staticOnly) { final Collection<MetaMethod> disposers = new ArrayList<>(); for (final MetaMethod method : type.getMethods()) { if (staticOnly && !method.isStatic()) { continue; } final List<MetaParameter> disposerParams = method.getParametersAnnotatedWith(Disposes.class); if (disposerParams.size() > 1) { throw new RuntimeException("Found method " + method + " in " + method.getDeclaringClassName() + " with multiple @Disposes parameters."); } else if (disposerParams.size() == 1) { disposers.add(method); } } return disposers; }
@Override public List<MetaParameter> getParametersAnnotatedWith(final Class<? extends Annotation> annotation) { final List<MetaParameter> methods = new ArrayList<>(); MetaClass scanTarget = this; while (scanTarget != null) { for (final MetaConstructor m : scanTarget.getDeclaredConstructors()) { methods.addAll(m.getParametersAnnotatedWith(annotation)); } for (final MetaMethod m : scanTarget.getDeclaredMethods()) { methods.addAll(m.getParametersAnnotatedWith(annotation)); } scanTarget = scanTarget.getSuperClass(); } return methods; }
@Override public List<MetaParameter> getParametersAnnotatedWith(final Class<? extends Annotation> annotation) { final List<MetaParameter> methods = new ArrayList<>(); MetaClass scanTarget = this; while (scanTarget != null) { for (final MetaConstructor m : scanTarget.getDeclaredConstructors()) { methods.addAll(m.getParametersAnnotatedWith(annotation)); } for (final MetaMethod m : scanTarget.getDeclaredMethods()) { methods.addAll(m.getParametersAnnotatedWith(annotation)); } scanTarget = scanTarget.getSuperClass(); } return methods; }
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 Statement[] getDisposerParams(final MetaMethod disposer, final Collection<Dependency> disposerParams, final BuildMetaClass factory) { final Statement[] params = new Statement[disposer.getParameters().length]; for (final Dependency dep : disposerParams) { final ParamDependency paramDep = (ParamDependency) dep; final ContextualStatementBuilder paramInstance = castTo(paramDep.getInjectable().getInjectedType(), loadVariable("contextManager").invoke("getInstance", paramDep.getInjectable().getFactoryName())); final ContextualStatementBuilder paramExpression; if (paramDep.getInjectable().getWiringElementTypes().contains(WiringElementType.DependentBean)) { paramExpression = loadVariable("this").invoke("registerDependentScopedReference", loadVariable("instance"), paramInstance); } else { paramExpression = paramInstance; } params[paramDep.getParamIndex()] = paramExpression; } final MetaParameter disposesParam = disposer.getParametersAnnotatedWith(Disposes.class).get(0); params[disposesParam.getIndex()] = loadVariable("instance"); return params; }