From 570a506bc6b06b1f49eaee65a00ea14da7805a37 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 15 Dec 2010 16:38:04 +0300 Subject: [PATCH] better caching for tasks --- .../src/com/intellij/tasks/TaskManager.java | 13 +++++++- .../intellij/tasks/impl/TaskManagerImpl.java | 30 ++++++++++++------- 2 files changed, 31 insertions(+), 12 deletions(-) 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 b6f71294efe1..9139b7b85bcb 100644 --- a/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java +++ b/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java @@ -32,8 +32,19 @@ public abstract class TaskManager { return project.getComponent(TaskManager.class); } + /** + * Queries all configured task repositories. + * Operation may be blocked for a while. + * @param query text search + * @return up-to-date issues retrieved from repositories + * @see #getCachedIssues() + */ public abstract List getIssues(String query); + /** + * Returns already cached issues. + * @return cached issues. + */ public abstract List getCachedIssues(); @Nullable @@ -53,7 +64,7 @@ public abstract class TaskManager { /** * Update issue cache asynchronously - * @param onComplete + * @param onComplete callback to be invoked after updating */ public abstract void updateIssues(@Nullable Runnable onComplete); 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 8e830373deca..94e5e49e6b5a 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 @@ -22,7 +22,7 @@ import com.intellij.ui.ColoredTreeCellRenderer; import com.intellij.util.ArrayUtil; import com.intellij.util.EventDispatcher; import com.intellij.util.Function; -import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.*; import com.intellij.util.xmlb.XmlSerializationException; import com.intellij.util.xmlb.XmlSerializer; import com.intellij.util.xmlb.XmlSerializerUtil; @@ -39,6 +39,8 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.DecimalFormat; import java.util.*; +import java.util.HashMap; +import java.util.HashSet; /** @@ -62,12 +64,19 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe return i == 0 ? Comparing.compare(o2.getCreated(), o1.getCreated()) : i; } }; + private static final Convertor KEY_CONVERTOR = new Convertor() { + @Override + public String convert(Task o) { + return o.getId(); + } + }; private final Project myProject; private final WorkingContextManager myContextManager; private final Map myIssueCache = Collections.synchronizedMap(new HashMap()); + private final Map myTemporaryCache = Collections.synchronizedMap(new HashMap()); private final Map myTasks = Collections.synchronizedMap(new LinkedHashMap() { @Override @@ -212,19 +221,20 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe @Override public List getIssues(String query) { - if (myConfig.updateEnabled) { - synchronized (myIssueCache) { - return new ArrayList(myIssueCache.values()); - } - } else { - return getIssuesFromRepositories(query, 50, 0); + List tasks = getIssuesFromRepositories(query, 50, 0); + synchronized (myIssueCache) { + myTemporaryCache.clear(); + myTemporaryCache.putAll(ContainerUtil.assignKeys(tasks.iterator(), KEY_CONVERTOR)); } + return tasks; } @Override public List getCachedIssues() { synchronized (myIssueCache) { - return new ArrayList(myIssueCache.values()); + ArrayList tasks = new ArrayList(myIssueCache.values()); + tasks.addAll(myTemporaryCache.values()); + return tasks; } } @@ -596,9 +606,7 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe synchronized (myIssueCache) { myIssueCache.clear(); - for (Task issue : issues) { - myIssueCache.put(issue.getId(), issue); - } + myIssueCache.putAll(ContainerUtil.assignKeys(issues.iterator(), KEY_CONVERTOR)); } // update local tasks synchronized (myTasks) {