use aether APIs rather than Maven implementation for dependency gathering

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/weaver/trunk@1748321 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/maven-plugin/pom.xml b/maven-plugin/pom.xml
index a0411f2..78c6b8a 100644
--- a/maven-plugin/pom.xml
+++ b/maven-plugin/pom.xml
@@ -34,8 +34,9 @@
 
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <maven.version>3.0.4</maven.version>
+    <maven.version>3.1.0</maven.version>
     <maven.plugin.version>3.1</maven.plugin.version>
+    <aether.version>1.1.0</aether.version>
   </properties>
 
   <scm>
@@ -72,6 +73,16 @@
       <artifactId>plexus-utils</artifactId>
       <version>2.0.6</version>
     </dependency>
+    <dependency>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-api</artifactId>
+      <version>${aether.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.aether</groupId>
+      <artifactId>aether-util</artifactId>
+      <version>${aether.version}</version>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
diff --git a/maven-plugin/src/main/java/org/apache/commons/weaver/maven/AbstractCWMojo.java b/maven-plugin/src/main/java/org/apache/commons/weaver/maven/AbstractCWMojo.java
index b73c96a..c0880dc 100755
--- a/maven-plugin/src/main/java/org/apache/commons/weaver/maven/AbstractCWMojo.java
+++ b/maven-plugin/src/main/java/org/apache/commons/weaver/maven/AbstractCWMojo.java
@@ -19,22 +19,47 @@
 package org.apache.commons.weaver.maven;
 
 import java.io.File;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Properties;
+import java.util.Set;
 
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.maven.RepositoryUtils;
+import org.apache.maven.model.Dependency;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.resolution.ArtifactResult;
+import org.eclipse.aether.resolution.DependencyRequest;
+import org.eclipse.aether.resolution.DependencyResolutionException;
+import org.eclipse.aether.resolution.DependencyResult;
+import org.eclipse.aether.util.artifact.JavaScopes;
+import org.eclipse.aether.util.filter.ScopeDependencyFilter;
 
 /**
  * Defines common properties and high-level management common to all commons-weaver Maven goals.
  */
 abstract class AbstractCWMojo extends AbstractMojo {
+    /**
+     * Marks a mojo as requiring dependencies in {@link JavaScopes#TEST} scope.
+     */
+    @Target(ElementType.TYPE)
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface TestScope {
+    }
 
     /**
      * {@code verbose} parameter.
@@ -51,21 +76,22 @@
     @Parameter(defaultValue = "${project}")
     protected MavenProject project;
 
-    /**
-     * Get the classpath for this prepare mojo.
-     * @return {@link List} of {@link String}
-     * @throws DependencyResolutionRequiredException
-     */
-    protected abstract List<String> getClasspath() throws DependencyResolutionRequiredException;
+    @Component
+    protected RepositorySystem repositorySystem;
+
+    @Parameter(defaultValue = "${repositorySystemSession}", readonly = true)
+    protected RepositorySystemSession repositorySystemSession;
 
     /**
      * Get the target directory for this prepare mojo.
+     * 
      * @return {@link File}
      */
     protected abstract File getTarget();
 
     /**
      * Execute this mojo.
+     * 
      * @throws MojoExecutionException in the event of failure
      */
     @Override
@@ -73,23 +99,16 @@
         final JavaLoggingToMojoLoggingRedirector logRedirector = new JavaLoggingToMojoLoggingRedirector(getLog());
         logRedirector.activate();
 
-        project.setArtifactFilter(new ArtifactFilter() {
-
-            @Override
-            public boolean include(Artifact artifact) {
-                return true;
-            }
-        });
         try {
             final List<String> classpath;
             try {
-                classpath = getClasspath();
-            } catch (DependencyResolutionRequiredException e) {
+                classpath = createClasspath();
+            } catch (DependencyResolutionException e) {
                 throw new MojoExecutionException("Error getting classpath artifacts", e);
             }
             final File target = getTarget();
             final Properties config = weaverConfig == null ? new Properties() : weaverConfig;
-            
+
             getLog().debug(String.format("classpath=%s%ntarget=%s%nconfig=%s", classpath, target, config));
 
             doExecute(target, classpath, config);
@@ -101,4 +120,33 @@
     protected abstract void doExecute(File target, List<String> classpath, Properties config)
         throws MojoExecutionException, MojoFailureException;
 
+    private List<String> createClasspath() throws DependencyResolutionException {
+        final CollectRequest collect = new CollectRequest();
+        collect.setRootArtifact(RepositoryUtils.toArtifact(project.getArtifact()));
+        collect.setRequestContext("project");
+        collect.setRepositories(project.getRemoteProjectRepositories());
+
+        for (Dependency dependency : project.getDependencies()) {
+            // guard against case where best-effort resolution for invalid models is requested:
+            if (StringUtils.isAnyBlank(dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion())) {
+                continue;
+            }
+            collect.addDependency(
+                RepositoryUtils.toDependency(dependency, repositorySystemSession.getArtifactTypeRegistry()));
+        }
+        final DependencyResult dependencyResult =
+            repositorySystem.resolveDependencies(repositorySystemSession, new DependencyRequest()
+                .setFilter(new ScopeDependencyFilter(getExcludeScopes())).setCollectRequest(collect));
+
+        final Set<String> result = new LinkedHashSet<String>();
+        for (ArtifactResult artifactResult : dependencyResult.getArtifactResults()) {
+            result.add(artifactResult.getArtifact().getFile().getAbsolutePath());
+        }
+        return new ArrayList<String>(result);
+    }
+
+    private String[] getExcludeScopes() {
+        return getClass().isAnnotationPresent(TestScope.class) ? ArrayUtils.EMPTY_STRING_ARRAY
+            : new String[] { JavaScopes.TEST };
+    }
 }
diff --git a/maven-plugin/src/main/java/org/apache/commons/weaver/maven/PrepareMojo.java b/maven-plugin/src/main/java/org/apache/commons/weaver/maven/PrepareMojo.java
index c78e67d..eda7622 100644
--- a/maven-plugin/src/main/java/org/apache/commons/weaver/maven/PrepareMojo.java
+++ b/maven-plugin/src/main/java/org/apache/commons/weaver/maven/PrepareMojo.java
@@ -19,12 +19,7 @@
 package org.apache.commons.weaver.maven;
 
 import java.io.File;
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
 
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.model.Build;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -51,17 +46,6 @@
      * {@inheritDoc}
      */
     @Override
-    protected List<String> getClasspath() throws DependencyResolutionRequiredException {
-        final Set<String> result = new LinkedHashSet<String>();
-        result.addAll(project.getCompileClasspathElements());
-        result.addAll(project.getRuntimeClasspathElements());
-        return new ArrayList<String>(result);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     protected File getTarget() {
         return target;
     }
diff --git a/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestPrepareMojo.java b/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestPrepareMojo.java
index 79f85a2..849d5e9 100644
--- a/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestPrepareMojo.java
+++ b/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestPrepareMojo.java
@@ -19,9 +19,8 @@
 package org.apache.commons.weaver.maven;
 
 import java.io.File;
-import java.util.List;
 
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
+import org.apache.commons.weaver.maven.AbstractCWMojo.TestScope;
 import org.apache.maven.model.Build;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -37,6 +36,7 @@
     requiresDependencyCollection = ResolutionScope.TEST,
     requiresDependencyResolution = ResolutionScope.TEST
 )
+@TestScope
 public class TestPrepareMojo extends AbstractPrepareMojo {
     /**
      * {@link Build#getTestOutputDirectory()}.
@@ -48,14 +48,6 @@
      * {@inheritDoc}
      */
     @Override
-    protected List<String> getClasspath() throws DependencyResolutionRequiredException {
-        return project.getTestClasspathElements();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     protected File getTarget() {
         return target;
     }
diff --git a/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestWeaveMojo.java b/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestWeaveMojo.java
index 5500ccb..db714f6 100644
--- a/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestWeaveMojo.java
+++ b/maven-plugin/src/main/java/org/apache/commons/weaver/maven/TestWeaveMojo.java
@@ -21,7 +21,7 @@
 import java.io.File;
 import java.util.List;
 
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
+import org.apache.commons.weaver.maven.AbstractCWMojo.TestScope;
 import org.apache.maven.model.Build;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -38,6 +38,7 @@
     requiresDependencyCollection = ResolutionScope.TEST,
     requiresDependencyResolution = ResolutionScope.TEST
 )
+@TestScope
 public class TestWeaveMojo extends AbstractWeaveMojo {
 
     /**
@@ -56,14 +57,6 @@
      * {@inheritDoc}
      */
     @Override
-    protected List<String> getClasspath() throws DependencyResolutionRequiredException {
-        return project.getTestClasspathElements();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     protected File getTarget() {
         return target;
     }
diff --git a/maven-plugin/src/main/java/org/apache/commons/weaver/maven/WeaveMojo.java b/maven-plugin/src/main/java/org/apache/commons/weaver/maven/WeaveMojo.java
index e85128d..a5d37af 100644
--- a/maven-plugin/src/main/java/org/apache/commons/weaver/maven/WeaveMojo.java
+++ b/maven-plugin/src/main/java/org/apache/commons/weaver/maven/WeaveMojo.java
@@ -19,12 +19,7 @@
 package org.apache.commons.weaver.maven;
 
 import java.io.File;
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
 
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.model.Build;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -52,17 +47,6 @@
      * {@inheritDoc}
      */
     @Override
-    protected List<String> getClasspath() throws DependencyResolutionRequiredException {
-        final Set<String> result = new LinkedHashSet<String>();
-        result.addAll(project.getCompileClasspathElements());
-        result.addAll(project.getRuntimeClasspathElements());
-        return new ArrayList<String>(result);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     protected File getTarget() {
         return target;
     }