コード例 #1
0
  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);
    }
  }
コード例 #2
0
  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;
  }