示例#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;
  }
  @Test
  public void run() throws Exception {
    final URI source = sourceURI();
    final ProjectVersionRef root = projectVersion("group.id", "my-project", "1.0");
    final ProjectVersionRef d1 = projectVersion("other.group", "dep-L1", "1.0.1");
    final ProjectVersionRef d2 = projectVersion("foo", "dep-L2", "1.1.1");
    final ProjectVersionRef d3 = projectVersion("foo", "dep-L2", "1.1.2");

    RelationshipGraph graph = simpleGraph(root);

    /* @formatter:off */
    graph.storeRelationships(
        new SimpleParentRelationship(source, root),
        new SimpleDependencyRelationship(
            source, root, d1.asJarArtifact(), compile, 0, false, false, false),
        new SimpleDependencyRelationship(
            source, d1, d2.asJarArtifact(), compile, 0, false, false, false));
    /* @formatter:on */

    graph =
        graphFactory()
            .open(
                new ViewParams.Builder(graph.getParams())
                    .withSelection(d2.asProjectRef(), d3)
                    .build(),
                false);

    //        graph.getView()
    //             .selectVersion( d2.asProjectRef(), d3 );

    final TransitiveDependencyTraversal depTraversal = new TransitiveDependencyTraversal();
    graph.traverse(depTraversal);

    final List<ArtifactRef> artifacts = depTraversal.getArtifacts();

    assertThat(artifacts.size(), equalTo(2));

    int idx = 0;

    ArtifactRef ref = artifacts.get(idx++);
    assertThat(ref.getArtifactId(), equalTo("dep-L1"));

    ref = artifacts.get(idx++);
    assertThat(ref.getArtifactId(), equalTo("dep-L2"));
    assertThat(ref.getVersionString(), equalTo(d3.getVersionString()));
  }