Gradle daemon services: pass custom gradle user home using the main classloader

This commit is contained in:
Vladislav.Soroka
2017-12-08 13:44:41 +03:00
parent 9fb9ca66c7
commit fd2467aa1b
4 changed files with 21 additions and 8 deletions
@@ -3,14 +3,12 @@
*/
package org.jetbrains.plugins.gradle.internal.daemon;
import com.intellij.openapi.util.text.StringUtil;
import org.gradle.initialization.BuildLayoutParameters;
import org.gradle.internal.logging.events.OutputEvent;
import org.gradle.internal.logging.events.OutputEventListener;
import org.gradle.internal.service.ServiceRegistry;
import org.gradle.launcher.daemon.client.DaemonClientFactory;
import org.gradle.launcher.daemon.configuration.DaemonParameters;
import org.jetbrains.plugins.gradle.settings.GradleSystemSettings;
import java.io.File;
@@ -18,11 +16,16 @@ import java.io.File;
* @author Vladislav.Soroka
*/
public abstract class DaemonAction {
private final String myServiceDirectoryPath;
public DaemonAction(String serviceDirectoryPath) {
myServiceDirectoryPath = serviceDirectoryPath;
}
protected ServiceRegistry getDaemonServices(DaemonClientFactory daemonClientFactory) {
BuildLayoutParameters layout = new BuildLayoutParameters();
String serviceDirectoryPath = GradleSystemSettings.getInstance().getServiceDirectoryPath();
if (StringUtil.isNotEmpty(serviceDirectoryPath)) {
layout.setGradleUserHomeDir(new File(serviceDirectoryPath));
if (myServiceDirectoryPath != null && !myServiceDirectoryPath.isEmpty()) {
layout.setGradleUserHomeDir(new File(myServiceDirectoryPath));
}
DaemonParameters daemonParameters = new DaemonParameters(layout);
return daemonClientFactory.createStopDaemonServices(new OutputEventListener() {
@@ -26,6 +26,10 @@ import java.util.Locale;
* @author Vladislav.Soroka
*/
public class DaemonStatusAction extends DaemonAction {
public DaemonStatusAction(String serviceDirectoryPath) {
super(serviceDirectoryPath);
}
public List<DaemonState> run(DaemonClientFactory daemonClientFactory) {
ServiceRegistry daemonServices = getDaemonServices(daemonClientFactory);
DaemonConnector daemonConnector = daemonServices.get(DaemonConnector.class);
@@ -24,6 +24,10 @@ import java.util.List;
* @author Vladislav.Soroka
*/
public class DaemonStopAction extends DaemonAction {
public DaemonStopAction(String serviceDirectoryPath) {
super(serviceDirectoryPath);
}
public void run(DaemonClientFactory daemonClientFactory) {
ServiceRegistry daemonServices = getDaemonServices(daemonClientFactory);
DaemonStopClient stopClient = daemonServices.get(DaemonStopClient.class);
@@ -15,6 +15,7 @@ import org.gradle.tooling.internal.consumer.loader.CachingToolingImplementationL
import org.gradle.tooling.internal.consumer.loader.SynchronizedToolingImplementationLoader
import org.gradle.tooling.internal.consumer.loader.ToolingImplementationLoader
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.plugins.gradle.settings.GradleSystemSettings
import java.lang.reflect.Method
@@ -61,6 +62,7 @@ class GradleDaemonServices {
.allowLock(false)
.get()
String serviceDirectoryPath = GradleSystemSettings.instance.getServiceDirectoryPath()
def myRawArgData = getSerialized(arg)
byte[] myRawResultData = null
final ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader()
@@ -69,9 +71,9 @@ class GradleDaemonServices {
Class<?> clazz = daemonClientClassLoader.loadClass(actionClass.name)
def _arg = getObject(myRawArgData)
Method method = findMethod(clazz, daemonClientFactory, _arg)
def result = arg == null ? method.invoke(clazz.newInstance(), daemonClientFactory) :
method.invoke(clazz.newInstance(), daemonClientFactory, _arg)
Object[] serviceDirParam = [serviceDirectoryPath]
def result = arg == null ? method.invoke(clazz.newInstance(serviceDirParam), daemonClientFactory) :
method.invoke(clazz.newInstance(serviceDirParam), daemonClientFactory, _arg)
if (result instanceof Serializable) {
myRawResultData = getSerialized(result)
}