diff options
author | spingel | 2010-02-05 01:55:07 +0000 |
---|---|---|
committer | spingel | 2010-02-05 01:55:07 +0000 |
commit | d849da4033d62a5099a632921708b7edf54d7622 (patch) | |
tree | 4338912767a8e548272889ecdc9aa6a562364e54 | |
parent | f17bad5813540aaffc643429744d4970b8263564 (diff) | |
download | org.eclipse.mylyn.tasks-d849da4033d62a5099a632921708b7edf54d7622.tar.gz org.eclipse.mylyn.tasks-d849da4033d62a5099a632921708b7edf54d7622.tar.xz org.eclipse.mylyn.tasks-d849da4033d62a5099a632921708b7edf54d7622.zip |
ASSIGNED - bug 241790: [backport] context not saved on shutdown
https://bugs.eclipse.org/bugs/show_bug.cgi?id=241790
5 files changed, 51 insertions, 6 deletions
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/AbstractExternalizationParticipant.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/AbstractExternalizationParticipant.java index f43006dd8..3e6841710 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/AbstractExternalizationParticipant.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/AbstractExternalizationParticipant.java @@ -106,4 +106,12 @@ public abstract class AbstractExternalizationParticipant implements IExternaliza return null; } + /** + * @param full + * true when the workbench is shutting down and any time-based dirty states should be ignore + */ + public boolean isDirty(boolean full) { + return isDirty(); + } + }
\ No newline at end of file diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/ExternalizationManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/ExternalizationManager.java index 0fbc14784..3cc5f2550 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/ExternalizationManager.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/ExternalizationManager.java @@ -147,9 +147,20 @@ public class ExternalizationManager { } } + /** + * Performs a full save, trying until one has succeeded + */ public void saveNow() throws InterruptedException { + saveJob.setFullSavePending(); saveJob.wakeUp(); saveJob.join(); + + // make sure that we actually have done a full save before we exit this method + while (saveJob.isFullSavePending()) { + saveJob.schedule(); + saveJob.wakeUp(); + saveJob.join(); + } } /** @@ -172,10 +183,20 @@ public class ExternalizationManager { private volatile IExternalizationContext context; + private volatile boolean isFullSavePending = false; + public ExternalizationJob(String jobTitle) { super(jobTitle); } + public boolean isFullSavePending() { + return isFullSavePending; + } + + public void setFullSavePending() { + isFullSavePending = true; + } + public void setContext(IExternalizationContext saveContext) { this.context = saveContext; } @@ -187,9 +208,13 @@ public class ExternalizationManager { case SAVE: try { monitor.beginTask(Messages.ExternalizationManager_Saving_, externalizationParticipants.size()); + + boolean fullSave = isFullSavePending; + isFullSavePending = false; + for (IExternalizationParticipant participant : externalizationParticipants) { ISchedulingRule rule = participant.getSchedulingRule(); - if (forceSave || participant.isDirty()) { + if (forceSave || participant.isDirty(fullSave)) { try { Job.getJobManager().beginRule(rule, monitor); monitor.setTaskName(MessageFormat.format(Messages.ExternalizationManager_Saving_X, diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/IExternalizationParticipant.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/IExternalizationParticipant.java index a55cbe289..3ef43ebd4 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/IExternalizationParticipant.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/IExternalizationParticipant.java @@ -22,6 +22,8 @@ public interface IExternalizationParticipant { public abstract boolean isDirty(); + public boolean isDirty(boolean full); + public abstract ISchedulingRule getSchedulingRule(); public abstract void execute(IExternalizationContext context, IProgressMonitor monitor) throws CoreException; diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActiveContextExternalizationParticipant.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActiveContextExternalizationParticipant.java index f669a14ec..b9a5ae254 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActiveContextExternalizationParticipant.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActiveContextExternalizationParticipant.java @@ -22,7 +22,6 @@ import org.eclipse.mylyn.context.core.ContextChangeEvent; import org.eclipse.mylyn.context.core.ContextCore; import org.eclipse.mylyn.context.core.IInteractionContext; import org.eclipse.mylyn.internal.context.core.ContextCorePlugin; -import org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager; import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin; import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants; import org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant; @@ -72,7 +71,8 @@ public class ActiveContextExternalizationParticipant extends AbstractExternaliza public void registerListeners() { ContextCore.getContextManager().addListener(listener); TasksUi.getTaskActivityManager().addActivityListener(this); - ((ActivityContextManager) MonitorUiPlugin.getDefault().getActivityContextManager()).addListener(this); + (MonitorUiPlugin.getDefault().getActivityContextManager()).addListener(this); + currentlyActiveContext = ContextCore.getContextManager().getActiveContext(); } // currently not called since no way to remove a participant @@ -80,7 +80,7 @@ public class ActiveContextExternalizationParticipant extends AbstractExternaliza ContextCore.getContextManager().removeListener(listener); TasksUi.getTaskActivityManager().removeActivityListener(this); if (MonitorUiPlugin.getDefault().getActivityContextManager() != null) { - ((ActivityContextManager) MonitorUiPlugin.getDefault().getActivityContextManager()).removeListener(this); + (MonitorUiPlugin.getDefault().getActivityContextManager()).removeListener(this); } } @@ -115,8 +115,13 @@ public class ActiveContextExternalizationParticipant extends AbstractExternaliza @Override public boolean isDirty() { + return isDirty(false); + } + + @Override + public boolean isDirty(boolean full) { synchronized (this) { - return isDirty; + return isDirty || (full && shouldWriteContext()); } } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActivityExternalizationParticipant.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActivityExternalizationParticipant.java index 8ace88e75..9fac5fe6b 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActivityExternalizationParticipant.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActivityExternalizationParticipant.java @@ -82,8 +82,13 @@ public class ActivityExternalizationParticipant extends AbstractExternalizationP @Override public boolean isDirty() { + return isDirty(false); + } + + @Override + public boolean isDirty(boolean full) { synchronized (this) { - return isDirty; + return isDirty || full; } } |