private void resolveDependencies() { logger.debug("Resolving dependencies for {} injectables...", injectablesByName.size()); final Set<Injectable> visited = new HashSet<>(); final Set<String> transientInjectableNames = new HashSet<>(); final List<String> dependencyProblems = new ArrayList<>(); final Map<String, Injectable> customProvidedInjectables = new IdentityHashMap<>(); for (final Injectable injectable : injectablesByName.values()) { if (injectable.isExtension()) { transientInjectableNames.add(injectable.getFactoryName()); } if (!visited.contains(injectable)) { logger.debug("Resolving {} dependencies for: {}", injectable.getDependencies().size(), injectable); for (final Dependency dep : injectable.getDependencies()) { resolveDependency(BaseDependency.as(dep), injectable, dependencyProblems, customProvidedInjectables); } } } injectablesByName.keySet().removeAll(transientInjectableNames); injectablesByName.putAll(customProvidedInjectables); if (!dependencyProblems.isEmpty()) { throw new RuntimeException(GraphUtil.buildMessageFromProblems(dependencyProblems)); } }
private Injectable maybeProcessAsExtension(final BaseDependency dep, final Injectable depOwner, final Map<String, Injectable> customProvidedInjectables, final Multimap<ResolutionPriority, InjectableImpl> resolvedByPriority, final Collection<InjectableImpl> resolved) { Injectable injectable = resolved.iterator().next(); if (injectable.isExtension()) { final ExtensionInjectable providedInjectable = (ExtensionInjectable) injectable; final Collection<Injectable> otherResolvedInjectables = new ArrayList<>(resolvedByPriority.values()); otherResolvedInjectables.remove(injectable); final InjectionSite site = new InjectionSite(depOwner.getInjectedType(), dep, otherResolvedInjectables); injectable = providedInjectable.provider.getInjectable(site, nameGenerator); customProvidedInjectables.put(injectable.getFactoryName(), injectable); dep.injectable = GraphUtil.copyInjectableReference(dep.injectable); } return injectable; }