Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormkersten2005-12-07 21:41:37 +0000
committermkersten2005-12-07 21:41:37 +0000
commitfe66b2bd58fa4b28381a18d7f7faa40a95e3c0b1 (patch)
tree132df9c9aa542a91e5796a11b306b6a7dff04e77 /org.eclipse.mylyn.tasks.ui
parent28c06e9a5aab3266a6eccd1ec4a53ecba48bb532 (diff)
downloadorg.eclipse.mylyn.tasks-fe66b2bd58fa4b28381a18d7f7faa40a95e3c0b1.tar.gz
org.eclipse.mylyn.tasks-fe66b2bd58fa4b28381a18d7f7faa40a95e3c0b1.tar.xz
org.eclipse.mylyn.tasks-fe66b2bd58fa4b28381a18d7f7faa40a95e3c0b1.zip
Completed: Bug 107457: Make tasklist saves more eager
https://bugs.eclipse.org/bugs/show_bug.cgi?id=107457
Diffstat (limited to 'org.eclipse.mylyn.tasks.ui')
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/MylarTaskListPlugin.java129
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/BackgroundSaveTimer.java28
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/TaskListSaveManager.java163
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/TaskTimer.java2
4 files changed, 210 insertions, 112 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/MylarTaskListPlugin.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/MylarTaskListPlugin.java
index f9242ebde..7fd6c1a10 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/MylarTaskListPlugin.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/MylarTaskListPlugin.java
@@ -11,11 +11,6 @@
package org.eclipse.mylar.tasklist;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -26,11 +21,9 @@ import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.mylar.core.MylarPlugin;
-import org.eclipse.mylar.tasklist.internal.BackgroundSaveTimer;
-import org.eclipse.mylar.tasklist.internal.IBackgroundSaveListener;
import org.eclipse.mylar.tasklist.internal.TaskListExtensionReader;
import org.eclipse.mylar.tasklist.internal.TaskListManager;
-import org.eclipse.mylar.tasklist.internal.TaskListSavePolicy;
+import org.eclipse.mylar.tasklist.internal.TaskListSaveManager;
import org.eclipse.mylar.tasklist.internal.TaskListWriter;
import org.eclipse.mylar.tasklist.planner.internal.ReminderRequiredCollector;
import org.eclipse.mylar.tasklist.planner.internal.TaskReportGenerator;
@@ -56,18 +49,18 @@ import org.osgi.framework.BundleContext;
*
* TODO: this class is in serious need of refactoring
*/
-public class MylarTaskListPlugin extends AbstractUIPlugin implements IStartup, IBackgroundSaveListener {
+public class MylarTaskListPlugin extends AbstractUIPlugin implements IStartup {
private static MylarTaskListPlugin INSTANCE;
private static TaskListManager taskListManager;
+ private TaskListSaveManager taskListSaveManager = new TaskListSaveManager();
+
private List<ITaskHandler> taskHandlers = new ArrayList<ITaskHandler>(); // TODO: use extension points
private List<IContextEditorFactory> contextEditors = new ArrayList<IContextEditorFactory>();
- private TaskListSavePolicy taskListSavePolicy = new TaskListSavePolicy();
-
private TaskListWriter taskListWriter;
/**
@@ -131,9 +124,7 @@ public class MylarTaskListPlugin extends AbstractUIPlugin implements IStartup, I
private ITaskHighlighter highlighter;
- private BackgroundSaveTimer saveTimer = null;
-
- private static boolean shouldAutoSave = true;
+ private static boolean shellActive = true;
public enum TaskListSaveMode {
ONE_HOUR, THREE_HOURS, DAY;
@@ -264,13 +255,13 @@ public class MylarTaskListPlugin extends AbstractUIPlugin implements IStartup, I
* bug 1002249: too slow to save state here
*/
public void shellDeactivated(ShellEvent arg0) {
- shouldAutoSave = false;
+ shellActive = false;
}
public void shellActivated(ShellEvent arg0) {
getDefault().checkTaskListBackup();
getDefault().checkReminders();
- shouldAutoSave = true;
+ shellActive = true;
}
public void shellDeiconified(ShellEvent arg0) {
@@ -326,12 +317,11 @@ public class MylarTaskListPlugin extends AbstractUIPlugin implements IStartup, I
TaskListExtensionReader.initExtensions(taskListWriter);
taskListManager.addListener(CONTEXT_MANAGER_TASK_LISTENER);
- taskListManager.addListener(taskListSavePolicy);
- saveTimer = new BackgroundSaveTimer(getDefault());
+ taskListManager.addListener(taskListSaveManager);
Workbench.getInstance().getActiveWorkbenchWindow().getShell().addShellListener(SHELL_LISTENER);
MylarPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(PREFERENCE_LISTENER);
- Workbench.getInstance().getActiveWorkbenchWindow().getShell().addDisposeListener(taskListSavePolicy);
+ Workbench.getInstance().getActiveWorkbenchWindow().getShell().addDisposeListener(taskListSaveManager);
restoreTaskHandlerState();
taskListManager.readTaskList();
@@ -354,13 +344,13 @@ public class MylarTaskListPlugin extends AbstractUIPlugin implements IStartup, I
INSTANCE = null;
resourceBundle = null;
try {
- taskListManager.removeListener(taskListSavePolicy);
+ taskListManager.removeListener(taskListSaveManager);
if (MylarPlugin.getDefault() != null) {
MylarPlugin.getDefault().getPluginPreferences().removePropertyChangeListener(PREFERENCE_LISTENER);
}
if (Workbench.getInstance() != null && Workbench.getInstance().getActiveWorkbenchWindow() != null) {
Workbench.getInstance().getActiveWorkbenchWindow().getShell().removeShellListener(SHELL_LISTENER);
- Workbench.getInstance().getActiveWorkbenchWindow().getShell().removeDisposeListener(taskListSavePolicy);
+ Workbench.getInstance().getActiveWorkbenchWindow().getShell().removeDisposeListener(taskListSaveManager);
}
} catch (Exception e) {
MylarPlugin.fail(e, "Mylar Java stop failed", false);
@@ -436,16 +426,6 @@ public class MylarTaskListPlugin extends AbstractUIPlugin implements IStartup, I
if (TaskListView.getDefault() != null) TaskListView.getDefault().clearTaskHistory();
}
-
- public void saveTaskListAndContexts() {
- taskListManager.saveTaskList();
- for (ITask task : taskListManager.getTaskList().getActiveTasks()) {
- MylarPlugin.getContextManager().saveContext(task.getHandleIdentifier(), task.getContextPath());
- }
- // lastSave = new Date();
- // INSTANCE.getPreferenceStore().setValue(PREVIOUS_SAVE_DATE, lastSave.getTime());
- }
-
private void checkTaskListBackup() {
// if (getPrefs().contains(PREVIOUS_SAVE_DATE)) {
// lastSave = new Date(getPrefs().getLong(PREVIOUS_SAVE_DATE));
@@ -455,7 +435,7 @@ public class MylarTaskListPlugin extends AbstractUIPlugin implements IStartup, I
// }
Date currentTime = new Date();
if (currentTime.getTime() > lastBackup.getTime() + AUTOMATIC_BACKUP_SAVE_INTERVAL) {//TaskListSaveMode.fromStringToLong(getPrefs().getString(SAVE_TASKLIST_MODE))) {
- MylarTaskListPlugin.getDefault().createTaskListBackupFile();
+ MylarTaskListPlugin.getDefault().getTaskListSaveManager().createTaskListBackupFile();
lastBackup = new Date();
// INSTANCE.getPreferenceStore().setValue(PREVIOUS_SAVE_DATE, lastSave.getTime());
}
@@ -575,59 +555,6 @@ public class MylarTaskListPlugin extends AbstractUIPlugin implements IStartup, I
// taskListListeners.add(taskListListner);
// }
- public void createTaskListBackupFile() {
- String path = MylarPlugin.getDefault().getMylarDataDirectory() + File.separator + DEFAULT_TASK_LIST_FILE;
- File taskListFile = new File(path);
- String backup = path.substring(0, path.lastIndexOf('.')) + "-backup.xml";
- copy(taskListFile, new File(backup));
- }
-
- public String getBackupFilePath() {
- String path = MylarPlugin.getDefault().getMylarDataDirectory() + File.separator + DEFAULT_TASK_LIST_FILE;
- return path.substring(0, path.lastIndexOf('.')) + "-backup.xml";
- }
-
- public void reverseBackup() {
- String path = MylarPlugin.getDefault().getMylarDataDirectory() + File.separator + DEFAULT_TASK_LIST_FILE;
- File taskListFile = new File(path);
- String backup = path.substring(0, path.lastIndexOf('.')) + "-backup.xml";
- copy(new File(backup), taskListFile);
- }
-
- /**
- * Copies all files in the current data directory to
- * the specified folder. Will overwrite.
- */
- public void copyDataDirContentsTo(String targetFolderPath) {
- File mainDataDir = new File(MylarPlugin.getDefault().getMylarDataDirectory());
-
- for (File currFile : mainDataDir.listFiles()) {
- if (currFile.isFile()) {
- File destFile = new File(targetFolderPath + File.separator + currFile.getName());
- copy(currFile, destFile);
- }
- }
- }
-
- private boolean copy(File src, File dst) {
- try {
- InputStream in = new FileInputStream(src);
- OutputStream out = new FileOutputStream(dst);
-
- // Transfer bytes from in to out
- byte[] buf = new byte[1024];
- int len;
- while ((len = in.read(buf)) > 0) {
- out.write(buf, 0, len);
- }
- in.close();
- out.close();
- return true;
- } catch (IOException ioe) {
- return false;
- }
- }
-
public boolean isMultipleMode() {
return getPrefs().getBoolean(MULTIPLE_ACTIVE_TASKS);
}
@@ -653,30 +580,18 @@ public class MylarTaskListPlugin extends AbstractUIPlugin implements IStartup, I
if (contextEditor != null)
this.contextEditors.add(contextEditor);
}
+ // /**
+// * For testing.
+// */
+// public void setShouldAutoSave(boolean shellActive) {
+// shouldAutoSave = shellActive;
+// }
- /**
- * Called periodically by the save timer
- */
- public void saveRequested() {
- if (shouldAutoSave) {
- try {
- saveTaskListAndContexts();
-// MylarPlugin.log("Automatically saved task list", this);
- } catch (Exception e) {
- MylarPlugin.fail(e, "Could not auto save task list", false);
- }
- }
- }
-
- /** For testing only **/
- public BackgroundSaveTimer getSaveTimer() {
- return saveTimer;
+ public TaskListSaveManager getTaskListSaveManager() {
+ return taskListSaveManager;
}
- /**
- * For testing.
- */
- public void setShouldAutoSave(boolean shellActive) {
- MylarTaskListPlugin.shouldAutoSave = shellActive;
+ public boolean isShellActive() {
+ return MylarTaskListPlugin.shellActive;
}
}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/BackgroundSaveTimer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/BackgroundSaveTimer.java
index bdf4a0a8b..ca8a80f9c 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/BackgroundSaveTimer.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/BackgroundSaveTimer.java
@@ -23,14 +23,23 @@ public class BackgroundSaveTimer implements ITimerThreadListener {
private TimerThread timer = null;
+ private boolean forceSyncExec = false;
+
public BackgroundSaveTimer(IBackgroundSaveListener listener) {
this.listener = listener;
- timer = new TimerThread(saveInterval / 1000); // This constructor
- // wants seconds
+ timer = new TimerThread(saveInterval / 1000); // This constructor wants seconds
timer.addListener(this);
+ }
+
+ public void start() {
timer.start();
}
+
+ public void stop() {
+ timer.killTimer();
+ }
+
public void setSaveIntervalMillis(int saveIntervalMillis) {
this.saveInterval = saveIntervalMillis;
timer.setTimeoutMillis(saveIntervalMillis);
@@ -41,12 +50,23 @@ public class BackgroundSaveTimer implements ITimerThreadListener {
}
/**
+ * For testing
+ */
+ public void setForceSyncExec(boolean forceSyncExec) {
+ this.forceSyncExec = forceSyncExec;
+ }
+
+ /**
* Called by the ActivityTimerThread Calls save in a new job
*/
public void fireTimedOut() {
try {
- final SaveJob job = new SaveJob("Saving Task Data", listener);
- job.schedule();
+ if (!forceSyncExec) {
+ final SaveJob job = new SaveJob("Saving Task Data", listener);
+ job.schedule();
+ } else {
+ listener.saveRequested();
+ }
} catch (RuntimeException e) {
MylarPlugin.log("Could not schedule save job", this);
}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/TaskListSaveManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/TaskListSaveManager.java
new file mode 100644
index 000000000..096962c91
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/TaskListSaveManager.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylar.tasklist.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+import org.eclipse.mylar.core.MylarPlugin;
+import org.eclipse.mylar.tasklist.ITask;
+import org.eclipse.mylar.tasklist.ITaskActivityListener;
+import org.eclipse.mylar.tasklist.MylarTaskListPlugin;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListSaveManager implements ITaskActivityListener, DisposeListener, IBackgroundSaveListener {
+
+ private static final String FILE_SUFFIX_BACKUP = "-backup.xml";
+
+ private BackgroundSaveTimer saveTimer = null;
+
+ /**
+ * Fort testing.
+ */
+ private boolean forceBackgroundSave = false;
+
+ public TaskListSaveManager() {
+ saveTimer = new BackgroundSaveTimer(this);
+ }
+
+ public void saveTaskListAndContexts() {
+ if (MylarTaskListPlugin.getDefault() != null) {
+ MylarTaskListPlugin.getTaskListManager().saveTaskList();
+ for (ITask task : MylarTaskListPlugin.getTaskListManager().getTaskList().getActiveTasks()) {
+ MylarPlugin.getContextManager().saveContext(task.getHandleIdentifier(), task.getContextPath());
+ }
+ }
+ }
+
+ /**
+ * Copies all files in the current data directory to
+ * the specified folder. Will overwrite.
+ */
+ public void copyDataDirContentsTo(String targetFolderPath) {
+ File mainDataDir = new File(MylarPlugin.getDefault().getMylarDataDirectory());
+
+ for (File currFile : mainDataDir.listFiles()) {
+ if (currFile.isFile()) {
+ File destFile = new File(targetFolderPath + File.separator + currFile.getName());
+ copy(currFile, destFile);
+ }
+ }
+ }
+
+ public void createTaskListBackupFile() {
+ String path = MylarPlugin.getDefault().getMylarDataDirectory() + File.separator + MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE;
+ File taskListFile = new File(path);
+ String backup = path.substring(0, path.lastIndexOf('.')) + FILE_SUFFIX_BACKUP;
+ copy(taskListFile, new File(backup));
+ }
+
+ public String getBackupFilePath() {
+ String path = MylarPlugin.getDefault().getMylarDataDirectory() + File.separator + MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE;
+ return path.substring(0, path.lastIndexOf('.')) + FILE_SUFFIX_BACKUP;
+ }
+
+ public void reverseBackup() {
+ String path = MylarPlugin.getDefault().getMylarDataDirectory() + File.separator + MylarTaskListPlugin.DEFAULT_TASK_LIST_FILE;
+ File taskListFile = new File(path);
+ String backup = path.substring(0, path.lastIndexOf('.')) + FILE_SUFFIX_BACKUP;
+ copy(new File(backup), taskListFile);
+ }
+
+ private boolean copy(File src, File dst) {
+ try {
+ InputStream in = new FileInputStream(src);
+ OutputStream out = new FileOutputStream(dst);
+
+ // Transfer bytes from in to out
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ out.write(buf, 0, len);
+ }
+ in.close();
+ out.close();
+ return true;
+ } catch (IOException ioe) {
+ return false;
+ }
+ }
+
+ /** For testing only **/
+ public BackgroundSaveTimer getSaveTimer() {
+ return saveTimer;
+ }
+
+ /**
+ * Called periodically by the save timer
+ */
+ public void saveRequested() {
+ if (MylarTaskListPlugin.getDefault().isShellActive() || forceBackgroundSave) {
+ try {
+ saveTaskListAndContexts();
+ MylarPlugin.log("Automatically saved task list", this);
+ } catch (Exception e) {
+ MylarPlugin.fail(e, "Could not auto save task list", false);
+ }
+ }
+ }
+
+ public void taskActivated(ITask task) {
+
+ }
+
+ public void tasksActivated(List<ITask> tasks) {
+ // ignore
+ }
+
+ public void taskDeactivated(ITask task) {
+ saveTaskListAndContexts();
+ }
+
+ public void taskChanged(ITask task) {
+ saveTaskListAndContexts();
+ }
+
+ public void tasklistRead() {
+ // ignore
+ }
+
+ public void tasklistModified() {
+ saveTaskListAndContexts();
+ }
+
+ public void widgetDisposed(DisposeEvent e) {
+ saveTaskListAndContexts();
+ }
+
+ /**
+ * For testing.
+ */
+ public void setForceBackgroundSave(boolean on) {
+ forceBackgroundSave = on;
+ saveTimer.setForceSyncExec(on);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/TaskTimer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/TaskTimer.java
index 524a599ab..b743570b5 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/TaskTimer.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasklist/internal/TaskTimer.java
@@ -69,7 +69,7 @@ public class TaskTimer implements ITimerThreadListener, IInteractionEventListene
public void start() {}
public void stopTimer() {
- timer.killThread();
+ timer.killTimer();
MylarPlugin.getDefault().removeInteractionListener(this);
}

Back to the top