diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java index ecbec259dd3a..a0f11cb40b94 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java @@ -264,7 +264,7 @@ public abstract class AbstractExternalSystemLocalSettings { } } - private static void setIfNotNull(@NotNull AtomicReference> ref, @Nullable Map candidate) { + protected static void setIfNotNull(@NotNull AtomicReference> ref, @Nullable Map candidate) { if (candidate == null) { return; } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/model/data/BuildScriptClasspathData.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/data/BuildScriptClasspathData.java index 60ff0c49ba12..03ac7b4630db 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/model/data/BuildScriptClasspathData.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/model/data/BuildScriptClasspathData.java @@ -20,7 +20,9 @@ import com.intellij.openapi.externalSystem.model.ProjectKeys; import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.externalSystem.model.project.AbstractExternalEntityData; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.io.File; import java.io.Serializable; import java.util.List; import java.util.Set; @@ -35,6 +37,9 @@ public class BuildScriptClasspathData extends AbstractExternalEntityData { public static final Key KEY = Key.create(BuildScriptClasspathData.class, ProjectKeys.LIBRARY_DEPENDENCY.getProcessingWeight() + 1); + @Nullable + private File gradleHomeDir; + @NotNull private final List myClasspathEntries; @@ -44,6 +49,15 @@ public class BuildScriptClasspathData extends AbstractExternalEntityData { myClasspathEntries = classpathEntries; } + @Nullable + public File getGradleHomeDir() { + return gradleHomeDir; + } + + public void setGradleHomeDir(@Nullable File gradleHomeDir) { + this.gradleHomeDir = gradleHomeDir; + } + @NotNull public List getClasspathEntries() { return myClasspathEntries; diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/GradleInstallationManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/GradleInstallationManager.java index 5f8faf2763bb..ec1bb3b79cc8 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/GradleInstallationManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/GradleInstallationManager.java @@ -41,6 +41,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.settings.DistributionType; +import org.jetbrains.plugins.gradle.settings.GradleLocalSettings; import org.jetbrains.plugins.gradle.settings.GradleProjectSettings; import org.jetbrains.plugins.gradle.settings.GradleSettings; import org.jetbrains.plugins.gradle.util.GradleEnvironment; @@ -186,14 +187,18 @@ public class GradleInstallationManager { if (settings == null || settings.getDistributionType() == null) { return null; } - return getGradleHome(settings.getDistributionType(), linkedProjectPath, settings.getGradleHome()); + String gradleHome = settings.getDistributionType() == DistributionType.WRAPPED + ? GradleLocalSettings.getInstance(project).getGradleHome(linkedProjectPath) + : settings.getGradleHome(); + return getGradleHome(settings.getDistributionType(), linkedProjectPath, gradleHome); } @Nullable - public File getGradleHome(@NotNull DistributionType distributionType, @NotNull String linkedProjectPath, @Nullable String gradleHome) { + private File getGradleHome(@NotNull DistributionType distributionType, @NotNull String linkedProjectPath, @Nullable String gradleHome) { File candidate = null; switch (distributionType) { case LOCAL: + case WRAPPED: if (gradleHome != null) { candidate = new File(gradleHome); } @@ -202,9 +207,6 @@ public class GradleInstallationManager { WrapperConfiguration wrapperConfiguration = GradleUtil.getWrapperConfiguration(linkedProjectPath); candidate = getWrappedGradleHome(linkedProjectPath, wrapperConfiguration); break; - case WRAPPED: - // not supported yet - break; case BUNDLED: WrapperConfiguration bundledWrapperSettings = new WrapperConfiguration(); DistributionLocator distributionLocator = new DistributionLocator(); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java index e05bc0513cfc..983cefbf61e7 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/execution/GradleExecutionHelper.java @@ -250,8 +250,10 @@ public class GradleExecutionHelper { return; } + final long ttlInMs = settings.getRemoteProcessIdleTtlInMs(); ProjectConnection connection = getConnection(projectPath, settings); try { + settings.setRemoteProcessIdleTtlInMs(100); try { final File wrapperPropertyFileLocation = FileUtil.createTempFile("wrap", "loc"); wrapperPropertyFileLocation.deleteOnExit(); @@ -282,6 +284,7 @@ public class GradleExecutionHelper { LOG.warn("Can't update wrapper", e); } finally { + settings.setRemoteProcessIdleTtlInMs(ttlInMs); try { connection.close(); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java index 75a2bb298f9c..37d98cfe34aa 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java @@ -258,6 +258,7 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver classpathEntries = ContainerUtil.emptyList(); } BuildScriptClasspathData buildScriptClasspathData = new BuildScriptClasspathData(GradleConstants.SYSTEM_ID, classpathEntries); + buildScriptClasspathData.setGradleHomeDir(buildScriptClasspathModel != null ? buildScriptClasspathModel.getGradleHomeDir() : null); ideModule.createChild(BuildScriptClasspathData.KEY, buildScriptClasspathData); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/BuildClasspathModuleGradleDataService.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/BuildClasspathModuleGradleDataService.java index 28f893d982f8..c17414684b5f 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/BuildClasspathModuleGradleDataService.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/BuildClasspathModuleGradleDataService.java @@ -36,12 +36,14 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.NotNullLazyValue; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.model.data.BuildScriptClasspathData; import org.jetbrains.plugins.gradle.service.GradleBuildClasspathManager; import org.jetbrains.plugins.gradle.service.GradleInstallationManager; +import org.jetbrains.plugins.gradle.settings.GradleLocalSettings; import org.jetbrains.plugins.gradle.settings.GradleProjectSettings; import org.jetbrains.plugins.gradle.settings.GradleSettings; import org.jetbrains.plugins.gradle.util.GradleConstants; @@ -80,16 +82,19 @@ public class BuildClasspathModuleGradleDataService extends AbstractProjectDataSe AbstractExternalSystemLocalSettings localSettings = manager.getLocalSettingsProvider().fun(project); final String linkedExternalProjectPath = projectData.getLinkedExternalProjectPath(); + final File gradleHomeDir = toImport.iterator().next().getData().getGradleHomeDir(); + final GradleLocalSettings gradleLocalSettings = GradleLocalSettings.getInstance(project); + if (gradleHomeDir != null) { + gradleLocalSettings.setGradleHome(linkedExternalProjectPath, gradleHomeDir.getPath()); + } + final GradleProjectSettings settings = GradleSettings.getInstance(project).getLinkedProjectSettings(linkedExternalProjectPath); + final NotNullLazyValue> externalProjectGradleSdkLibs = new NotNullLazyValue>() { @NotNull @Override protected Set compute() { - GradleProjectSettings settings = GradleSettings.getInstance(project).getLinkedProjectSettings(linkedExternalProjectPath); - if (settings == null || settings.getDistributionType() == null) return Collections.emptySet(); - final Set gradleSdkLibraries = ContainerUtil.newLinkedHashSet(); - File gradleHome = - gradleInstallationManager.getGradleHome(settings.getDistributionType(), linkedExternalProjectPath, settings.getGradleHome()); + File gradleHome = gradleInstallationManager.getGradleHome(project, linkedExternalProjectPath); if (gradleHome != null && gradleHome.isDirectory()) { final Collection libraries = gradleInstallationManager.getClassRoots(project, linkedExternalProjectPath); if (libraries != null) { @@ -114,7 +119,7 @@ public class BuildClasspathModuleGradleDataService extends AbstractProjectDataSe for (Module module : modelsProvider.getModules(projectData)) { final String projectPath = ExternalSystemApiUtil.getExternalProjectPath(module); if(projectPath != null && StringUtil.startsWith(projectPath, linkedExternalProjectPath + "/buildSrc")) { - final List sourceRoots = ContainerUtil.map(modelsProvider.getSourceRoots(module, false), file -> file.getPath()); + final List sourceRoots = ContainerUtil.map(modelsProvider.getSourceRoots(module, false), VirtualFile::getPath); result.addAll(sourceRoots); } } @@ -130,7 +135,6 @@ public class BuildClasspathModuleGradleDataService extends AbstractProjectDataSe if (moduleDataNode == null) continue; String externalModulePath = moduleDataNode.getData().getLinkedExternalProjectPath(); - GradleProjectSettings settings = GradleSettings.getInstance(project).getLinkedProjectSettings(linkedExternalProjectPath); if (settings == null || settings.getDistributionType() == null) { LOG.warn("Gradle SDK distribution type was not configured for the project at " + linkedExternalProjectPath); } @@ -150,9 +154,7 @@ public class BuildClasspathModuleGradleDataService extends AbstractProjectDataSe ExternalProjectBuildClasspathPojo projectBuildClasspathPojo = localProjectBuildClasspath.get(linkedExternalProjectPath); if (projectBuildClasspathPojo == null) { projectBuildClasspathPojo = new ExternalProjectBuildClasspathPojo( - moduleDataNode.getData().getExternalName(), - ContainerUtil.newArrayList(), - ContainerUtil.newHashMap()); + moduleDataNode.getData().getExternalName(), ContainerUtil.newArrayList(), ContainerUtil.newHashMap()); localProjectBuildClasspath.put(linkedExternalProjectPath, projectBuildClasspathPojo); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java index fcacb11b21a4..7fd22595f176 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java @@ -18,18 +18,25 @@ package org.jetbrains.plugins.gradle.settings; import com.intellij.openapi.components.*; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings; import com.intellij.openapi.project.Project; +import com.intellij.util.containers.ContainerUtilRt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.util.GradleConstants; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; + /** * @author Denis Zhdanov * @since 5/3/12 6:16 PM */ @State(name = "GradleLocalSettings", storages = {@Storage(StoragePathMacros.WORKSPACE_FILE)} ) public class GradleLocalSettings extends AbstractExternalSystemLocalSettings - implements PersistentStateComponent + implements PersistentStateComponent { + private final AtomicReference> myGradleHomes = + new AtomicReference>(ContainerUtilRt.newHashMap()); public GradleLocalSettings(@NotNull Project project) { super(GradleConstants.SYSTEM_ID, project); @@ -41,15 +48,38 @@ public class GradleLocalSettings extends AbstractExternalSystemLocalSettings } @Nullable + public String getGradleHome(String linkedProjectPath) { + return myGradleHomes.get().get(linkedProjectPath); + } + + public void setGradleHome(@NotNull String linkedProjectPath, @NotNull String gradleHome) { + myGradleHomes.get().put(linkedProjectPath, gradleHome); + } + @Override - public State getState() { - State state = new State(); + public void forgetExternalProjects(@NotNull Set linkedProjectPathsToForget) { + super.forgetExternalProjects(linkedProjectPathsToForget); + for (String path : linkedProjectPathsToForget) { + myGradleHomes.get().remove(path); + } + } + + @Nullable + @Override + public MyState getState() { + MyState state = new MyState(); fillState(state); + state.myGradleHomes = myGradleHomes.get(); return state; } @Override - public void loadState(@NotNull State state) { - super.loadState(state); + public void loadState(@NotNull MyState state) { + super.loadState(state); + setIfNotNull(myGradleHomes, state.myGradleHomes); + } + + public static class MyState extends AbstractExternalSystemLocalSettings.State { + public Map myGradleHomes = ContainerUtilRt.newHashMap(); } }