From 216edbb83009b0d3d8bd86d225ba07d139a5fc2c Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Tue, 17 Sep 2024 11:54:52 +0200 Subject: [PATCH 1/4] dynamic plugin --- .../jdks/enablement/GradleJdksEnablement.java | 2 +- .../gradle/jdks/GradleJdksProjectService.java | 15 ++++++++++++--- .../src/main/resources/META-INF/plugin.xml | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/gradle-jdks-enablement/src/main/java/com/palantir/gradle/jdks/enablement/GradleJdksEnablement.java b/gradle-jdks-enablement/src/main/java/com/palantir/gradle/jdks/enablement/GradleJdksEnablement.java index d86bcccb..5d9dbb50 100644 --- a/gradle-jdks-enablement/src/main/java/com/palantir/gradle/jdks/enablement/GradleJdksEnablement.java +++ b/gradle-jdks-enablement/src/main/java/com/palantir/gradle/jdks/enablement/GradleJdksEnablement.java @@ -25,7 +25,7 @@ import java.util.Optional; import java.util.Properties; -public class GradleJdksEnablement { +public final class GradleJdksEnablement { public static final String MINIMUM_SUPPORTED_GRADLE_VERSION = "7.6"; diff --git a/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java b/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java index cba27ccf..3fcc0017 100644 --- a/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java +++ b/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java @@ -29,13 +29,14 @@ import com.intellij.notification.Notification; import com.intellij.notification.NotificationGroupManager; import com.intellij.notification.NotificationType; +import com.intellij.openapi.Disposable; import com.intellij.openapi.components.Service; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Disposer; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowAnchor; import com.intellij.openapi.wm.ToolWindowManager; +import com.intellij.platform.ide.progress.TaskCancellation; import com.intellij.platform.ide.progress.TasksKt; import com.intellij.platform.util.progress.StepsKt; import com.intellij.ui.content.Content; @@ -56,7 +57,7 @@ import org.jetbrains.plugins.gradle.settings.GradleSettings; @Service(Service.Level.PROJECT) -public final class GradleJdksProjectService { +public final class GradleJdksProjectService implements Disposable { private final Logger logger = Logger.getInstance(GradleJdksProjectService.class); private static final String TOOL_WINDOW_NAME = "Gradle JDK Setup"; @@ -81,7 +82,6 @@ private ConsoleView initConsoleView() { ContentFactory contentFactory = ContentFactory.getInstance(); Content content = contentFactory.createContent(newConsoleView.getComponent(), "", false); toolWindow.getContentManager().addContent(content); - Disposer.register(project, newConsoleView); }); return newConsoleView; @@ -111,6 +111,7 @@ public void maybeSetupGradleJdks() { TasksKt.withBackgroundProgress( project, "Gradle JDK Setup", + TaskCancellation.nonCancellable(), (_coroutineScope, continuation) -> { StepsKt.withProgressText( "`Gradle JDK Setup` is running. Logs in the `Gradle JDK Setup` window ...", @@ -191,4 +192,12 @@ private void updateGradleJvm() { } } } + + @Override + public void dispose() { + ConsoleView view = consoleView.get(); + if (view != null) { + view.dispose(); + } + } } diff --git a/idea-plugin/src/main/resources/META-INF/plugin.xml b/idea-plugin/src/main/resources/META-INF/plugin.xml index daddf16f..a739ce7d 100644 --- a/idea-plugin/src/main/resources/META-INF/plugin.xml +++ b/idea-plugin/src/main/resources/META-INF/plugin.xml @@ -1,4 +1,4 @@ - + palantir-gradle-jdks palantir-gradle-jdks From c27b2aa49005d96531be3789fc57546a60412183 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Tue, 17 Sep 2024 17:15:04 +0200 Subject: [PATCH 2/4] listener --- .../gradle/jdks/GradleJdksProjectService.java | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java b/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java index 3fcc0017..cc58e95e 100644 --- a/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java +++ b/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java @@ -26,12 +26,16 @@ import com.intellij.execution.process.ProcessTerminatedListener; import com.intellij.execution.ui.ConsoleView; import com.intellij.execution.ui.ConsoleViewContentType; +import com.intellij.ide.plugins.CannotUnloadPluginException; +import com.intellij.ide.plugins.DynamicPluginListener; +import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.notification.Notification; import com.intellij.notification.NotificationGroupManager; import com.intellij.notification.NotificationType; import com.intellij.openapi.Disposable; import com.intellij.openapi.components.Service; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowAnchor; @@ -48,6 +52,7 @@ import java.nio.file.Path; import java.util.Optional; import java.util.Properties; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; import kotlin.coroutines.Continuation; import kotlin.coroutines.CoroutineContext; @@ -57,15 +62,16 @@ import org.jetbrains.plugins.gradle.settings.GradleSettings; @Service(Service.Level.PROJECT) -public final class GradleJdksProjectService implements Disposable { +public final class GradleJdksProjectService implements Disposable, DynamicPluginListener { private final Logger logger = Logger.getInstance(GradleJdksProjectService.class); private static final String TOOL_WINDOW_NAME = "Gradle JDK Setup"; + private AtomicBoolean executingFlag = new AtomicBoolean(false); private final Project project; private final Supplier consoleView = Suppliers.memoize(this::initConsoleView); - public GradleJdksProjectService(Project project) { + private GradleJdksProjectService(Project project) { this.project = project; } @@ -108,6 +114,10 @@ public void maybeSetupGradleJdks() { "Skipping setupGradleJdks because gradle JDK setup is not found %s", gradleSetupScript)); return; } + if (!this.executingFlag.compareAndSet(false, true)) { + logger.warn("executing flag was true, another update action should be already running"); + // TODO(crogoz): figure out a way to wait on the existing background process if it is still running. + } TasksKt.withBackgroundProgress( project, "Gradle JDK Setup", @@ -116,7 +126,11 @@ public void maybeSetupGradleJdks() { StepsKt.withProgressText( "`Gradle JDK Setup` is running. Logs in the `Gradle JDK Setup` window ...", (_cor, conti) -> { - setupGradleJdks(); + try { + setupGradleJdks(); + } finally { + executingFlag.set(false); + } return conti; }, continuation); @@ -195,9 +209,18 @@ private void updateGradleJvm() { @Override public void dispose() { + executingFlag.set(false); ConsoleView view = consoleView.get(); if (view != null) { view.dispose(); } } + + @Override + public void checkUnloadPlugin(IdeaPluginDescriptor ideaPluginDescriptor) { + PluginId pluginId = PluginId.getId("palantir-gradle-jdks"); + if (ideaPluginDescriptor.getPluginId().equals(pluginId) && executingFlag.get()) { + throw new CannotUnloadPluginException("Gradle JDK Setup is still in progress..."); + } + } } From 2523e7acdb43015420a0e4f35b1e29fed614ce22 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Mon, 7 Oct 2024 10:34:53 -0700 Subject: [PATCH 3/4] disposable --- .../gradle/jdks/GradleJdksProjectService.java | 27 ++----------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java b/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java index cc58e95e..88a3599d 100644 --- a/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java +++ b/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java @@ -26,16 +26,12 @@ import com.intellij.execution.process.ProcessTerminatedListener; import com.intellij.execution.ui.ConsoleView; import com.intellij.execution.ui.ConsoleViewContentType; -import com.intellij.ide.plugins.CannotUnloadPluginException; -import com.intellij.ide.plugins.DynamicPluginListener; -import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.notification.Notification; import com.intellij.notification.NotificationGroupManager; import com.intellij.notification.NotificationType; import com.intellij.openapi.Disposable; import com.intellij.openapi.components.Service; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowAnchor; @@ -52,7 +48,6 @@ import java.nio.file.Path; import java.util.Optional; import java.util.Properties; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; import kotlin.coroutines.Continuation; import kotlin.coroutines.CoroutineContext; @@ -62,12 +57,11 @@ import org.jetbrains.plugins.gradle.settings.GradleSettings; @Service(Service.Level.PROJECT) -public final class GradleJdksProjectService implements Disposable, DynamicPluginListener { +public final class GradleJdksProjectService implements Disposable { private final Logger logger = Logger.getInstance(GradleJdksProjectService.class); private static final String TOOL_WINDOW_NAME = "Gradle JDK Setup"; - private AtomicBoolean executingFlag = new AtomicBoolean(false); private final Project project; private final Supplier consoleView = Suppliers.memoize(this::initConsoleView); @@ -114,10 +108,6 @@ public void maybeSetupGradleJdks() { "Skipping setupGradleJdks because gradle JDK setup is not found %s", gradleSetupScript)); return; } - if (!this.executingFlag.compareAndSet(false, true)) { - logger.warn("executing flag was true, another update action should be already running"); - // TODO(crogoz): figure out a way to wait on the existing background process if it is still running. - } TasksKt.withBackgroundProgress( project, "Gradle JDK Setup", @@ -126,11 +116,7 @@ public void maybeSetupGradleJdks() { StepsKt.withProgressText( "`Gradle JDK Setup` is running. Logs in the `Gradle JDK Setup` window ...", (_cor, conti) -> { - try { - setupGradleJdks(); - } finally { - executingFlag.set(false); - } + setupGradleJdks(); return conti; }, continuation); @@ -209,18 +195,9 @@ private void updateGradleJvm() { @Override public void dispose() { - executingFlag.set(false); ConsoleView view = consoleView.get(); if (view != null) { view.dispose(); } } - - @Override - public void checkUnloadPlugin(IdeaPluginDescriptor ideaPluginDescriptor) { - PluginId pluginId = PluginId.getId("palantir-gradle-jdks"); - if (ideaPluginDescriptor.getPluginId().equals(pluginId) && executingFlag.get()) { - throw new CannotUnloadPluginException("Gradle JDK Setup is still in progress..."); - } - } } From 5eddff4f6e82a031d1281bb943149005bfa48465 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Mon, 7 Oct 2024 10:38:27 -0700 Subject: [PATCH 4/4] . --- .../java/com/palantir/gradle/jdks/GradleJdksProjectService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java b/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java index 88a3599d..3fcc0017 100644 --- a/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java +++ b/idea-plugin/src/main/java/com/palantir/gradle/jdks/GradleJdksProjectService.java @@ -65,7 +65,7 @@ public final class GradleJdksProjectService implements Disposable { private final Project project; private final Supplier consoleView = Suppliers.memoize(this::initConsoleView); - private GradleJdksProjectService(Project project) { + public GradleJdksProjectService(Project project) { this.project = project; }