Пример #1
0
  private ProjectVersionRefLocation resolveLatestMultiRefWithLocation(
      final List<? extends Location> locations,
      final ProjectVersionRef ref,
      final VersionSelectionStrategy selectionStrategy,
      final EventMetadata eventMetadata)
      throws TransferException {
    final Map<SingleVersion, Location> available = new TreeMap<SingleVersion, Location>();
    for (final Location location : locations) {
      try {
        final MavenMetadataView metadata =
            metadataReader.getMetadata(
                ref.asProjectRef(), Collections.singletonList(location), eventMetadata);

        if (metadata != null) {
          final List<String> versions =
              metadata.resolveValues("/metadata/versioning/versions/version");

          if (versions != null) {
            for (final String version : versions) {
              try {
                final SingleVersion spec = VersionUtils.createSingleVersion(version);
                if (!available.containsKey(spec)) {
                  available.put(spec, location);
                }
              } catch (final InvalidVersionSpecificationException e) {
                debug(
                    "Unparsable version spec found in metadata: '%s' for: %s from: %s.",
                    e, version, ref, location);
              }
            }
          }
        }
      } catch (final GalleyMavenException e) {
        debug(
            "Failed to resolve/parse metadata for variable version of: '%s' from: %s.",
            e, ref, location);
      }
    }

    if (!available.isEmpty()) {
      final VersionSpec spec = ref.getVersionSpec();

      final List<SingleVersion> versions = new ArrayList<SingleVersion>(available.keySet());
      Collections.sort(versions);
      while (!versions.isEmpty()) {
        final SingleVersion selected = selectionStrategy.select(versions);
        if (selected == null) {
          return null;
        }

        versions.remove(selected);
        if (selected.isConcrete() && spec.contains(selected)) {
          return new ProjectVersionRefLocation(
              ref.selectVersion(selected), available.get(selected));
        }
      }
    }

    return null;
  }