Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorspingel2010-02-05 01:55:07 +0000
committerspingel2010-02-05 01:55:07 +0000
commitd849da4033d62a5099a632921708b7edf54d7622 (patch)
tree4338912767a8e548272889ecdc9aa6a562364e54
parentf17bad5813540aaffc643429744d4970b8263564 (diff)
downloadorg.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
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/AbstractExternalizationParticipant.java8
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/ExternalizationManager.java27
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/IExternalizationParticipant.java2
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActiveContextExternalizationParticipant.java13
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActivityExternalizationParticipant.java7
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;
}
}

Back to the top