diff options
author | relves | 2008-05-15 00:40:46 +0000 |
---|---|---|
committer | relves | 2008-05-15 00:40:46 +0000 |
commit | 155aaf4e1d2c0b17d4a57c2dd049a5db976a90bc (patch) | |
tree | 58f409328e7cae897943ea0edcbf4ed1d94f5eda /org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks | |
parent | 3c026835f94a048877ab4d79704498db32271cff (diff) | |
download | org.eclipse.mylyn.tasks-155aaf4e1d2c0b17d4a57c2dd049a5db976a90bc.tar.gz org.eclipse.mylyn.tasks-155aaf4e1d2c0b17d4a57c2dd049a5db976a90bc.tar.xz org.eclipse.mylyn.tasks-155aaf4e1d2c0b17d4a57c2dd049a5db976a90bc.zip |
NEW - bug 232180: stop unnecessary saves of task list and related information upon startup
https://bugs.eclipse.org/bugs/show_bug.cgi?id=232180
Diffstat (limited to 'org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks')
8 files changed, 89 insertions, 98 deletions
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskList.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskList.java index 37e528116..e51216104 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskList.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskList.java @@ -11,6 +11,7 @@ package org.eclipse.mylyn.internal.tasks.core; import java.util.Set; import org.eclipse.mylyn.tasks.core.ITask; +import org.eclipse.mylyn.tasks.core.ITaskElement; import org.eclipse.mylyn.tasks.core.ITaskListChangeListener; /** @@ -66,10 +67,9 @@ public interface ITaskList { /** * @param task - * @param content - * true if the content for the task (e.g. repository task data) has changed + * list element */ - public abstract void notifyTaskChanged(ITask task, boolean content); + public abstract void notifyElementChanged(ITaskElement element); public abstract void removeChangeListener(ITaskListChangeListener listener); diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryExternalizationParticipant.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryExternalizationParticipant.java index ef1bf9b15..5d9a3519a 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryExternalizationParticipant.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryExternalizationParticipant.java @@ -61,6 +61,7 @@ public class RepositoryExternalizationParticipant extends AbstractExternalizatio switch (context.getKind()) { case SAVE: + System.err.println(">>> save repositories"); if (!takeSnapshot(repositoriesFile)) { StatusHandler.fail(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, "Task List snapshot failed")); diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java index b82264a47..42296f5ec 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java @@ -518,7 +518,7 @@ public class TaskActivityManager implements ITaskActivityManager { removeScheduledTask(task); addScheduledTask(task); } - taskList.notifyTaskChanged(task, false); + taskList.notifyElementChanged(task); } public void setDueDate(ITask task, Date dueDate) { @@ -529,7 +529,7 @@ public class TaskActivityManager implements ITaskActivityManager { removeDueTask(task); addDueTask(task); } - taskList.notifyTaskChanged(task, false); + taskList.notifyElementChanged(task); } /** diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskList.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskList.java index 5b40afe2b..0188c42da 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskList.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskList.java @@ -94,7 +94,7 @@ public class TaskList implements ISchedulingRule, ITaskList { if (orphans != null) { task.addParentContainer(orphans); orphans.internalAddChild(task); - delta.add(new TaskContainerDelta(orphans, TaskContainerDelta.Kind.CHANGED)); + delta.add(new TaskContainerDelta(task, orphans, TaskContainerDelta.Kind.ADDED)); } } @@ -158,8 +158,7 @@ public class TaskList implements ISchedulingRule, ITaskList { (task).addParentContainer(container); container.internalAddChild(task); - delta.add(new TaskContainerDelta(task, TaskContainerDelta.Kind.CHANGED)); - delta.add(new TaskContainerDelta(container, TaskContainerDelta.Kind.CHANGED)); + delta.add(new TaskContainerDelta(task, container, TaskContainerDelta.Kind.ADDED)); } finally { unlock(); } @@ -231,10 +230,15 @@ public class TaskList implements ISchedulingRule, ITaskList { } } - private void fireDelta(HashSet<TaskContainerDelta> deltaToFire) { + private void fireDelta(HashSet<TaskContainerDelta> deltasToFire) { if (readComplete) { for (ITaskListChangeListener listener : changeListeners) { - listener.containersChanged(deltaToFire); + try { + listener.containersChanged(Collections.unmodifiableSet(deltasToFire)); + } catch (Throwable t) { + StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, + "Notification failed for: " + listener, t)); + } } } } @@ -443,45 +447,32 @@ public class TaskList implements ISchedulingRule, ITaskList { return rule instanceof TaskList || rule instanceof ITaskElement; } - public void notifyContainersUpdated(Set<? extends AbstractTaskContainer> containers) { - HashSet<TaskContainerDelta> containersUpdatedDelta = new HashSet<TaskContainerDelta>(); - if (containers == null) { - containersUpdatedDelta.add(new TaskContainerDelta(null, TaskContainerDelta.Kind.ROOT)); + public void notifyElementsChanged(Set<? extends ITaskElement> elements) { + HashSet<TaskContainerDelta> deltas = new HashSet<TaskContainerDelta>(); + if (elements == null) { + deltas.add(new TaskContainerDelta(null, TaskContainerDelta.Kind.ROOT)); } else { - for (AbstractTaskContainer abstractTaskContainer : containers) { - containersUpdatedDelta.add(new TaskContainerDelta(abstractTaskContainer, - TaskContainerDelta.Kind.CHANGED)); + for (ITaskElement element : elements) { + deltas.add(new TaskContainerDelta(element, TaskContainerDelta.Kind.CONTENT)); } } - for (ITaskListChangeListener listener : changeListeners) { - try { - listener.containersChanged(Collections.unmodifiableSet(containersUpdatedDelta)); - } catch (Throwable t) { - StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Notification failed for: " - + listener, t)); - } - } + fireDelta(deltas); } - public void notifyTaskChanged(ITask task, boolean content) { + public void notifySyncStateChanged(Set<? extends AbstractTaskContainer> containers) { HashSet<TaskContainerDelta> taskChangeDeltas = new HashSet<TaskContainerDelta>(); - TaskContainerDelta.Kind kind; - if (content) { - kind = TaskContainerDelta.Kind.CONTENT; - } else { - kind = TaskContainerDelta.Kind.CHANGED; + for (AbstractTaskContainer abstractTaskContainer : containers) { + TaskContainerDelta delta = new TaskContainerDelta(abstractTaskContainer, TaskContainerDelta.Kind.CONTENT); + delta.setTransient(true); + taskChangeDeltas.add(delta); } - taskChangeDeltas.add(new TaskContainerDelta(task, kind)); - for (ITaskListChangeListener listener : changeListeners) { - try { - listener.containersChanged(Collections.unmodifiableSet(taskChangeDeltas)); - } catch (Throwable t) { - StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Notification failed for: " - + listener, t)); - } - } + fireDelta(taskChangeDeltas); + } + + public void notifyElementChanged(ITaskElement element) { + notifyElementsChanged(Collections.singleton(element)); } public void refactorRepositoryUrl(String oldRepositoryUrl, String newRepositoryUrl) { @@ -505,7 +496,7 @@ public class TaskList implements ISchedulingRule, ITaskList { for (RepositoryQuery query : queries.values()) { if (query.getRepositoryUrl().equals(oldRepositoryUrl)) { query.setRepositoryUrl(newRepositoryUrl); - delta.add(new TaskContainerDelta(query, TaskContainerDelta.Kind.CHANGED)); + delta.add(new TaskContainerDelta(query, TaskContainerDelta.Kind.CONTENT)); } } @@ -516,7 +507,7 @@ public class TaskList implements ISchedulingRule, ITaskList { orphans.setRepositoryUrl(newRepositoryUrl); repositoryOrphansMap.put(newRepositoryUrl, orphans); //categories.put(orphans.getHandleIdentifier(), orphans); - delta.add(new TaskContainerDelta(orphans, TaskContainerDelta.Kind.CHANGED)); + delta.add(new TaskContainerDelta(orphans, TaskContainerDelta.Kind.CONTENT)); } } } finally { @@ -558,15 +549,14 @@ public class TaskList implements ISchedulingRule, ITaskList { container.internalRemoveChild(task); ((AbstractTask) task).removeParentContainer(container); - delta.add(new TaskContainerDelta(task, TaskContainerDelta.Kind.CHANGED)); - delta.add(new TaskContainerDelta(container, TaskContainerDelta.Kind.CHANGED)); + delta.add(new TaskContainerDelta(task, container, TaskContainerDelta.Kind.REMOVED)); } private void removeOrphan(AbstractTask task, Set<TaskContainerDelta> delta) { AbstractTaskContainer orphans = getUnmatchedContainer(task.getRepositoryUrl()); if (orphans != null) { if (orphans.internalRemoveChild(task)) { - delta.add(new TaskContainerDelta(orphans, TaskContainerDelta.Kind.CHANGED)); + delta.add(new TaskContainerDelta(task, orphans, TaskContainerDelta.Kind.REMOVED)); task.removeParentContainer(orphans); } } diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataManager.java index 433105a59..0e76840d5 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataManager.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataManager.java @@ -147,7 +147,7 @@ public class TaskDataManager implements ITaskDataManager { result[0] = state; } }); - taskList.notifyTaskChanged(task, false); + taskList.notifyElementChanged(task); return result[0]; } @@ -163,7 +163,7 @@ public class TaskDataManager implements ITaskDataManager { taskList.addTask(task); } }); - taskList.notifyTaskChanged(task, true); + taskList.notifyElementChanged(task); } public void putUpdatedTaskData(final ITask itask, final TaskData taskData, boolean user) throws CoreException { @@ -206,7 +206,7 @@ public class TaskDataManager implements ITaskDataManager { task.setSynchronizing(false); } }); - taskList.notifyTaskChanged(task, true); + taskList.notifyElementChanged(task); } } @@ -249,14 +249,14 @@ public class TaskDataManager implements ITaskDataManager { } } }); - taskList.notifyTaskChanged(task, true); + taskList.notifyElementChanged(task); } @Deprecated public void discardOutgoing(AbstractTask repositoryTask) { taskDataStorageManager.discardEdits(repositoryTask.getRepositoryUrl(), repositoryTask.getTaskId()); repositoryTask.setSynchronizationState(SynchronizationState.SYNCHRONIZED); - taskList.notifyTaskChanged(repositoryTask, true); + taskList.notifyElementChanged(repositoryTask); } private File findFile(ITask task, String kind) { @@ -362,7 +362,7 @@ public class TaskDataManager implements ITaskDataManager { task.setSubmitting(false); } }); - taskList.notifyTaskChanged(task, false); + taskList.notifyElementChanged(task); } /** @@ -444,7 +444,7 @@ public class TaskDataManager implements ITaskDataManager { repositoryTask.setSynchronizationState(SynchronizationState.OUTGOING); taskDataStorageManager.saveEdits(repositoryTask.getRepositoryUrl(), repositoryTask.getTaskId(), Collections.unmodifiableSet(modifiedAttributes)); - taskList.notifyTaskChanged(repositoryTask, false); + taskList.notifyElementChanged(repositoryTask); } public void setDataPath(String dataPath) { @@ -495,7 +495,7 @@ public class TaskDataManager implements ITaskDataManager { StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Unexpected error while marking task read", e)); } - taskList.notifyTaskChanged(task, false); + taskList.notifyElementChanged(task); } @Deprecated @@ -508,13 +508,13 @@ public class TaskDataManager implements ITaskDataManager { taskDataStorageManager.setOldTaskData(taskData); } task.setSynchronizationState(SynchronizationState.SYNCHRONIZED); - taskList.notifyTaskChanged(task, false); + taskList.notifyElementChanged(task); } else if (read && task.getSynchronizationState().equals(SynchronizationState.CONFLICT)) { if (taskData != null && taskData.getLastModified() != null) { task.setLastReadTimeStamp(taskData.getLastModified()); } task.setSynchronizationState(SynchronizationState.OUTGOING); - taskList.notifyTaskChanged(task, false); + taskList.notifyElementChanged(task); } else if (read && task.getSynchronizationState().equals(SynchronizationState.SYNCHRONIZED)) { if (taskData != null && taskData.getLastModified() != null) { task.setLastReadTimeStamp(taskData.getLastModified()); @@ -536,7 +536,7 @@ public class TaskDataManager implements ITaskDataManager { } else if (!read && task.getSynchronizationState().equals(SynchronizationState.SYNCHRONIZED)) { task.setSynchronizationState(SynchronizationState.INCOMING); - taskList.notifyTaskChanged(task, false); + taskList.notifyElementChanged(task); } // for connectors that don't support task data set read date to now (bug#204741) diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizationParticipant.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizationParticipant.java index 6ac133e71..fbe3349c0 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizationParticipant.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizationParticipant.java @@ -140,10 +140,15 @@ public class TaskListExternalizationParticipant extends AbstractExternalizationP } public void containersChanged(Set<TaskContainerDelta> containers) { - synchronized (TaskListExternalizationParticipant.this) { - dirty = true; + for (TaskContainerDelta taskContainerDelta : containers) { + if (!taskContainerDelta.isTransient()) { + synchronized (TaskListExternalizationParticipant.this) { + dirty = true; + } + manager.requestSave(); + return; + } } - manager.requestSave(); } public void taskListRead() { diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeQueriesJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeQueriesJob.java index 97094b370..76fa41dbc 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeQueriesJob.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeQueriesJob.java @@ -196,37 +196,37 @@ public class SynchronizeQueriesJob extends SynchronizationJob { event.setTasks(allTasks); event.setNeedsPerformQueries(true); - try { - // hook into the connector for checking for changed tasks and have the connector mark tasks that need synchronization - if (firePreSynchronization(event, new SubProgressMonitor(monitor, 20))) { - // synchronize queries, tasks changed within query are added to set of tasks to be synchronized - synchronizeQueries(monitor, event); - - // for background synchronizations all changed tasks are synchronized including the ones that are not part of a query - if (!isUser()) { - for (ITask task : allTasks) { - if (task.isStale()) { - tasksToBeSynchronized.add(task); - ((AbstractTask) task).setSynchronizing(true); - } +// try { + // hook into the connector for checking for changed tasks and have the connector mark tasks that need synchronization + if (firePreSynchronization(event, new SubProgressMonitor(monitor, 20))) { + // synchronize queries, tasks changed within query are added to set of tasks to be synchronized + synchronizeQueries(monitor, event); + + // for background synchronizations all changed tasks are synchronized including the ones that are not part of a query + if (!isUser()) { + for (ITask task : allTasks) { + if (task.isStale()) { + tasksToBeSynchronized.add(task); + ((AbstractTask) task).setSynchronizing(true); } } + } - // synchronize tasks that were marked by the connector - if (!tasksToBeSynchronized.isEmpty()) { - Policy.checkCanceled(monitor); - monitor.subTask("Synchronizing " + tasksToBeSynchronized.size() + " changed tasks"); - synchronizeTasks(new SubProgressMonitor(monitor, 40)); - } else { - monitor.worked(40); - } - - // hook into the connector for synchronization time stamp management - firePostSynchronization(event, new SubProgressMonitor(monitor, 10)); + // synchronize tasks that were marked by the connector + if (!tasksToBeSynchronized.isEmpty()) { + Policy.checkCanceled(monitor); + monitor.subTask("Synchronizing " + tasksToBeSynchronized.size() + " changed tasks"); + synchronizeTasks(new SubProgressMonitor(monitor, 40)); + } else { + monitor.worked(40); } - } finally { - taskList.notifyContainersUpdated(null); + + // hook into the connector for synchronization time stamp management + firePostSynchronization(event, new SubProgressMonitor(monitor, 10)); } +// } finally { +// taskList.notifyElementsChanged(null); +// } } finally { Job.getJobManager().endRule(rule); } @@ -247,7 +247,7 @@ public class SynchronizeQueriesJob extends SynchronizationJob { synchronizeQuery(repositoryQuery, event, new SubProgressMonitor(monitor, 20)); repositoryQuery.setSynchronizing(false); - taskList.notifyContainersUpdated(Collections.singleton(repositoryQuery)); + taskList.notifySyncStateChanged(Collections.singleton(repositoryQuery)); } } @@ -325,8 +325,8 @@ public class SynchronizeQueriesJob extends SynchronizationJob { for (RepositoryQuery repositoryQuery : queries) { repositoryQuery.setSynchronizationStatus(status); repositoryQuery.setSynchronizing(false); + taskList.notifyElementChanged(repositoryQuery); } - taskList.notifyContainersUpdated(queries); } } diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeTasksJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeTasksJob.java index 0770d04fe..680152b40 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeTasksJob.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeTasksJob.java @@ -86,7 +86,7 @@ public class SynchronizeTasksJob extends SynchronizationJob { } catch (OperationCanceledException e) { for (ITask task : tasks) { ((AbstractTask) task).setSynchronizing(false); - taskList.notifyTaskChanged(task, false); + taskList.notifyElementChanged(task); } return Status.CANCEL_STATUS; } catch (Exception e) { @@ -113,7 +113,7 @@ public class SynchronizeTasksJob extends SynchronizationJob { private void synchronizeTask(IProgressMonitor monitor, ITask task) { monitor.subTask("Receiving task " + task.getSummary()); ((AbstractTask) task).setErrorStatus(null); - taskList.notifyTaskChanged(task, false); + taskList.notifyElementChanged(task); try { String taskId = task.getTaskId(); if (!isUser()) { @@ -174,8 +174,8 @@ public class SynchronizeTasksJob extends SynchronizationJob { ((AbstractLegacyRepositoryConnector) connector).getLegacyTaskDataHandler().getMultiTaskData(repository, Collections.unmodifiableSet(idToTask.keySet()), collector, monitor); } else { - connector.getTaskDataHandler().getMultiTaskData(repository, - Collections.unmodifiableSet(idToTask.keySet()), collector, monitor); + connector.getTaskDataHandler().getMultiTaskData(repository, Collections.unmodifiableSet(idToTask.keySet()), + collector, monitor); } } @@ -207,12 +207,7 @@ public class SynchronizeTasksJob extends SynchronizationJob { task.setStale(false); ((AbstractTask) task).setSynchronizing(false); - if (task.getSynchronizationState() == SynchronizationState.INCOMING - || task.getSynchronizationState() == SynchronizationState.CONFLICT) { - taskList.notifyTaskChanged(task, true); - } else { - taskList.notifyTaskChanged(task, false); - } + taskList.notifyElementChanged(task); } private void updateFromTaskData(TaskRepository taskRepository, ITask task, TaskData taskData) { @@ -228,7 +223,7 @@ public class SynchronizeTasksJob extends SynchronizationJob { if (!isUser()) { ((AbstractTask) task).setSynchronizing(false); } - taskList.notifyTaskChanged(task, false); + taskList.notifyElementChanged(task); } } |