diff options
author | relves | 2008-05-16 19:57:53 +0000 |
---|---|---|
committer | relves | 2008-05-16 19:57:53 +0000 |
commit | 594c25f6ff09c3ca76d8e92b56af9acfd9e4f5ba (patch) | |
tree | 06747662e236dd2472ed525151842a3c7dc975a6 | |
parent | 2d2bfd6ec1ba6a088c517385d81c36ce7232ab83 (diff) | |
download | org.eclipse.mylyn.tasks-R_3_0_RC0_prerefactoring_bugzilla.tar.gz org.eclipse.mylyn.tasks-R_3_0_RC0_prerefactoring_bugzilla.tar.xz org.eclipse.mylyn.tasks-R_3_0_RC0_prerefactoring_bugzilla.zip |
NEW - bug 158067: improve tasklist backup snapshot functionality and uiR_3_0_RC0_prerefactoring_bugzilla
https://bugs.eclipse.org/bugs/show_bug.cgi?id=158067
17 files changed, 250 insertions, 511 deletions
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/AbstractBugzillaTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/AbstractBugzillaTest.java index 7d277a5dc..d9ae48d93 100644 --- a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/AbstractBugzillaTest.java +++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/AbstractBugzillaTest.java @@ -24,8 +24,8 @@ import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.TaskList; import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; -import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants; +import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.ITask; @@ -60,7 +60,7 @@ public abstract class AbstractBugzillaTest extends TestCase { ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED, false); TasksUiPlugin.getTaskDataStorageManager().clear(); manager = TasksUiPlugin.getRepositoryManager(); - TasksUiPlugin.getTaskListManager().resetTaskList();//getTaskList().reset(); + TasksUiPlugin.getDefault().reloadDataDirectory(); manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath()); } 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 4bde20331..68d262067 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 @@ -29,6 +29,7 @@ import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.tasks.core.ITask; import org.eclipse.mylyn.tasks.core.ITaskActivityListener; import org.eclipse.mylyn.tasks.core.ITaskActivityManager; +import org.eclipse.mylyn.tasks.core.ITaskListChangeListener; /** * Manages task elapsed time, scheduling, due dates, and the date ranges @@ -66,9 +67,21 @@ public class TaskActivityManager implements ITaskActivityManager { private int startDay = Calendar.MONDAY; + private final ITaskListChangeListener TASKLIST_CHANGE_LISTENER = new ITaskListChangeListener() { + + public void containersChanged(Set<TaskContainerDelta> containers) { + for (TaskContainerDelta taskContainerDelta : containers) { + if (taskContainerDelta.getKind() == TaskContainerDelta.Kind.ROOT) { + reloadPlanningData(); + } + } + } + }; + public TaskActivityManager(TaskRepositoryManager repositoryManager, TaskList taskList) { this.taskList = taskList; this.repositoryManager = repositoryManager; + this.taskList.addChangeListener(TASKLIST_CHANGE_LISTENER); clear(); } @@ -744,218 +757,4 @@ public class TaskActivityManager implements ITaskActivityManager { Assert.isNotNull(task); return task.equals(getActiveTask()); } -} - -//public ScheduledTaskContainer getActivityToday() { -//for (ScheduledTaskContainer container : scheduleWeekDays) { -// if (container.isToday()) { -// return container; -// } -//} -//return null; -//} -// -//public ScheduledTaskContainer getActivityContainer(Calendar calendar, boolean isFloating) { -//if (calendar == null) { -// return null; -//} -//if (isPastReminder(calendar.getTime(), false)) { -// return getActivityToday(); -//} -// -//if (!isFloating) { -// for (ScheduledTaskContainer container : scheduleWeekDays) { -// if (container.includes(calendar)) { -// return container; -// } -// } -//} else { -// if (scheduledThisWeek.includes(calendar)) { -// return scheduledThisWeek; -// } else if (scheduledNextWeek.includes(calendar)) { -// return scheduledNextWeek; -// } else { -// return scheduledFuture; -// } -//} -// -//return null; -//} - -//public List<ScheduledTaskContainer> getDateRanges() { -// return scheduleContainers; -//} -// -//public List<ScheduledTaskContainer> getActivityWeekDays() { -// return scheduleWeekDays; -//} -// -//public boolean isWeekDay(ScheduledTaskContainer dateRangeTaskContainer) { -// return scheduleWeekDays.contains(dateRangeTaskContainer); -//} -// -///** public for testing */ -//public ScheduledTaskContainer getActivityThisWeek() { -// return scheduledThisWeek; -//} -// -///** public for testing * */ -//public ScheduledTaskContainer getActivityPast() { -// return scheduledPast; -//} -// -///** public for testing */ -//public ScheduledTaskContainer getActivityFuture() { -// return scheduledFuture; -//} -// -///** public for testing */ -//public ScheduledTaskContainer getActivityNextWeek() { -// return scheduledNextWeek; -//} -// -///** public for testing */ -//public ScheduledTaskContainer getActivityPrevious() { -// return scheduledPrevious; -//} -// -//public Date getStartTime() { -// return startTime; -//} - -///** -// * TODO: move to activity manager -// */ -//private void setupCalendarRanges() { -// -// scheduleContainers.clear(); -// scheduleWeekDays.clear(); -// -// int startDay = getWeekStartDay(); -// //int endDay = TaskActivityManager.getInstance().getEndDay(); -// // scheduledStartHour = -// // TasksUiPlugin.getDefault().getPreferenceStore().getInt( -// // TaskListPreferenceConstants.PLANNING_STARTHOUR); -// -//// scheduledEndHour = TasksUiPlugin.getDefault().getPreferenceStore().getInt( -//// TasksUiPreferenceConstants.PLANNING_ENDHOUR); -// -// Calendar pastStart = TaskActivityUtil.getCalendar(); -// pastStart.setTimeInMillis(0); -//// pastStart.setFirstDayOfWeek(startDay); -//// pastStart.setTime(startTime); -//// pastStart.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_PAST_START); -//// TaskActivityUtil.snapToStartOfWeek(pastStart); -// Calendar pastEnd = TaskActivityUtil.getStartOfCurrentWeek(); -// pastEnd.setFirstDayOfWeek(startDay); -// pastEnd.setTime(startTime); -// pastEnd.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_PAST_END); -// TaskActivityUtil.snapEndOfWeek(pastEnd); -// scheduledPast = new ScheduledTaskContainer(this, pastStart.getTime(), pastEnd.getTime(), DESCRIPTION_PAST); -// //scheduleContainers.add(scheduledPast); -// -// scheduleWeekDays.clear(); -// for (int x = startDay; x < (startDay + 7); x++) { -// Calendar dayStart = TaskActivityUtil.getCalendar(); -// Calendar dayEnd = TaskActivityUtil.getCalendar(); -// -// if (x > 7) { -// dayStart.set(Calendar.DAY_OF_WEEK, x % 7); -// dayEnd.set(Calendar.DAY_OF_WEEK, x % 7); -// } else { -// dayStart.set(Calendar.DAY_OF_WEEK, x); -// dayEnd.set(Calendar.DAY_OF_WEEK, x); -// } -// -// TaskActivityUtil.snapStartOfDay(dayStart); -// TaskActivityUtil.snapEndOfDay(dayEnd); -// -// String summary = "<unknown>"; -// switch (dayStart.get(Calendar.DAY_OF_WEEK)) { -// case Calendar.MONDAY: -// summary = "Monday"; -// break; -// case Calendar.TUESDAY: -// summary = "Tuesday"; -// break; -// case Calendar.WEDNESDAY: -// summary = "Wednesday"; -// break; -// case Calendar.THURSDAY: -// summary = "Thursday"; -// break; -// case Calendar.FRIDAY: -// summary = "Friday"; -// break; -// case Calendar.SATURDAY: -// summary = "Saturday"; -// break; -// case Calendar.SUNDAY: -// summary = "Sunday"; -// break; -// } -// ScheduledTaskContainer day = new ScheduledTaskContainer(this, dayStart, dayEnd, summary); -// scheduleWeekDays.add(day); -// scheduleContainers.add(day); -// } -// -// Calendar currentBegin = TaskActivityUtil.getCalendar(); -// currentBegin.setTime(startTime); -// TaskActivityUtil.snapStartOfWorkWeek(currentBegin); -// Calendar currentEnd = TaskActivityUtil.getCalendar(); -// currentEnd.setTime(startTime); -// TaskActivityUtil.snapEndOfWeek(currentEnd); -// scheduledThisWeek = new ScheduledTaskContainer(this, currentBegin, currentEnd, DESCRIPTION_THIS_WEEK); -// scheduledThisWeek.setCaptureFloating(true); -// //scheduleContainers.add(scheduledThisWeek); -// -//// GregorianCalendar currentBegin = new GregorianCalendar(); -//// currentBegin.setFirstDayOfWeek(startDay); -//// currentBegin.setTime(startTime); -//// TaskActivityUtil.snapStartOfWorkWeek(currentBegin); -//// GregorianCalendar currentEnd = new GregorianCalendar(); -//// currentEnd.setFirstDayOfWeek(startDay); -//// currentEnd.setTime(startTime); -//// TaskActivityUtil.snapEndOfWeek(currentEnd); -//// scheduledThisWeek = new ScheduledTaskContainer(this, currentBegin, currentEnd, DESCRIPTION_THIS_WEEK); -//// scheduledThisWeek.setCaptureFloating(true); -//// //scheduleContainers.add(scheduledThisWeek); -// -// Calendar nextStart = TaskActivityUtil.getCalendar(); -// nextStart.setTime(startTime); -// nextStart.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_NEXT); -// TaskActivityUtil.snapStartOfWorkWeek(nextStart); -// Calendar nextEnd = TaskActivityUtil.getCalendar(); -// nextEnd.setTime(startTime); -// nextEnd.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_NEXT); -// TaskActivityUtil.snapEndOfWeek(nextEnd); -// scheduledNextWeek = new ScheduledTaskContainer(this, nextStart.getTime(), nextEnd.getTime(), -// DESCRIPTION_NEXT_WEEK); -// scheduledNextWeek.setCaptureFloating(true); -// scheduleContainers.add(scheduledNextWeek); -// -// Calendar futureStart = TaskActivityUtil.getCalendar(); -// futureStart.setTime(startTime); -// futureStart.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_FUTURE_START); -// TaskActivityUtil.snapStartOfWorkWeek(futureStart); -// Calendar futureEnd = TaskActivityUtil.getCalendar(); -// futureEnd.setTime(startTime); -// futureEnd.add(Calendar.YEAR, 1); -// TaskActivityUtil.snapEndOfWeek(futureEnd); -// scheduledFuture = new ScheduledTaskContainer(this, futureStart.getTime(), futureEnd.getTime(), -// DESCRIPTION_FUTURE); -// scheduledFuture.setCaptureFloating(true); -// scheduleContainers.add(scheduledFuture); -// -// Calendar previousStart = TaskActivityUtil.getCalendar(); -// previousStart.setTime(startTime); -// previousStart.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_PREVIOUS_START); -// TaskActivityUtil.snapStartOfWorkWeek(previousStart); -// Calendar previousEnd = TaskActivityUtil.getCalendar(); -// previousEnd.setTime(startTime); -// previousEnd.add(Calendar.WEEK_OF_YEAR, NUM_WEEKS_PREVIOUS_END); -// TaskActivityUtil.snapEndOfWeek(previousEnd); -// scheduledPrevious = new ScheduledTaskContainer(this, previousStart.getTime(), previousEnd.getTime(), -// DESCRIPTION_PREVIOUS_WEEK); -// //scheduleContainers.add(scheduledPrevious); -//}
\ No newline at end of file +}
\ No newline at end of file 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 f793d9c23..59f142d59 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 @@ -605,7 +605,7 @@ public class TaskList implements ISchedulingRule, ITaskList { queries = new ConcurrentHashMap<String, RepositoryQuery>(); defaultCategory = new UncategorizedTaskContainer(); - + maxLocalTaskId = 0; categories.put(defaultCategory.getHandleIdentifier(), defaultCategory); } finally { diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UncategorizedTaskContainer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UncategorizedTaskContainer.java index 716760cb5..9ddf63baf 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UncategorizedTaskContainer.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UncategorizedTaskContainer.java @@ -19,7 +19,7 @@ public class UncategorizedTaskContainer extends AbstractTaskCategory { public static final String LABEL = "Uncategorized"; - public static final String HANDLE = "uncategorized"; + public static final String HANDLE = LABEL; public UncategorizedTaskContainer() { super(HANDLE); diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/DelegatingTaskExternalizer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/DelegatingTaskExternalizer.java index 149b97682..eb4762bdc 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/DelegatingTaskExternalizer.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/DelegatingTaskExternalizer.java @@ -192,17 +192,13 @@ public final class DelegatingTaskExternalizer { } public Element createCategoryElement(ITaskElement category, Document doc, Element parent) { - if (category instanceof UncategorizedTaskContainer) { - return parent; - } else { - Element node = doc.createElement(getCategoryTagName()); - node.setAttribute(DelegatingTaskExternalizer.KEY_NAME, category.getSummary()); - parent.appendChild(node); - for (ITask task : category.getChildren()) { - createTaskReference(KEY_TASK_REFERENCE, task, doc, node); - } - return node; + Element node = doc.createElement(getCategoryTagName()); + node.setAttribute(DelegatingTaskExternalizer.KEY_NAME, category.getSummary()); + parent.appendChild(node); + for (ITask task : category.getChildren()) { + createTaskReference(KEY_TASK_REFERENCE, task, doc, node); } + return node; } public Element createTaskElement(AbstractTask task, Document doc, Element parent) { @@ -370,8 +366,12 @@ public final class DelegatingTaskExternalizer { Element element = (Element) node; AbstractTaskCategory category = null; if (element.hasAttribute(KEY_NAME)) { - category = new TaskCategory(element.getAttribute(KEY_NAME)); - taskList.addCategory((TaskCategory) category); + String handle = element.getAttribute(KEY_NAME); + category = taskList.getContainerForHandle(handle); + if (category == null) { + category = new TaskCategory(element.getAttribute(KEY_NAME)); + taskList.addCategory((TaskCategory) category); + } } else { // LEGACY: registry categories did not have names // category = taskList.getArchiveContainer(); 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 ec811d91d..426fdea25 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 @@ -60,12 +60,13 @@ public class ExternalizationManager { } public void reLoad() { + reset(); for (IExternalizationParticipant participant : externalizationParticipants) { load(participant); } } - public void load(IExternalizationParticipant participant) { + private void load(IExternalizationParticipant participant) { try { saveDisabled = true; IExternalizationContext loadContext = new LoadContext(rootFolderPath, participant); @@ -142,7 +143,7 @@ public class ExternalizationManager { return loadStatus; } - public void reset() { + private void reset() { saveDisabled = false; loadStatus = null; if (saveJob != null) { 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 c1bd29e92..b004ec8c7 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 @@ -19,9 +19,13 @@ import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.tasks.core.ITaskListRunnable; import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants; +import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector; import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta; import org.eclipse.mylyn.internal.tasks.core.TaskList; +import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; +import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer; import org.eclipse.mylyn.tasks.core.ITaskListChangeListener; +import org.eclipse.mylyn.tasks.core.TaskRepository; /** * @author Rob Elves @@ -39,11 +43,14 @@ public class TaskListExternalizationParticipant extends AbstractExternalizationP private boolean dirty; + private final TaskRepositoryManager taskRepositoryManager; + public TaskListExternalizationParticipant(TaskList taskList, TaskListExternalizer taskListExternalizer, - ExternalizationManager manager) { + ExternalizationManager manager, TaskRepositoryManager repositoryManager) { this.manager = manager; this.taskList = taskList; this.taskListWriter = taskListExternalizer; + this.taskRepositoryManager = repositoryManager; } @Override @@ -75,7 +82,10 @@ public class TaskListExternalizationParticipant extends AbstractExternalizationP } private void resetAndLoad() throws CoreException { + resetTaskList(); taskListWriter.readTaskList(taskList, taskListFile); + + // TODO: fire ROOT event } private boolean recover() { @@ -94,6 +104,23 @@ public class TaskListExternalizationParticipant extends AbstractExternalizationP taskList.run(loadRunnable, monitor); } + /** + * public for tests + */ + public void resetTaskList() { + taskList.reset(); + prepareOrphanContainers(); + } + + private void prepareOrphanContainers() { + for (TaskRepository repository : taskRepositoryManager.getAllRepositories()) { + if (!repository.getConnectorKind().equals(LocalRepositoryConnector.CONNECTOR_KIND)) { + taskList.addUnmatchedContainer(new UnmatchedTaskContainer(repository.getConnectorKind(), + repository.getRepositoryUrl())); + } + } + } + @Override public void save(String rootPath, IProgressMonitor monitor) throws CoreException { final File taskListFile = getFile(rootPath); diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizer.java index 907eced87..d459a8d9a 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizer.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizer.java @@ -120,7 +120,7 @@ public class TaskListExternalizer { delagatingExternalizer.createTaskElement(task, doc, root); } - // create the categorie nodes... + // create the category nodes... for (ITaskElement category : taskList.getCategories()) { delagatingExternalizer.createCategoryElement(category, doc, root); } diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/OrphanedTasksTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/OrphanedTasksTest.java index facc8c361..af20ba1b5 100644 --- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/OrphanedTasksTest.java +++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/OrphanedTasksTest.java @@ -12,10 +12,10 @@ import java.util.Set; import junit.framework.TestCase; -import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector; import org.eclipse.mylyn.internal.tasks.core.LocalTask; +import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; import org.eclipse.mylyn.internal.tasks.core.TaskCategory; import org.eclipse.mylyn.internal.tasks.core.TaskList; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; @@ -52,8 +52,7 @@ public class OrphanedTasksTest extends TestCase { * y New local tasks should automatically be created in the Local orphaned folder */ public void testAddLocalTask() { - Set<ITask> tasks = TasksUiPlugin.getTaskList().getTasks( - LocalRepositoryConnector.REPOSITORY_URL); + Set<ITask> tasks = TasksUiPlugin.getTaskList().getTasks(LocalRepositoryConnector.REPOSITORY_URL); assertTrue(tasks.isEmpty()); ITask localTask = TasksUiInternal.createNewLocalTask("Task 1"); assertNotNull(localTask); @@ -185,7 +184,7 @@ public class OrphanedTasksTest extends TestCase { assertEquals(1, taskList.getCategories().size()); assertFalse(taskList.getDefaultCategory().isEmpty()); // save tasklist, restore tasklist - TasksUiPlugin.getTaskListManager().saveTaskList(); + TasksUiPlugin.getExternalizationManager().saveNow(null); TasksUiPlugin.getTaskListManager().resetTaskList(); TasksUiPlugin.getTaskListManager().readExistingOrCreateNewList(); assertEquals(1, taskList.getCategories().size()); @@ -236,15 +235,13 @@ public class OrphanedTasksTest extends TestCase { MockRepositoryQuery mockQuery = new MockRepositoryQuery("mock query"); TasksUiPlugin.getTaskList().addQuery(mockQuery); TasksUiPlugin.getTaskList().addTask(mockTask, mockQuery); - Set<ITask> tasks = TasksUiPlugin.getTaskList().getTasks( - MockRepositoryConnector.REPOSITORY_URL); + Set<ITask> tasks = TasksUiPlugin.getTaskList().getTasks(MockRepositoryConnector.REPOSITORY_URL); assertFalse(tasks.isEmpty()); RepositoryQuery query = (RepositoryQuery) mockTask.getParentContainers().iterator().next(); assertEquals(mockQuery, query); assertFalse(query.isEmpty()); - assertTrue(TasksUiPlugin.getTaskList().getUnmatchedContainer( - MockRepositoryConnector.REPOSITORY_URL).isEmpty()); + assertTrue(TasksUiPlugin.getTaskList().getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL).isEmpty()); } public void testMoveRepositoryTask() { @@ -338,15 +335,18 @@ public class OrphanedTasksTest extends TestCase { assertTrue(taskList.getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL).contains( mockTask.getHandleIdentifier())); assertTrue(mockTask.contains(mockTask2.getHandleIdentifier())); - assertFalse(taskList.getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL).contains( - mockTask2.getHandleIdentifier())); + + // True since mockTask is contained and has mockTask2 as a subtask +// assertFalse(taskList.getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL).contains( +// mockTask2.getHandleIdentifier())); taskList.removeFromContainer(mockQuery, mockTask3); assertTrue(taskList.getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL).contains( mockTask3.getHandleIdentifier())); assertTrue(mockTask3.contains(mockTask2.getHandleIdentifier())); - assertFalse(taskList.getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL).contains( - mockTask2.getHandleIdentifier())); + // True since mockTask is contained and has mockTask2 as a subtask +// assertFalse(taskList.getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL).contains( +// mockTask2.getHandleIdentifier())); } } diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/QueryExportImportTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/QueryExportImportTest.java index d63f50177..e2e1803aa 100644 --- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/QueryExportImportTest.java +++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/QueryExportImportTest.java @@ -23,11 +23,12 @@ import java.util.zip.ZipInputStream; import junit.framework.TestCase; -import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants; +import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskListFactory; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.internal.tasks.ui.actions.QueryImportAction; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector; import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryQuery; @@ -119,7 +120,8 @@ public class QueryExportImportTest extends TestCase { queries.add(query3); // run tested functionality - TasksUiPlugin.getTaskListManager().insertQueries(queries); + QueryImportAction action = new QueryImportAction(); + action.insertQueries(queries); // extract results Set<RepositoryQuery> queriesSet = TasksUiPlugin.getTaskList().getQueries(); @@ -156,7 +158,8 @@ public class QueryExportImportTest extends TestCase { queries.add(query3); // run tested functionality - TasksUiPlugin.getTaskListManager().insertQueries(queries); + QueryImportAction action = new QueryImportAction(); + action.insertQueries(queries); // extract results Set<RepositoryQuery> queriesSet = TasksUiPlugin.getTaskList().getQueries(); @@ -200,7 +203,8 @@ public class QueryExportImportTest extends TestCase { queries.add(query5); // run tested functionality - TasksUiPlugin.getTaskListManager().insertQueries(queries); + QueryImportAction action = new QueryImportAction(); + action.insertQueries(queries); // extract results Set<RepositoryQuery> queriesSet = TasksUiPlugin.getTaskList().getQueries(); @@ -236,7 +240,8 @@ public class QueryExportImportTest extends TestCase { queries.add(query2); // run tested functionality - List<RepositoryQuery> badQueries = TasksUiPlugin.getTaskListManager().insertQueries(queries); + QueryImportAction action = new QueryImportAction(); + List<RepositoryQuery> badQueries = action.insertQueries(queries); // extract results Set<RepositoryQuery> queriesSet = TasksUiPlugin.getTaskList().getQueries(); @@ -293,15 +298,15 @@ public class QueryExportImportTest extends TestCase { assertTrue("There are currently no repositories defined", TasksUiPlugin.getRepositoryManager().getRepository( MockRepositoryConnector.REPOSITORY_URL) == null); - List<RepositoryQuery> resultQueries = TasksUiPlugin.getTaskListManager() - .getTaskListWriter() - .readQueries(outFile); + List<RepositoryQuery> resultQueries = TasksUiPlugin.getTaskListManager().getTaskListWriter().readQueries( + outFile); Set<TaskRepository> repositories = TasksUiPlugin.getTaskListManager().getTaskListWriter().readRepositories( outFile); TasksUiPlugin.getRepositoryManager().insertRepositories(repositories, TasksUiPlugin.getDefault().getRepositoriesFilePath()); - TasksUiPlugin.getTaskListManager().insertQueries(resultQueries); + QueryImportAction action = new QueryImportAction(); + action.insertQueries(resultQueries); // extract results Set<RepositoryQuery> queriesSet = TasksUiPlugin.getTaskList().getQueries(); diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java index 39d46a061..67be91efc 100644 --- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java +++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListManagerTest.java @@ -36,10 +36,10 @@ import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil; import org.eclipse.mylyn.internal.tasks.core.TaskCategory; import org.eclipse.mylyn.internal.tasks.core.TaskList; import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData; +import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants; import org.eclipse.mylyn.internal.tasks.ui.RefactorRepositoryUrlOperation; import org.eclipse.mylyn.internal.tasks.ui.TaskListManager; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; -import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; import org.eclipse.mylyn.monitor.core.InteractionEvent; import org.eclipse.mylyn.tasks.core.IRepositoryQuery; @@ -101,7 +101,7 @@ public class TaskListManagerTest extends TestCase { assertTrue(query.contains(task.getHandleIdentifier())); assertTrue(manager.getTaskList().getDefaultCategory().contains(task.getHandleIdentifier())); - TasksUiPlugin.getExternalizationManager().saveNow(null); + TasksUiPlugin.getExternalizationManager().requestSave(); manager.resetTaskList(); assertEquals(0, manager.getTaskList().getAllTasks().size()); assertFalse(manager.getTaskList().getDefaultCategory().contains(task.getHandleIdentifier())); @@ -687,7 +687,7 @@ public class TaskListManagerTest extends TestCase { AbstractTask sub1 = TasksUiInternal.createNewLocalTask("sub 1"); manager.getTaskList().addTask(sub1, task1); - assertEquals(3, manager.getTaskList().getRootElements().size()); + assertEquals(4, manager.getTaskList().getRootElements().size()); //manager.getTaskList().moveToContainer(sub1, manager.getTaskList().getArchiveContainer()); @@ -700,7 +700,7 @@ public class TaskListManagerTest extends TestCase { TaskCategory cat1 = new TaskCategory("Category 1"); manager.getTaskList().addCategory(cat1); categories.add(cat1); - assertEquals(4, manager.getTaskList().getRootElements().size()); + assertEquals(5, manager.getTaskList().getRootElements().size()); AbstractTask task3 = TasksUiInternal.createNewLocalTask("task 3"); manager.getTaskList().addTask(task3, cat1); @@ -723,7 +723,7 @@ public class TaskListManagerTest extends TestCase { cat1Contents.add(reportInCat1); assertEquals(7, manager.getTaskList().getAllTasks().size()); - assertEquals(4, manager.getTaskList().getRootElements().size()); + assertEquals(5, manager.getTaskList().getRootElements().size()); TasksUiPlugin.getExternalizationManager().requestSave(); TasksUiPlugin.getDefault().reloadDataDirectory(); 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 42aea61f0..75e38bd38 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 @@ -36,6 +36,7 @@ public class ActivityExternalizationParticipant extends AbstractExternalizationP setDirty(false); break; case LOAD: + ContextCore.getContextManager().loadActivityMetaContext(); break; case SNAPSHOT: break; diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/RefactorRepositoryUrlOperation.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/RefactorRepositoryUrlOperation.java index c95c944bb..2cae783bf 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/RefactorRepositoryUrlOperation.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/RefactorRepositoryUrlOperation.java @@ -58,10 +58,10 @@ public class RefactorRepositoryUrlOperation extends TaskListModifyOperation { refactorOfflineHandles(oldUrl, newUrl); getTaskList().refactorRepositoryUrl(oldUrl, newUrl); refactorMetaContextHandles(oldUrl, newUrl); - TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime(); refactorContextFileNames(); TasksUiPlugin.getExternalizationManager() .saveNow(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); + TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime(); } finally { monitor.done(); } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListManager.java index 1ca6cfe44..ee1724b29 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListManager.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListManager.java @@ -8,27 +8,15 @@ package org.eclipse.mylyn.internal.tasks.ui; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - +import org.eclipse.core.runtime.CoreException; import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.ITaskList; import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector; -import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; import org.eclipse.mylyn.internal.tasks.core.TaskList; import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer; import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant; -import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer; import org.eclipse.mylyn.internal.tasks.ui.util.TaskListElementImporter; -import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; -import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.ITask; -import org.eclipse.mylyn.tasks.core.ITaskActivityListener; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.ui.TasksUi; @@ -44,40 +32,23 @@ import org.eclipse.mylyn.tasks.ui.TasksUi; */ public class TaskListManager { - private static final long SECOND = 1000; - - private static final long MINUTE = 60 * SECOND; - - private static final long ROLLOVER_DELAY = 30 * MINUTE; - - private final List<ITaskActivityListener> taskActivationListeners = new ArrayList<ITaskActivityListener>(); - - private final TaskListExternalizer taskListWriter; - -// private TaskListSaveManager taskListSaveManager; - -// private AbstractTask activeTask; - - private TaskListExternalizationParticipant taskListSaveParticipant; - private final TaskListElementImporter importer; private final TaskList taskList; - public TaskListManager(TaskList taskList, TaskListExternalizer taskListWriter, TaskListElementImporter importer) { + private final TaskListExternalizationParticipant participant; + + public TaskListManager(TaskList taskList, TaskListExternalizationParticipant participant, + TaskListElementImporter importer) { this.taskList = taskList; - this.taskListWriter = taskListWriter; this.importer = importer; + this.participant = participant; } - public ITaskList resetTaskList() { - deactivateAllTasks(); - //resetAndRollOver(); - taskList.reset(); - prepareOrphanContainers(); - return taskList; - } - + /** + * @deprecated moved to TasksUiPlugin + */ + @Deprecated private void prepareOrphanContainers() { for (TaskRepository repository : TasksUi.getRepositoryManager().getAllRepositories()) { if (!repository.getConnectorKind().equals(LocalRepositoryConnector.CONNECTOR_KIND)) { @@ -91,98 +62,34 @@ public class TaskListManager { return importer; } - public boolean readExistingOrCreateNewList() { - prepareOrphanContainers(); - if (taskListSaveParticipant == null) { - taskListSaveParticipant = new TaskListExternalizationParticipant(taskList, taskListWriter, - TasksUiPlugin.getExternalizationManager()); - } - - TasksUiPlugin.getExternalizationManager().load(taskListSaveParticipant); - TasksUiPlugin.getExternalizationManager().addParticipant(taskListSaveParticipant); - taskList.addChangeListener(taskListSaveParticipant); - TasksUiPlugin.getTaskActivityManager().reloadPlanningData(); - return true; - } - - public TaskList getTaskList() { + /** + * @deprecated + */ + @Deprecated + public ITaskList resetTaskList() { + participant.resetTaskList(); return taskList; } /** - * Imports Queries to the TaskList and synchronize them with the repository. If the imported query have the name - * that overlaps with the existing one, the the suffix [x] is added, where x is a number starting from 1. - * - * @param queries - * to insert - * @return the list queries, which were not inserted since because the related repository was not found. + * @deprecated use TasksUiPlugin.reloadDataDirectory() */ - public List<RepositoryQuery> insertQueries(List<RepositoryQuery> queries) { - List<RepositoryQuery> badQueries = new ArrayList<RepositoryQuery>(); - - for (RepositoryQuery query : queries) { - - TaskRepository repository = TasksUi.getRepositoryManager().getRepository(query.getConnectorKind(), - query.getRepositoryUrl()); - if (repository == null) { - badQueries.add(query); - continue; - } - - String handle = resolveIdentifiersConflict(query); - query.setHandleIdentifier(handle); - - // add query - TasksUiInternal.getTaskList().addQuery(query); - - AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector( - repository.getConnectorKind()); - if (connector != null) { - TasksUiInternal.synchronizeQuery(connector, query, null, true); - } - + @Deprecated + public boolean readExistingOrCreateNewList() { + try { + TasksUiPlugin.getDefault().reloadDataDirectory(); + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } - - return badQueries; + return true; } /** - * Utility method that checks, if there is already a query with the same identifier. - * - * @param query - * @return a handle, that is not in conflict with any existed one in the system. If there were no conflict in the - * beginning, then the query's own identifier is returned. If there were, then the suffix [x] is applied the - * query's identifier, where x is a number. - * @since 2.1 + * TODO: move this to TasksUIPlugin */ - public String resolveIdentifiersConflict(RepositoryQuery query) { - String patternStr = "\\[(\\d+)\\]$"; // all string that end with [x], where x is a number - Pattern pattern = Pattern.compile(patternStr); - - // resolve name conflict - Set<RepositoryQuery> existingQueries = getTaskList().getQueries(); - Map<String, RepositoryQuery> queryMap = new HashMap<String, RepositoryQuery>(); - for (RepositoryQuery existingQuery : existingQueries) { - queryMap.put(existingQuery.getHandleIdentifier(), existingQuery); - } - - // suggest a new handle if needed - String handle = query.getHandleIdentifier(); - - while (queryMap.get(handle) != null) { - Matcher matcher = pattern.matcher(handle); - boolean matchFound = matcher.find(); - if (matchFound) { - // increment index - int index = Integer.parseInt(matcher.group(1)); - index++; - handle = matcher.replaceAll("[" + index + "]"); - } else { - handle += "[1]"; - } - } - - return handle; + public TaskList getTaskList() { + return taskList; } /** @@ -244,80 +151,4 @@ public class TaskListManager { public void deactivateTask(ITask task) { TasksUi.getTaskActivityManager().deactivateTask(task); } - -// public TaskActivationHistory getTaskActivationHistory() { -// return taskActivityHistory; -//} - -//protected void setTaskListSaveManager(TaskListSaveManager taskListSaveManager) { -// this.taskListSaveManager = taskListSaveManager; -// this.taskList.addChangeListener(taskListSaveManager); -//} - -///** -// * Creates a new local task and schedules for today -// * -// * @param summary -// * if null DEFAULT_SUMMARY (New Task) used. -// */ -//public LocalTask createNewLocalTask(String summary) { -// if (summary == null) { -// summary = LocalRepositoryConnector.DEFAULT_SUMMARY; -// } -// LocalTask newTask = new LocalTask("" + taskList.getNextLocalTaskId(), summary); -// newTask.setPriority(PriorityLevel.P3.toString()); -// TasksUi.getTaskList().addTask(newTask); -// -// TasksUiPlugin.getTaskActivityManager().scheduleNewTask(newTask); -// -// Object selectedObject = null; -// TaskListView view = TaskListView.getFromActivePerspective(); -// if (view != null) { -// selectedObject = ((IStructuredSelection) view.getViewer().getSelection()).getFirstElement(); -// } -// if (selectedObject instanceof TaskCategory) { -// taskList.addTask(newTask, (TaskCategory) selectedObject); -// } else if (selectedObject instanceof AbstractTask) { -// AbstractTask task = (AbstractTask) selectedObject; -// -// AbstractTaskContainer container = TaskCategory.getParentTaskCategory(task); -// -// if (container instanceof TaskCategory) { -// taskList.addTask(newTask, container); -// } else if (view != null && view.getDrilledIntoCategory() instanceof TaskCategory) { -// taskList.addTask(newTask, view.getDrilledIntoCategory()); -// } else { -// taskList.addTask(newTask, TasksUiPlugin.getTaskList().getDefaultCategory()); -// } -// } else if (view != null && view.getDrilledIntoCategory() instanceof TaskCategory) { -// taskList.addTask(newTask, view.getDrilledIntoCategory()); -// } else { -// if (view != null && view.getDrilledIntoCategory() != null) { -// MessageDialog.openInformation(Display.getCurrent().getActiveShell(), ITasksUiConstants.TITLE_DIALOG, -// "The new task has been added to the root of the list, since tasks can not be added to a query."); -// } -// taskList.addTask(newTask, TasksUiPlugin.getTaskList().getDefaultCategory()); -// } -// return newTask; -//} - -// /** -// * public for testing TODO: Move to TaskActivityManager -// */ -// private void resetAndRollOver() { -// resetAndRollOver(TaskActivityUtil.getCalendar().getTime()); -// } -// -// private void resetAndRollOver(Date startDate) { -// if (taskList.isInitialized()) { -// TasksUiPlugin.getTaskActivityManager().clear(); -// List<InteractionEvent> events = ContextCore.getContextManager() -// .getActivityMetaContext() -// .getInteractionHistory(); -// for (InteractionEvent event : events) { -// TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event); -// } -// TasksUiPlugin.getTaskActivityManager().reloadTimingData(); -// } -// } } diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java index c41980cae..21141c5cf 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java @@ -70,6 +70,7 @@ import org.eclipse.mylyn.internal.tasks.core.data.TaskDataStore; import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector; import org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager; import org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationParticipant; +import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant; import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer; import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotification; import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationQueryIncoming; @@ -90,6 +91,7 @@ import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel; import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; import org.eclipse.mylyn.tasks.ui.AbstractTaskRepositoryLinkProvider; +import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorFactory; import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory; import org.eclipse.swt.graphics.Image; @@ -166,8 +168,6 @@ public class TasksUiPlugin extends AbstractUIPlugin { private ITaskHighlighter highlighter; - private boolean initialized = false; - private final Map<String, Image> brandingIcons = new HashMap<String, Image>(); private final Map<String, ImageDescriptor> overlayIcons = new HashMap<String, ImageDescriptor>(); @@ -367,6 +367,8 @@ public class TasksUiPlugin extends AbstractUIPlugin { private IProxyChangeListener proxyChangeListener; + private TaskListExternalizationParticipant taskListSaveParticipant; + private static TaskList taskList; private static TasksModel tasksModel; @@ -399,7 +401,7 @@ public class TasksUiPlugin extends AbstractUIPlugin { break; } } - taskActivityMonitor.reloadActivityTime(); + //taskActivityMonitor.reloadActivityTime(); } catch (Throwable t) { StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not initialize task activity", t)); @@ -431,10 +433,6 @@ public class TasksUiPlugin extends AbstractUIPlugin { monitor.worked(1); try { - //taskListSaveManager = new TaskListSaveManager(); - //taskListManager.setTaskListSaveManager(taskListSaveManager); - - //ContextCorePlugin.getDefault().getPluginPreferences().addPropertyChangeListener(PREFERENCE_LISTENER); getPreferenceStore().addPropertyChangeListener(PROPERTY_LISTENER); @@ -497,17 +495,24 @@ public class TasksUiPlugin extends AbstractUIPlugin { externalizationManager = new ExternalizationManager(getDataDirectory()); repositoryManager = new TaskRepositoryManager(); + IExternalizationParticipant repositoryParticipant = new RepositoryExternalizationParticipant( + externalizationManager, repositoryManager); + externalizationManager.addParticipant(repositoryParticipant); taskList = new TaskList(); tasksModel = new TasksModel(taskList, repositoryManager); taskListExternalizer = new TaskListExternalizer(tasksModel); TaskListElementImporter taskListImporter = new TaskListElementImporter(repositoryManager, tasksModel); + taskListSaveParticipant = new TaskListExternalizationParticipant(taskList, taskListExternalizer, + externalizationManager, repositoryManager); + //externalizationManager.load(taskListSaveParticipant); + externalizationManager.addParticipant(taskListSaveParticipant); + taskList.addChangeListener(taskListSaveParticipant); + taskActivityManager = new TaskActivityManager(repositoryManager, taskList); - IExternalizationParticipant participant = new RepositoryExternalizationParticipant(externalizationManager, - repositoryManager); - taskListManager = new TaskListManager(taskList, taskListExternalizer, taskListImporter); + taskListManager = new TaskListManager(taskList, taskListSaveParticipant, taskListImporter); // initialize updateTaskActivityManager(); @@ -535,9 +540,6 @@ public class TasksUiPlugin extends AbstractUIPlugin { // NOTE: initializing extensions in start(..) has caused race // conditions previously TasksUiExtensionReader.initStartupExtensions(taskListExternalizer, taskListImporter); - externalizationManager.load(participant); - externalizationManager.addParticipant(participant); - //repositoryManager.readRepositories(getRepositoriesFilePath()); // instantiates taskDataManager File root = new File(this.getDataDirectory() + '/' + FOLDER_OFFLINE); @@ -558,19 +560,11 @@ public class TasksUiPlugin extends AbstractUIPlugin { } } - loadTemplateRepositories(); - tasksJobFactory = new TaskJobFactory(taskListManager.getTaskList(), taskDataManager, repositoryManager, tasksModel); - // NOTE: task list must be read before Task List view can be initialized taskActivityManager.addActivityListener(CONTEXT_TASK_ACTIVITY_LISTENER); - // readExistingOrCreateNewList() must be called after repositories have been read in - taskListManager.readExistingOrCreateNewList(); - - initialized = true; - taskActivityMonitor = new TaskActivityMonitor(taskActivityManager, ContextCore.getContextManager()); taskActivityMonitor.start(); @@ -597,7 +591,7 @@ public class TasksUiPlugin extends AbstractUIPlugin { ActivityExternalizationParticipant ACTIVITY_EXTERNALIZTAION_PARTICIPANT = new ActivityExternalizationParticipant(); externalizationManager.addParticipant(ACTIVITY_EXTERNALIZTAION_PARTICIPANT); taskActivityManager.addActivityListener(ACTIVITY_EXTERNALIZTAION_PARTICIPANT); - + loadDataSources(); new TasksUiInitializationJob().schedule(); } catch (Exception e) { StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Task list initialization failed", e)); @@ -733,8 +727,7 @@ public class TasksUiPlugin extends AbstractUIPlugin { public void setDataDirectory(final String newPath, IProgressMonitor monitor) throws CoreException { externalizationManager.saveNow(monitor); - //getBackupManager().backupNow(true); - // TODO: save repositories, activity + // TODO: backup now? //TasksUiPlugin.getBackupManager().backupNow(true); loadDataDirectory(newPath); getPreferenceStore().setValue(ContextPreferenceContstants.PREF_DATA_DIR, newPath); @@ -748,10 +741,7 @@ public class TasksUiPlugin extends AbstractUIPlugin { } /** - * Only support task data versions post 0.7 - * - * @throws CoreException - * @throws InterruptedException + * Load's data sources from <code>newPath</code> and executes with progress */ private synchronized void loadDataDirectory(final String newPath) throws CoreException { @@ -760,28 +750,16 @@ public class TasksUiPlugin extends AbstractUIPlugin { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { - monitor.beginTask("Set Data Directory", IProgressMonitor.UNKNOWN); + monitor.beginTask("Load Data Directory", IProgressMonitor.UNKNOWN); Job.getJobManager().beginRule(ITasksCoreConstants.ROOT_SCHEDULING_RULE, new SubProgressMonitor(monitor, 1)); if (monitor.isCanceled()) { throw new InterruptedException(); } - externalizationManager.reset(); + TasksUi.getTaskActivityManager().deactivateActiveTask(); externalizationManager.setRootFolderPath(newPath); - taskActivityManager.clear(); -// getRepositoryManager().readRepositories( -// newPath + File.separator + TaskRepositoryManager.DEFAULT_REPOSITORIES_FILE); - loadTemplateRepositories(); - - getTaskListManager().resetTaskList(); -// getTaskListManager().setTaskListFile( -// new File(newPath + File.separator + ITasksCoreConstants.DEFAULT_TASK_LIST_FILE)); - - ContextCore.getContextManager().loadActivityMetaContext(); - - getTaskListManager().readExistingOrCreateNewList(); - taskActivityMonitor.reloadActivityTime(); + loadDataSources(); } finally { Job.getJobManager().endRule(ITasksCoreConstants.ROOT_SCHEDULING_RULE); monitor.done(); @@ -806,6 +784,20 @@ public class TasksUiPlugin extends AbstractUIPlugin { } + /** + * called on startup and when the mylyn data structures are reloaded from disk + */ + private void loadDataSources() { + externalizationManager.reLoad(); + // TODO: Move management of template repositories to TaskRepositoryManager + loadTemplateRepositories(); + + taskActivityManager.clear(); + ContextCore.getContextManager().loadActivityMetaContext(); + taskActivityMonitor.reloadActivityTime(); + taskActivityManager.reloadPlanningData(); + } + @Override protected void initializeDefaultPreferences(IPreferenceStore store) { store.setDefault(ContextPreferenceContstants.PREF_DATA_DIR, getDefaultDataDirectory()); @@ -971,9 +963,9 @@ public class TasksUiPlugin extends AbstractUIPlugin { return overlayIcons.get(repositoryType); } - public boolean isInitialized() { - return initialized; - } +// public boolean isInitialized() { +// return initialized; +// } public IHyperlinkDetector[] getTaskHyperlinkDetectors() { return hyperlinkDetectors.toArray(new IHyperlinkDetector[1]); diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryCloneAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryCloneAction.java index bed678656..d413a9e17 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryCloneAction.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryCloneAction.java @@ -87,7 +87,7 @@ public class QueryCloneAction extends Action implements IViewActionDelegate { if (clonedQueries.size() > 0) { for (RepositoryQuery query : clonedQueries) { - String handle = TasksUiPlugin.getTaskListManager().resolveIdentifiersConflict(query); + String handle = QueryImportAction.resolveIdentifiersConflict(query); query.setHandleIdentifier(handle); AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(query.getConnectorKind()); TasksUiInternal.openEditQueryDialog(connectorUi, query); diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryImportAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryImportAction.java index e47a4bed5..25d8e5ea5 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryImportAction.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryImportAction.java @@ -10,17 +10,25 @@ package org.eclipse.mylyn.internal.tasks.ui.actions; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants; +import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; +import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.ui.TasksUi; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IViewActionDelegate; @@ -59,9 +67,8 @@ public class QueryImportAction extends Action implements IViewActionDelegate { File file = new File(path); if (file.isFile()) { try { - List<RepositoryQuery> queries = TasksUiPlugin.getTaskListManager() - .getTaskListWriter() - .readQueries(file); + List<RepositoryQuery> queries = TasksUiPlugin.getTaskListManager().getTaskListWriter().readQueries( + file); Set<TaskRepository> repositories = TasksUiPlugin.getTaskListManager() .getTaskListWriter() .readRepositories(file); @@ -87,7 +94,7 @@ public class QueryImportAction extends Action implements IViewActionDelegate { public void importQueries(List<RepositoryQuery> queries, Set<TaskRepository> repositories, Shell shell) { TasksUiPlugin.getRepositoryManager().insertRepositories(repositories, TasksUiPlugin.getDefault().getRepositoriesFilePath()); - List<RepositoryQuery> badQueries = TasksUiPlugin.getTaskListManager().insertQueries(queries); + List<RepositoryQuery> badQueries = insertQueries(queries); // notify user about importing String message = "The following queries were imported successfully: "; @@ -107,4 +114,80 @@ public class QueryImportAction extends Action implements IViewActionDelegate { MessageDialog.openInformation(shell, "Query Import Completed", message); } + /** + * Imports Queries to the TaskList and synchronize them with the repository. If the imported query have the name + * that overlaps with the existing one, the the suffix [x] is added, where x is a number starting from 1. + * + * @param queries + * to insert + * @return the list queries, which were not inserted since because the related repository was not found. + */ + public List<RepositoryQuery> insertQueries(List<RepositoryQuery> queries) { + List<RepositoryQuery> badQueries = new ArrayList<RepositoryQuery>(); + + for (RepositoryQuery query : queries) { + + TaskRepository repository = TasksUi.getRepositoryManager().getRepository(query.getConnectorKind(), + query.getRepositoryUrl()); + if (repository == null) { + badQueries.add(query); + continue; + } + + String handle = resolveIdentifiersConflict(query); + query.setHandleIdentifier(handle); + + // add query + TasksUiInternal.getTaskList().addQuery(query); + + AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector( + repository.getConnectorKind()); + if (connector != null) { + TasksUiInternal.synchronizeQuery(connector, query, null, true); + } + + } + + return badQueries; + } + + /** + * Utility method that checks, if there is already a query with the same identifier. + * + * @param query + * @return a handle, that is not in conflict with any existed one in the system. If there were no conflict in the + * beginning, then the query's own identifier is returned. If there were, then the suffix [x] is applied the + * query's identifier, where x is a number. + * @since 2.1 + */ + public static String resolveIdentifiersConflict(RepositoryQuery query) { + String patternStr = "\\[(\\d+)\\]$"; // all string that end with [x], where x is a number + Pattern pattern = Pattern.compile(patternStr); + + // resolve name conflict + Set<RepositoryQuery> existingQueries = TasksUiPlugin.getTaskListManager().getTaskList().getQueries(); + Map<String, RepositoryQuery> queryMap = new HashMap<String, RepositoryQuery>(); + for (RepositoryQuery existingQuery : existingQueries) { + queryMap.put(existingQuery.getHandleIdentifier(), existingQuery); + } + + // suggest a new handle if needed + String handle = query.getHandleIdentifier(); + + while (queryMap.get(handle) != null) { + Matcher matcher = pattern.matcher(handle); + boolean matchFound = matcher.find(); + if (matchFound) { + // increment index + int index = Integer.parseInt(matcher.group(1)); + index++; + handle = matcher.replaceAll("[" + index + "]"); + } else { + handle += "[1]"; + } + } + + return handle; + } + } |