Author: rfscholte Date: Fri Jul 17 21:06:24 2015 New Revision: 1691641 URL: http://svn.apache.org/r1691641 Log: ArtifactResolver now uses ArtifactCoordinate
Modified: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/ArtifactCoordinate.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/ArtifactResolver.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/DefaultArtifactResolver.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Invoker.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Maven30ArtifactResolver.java maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Maven31ArtifactResolver.java Modified: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/ArtifactCoordinate.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/ArtifactCoordinate.java?rev=1691641&r1=1691640&r2=1691641&view=diff ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/ArtifactCoordinate.java (original) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/ArtifactCoordinate.java Fri Jul 17 21:06:24 2015 @@ -124,7 +124,7 @@ public class ArtifactCoordinate public final String getType() { - return type; + return type != null ? type : "jar"; } public final void setType( String type ) Modified: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/ArtifactResolver.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/ArtifactResolver.java?rev=1691641&r1=1691640&r2=1691641&view=diff ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/ArtifactResolver.java (original) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/ArtifactResolver.java Fri Jul 17 21:06:24 2015 @@ -19,8 +19,11 @@ package org.apache.maven.shared.artifact * under the License. */ +import java.util.Collection; + import org.apache.maven.artifact.Artifact; import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.shared.artifact.ArtifactCoordinate; import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter; /** @@ -29,14 +32,29 @@ import org.apache.maven.shared.artifact. public interface ArtifactResolver { - ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest , Artifact mavenArtifact ) + ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest , Artifact mavenArtifact ) throws ArtifactResolverException; - Iterable<ArtifactResult> resolveTransitively( ProjectBuildingRequest buildingRequest , Artifact mavenArtifact ) - throws ArtifactResolverException; + ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest , ArtifactCoordinate coordinate ) + throws ArtifactResolverException; - Iterable<ArtifactResult> resolveTransitively( ProjectBuildingRequest buildingRequest , Artifact mavenArtifact , - TransformableFilter filter ) + /** + * This will resolve the dependencies of the coordinate, not resolving the the artifact of the coordinate itself. + * If the coordinate needs to be resolved too, use + * {@link #resolveDependencies(ProjectBuildingRequest, Collection, TransformableFilter)} passing + * {@code Collections.singletonList(coordinate)} + * + * @param buildingRequest + * @param coordinate + * @param filter + * @return + * @throws ArtifactResolverException + */ + Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest, + ArtifactCoordinate coordinate, TransformableFilter filter ) throws ArtifactResolverException; + Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest, + Collection<ArtifactCoordinate> dependencies, TransformableFilter filter ) + throws ArtifactResolverException; } Modified: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/DefaultArtifactResolver.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/DefaultArtifactResolver.java?rev=1691641&r1=1691640&r2=1691641&view=diff ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/DefaultArtifactResolver.java (original) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/DefaultArtifactResolver.java Fri Jul 17 21:06:24 2015 @@ -19,8 +19,11 @@ package org.apache.maven.shared.artifact * under the License. */ +import java.util.Collection; + import org.apache.maven.artifact.Artifact; import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.shared.artifact.ArtifactCoordinate; import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter; import org.apache.maven.shared.artifact.resolve.ArtifactResolver; import org.apache.maven.shared.artifact.resolve.ArtifactResolverException; @@ -42,6 +45,7 @@ public class DefaultArtifactResolver { private PlexusContainer container; + @Override public ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest , Artifact mavenArtifact ) throws ArtifactResolverException { @@ -59,7 +63,8 @@ public class DefaultArtifactResolver } } - public Iterable<ArtifactResult> resolveTransitively( ProjectBuildingRequest buildingRequest , Artifact mavenArtifact ) + @Override + public ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest, ArtifactCoordinate coordinate ) throws ArtifactResolverException { try @@ -68,7 +73,7 @@ public class DefaultArtifactResolver ArtifactResolver effectiveArtifactResolver = container.lookup( ArtifactResolver.class, hint ); - return effectiveArtifactResolver.resolveTransitively( buildingRequest, mavenArtifact ); + return effectiveArtifactResolver.resolveArtifact( buildingRequest, coordinate ); } catch ( ComponentLookupException e ) { @@ -76,8 +81,10 @@ public class DefaultArtifactResolver } } - public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveTransitively( ProjectBuildingRequest buildingRequest , Artifact mavenArtifact , - TransformableFilter filter ) + @Override + public Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest, + Collection<ArtifactCoordinate> coordinates, + TransformableFilter filter ) throws ArtifactResolverException { try @@ -86,7 +93,27 @@ public class DefaultArtifactResolver ArtifactResolver effectiveArtifactResolver = container.lookup( ArtifactResolver.class, hint ); - return effectiveArtifactResolver.resolveTransitively( buildingRequest, mavenArtifact, filter ); + return effectiveArtifactResolver.resolveDependencies( buildingRequest, coordinates, filter ); + } + catch ( ComponentLookupException e ) + { + throw new ArtifactResolverException( e.getMessage(), e ); + } + } + + @Override + public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest, + ArtifactCoordinate coordinate, + TransformableFilter filter ) + throws ArtifactResolverException + { + try + { + String hint = isMaven31() ? "maven31" : "maven3"; + + ArtifactResolver effectiveArtifactResolver = container.lookup( ArtifactResolver.class, hint ); + + return effectiveArtifactResolver.resolveDependencies( buildingRequest, coordinate, filter ); } catch ( ComponentLookupException e ) { @@ -127,5 +154,4 @@ public class DefaultArtifactResolver { container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY ); } - } Modified: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Invoker.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Invoker.java?rev=1691641&r1=1691640&r2=1691641&view=diff ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Invoker.java (original) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Invoker.java Fri Jul 17 21:06:24 2015 @@ -102,4 +102,35 @@ final class Invoker throw new ArtifactResolverException( e.getMessage(), e ); } } + + /** + * <strong>Note:</strong> Ensure that argClasses and args have the same number of elements + * + * @param objectClazz the class of the static method + * @param staticMethod the static method to call + * @param argClasses the classes of the argument, used to select the right static method + * @param args the actual arguments to be passed + * @return the result of the method invocation + * @throws ArtifactResolverException if any checked exception occurs + */ + public static Object invoke( Class<?> objectClazz, String staticMethod, Class<?>[] argClasses, Object[] args ) + throws ArtifactResolverException + { + try + { + return objectClazz.getMethod( staticMethod, argClasses ).invoke( null, args ); + } + catch ( IllegalAccessException e ) + { + throw new ArtifactResolverException( e.getMessage(), e ); + } + catch ( InvocationTargetException e ) + { + throw new ArtifactResolverException( e.getMessage(), e ); + } + catch ( NoSuchMethodException e ) + { + throw new ArtifactResolverException( e.getMessage(), e ); + } + } } Modified: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Maven30ArtifactResolver.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Maven30ArtifactResolver.java?rev=1691641&r1=1691640&r2=1691641&view=diff ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Maven30ArtifactResolver.java (original) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Maven30ArtifactResolver.java Fri Jul 17 21:06:24 2015 @@ -25,7 +25,9 @@ import java.util.Iterator; import java.util.List; import org.apache.maven.RepositoryUtils; +import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.shared.artifact.ArtifactCoordinate; import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter; import org.apache.maven.shared.artifact.filter.resolve.transform.SonatypeAetherFilterTransformer; import org.apache.maven.shared.artifact.resolve.ArtifactResolver; @@ -35,8 +37,11 @@ import org.codehaus.plexus.component.ann import org.sonatype.aether.RepositorySystem; import org.sonatype.aether.RepositorySystemSession; import org.sonatype.aether.artifact.Artifact; +import org.sonatype.aether.artifact.ArtifactType; +import org.sonatype.aether.artifact.ArtifactTypeRegistry; import org.sonatype.aether.collection.CollectRequest; import org.sonatype.aether.collection.DependencyCollectionException; +import org.sonatype.aether.graph.Dependency; import org.sonatype.aether.graph.DependencyFilter; import org.sonatype.aether.repository.RemoteRepository; import org.sonatype.aether.resolution.ArtifactDescriptorException; @@ -45,6 +50,8 @@ import org.sonatype.aether.resolution.Ar import org.sonatype.aether.resolution.ArtifactRequest; import org.sonatype.aether.resolution.ArtifactResolutionException; import org.sonatype.aether.resolution.ArtifactResult; +import org.sonatype.aether.util.artifact.DefaultArtifact; +import org.sonatype.aether.util.artifact.DefaultArtifactType; /** * @@ -55,7 +62,11 @@ public class Maven30ArtifactResolver { @Requirement private RepositorySystem repositorySystem; + + @Requirement + private ArtifactHandlerManager artifactHandlerManager; + @Override public org.apache.maven.shared.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest , org.apache.maven.artifact.Artifact mavenArtifact ) throws ArtifactResolverException @@ -64,6 +75,27 @@ public class Maven30ArtifactResolver (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact", org.apache.maven.artifact.Artifact.class, mavenArtifact ); + return resolveArtifact( buildingRequest, aetherArtifact ); + } + + @Override + public org.apache.maven.shared.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest, + ArtifactCoordinate coordinate ) + throws ArtifactResolverException + { + ArtifactTypeRegistry typeRegistry = + (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry", + ArtifactHandlerManager.class, artifactHandlerManager ); + + Dependency aetherDependency = toDependency( coordinate, typeRegistry ); + + return resolveArtifact( buildingRequest, aetherDependency.getArtifact() ); + } + + private org.apache.maven.shared.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest, + Artifact aetherArtifact ) + throws ArtifactResolverException + { @SuppressWarnings( "unchecked" ) List<RemoteRepository> aetherRepositories = (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class, @@ -94,55 +126,77 @@ public class Maven30ArtifactResolver throw new ArtifactResolverException( e.getMessage(), e ); } } - - public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveTransitively( ProjectBuildingRequest buildingRequest , - org.apache.maven.artifact.Artifact mavenArtifact ) - throws ArtifactResolverException - { - return resolveTransitively( buildingRequest, mavenArtifact, null ); - } - - public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveTransitively( ProjectBuildingRequest buildingRequest , - org.apache.maven.artifact.Artifact mavenArtifact , + + @Override + public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest , + ArtifactCoordinate coordinate , TransformableFilter dependencyFilter ) throws ArtifactResolverException { - Artifact aetherArtifact = - (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact", org.apache.maven.artifact.Artifact.class, - mavenArtifact ); + ArtifactTypeRegistry typeRegistry = + (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry", + ArtifactHandlerManager.class, artifactHandlerManager ); + Dependency aetherRoot = toDependency( coordinate, typeRegistry ); + @SuppressWarnings( "unchecked" ) List<RemoteRepository> aetherRepositories = (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class, buildingRequest.getRemoteRepositories() ); - RepositorySystemSession session = - (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" ); + CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories ); - try + return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request ); + } + + + @Override + public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest, + Collection<ArtifactCoordinate> coordinates, + TransformableFilter filter ) + throws ArtifactResolverException + { + ArtifactTypeRegistry typeRegistry = + (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry", + ArtifactHandlerManager.class, artifactHandlerManager ); + + List<Dependency> dependencies = new ArrayList<Dependency>( coordinates.size() ); + + for ( ArtifactCoordinate coordinate : coordinates ) { - // use descriptor to respect relocation - ArtifactDescriptorRequest descriptorRequest = - new ArtifactDescriptorRequest( aetherArtifact, aetherRepositories, null ); + dependencies.add( toDependency( coordinate, typeRegistry ) ); + } - ArtifactDescriptorResult descriptorResult = - repositorySystem.readArtifactDescriptor( session, descriptorRequest ); + @SuppressWarnings( "unchecked" ) + List<RemoteRepository> aetherRepositories = + (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class, + buildingRequest.getRemoteRepositories() ); + + CollectRequest request = new CollectRequest( (Dependency) null, dependencies, aetherRepositories ); - CollectRequest request = - new CollectRequest( descriptorResult.getDependencies(), descriptorResult.getManagedDependencies(), - aetherRepositories ); + return resolveDependencies( buildingRequest, aetherRepositories, filter, request ); + } + private Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest, + List<RemoteRepository> aetherRepositories, + TransformableFilter dependencyFilter, + CollectRequest request ) + throws ArtifactResolverException + { + try + { DependencyFilter depFilter = null; if ( dependencyFilter != null ) { depFilter = dependencyFilter.transform( new SonatypeAetherFilterTransformer() ); } - List<ArtifactResult> dependencyResults = repositorySystem.resolveDependencies( session, request, depFilter ); + RepositorySystemSession session = + (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" ); - Collection<ArtifactRequest> artifactRequests = new ArrayList<ArtifactRequest>( 1 + dependencyResults.size() ); + List<ArtifactResult> dependencyResults = repositorySystem.resolveDependencies( session, request, depFilter ); - artifactRequests.add( new ArtifactRequest( descriptorResult.getArtifact(), aetherRepositories, null ) ); + Collection<ArtifactRequest> artifactRequests = new ArrayList<ArtifactRequest>( dependencyResults.size() ); for ( ArtifactResult artifactResult : dependencyResults ) { @@ -169,10 +223,6 @@ public class Maven30ArtifactResolver } }; } - catch ( ArtifactDescriptorException e ) - { - throw new ArtifactResolverException( e.getMessage(), e ); - } catch ( ArtifactResolutionException e ) { throw new ArtifactResolverException( e.getMessage(), e ); @@ -182,4 +232,27 @@ public class Maven30ArtifactResolver throw new ArtifactResolverException( e.getMessage(), e ); } } + + /** + * Based on RepositoryUtils#toDependency(org.apache.maven.model.Dependency, ArtifactTypeRegistry) + * + * @param coordinate + * @param stereotypes + * @return as Aether Dependency + * + */ + private static Dependency toDependency( ArtifactCoordinate coordinate, ArtifactTypeRegistry stereotypes ) + { + ArtifactType stereotype = stereotypes.get( coordinate.getType() ); + if ( stereotype == null ) + { + stereotype = new DefaultArtifactType( coordinate.getType() ); + } + + Artifact artifact = + new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(), null, + coordinate.getVersion(), null, stereotype ); + + return new Dependency( artifact, null ); + } } Modified: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Maven31ArtifactResolver.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Maven31ArtifactResolver.java?rev=1691641&r1=1691640&r2=1691641&view=diff ============================================================================== --- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Maven31ArtifactResolver.java (original) +++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact/resolve/internal/Maven31ArtifactResolver.java Fri Jul 17 21:06:24 2015 @@ -25,7 +25,9 @@ import java.util.Iterator; import java.util.List; import org.apache.maven.RepositoryUtils; +import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.shared.artifact.ArtifactCoordinate; import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter; import org.apache.maven.shared.artifact.filter.resolve.transform.EclipseAetherFilterTransformer; import org.apache.maven.shared.artifact.resolve.ArtifactResolver; @@ -35,7 +37,12 @@ import org.codehaus.plexus.component.ann import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.artifact.ArtifactType; +import org.eclipse.aether.artifact.ArtifactTypeRegistry; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.artifact.DefaultArtifactType; import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyFilter; import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.resolution.ArtifactDescriptorException; @@ -46,6 +53,7 @@ import org.eclipse.aether.resolution.Art import org.eclipse.aether.resolution.ArtifactResult; import org.eclipse.aether.resolution.DependencyRequest; import org.eclipse.aether.resolution.DependencyResolutionException; +import org.eclipse.aether.resolution.DependencyResult; /** * @@ -56,7 +64,11 @@ public class Maven31ArtifactResolver { @Requirement private RepositorySystem repositorySystem; + + @Requirement + private ArtifactHandlerManager artifactHandlerManager; + @Override public org.apache.maven.shared.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest , org.apache.maven.artifact.Artifact mavenArtifact ) throws ArtifactResolverException @@ -65,6 +77,27 @@ public class Maven31ArtifactResolver (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact", org.apache.maven.artifact.Artifact.class, mavenArtifact ); + return resolveArtifact( buildingRequest, aetherArtifact ); + } + + @Override + public org.apache.maven.shared.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest, + ArtifactCoordinate coordinate ) + throws ArtifactResolverException + { + ArtifactTypeRegistry typeRegistry = + (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry", + ArtifactHandlerManager.class, artifactHandlerManager ); + + Dependency aetherDependency = toDependency( coordinate, typeRegistry ); + + return resolveArtifact( buildingRequest, aetherDependency.getArtifact() ); + } + + private org.apache.maven.shared.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest, + Artifact aetherArtifact ) + throws ArtifactResolverException + { @SuppressWarnings( "unchecked" ) List<RemoteRepository> aetherRepositories = (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class, @@ -86,69 +119,90 @@ public class Maven31ArtifactResolver return new Maven31ArtifactResult( repositorySystem.resolveArtifact( session, request ) ); } - catch ( ArtifactResolutionException e ) + catch ( ArtifactDescriptorException e ) { throw new ArtifactResolverException( e.getMessage(), e ); } - catch ( ArtifactDescriptorException e ) + catch ( ArtifactResolutionException e ) { throw new ArtifactResolverException( e.getMessage(), e ); } } - public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveTransitively( ProjectBuildingRequest buildingRequest , - org.apache.maven.artifact.Artifact mavenArtifact ) + public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest , + ArtifactCoordinate coordinate , + TransformableFilter dependencyFilter ) throws ArtifactResolverException { - return resolveTransitively( buildingRequest, mavenArtifact, null ); + ArtifactTypeRegistry typeRegistry = + (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry", + ArtifactHandlerManager.class, artifactHandlerManager ); + + Dependency aetherRoot = toDependency( coordinate, typeRegistry ); + + @SuppressWarnings( "unchecked" ) + List<RemoteRepository> aetherRepositories = + (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class, + buildingRequest.getRemoteRepositories() ); + + CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories ); + + return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request ); } - public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveTransitively( ProjectBuildingRequest buildingRequest , - org.apache.maven.artifact.Artifact mavenArtifact , - TransformableFilter dependencyFilter ) + + + @Override + public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest, + Collection<ArtifactCoordinate> coordinates, + TransformableFilter filter ) throws ArtifactResolverException { - Artifact aetherArtifact = - (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact", org.apache.maven.artifact.Artifact.class, - mavenArtifact ); + ArtifactTypeRegistry typeRegistry = + (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry", + ArtifactHandlerManager.class, artifactHandlerManager ); + + List<Dependency> dependencies = new ArrayList<Dependency>( coordinates.size() ); + + for ( ArtifactCoordinate coordinate : coordinates ) + { + dependencies.add( toDependency( coordinate, typeRegistry ) ); + } @SuppressWarnings( "unchecked" ) List<RemoteRepository> aetherRepositories = (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class, buildingRequest.getRemoteRepositories() ); - RepositorySystemSession session = - (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" ); + CollectRequest request = new CollectRequest( (Dependency) null, dependencies, aetherRepositories ); + return resolveDependencies( buildingRequest, aetherRepositories, filter, request ); + } + + private Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest, + List<RemoteRepository> aetherRepositories, + TransformableFilter dependencyFilter, + CollectRequest request ) + throws ArtifactResolverException + { try { - // use descriptor to respect relocation - ArtifactDescriptorRequest descriptorRequest = - new ArtifactDescriptorRequest( aetherArtifact, aetherRepositories, null ); - - ArtifactDescriptorResult descriptorResult = - repositorySystem.readArtifactDescriptor( session, descriptorRequest ); - - CollectRequest request = - new CollectRequest( descriptorResult.getDependencies(), descriptorResult.getManagedDependencies(), - aetherRepositories ); - - DependencyFilter depFilter = null; + DependencyFilter depFilter = null; if ( dependencyFilter != null ) { depFilter = dependencyFilter.transform( new EclipseAetherFilterTransformer() ); } DependencyRequest depRequest = new DependencyRequest( request, depFilter ); + + RepositorySystemSession session = + (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" ); - List<ArtifactResult> dependencyResults = - repositorySystem.resolveDependencies( session, depRequest ).getArtifactResults(); - - Collection<ArtifactRequest> artifactRequests = new ArrayList<ArtifactRequest>( 1 + dependencyResults.size() ); + DependencyResult dependencyResults = repositorySystem.resolveDependencies( session, depRequest ); - artifactRequests.add( new ArtifactRequest( descriptorResult.getArtifact(), aetherRepositories, null ) ); + Collection<ArtifactRequest> artifactRequests = new ArrayList<ArtifactRequest>( dependencyResults.getArtifactResults().size() ); - for ( ArtifactResult artifactResult : dependencyResults ) + for ( ArtifactResult artifactResult : dependencyResults.getArtifactResults() ) { artifactRequests.add( new ArtifactRequest( artifactResult.getArtifact(), aetherRepositories, null ) ); } @@ -173,10 +227,6 @@ public class Maven31ArtifactResolver } }; } - catch ( ArtifactDescriptorException e ) - { - throw new ArtifactResolverException( e.getMessage(), e ); - } catch ( ArtifactResolutionException e ) { throw new ArtifactResolverException( e.getMessage(), e ); @@ -186,4 +236,27 @@ public class Maven31ArtifactResolver throw new ArtifactResolverException( e.getMessage(), e ); } } + + /** + * Based on RepositoryUtils#toDependency(org.apache.maven.model.Dependency, ArtifactTypeRegistry) + * + * @param coordinate + * @param stereotypes + * @return as Aether Dependency + * + */ + private static Dependency toDependency( ArtifactCoordinate coordinate, ArtifactTypeRegistry stereotypes ) + { + ArtifactType stereotype = stereotypes.get( coordinate.getType() ); + if ( stereotype == null ) + { + stereotype = new DefaultArtifactType( coordinate.getType() ); + } + + Artifact artifact = + new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(), null, + coordinate.getVersion(), null, stereotype ); + + return new Dependency( artifact, null ); + } }