From 338ea33d35be7b8a46ffc553216ee61931d21ed4 Mon Sep 17 00:00:00 2001 From: Fred Bricon Date: Wed, 24 Apr 2024 10:51:23 +0200 Subject: [PATCH] fix: use plugin disposable instead of project Signed-off-by: Fred Bricon --- .../ClasspathResourceChangedManager.java | 7 +++-- .../PsiMicroProfileProjectManager.java | 3 +- .../quarkus/QuarkusDeploymentSupport.java | 2 +- .../quarkus/QuarkusPluginDisposable.java | 28 +++++++++++++++++++ .../quarkus/QuarkusProjectService.java | 2 +- .../quarkus/lsp/QuarkusLanguageClient.java | 5 ++-- .../run/QuarkusRunConfigurationManager.java | 7 ++++- .../intellij/qute/lsp/QuteLanguageClient.java | 3 +- 8 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusPluginDisposable.java diff --git a/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/classpath/ClasspathResourceChangedManager.java b/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/classpath/ClasspathResourceChangedManager.java index 58236fd60..741f91e6a 100644 --- a/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/classpath/ClasspathResourceChangedManager.java +++ b/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/classpath/ClasspathResourceChangedManager.java @@ -25,6 +25,7 @@ import com.intellij.psi.PsiManager; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.messages.Topic; +import com.redhat.devtools.intellij.quarkus.QuarkusPluginDisposable; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -35,7 +36,7 @@ * * * ClasspathResourceChangeManager.Listener myListener = ... - * project.getMessageBus().connect(project).subscribe(ClasspathResourceChangeManager.TOPIC, myListener); + * project.getMessageBus().connect(QuarkusPluginDisposable.getInstance(project)).subscribe(ClasspathResourceChangeManager.TOPIC, myListener); * * * @@ -72,7 +73,7 @@ public ClasspathResourceChangedManager(Project project) { // Send source files changed in debounce mode this.resourceChangedNotifier = new ClasspathResourceChangedNotifier(project); listener = new ClasspathResourceChangedListener(this); - projectConnection = project.getMessageBus().connect(); + projectConnection = project.getMessageBus().connect(QuarkusPluginDisposable.getInstance(project)); // Track end of Java libraries update LibraryTablesRegistrar.getInstance().getLibraryTable(project).addListener(listener); // Track update of Psi Java, properties files @@ -80,7 +81,7 @@ public ClasspathResourceChangedManager(Project project) { // Track modules changes projectConnection.subscribe(ProjectTopics.MODULES, listener); // Track delete, create, update of file - appConnection = ApplicationManager.getApplication().getMessageBus().connect(project); + appConnection = ApplicationManager.getApplication().getMessageBus().connect(QuarkusPluginDisposable.getInstance()); appConnection.subscribe(VirtualFileManager.VFS_CHANGES, listener); } diff --git a/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/psi/core/project/PsiMicroProfileProjectManager.java b/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/psi/core/project/PsiMicroProfileProjectManager.java index f143d08b2..77a1bab18 100644 --- a/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/psi/core/project/PsiMicroProfileProjectManager.java +++ b/src/main/java/com/redhat/devtools/intellij/lsp4mp4ij/psi/core/project/PsiMicroProfileProjectManager.java @@ -20,6 +20,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.messages.MessageBusConnection; import com.redhat.devtools.intellij.lsp4mp4ij.classpath.ClasspathResourceChangedManager; +import com.redhat.devtools.intellij.quarkus.QuarkusPluginDisposable; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -84,7 +85,7 @@ private void evict(Module javaProject) { private PsiMicroProfileProjectManager(Project project) { this.project = project; microprofileProjectListener = new MicroProfileProjectListener(); - connection = project.getMessageBus().connect(project); + connection = project.getMessageBus().connect(QuarkusPluginDisposable.getInstance(project)); connection.subscribe(ClasspathResourceChangedManager.TOPIC, microprofileProjectListener); connection.subscribe(ProjectTopics.MODULES, microprofileProjectListener); } diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusDeploymentSupport.java b/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusDeploymentSupport.java index ed41db7fc..544c6af54 100644 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusDeploymentSupport.java +++ b/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusDeploymentSupport.java @@ -64,7 +64,7 @@ public static QuarkusDeploymentSupport getInstance(@NotNull Project project) { public QuarkusDeploymentSupport(Project project) { this.project = project; - connection = project.getMessageBus().connect(project); + connection = project.getMessageBus().connect(QuarkusPluginDisposable.getInstance(project)); connection.subscribe(ClasspathResourceChangedManager.TOPIC, this); } diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusPluginDisposable.java b/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusPluginDisposable.java new file mode 100644 index 000000000..08cd579db --- /dev/null +++ b/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusPluginDisposable.java @@ -0,0 +1,28 @@ +// Copyright 2000-2020 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 com.redhat.devtools.intellij.quarkus; + +import com.intellij.openapi.Disposable; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.components.Service; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +/** + * The service is intended to be used instead of a project/application as a parent disposable. + * + * copied from https://github.com/JetBrains/intellij-community/blob/idea/241.14494.240/python/openapi/src/com/jetbrains/python/PythonPluginDisposable.java + */ +@Service({Service.Level.APP, Service.Level.PROJECT}) +public final class QuarkusPluginDisposable implements Disposable { + public static @NotNull Disposable getInstance() { + return ApplicationManager.getApplication().getService(QuarkusPluginDisposable.class); + } + + public static @NotNull Disposable getInstance(@NotNull Project project) { + return project.getService(QuarkusPluginDisposable.class); + } + + @Override + public void dispose() { + } +} \ No newline at end of file diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusProjectService.java b/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusProjectService.java index b3fd5f294..39693236d 100644 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusProjectService.java +++ b/src/main/java/com/redhat/devtools/intellij/quarkus/QuarkusProjectService.java @@ -52,7 +52,7 @@ public static QuarkusProjectService getInstance(@NotNull Project project) { private final MessageBusConnection connection; public QuarkusProjectService(Project project) { - connection = project.getMessageBus().connect(); + connection = project.getMessageBus().connect(QuarkusPluginDisposable.getInstance(project)); connection.subscribe(ClasspathResourceChangedManager.TOPIC, this); } diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/lsp/QuarkusLanguageClient.java b/src/main/java/com/redhat/devtools/intellij/quarkus/lsp/QuarkusLanguageClient.java index 17158761e..d13f91ace 100644 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/lsp/QuarkusLanguageClient.java +++ b/src/main/java/com/redhat/devtools/intellij/quarkus/lsp/QuarkusLanguageClient.java @@ -32,6 +32,7 @@ import com.redhat.devtools.intellij.lsp4mp4ij.settings.UserDefinedMicroProfileSettings; import com.redhat.devtools.intellij.quarkus.QuarkusDeploymentSupport; import com.redhat.devtools.intellij.quarkus.QuarkusModuleUtil; +import com.redhat.devtools.intellij.quarkus.QuarkusPluginDisposable; import com.redhat.devtools.lsp4ij.JSONUtils; import com.redhat.devtools.lsp4ij.client.CoalesceByKey; import com.redhat.devtools.lsp4ij.client.IndexAwareLanguageClient; @@ -59,10 +60,10 @@ public class QuarkusLanguageClient extends IndexAwareLanguageClient implements M public QuarkusLanguageClient(Project project) { super(project); - // Call Quarkus deployment support here to react on library changed (to evict quarkus deploiement cache) before + // Call Quarkus deployment support here to react on library changed (to evict quarkus deployment cache) before // sending an LSP microprofile/propertiesChanged notifications QuarkusDeploymentSupport.getInstance(project); - connection = project.getMessageBus().connect(project); + connection = project.getMessageBus().connect(QuarkusPluginDisposable.getInstance(project)); connection.subscribe(ClasspathResourceChangedManager.TOPIC, this); inspectionsInfo = MicroProfileInspectionsInfo.getMicroProfileInspectionInfo(project); connection.subscribe(ProfileChangeAdapter.TOPIC, this); diff --git a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusRunConfigurationManager.java b/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusRunConfigurationManager.java index 656e9d877..fc7f36a30 100644 --- a/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusRunConfigurationManager.java +++ b/src/main/java/com/redhat/devtools/intellij/quarkus/run/QuarkusRunConfigurationManager.java @@ -19,10 +19,12 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.module.Module; +import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; import com.intellij.util.concurrency.NonUrgentExecutor; import com.intellij.util.messages.MessageBusConnection; import com.redhat.devtools.intellij.quarkus.QuarkusModuleUtil; +import com.redhat.devtools.intellij.quarkus.QuarkusPluginDisposable; import com.redhat.devtools.intellij.quarkus.buildtool.BuildToolDelegate; import com.redhat.devtools.intellij.quarkus.buildtool.ProjectImportListener; import com.redhat.devtools.intellij.quarkus.settings.UserDefinedQuarkusSettings; @@ -34,6 +36,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.CancellationException; /** * Quarkus run configuration manager used to: @@ -92,7 +95,7 @@ public QuarkusRunConfigurationManager(Project project) { @NotNull private MessageBusConnection addProjectImportListener(Project project) { - MessageBusConnection connection = project.getMessageBus().connect(); + MessageBusConnection connection = project.getMessageBus().connect(QuarkusPluginDisposable.getInstance(project)); ProjectImportListener listener = new ProjectImportListener() { @Override @@ -183,6 +186,8 @@ private boolean addQuarkusRunConfigurationTypeInServicesViewIfNeeded(boolean log runDashboardManager.setTypes(types); } return true; + } catch (ProcessCanceledException | CancellationException ignored) { + return false; } catch (Exception e) { // This case comes from when Ultimate is used and Ultimate Quarkus support update in same time their Quarkus Configuration Type. // java.util.ConcurrentModificationException diff --git a/src/main/java/com/redhat/devtools/intellij/qute/lsp/QuteLanguageClient.java b/src/main/java/com/redhat/devtools/intellij/qute/lsp/QuteLanguageClient.java index b40fa5ec4..8dfa2832d 100644 --- a/src/main/java/com/redhat/devtools/intellij/qute/lsp/QuteLanguageClient.java +++ b/src/main/java/com/redhat/devtools/intellij/qute/lsp/QuteLanguageClient.java @@ -21,6 +21,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.profile.ProfileChangeAdapter; import com.intellij.util.messages.MessageBusConnection; +import com.redhat.devtools.intellij.quarkus.QuarkusPluginDisposable; import com.redhat.devtools.lsp4ij.client.CoalesceByKey; import com.redhat.devtools.lsp4ij.client.IndexAwareLanguageClient; import com.redhat.devtools.intellij.lsp4mp4ij.classpath.ClasspathResourceChangedManager; @@ -54,7 +55,7 @@ public class QuteLanguageClient extends IndexAwareLanguageClient implements Qute public QuteLanguageClient(Project project) { super(project); - connection = project.getMessageBus().connect(project); + connection = project.getMessageBus().connect(QuarkusPluginDisposable.getInstance(project)); connection.subscribe(ClasspathResourceChangedManager.TOPIC, this); inspectionsInfo = QuteInspectionsInfo.getQuteInspectionsInfo(project); connection.subscribe(ProfileChangeAdapter.TOPIC, this);