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())); }