@Override public Optional<HasAnnotations> getAnnotatedObject() { switch (injectableType) { case Type: return Optional.of(type); case Producer: case Static: case Provider: case ContextualProvider: return dependencies .stream() .filter(dep -> DependencyType.ProducerMember.equals(dep.dependencyType)) .map(dep -> (HasAnnotations) ((ProducerInstanceDependency) dep).getProducingMember()) .findFirst(); case ExtensionProvided: case Extension: case JsType: case Disabled: default: return Optional.empty(); } }
static String ambiguousDependencyMessage(final BaseDependency dep, final Injectable concrete, final List<InjectableImpl> resolved) { final StringBuilder messageBuilder = new StringBuilder(); messageBuilder.append("Ambiguous resolution for ") .append(dep.dependencyType.toString().toLowerCase()) .append(" ") .append(dep.injectable) .append(" in ") .append(concrete) .append(".\n") .append("Resolved types:\n") .append(resolved.get(0)); for (int i = 1; i < resolved.size(); i++) { messageBuilder.append(", ") .append(resolved.get(i)); } return messageBuilder.toString(); }
private static void validateDependentScopedInjectable(final Injectable injectable, final Set<Injectable> visiting, final Set<Injectable> visited, final Collection<String> problems, final boolean onlyConstuctorDeps) { if (InjectableType.Disabled.equals(injectable.getInjectableType())) { visited.add(injectable); return; } if (visiting.contains(injectable)) { problems.add(createCycleMessage(visiting, injectable)); return; } visiting.add(injectable); for (final Dependency dep : injectable.getDependencies()) { if (onlyConstuctorDeps && !dep.getDependencyType().equals(DependencyType.Constructor)) { continue; } final Injectable resolved = GraphUtil.getResolvedDependency(dep, injectable); if (!visited.contains(resolved)) { if (dep.getDependencyType().equals(DependencyType.ProducerMember)) { validateDependentScopedInjectable(resolved, visiting, visited, problems, true); } else if (resolved.getWiringElementTypes().contains(WiringElementType.PseudoScopedBean)) { validateDependentScopedInjectable(resolved, visiting, visited, problems, false); } } } visiting.remove(injectable); visited.add(injectable); }
static String unsatisfiedDependencyMessage(final BaseDependency dep, final Injectable concrete, final Collection<Injectable> resolvedDisabledBeans) { final StringBuilder message = new StringBuilder() .append("Unsatisfied ") .append(dep.dependencyType.toString().toLowerCase()) .append(" dependency ") .append(dep.injectable) .append(" for ") .append(concrete) .append('.'); if (!resolvedDisabledBeans.isEmpty()) { message.append(" Some beans were found that satisfied this dependency, but must be enabled:\n"); resolvedDisabledBeans.stream().forEach(inj -> message .append(inj.getInjectedType().getFullyQualifiedName()).append('\n')); } return message.toString(); }
protected Injectable getProviderInjectable(final Injectable depInjectable) { for (final Dependency dep : depInjectable.getDependencies()) { if (dep.getDependencyType().equals(DependencyType.ProducerMember)) { final MetaClass providerType = dep.getInjectable().getInjectedType(); if (providerType.isAssignableTo(getProviderRawType())) { return dep.getInjectable(); } else { throw new RuntimeException("Unrecognized contextual provider type " + providerType.getFullyQualifiedName()); } } } throw new RuntimeException(); }
private MetaConstructor getAccessibleConstructor(final Injectable injectable) { final MetaClass type = injectable.getInjectedType(); final MetaConstructor noArgConstr = getAccessibleNoArgConstructor(type); if (noArgConstr != null) { return noArgConstr; } for (final Dependency dep : injectable.getDependencies()) { if (dep.getDependencyType().equals(DependencyType.Constructor)) { final MetaConstructor injectableConstr = (MetaConstructor) ((ParamDependency) dep).getParameter().getDeclaringMember(); return (injectableConstr.isPublic() || injectableConstr.isProtected()) ? injectableConstr : null; } } return null; }
@Override public String toString() { return "[dependencyType=" + dependencyType.toString() + ", reference=" + injectable.toString() + "]"; }
static ProducerInstanceDependencyImpl findProducerInstanceDep(final InjectableImpl injectable) { for (final BaseDependency dep : injectable.dependencies) { if (dep.dependencyType.equals(DependencyType.ProducerMember)) { return (ProducerInstanceDependencyImpl) dep; } } throw new RuntimeException("Could not find producer member."); }
private Injectable getRootDisabledInjectable(Injectable inj, final Collection<String> problems, final Map<String, Injectable> customProvidedInjectables) { while (inj.getDependencies().size() == 1) { final Dependency dep = inj.getDependencies().iterator().next(); if (DependencyType.ProducerMember.equals(dep.getDependencyType())) { inj = resolveDependency((BaseDependency) dep, inj, problems, customProvidedInjectables); } } return inj; }
private static void traceConstituentHashContents(final Injectable injectable, final String name) { log.trace("Begin trace of hashContent for {}", name); log.trace("Combined content: {}", injectable.hashContent()); log.trace("HashContent for injectable type: {}", injectable.getInjectedType().hashContent()); for (final Dependency dep : injectable.getDependencies()) { log.trace("HashContent for {} dep of type {}: {}", dep.getDependencyType().toString(), dep.getInjectable().getInjectedType(), dep.getInjectable().getInjectedType().hashContent()); } log.trace("End trace of hashContent for {}", name); }
private void addDependency(final Injectable injectable, final Dependency dependency) { assert (injectable instanceof InjectableImpl); if (InjectableType.Disabled.equals(injectable.getInjectableType()) && (!DependencyType.ProducerMember.equals(dependency.getDependencyType()) || !injectable.getDependencies().isEmpty())) { throw new RuntimeException("The injectable, " + injectable + ", is disabled." + " A disabled injectable may only have a single dependency if it is produced by a disabled bean."); } final InjectableImpl injectableAsImpl = (InjectableImpl) injectable; injectableAsImpl.dependencies.add(BaseDependency.class.cast(dependency)); }