From 0ebaaa1273c743871e46d1c7e149184005a57c0a Mon Sep 17 00:00:00 2001 From: ikarimullin Date: Sat, 10 Dec 2022 18:27:08 +0300 Subject: [PATCH] Updated icon Fixed AlreadyDisposedException in scheduled tasks --- .../JiraWorklogProjectCloseHandler.java | 8 ++ .../JiraWorklogStartupActivity.java | 31 +++- .../jiraworklogplugin/TimerUpdater.java | 19 ++- src/main/resources/META-INF/plugin.xml | 7 +- src/main/resources/META-INF/pluginIcon.svg | 135 ++++++++++++++++-- 5 files changed, 179 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/github/texhnolyzze/jiraworklogplugin/JiraWorklogProjectCloseHandler.java b/src/main/java/com/github/texhnolyzze/jiraworklogplugin/JiraWorklogProjectCloseHandler.java index f3b5af5..f6259cd 100644 --- a/src/main/java/com/github/texhnolyzze/jiraworklogplugin/JiraWorklogProjectCloseHandler.java +++ b/src/main/java/com/github/texhnolyzze/jiraworklogplugin/JiraWorklogProjectCloseHandler.java @@ -37,6 +37,14 @@ public boolean canClose(@NotNull final Project project) { Util.showWorklogDialog(project, branchName, branchName); state.getTimer(branchName, project).pause(project); } + final TimerUpdater updater = TimerUpdater.getInstance(project); + if (updater != null) { + updater.cancel(); + } + final JiraWorklogStartupActivity startupActivity = JiraWorklogStartupActivity.getInstance(project); + if (startupActivity != null) { + startupActivity.cancel(); + } return true; } diff --git a/src/main/java/com/github/texhnolyzze/jiraworklogplugin/JiraWorklogStartupActivity.java b/src/main/java/com/github/texhnolyzze/jiraworklogplugin/JiraWorklogStartupActivity.java index c0a5f0a..8fe9104 100644 --- a/src/main/java/com/github/texhnolyzze/jiraworklogplugin/JiraWorklogStartupActivity.java +++ b/src/main/java/com/github/texhnolyzze/jiraworklogplugin/JiraWorklogStartupActivity.java @@ -3,15 +3,23 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.changes.shelf.ShelveChangesManager; +import com.intellij.serviceContainer.AlreadyDisposedException; import com.intellij.util.concurrency.AppExecutorUtil; import org.jetbrains.annotations.NotNull; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; public class JiraWorklogStartupActivity extends ShelveChangesManager.PostStartupActivity { private static final Logger logger = Logger.getInstance(JiraWorklogStartupActivity.class); + private ScheduledFuture schedule; + + public static JiraWorklogStartupActivity getInstance(final Project project) { + return project.getService(JiraWorklogStartupActivity.class); + } + @Override public void runActivity(@NotNull final Project project) { logger.info("Executing Jira Worklog Plugin startup actions..."); @@ -30,7 +38,7 @@ public void runActivity(@NotNull final Project project) { init(currentBranch, state, project); } else { logger.info("Current branch not found. Scheduling periodic task, which will try to initialize it"); - AppExecutorUtil.getAppScheduledExecutorService().schedule( + this.schedule = AppExecutorUtil.getAppScheduledExecutorService().schedule( () -> initFromCurrentBranch(project), 5L, TimeUnit.SECONDS @@ -40,9 +48,16 @@ public void runActivity(@NotNull final Project project) { TimerUpdater.getInstance(project).setup(project); } - private static void initFromCurrentBranch(final @NotNull Project project) { - final String branch = Util.getCurrentBranch(project); - final JiraWorklogPluginState state = JiraWorklogPluginState.getInstance(project); + private void initFromCurrentBranch(final @NotNull Project project) { + final String branch; + final JiraWorklogPluginState state; + try { + branch = Util.getCurrentBranch(project); + state = JiraWorklogPluginState.getInstance(project); + } catch (final AlreadyDisposedException ex) { + cancel(); + return; + } if (branch != null) { logger.info(String.format("Found current branch %s inside periodic task", branch)); //noinspection SynchronizationOnLocalVariableOrMethodParameter @@ -59,7 +74,13 @@ private static void initFromCurrentBranch(final @NotNull Project project) { } } - private static void init( + void cancel() { + if (schedule != null) { + schedule.cancel(true); + } + } + + private void init( final String currentBranch, final JiraWorklogPluginState state, final @NotNull Project project diff --git a/src/main/java/com/github/texhnolyzze/jiraworklogplugin/TimerUpdater.java b/src/main/java/com/github/texhnolyzze/jiraworklogplugin/TimerUpdater.java index f52eb39..cb94cb6 100644 --- a/src/main/java/com/github/texhnolyzze/jiraworklogplugin/TimerUpdater.java +++ b/src/main/java/com/github/texhnolyzze/jiraworklogplugin/TimerUpdater.java @@ -2,6 +2,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.serviceContainer.AlreadyDisposedException; import com.intellij.util.concurrency.AppExecutorUtil; import java.time.Clock; @@ -9,6 +10,7 @@ import java.time.Instant; import java.util.Iterator; import java.util.Set; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; public class TimerUpdater { @@ -16,6 +18,7 @@ public class TimerUpdater { private static final Logger logger = Logger.getInstance(TimerUpdater.class); private int numUpdates; + private ScheduledFuture schedule; static TimerUpdater getInstance(final Project project) { return project.getService(TimerUpdater.class); @@ -23,9 +26,15 @@ static TimerUpdater getInstance(final Project project) { void setup(final Project project) { final long updateInterval = Duration.ofSeconds(10).toNanos(); - AppExecutorUtil.getAppScheduledExecutorService().scheduleWithFixedDelay( + this.schedule = AppExecutorUtil.getAppScheduledExecutorService().scheduleWithFixedDelay( () -> { - final JiraWorklogPluginState state = JiraWorklogPluginState.getInstance(project); + final JiraWorklogPluginState state; + try { + state = JiraWorklogPluginState.getInstance(project); + } catch (final AlreadyDisposedException ex) { + cancel(); + return; + } //noinspection SynchronizationOnLocalVariableOrMethodParameter synchronized (state) { final Set activeTimers = state.getActiveTimers(); @@ -77,4 +86,10 @@ void setup(final Project project) { logger.info("TimerUpdater setup"); } + void cancel() { + if (this.schedule != null) { + this.schedule.cancel(true); + } + } + } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 27e504e..a756cfd 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -8,7 +8,7 @@ Jira Worklog - texhnolyzze + texhnolyzze