From d5dc17df18ae38230761b9ce9efbfdd66217ec37 Mon Sep 17 00:00:00 2001
From: Mikolaj Izdebski <mizdebsk@redhat.com>
Date: Mon, 6 Jul 2015 09:57:22 +0200
Subject: [PATCH 05/17] Port to Maven 3.3.9 and Eclipse Aether

---
 gradle/dependencies.gradle                    | 23 ++++++---
 .../internal/maven/MavenProjectsCreator.java  |  7 +--
 .../action/AbstractMavenPublishAction.java    | 49 +++++++++----------
 .../action/LoggingMavenTransferListener.java  |  6 +--
 .../internal/action/MavenDeployAction.java    | 31 ++++++------
 .../internal/action/MavenInstallAction.java   | 10 ++--
 .../action/SnapshotVersionManager.java        | 16 +++---
 7 files changed, 76 insertions(+), 66 deletions(-)

diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle
index 73cf0b1ee08..54dc27d7fbe 100755
--- a/gradle/dependencies.gradle
+++ b/gradle/dependencies.gradle
@@ -123,12 +123,18 @@ libraries.nekohtml = dependencies.module("net.sourceforge.nekohtml:nekohtml:1.9.
 libraries.maven3 = dependencies.module("org.apache.maven:maven-core:${versions.maven}") {
     dependency "org.apache.maven:maven-settings:${versions.maven}@jar"
     dependency "org.apache.maven:maven-settings-builder:${versions.maven}@jar"
+    dependency "org.apache.maven:maven-builder-support:${versions.maven}@jar"
+
+    //sisu:
+    dependency "org.eclipse.sisu:org.eclipse.sisu.plexus:0.3.0@jar"
+    dependency "org.eclipse.sisu:org.eclipse.sisu.inject:0.3.0@jar"
+    dependency "org.sonatype.sisu:sisu-guice:3.2.5:no_aop@jar"
+    dependency "javax.inject:javax.inject:1@jar"
 
     //plexus:
     dependency "org.codehaus.plexus:plexus-utils:2.1@jar"
     dependency "org.codehaus.plexus:plexus-interpolation:1.14@jar"
     dependency "org.codehaus.plexus:plexus-component-annotations:1.5.5@jar"
-    dependency "org.codehaus.plexus:plexus-container-default:1.5.5@jar"
     dependency "org.codehaus.plexus:plexus-classworlds:2.4@jar"
 
     //sonatype plexus
@@ -150,14 +156,17 @@ libraries.maven3 = dependencies.module("org.apache.maven:maven-core:${versions.m
     dependency 'org.apache.maven.wagon:wagon-file:2.4@jar'
     dependency 'org.apache.maven.wagon:wagon-http:2.4@jar'
     dependency 'org.apache.maven.wagon:wagon-provider-api:2.4@jar'
-    dependency 'org.apache.maven.wagon:wagon-http-shared4:2.4@jar'
+    dependency 'org.apache.maven.wagon:wagon-http-shared:2.4@jar'
 
     //eather:
-    dependency "org.sonatype.aether:aether-api:1.13.1@jar"
-    dependency "org.sonatype.aether:aether-impl:1.13.1@jar"
-    dependency "org.sonatype.aether:aether-spi:1.13.1@jar"
-    dependency "org.sonatype.aether:aether-util:1.13.1@jar"
-    dependency 'org.sonatype.aether:aether-connector-wagon:1.13.1@jar'
+    dependency "org.eclipse.aether:aether-api:1.0.0.v20140518@jar"
+    dependency "org.eclipse.aether:aether-impl:1.0.0.v20140518@jar"
+    dependency "org.eclipse.aether:aether-spi:1.0.0.v20140518@jar"
+    dependency "org.eclipse.aether:aether-util:1.0.0.v20140518@jar"
+    dependency 'org.eclipse.aether:aether-connector-basic:1.0.0.v20140518@jar'
+    dependency 'org.eclipse.aether:aether-transport-wagon:1.0.0.v20140518@jar'
+
+    dependency 'org.apache.commons:commons-lang3:3.4@jar'
 }
 
 libraries.spock = [
diff --git a/subprojects/build-init/src/main/java/org/gradle/buildinit/plugins/internal/maven/MavenProjectsCreator.java b/subprojects/build-init/src/main/java/org/gradle/buildinit/plugins/internal/maven/MavenProjectsCreator.java
index 7a858124b29..69a580405b4 100644
--- a/subprojects/build-init/src/main/java/org/gradle/buildinit/plugins/internal/maven/MavenProjectsCreator.java
+++ b/subprojects/build-init/src/main/java/org/gradle/buildinit/plugins/internal/maven/MavenProjectsCreator.java
@@ -25,12 +25,13 @@ import org.apache.maven.settings.Settings;
 import org.codehaus.plexus.ContainerConfiguration;
 import org.codehaus.plexus.DefaultContainerConfiguration;
 import org.codehaus.plexus.DefaultPlexusContainer;
+import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainerException;
 import org.codehaus.plexus.classworlds.ClassWorld;
 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.codehaus.plexus.configuration.PlexusConfigurationException;
-import org.sonatype.aether.RepositorySystemSession;
-import org.sonatype.aether.util.DefaultRepositorySystemSession;
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositorySystemSession;
 import org.gradle.util.CollectionUtils;
 
 import java.io.File;
@@ -55,7 +56,7 @@ public class MavenProjectsCreator {
     private Set<MavenProject> createNow(Settings settings, File pomFile) throws PlexusContainerException, PlexusConfigurationException, ComponentLookupException, MavenExecutionRequestPopulationException, ProjectBuildingException {
         ContainerConfiguration containerConfiguration = new DefaultContainerConfiguration()
                 .setClassWorld(new ClassWorld("plexus.core", ClassWorld.class.getClassLoader()))
-                .setName("mavenCore");
+                .setName("mavenCore").setClassPathScanning(PlexusConstants.SCANNING_INDEX).setAutoWiring(true);
 
         DefaultPlexusContainer container = new DefaultPlexusContainer(containerConfiguration);
         ProjectBuilder builder = container.lookup(ProjectBuilder.class);
diff --git a/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/AbstractMavenPublishAction.java b/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/AbstractMavenPublishAction.java
index 9dd6e695afd..7d65dde67e3 100644
--- a/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/AbstractMavenPublishAction.java
+++ b/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/AbstractMavenPublishAction.java
@@ -18,11 +18,11 @@ package org.gradle.api.publication.maven.internal.action;
 
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.apache.maven.repository.internal.MavenRepositorySystemSession;
-import org.apache.maven.repository.internal.SnapshotMetadataGeneratorFactory;
-import org.apache.maven.repository.internal.VersionsMetadataGeneratorFactory;
+import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.codehaus.plexus.ContainerConfiguration;
 import org.codehaus.plexus.DefaultContainerConfiguration;
 import org.codehaus.plexus.DefaultPlexusContainer;
+import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.PlexusContainerException;
 import org.codehaus.plexus.classworlds.ClassWorld;
@@ -30,16 +30,16 @@ import org.codehaus.plexus.classworlds.realm.ClassRealm;
 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.gradle.api.GradleException;
 import org.gradle.internal.UncheckedException;
-import org.sonatype.aether.RepositoryException;
-import org.sonatype.aether.RepositorySystem;
-import org.sonatype.aether.RepositorySystemSession;
-import org.sonatype.aether.artifact.Artifact;
-import org.sonatype.aether.artifact.ArtifactType;
-import org.sonatype.aether.impl.Deployer;
-import org.sonatype.aether.impl.internal.DefaultDeployer;
-import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
-import org.sonatype.aether.util.DefaultRepositorySystemSession;
-import org.sonatype.aether.util.artifact.DefaultArtifact;
+import org.eclipse.aether.RepositoryException;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.ArtifactType;
+import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
+import org.eclipse.aether.repository.LocalRepository;
+import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.artifact.DefaultArtifact;
 
 import java.io.File;
 import java.io.FileReader;
@@ -60,9 +60,8 @@ abstract class AbstractMavenPublishAction implements MavenPublishAction {
 
     protected AbstractMavenPublishAction(File pomFile, List<File> wagonJars) {
         container = newPlexusContainer(wagonJars);
-        session = new MavenRepositorySystemSession();
+        session = MavenRepositorySystemUtils.newSession();
         session.setTransferListener(new LoggingMavenTransferListener());
-        session.getConfigProperties().put("maven.metadata.legacy", "true");
 
         Model pom = parsePom(pomFile);
         pomArtifact = new DefaultArtifact(pom.getGroupId(), pom.getArtifactId(), "pom", pom.getVersion()).setFile(pomFile);
@@ -70,7 +69,11 @@ abstract class AbstractMavenPublishAction implements MavenPublishAction {
     }
 
     public void setLocalMavenRepositoryLocation(File localMavenRepository) {
-        session.setLocalRepositoryManager(new SimpleLocalRepositoryManager(localMavenRepository));
+        try {
+            session.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory().newInstance(session, new LocalRepository(localMavenRepository)));
+        } catch (NoLocalRepositoryManagerException e) {
+            throw UncheckedException.throwAsUncheckedException(e);
+        }
     }
 
     public void setMainArtifact(File file) {
@@ -117,7 +120,11 @@ abstract class AbstractMavenPublishAction implements MavenPublishAction {
                     classRealm.addURL(jar.toURI().toURL());
                 }
             }
-            return new DefaultPlexusContainer(new DefaultContainerConfiguration().setRealm(classRealm));
+            ContainerConfiguration conf = new DefaultContainerConfiguration();
+            conf.setClassPathScanning(PlexusConstants.SCANNING_INDEX);
+            conf.setAutoWiring(true);
+            conf.setRealm(classRealm);
+            return new DefaultPlexusContainer(conf);
         } catch (PlexusContainerException e) {
             throw UncheckedException.throwAsUncheckedException(e);
         } catch (MalformedURLException e) {
@@ -127,14 +134,6 @@ abstract class AbstractMavenPublishAction implements MavenPublishAction {
 
     private RepositorySystem newRepositorySystem() {
         try {
-            DefaultDeployer deployer = (DefaultDeployer) getContainer().lookup(Deployer.class);
-            // This is a workaround for https://issues.gradle.org/browse/GRADLE-3324.
-            // Somehow the ArrayList 'result' in `org.sonatype.aether.impl.internal.Utils#sortMetadataGeneratorFactories` ends up
-            // being a list of nulls on windows and IBM's 1.6 JDK.
-            deployer.setMetadataFactories(null);
-            deployer.addMetadataGeneratorFactory(new VersionsMetadataGeneratorFactory());
-            deployer.addMetadataGeneratorFactory(new SnapshotMetadataGeneratorFactory());
-            deployer.addMetadataGeneratorFactory(snapshotVersionManager);
             return container.lookup(RepositorySystem.class);
         } catch (ComponentLookupException e) {
             throw UncheckedException.throwAsUncheckedException(e);
diff --git a/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/LoggingMavenTransferListener.java b/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/LoggingMavenTransferListener.java
index 5d75a16744b..46287cff506 100644
--- a/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/LoggingMavenTransferListener.java
+++ b/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/LoggingMavenTransferListener.java
@@ -18,9 +18,9 @@ package org.gradle.api.publication.maven.internal.action;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.sonatype.aether.transfer.AbstractTransferListener;
-import org.sonatype.aether.transfer.TransferEvent;
-import org.sonatype.aether.transfer.TransferEvent.RequestType;
+import org.eclipse.aether.transfer.AbstractTransferListener;
+import org.eclipse.aether.transfer.TransferEvent;
+import org.eclipse.aether.transfer.TransferEvent.RequestType;
 
 class LoggingMavenTransferListener extends AbstractTransferListener {
     private static final Logger LOGGER = LoggerFactory.getLogger(LoggingMavenTransferListener.class);
diff --git a/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/MavenDeployAction.java b/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/MavenDeployAction.java
index 220e8535c18..c9891dfb583 100644
--- a/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/MavenDeployAction.java
+++ b/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/MavenDeployAction.java
@@ -19,14 +19,15 @@ import org.apache.maven.artifact.ant.RemoteRepository;
 import org.gradle.api.GradleException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.sonatype.aether.RepositorySystem;
-import org.sonatype.aether.RepositorySystemSession;
-import org.sonatype.aether.artifact.Artifact;
-import org.sonatype.aether.deployment.DeployRequest;
-import org.sonatype.aether.deployment.DeploymentException;
-import org.sonatype.aether.repository.Authentication;
-import org.sonatype.aether.repository.Proxy;
-import org.sonatype.aether.util.repository.DefaultProxySelector;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.deployment.DeploymentException;
+import org.eclipse.aether.repository.Authentication;
+import org.eclipse.aether.repository.Proxy;
+import org.eclipse.aether.util.repository.AuthenticationBuilder;
+import org.eclipse.aether.util.repository.DefaultProxySelector;
 
 import java.io.File;
 import java.util.Collection;
@@ -57,7 +58,7 @@ public class MavenDeployAction extends AbstractMavenPublishAction {
             throw new GradleException("Must specify a repository for deployment");
         }
 
-        org.sonatype.aether.repository.RemoteRepository aetherRepo = createRepository(gradleRepo);
+        org.eclipse.aether.repository.RemoteRepository aetherRepo = createRepository(gradleRepo);
 
         DeployRequest request = new DeployRequest();
         request.setRepository(aetherRepo);
@@ -69,22 +70,22 @@ public class MavenDeployAction extends AbstractMavenPublishAction {
         repositorySystem.deploy(session, request);
     }
 
-    private org.sonatype.aether.repository.RemoteRepository createRepository(RemoteRepository gradleRepo) {
-        org.sonatype.aether.repository.RemoteRepository repo = new org.sonatype.aether.repository.RemoteRepository("remote", gradleRepo.getLayout(), gradleRepo.getUrl());
+    private org.eclipse.aether.repository.RemoteRepository createRepository(RemoteRepository gradleRepo) {
+        org.eclipse.aether.repository.RemoteRepository.Builder repoBuilder = new org.eclipse.aether.repository.RemoteRepository.Builder("remote", gradleRepo.getLayout(), gradleRepo.getUrl());
 
         org.apache.maven.artifact.ant.Authentication auth = gradleRepo.getAuthentication();
         if (auth != null) {
-            repo.setAuthentication(new Authentication(auth.getUserName(), auth.getPassword(), auth.getPrivateKey(), auth.getPassphrase()));
+            repoBuilder.setAuthentication(new AuthenticationBuilder().addUsername(auth.getUserName()).addPassword(auth.getPassword()).addPrivateKey(auth.getPrivateKey(), auth.getPassphrase()).build());
         }
 
         org.apache.maven.artifact.ant.Proxy proxy = gradleRepo.getProxy();
         if (proxy != null) {
             DefaultProxySelector proxySelector = new DefaultProxySelector();
-            Authentication proxyAuth = new Authentication(proxy.getUserName(), proxy.getPassword());
+            Authentication proxyAuth = new AuthenticationBuilder().addUsername(proxy.getUserName()).addPassword(proxy.getPassword()).build();
             proxySelector.add(new Proxy(proxy.getType(), proxy.getHost(), proxy.getPort(), proxyAuth), proxy.getNonProxyHosts());
-            repo.setProxy(proxySelector.getProxy(repo));
+            repoBuilder.setProxy(proxySelector.getProxy(repoBuilder.build()));
         }
 
-        return repo;
+        return repoBuilder.build();
     }
 }
diff --git a/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/MavenInstallAction.java b/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/MavenInstallAction.java
index 37d9dc52d5b..3b121111f2b 100644
--- a/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/MavenInstallAction.java
+++ b/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/MavenInstallAction.java
@@ -15,11 +15,11 @@
  */
 package org.gradle.api.publication.maven.internal.action;
 
-import org.sonatype.aether.RepositorySystem;
-import org.sonatype.aether.RepositorySystemSession;
-import org.sonatype.aether.artifact.Artifact;
-import org.sonatype.aether.installation.InstallRequest;
-import org.sonatype.aether.installation.InstallationException;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.installation.InstallRequest;
+import org.eclipse.aether.installation.InstallationException;
 
 import java.io.File;
 import java.util.Collection;
diff --git a/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/SnapshotVersionManager.java b/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/SnapshotVersionManager.java
index 1fedf1d281a..b1ee8c09a1a 100644
--- a/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/SnapshotVersionManager.java
+++ b/subprojects/maven/src/main/java/org/gradle/api/publication/maven/internal/action/SnapshotVersionManager.java
@@ -16,13 +16,13 @@
 
 package org.gradle.api.publication.maven.internal.action;
 
-import org.sonatype.aether.RepositorySystemSession;
-import org.sonatype.aether.artifact.Artifact;
-import org.sonatype.aether.deployment.DeployRequest;
-import org.sonatype.aether.impl.MetadataGenerator;
-import org.sonatype.aether.impl.MetadataGeneratorFactory;
-import org.sonatype.aether.installation.InstallRequest;
-import org.sonatype.aether.metadata.Metadata;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.impl.MetadataGenerator;
+import org.eclipse.aether.impl.MetadataGeneratorFactory;
+import org.eclipse.aether.installation.InstallRequest;
+import org.eclipse.aether.metadata.Metadata;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -35,7 +35,7 @@ class SnapshotVersionManager implements MetadataGeneratorFactory, MetadataGenera
     }
 
     @Override
-    public int getPriority() {
+    public float getPriority() {
         return -100;
     }
 
-- 
2.17.2

