From 9a63fa09e4b00c4523d0f5dc6f9ffc3012841d3d Mon Sep 17 00:00:00 2001
From: Mikolaj Izdebski <mizdebsk@redhat.com>
Date: Sun, 9 Nov 2014 21:37:37 +0100
Subject: [PATCH 04/13] Implement XMvn repository factory method
---
.../internal/artifacts/BaseRepositoryFactory.java | 3 ++
.../artifacts/dsl/DefaultRepositoryHandler.java | 5 +++
.../repositories/DefaultBaseRepositoryFactory.java | 44 ++++++++++++++++++++++
3 files changed, 52 insertions(+)
diff --git a/subprojects/core/src/main/groovy/org/gradle/api/internal/artifacts/BaseRepositoryFactory.java b/subprojects/core/src/main/groovy/org/gradle/api/internal/artifacts/BaseRepositoryFactory.java
index 77b56db..ea557ee 100644
--- a/subprojects/core/src/main/groovy/org/gradle/api/internal/artifacts/BaseRepositoryFactory.java
+++ b/subprojects/core/src/main/groovy/org/gradle/api/internal/artifacts/BaseRepositoryFactory.java
@@ -15,6 +15,7 @@
*/
package org.gradle.api.internal.artifacts;
+import org.gradle.api.artifacts.repositories.ArtifactRepository;
import org.gradle.api.artifacts.repositories.FlatDirectoryArtifactRepository;
import org.gradle.api.artifacts.repositories.IvyArtifactRepository;
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
@@ -34,4 +35,6 @@ public interface BaseRepositoryFactory {
IvyArtifactRepository createIvyRepository();
MavenArtifactRepository createMavenRepository();
+
+ ArtifactRepository createXMvnResolver();
}
diff --git a/subprojects/core/src/main/groovy/org/gradle/api/internal/artifacts/dsl/DefaultRepositoryHandler.java b/subprojects/core/src/main/groovy/org/gradle/api/internal/artifacts/dsl/DefaultRepositoryHandler.java
index 7461f8f..207c63f 100644
--- a/subprojects/core/src/main/groovy/org/gradle/api/internal/artifacts/dsl/DefaultRepositoryHandler.java
+++ b/subprojects/core/src/main/groovy/org/gradle/api/internal/artifacts/dsl/DefaultRepositoryHandler.java
@@ -18,6 +18,7 @@ package org.gradle.api.internal.artifacts.dsl;
import groovy.lang.Closure;
import org.gradle.api.Action;
import org.gradle.api.artifacts.dsl.RepositoryHandler;
+import org.gradle.api.artifacts.repositories.ArtifactRepository;
import org.gradle.api.artifacts.repositories.FlatDirectoryArtifactRepository;
import org.gradle.api.artifacts.repositories.IvyArtifactRepository;
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
@@ -40,6 +41,7 @@ public class DefaultRepositoryHandler extends DefaultArtifactRepositoryContainer
public static final String FLAT_DIR_DEFAULT_NAME = "flatDir";
private static final String MAVEN_REPO_DEFAULT_NAME = "maven";
private static final String IVY_REPO_DEFAULT_NAME = "ivy";
+ private static final String XMVN_REPO_DEFAULT_NAME = "xmvn";
private final BaseRepositoryFactory repositoryFactory;
@@ -101,5 +103,8 @@ public class DefaultRepositoryHandler extends DefaultArtifactRepositoryContainer
return ivy(new ClosureBackedAction<IvyArtifactRepository>(closure));
}
+ public ArtifactRepository xmvn() {
+ return addRepository(repositoryFactory.createXMvnResolver(), XMVN_REPO_DEFAULT_NAME);
+ }
}
diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/DefaultBaseRepositoryFactory.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/DefaultBaseRepositoryFactory.java
index 921405e..133bdb8 100644
--- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/DefaultBaseRepositoryFactory.java
+++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/DefaultBaseRepositoryFactory.java
@@ -17,6 +17,7 @@
package org.gradle.api.internal.artifacts.repositories;
import org.gradle.api.artifacts.dsl.RepositoryHandler;
+import org.gradle.api.artifacts.repositories.ArtifactRepository;
import org.gradle.api.artifacts.repositories.AuthenticationContainer;
import org.gradle.api.artifacts.repositories.FlatDirectoryArtifactRepository;
import org.gradle.api.artifacts.repositories.IvyArtifactRepository;
@@ -38,7 +39,13 @@ import org.gradle.internal.resource.local.FileStore;
import org.gradle.internal.resource.local.LocallyAvailableResourceFinder;
import java.io.File;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
import java.util.Map;
+import java.util.Set;
public class DefaultBaseRepositoryFactory implements BaseRepositoryFactory {
private final LocalMavenRepositoryLocator localMavenRepositoryLocator;
@@ -114,4 +121,41 @@ public class DefaultBaseRepositoryFactory implements BaseRepositoryFactory {
return container;
}
+
+ public ArtifactRepository createXMvnResolver() {
+ // Check if XMvn connector is available and inform user if it's not.
+ // This is more user-friendly as it prevents cryptic stack traces.
+ if (!new File("/usr/share/java/xmvn/xmvn-connector-gradle.jar").exists())
+ throw new RuntimeException("Local mode for Gradle is not available because XMvn Gradle connector is not installed. "
+ + "To use local mode you need to install gradle-local package.");
+
+ // XMvn connector for Gradle is an external library and it is not
+ // included in default Gradle classpath. Before it can be accessed
+ // we need to add its implementation JARs to current class loader.
+ try {
+ ClassLoader classLoader = getClass().getClassLoader();
+ Set<URL> newUrls = new LinkedHashSet<URL>();
+ newUrls.add(new File("/usr/share/java/xmvn/xmvn-api.jar").toURI().toURL());
+ newUrls.add(new File("/usr/share/java/xmvn/xmvn-launcher.jar").toURI().toURL());
+ newUrls.add(new File("/usr/share/java/xmvn/xmvn-connector-gradle.jar").toURI().toURL());
+ Method getterMethod = classLoader.getClass().getMethod("getURLs");
+ Object[] currentUrls = (Object[]) getterMethod.invoke(classLoader);
+ newUrls.removeAll(Arrays.asList(currentUrls));
+ Method adderMethod = classLoader.getClass().getMethod("addURLs", Iterable.class);
+ adderMethod.invoke(classLoader, newUrls);
+ } catch (ReflectiveOperationException e) {
+ throw new RuntimeException("Unable to inject XMvn JARs to Gralde class loader", e);
+ } catch (MalformedURLException e) {
+ // Should not happen
+ throw new RuntimeException(e);
+ }
+
+ try {
+ String xmvnConnectorRole = "org.fedoraproject.xmvn.connector.gradle.GradleResolver";
+ Class xmvnClass = Class.forName(xmvnConnectorRole);
+ return (ArtifactRepository) xmvnClass.newInstance();
+ } catch (ReflectiveOperationException e) {
+ throw new RuntimeException("Failed to inject XMvn resolver", e);
+ }
+ }
}
--
2.5.0