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 2016/06/12 12:02:30 UTC

svn commit: r1747984 [1/2] - in /maven/shared/trunk/maven-artifact-transfer/src: main/java/org/apache/maven/shared/dependencies/ main/java/org/apache/maven/shared/dependencies/collect/ main/java/org/apache/maven/shared/dependencies/collect/internal/ ma...

Author: rfscholte
Date: Sun Jun 12 12:02:29 2016
New Revision: 1747984

URL: http://svn.apache.org/viewvc?rev=1747984&view=rev
Log:
Improve naming: it's not about dependencies, but about instances which have dependencies, now called dependables.
A MavenProject is a special case.
And again: an artifact cannot have dependencies, it is simply a filewrapper with a coordinate. So don't have a dependencyResolver based on artifact.

Added:
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/DefaultDependableCoordinate.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/DependableCoordinate.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/TransferUtils.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/CollectorResult.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/DependencyCollector.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/DependencyCollectorException.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/DefaultDependencyCollector.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Invoker.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30ArtifactRepositoryAdapter.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30CollectorResult.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30DependencyCollector.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31ArtifactRepositoryAdapter.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31CollectorResult.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31DependencyCollector.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/DependencyResolver.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/DependencyResolverException.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/DefaultDependencyResolver.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Invoker.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Maven30ArtifactResult.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Maven30DependencyResolver.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Maven31ArtifactResult.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Maven31DependencyResolver.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/project/
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/project/DefaultProjectCoordinate.java
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/project/ProjectCoordinate.java
Removed:
    maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependency/
Modified:
    maven/shared/trunk/maven-artifact-transfer/src/test/java/org/apache/maven/shared/dependency/DefaultDependencyCoordinateTest.java

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/DefaultDependableCoordinate.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/DefaultDependableCoordinate.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/DefaultDependableCoordinate.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/DefaultDependableCoordinate.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,168 @@
+package org.apache.maven.shared.dependencies;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+/**
+ * Common usage of an DependableCoordinate for a Mojo
+ * 
+ * <pre>
+ * &#64;Parameter
+ * private DefaultDependableCoordinate[] dependencies;
+ * </pre>
+ * 
+ * and
+ * 
+ * <pre>
+ * private DefaultDependableCoordinate dependable = new DefaultDependableCoordinate();
+ * 
+ * &#64;Parameter( property = "groupId" )
+ * private String groupId;
+ * 
+ * &#64;Parameter( property = "artifactId" )
+ * private String artifactId;
+ * 
+ * &#64;Parameter( property = "version" )
+ * private String version;
+ * 
+ * &#64;Parameter( property = "classifier" )
+ * private String classifier;
+ * 
+ * &#64;Parameter( property = "type" )
+ * private String type;
+ * 
+ * public void setGroupId( String groupId )
+ * {
+ *   this.dependable.setGroupId( groupId );
+ * }
+ * 
+ * public void setArtifactId( String artifactId )
+ * {
+ *   this.dependable.setArtifactId( artifactId );
+ * }
+ * 
+ * public void setVersion( String version )
+ * {
+ *   this.dependable.setVersion( version );
+ * }
+ * 
+ * public void setClassifier( String classifier )
+ * {
+ *   this.dependable.setClassifier( classifier );
+ * }
+ * 
+ * public void setType( String type )
+ * {
+ *   this.dependable.setType( type );
+ * }
+ * </pre>
+ * <strong>Note: </strong> type is not the same as extension! 
+ * {@link org.apache.maven.artifact.handler.ArtifactHandler}s are used to map a type to an extension.  
+ * 
+ * 
+ * @author Robert Scholte
+ * @since 3.0
+ */
+public class DefaultDependableCoordinate implements DependableCoordinate
+{
+    private String groupId;
+    
+    private String artifactId;
+    
+    private String version;
+    
+    private String type;
+    
+    private String classifier;
+    
+    @Override
+    public final String getGroupId()
+    {
+        return groupId;
+    }
+
+    public final void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    }
+
+    @Override
+    public final String getArtifactId()
+    {
+        return artifactId;
+    }
+
+    public final void setArtifactId( String artifactId )
+    {
+        this.artifactId = artifactId;
+    }
+
+    @Override
+    public final String getVersion()
+    {
+        return version;
+    }
+
+    public final void setVersion( String version )
+    {
+        this.version = version;
+    }
+
+    @Override
+    public final String getType()
+    {
+        return type != null ? type : "jar";
+    }
+
+    public void setType( String type )
+    {
+        this.type = type;
+    }
+    
+    @Override
+    public final String getClassifier()
+    {
+        return classifier;
+    }
+
+    public final void setClassifier( String classifier )
+    {
+        this.classifier = classifier;
+    }
+    
+    /**
+     * @see org.apache.maven.artifact.DefaultArtifact#toString()
+     */
+    @Override
+    public String toString()
+    {
+        StringBuilder sb =
+            new StringBuilder().append( groupId ).append( ':' ).append( artifactId ).append( ':' ).append( getType() );
+        
+        if ( classifier != null )
+        {
+            sb.append( ':' ).append( classifier );
+        }
+        
+        sb.append( ':' ).append( version );
+        
+        return sb.toString();
+    }
+    
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/DependableCoordinate.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/DependableCoordinate.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/DependableCoordinate.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/DependableCoordinate.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,70 @@
+package org.apache.maven.shared.dependencies;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+/**
+ * <p>
+ * Represents any instance which may contain Maven Dependencies, both explicit or implicit to (transitively) resolve 
+ * and calculate its path for either a local or remote Maven2 repository.
+ * </p>
+ * <p>
+ * The version can be a version range. Based on the groupId and artifactId it will be resolved to the actual version.
+ * </p>
+ * <p>
+ * The type will be translated to an extension based on the artifact descriptor ({@code pom.xml} matching the groupId,
+ * artifactId and version.
+ * </p>
+ * A MavenProject is not considered a DependableCoordinate because is should never have a versionRange, and it has packaging 
+ * instead of type.
+ * 
+ * @author Robert Scholte
+ */
+public interface DependableCoordinate
+{
+    /**
+     * @return the groupId of the coordinate
+     */
+    String getGroupId();
+
+    /**
+     * 
+     * @return the artifact of the coordinate
+     */
+    String getArtifactId();
+
+    /**
+     * A version or versionRange
+     * 
+     * @return the version
+     */
+    String getVersion();
+
+    /**
+     * 
+     * @return the type of the coordinate
+     */
+    String getType();
+
+    /**
+     * 
+     * @return the classifier or {@code null}
+     */
+    String getClassifier();
+}
\ No newline at end of file

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/TransferUtils.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/TransferUtils.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/TransferUtils.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/TransferUtils.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,111 @@
+package org.apache.maven.shared.dependencies;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.model.Dependency;
+import org.apache.maven.model.Extension;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Parent;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.ReportPlugin;
+
+/**
+ * Utility class
+ * 
+ * @author Robert Scholte
+ *
+ */
+public final class TransferUtils
+{
+    private TransferUtils()
+    {
+    }
+    
+    public static DependableCoordinate toDependableCoordinate( Dependency dependency )
+    {
+        DefaultDependableCoordinate coordinate = new DefaultDependableCoordinate();
+        
+        coordinate.setGroupId( dependency.getGroupId() );
+        coordinate.setArtifactId( dependency.getArtifactId() );
+        coordinate.setVersion( dependency.getVersion() );
+        coordinate.setType( dependency.getType() );
+        coordinate.setClassifier( dependency.getClassifier() );
+        
+        return coordinate;
+    }
+
+    public static DependableCoordinate toDependableCoordinate( Extension extension )
+    {
+        DefaultDependableCoordinate coordinate = new DefaultDependableCoordinate();
+        
+        coordinate.setGroupId( extension.getGroupId() );
+        coordinate.setArtifactId( extension.getArtifactId() );
+        coordinate.setVersion( extension.getVersion() );
+        
+        return coordinate;
+    }
+
+    public static DependableCoordinate toDependableCoordinate( Model model )
+    {
+        DefaultDependableCoordinate coordinate = new DefaultDependableCoordinate();
+        
+        coordinate.setGroupId( model.getGroupId() );
+        coordinate.setArtifactId( model.getArtifactId() );
+        coordinate.setVersion( model.getVersion() );
+        coordinate.setType( model.getPackaging() );
+        
+        return coordinate;
+    }
+
+    public static DependableCoordinate toDependableCoordinate( Parent parent )
+    {
+        DefaultDependableCoordinate coordinate = new DefaultDependableCoordinate();
+        
+        coordinate.setGroupId( parent.getGroupId() );
+        coordinate.setArtifactId( parent.getArtifactId() );
+        coordinate.setVersion( parent.getVersion() );
+        coordinate.setType( "pom" );
+        
+        return coordinate;
+    }
+
+    public static DependableCoordinate toDependableCoordinate( Plugin plugin )
+    {
+        DefaultDependableCoordinate coordinate = new DefaultDependableCoordinate();
+        
+        coordinate.setGroupId( plugin.getGroupId() );
+        coordinate.setArtifactId( plugin.getArtifactId() );
+        coordinate.setVersion( plugin.getVersion() );
+        
+        return coordinate;
+    }
+    
+    public static DependableCoordinate toDependableCoordinate( ReportPlugin plugin )
+    {
+        DefaultDependableCoordinate coordinate = new DefaultDependableCoordinate();
+        
+        coordinate.setGroupId( plugin.getGroupId() );
+        coordinate.setArtifactId( plugin.getArtifactId() );
+        coordinate.setVersion( plugin.getVersion() );
+        
+        return coordinate;
+    }
+
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/CollectorResult.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/CollectorResult.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/CollectorResult.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/CollectorResult.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,37 @@
+package org.apache.maven.shared.dependencies.collect;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 java.util.List;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+
+/**
+ * 
+ * @author Robert Scholte
+ *
+ */
+public interface CollectorResult
+{
+    /**
+     * @return {@link ArtifactRepository}
+     */
+    List<ArtifactRepository> getRemoteRepositories();
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/DependencyCollector.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/DependencyCollector.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/DependencyCollector.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/DependencyCollector.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,24 @@
+package org.apache.maven.shared.dependencies.collect;
+
+import org.apache.maven.model.Dependency;
+import org.apache.maven.project.ProjectBuildingRequest;
+
+/**
+ * Will only download the pom files when not available, never the artifact. 
+ * 
+ * @author Robert Scholte
+ *
+ */
+public interface DependencyCollector
+{
+
+    /**
+     * @param buildingRequest {@link ProjectBuildingRequest}
+     * @param root {@link Dependency}
+     * @return {@link CollectorResult}
+     * @throws DependencyCollectorException in case of an error.
+     */
+    CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Dependency root )
+        throws DependencyCollectorException;
+    
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/DependencyCollectorException.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/DependencyCollectorException.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/DependencyCollectorException.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/DependencyCollectorException.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,43 @@
+package org.apache.maven.shared.dependencies.collect;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+/**
+ * 
+ * @author Robert Scholte
+ */
+public class DependencyCollectorException extends Exception
+{
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = -180986912170441437L;
+
+    /**
+     * @param message The message you would give for the exception.
+     * @param cause The cause which is related to the message.
+     */
+    public DependencyCollectorException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/DefaultDependencyCollector.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/DefaultDependencyCollector.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/DefaultDependencyCollector.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/DefaultDependencyCollector.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,78 @@
+package org.apache.maven.shared.dependencies.collect.internal;
+
+import org.apache.maven.model.Dependency;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.apache.maven.shared.dependencies.collect.CollectorResult;
+import org.apache.maven.shared.dependencies.collect.DependencyCollector;
+import org.apache.maven.shared.dependencies.collect.DependencyCollectorException;
+import org.codehaus.plexus.PlexusConstants;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.context.Context;
+import org.codehaus.plexus.context.ContextException;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
+
+/**
+ * This DependencyCollector passes the request to the proper Maven 3.x implementation
+ *  
+ * @author Robert Scholte
+ */
+@Component( role = DependencyCollector.class, hint = "default" )
+public class DefaultDependencyCollector implements DependencyCollector, Contextualizable 
+{
+    private PlexusContainer container;
+   
+    @Override
+    public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Dependency root )
+        throws DependencyCollectorException
+    {
+        try
+        {
+            String hint = isMaven31() ? "maven31" : "maven3";
+
+            DependencyCollector effectiveDependencyCollector = container.lookup( DependencyCollector.class, hint );
+
+            return effectiveDependencyCollector.collectDependencies( buildingRequest, root );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+    }
+
+    /**
+     * @return true if the current Maven version is Maven 3.1.
+     */
+    protected static boolean isMaven31()
+    {
+        return canFindCoreClass( "org.eclipse.aether.artifact.Artifact" ); // Maven 3.1 specific
+    }
+
+    private static boolean canFindCoreClass( String className )
+    {
+        try
+        {
+            Thread.currentThread().getContextClassLoader().loadClass( className );
+
+            return true;
+        }
+        catch ( ClassNotFoundException e )
+        {
+            return false;
+        }
+    }
+
+    /**
+     * Injects the Plexus content.
+     *
+     * @param context Plexus context to inject.
+     * @throws ContextException if the PlexusContainer could not be located.
+     */
+    public void contextualize( Context context )
+        throws ContextException
+    {
+        container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
+    }
+
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Invoker.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Invoker.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Invoker.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Invoker.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,165 @@
+package org.apache.maven.shared.dependencies.collect.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 java.lang.reflect.InvocationTargetException;
+
+import org.apache.maven.shared.dependencies.collect.DependencyCollectorException;
+
+/**
+ * Invokes method on objects using reflection.
+ */
+final class Invoker
+{
+    private Invoker()
+    {
+        // do not instantiate
+    }
+
+    public static Object invoke( Object object, String method )
+        throws DependencyCollectorException
+    {
+        return invoke( object.getClass(), object, method );
+    }
+
+    public static Object invoke( Class<?> objectClazz, Object object, String method )
+        throws DependencyCollectorException
+    {
+        try
+        {
+            return objectClazz.getMethod( method ).invoke( object );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+    }
+
+    public static Object invoke( Object object, String method, Class<?> argClazz, Object arg )
+        throws DependencyCollectorException
+    {
+        try
+        {
+            final Class<?> objectClazz = object.getClass();
+            return objectClazz.getMethod( method, argClazz ).invoke( object, arg );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+    }
+    
+    public static Object invoke( Class<?> objectClazz, String staticMethod, Class<?> argClazz, Object arg )
+                    throws DependencyCollectorException
+    {
+        try
+        {
+            return objectClazz.getMethod( staticMethod, argClazz ).invoke( null, arg );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            throw new DependencyCollectorException( 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 DependencyCollectorException if any checked exception occurs
+     */
+    public static Object invoke( Class<?> objectClazz, String staticMethod, Class<?>[] argClasses, Object[] args )
+                    throws DependencyCollectorException
+    {
+        try
+        {
+            return objectClazz.getMethod( staticMethod, argClasses ).invoke( null, args );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+    }
+
+    public static Object newInstance( Class<?> objectClazz, Class<?> argClazz, Object arg )
+        throws DependencyCollectorException
+    {
+        try
+        {
+            return objectClazz.getConstructor( argClazz ).newInstance( arg );
+        }
+        catch ( InstantiationException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+    }
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30ArtifactRepositoryAdapter.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30ArtifactRepositoryAdapter.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30ArtifactRepositoryAdapter.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30ArtifactRepositoryAdapter.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,266 @@
+package org.apache.maven.shared.dependencies.collect.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 java.util.List;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadata;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.artifact.repository.Authentication;
+import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.repository.Proxy;
+import org.sonatype.aether.repository.RemoteRepository;
+import org.sonatype.aether.repository.RepositoryPolicy;
+
+/**
+ * ArtifactRepository wrapper around {@link RemoteRepository}
+ * 
+ * @author Robert Scholte
+ *
+ */
+public class Maven30ArtifactRepositoryAdapter implements ArtifactRepository
+{
+    
+    private RemoteRepository remoteRepository;
+
+    /**
+     * @param remoteRepository {@link RemoteRepository}
+     */
+    public Maven30ArtifactRepositoryAdapter( RemoteRepository remoteRepository )
+    {
+        this.remoteRepository = remoteRepository;
+    }
+
+    @Override
+    public String pathOf( Artifact artifact )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String pathOfRemoteRepositoryMetadata( ArtifactMetadata artifactMetadata )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String pathOfLocalRepositoryMetadata( ArtifactMetadata metadata, ArtifactRepository repository )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getUrl()
+    {
+        return remoteRepository.getUrl();
+    }
+
+    @Override
+    public void setUrl( String url )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getBasedir()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getProtocol()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getId()
+    {
+        return remoteRepository.getId();
+    }
+
+    @Override
+    public void setId( String id )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ArtifactRepositoryPolicy getSnapshots()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setSnapshotUpdatePolicy( ArtifactRepositoryPolicy policy )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ArtifactRepositoryPolicy getReleases()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setReleaseUpdatePolicy( ArtifactRepositoryPolicy policy )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ArtifactRepositoryLayout getLayout()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setLayout( ArtifactRepositoryLayout layout )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getKey()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean isUniqueVersion()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean isBlacklisted()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setBlacklisted( boolean blackListed )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Artifact find( Artifact artifact )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<String> findVersions( Artifact artifact )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean isProjectAware()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setAuthentication( Authentication authentication )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Authentication getAuthentication()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setProxy( Proxy proxy )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Proxy getProxy()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String toString()
+    {
+        StringBuilder sb = new StringBuilder();
+
+        sb.append( "       id: " ).append( getId() ).append( "\n" );
+        sb.append( "      url: " ).append( getUrl() ).append( "\n" );
+        sb.append( "   layout: " ).append( "default" ).append( "\n" );
+
+        RepositoryPolicy snapshotPolicy = remoteRepository.getPolicy( true ); 
+        sb.append( "snapshots: [enabled => " ).append( snapshotPolicy.isEnabled() );
+        sb.append( ", update => " ).append( snapshotPolicy.getUpdatePolicy() ).append( "]\n" );
+
+        RepositoryPolicy releasePolicy = remoteRepository.getPolicy( false ); 
+        sb.append( " releases: [enabled => " ).append( releasePolicy.isEnabled() );
+        sb.append( ", update => " ).append( releasePolicy.getUpdatePolicy() ).append( "]\n" );
+
+        return sb.toString();
+    }
+    
+    
+    @Override
+    public int hashCode()
+    {
+        return remoteRepository.hashCode();
+    }
+
+    @Override
+    public boolean equals( Object obj )
+    {
+        if ( this == obj )
+        {
+            return true;
+        }
+        if ( obj == null )
+        {
+            return false;
+        }
+        if ( getClass() != obj.getClass() )
+        {
+            return false;
+        }
+        
+        Maven30ArtifactRepositoryAdapter other = (Maven30ArtifactRepositoryAdapter) obj;
+        if ( remoteRepository == null )
+        {
+            if ( other.remoteRepository != null )
+            {
+                return false;
+            }
+        }
+        else if ( !remoteRepository.equals( other.remoteRepository ) )
+        {
+            return false;
+        }
+        return true;
+    }
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30CollectorResult.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30CollectorResult.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30CollectorResult.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30CollectorResult.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,85 @@
+package org.apache.maven.shared.dependencies.collect.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.shared.dependencies.collect.CollectorResult;
+import org.sonatype.aether.collection.CollectResult;
+import org.sonatype.aether.graph.DependencyNode;
+import org.sonatype.aether.graph.DependencyVisitor;
+import org.sonatype.aether.repository.RemoteRepository;
+
+/**
+ * CollectorResult wrapper around {@link CollectResult} 
+ * 
+ * @author Robert Scholte
+ *
+ */
+public class Maven30CollectorResult implements CollectorResult
+{
+    private final CollectResult collectResult;
+    
+    /**
+     * @param collectResult {@link CollectorResult}
+     */
+    public Maven30CollectorResult( CollectResult collectResult )
+    {
+        this.collectResult = collectResult;
+    }
+
+    @Override
+    public List<ArtifactRepository> getRemoteRepositories()
+    {
+        final Set<RemoteRepository> aetherRepositories = new HashSet<RemoteRepository>();
+        
+        DependencyVisitor visitor = new DependencyVisitor()
+        {
+            @Override
+            public boolean visitEnter( DependencyNode node )
+            {
+                aetherRepositories.addAll( node.getRepositories() );
+                return true;
+            }
+            
+            @Override
+            public boolean visitLeave( DependencyNode node )
+            {
+                return true;
+            }
+        };
+        
+        collectResult.getRoot().accept( visitor );
+        
+        List<ArtifactRepository> mavenRepositories = new ArrayList<ArtifactRepository>( aetherRepositories.size() );
+        
+        for ( RemoteRepository aetherRepository : aetherRepositories )
+        {
+            mavenRepositories.add( new Maven30ArtifactRepositoryAdapter( aetherRepository ) );
+        }
+        
+        return mavenRepositories;
+    }
+
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30DependencyCollector.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30DependencyCollector.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30DependencyCollector.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven30DependencyCollector.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,97 @@
+package org.apache.maven.shared.dependencies.collect.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 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.dependencies.collect.CollectorResult;
+import org.apache.maven.shared.dependencies.collect.DependencyCollector;
+import org.apache.maven.shared.dependencies.collect.DependencyCollectorException;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+import org.sonatype.aether.RepositorySystem;
+import org.sonatype.aether.RepositorySystemSession;
+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.repository.RemoteRepository;
+
+/**
+ * Maven 3.0 implementation of the {@link DependencyCollector}
+ * 
+ * @author Robert Scholte
+ *
+ */
+@Component( role = DependencyCollector.class, hint = "maven3" )
+public class Maven30DependencyCollector
+    implements DependencyCollector
+{
+    @Requirement
+    private RepositorySystem repositorySystem;
+
+    @Requirement
+    private ArtifactHandlerManager artifactHandlerManager;
+
+    @Override
+    public CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest,
+                                                org.apache.maven.model.Dependency root )
+        throws DependencyCollectorException
+    {
+        ArtifactTypeRegistry typeRegistry =
+            (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
+                                                   ArtifactHandlerManager.class, artifactHandlerManager );
+
+        Class<?>[] argClasses = new Class<?>[] { Dependency.class, ArtifactTypeRegistry.class };
+        Object[] args = new Object[] { root, typeRegistry };
+        Dependency aetherRoot = (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
+
+        return collectDependencies( buildingRequest, aetherRoot );
+    }
+
+    private CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest, Dependency aetherRoot )
+        throws DependencyCollectorException
+    {
+        RepositorySystemSession session =
+            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+        CollectRequest request = new CollectRequest();
+        request.setRoot( aetherRoot );
+
+        @SuppressWarnings( "unchecked" )
+        List<RemoteRepository> aetherRepositories =
+            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
+                                                     buildingRequest.getRemoteRepositories() );
+        request.setRepositories( aetherRepositories );
+
+        try
+        {
+            return new Maven30CollectorResult( repositorySystem.collectDependencies( session, request ) );
+        }
+        catch ( DependencyCollectionException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+    }
+
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31ArtifactRepositoryAdapter.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31ArtifactRepositoryAdapter.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31ArtifactRepositoryAdapter.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31ArtifactRepositoryAdapter.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,266 @@
+package org.apache.maven.shared.dependencies.collect.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 java.util.List;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadata;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.artifact.repository.Authentication;
+import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.repository.Proxy;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.repository.RepositoryPolicy;
+
+/**
+ * ArtifactRepository wrapper around {@link RemoteRepository}
+ * 
+ * @author Robert Scholte
+ *
+ */
+public class Maven31ArtifactRepositoryAdapter implements ArtifactRepository
+{
+    
+    private RemoteRepository remoteRepository;
+
+    /**
+     * @param remoteRepository {@link RemoteRepository}
+     */
+    public Maven31ArtifactRepositoryAdapter( RemoteRepository remoteRepository )
+    {
+        this.remoteRepository = remoteRepository;
+    }
+
+    @Override
+    public String pathOf( Artifact artifact )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String pathOfRemoteRepositoryMetadata( ArtifactMetadata artifactMetadata )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String pathOfLocalRepositoryMetadata( ArtifactMetadata metadata, ArtifactRepository repository )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getUrl()
+    {
+        return remoteRepository.getUrl();
+    }
+
+    @Override
+    public void setUrl( String url )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getBasedir()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getProtocol()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getId()
+    {
+        return remoteRepository.getId();
+    }
+
+    @Override
+    public void setId( String id )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ArtifactRepositoryPolicy getSnapshots()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setSnapshotUpdatePolicy( ArtifactRepositoryPolicy policy )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ArtifactRepositoryPolicy getReleases()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setReleaseUpdatePolicy( ArtifactRepositoryPolicy policy )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ArtifactRepositoryLayout getLayout()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setLayout( ArtifactRepositoryLayout layout )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getKey()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean isUniqueVersion()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean isBlacklisted()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setBlacklisted( boolean blackListed )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Artifact find( Artifact artifact )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<String> findVersions( Artifact artifact )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean isProjectAware()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setAuthentication( Authentication authentication )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Authentication getAuthentication()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setProxy( Proxy proxy )
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Proxy getProxy()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String toString()
+    {
+        StringBuilder sb = new StringBuilder();
+
+        sb.append( "       id: " ).append( getId() ).append( "\n" );
+        sb.append( "      url: " ).append( getUrl() ).append( "\n" );
+        sb.append( "   layout: " ).append( "default" ).append( "\n" );
+
+        RepositoryPolicy snapshotPolicy = remoteRepository.getPolicy( true ); 
+        sb.append( "snapshots: [enabled => " ).append( snapshotPolicy.isEnabled() );
+        sb.append( ", update => " ).append( snapshotPolicy.getUpdatePolicy() ).append( "]\n" );
+
+        RepositoryPolicy releasePolicy = remoteRepository.getPolicy( false ); 
+        sb.append( " releases: [enabled => " ).append( releasePolicy.isEnabled() );
+        sb.append( ", update => " ).append( releasePolicy.getUpdatePolicy() ).append( "]\n" );
+
+        return sb.toString();
+    }
+    
+    
+    @Override
+    public int hashCode()
+    {
+        return remoteRepository.hashCode();
+    }
+
+    @Override
+    public boolean equals( Object obj )
+    {
+        if ( this == obj )
+        {
+            return true;
+        }
+        if ( obj == null )
+        {
+            return false;
+        }
+        if ( getClass() != obj.getClass() )
+        {
+            return false;
+        }
+        
+        Maven31ArtifactRepositoryAdapter other = (Maven31ArtifactRepositoryAdapter) obj;
+        if ( remoteRepository == null )
+        {
+            if ( other.remoteRepository != null )
+            {
+                return false;
+            }
+        }
+        else if ( !remoteRepository.equals( other.remoteRepository ) )
+        {
+            return false;
+        }
+        return true;
+    }
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31CollectorResult.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31CollectorResult.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31CollectorResult.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31CollectorResult.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,85 @@
+package org.apache.maven.shared.dependencies.collect.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.shared.dependencies.collect.CollectorResult;
+import org.eclipse.aether.collection.CollectResult;
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.graph.DependencyVisitor;
+import org.eclipse.aether.repository.RemoteRepository;
+
+/**
+ * CollectorResult wrapper around {@link CollectResult}
+ * 
+ * @author Robert Scholte
+ *
+ */
+public class Maven31CollectorResult implements CollectorResult
+{
+    private final CollectResult collectResult;
+    
+    /**
+     * @param collectResult {@link CollectorResult}
+     */
+    public Maven31CollectorResult( CollectResult collectResult )
+    {
+        this.collectResult = collectResult;
+    }
+
+    @Override
+    public List<ArtifactRepository> getRemoteRepositories()
+    {
+        final Set<RemoteRepository> aetherRepositories = new HashSet<RemoteRepository>();
+        
+        DependencyVisitor visitor = new DependencyVisitor()
+        {
+            @Override
+            public boolean visitEnter( DependencyNode node )
+            {
+                aetherRepositories.addAll( node.getRepositories() );
+                return true;
+            }
+            
+            @Override
+            public boolean visitLeave( DependencyNode node )
+            {
+                return true;
+            }
+        };
+        
+        collectResult.getRoot().accept( visitor );
+        
+        List<ArtifactRepository> mavenRepositories = new ArrayList<ArtifactRepository>( aetherRepositories.size() );
+        
+        for ( RemoteRepository aetherRepository : aetherRepositories )
+        {
+            mavenRepositories.add( new Maven31ArtifactRepositoryAdapter( aetherRepository ) );
+        }
+        
+        return mavenRepositories;
+    }
+
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31DependencyCollector.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31DependencyCollector.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31DependencyCollector.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/collect/internal/Maven31DependencyCollector.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,78 @@
+package org.apache.maven.shared.dependencies.collect.internal;
+
+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.dependencies.collect.CollectorResult;
+import org.apache.maven.shared.dependencies.collect.DependencyCollector;
+import org.apache.maven.shared.dependencies.collect.DependencyCollectorException;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.ArtifactTypeRegistry;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.collection.DependencyCollectionException;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.repository.RemoteRepository;
+
+/**
+ * Maven 3.1+ implementation of the {@link DependencyCollector}
+ * 
+ * @author Robert Scholte
+ *
+ */
+@Component( role = DependencyCollector.class, hint = "maven31" )
+public class Maven31DependencyCollector
+    implements DependencyCollector
+{
+    @Requirement
+    private RepositorySystem repositorySystem;
+
+    @Requirement
+    private ArtifactHandlerManager artifactHandlerManager;
+
+    @Override
+    public CollectorResult collectDependencies( final ProjectBuildingRequest buildingRequest,
+                                                org.apache.maven.model.Dependency root )
+        throws DependencyCollectorException
+    {
+        ArtifactTypeRegistry typeRegistry =
+            (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
+                                                   ArtifactHandlerManager.class, artifactHandlerManager );
+
+        Class<?>[] argClasses = new Class<?>[] { org.apache.maven.model.Dependency.class, ArtifactTypeRegistry.class };
+        Object[] args = new Object[] { root, typeRegistry };
+        Dependency aetherRoot = (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
+
+        return collectDependencies( buildingRequest, aetherRoot );
+    }
+
+    private CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Dependency aetherRoot )
+        throws DependencyCollectorException
+    {
+        CollectRequest request = new CollectRequest();
+        request.setRoot( aetherRoot );
+
+        RepositorySystemSession session =
+            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+
+        @SuppressWarnings( "unchecked" )
+        List<RemoteRepository> aetherRepositories =
+            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
+                                                     buildingRequest.getRemoteRepositories() );
+        request.setRepositories( aetherRepositories );
+
+        try
+        {
+            return new Maven31CollectorResult( repositorySystem.collectDependencies( session, request ) );
+        }
+        catch ( DependencyCollectionException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+    }
+
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/DependencyResolver.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/DependencyResolver.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/DependencyResolver.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/DependencyResolver.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,63 @@
+package org.apache.maven.shared.dependencies.resolve;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 java.util.Collection;
+
+import org.apache.maven.model.Dependency;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
+import org.apache.maven.shared.artifact.resolve.ArtifactResult;
+import org.apache.maven.shared.dependencies.DependableCoordinate;
+
+/**
+ * 
+ */
+public interface DependencyResolver
+{
+    /**
+     * 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, Collection, TransformableFilter)} passing
+     * {@code Collections.singletonList(coordinate)}
+     * 
+     * @param buildingRequest {@link ProjectBuildingRequest}
+     * @param coordinate {@link DependableCoordinate}
+     * @param filter {@link TransformableFilter}
+     * @return the resolved dependencies.
+     * @throws DependencyResolverException in case of an error.
+     */
+    Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest, 
+                                                  DependableCoordinate coordinate,
+                                                  TransformableFilter filter ) throws DependencyResolverException;
+
+    /**
+     * @param buildingRequest the project building request, never {@code null}
+     * @param dependencies the dependencies to resolve, can be {@code null}
+     * @param managedDependencies managed dependencies, can be {@code null}
+     * @param filter a filter, can be {@code null}
+     * @return the resolved dependencies.
+     * @throws DependencyResolverException in case of an error.
+     */
+    Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
+                                                  Collection<Dependency> dependencies,
+                                                  Collection<Dependency> managedDependencies,
+                                                  TransformableFilter filter ) throws DependencyResolverException;
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/DependencyResolverException.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/DependencyResolverException.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/DependencyResolverException.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/DependencyResolverException.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,43 @@
+package org.apache.maven.shared.dependencies.resolve;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+/**
+ * 
+ */
+public class DependencyResolverException
+    extends Exception
+{
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 8971449574933775007L;
+
+    /**
+     * @param message The message for the exception.
+     * @param e The exception itself.
+     */
+    public DependencyResolverException( String message, Exception e )
+    {
+        super( message, e );
+    }
+
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/DefaultDependencyResolver.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/DefaultDependencyResolver.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/DefaultDependencyResolver.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/DefaultDependencyResolver.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,121 @@
+package org.apache.maven.shared.dependencies.resolve.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 java.util.Collection;
+
+import org.apache.maven.model.Dependency;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
+import org.apache.maven.shared.artifact.resolve.ArtifactResult;
+import org.apache.maven.shared.dependencies.DependableCoordinate;
+import org.apache.maven.shared.dependencies.resolve.DependencyResolver;
+import org.apache.maven.shared.dependencies.resolve.DependencyResolverException;
+import org.codehaus.plexus.PlexusConstants;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.context.Context;
+import org.codehaus.plexus.context.ContextException;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
+
+/**
+ * 
+ */
+@Component( role = DependencyResolver.class, hint = "default" )
+public class DefaultDependencyResolver
+    implements DependencyResolver, Contextualizable
+{
+    private PlexusContainer container;
+
+    @Override
+    public Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
+                                                         Collection<Dependency> coordinates,
+                                                         Collection<Dependency> managedDependencies,
+                                                         TransformableFilter filter )
+                                                             throws DependencyResolverException
+    {
+        try
+        {
+            String hint = isMaven31() ? "maven31" : "maven3";
+
+            DependencyResolver effectiveArtifactResolver = container.lookup( DependencyResolver.class, hint );
+
+            return effectiveArtifactResolver.resolveDependencies( buildingRequest, coordinates, null, filter );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+    }
+
+    @Override
+    public Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
+                                                         DependableCoordinate coordinate, TransformableFilter filter )
+                                                             throws DependencyResolverException
+    {
+        try
+        {
+            String hint = isMaven31() ? "maven31" : "maven3";
+
+            DependencyResolver effectiveArtifactResolver = container.lookup( DependencyResolver.class, hint );
+
+            return effectiveArtifactResolver.resolveDependencies( buildingRequest, coordinate, filter );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+    }
+
+    /**
+     * @return true if the current Maven version is Maven 3.1.
+     */
+    protected static boolean isMaven31()
+    {
+        return canFindCoreClass( "org.eclipse.aether.artifact.Artifact" ); // Maven 3.1 specific
+    }
+
+    private static boolean canFindCoreClass( String className )
+    {
+        try
+        {
+            Thread.currentThread().getContextClassLoader().loadClass( className );
+
+            return true;
+        }
+        catch ( ClassNotFoundException e )
+        {
+            return false;
+        }
+    }
+
+    /**
+     * Injects the Plexus content.
+     *
+     * @param context Plexus context to inject.
+     * @throws ContextException if the PlexusContainer could not be located.
+     */
+    public void contextualize( Context context )
+        throws ContextException
+    {
+        container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
+    }
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Invoker.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Invoker.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Invoker.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Invoker.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,136 @@
+package org.apache.maven.shared.dependencies.resolve.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 java.lang.reflect.InvocationTargetException;
+
+import org.apache.maven.shared.dependencies.resolve.DependencyResolverException;
+
+/**
+ * Invokes method on objects using reflection.
+ */
+final class Invoker
+{
+    private Invoker()
+    {
+        // do not instantiate
+    }
+
+    public static Object invoke( Object object, String method )
+        throws DependencyResolverException
+    {
+        return invoke( object.getClass(), object, method );
+    }
+
+    public static Object invoke( Class<?> objectClazz, Object object, String method )
+        throws DependencyResolverException
+    {
+        try
+        {
+            return objectClazz.getMethod( method ).invoke( object );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+    }
+
+    public static Object invoke( Object object, String method, Class<?> argClazz, Object arg )
+        throws DependencyResolverException
+    {
+        try
+        {
+            final Class<?> objectClazz = object.getClass();
+            return objectClazz.getMethod( method, argClazz ).invoke( object, arg );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+    }
+
+    public static Object invoke( Class<?> objectClazz, String staticMethod, Class<?> argClazz, Object arg )
+        throws DependencyResolverException
+    {
+        try
+        {
+            return objectClazz.getMethod( staticMethod, argClazz ).invoke( null, arg );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            throw new DependencyResolverException( 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 DependencyResolverException
+    {
+        try
+        {
+            return objectClazz.getMethod( staticMethod, argClasses ).invoke( null, args );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+        catch ( InvocationTargetException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+        catch ( NoSuchMethodException e )
+        {
+            throw new DependencyResolverException( e.getMessage(), e );
+        }
+    }
+}

Added: maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Maven30ArtifactResult.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Maven30ArtifactResult.java?rev=1747984&view=auto
==============================================================================
--- maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Maven30ArtifactResult.java (added)
+++ maven/shared/trunk/maven-artifact-transfer/src/main/java/org/apache/maven/shared/dependencies/resolve/internal/Maven30ArtifactResult.java Sun Jun 12 12:02:29 2016
@@ -0,0 +1,59 @@
+package org.apache.maven.shared.dependencies.resolve.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.RepositoryUtils;
+import org.apache.maven.shared.dependencies.resolve.DependencyResolverException;
+import org.sonatype.aether.artifact.Artifact;
+import org.sonatype.aether.resolution.ArtifactResult;
+
+/**
+ * {@link org.apache.maven.shared.artifact.resolve.ArtifactResult} wrapper for {@link ArtifactResult}
+ * 
+ * @author Robert Scholte
+ * @since 3.0
+ */
+public class Maven30ArtifactResult
+    implements org.apache.maven.shared.artifact.resolve.ArtifactResult
+{
+    private final ArtifactResult artifactResult;
+
+    /**
+     * @param artifactResult {@link ArtifactResult}
+     */
+    public Maven30ArtifactResult( ArtifactResult artifactResult )
+    {
+        this.artifactResult = artifactResult;
+    }
+
+    @Override
+    public org.apache.maven.artifact.Artifact getArtifact()
+    {
+        try
+        {
+            return (org.apache.maven.artifact.Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
+                                                                        Artifact.class, artifactResult.getArtifact() );
+        }
+        catch ( DependencyResolverException e )
+        {
+            throw new RuntimeException( e );
+        }
+    }
+}