diff --git a/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java b/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java index d89cc5979f4f..da811d71ac5a 100644 --- a/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java +++ b/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java @@ -16,6 +16,7 @@ package com.intellij.tasks; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.changes.LocalChangeList; import org.jetbrains.annotations.NotNull; @@ -43,7 +44,12 @@ public abstract class TaskManager { public abstract List getIssues(@Nullable String query, boolean forceRequest); - public abstract List getIssues(@Nullable String query, int max, long since, boolean forceRequest, final boolean withClosed); + public abstract List getIssues(@Nullable String query, + int max, + long since, + boolean forceRequest, + final boolean withClosed, + final ProgressIndicator cancelled); /** * Returns already cached issues. * @return cached issues. diff --git a/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskRepository.java b/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskRepository.java index 0d3c2b8c5bae..65a796cd2399 100644 --- a/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskRepository.java +++ b/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskRepository.java @@ -15,11 +15,13 @@ */ package com.intellij.tasks; +import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.xmlb.annotations.Attribute; import com.intellij.util.xmlb.annotations.Tag; import com.intellij.util.xmlb.annotations.Transient; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.concurrent.Callable; @@ -83,6 +85,10 @@ public abstract class TaskRepository { */ public abstract Task[] getIssues(@Nullable String query, int max, long since) throws Exception; + public Task[] getIssues(@Nullable String query, int max, long since, @NotNull ProgressIndicator cancelled) throws Exception { + return getIssues(query, max, since); + } + @Nullable public abstract Task findTask(String id) throws Exception; diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/GotoTaskAction.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/GotoTaskAction.java index ca9921f4c933..d0e30374ee44 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/GotoTaskAction.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/GotoTaskAction.java @@ -84,8 +84,8 @@ public class GotoTaskAction extends GotoActionBase { if (!consumer.process(element)) return false; } - List tasks = - TaskSearchSupport.getRepositoriesTasks(TaskManager.getManager(project), pattern, base.getMaximumListSizeLimit(), 0, true, everywhere); + List tasks = TaskSearchSupport + .getRepositoriesTasks(TaskManager.getManager(project), pattern, base.getMaximumListSizeLimit(), 0, true, everywhere, cancelled); tasks.removeAll(cachedAndLocalTasks); taskPsiElements = ContainerUtil.map(tasks, new Function() { @Override diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/TaskSearchSupport.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/TaskSearchSupport.java index 05de0cac6ebd..d72e9cc8e3c0 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/TaskSearchSupport.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/TaskSearchSupport.java @@ -16,6 +16,7 @@ package com.intellij.tasks.actions; +import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.util.Condition; import com.intellij.psi.codeStyle.NameUtil; import com.intellij.tasks.Task; @@ -59,8 +60,14 @@ public class TaskSearchSupport { }); } - public static List getRepositoriesTasks(final TaskManager myManager, String pattern, int max, long since, boolean forceRequest, final boolean withClosed) { - List tasks = myManager.getIssues(pattern, max, since, forceRequest, withClosed); + public static List getRepositoriesTasks(final TaskManager myManager, + String pattern, + int max, + long since, + boolean forceRequest, + final boolean withClosed, + final ProgressIndicator cancelled) { + List tasks = myManager.getIssues(pattern, max, since, forceRequest, withClosed, cancelled); ContainerUtil.sort(tasks, TaskManagerImpl.TASK_UPDATE_COMPARATOR); return tasks; } diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java index ec07be9856ca..e89fd586da03 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java @@ -20,6 +20,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.options.ShowSettingsUtil; +import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; @@ -231,14 +232,18 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe @Override public List getIssues(@Nullable final String query, final boolean forceRequest) { - return getIssues(query, 50, 0, forceRequest, true); + return getIssues(query, 50, 0, forceRequest, true, null); } @Override - public List getIssues(@Nullable String query, int max, long since, boolean forceRequest, final boolean withClosed) { - List tasks = getIssuesFromRepositories(query, max, since, forceRequest); + public List getIssues(@Nullable String query, + int max, + long since, + boolean forceRequest, + final boolean withClosed, + final ProgressIndicator cancelled) { + List tasks = getIssuesFromRepositories(query, max, since, forceRequest, cancelled); if (tasks == null) return getCachedIssues(withClosed); - myIssueCache.putAll(ContainerUtil.newMapFromValues(tasks.iterator(), KEY_CONVERTOR)); return ContainerUtil.filter(tasks, new Condition() { @Override public boolean value(final Task task) { @@ -651,7 +656,7 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe private void doUpdate(@Nullable Runnable onComplete) { try { - List issues = getIssuesFromRepositories(null, myConfig.updateIssuesCount, 0, false); + List issues = getIssuesFromRepositories(null, myConfig.updateIssuesCount, 0, false, new EmptyProgressIndicator()); if (issues == null) return; synchronized (myIssueCache) { @@ -679,18 +684,25 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe } @Nullable - private List getIssuesFromRepositories(@Nullable String request, int max, long since, boolean forceRequest) { + private List getIssuesFromRepositories(@Nullable String request, + int max, + long since, + boolean forceRequest, + final ProgressIndicator cancelled) { List issues = null; for (final TaskRepository repository : getAllRepositories()) { if (!repository.isConfigured() || (!forceRequest && myBadRepositories.contains(repository))) { continue; } try { - final Task[] tasks = repository.getIssues(request, max, since); + final Task[] tasks = repository.getIssues(request, max, since, cancelled); myBadRepositories.remove(repository); if (issues == null) issues = new ArrayList(tasks.length); ContainerUtil.addAll(issues, tasks); } + catch (ProcessCanceledException ignored) { + // OK + } catch (Exception e) { //noinspection InstanceofCatchParameter if (e instanceof SocketTimeoutException) { diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/mantis/MantisRepository.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/mantis/MantisRepository.java index 34a6ccdf1717..ade2fa43fe1a 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/mantis/MantisRepository.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/mantis/MantisRepository.java @@ -1,5 +1,7 @@ package com.intellij.tasks.mantis; +import com.intellij.openapi.progress.EmptyProgressIndicator; +import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.util.Comparing; import com.intellij.tasks.Comment; import com.intellij.tasks.Task; @@ -65,14 +67,23 @@ public class MantisRepository extends BaseRepositoryImpl { } @Override - public Task[] getIssues(@Nullable String request, int max, long since) throws Exception { + public Task[] getIssues(@Nullable String query, int max, long since) throws Exception { + return getIssues(query, max, since, new EmptyProgressIndicator()); + } + + @Override + public Task[] getIssues(@Nullable final String query, + final int max, + final long since, + @NotNull final ProgressIndicator cancelled) throws Exception { MantisConnectPortType soap = createSoap(); List tasks = new ArrayList(max); int page = 1; - int issuesOnPage = StringUtils.isEmpty(request) ? max : max * request.length() * 5; + int issuesOnPage = StringUtils.isEmpty(query) ? max : max * query.length() * 5; while (true) { + cancelled.checkCanceled(); final List issuesFromPage = getIssues(page, issuesOnPage, soap); - final List filteredTasks = TaskSearchSupport.filterTasks(request != null ? request : "", issuesFromPage); + final List filteredTasks = TaskSearchSupport.filterTasks(query != null ? query : "", issuesFromPage); tasks.addAll(filteredTasks); if (issuesFromPage.size() < issuesOnPage || tasks.size() >= max) { break;