From d82a6e8b5e73dca9ea6bb69bf4bf2d7bafa95918 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Mon, 3 Dec 2018 08:30:33 +0300 Subject: [PATCH] Gradle: convert app level delegation settings to IDE level (IDEA-176794, IDEA-173354) --- .../build/GradleProjectTaskRunner.java | 9 +- .../GradleTestRunConfigurationProducer.java | 30 +++--- .../plugin-resources/META-INF/plugin.xml | 8 +- .../resources/i18n/GradleBundle.properties | 6 +- .../GradleOrderEnumeratorHandler.java | 12 +-- .../project/GradleExternalSettingsImporter.kt | 8 +- .../settings/GradleSettingsService.java | 67 ++++++++++++ ...eaGradleProjectSettingsControlBuilder.java | 79 +++++++++----- .../DefaultGradleProjectSettings.java | 100 ++++++++++++++++++ .../settings/GradleProjectSettings.java | 45 ++++---- .../settings/GradleRunnerConfigurable.java | 44 ++++---- .../settings/GradleSystemRunningSettings.java | 52 ++------- .../plugins/gradle/settings/TestRunner.java | 9 ++ .../statistics/GradleSettingsCollector.kt | 7 +- .../GradleSettingsImportingTest.java | 10 +- .../gradle/settings/GradleSettingsTest.kt | 67 +++++++----- 16 files changed, 360 insertions(+), 193 deletions(-) create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleSettingsService.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/settings/DefaultGradleProjectSettings.java create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/settings/TestRunner.java diff --git a/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java b/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java index e161818bea2f..347454be5c8e 100644 --- a/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java +++ b/plugins/gradle/java/src/execution/build/GradleProjectTaskRunner.java @@ -47,9 +47,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.service.project.GradleBuildSrcProjectsResolver; import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverUtil; +import org.jetbrains.plugins.gradle.service.settings.GradleSettingsService; import org.jetbrains.plugins.gradle.service.task.GradleTaskManager; import org.jetbrains.plugins.gradle.settings.GradleSettings; -import org.jetbrains.plugins.gradle.settings.GradleSystemRunningSettings; import org.jetbrains.plugins.gradle.util.GradleConstants; import java.io.File; @@ -179,7 +179,7 @@ public class GradleProjectTaskRunner extends ProjectTaskRunner { public boolean canRun(@NotNull ProjectTask projectTask) { if (projectTask instanceof ModuleBuildTask) { Module module = ((ModuleBuildTask)projectTask).getModule(); - if (!GradleSystemRunningSettings.getInstance().isDelegatedBuildEnabled(module)) return false; + if (!GradleSettingsService.isDelegatedBuildEnabled(module)) return false; return isExternalSystemAwareModule(GradleConstants.SYSTEM_ID, module); } if (projectTask instanceof ProjectModelBuildTask) { @@ -196,13 +196,10 @@ public class GradleProjectTaskRunner extends ProjectTaskRunner { if (runProfile instanceof ModuleBasedConfiguration) { RunConfigurationModule module = ((ModuleBasedConfiguration)runProfile).getConfigurationModule(); if (!isExternalSystemAwareModule(GradleConstants.SYSTEM_ID, module.getModule()) || - !GradleSystemRunningSettings.getInstance().isDelegatedBuildEnabled(module.getModule())) { + !GradleSettingsService.isDelegatedBuildEnabled(module.getModule())) { return false; } } - else if (!GradleSystemRunningSettings.getInstance().isDelegatedBuildEnabledByDefault()) { - return false; - } for (GradleExecutionEnvironmentProvider environmentProvider : GradleExecutionEnvironmentProvider.EP_NAME.getExtensions()) { if (environmentProvider.isApplicable(((ExecuteRunConfigurationTask)projectTask))) { return true; diff --git a/plugins/gradle/java/src/execution/test/runner/GradleTestRunConfigurationProducer.java b/plugins/gradle/java/src/execution/test/runner/GradleTestRunConfigurationProducer.java index a4a7b9bbffd0..4df21e3bd739 100644 --- a/plugins/gradle/java/src/execution/test/runner/GradleTestRunConfigurationProducer.java +++ b/plugins/gradle/java/src/execution/test/runner/GradleTestRunConfigurationProducer.java @@ -30,13 +30,14 @@ import org.jetbrains.plugins.gradle.execution.GradleRunnerUtil; import org.jetbrains.plugins.gradle.service.execution.GradleRunConfiguration; import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverUtil; import org.jetbrains.plugins.gradle.service.resolve.GradleCommonClassNames; -import org.jetbrains.plugins.gradle.settings.GradleSystemRunningSettings; +import org.jetbrains.plugins.gradle.service.settings.GradleSettingsService; +import org.jetbrains.plugins.gradle.settings.TestRunner; import org.jetbrains.plugins.gradle.util.GradleConstants; import java.util.List; import static com.intellij.openapi.util.text.StringUtil.endsWithChar; -import static org.jetbrains.plugins.gradle.settings.GradleSystemRunningSettings.PreferredTestRunner.*; +import static org.jetbrains.plugins.gradle.settings.TestRunner.*; /** * @author Vladislav.Soroka @@ -51,13 +52,13 @@ public abstract class GradleTestRunConfigurationProducer extends RunConfiguratio @Override public boolean isPreferredConfiguration(ConfigurationFromContext self, ConfigurationFromContext other) { - GradleSystemRunningSettings.PreferredTestRunner testRunner = getTestRunner(self.getSourceElement()); - return testRunner == CHOOSE_PER_TEST || testRunner == GRADLE_TEST_RUNNER; + TestRunner testRunner = getTestRunner(self.getSourceElement()); + return testRunner == CHOOSE_PER_TEST || testRunner == GRADLE; } @Override public boolean shouldReplace(@NotNull ConfigurationFromContext self, @NotNull ConfigurationFromContext other) { - return getTestRunner(self.getSourceElement()) == GRADLE_TEST_RUNNER; + return getTestRunner(self.getSourceElement()) == GRADLE; } @Override @@ -67,8 +68,8 @@ public abstract class GradleTestRunConfigurationProducer extends RunConfiguratio if (!GradleConstants.SYSTEM_ID.equals(configuration.getSettings().getExternalSystemId())) return false; if (sourceElement.isNull()) return false; - GradleSystemRunningSettings.PreferredTestRunner testRunner = getTestRunner(sourceElement.get()); - if (testRunner == PLATFORM_TEST_RUNNER) return false; + TestRunner testRunner = getTestRunner(sourceElement.get()); + if (testRunner == PLATFORM) return false; if (configuration instanceof GradleRunConfiguration) { final GradleRunConfiguration gradleRunConfiguration = (GradleRunConfiguration)configuration; gradleRunConfiguration.setScriptDebugEnabled(false); @@ -82,13 +83,12 @@ public abstract class GradleTestRunConfigurationProducer extends RunConfiguratio @Override public boolean isConfigurationFromContext(ExternalSystemRunConfiguration configuration, ConfigurationContext context) { - if (GradleSystemRunningSettings.getInstance().getDefaultTestRunner() == PLATFORM_TEST_RUNNER) return false; if (configuration == null) return false; if (!GradleConstants.SYSTEM_ID.equals(configuration.getSettings().getExternalSystemId())) return false; String projectPath = configuration.getSettings().getExternalProjectPath(); - GradleSystemRunningSettings.PreferredTestRunner testRunner = getTestRunner(context.getProject(), projectPath); - if (testRunner == PLATFORM_TEST_RUNNER) return false; + TestRunner testRunner = getTestRunner(context.getProject(), projectPath); + if (testRunner == PLATFORM) return false; return doIsConfigurationFromContext(configuration, context); } @@ -150,19 +150,19 @@ public abstract class GradleTestRunConfigurationProducer extends RunConfiguratio return ContainerUtil.map(tasks, task -> taskPrefix + task); } - private static GradleSystemRunningSettings.PreferredTestRunner getTestRunner(@NotNull Project project, @NotNull String projectPath) { - return GradleSystemRunningSettings.getInstance().getTestRunner(project, projectPath); + private static TestRunner getTestRunner(@NotNull Project project, @NotNull String projectPath) { + return GradleSettingsService.getInstance(project).getTestRunner(projectPath); } - private static GradleSystemRunningSettings.PreferredTestRunner getTestRunner(@NotNull PsiElement sourceElement) { + private static TestRunner getTestRunner(@NotNull PsiElement sourceElement) { PsiFile containingFile = sourceElement.getContainingFile(); if (containingFile != null) { VirtualFile file = containingFile.getVirtualFile(); Module module = file == null ? null : ProjectFileIndex.SERVICE.getInstance(sourceElement.getProject()).getModuleForFile(file); if (module != null) { - return GradleSystemRunningSettings.getInstance().getTestRunner(module); + return GradleSettingsService.getTestRunner(module); } } - return GradleSystemRunningSettings.getInstance().getDefaultTestRunner(); + return PLATFORM; } } diff --git a/plugins/gradle/plugin-resources/META-INF/plugin.xml b/plugins/gradle/plugin-resources/META-INF/plugin.xml index 1aa7f6d497f3..e33b78d8a84e 100644 --- a/plugins/gradle/plugin-resources/META-INF/plugin.xml +++ b/plugins/gradle/plugin-resources/META-INF/plugin.xml @@ -73,9 +73,9 @@ instance="org.jetbrains.plugins.gradle.service.settings.GradleConfigurable" key="gradle.name" bundle="i18n.GradleBundle"> - + @@ -93,8 +93,10 @@ + + diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties index f8b71ef94944..003452c2efab 100644 --- a/plugins/gradle/resources/i18n/GradleBundle.properties +++ b/plugins/gradle/resources/i18n/GradleBundle.properties @@ -11,7 +11,7 @@ gradle.settings.text.use.gradle.aware.make=Delegate IDE build/run actions to gra gradle.settings.text.delegate.panel.title=Delegate settings gradle.settings.text.delegate.buildRun=Build and run using gradle.settings.text.delegate.testRunner=Run tests using -gradle.settings.text.use.application.default=Use application default +gradle.settings.text.use.default=Use default gradle.settings.text.home.path=Gradle home: gradle.settings.text.jvm.path=Gradle JVM: @@ -49,8 +49,8 @@ gradle.codeInsight.action.add_maven_dependency.description=Add selected maven ar gradle.runner=Runner gradle.runner.toggle.tree.text.action.name=Toggle tasks executions/text mode gradle.preferred_test_runner.CHOOSE_PER_TEST=Choose per test -gradle.preferred_test_runner.PLATFORM_TEST_RUNNER=Platform Test Runner -gradle.preferred_test_runner.GRADLE_TEST_RUNNER=Gradle Test Runner +gradle.preferred_test_runner.PLATFORM=Platform Test Runner +gradle.preferred_test_runner.GRADLE=Gradle Test Runner gradle.test.runner.ui.tests.tree.presentation.labels.waiting.tests=Waiting for tests... gradle.test.runner.ui.tests.tree.presentation.labels.no.tests.were.found=Test events were not received gradle.test.runner.ui.tests.actions.open.gradle.report.text=Open Gradle test report diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleOrderEnumeratorHandler.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleOrderEnumeratorHandler.java index 457715511589..1cdfb9a3e9f6 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleOrderEnumeratorHandler.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleOrderEnumeratorHandler.java @@ -21,6 +21,7 @@ import com.intellij.openapi.externalSystem.ExternalSystemModulePropertyManager; import com.intellij.openapi.externalSystem.model.project.ExternalSystemSourceType; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootModel; import com.intellij.openapi.roots.OrderEnumerationHandler; import com.intellij.openapi.roots.OrderRootType; @@ -32,10 +33,8 @@ import org.jetbrains.plugins.gradle.model.ExternalProject; import org.jetbrains.plugins.gradle.model.ExternalSourceDirectorySet; import org.jetbrains.plugins.gradle.model.ExternalSourceSet; import org.jetbrains.plugins.gradle.service.project.data.ExternalProjectDataCache; -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.settings.GradleSystemRunningSettings; +import org.jetbrains.plugins.gradle.service.settings.GradleSettingsService; +import org.jetbrains.plugins.gradle.settings.*; import org.jetbrains.plugins.gradle.util.GradleConstants; import java.io.File; @@ -111,7 +110,8 @@ public class GradleOrderEnumeratorHandler extends OrderEnumerationHandler { return false; } - final ExternalProjectDataCache externalProjectDataCache = ExternalProjectDataCache.getInstance(rootModel.getModule().getProject()); + Project project = rootModel.getModule().getProject(); + final ExternalProjectDataCache externalProjectDataCache = ExternalProjectDataCache.getInstance(project); assert externalProjectDataCache != null; final ExternalProject externalRootProject = externalProjectDataCache.getRootExternalProject(GradleConstants.SYSTEM_ID, new File(gradleProjectPath)); @@ -124,7 +124,7 @@ public class GradleOrderEnumeratorHandler extends OrderEnumerationHandler { externalProjectDataCache.findExternalProject(externalRootProject, rootModel.getModule()); if (externalSourceSets.isEmpty()) return false; - boolean isDelegatedBuildEnabled = GradleSystemRunningSettings.getInstance().isDelegatedBuildEnabled(rootModel.getModule()); + boolean isDelegatedBuildEnabled = GradleSettingsService.getInstance(project).isDelegatedBuildEnabled(rootModel.getModule()); for (ExternalSourceSet sourceSet : externalSourceSets.values()) { if (includeTests) { if (isDelegatedBuildEnabled) { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExternalSettingsImporter.kt b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExternalSettingsImporter.kt index 80fef02e5999..d98beeb95ff6 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExternalSettingsImporter.kt +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExternalSettingsImporter.kt @@ -16,8 +16,8 @@ import com.intellij.openapi.project.Project import com.intellij.util.ObjectUtils.consumeIfCast import com.intellij.util.ThreeState import org.jetbrains.plugins.gradle.execution.GradleBeforeRunTaskProvider +import org.jetbrains.plugins.gradle.settings.TestRunner.* import org.jetbrains.plugins.gradle.settings.GradleSettings -import org.jetbrains.plugins.gradle.settings.GradleSystemRunningSettings import org.jetbrains.plugins.gradle.util.GradleConstants class GradleBeforeRunTaskImporter: BeforeRunTaskImporter { @@ -104,9 +104,9 @@ class ActionDelegateConfigImporter: ConfigurationHandler { companion object { private val TEST_RUNNER_MAP = mapOf( - "PLATFORM" to GradleSystemRunningSettings.PreferredTestRunner.PLATFORM_TEST_RUNNER, - "GRADLE" to GradleSystemRunningSettings.PreferredTestRunner.GRADLE_TEST_RUNNER, - "CHOOSE_PER_TEST" to GradleSystemRunningSettings.PreferredTestRunner.CHOOSE_PER_TEST + "PLATFORM" to PLATFORM, + "GRADLE" to GRADLE, + "CHOOSE_PER_TEST" to CHOOSE_PER_TEST ) } } \ No newline at end of file diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleSettingsService.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleSettingsService.java new file mode 100644 index 000000000000..124ce36af7e3 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleSettingsService.java @@ -0,0 +1,67 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.gradle.service.settings; + +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.util.ThreeState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.settings.DefaultGradleProjectSettings; +import org.jetbrains.plugins.gradle.settings.GradleProjectSettings; +import org.jetbrains.plugins.gradle.settings.GradleSettings; +import org.jetbrains.plugins.gradle.settings.TestRunner; + +/** + * {@link GradleSettingsService} provides effective settings for linked gradle projects. + * + * @see GradleProjectSettings + * @see DefaultGradleProjectSettings + * + * @author Vladislav.Soroka + */ +public class GradleSettingsService { + @NotNull + private final Project myProject; + + public GradleSettingsService(@NotNull Project project) { + myProject = project; + } + + public boolean isDelegatedBuildEnabled(@NotNull String gradleProjectPath) { + GradleProjectSettings projectSettings = GradleSettings.getInstance(myProject).getLinkedProjectSettings(gradleProjectPath); + if (projectSettings == null) return false; + if (projectSettings.getDelegatedBuild() == ThreeState.UNSURE) { + return DefaultGradleProjectSettings.getInstance(myProject).isDelegatedBuild(); + } + return projectSettings.getDelegatedBuild().toBoolean(); + } + + @NotNull + public TestRunner getTestRunner(@NotNull String gradleProjectPath) { + GradleProjectSettings projectSettings = GradleSettings.getInstance(myProject).getLinkedProjectSettings(gradleProjectPath); + return projectSettings == null || projectSettings.getTestRunner() == null + ? DefaultGradleProjectSettings.getInstance(myProject).getTestRunner() + : projectSettings.getTestRunner(); + } + + public static boolean isDelegatedBuildEnabled(@NotNull Module module) { + String projectPath = ExternalSystemApiUtil.getExternalRootProjectPath(module); + if (projectPath == null) return false; + return getInstance(module.getProject()).isDelegatedBuildEnabled(projectPath); + } + + @NotNull + public static TestRunner getTestRunner(@NotNull Module module) { + String projectPath = ExternalSystemApiUtil.getExternalRootProjectPath(module); + if (projectPath == null) { + return DefaultGradleProjectSettings.getInstance(module.getProject()).getTestRunner(); + } + return getInstance(module.getProject()).getTestRunner(projectPath); + } + + @NotNull + public static GradleSettingsService getInstance(@NotNull Project project) { + return ServiceManager.getService(project, GradleSettingsService.class); + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java index 517eb999c2b8..3af24f8e36e3 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java @@ -2,6 +2,7 @@ package org.jetbrains.plugins.gradle.service.settings; import com.intellij.ide.util.projectWizard.WizardContext; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.CustomShortcutSet; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.application.ApplicationManager; @@ -21,6 +22,8 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel; import com.intellij.openapi.roots.ui.util.CompositeAppearance; import com.intellij.openapi.ui.*; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.registry.Registry; @@ -41,9 +44,10 @@ import org.gradle.util.GradleVersion; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.service.GradleInstallationManager; +import org.jetbrains.plugins.gradle.settings.DefaultGradleProjectSettings; import org.jetbrains.plugins.gradle.settings.DistributionType; import org.jetbrains.plugins.gradle.settings.GradleProjectSettings; -import org.jetbrains.plugins.gradle.settings.GradleSystemRunningSettings; +import org.jetbrains.plugins.gradle.settings.TestRunner; import org.jetbrains.plugins.gradle.util.GradleBundle; import org.jetbrains.plugins.gradle.util.GradleConstants; import org.jetbrains.plugins.gradle.util.GradleUtil; @@ -146,6 +150,16 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet @Nullable private JPanel myGradleJdkPanel; + /** + * The target {@link Project} reference of the UI control. + * It can be the current project of the settings UI configurable (see {@org.jetbrains.plugins.gradle.service.settings.GradleConfigurable}), + * or the target project from the wizard context. + */ + @NotNull + private final Ref myProjectRef = Ref.create(); + @NotNull + private final Disposable myProjectRefDisposable = () -> myProjectRef.set(null); + public IdeaGradleProjectSettingsControlBuilder(@NotNull GradleProjectSettings initialSettings) { myInstallationManager = ServiceManager.getService(GradleInstallationManager.class); myInitialSettings = initialSettings; @@ -561,6 +575,8 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet GradleProjectSettings settings, boolean isDefaultModuleCreation, @Nullable WizardContext wizardContext) { + updateProjectRef(project, wizardContext); + String gradleHome = settings.getGradleHome(); if (myGradleHomePathField != null) { myGradleHomePathField.setText(gradleHome == null ? "" : gradleHome); @@ -764,20 +780,20 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet BuildRunItem[] states = StreamEx.of(ThreeState.values()).map(BuildRunItem::new).toArray(BuildRunItem[]::new); myDelegateBuildCombobox = new ComboBox<>(states); myDelegateBuildCombobox.setRenderer(new MyItemCellRenderer<>()); - myDelegateBuildCombobox.setSelectedItem(BuildRunItem.from(myInitialSettings.getDelegatedBuild())); + myDelegateBuildCombobox.setSelectedItem(new BuildRunItem(myInitialSettings.getDelegatedBuild())); myDelegateBuildLabel = new JBLabel(GradleBundle.message("gradle.settings.text.delegate.buildRun")); myDelegatePanel.add(myDelegateBuildLabel, getLabelConstraints(labelLevel)); myDelegatePanel.add(myDelegateBuildCombobox); } if (!dropTestRunnerCombobox) { - TestRunnerItem[] testRunners = StreamEx.of(GradleSystemRunningSettings.PreferredTestRunner.values()) - .append((GradleSystemRunningSettings.PreferredTestRunner)null) + TestRunnerItem[] testRunners = StreamEx.of(TestRunner.values()) + .append((TestRunner)null) .map(TestRunnerItem::new) .toArray(TestRunnerItem[]::new); myTestRunnerCombobox = new ComboBox<>(testRunners); myTestRunnerCombobox.setRenderer(new MyItemCellRenderer<>()); - myTestRunnerCombobox.setSelectedItem(TestRunnerItem.from(myInitialSettings.getTestRunner())); + myTestRunnerCombobox.setSelectedItem(new TestRunnerItem(myInitialSettings.getTestRunner())); myTestRunnerLabel = new JBLabel(GradleBundle.message("gradle.settings.text.delegate.testRunner")); myDelegatePanel.add(myTestRunnerLabel, getLabelConstraints(labelLevel)); @@ -802,10 +818,10 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet return; } if (myDelegateBuildCombobox != null) { - myDelegateBuildCombobox.setSelectedItem(BuildRunItem.from(myInitialSettings.getDelegatedBuild())); + myDelegateBuildCombobox.setSelectedItem(new BuildRunItem(myInitialSettings.getDelegatedBuild())); } if (myTestRunnerCombobox != null) { - myTestRunnerCombobox.setSelectedItem(TestRunnerItem.from(myInitialSettings.getTestRunner())); + myTestRunnerCombobox.setSelectedItem(new TestRunnerItem(myInitialSettings.getTestRunner())); } } @@ -836,6 +852,17 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet } } + private void updateProjectRef(@Nullable Project project, @Nullable WizardContext wizardContext) { + if (wizardContext != null && wizardContext.getProject() != null) { + project = wizardContext.getProject(); + } + if (project != null && project != myProjectRef.get() + && Disposer.findRegisteredObject(project, myProjectRefDisposable) == null) { + Disposer.register(project, myProjectRefDisposable); + } + myProjectRef.set(project); + } + private class DelayedBalloonInfo implements Runnable { private final MessageType myMessageType; private final String myText; @@ -922,7 +949,7 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet } } - private static class BuildRunItem extends MyItem { + private class BuildRunItem extends MyItem { private BuildRunItem(@Nullable ThreeState value) { super(value); @@ -936,28 +963,27 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet @Override protected String getComment() { if (value != ThreeState.UNSURE) return null; - return getText(ThreeState.fromBoolean(GradleSystemRunningSettings.getInstance().isDelegatedBuildEnabledByDefault())); - } - - private static BuildRunItem from(ThreeState value) { - return new BuildRunItem(value); + ThreeState defaultDelegationOption = + myProjectRef.isNull() ? null : + ThreeState.fromBoolean(DefaultGradleProjectSettings.getInstance(myProjectRef.get()).isDelegatedBuild()); + return getText(defaultDelegationOption); } @NotNull - private static String getText(@Nullable ThreeState state) { + private String getText(@Nullable ThreeState state) { if (state == ThreeState.NO) { return ApplicationNamesInfo.getInstance().getFullProductName(); } if (state == ThreeState.YES) { return "Gradle"; } - return GradleBundle.message("gradle.settings.text.use.application.default"); + return GradleBundle.message("gradle.settings.text.use.default"); } } - private static class TestRunnerItem extends MyItem { + private class TestRunnerItem extends MyItem { - private TestRunnerItem(@Nullable GradleSystemRunningSettings.PreferredTestRunner value) { + private TestRunnerItem(@Nullable TestRunner value) { super(value); } @@ -968,25 +994,24 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet @Override protected String getComment() { - return value != null ? null : getText(GradleSystemRunningSettings.getInstance().getDefaultTestRunner()); - } - - private static TestRunnerItem from(GradleSystemRunningSettings.PreferredTestRunner value) { - return new TestRunnerItem(value); + if (value != null && !myProjectRef.isNull()) return null; + TestRunner defaultRunner = + myProjectRef.isNull() ? null : DefaultGradleProjectSettings.getInstance(myProjectRef.get()).getTestRunner(); + return getText(defaultRunner); } @NotNull - private static String getText(@Nullable GradleSystemRunningSettings.PreferredTestRunner runner) { - if (runner == GradleSystemRunningSettings.PreferredTestRunner.PLATFORM_TEST_RUNNER) { + private String getText(@Nullable TestRunner runner) { + if (runner == TestRunner.PLATFORM) { return ApplicationNamesInfo.getInstance().getFullProductName(); } - if (runner == GradleSystemRunningSettings.PreferredTestRunner.GRADLE_TEST_RUNNER) { + if (runner == TestRunner.GRADLE) { return "Gradle"; } - if (runner == GradleSystemRunningSettings.PreferredTestRunner.CHOOSE_PER_TEST) { + if (runner == TestRunner.CHOOSE_PER_TEST) { return GradleBundle.message("gradle.preferred_test_runner.CHOOSE_PER_TEST"); } - return GradleBundle.message("gradle.settings.text.use.application.default"); + return GradleBundle.message("gradle.settings.text.use.default"); } } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/DefaultGradleProjectSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/DefaultGradleProjectSettings.java new file mode 100644 index 000000000000..0214d6fe3dbf --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/DefaultGradleProjectSettings.java @@ -0,0 +1,100 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.plugins.gradle.settings; + +import com.intellij.openapi.components.*; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.service.settings.GradleSettingsService; + +/** + * {@link DefaultGradleProjectSettings} holds IDE project level settings defaults for gradle projects. + * + * @see GradleSettingsService + * + * @author Vladislav.Soroka + */ +@State(name = "DefaultGradleProjectSettings", storages = @Storage(StoragePathMacros.WORKSPACE_FILE)) +public class DefaultGradleProjectSettings implements PersistentStateComponent { + private boolean myMigrated; + private boolean myDelegatedBuild; + @NotNull private TestRunner myTestRunner = TestRunner.PLATFORM; + + @NotNull + public TestRunner getTestRunner() { + return myTestRunner; + } + + void setTestRunner(@NotNull TestRunner testRunner) { + myTestRunner = testRunner; + } + + public boolean isDelegatedBuild() { + return myDelegatedBuild; + } + + public void setDelegatedBuild(boolean delegatedBuild) { + myDelegatedBuild = delegatedBuild; + } + + @ApiStatus.ScheduledForRemoval(inVersion = "2019.2") + boolean isMigrated() { + return myMigrated; + } + + @ApiStatus.ScheduledForRemoval(inVersion = "2019.2") + void setMigrated(boolean migrated) { + myMigrated = migrated; + } + + @Nullable + @Override + public DefaultGradleProjectSettings.MyState getState() { + MyState state = new MyState(); + state.delegatedBuild = myDelegatedBuild; + state.testRunner = myTestRunner; + state.isMigrated = myMigrated; + return state; + } + + @Override + public void loadState(@NotNull MyState state) { + if (!state.isMigrated) { + migrateOldSettings(); + } + else { + myDelegatedBuild = state.delegatedBuild; + myTestRunner = state.testRunner; + } + myMigrated = true; + } + + @SuppressWarnings("deprecation") + private void migrateOldSettings() { + GradleSystemRunningSettings oldAppSettings = GradleSystemRunningSettings.getInstance(); + myDelegatedBuild = oldAppSettings.isDelegatedBuildEnabledByDefault(); + GradleSystemRunningSettings.PreferredTestRunner oldTestRunner = oldAppSettings.getDefaultTestRunner(); + if (oldTestRunner == GradleSystemRunningSettings.PreferredTestRunner.PLATFORM_TEST_RUNNER) { + myTestRunner = TestRunner.PLATFORM; + } + else if (oldTestRunner == GradleSystemRunningSettings.PreferredTestRunner.GRADLE_TEST_RUNNER) { + myTestRunner = TestRunner.GRADLE; + } + else if (oldTestRunner == GradleSystemRunningSettings.PreferredTestRunner.CHOOSE_PER_TEST) { + myTestRunner = TestRunner.CHOOSE_PER_TEST; + } + } + + @NotNull + public static DefaultGradleProjectSettings getInstance(@NotNull Project project) { + return ServiceManager.getService(project, DefaultGradleProjectSettings.class); + } + + static class MyState { + public TestRunner testRunner = TestRunner.PLATFORM; + public boolean delegatedBuild; + @ApiStatus.ScheduledForRemoval(inVersion = "2019.2") + public boolean isMigrated; + } +} \ No newline at end of file diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java index 719de0d3963d..ba3b3e590157 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleProjectSettings.java @@ -4,6 +4,7 @@ package org.jetbrains.plugins.gradle.settings; import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUtil; import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; +import com.intellij.openapi.module.Module; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.SmartList; import com.intellij.util.ThreeState; @@ -15,11 +16,19 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.model.data.BuildParticipant; import org.jetbrains.plugins.gradle.service.GradleInstallationManager; +import org.jetbrains.plugins.gradle.service.settings.GradleSettingsService; import java.util.List; import java.util.Optional; /** + * {@link GradleProjectSettings} holds settings for the linked gradle project. + * These settings might have IDE project level defaults - {@link DefaultGradleProjectSettings}. + * Consider to use effective settings with {@link GradleSettingsService}. + * + * @see GradleSettingsService + * @see DefaultGradleProjectSettings + * * @author Denis Zhdanov */ public class GradleProjectSettings extends ExternalProjectSettings { @@ -36,7 +45,7 @@ public class GradleProjectSettings extends ExternalProjectSettings { @NotNull private ThreeState delegatedBuild = ThreeState.UNSURE; @Nullable - private GradleSystemRunningSettings.PreferredTestRunner testRunner; + private TestRunner testRunner; @Nullable public String getGradleHome() { @@ -123,17 +132,10 @@ public class GradleProjectSettings extends ExternalProjectSettings { storeProjectFilesExternally = value; } - @Transient - @NotNull - public ThreeState getEffectiveDelegatedBuild() { - if (delegatedBuild == ThreeState.UNSURE) { - return ThreeState.fromBoolean(GradleSystemRunningSettings.getInstance().isDelegatedBuildEnabledByDefault()); - } - return delegatedBuild; - } - /** - * @return {@link ThreeState#UNSURE} means using application level configuration, see {@link GradleSystemRunningSettings#isDelegatedBuildEnabledByDefault()} + * Build/run mode for the gradle project. + * Consider to use effective settings using {@link GradleSettingsService#isDelegatedBuildEnabled(Module)} + * @return build/run mode, {@link ThreeState#UNSURE} means using IDE project level configuration, see {@link DefaultGradleProjectSettings#isDelegatedBuild()} */ @OptionTag(value = "delegatedBuild", converter = ThreeStateConverter.class) @NotNull @@ -142,33 +144,26 @@ public class GradleProjectSettings extends ExternalProjectSettings { } /** - * @param state {@link ThreeState#UNSURE} means using application level configuration, see {@link GradleSystemRunningSettings#isDelegatedBuildEnabledByDefault()} + * @param state {@link ThreeState#UNSURE} means using IDE project level configuration, see {@link DefaultGradleProjectSettings#isDelegatedBuild()} */ public void setDelegatedBuild(@NotNull ThreeState state) { this.delegatedBuild = state; } - @Transient - @NotNull - public GradleSystemRunningSettings.PreferredTestRunner getEffectiveTestRunner() { - if (testRunner == null) { - return GradleSystemRunningSettings.getInstance().getDefaultTestRunner(); - } - return testRunner; - } - /** - * @return test runner option, "null" means using application level configuration, see {@link GradleSystemRunningSettings#getDefaultTestRunner()} + * Test runner option. + * Consider to use effective settings using {@link GradleSettingsService#getTestRunner(Module)} + * @return test runner option, "null" means using IDE project level configuration, see {@link DefaultGradleProjectSettings#getTestRunner()} */ @Nullable - public GradleSystemRunningSettings.PreferredTestRunner getTestRunner() { + public TestRunner getTestRunner() { return testRunner; } /** - * @param testRunner null means using application level configuration, see {@link GradleSystemRunningSettings#getDefaultTestRunner()} + * @param testRunner null means using IDE project level configuration, see {@link DefaultGradleProjectSettings#getTestRunner()} */ - public void setTestRunner(@Nullable GradleSystemRunningSettings.PreferredTestRunner testRunner) { + public void setTestRunner(@Nullable TestRunner testRunner) { this.testRunner = testRunner; } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleRunnerConfigurable.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleRunnerConfigurable.java index 1bae59a8e240..337e2333ca42 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleRunnerConfigurable.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleRunnerConfigurable.java @@ -6,6 +6,7 @@ import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.ui.ComboBox; import com.intellij.ui.components.JBCheckBox; import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.util.GradleBundle; @@ -20,9 +21,14 @@ public class GradleRunnerConfigurable implements Configurable { private JBCheckBox myGradleAwareMakeCheckBox; private ComboBox myPreferredTestRunner; private static final TestRunnerItem[] TEST_RUNNER_ITEMS = new TestRunnerItem[]{ - new TestRunnerItem(GradleSystemRunningSettings.PreferredTestRunner.PLATFORM_TEST_RUNNER), - new TestRunnerItem(GradleSystemRunningSettings.PreferredTestRunner.GRADLE_TEST_RUNNER), - new TestRunnerItem(GradleSystemRunningSettings.PreferredTestRunner.CHOOSE_PER_TEST)}; + new TestRunnerItem(TestRunner.PLATFORM), + new TestRunnerItem(TestRunner.GRADLE), + new TestRunnerItem(TestRunner.CHOOSE_PER_TEST)}; + private final DefaultGradleProjectSettings mySettings; + + public GradleRunnerConfigurable(@NotNull DefaultGradleProjectSettings settings) { + mySettings = settings; + } @Nls @Override @@ -39,18 +45,16 @@ public class GradleRunnerConfigurable implements Configurable { @Override public void apply() throws ConfigurationException { boolean gradleMakeEnabled = myGradleAwareMakeCheckBox.isSelected(); - GradleSystemRunningSettings settings = GradleSystemRunningSettings.getInstance(); - settings.setDelegatedBuildEnabledByDefault(gradleMakeEnabled); - GradleSystemRunningSettings.PreferredTestRunner preferredTestRunner = getSelectedRunner(); - settings.setDefaultTestRunner(preferredTestRunner); + mySettings.setDelegatedBuild(gradleMakeEnabled); + TestRunner preferredTestRunner = getSelectedRunner(); + mySettings.setTestRunner(preferredTestRunner); } @Override public void reset() { - GradleSystemRunningSettings settings = GradleSystemRunningSettings.getInstance(); - final TestRunnerItem item = getItem(settings.getDefaultTestRunner()); + TestRunnerItem item = getItem(mySettings.getTestRunner()); myPreferredTestRunner.setSelectedItem(item); - boolean gradleMakeEnabled = settings.isDelegatedBuildEnabledByDefault(); + boolean gradleMakeEnabled = mySettings.isDelegatedBuild(); enableGradleMake(gradleMakeEnabled); } @@ -62,12 +66,8 @@ public class GradleRunnerConfigurable implements Configurable { @Override public boolean isModified() { - GradleSystemRunningSettings uiSettings = new GradleSystemRunningSettings(); - GradleSystemRunningSettings.PreferredTestRunner preferredTestRunner = getSelectedRunner(); - uiSettings.setDefaultTestRunner(preferredTestRunner); - uiSettings.setDelegatedBuildEnabledByDefault(myGradleAwareMakeCheckBox.isSelected()); - GradleSystemRunningSettings settings = GradleSystemRunningSettings.getInstance(); - return !settings.equals(uiSettings); + return mySettings.isDelegatedBuild() != myGradleAwareMakeCheckBox.isSelected() || + mySettings.getTestRunner() != getSelectedRunner(); } private void createUIComponents() { @@ -80,12 +80,12 @@ public class GradleRunnerConfigurable implements Configurable { myGradleAwareMakeCheckBox.setSelected(enable); } - private GradleSystemRunningSettings.PreferredTestRunner getSelectedRunner() { + private TestRunner getSelectedRunner() { final TestRunnerItem selectedItem = (TestRunnerItem)myPreferredTestRunner.getSelectedItem(); - return selectedItem == null ? GradleSystemRunningSettings.PreferredTestRunner.CHOOSE_PER_TEST : selectedItem.value; + return selectedItem == null ? TestRunner.CHOOSE_PER_TEST : selectedItem.value; } - private static TestRunnerItem getItem(GradleSystemRunningSettings.PreferredTestRunner preferredTestRunner) { + private static TestRunnerItem getItem(TestRunner preferredTestRunner) { for (TestRunnerItem item : getItems()) { if (item.value == preferredTestRunner) return item; } @@ -97,12 +97,12 @@ public class GradleRunnerConfigurable implements Configurable { } static class TestRunnerItem { - TestRunnerItem(GradleSystemRunningSettings.PreferredTestRunner value) { + TestRunner value; + + TestRunnerItem(TestRunner value) { this.value = value; } - GradleSystemRunningSettings.PreferredTestRunner value; - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleSystemRunningSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleSystemRunningSettings.java index 1a27156e46ed..c2cfd90ac456 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleSystemRunningSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleSystemRunningSettings.java @@ -5,19 +5,21 @@ import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; -import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; import com.intellij.util.xmlb.annotations.OptionTag; import org.gradle.internal.impldep.com.google.common.base.Objects; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.service.settings.GradleSettingsService; /** * @author Vladislav.Soroka + * + * @deprecated use {@link GradleSettingsService} */ -@State(name = "GradleSystemRunningSettings", storages = @Storage("gradle.run.settings.xml")) +@Deprecated +@ApiStatus.ScheduledForRemoval(inVersion = "2019.2") +@State(name = "GradleSystemRunningSettings", storages = @Storage(value = "gradle.run.settings.xml", deprecated = true)) public class GradleSystemRunningSettings implements PersistentStateComponent { private boolean myDelegatedBuildEnabledByDefault; @NotNull private PreferredTestRunner myPreferredTestRunner = PreferredTestRunner.PLATFORM_TEST_RUNNER; @@ -42,54 +44,12 @@ public class GradleSystemRunningSettings implements PersistentStateComponent