You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2015/07/17 23:06:24 UTC

svn commit: r1691641 - in /maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/artifact: ./ resolve/ resolve/internal/

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