simplify the resolveTransitively API, and implement the new collector up to the level of functionality of the original.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@191773 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Brett Leslie Porter 2005-06-22 06:46:26 +00:00
parent 854b76e61f
commit 3f2f0d50a3
12 changed files with 600 additions and 165 deletions

View File

@ -88,7 +88,7 @@ public class DependenciesTask
pom = createDummyPom();
}
Set artifacts = metadataSource.createArtifacts( dependencies, null, null );
Set artifacts = MavenMetadataSource.createArtifacts( artifactFactory, dependencies, null, null );
log( "Resolving dependencies..." );

View File

@ -31,7 +31,6 @@ import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.logging.Logger;
import java.io.File;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
@ -130,23 +129,6 @@ public class DefaultArtifactResolver
}
}
public ArtifactResolutionResult resolveTransitively( Artifact artifact, List remoteRepositories,
ArtifactRepository localRepository,
ArtifactMetadataSource source )
throws ArtifactResolutionException
{
return resolveTransitively( artifact, remoteRepositories, localRepository, source, null );
}
public ArtifactResolutionResult resolveTransitively( Artifact artifact, List remoteRepositories,
ArtifactRepository localRepository,
ArtifactMetadataSource source, ArtifactFilter filter )
throws ArtifactResolutionException
{
return resolveTransitively( Collections.singleton( artifact ), null, remoteRepositories, localRepository,
source, filter );
}
public ArtifactResolutionResult resolveTransitively( Set artifacts, Artifact originatingArtifact,
List remoteRepositories, ArtifactRepository localRepository,
ArtifactMetadataSource source, ArtifactFilter filter )

View File

@ -56,7 +56,7 @@ public class DefaultArtifactFactory
private Artifact createArtifact( String groupId, String artifactId, String version, String scope, String type,
String classifier, String inheritedScope )
{
// TODO: can refactor, use scope handler
// TODO: can refactor - inherited scope calculation belongs in the collector, use scope handler
String desiredScope = Artifact.SCOPE_RUNTIME;
if ( inheritedScope == null )

View File

@ -38,4 +38,10 @@ public interface ArtifactCollector
List remoteRepositories, ArtifactMetadataSource source, ArtifactFilter filter,
ArtifactFactory artifactFactory )
throws ArtifactResolutionException;
ArtifactResolutionResult collect( Set artifacts, Artifact originatingArtifact, Set managedVersions,
ArtifactRepository localRepository, List remoteRepositories,
ArtifactMetadataSource source, ArtifactFilter filter,
ArtifactFactory artifactFactory )
throws ArtifactResolutionException;
}

View File

@ -39,15 +39,6 @@ public interface ArtifactResolver
void resolve( Artifact artifact, List remoteRepositories, ArtifactRepository localRepository )
throws ArtifactResolutionException;
ArtifactResolutionResult resolveTransitively( Artifact artifact, List remoteRepositories,
ArtifactRepository localRepository, ArtifactMetadataSource source )
throws ArtifactResolutionException;
ArtifactResolutionResult resolveTransitively( Artifact artifact, List remoteRepositories,
ArtifactRepository localRepository, ArtifactMetadataSource source,
ArtifactFilter filter )
throws ArtifactResolutionException;
ArtifactResolutionResult resolveTransitively( Set artifacts, Artifact originatingArtifact, List remoteRepositories,
ArtifactRepository localRepository, ArtifactMetadataSource source )
throws ArtifactResolutionException;

View File

@ -23,13 +23,14 @@ import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.HashSet;
/**
* Default implementation of the artifact collector.
@ -46,112 +47,209 @@ public class DefaultArtifactCollector
ArtifactFactory artifactFactory )
throws ArtifactResolutionException
{
ArtifactResolutionResult result = new ArtifactResolutionResult();
Map resolvedArtifacts = new HashMap();
List queue = new LinkedList();
queue.add( artifacts );
while ( !queue.isEmpty() )
{
Set currentArtifacts = (Set) queue.remove( 0 );
for ( Iterator i = currentArtifacts.iterator(); i.hasNext(); )
{
Artifact newArtifact = (Artifact) i.next();
String id = newArtifact.getDependencyConflictId();
if ( resolvedArtifacts.containsKey( id ) )
{
Artifact knownArtifact = (Artifact) resolvedArtifacts.get( id );
String newVersion = newArtifact.getVersion();
String knownVersion = knownArtifact.getVersion();
if ( !newVersion.equals( knownVersion ) )
{
addConflict( result, knownArtifact, newArtifact );
return collect( artifacts, originatingArtifact, Collections.EMPTY_SET, localRepository, remoteRepositories,
source, filter, artifactFactory );
}
// TODO: scope handler
public ArtifactResolutionResult collect( Set artifacts, Artifact originatingArtifact, Set managedVersions,
ArtifactRepository localRepository, List remoteRepositories,
ArtifactMetadataSource source, ArtifactFilter filter,
ArtifactFactory artifactFactory )
throws ArtifactResolutionException
{
Map resolvedArtifacts = new HashMap();
ResolutionNode root = new ResolutionNode( originatingArtifact );
root.addDependencies( artifacts, filter );
recurse( root, resolvedArtifacts, localRepository, remoteRepositories, source, filter, artifactFactory );
Set set = new HashSet();
for ( Iterator i = resolvedArtifacts.values().iterator(); i.hasNext(); )
{
ResolutionNode node = (ResolutionNode) i.next();
if ( node != root )
{
set.add( node.getArtifact() );
}
}
ArtifactResolutionResult result = new ArtifactResolutionResult();
result.setArtifacts( set );
return result;
}
private void recurse( ResolutionNode node, Map resolvedArtifacts, ArtifactRepository localRepository,
List remoteRepositories, ArtifactMetadataSource source, ArtifactFilter filter,
ArtifactFactory artifactFactory )
throws ArtifactResolutionException
{
ResolutionNode previous = (ResolutionNode) resolvedArtifacts.get( node.getKey() );
if ( previous != null )
{
// TODO: conflict resolvers
// previous one is more dominant
if ( previous.getDepth() <= node.getDepth() )
{
boolean updateScope = false;
Artifact newArtifact = node.getArtifact();
Artifact previousArtifact = previous.getArtifact();
if ( Artifact.SCOPE_RUNTIME.equals( newArtifact.getScope() ) &&
Artifact.SCOPE_TEST.equals( knownArtifact.getScope() ) )
( Artifact.SCOPE_TEST.equals( previousArtifact.getScope() ) ||
Artifact.SCOPE_PROVIDED.equals( previousArtifact.getScope() ) ) )
{
updateScope = true;
}
if ( Artifact.SCOPE_COMPILE.equals( newArtifact.getScope() ) &&
!Artifact.SCOPE_COMPILE.equals( knownArtifact.getScope() ) )
!Artifact.SCOPE_COMPILE.equals( previousArtifact.getScope() ) )
{
updateScope = true;
}
if ( updateScope )
{
Artifact artifact = artifactFactory.createArtifact( knownArtifact.getGroupId(),
knownArtifact.getArtifactId(), knownVersion,
Artifact artifact = artifactFactory.createArtifact( previousArtifact.getGroupId(),
previousArtifact.getArtifactId(),
previousArtifact.getVersion(),
newArtifact.getScope(),
knownArtifact.getType() );
resolvedArtifacts.put( artifact.getDependencyConflictId(), artifact );
previousArtifact.getType() );
// TODO: can I just change the scope?
previous.setArtifact( artifact );
}
return;
}
else
{
// ----------------------------------------------------------------------
// It's the first time we have encountered this artifact
// ----------------------------------------------------------------------
boolean updateScope = false;
Artifact previousArtifact = previous.getArtifact();
Artifact newArtifact = node.getArtifact();
if ( filter != null && !filter.include( newArtifact ) )
if ( Artifact.SCOPE_RUNTIME.equals( previousArtifact.getScope() ) &&
( Artifact.SCOPE_TEST.equals( newArtifact.getScope() ) ||
Artifact.SCOPE_PROVIDED.equals( newArtifact.getScope() ) ) )
{
continue;
updateScope = true;
}
resolvedArtifacts.put( id, newArtifact );
if ( Artifact.SCOPE_COMPILE.equals( previousArtifact.getScope() ) &&
!Artifact.SCOPE_COMPILE.equals( newArtifact.getScope() ) )
{
updateScope = true;
}
Set referencedDependencies = null;
if ( updateScope )
{
Artifact artifact = artifactFactory.createArtifact( newArtifact.getGroupId(),
newArtifact.getArtifactId(),
newArtifact.getVersion(),
previousArtifact.getScope(),
newArtifact.getType() );
// TODO: can I just change the scope?
node.setArtifact( artifact );
}
}
}
resolvedArtifacts.put( node.getKey(), node );
for ( Iterator i = node.getChildrenIterator(); i.hasNext(); )
{
ResolutionNode child = (ResolutionNode) i.next();
if ( !child.isResolved() )
{
try
{
referencedDependencies = source.retrieve( newArtifact, localRepository, remoteRepositories );
Set artifacts = source.retrieve( child.getArtifact(), localRepository, remoteRepositories );
child.addDependencies( artifacts, filter );
}
catch ( ArtifactMetadataRetrievalException e )
{
throw new TransitiveArtifactResolutionException( e.getMessage(), newArtifact,
throw new TransitiveArtifactResolutionException( e.getMessage(), child.getArtifact(),
remoteRepositories, e );
}
// the pom for given dependency exisit we will add it to the
// queue
queue.add( referencedDependencies );
recurse( child, resolvedArtifacts, localRepository, remoteRepositories, source, filter,
artifactFactory );
}
}
}
result.setArtifacts( new HashSet( resolvedArtifacts.values() ) );
return result;
}
private void addConflict( ArtifactResolutionResult result, Artifact knownArtifact, Artifact newArtifact )
private static class ResolutionNode
{
List conflicts;
private Artifact artifact;
conflicts = (List) result.getConflicts().get( newArtifact.getDependencyConflictId() );
private final ResolutionNode parent;
if ( conflicts == null )
private List children = null;
private final int depth;
public ResolutionNode( Artifact artifact )
{
conflicts = new LinkedList();
conflicts.add( knownArtifact );
result.getConflicts().put( newArtifact.getDependencyConflictId(), conflicts );
this.artifact = artifact;
this.parent = null;
this.depth = 0;
}
conflicts.add( newArtifact );
public ResolutionNode( Artifact artifact, ResolutionNode parent )
{
this.artifact = artifact;
this.parent = parent;
this.depth = parent.depth + 1;
}
public Artifact getArtifact()
{
return artifact;
}
public Object getKey()
{
return artifact.getDependencyConflictId();
}
public void addDependencies( Set artifacts, ArtifactFilter filter )
{
children = new ArrayList( artifacts.size() );
for ( Iterator i = artifacts.iterator(); i.hasNext(); )
{
Artifact a = (Artifact) i.next();
if ( filter == null || filter.include( a ) )
{
children.add( new ResolutionNode( a, this ) );
}
}
}
public boolean isResolved()
{
return children != null;
}
public Iterator getChildrenIterator()
{
return children.iterator();
}
public int getDepth()
{
return depth;
}
public void setArtifact( Artifact artifact )
{
this.artifact = artifact;
}
}
}

View File

@ -0,0 +1,169 @@
package org.apache.maven.artifact.resolver;
/*
* Copyright 2001-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Previous implementation of the artifact collector.
*
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
* @version $Id: DefaultArtifactCollector.java 191748 2005-06-22 00:31:33Z brett $
* @deprecated
*/
public class LegacyArtifactCollector
implements ArtifactCollector
{
public ArtifactResolutionResult collect( Set artifacts, Artifact originatingArtifact,
ArtifactRepository localRepository, List remoteRepositories,
ArtifactMetadataSource source, ArtifactFilter filter,
ArtifactFactory artifactFactory )
throws ArtifactResolutionException
{
return collect( artifacts, originatingArtifact, Collections.EMPTY_SET, localRepository, remoteRepositories,
source, filter, artifactFactory );
}
public ArtifactResolutionResult collect( Set artifacts, Artifact originatingArtifact, Set managedVersions,
ArtifactRepository localRepository, List remoteRepositories,
ArtifactMetadataSource source, ArtifactFilter filter,
ArtifactFactory artifactFactory )
throws ArtifactResolutionException
{
ArtifactResolutionResult result = new ArtifactResolutionResult();
Map resolvedArtifacts = new HashMap();
List queue = new LinkedList();
queue.add( artifacts );
while ( !queue.isEmpty() )
{
Set currentArtifacts = (Set) queue.remove( 0 );
for ( Iterator i = currentArtifacts.iterator(); i.hasNext(); )
{
Artifact newArtifact = (Artifact) i.next();
String id = newArtifact.getDependencyConflictId();
if ( resolvedArtifacts.containsKey( id ) )
{
Artifact knownArtifact = (Artifact) resolvedArtifacts.get( id );
String newVersion = newArtifact.getVersion();
String knownVersion = knownArtifact.getVersion();
if ( !newVersion.equals( knownVersion ) )
{
addConflict( result, knownArtifact, newArtifact );
}
// TODO: scope handler
boolean updateScope = false;
if ( Artifact.SCOPE_RUNTIME.equals( newArtifact.getScope() ) &&
Artifact.SCOPE_TEST.equals( knownArtifact.getScope() ) )
{
updateScope = true;
}
if ( Artifact.SCOPE_COMPILE.equals( newArtifact.getScope() ) &&
!Artifact.SCOPE_COMPILE.equals( knownArtifact.getScope() ) )
{
updateScope = true;
}
if ( updateScope )
{
Artifact artifact = artifactFactory.createArtifact( knownArtifact.getGroupId(),
knownArtifact.getArtifactId(), knownVersion,
newArtifact.getScope(),
knownArtifact.getType() );
resolvedArtifacts.put( artifact.getDependencyConflictId(), artifact );
}
}
else
{
// ----------------------------------------------------------------------
// It's the first time we have encountered this artifact
// ----------------------------------------------------------------------
if ( filter != null && !filter.include( newArtifact ) )
{
continue;
}
resolvedArtifacts.put( id, newArtifact );
Set referencedDependencies = null;
try
{
referencedDependencies = source.retrieve( newArtifact, localRepository, remoteRepositories );
}
catch ( ArtifactMetadataRetrievalException e )
{
throw new TransitiveArtifactResolutionException( e.getMessage(), newArtifact,
remoteRepositories, e );
}
// the pom for given dependency exisit we will add it to the
// queue
queue.add( referencedDependencies );
}
}
}
result.setArtifacts( new HashSet( resolvedArtifacts.values() ) );
return result;
}
private void addConflict( ArtifactResolutionResult result, Artifact knownArtifact, Artifact newArtifact )
{
List conflicts;
conflicts = (List) result.getConflicts().get( newArtifact.getDependencyConflictId() );
if ( conflicts == null )
{
conflicts = new LinkedList();
conflicts.add( knownArtifact );
result.getConflicts().put( newArtifact.getDependencyConflictId(), conflicts );
}
conflicts.add( newArtifact );
}
}

View File

@ -0,0 +1,29 @@
package org.apache.maven.artifact.versioning;
/*
* Copyright 2001-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Describes an artifact version in terms of its components, converts it to/from a string and
* compares two versions.
*
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
* @version $Id$
*/
public interface ArtifactVersion
extends Comparable
{
}

View File

@ -21,12 +21,15 @@ import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ExclusionSetFilter;
import org.codehaus.plexus.PlexusTestCase;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -48,6 +51,8 @@ public class DefaultArtifactCollectorTest
private Source source;
private static final String GROUP_ID = "test";
protected void setUp()
throws Exception
{
@ -57,10 +62,10 @@ public class DefaultArtifactCollectorTest
this.artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );
this.artifactCollector = new DefaultArtifactCollector();
this.projectArtifact = createArtifact( "project", "1.0" );
this.projectArtifact = createArtifact( "project", "1.0", null );
}
public void testCircularDependencyNotIncludingCurrentProject()
public void disabledtestCircularDependencyNotIncludingCurrentProject()
throws ArtifactResolutionException
{
ArtifactSpec a = createArtifact( "a", "1.0" );
@ -69,7 +74,7 @@ public class DefaultArtifactCollectorTest
try
{
collect( a );
// fail( "Should have failed on cyclic dependency not involving project" );
fail( "Should have failed on cyclic dependency not involving project" );
}
catch ( CyclicDependencyException expected )
{
@ -77,7 +82,7 @@ public class DefaultArtifactCollectorTest
}
}
public void testCircularDependencyIncludingCurrentProject()
public void disabledtestCircularDependencyIncludingCurrentProject()
throws ArtifactResolutionException
{
ArtifactSpec a = createArtifact( "a", "1.0" );
@ -86,7 +91,7 @@ public class DefaultArtifactCollectorTest
try
{
collect( a );
// fail( "Should have failed on cyclic dependency involving project" );
fail( "Should have failed on cyclic dependency involving project" );
}
catch ( CyclicDependencyException expected )
{
@ -94,6 +99,25 @@ public class DefaultArtifactCollectorTest
}
}
public void testResolveWithFilter()
throws ArtifactResolutionException
{
ArtifactSpec a = createArtifact( "a", "1.0" );
ArtifactSpec b = a.addDependency( "b", "1.0" );
ArtifactSpec c = a.addDependency( "c", "3.0" );
b.addDependency( "c", "2.0" );
ArtifactSpec d = b.addDependency( "d", "4.0" );
ArtifactResolutionResult res = collect( a );
assertEquals( "Check artifact list", createSet( new Object[]{a.artifact, b.artifact, c.artifact, d.artifact} ),
res.getArtifacts() );
ArtifactFilter filter = new ExclusionSetFilter( new String[]{"b"} );
res = collect( a, filter );
assertEquals( "Check artifact list", createSet( new Object[]{a.artifact, c.artifact} ), res.getArtifacts() );
}
public void testResolveNearest()
throws ArtifactResolutionException
{
@ -104,60 +128,143 @@ public class DefaultArtifactCollectorTest
b.addDependency( "c", "2.0" );
ArtifactResolutionResult res = collect( a );
assertEquals( "Check artifact list",
new HashSet( Arrays.asList( new Object[]{a.artifact, b.artifact, c.artifact} ) ),
assertEquals( "Check artifact list", createSet( new Object[]{a.artifact, b.artifact, c.artifact} ),
res.getArtifacts() );
}
public void disabledtestResolveManagedVersion()
throws ArtifactResolutionException
{
ArtifactSpec a = createArtifact( "a", "1.0" );
a.addDependency( "b", "3.0", Artifact.SCOPE_RUNTIME );
Artifact managedVersion = createArtifact( "b", "5.0" ).artifact;
Artifact modifiedB = createArtifact( "b", "5.0", Artifact.SCOPE_RUNTIME ).artifact;
ArtifactResolutionResult res = collect( a, managedVersion );
assertEquals( "Check artifact list", createSet( new Object[]{a.artifact, modifiedB} ), res.getArtifacts() );
}
public void testResolveCompileScopeOverTestScope()
throws ArtifactResolutionException
{
ArtifactSpec a = createArtifact( "a", "1.0" );
ArtifactSpec b = a.addDependency( "b", "1.0" );
a.addDependency( "c", "3.0", Artifact.SCOPE_TEST );
ArtifactSpec c = createArtifact( "c", "3.0", Artifact.SCOPE_TEST );
b.addDependency( "c", "2.0", Artifact.SCOPE_COMPILE );
a.addDependency( "c", "2.0", Artifact.SCOPE_COMPILE );
Artifact modifiedC = createArtifact( "c", "3.0", Artifact.SCOPE_COMPILE ).artifact;
ArtifactResolutionResult res = collect( a );
assertEquals( "Check artifact list",
new HashSet( Arrays.asList( new Object[]{a.artifact, b.artifact, modifiedC} ) ),
res.getArtifacts() );
ArtifactResolutionResult res = collect( createSet( new Object[]{a.artifact, c.artifact} ) );
assertEquals( "Check artifact list", createSet( new Object[]{a.artifact, modifiedC} ), res.getArtifacts() );
Artifact artifact = getArtifact( "c", res.getArtifacts() );
assertEquals( "Check scope", Artifact.SCOPE_COMPILE, artifact.getScope() );
}
public void testResolveRuntimeScopeOverTestScope()
throws ArtifactResolutionException
{
ArtifactSpec a = createArtifact( "a", "1.0" );
ArtifactSpec b = a.addDependency( "b", "1.0" );
a.addDependency( "c", "3.0", Artifact.SCOPE_TEST );
ArtifactSpec c = createArtifact( "c", "3.0", Artifact.SCOPE_TEST );
b.addDependency( "c", "2.0", Artifact.SCOPE_RUNTIME );
a.addDependency( "c", "2.0", Artifact.SCOPE_RUNTIME );
Artifact modifiedC = createArtifact( "c", "3.0", Artifact.SCOPE_RUNTIME ).artifact;
ArtifactResolutionResult res = collect( a );
assertEquals( "Check artifact list",
new HashSet( Arrays.asList( new Object[]{a.artifact, b.artifact, modifiedC} ) ),
res.getArtifacts() );
ArtifactResolutionResult res = collect( createSet( new Object[]{a.artifact, c.artifact} ) );
assertEquals( "Check artifact list", createSet( new Object[]{a.artifact, modifiedC} ), res.getArtifacts() );
Artifact artifact = getArtifact( "c", res.getArtifacts() );
assertEquals( "Check scope", Artifact.SCOPE_RUNTIME, artifact.getScope() );
}
public void testResolveCompileScopeOverRuntimeScope()
throws ArtifactResolutionException
{
ArtifactSpec a = createArtifact( "a", "1.0" );
ArtifactSpec b = a.addDependency( "b", "1.0" );
a.addDependency( "c", "3.0", Artifact.SCOPE_RUNTIME );
ArtifactSpec c = createArtifact( "c", "3.0", Artifact.SCOPE_RUNTIME );
b.addDependency( "c", "2.0", Artifact.SCOPE_COMPILE );
a.addDependency( "c", "2.0", Artifact.SCOPE_COMPILE );
Artifact modifiedC = createArtifact( "c", "3.0", Artifact.SCOPE_COMPILE ).artifact;
ArtifactResolutionResult res = collect( a );
assertEquals( "Check artifact list",
new HashSet( Arrays.asList( new Object[]{a.artifact, b.artifact, modifiedC} ) ),
res.getArtifacts() );
ArtifactResolutionResult res = collect( createSet( new Object[]{a.artifact, c.artifact} ) );
assertEquals( "Check artifact list", createSet( new Object[]{a.artifact, modifiedC} ), res.getArtifacts() );
Artifact artifact = getArtifact( "c", res.getArtifacts() );
assertEquals( "Check scope", Artifact.SCOPE_COMPILE, artifact.getScope() );
}
public void testResolveCompileScopeOverProvidedScope()
throws ArtifactResolutionException
{
ArtifactSpec a = createArtifact( "a", "1.0" );
ArtifactSpec c = createArtifact( "c", "3.0", Artifact.SCOPE_PROVIDED );
a.addDependency( "c", "2.0", Artifact.SCOPE_COMPILE );
Artifact modifiedC = createArtifact( "c", "3.0", Artifact.SCOPE_COMPILE ).artifact;
ArtifactResolutionResult res = collect( createSet( new Object[]{a.artifact, c.artifact} ) );
assertEquals( "Check artifact list", createSet( new Object[]{a.artifact, modifiedC} ), res.getArtifacts() );
Artifact artifact = getArtifact( "c", res.getArtifacts() );
assertEquals( "Check scope", Artifact.SCOPE_COMPILE, artifact.getScope() );
}
public void testResolveRuntimeScopeOverProvidedScope()
throws ArtifactResolutionException
{
ArtifactSpec a = createArtifact( "a", "1.0" );
ArtifactSpec c = createArtifact( "c", "3.0", Artifact.SCOPE_PROVIDED );
a.addDependency( "c", "2.0", Artifact.SCOPE_RUNTIME );
Artifact modifiedC = createArtifact( "c", "3.0", Artifact.SCOPE_RUNTIME ).artifact;
ArtifactResolutionResult res = collect( createSet( new Object[]{a.artifact, c.artifact} ) );
assertEquals( "Check artifact list", createSet( new Object[]{a.artifact, modifiedC} ), res.getArtifacts() );
Artifact artifact = getArtifact( "c", res.getArtifacts() );
assertEquals( "Check scope", Artifact.SCOPE_RUNTIME, artifact.getScope() );
}
public void testProvidedScopeNotTransitive()
throws ArtifactResolutionException
{
ArtifactSpec a = createArtifact( "a", "1.0", Artifact.SCOPE_PROVIDED );
ArtifactSpec b = createArtifact( "b", "1.0" );
b.addDependency( "c", "3.0", Artifact.SCOPE_PROVIDED );
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 testTestScopeNotTransitive()
throws ArtifactResolutionException
{
ArtifactSpec a = createArtifact( "a", "1.0", Artifact.SCOPE_TEST );
ArtifactSpec b = createArtifact( "b", "1.0" );
b.addDependency( "c", "3.0", Artifact.SCOPE_TEST );
ArtifactResolutionResult res = collect( createSet( new Object[]{a.artifact, b.artifact} ) );
assertEquals( "Check artifact list", createSet( new Object[]{a.artifact, b.artifact} ), res.getArtifacts() );
}
private Artifact getArtifact( String id, Set artifacts )
{
for ( Iterator i = artifacts.iterator(); i.hasNext(); )
{
Artifact a = (Artifact) i.next();
if ( a.getArtifactId().equals( id ) && a.getGroupId().equals( GROUP_ID ) )
{
return a;
}
}
return null;
}
private ArtifactResolutionResult collect( Set artifacts )
throws ArtifactResolutionException
{
return artifactCollector.collect( artifacts, projectArtifact.artifact, null, null, source, null,
artifactFactory );
}
private ArtifactResolutionResult collect( ArtifactSpec a )
@ -167,19 +274,39 @@ public class DefaultArtifactCollectorTest
source, null, artifactFactory );
}
private ArtifactResolutionResult collect( ArtifactSpec a, ArtifactFilter filter )
throws ArtifactResolutionException
{
return artifactCollector.collect( Collections.singleton( a.artifact ), projectArtifact.artifact, null, null,
source, filter, artifactFactory );
}
private ArtifactResolutionResult collect( ArtifactSpec a, Artifact managedVersion )
throws ArtifactResolutionException
{
return artifactCollector.collect( Collections.singleton( a.artifact ), projectArtifact.artifact,
Collections.singleton( managedVersion ), null, null, source, null,
artifactFactory );
}
private ArtifactSpec createArtifact( String id, String version )
{
return createArtifact( id, version, null );
return createArtifact( id, version, Artifact.SCOPE_COMPILE );
}
private ArtifactSpec createArtifact( String id, String version, String scope )
{
ArtifactSpec spec = new ArtifactSpec();
spec.artifact = artifactFactory.createArtifact( "test", id, version, scope, "jar" );
spec.artifact = artifactFactory.createArtifact( GROUP_ID, id, version, scope, "jar" );
source.artifacts.put( spec.artifact.getId(), spec );
return spec;
}
private static Set createSet( Object[] x )
{
return new HashSet( Arrays.asList( x ) );
}
private class ArtifactSpec
{
Artifact artifact;
@ -199,7 +326,7 @@ public class DefaultArtifactCollectorTest
}
}
private static class Source
private class Source
implements ArtifactMetadataSource
{
Map artifacts = new HashMap();
@ -208,7 +335,31 @@ public class DefaultArtifactCollectorTest
throws ArtifactMetadataRetrievalException, ArtifactResolutionException
{
ArtifactSpec a = (ArtifactSpec) artifacts.get( artifact.getId() );
return a.dependencies;
return createArtifacts( artifactFactory, a.dependencies, artifact.getScope(),
artifact.getDependencyFilter() );
}
private Set createArtifacts( ArtifactFactory artifactFactory, Set dependencies, String inheritedScope,
ArtifactFilter dependencyFilter )
{
Set projectArtifacts = new HashSet();
for ( Iterator i = dependencies.iterator(); i.hasNext(); )
{
Artifact d = (Artifact) i.next();
Artifact artifact = artifactFactory.createArtifact( d.getGroupId(), d.getArtifactId(), d.getVersion(),
d.getScope(), d.getType(), inheritedScope );
if ( artifact != null && ( dependencyFilter == null || dependencyFilter.include( artifact ) ) )
{
artifact.setDependencyFilter( dependencyFilter );
projectArtifacts.add( artifact );
}
}
return projectArtifacts;
}
}
}

View File

@ -18,6 +18,7 @@ package org.apache.maven.plugin;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
@ -213,7 +214,7 @@ public class DefaultPluginManager
Artifact pluginArtifact = artifactFactory.createArtifact( groupId, artifactId, version,
Artifact.SCOPE_RUNTIME,
MojoDescriptor.MAVEN_PLUGIN, null );
MojoDescriptor.MAVEN_PLUGIN );
addPlugin( pluginKey, pluginArtifact, project, localRepository );
@ -555,10 +556,13 @@ public class DefaultPluginManager
artifactFactory );
List remoteArtifactRepositories = project.getRemoteArtifactRepositories();
ArtifactResolutionResult result = artifactResolver.resolveTransitively( pluginArtifact,
ArtifactRepository localRepository = session.getLocalRepository();
Set dependencies = metadataSource.retrieve( pluginArtifact, localRepository,
remoteArtifactRepositories );
ArtifactResolutionResult result = artifactResolver.resolveTransitively( dependencies, pluginArtifact,
remoteArtifactRepositories,
session.getLocalRepository(),
metadataSource,
localRepository, metadataSource,
artifactFilter );
Set resolved = result.getArtifacts();
@ -582,7 +586,7 @@ public class DefaultPluginManager
ArtifactFilter distroProvidedFilter = new InversionArtifactFilter( artifactFilter );
ArtifactResolutionResult distroProvidedResult = artifactResolver
.resolveTransitively( pluginArtifact, remoteArtifactRepositories, session.getLocalRepository(),
.resolveTransitively( dependencies, pluginArtifact, remoteArtifactRepositories, localRepository,
metadataSource, distroProvidedFilter );
Set distroProvided = distroProvidedResult.getArtifacts();
@ -602,6 +606,10 @@ public class DefaultPluginManager
{
throw new PluginConfigurationException( "Cannot start plugin container", e );
}
catch ( ArtifactMetadataRetrievalException e )
{
throw new PluginConfigurationException( "Cannot resolve plugin dependencies", e );
}
finally
{
if ( artifactFactory != null )

View File

@ -312,7 +312,9 @@ public class DefaultMavenProjectBuilder
}
catch ( IllegalStateException collisionException )
{
throw new ProjectBuildingException( "Detected illegal plugin-execution configuration in: " + pomLocation + " Error output: \n\n" + collisionException.getMessage(), collisionException );
throw new ProjectBuildingException(
"Detected illegal plugin-execution configuration in: " + pomLocation +
" Error output: \n\n" + collisionException.getMessage(), collisionException );
}
}
}
@ -388,7 +390,7 @@ public class DefaultMavenProjectBuilder
{
Artifact parentArtifact = artifactFactory.createArtifact( parentProject.getGroupId(),
parentProject.getArtifactId(),
parentProject.getVersion(), null, "pom", null );
parentProject.getVersion(), null, "pom" );
project.setParentArtifact( parentArtifact );
}
@ -450,7 +452,7 @@ public class DefaultMavenProjectBuilder
// ----------------------------------------------------------------------
Artifact artifact = artifactFactory.createArtifact( parentModel.getGroupId(), parentModel.getArtifactId(),
parentModel.getVersion(), null, "pom", null );
parentModel.getVersion(), null, "pom" );
model = findModelFromRepository( artifact, aggregatedRemoteWagonRepositories, localRepository );
@ -535,9 +537,7 @@ public class DefaultMavenProjectBuilder
protected Set createArtifacts( List dependencies )
{
// TODO: merge with MavenMetadataSource properly
return new MavenMetadataSource( artifactResolver, this, artifactFactory ).createArtifacts( dependencies, null,
null );
return MavenMetadataSource.createArtifacts( artifactFactory, dependencies, null, null );
}
protected Set createPluginArtifacts( List plugins )
@ -559,7 +559,7 @@ public class DefaultMavenProjectBuilder
}
Artifact artifact = artifactFactory.createArtifact( p.getGroupId(), p.getArtifactId(), version, null,
"maven-plugin", null );
"maven-plugin" );
if ( artifact != null )
{
pluginArtifacts.add( artifact );

View File

@ -139,10 +139,11 @@ public class MavenMetadataSource
IOUtil.close( reader );
}
}
return createArtifacts( dependencies, artifact.getScope(), artifact.getDependencyFilter() );
return createArtifacts( artifactFactory, dependencies, artifact.getScope(), artifact.getDependencyFilter() );
}
public Set createArtifacts( List dependencies, String inheritedScope, ArtifactFilter dependencyFilter )
public static Set createArtifacts( ArtifactFactory artifactFactory, List dependencies, String inheritedScope,
ArtifactFilter dependencyFilter )
{
Set projectArtifacts = new HashSet();