[MNG-1895] merge changes from branch

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@379650 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Brett Leslie Porter 2006-02-22 02:21:10 +00:00
parent 578764fba6
commit 806eaeb017
3 changed files with 54 additions and 47 deletions

View File

@ -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.
* <a href="http://docs.codehaus.org/x/IGU#DependencyMediationandConflictResolution-Scoperesolution">More info</a>.
* @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;
}

View File

@ -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" ) + ")";
}
}

View File

@ -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
{