From 806eaeb0170299b14d620376d831fb4a9a2be9c8 Mon Sep 17 00:00:00 2001 From: Brett Leslie Porter Date: Wed, 22 Feb 2006 02:21:10 +0000 Subject: [PATCH] [MNG-1895] merge changes from branch git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@379650 13f79535-47bb-0310-9956-ffa450edef68 --- .../resolver/DefaultArtifactCollector.java | 41 +++++++------- .../artifact/resolver/ResolutionNode.java | 4 +- .../DefaultArtifactCollectorTest.java | 56 +++++++++++-------- 3 files changed, 54 insertions(+), 47 deletions(-) diff --git a/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java b/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java index b6d379ec2d..108a976d17 100644 --- a/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java +++ b/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java @@ -81,7 +81,7 @@ public class DefaultArtifactCollector if ( node.filterTrail( filter ) ) { - // If it was optional and not a direct dependency, + // If it was optional and not a direct dependency, // we don't add it or its children, just allow the update of the version and scope if ( node.isChildOfRootNode() || !artifact.isOptional() ) { @@ -137,18 +137,7 @@ public class DefaultArtifactCollector VersionRange previousRange = previous.getArtifact().getVersionRange(); VersionRange currentRange = node.getArtifact().getVersionRange(); - // TODO: why do we force the version on it? what if they don't match? - if ( previousRange == null ) - { - // version was already resolved - node.getArtifact().setVersion( previous.getArtifact().getVersion() ); - } - else if ( currentRange == null ) - { - // version was already resolved - previous.getArtifact().setVersion( node.getArtifact().getVersion() ); - } - else + if ( previousRange != null && currentRange != null ) { // TODO: shouldn't need to double up on this work, only done for simplicity of handling recommended // version but the restriction is identical @@ -185,7 +174,8 @@ public class DefaultArtifactCollector // TODO: should this be part of mediation? // previous one is more dominant - ResolutionNode nearest, farthest; + ResolutionNode nearest; + ResolutionNode farthest; if ( previous.getDepth() <= node.getDepth() ) { nearest = previous; @@ -197,11 +187,9 @@ public class DefaultArtifactCollector farthest = previous; } - /* if we need to update scope of nearest to use farthest scope */ if ( checkScopeUpdate( farthest, nearest, listeners ) ) { - fireEvent( ResolutionListener.UPDATE_SCOPE, listeners, nearest, farthest.getArtifact() ); - /* we need nearest version but farthest scope */ + // if we need to update scope of nearest to use farthest scope, use the nearest version, but farthest scope nearest.disable(); farthest.getArtifact().setVersion( nearest.getArtifact().getVersion() ); } @@ -321,13 +309,14 @@ public class DefaultArtifactCollector } /** - * Check if the scope of the nearest needs to be updated with the scope of the farthest. + * Check if the scope needs to be updated. * More info. - * @param farthest farthest resolution node - * @param nearest nearest resolution node + * + * @param farthest farthest resolution node + * @param nearest nearest resolution node * @param listeners */ - private boolean checkScopeUpdate( ResolutionNode farthest, ResolutionNode nearest, List listeners ) + boolean checkScopeUpdate( ResolutionNode farthest, ResolutionNode nearest, List listeners ) { boolean updateScope = false; Artifact farthestArtifact = farthest.getArtifact(); @@ -354,6 +343,16 @@ public class DefaultArtifactCollector fireEvent( ResolutionListener.UPDATE_SCOPE_CURRENT_POM, listeners, nearest, farthestArtifact ); } + if ( updateScope ) + { + fireEvent( ResolutionListener.UPDATE_SCOPE, listeners, nearest, farthestArtifact ); + + // previously we cloned the artifact, but it is more effecient to just update the scope + // if problems are later discovered that the original object needs its original scope value, cloning may + // again be appropriate + nearestArtifact.setScope( farthestArtifact.getScope() ); + } + return updateScope; } diff --git a/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java b/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java index 067e790f2c..7d39bf961d 100644 --- a/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java +++ b/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java @@ -146,7 +146,7 @@ public class ResolutionNode { return children != null; } - + public boolean isChildOfRootNode() { return parent != null && parent.parent == null; @@ -219,7 +219,7 @@ public class ResolutionNode public String toString() { - return artifact.toString() + " (" + depth + ")"; + return artifact.toString() + " (" + depth + "; " + ( active ? "enabled" : "disabled" ) + ")"; } } diff --git a/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java b/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java index 0d5cce0a2d..fb1da292b1 100644 --- a/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java +++ b/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java @@ -16,17 +16,6 @@ package org.apache.maven.artifact.resolver; * limitations under the License. */ -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException; @@ -41,6 +30,17 @@ import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException import org.apache.maven.artifact.versioning.VersionRange; import org.codehaus.plexus.PlexusTestCase; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + /** * Test the default artifact collector. * @@ -504,8 +504,8 @@ public class DefaultArtifactCollectorTest ArtifactResolutionResult res = collect( createSet( new Object[]{a.artifact, b.artifact} ) ); assertEquals( "Check artifact list", createSet( new Object[]{a.artifact, b.artifact} ), res.getArtifacts() ); } - - public void testScopeUpdate( ) + + public void testScopeUpdate() throws InvalidVersionSpecificationException, ArtifactResolutionException { /* farthest = compile */ @@ -543,7 +543,7 @@ public class DefaultArtifactCollectorTest checkScopeUpdate( Artifact.SCOPE_TEST, Artifact.SCOPE_SYSTEM, Artifact.SCOPE_SYSTEM ); checkScopeUpdate( Artifact.SCOPE_TEST, Artifact.SCOPE_TEST, Artifact.SCOPE_TEST ); } - + private void checkScopeUpdate( String farthestScope, String nearestScope, String expectedScope ) throws ArtifactResolutionException, InvalidVersionSpecificationException { @@ -560,13 +560,13 @@ public class DefaultArtifactCollectorTest a.addDependency( c ); ArtifactSpec dNearest = createArtifact( "d", "2.0" ); b.addDependency( dNearest ); - ArtifactSpec dFarthest = createArtifact( "d", "2.0", farthestScope ); + ArtifactSpec dFarthest = createArtifact( "d", "3.0", farthestScope ); c.addDependency( dFarthest ); /* system and provided dependencies are not transitive */ if ( !Artifact.SCOPE_SYSTEM.equals( nearestScope ) && !Artifact.SCOPE_PROVIDED.equals( nearestScope ) ) { - checkScopeUpdate( a, b, expectedScope ); + checkScopeUpdate( a, b, expectedScope, "2.0" ); } } @@ -579,13 +579,13 @@ public class DefaultArtifactCollectorTest a.addDependency( c ); ArtifactSpec dNearest = createArtifact( "d", "2.0", nearestScope ); b.addDependency( dNearest ); - ArtifactSpec dFarthest = createArtifact( "d", "2.0", farthestScope ); + ArtifactSpec dFarthest = createArtifact( "d", "3.0", farthestScope ); c.addDependency( dFarthest ); - - checkScopeUpdate( a, b, expectedScope ); + + checkScopeUpdate( a, b, expectedScope, "2.0" ); } - - private void checkScopeUpdate( ArtifactSpec a, ArtifactSpec b, String expectedScope ) + + private void checkScopeUpdate( ArtifactSpec a, ArtifactSpec b, String expectedScope, String expectedVersion ) throws ArtifactResolutionException, InvalidVersionSpecificationException { ScopeArtifactFilter filter; @@ -602,10 +602,18 @@ public class DefaultArtifactCollectorTest filter = new ScopeArtifactFilter( expectedScope ); } - ArtifactResolutionResult res = collect( createSet( new Object[] { a.artifact, b.artifact } ), filter ); + ArtifactResolutionResult res = collect( createSet( new Object[]{a.artifact, b.artifact} ), filter ); Artifact artifact = getArtifact( "d", res.getArtifacts() ); assertNotNull( "MNG-1895 Dependency was not added to resolution", artifact ); assertEquals( "Check scope", expectedScope, artifact.getScope() ); + assertEquals( "Check version", expectedVersion, artifact.getVersion() ); + + ArtifactSpec d = createArtifact( "d", "1.0" ); + res = collect( createSet( new Object[]{a.artifact, b.artifact, d.artifact} ), filter ); + artifact = getArtifact( "d", res.getArtifacts() ); + assertNotNull( "MNG-1895 Dependency was not added to resolution", artifact ); + assertEquals( "Check scope", d.artifact.getScope(), artifact.getScope() ); + assertEquals( "Check version", "1.0", artifact.getVersion() ); } public void disabledtestOptionalNotTransitiveButVersionIsInfluential() @@ -659,7 +667,7 @@ public class DefaultArtifactCollectorTest } private ArtifactResolutionResult collect( Set artifacts, ArtifactFilter filter ) - throws ArtifactResolutionException + throws ArtifactResolutionException { return artifactCollector.collect( artifacts, projectArtifact.artifact, null, null, source, filter, Collections.EMPTY_LIST ); @@ -754,7 +762,7 @@ public class DefaultArtifactCollectorTest } return dep; } - + private ArtifactSpec addDependency( String id, String version, String scope, boolean optional ) throws InvalidVersionSpecificationException {