From f82f0820a0e07d185244e7bc7433bd6a5bd1e81a Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Thu, 3 Mar 2016 18:33:17 +0300 Subject: [PATCH] [hg]: move BackgroundTaskUtil to platform-impl * reuse for hg appropriate command execution instead of simple execution on application PolledThread * style: refactor static methods signatures to be able call not only from AWT --- .../com/intellij/diff/util/DiffTaskQueue.java | 1 + .../progress}/util/BackgroundTaskUtil.java | 27 ++++++++++++++++--- .../vcs/actions/AnnotateDiffViewerAction.java | 2 +- .../vcs/ex/LineStatusTrackerDrawing.java | 2 +- .../hg4idea/src/org/zmlx/hg4idea/HgVcs.java | 4 +-- .../zmlx/hg4idea/command/HgAddCommand.java | 13 +++------ .../hg4idea/execution/HgCommandExecutor.java | 4 +-- .../zmlx/hg4idea/repo/HgRepositoryImpl.java | 9 +++---- .../src/org/zmlx/hg4idea/util/HgUtil.java | 14 +++++----- 9 files changed, 44 insertions(+), 32 deletions(-) rename platform/{diff-impl/src/com/intellij/diff => platform-impl/src/com/intellij/openapi/progress}/util/BackgroundTaskUtil.java (88%) diff --git a/platform/diff-impl/src/com/intellij/diff/util/DiffTaskQueue.java b/platform/diff-impl/src/com/intellij/diff/util/DiffTaskQueue.java index 4c4283136d29..7f64fda828d5 100644 --- a/platform/diff-impl/src/com/intellij/diff/util/DiffTaskQueue.java +++ b/platform/diff-impl/src/com/intellij/diff/util/DiffTaskQueue.java @@ -16,6 +16,7 @@ package com.intellij.diff.util; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.util.BackgroundTaskUtil; import com.intellij.util.Function; import org.jetbrains.annotations.CalledInAwt; import org.jetbrains.annotations.NotNull; diff --git a/platform/diff-impl/src/com/intellij/diff/util/BackgroundTaskUtil.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/BackgroundTaskUtil.java similarity index 88% rename from platform/diff-impl/src/com/intellij/diff/util/BackgroundTaskUtil.java rename to platform/platform-impl/src/com/intellij/openapi/progress/util/BackgroundTaskUtil.java index 6936cd40adcd..9ec5df04f63b 100644 --- a/platform/diff-impl/src/com/intellij/diff/util/BackgroundTaskUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/BackgroundTaskUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.diff.util; +package com.intellij.openapi.progress.util; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; @@ -28,6 +28,8 @@ import com.intellij.openapi.util.EmptyRunnable; import com.intellij.openapi.util.Ref; import com.intellij.util.Consumer; import com.intellij.util.Function; +import com.intellij.util.NullableConsumer; +import org.jetbrains.annotations.CalledInAny; import org.jetbrains.annotations.CalledInAwt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -170,6 +172,25 @@ public class BackgroundTaskUtil { @NotNull public static ProgressIndicator executeOnPooledThread(@NotNull final Consumer task, @NotNull Disposable parent) { final ModalityState modalityState = ModalityState.current(); + return executeOnPooledThread(task, parent, modalityState); + } + + @NotNull + @CalledInAny + public static ProgressIndicator executeOnPooledThread(@NotNull final Runnable runnable, + @NotNull Disposable parent) { + return executeOnPooledThread(new NullableConsumer() { + @Override + public void consume(@Nullable ProgressIndicator indicator) { + runnable.run(); + } + }, parent, ModalityState.NON_MODAL); + } + + @NotNull + @CalledInAny + public static ProgressIndicator executeOnPooledThread(@NotNull final Consumer task, + @NotNull Disposable parent, final ModalityState modalityState) { final ProgressIndicator indicator = new EmptyProgressIndicator() { @NotNull @Override @@ -177,7 +198,6 @@ public class BackgroundTaskUtil { return modalityState; } }; - indicator.start(); final Disposable disposable = new Disposable() { @Override @@ -186,6 +206,7 @@ public class BackgroundTaskUtil { } }; Disposer.register(parent, disposable); + indicator.start(); ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { @Override diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateDiffViewerAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateDiffViewerAction.java index 3a3f60fc6dab..0b8f47d141b5 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateDiffViewerAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateDiffViewerAction.java @@ -29,7 +29,6 @@ import com.intellij.diff.tools.util.base.DiffViewerBase; import com.intellij.diff.tools.util.base.DiffViewerListener; import com.intellij.diff.tools.util.side.OnesideTextDiffViewer; import com.intellij.diff.tools.util.side.TwosideTextDiffViewer; -import com.intellij.diff.util.BackgroundTaskUtil; import com.intellij.diff.util.Side; import com.intellij.notification.Notification; import com.intellij.notification.NotificationType; @@ -43,6 +42,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.localVcs.UpToDateLineNumberProvider; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.util.BackgroundTaskUtil; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.Balloon; diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTrackerDrawing.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTrackerDrawing.java index acc27b6b21fa..da84945d30db 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTrackerDrawing.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTrackerDrawing.java @@ -21,7 +21,6 @@ import com.intellij.codeInsight.hint.HintManagerImpl; import com.intellij.diff.comparison.ByWord; import com.intellij.diff.comparison.ComparisonPolicy; import com.intellij.diff.fragments.DiffFragment; -import com.intellij.diff.util.BackgroundTaskUtil; import com.intellij.diff.util.DiffDrawUtil; import com.intellij.diff.util.DiffUtil; import com.intellij.diff.util.TextDiffType; @@ -46,6 +45,7 @@ import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.util.BackgroundTaskUtil; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.registry.Registry; diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/HgVcs.java b/plugins/hg4idea/src/org/zmlx/hg4idea/HgVcs.java index 45c8e1459288..2ebae5f7de0a 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/HgVcs.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/HgVcs.java @@ -406,12 +406,12 @@ public class HgVcs extends AbstractVcs { @Override @CalledInAwt public void enableIntegration() { - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + HgUtil.executeOnPooledThread(new Runnable() { public void run() { Collection roots = ServiceManager.getService(myProject, VcsRootDetector.class).detect(); new HgIntegrationEnabler(HgVcs.this).enable(roots); } - }); + }, myProject); } @Override diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgAddCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgAddCommand.java index 2839fbe5716b..87ac23bffc7c 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgAddCommand.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgAddCommand.java @@ -12,7 +12,6 @@ // limitations under the License. package org.zmlx.hg4idea.command; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; @@ -57,12 +56,12 @@ public class HgAddCommand { }.queue(); } else { - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + HgUtil.executeOnPooledThread(new Runnable() { @Override public void run() { executeInCurrentThread(files); } - }); + }, myProject); } } @@ -70,9 +69,7 @@ public class HgAddCommand { final Map> sorted = HgUtil.sortByHgRoots(myProject, files); for (Map.Entry> entry : sorted.entrySet()) { if (indicator != null) { - if (indicator.isCanceled()) { - return; - } + if (indicator.isCanceled()) return; indicator.setFraction(0); indicator.setText2("Adding files to " + entry.getKey().getPresentableUrl()); } @@ -85,9 +82,7 @@ public class HgAddCommand { int currentChunk = 0; for (List paths : chunks) { if (indicator != null) { - if (indicator.isCanceled()) { - return; - } + if (indicator.isCanceled()) return; indicator.setFraction((double)currentChunk / chunks.size()); currentChunk++; } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandExecutor.java b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandExecutor.java index 4281a64a0a2b..4625258f31a5 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandExecutor.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandExecutor.java @@ -98,7 +98,7 @@ public class HgCommandExecutor { public void execute(@Nullable final VirtualFile repo, @NotNull final String operation, @Nullable final List arguments, @Nullable final HgCommandResultHandler handler) { - HgUtil.executeOnPooledThreadIfNeeded(new Runnable() { + HgUtil.executeOnPooledThread(new Runnable() { @Override public void run() { HgCommandResult result = executeInCurrentThread(repo, operation, arguments); @@ -106,7 +106,7 @@ public class HgCommandExecutor { handler.process(result); } } - }); + }, myProject); } public HgCommandResult executeInCurrentThread(@Nullable final VirtualFile repo, diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java index 6034ed9cc341..b01aa8bbf1a8 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/repo/HgRepositoryImpl.java @@ -18,7 +18,6 @@ package org.zmlx.hg4idea.repo; import com.intellij.dvcs.repo.RepositoryImpl; import com.intellij.openapi.Disposable; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; @@ -228,13 +227,11 @@ public class HgRepositoryImpl extends RepositoryImpl implements HgRepository { myOpenedBranches = HgBranchesCommand.collectNames(branchCommandResult); } - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + HgUtil.executeOnPooledThread(new Runnable() { public void run() { - if (!project.isDisposed()) { - project.getMessageBus().syncPublisher(HgVcs.STATUS_TOPIC).update(project, getRoot()); - } + project.getMessageBus().syncPublisher(HgVcs.STATUS_TOPIC).update(project, getRoot()); } - }); + }, project); } } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgUtil.java b/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgUtil.java index a2b209c2149a..9667cb8ae4a8 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgUtil.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/util/HgUtil.java @@ -13,9 +13,12 @@ package org.zmlx.hg4idea.util; import com.intellij.dvcs.DvcsUtil; +import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.util.BackgroundTaskUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Couple; @@ -55,11 +58,9 @@ import org.zmlx.hg4idea.provider.HgChangeProvider; import org.zmlx.hg4idea.repo.HgRepository; import org.zmlx.hg4idea.repo.HgRepositoryManager; -import java.awt.*; import java.io.*; import java.lang.reflect.InvocationTargetException; import java.util.*; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -423,12 +424,9 @@ public abstract class HgUtil { return sorted; } - public static void executeOnPooledThreadIfNeeded(Runnable runnable) { - if (EventQueue.isDispatchThread() && !ApplicationManager.getApplication().isUnitTestMode()) { - ApplicationManager.getApplication().executeOnPooledThread(runnable); - } else { - runnable.run(); - } + @NotNull + public static ProgressIndicator executeOnPooledThread(@NotNull Runnable runnable, @NotNull Disposable parentDisposable) { + return BackgroundTaskUtil.executeOnPooledThread(runnable, parentDisposable); } /**