[MNG-3093] Track selectVersionFromRange events in the tree
git-svn-id: https://svn.apache.org/repos/asf/maven/shared/trunk@632948 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
index fb9ca32..97e8daa 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
@@ -26,6 +26,7 @@
import java.util.List;
import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
import org.apache.maven.shared.dependency.tree.traversal.SerializingDependencyNodeVisitor;
@@ -189,7 +190,11 @@
* artifact scope has not been managed.
*/
private String premanagedScope;
+
+ private VersionRange versionSelectedFromRange;
+ private List availableVersions;
+
// constructors -----------------------------------------------------------
/**
@@ -517,6 +522,40 @@
}
/**
+ * If the version was selected from a range this method will return the range.
+ *
+ * @return the version range before a version was selected, or <code>null</code> if the artifact had a explicit
+ * version.
+ * @since 1.2
+ */
+ public VersionRange getVersionSelectedFromRange()
+ {
+ return versionSelectedFromRange;
+ }
+
+ public void setVersionSelectedFromRange( VersionRange versionSelectedFromRange )
+ {
+ this.versionSelectedFromRange = versionSelectedFromRange;
+ }
+
+ /**
+ * If the version was selected from a range this method will return the available versions when making the decision.
+ *
+ * @return {@link List} < {@link String} > the versions available when a version was selected from a range, or
+ * <code>null</code> if the artifact had a explicit version.
+ * @since 1.2
+ */
+ public List getAvailableVersions()
+ {
+ return availableVersions;
+ }
+
+ public void setAvailableVersions( List availableVersions )
+ {
+ this.availableVersions = availableVersions;
+ }
+
+ /**
* Changes the state of this dependency node to be omitted for conflict or duplication, depending on the specified
* related artifact.
*
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
index 642378c..ec3f629 100644
--- a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
@@ -298,8 +298,19 @@
public void selectVersionFromRange( Artifact artifact )
{
log( "selectVersionFromRange: artifact=" + artifact );
-
- // TODO: track version selection from range in node (MNG-3093)
+
+ DependencyNode node = getNode( artifact );
+
+ /*
+ * selectVersionFromRange is called before includeArtifact
+ */
+ if ( node == null && isCurrentNodeIncluded() )
+ {
+ node = addNode( artifact );
+ }
+
+ node.setVersionSelectedFromRange( artifact.getVersionRange() );
+ node.setAvailableVersions( artifact.getAvailableVersions() );
}
/*
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/ArtifactMetadataSourceStub.java b/src/test/java/org/apache/maven/shared/dependency/tree/ArtifactMetadataSourceStub.java
index 94e5ff5..9f6f122 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/ArtifactMetadataSourceStub.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/ArtifactMetadataSourceStub.java
@@ -48,6 +48,11 @@
*/
private final Map resolutionGroupsByArtifact;
+ /**
+ * Map of available versions by artifact.
+ */
+ private final Map availableVersionsByArtifact;
+
// constructors -----------------------------------------------------------
/**
@@ -56,6 +61,7 @@
public ArtifactMetadataSourceStub()
{
resolutionGroupsByArtifact = new HashMap();
+ availableVersionsByArtifact = new HashMap();
}
// ArtifactMetadataSource methods -----------------------------------------
@@ -85,7 +91,9 @@
public List retrieveAvailableVersions( Artifact artifact, ArtifactRepository localRepository,
List remoteRepositories ) throws ArtifactMetadataRetrievalException
{
- return Collections.EMPTY_LIST;
+ List availableVersions = (List) availableVersionsByArtifact.get( artifact );
+
+ return availableVersions != null ? availableVersions : Collections.EMPTY_LIST;
}
// public methods ---------------------------------------------------------
@@ -104,4 +112,17 @@
resolutionGroupsByArtifact.put( artifact, resolution );
}
+
+ /**
+ * Adds versions for the specified artifact to this artifact metadata source stub.
+ *
+ * @param artifact
+ * the artifact to add metadata to
+ * @param versions
+ * the list of versions to register as available for the specified artifact
+ */
+ public void addAvailableVersions( Artifact artifact, List versions )
+ {
+ availableVersionsByArtifact.put( artifact, versions );
+ }
}
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilderTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilderTest.java
index dd2c781..71ac2d5 100644
--- a/src/test/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilderTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilderTest.java
@@ -19,6 +19,7 @@
* under the License.
*/
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
@@ -41,6 +42,9 @@
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.artifact.resolver.ResolutionNode;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.PlexusTestCase;
@@ -552,6 +556,33 @@
assertDependencyTree( expectedRootNode, project );
}
+
+ /**
+ * Tests building a tree for a project with a dependency with version range
+ *
+ * <pre>
+ * g:p:t:1
+ * \- g:a:t:1
+ * </pre>
+ *
+ * @throws DependencyTreeBuilderException
+ */
+ public void testProjectWithVersionRange() throws DependencyTreeBuilderException
+ {
+ Artifact projectArtifact = createArtifact( "g:p:t:1" );
+ Artifact childArtifact = createArtifact( "g:a:t:[1,2)" );
+
+ MavenProject project = createProject( projectArtifact, new Artifact[] { childArtifact } );
+
+ DependencyNode expectedRootNode = createNode( "g:p:t:1" );
+ expectedRootNode.addChild( createNode( "g:a:t:1.0" ) );
+ ArtifactVersion version = new DefaultArtifactVersion( "1.0" );
+ List availableVersions = new ArrayList();
+ availableVersions.add( version );
+ artifactMetadataSource.addAvailableVersions( childArtifact, availableVersions );
+ assertDependencyTree( expectedRootNode, project );
+ }
+
// TODO: reinstate when MNG-3236 fixed
/*
public void testProjectWithFilter() throws DependencyTreeBuilderException, ArtifactResolutionException
@@ -593,7 +624,15 @@
String version = get( tokens, 3 );
String scope = get( tokens, 4 );
- VersionRange versionRange = VersionRange.createFromVersion( version );
+ VersionRange versionRange;
+ try
+ {
+ versionRange = VersionRange.createFromVersionSpec( version );
+ }
+ catch ( InvalidVersionSpecificationException e )
+ {
+ throw new RuntimeException(e);
+ }
return new DefaultArtifact( groupId, artifactId, versionRange, scope, type, null, new DefaultArtifactHandler() );
}