public void resolve(DependencyMetaData dependency, BuildableComponentResolveResult result) { ModuleVersionSelector requested = dependency.getRequested(); LOGGER.debug("Attempting to resolve {} using repositories {}", requested, repositoryNames); ModuleComponentIdentifier moduleComponentIdentifier = new DefaultModuleComponentIdentifier( requested.getGroup(), requested.getName(), requested.getVersion()); ModuleVersionIdentifier moduleVersionIdentifier = new DefaultModuleVersionIdentifier( requested.getGroup(), requested.getName(), requested.getVersion()); List<Throwable> errors = new ArrayList<Throwable>(); List<ComponentMetaDataResolveState> resolveStates = new ArrayList<ComponentMetaDataResolveState>(); for (ModuleComponentRepository repository : repositories) { resolveStates.add( new ComponentMetaDataResolveState( dependency, moduleComponentIdentifier, repository, componentChooser)); } final RepositoryChainModuleResolution latestResolved = findBestMatch(resolveStates, errors); if (latestResolved != null) { LOGGER.debug("Using {} from {}", latestResolved.module.getId(), latestResolved.repository); for (Throwable error : errors) { LOGGER.debug("Discarding resolve failure.", error); } result.resolved(metaDataFactory.transform(latestResolved)); return; } if (!errors.isEmpty()) { result.failed(new ModuleVersionResolveException(moduleComponentIdentifier, errors)); } else { for (ComponentMetaDataResolveState resolveState : resolveStates) { resolveState.applyTo(result); } result.notFound(moduleVersionIdentifier); } }
private RepositoryChainModuleResolution findBestMatch( LinkedList<ComponentMetaDataResolveState> queue, Collection<Throwable> failures, Collection<ComponentMetaDataResolveState> missing) { RepositoryChainModuleResolution best = null; while (!queue.isEmpty()) { ComponentMetaDataResolveState request = queue.removeFirst(); BuildableModuleComponentMetaDataResolveResult metaDataResolveResult; try { metaDataResolveResult = request.resolve(); } catch (Throwable t) { failures.add(t); continue; } switch (metaDataResolveResult.getState()) { case Missing: // Queue this up for checking again later if (request.canMakeFurtherAttempts()) { missing.add(request); } break; case Resolved: RepositoryChainModuleResolution moduleResolution = new RepositoryChainModuleResolution( request.repository, metaDataResolveResult.getMetaData()); if (!metaDataResolveResult.getMetaData().isGenerated()) { return moduleResolution; } best = best != null ? best : moduleResolution; break; default: throw new IllegalStateException( "Unexpected state for resolution: " + metaDataResolveResult.getState()); } } return best; }