diff options
author | relves | 2007-06-20 19:13:29 +0000 |
---|---|---|
committer | relves | 2007-06-20 19:13:29 +0000 |
commit | c7d539a0b235a2488a18c4ad9a310b2722fcc710 (patch) | |
tree | f89ae00b09217110387fee7f8d924f73500761ae | |
parent | 9de32aadd302eb7f40f5f1174de0dc002c0f638b (diff) | |
download | org.eclipse.mylyn.tasks-c7d539a0b235a2488a18c4ad9a310b2722fcc710.tar.gz org.eclipse.mylyn.tasks-c7d539a0b235a2488a18c4ad9a310b2722fcc710.tar.xz org.eclipse.mylyn.tasks-c7d539a0b235a2488a18c4ad9a310b2722fcc710.zip |
NEW - bug 192309: fix synchronization of Trac web tasks
https://bugs.eclipse.org/bugs/show_bug.cgi?id=192309
12 files changed, 129 insertions, 146 deletions
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java index eee7203c0..f079c557b 100644 --- a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java +++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java @@ -32,9 +32,9 @@ import org.eclipse.mylyn.internal.monitor.core.util.StatusManager; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; import org.eclipse.mylyn.tasks.core.AbstractTask; +import org.eclipse.mylyn.tasks.core.AbstractTaskDataHandler; import org.eclipse.mylyn.tasks.core.IAttachmentHandler; import org.eclipse.mylyn.tasks.core.ITaskCollector; -import org.eclipse.mylyn.tasks.core.AbstractTaskDataHandler; import org.eclipse.mylyn.tasks.core.ITaskFactory; import org.eclipse.mylyn.tasks.core.QueryHitCollector; import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute; @@ -222,6 +222,32 @@ public class BugzillaRepositoryConnector extends AbstractRepositoryConnector { } @Override + public boolean updateTaskFromQueryHit(TaskRepository repository, AbstractTask existingTask, + AbstractTask newTask) { + // these properties are not provided by Bugzilla queries + newTask.setCompleted(existingTask.isCompleted()); +// newTask.setCompletionDate(existingTask.getCompletionDate()); + + boolean changed = super.updateTaskFromQueryHit(repository, existingTask, newTask); + + if (existingTask instanceof BugzillaTask && newTask instanceof BugzillaTask) { + BugzillaTask existingBugzillaTask = (BugzillaTask) existingTask; + BugzillaTask newBugzillaTask = (BugzillaTask) newTask; + + if (hasTaskPropertyChanged(existingBugzillaTask.getSeverity(), newBugzillaTask.getSeverity())) { + existingBugzillaTask.setSeverity(newBugzillaTask.getSeverity()); + changed = true; + } + if (hasTaskPropertyChanged(existingBugzillaTask.getProduct(), newBugzillaTask.getProduct())) { + existingBugzillaTask.setProduct(newBugzillaTask.getProduct()); + changed = true; + } + } + + return changed; + } + + @Override public boolean markStaleTasks(TaskRepository repository, Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException { try { @@ -291,7 +317,7 @@ public class BugzillaRepositoryConnector extends AbstractRepositoryConnector { private void queryForChanged(final TaskRepository repository, Set<AbstractTask> changedTasks, String urlQueryString) throws UnsupportedEncodingException, CoreException { - QueryHitCollector collector = new QueryHitCollector(taskList, new ITaskFactory() { + QueryHitCollector collector = new QueryHitCollector(new ITaskFactory() { public AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor) { // do not construct actual task objects here as query shouldn't result in new tasks diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchEngineTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchEngineTest.java index 8c1ba6457..196bdb49a 100644 --- a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchEngineTest.java +++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchEngineTest.java @@ -116,7 +116,7 @@ public class BugzillaSearchEngineTest extends TestCase { AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector( BugzillaCorePlugin.REPOSITORY_KIND); TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList(); - QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository)); + QueryHitCollector collector = new QueryHitCollector(new TaskFactory(repository)); connector.performQuery(repositoryQuery, repository, new NullProgressMonitor(), collector); diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java index 4a2e0607f..f0242efdf 100644 --- a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java +++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java @@ -132,7 +132,7 @@ public class BugzillaQueryTest extends TestCase { // holds onto actual hit objects TaskList taskList = new TaskList(); - QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository)); + QueryHitCollector collector = new QueryHitCollector(new TaskFactory(repository)); BugzillaRepositoryConnector connector = new BugzillaRepositoryConnector(); connector.init(taskList); BugzillaRepositoryQuery query = new BugzillaRepositoryQuery(repository.getUrl(), queryUrlString, "summary"); diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/DummySearchHitProvider.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/DummySearchHitProvider.java index a14f74566..5dfbef976 100644 --- a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/DummySearchHitProvider.java +++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/DummySearchHitProvider.java @@ -22,7 +22,7 @@ import org.eclipse.mylyn.tasks.core.TaskList; public class DummySearchHitProvider extends QueryHitCollector { public DummySearchHitProvider(TaskList tasklist) { - super(tasklist, new ITaskFactory() { + super(new ITaskFactory() { public AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor) throws CoreException { return null; diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java index d414ea67e..f265e0be4 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java @@ -210,6 +210,59 @@ public abstract class AbstractRepositoryConnector { public abstract void updateTaskFromTaskData(TaskRepository repository, AbstractTask repositoryTask, RepositoryTaskData taskData); + /** + * Updates <code>existingTask</code> with latest information from <code>queryHit</code>. + * + * @return true, if properties of <code>existingTask</code> were changed + * @since 2.0 + */ + public boolean updateTaskFromQueryHit(TaskRepository repository, AbstractTask existingTask, + AbstractTask queryHit) { + boolean changed = false; + if (existingTask.isCompleted() != queryHit.isCompleted()) { + existingTask.setCompleted(queryHit.isCompleted()); + changed = true; + } + if (hasTaskPropertyChanged(existingTask.getSummary(), queryHit.getSummary())) { + existingTask.setSummary(queryHit.getSummary()); + changed = true; + } +// if (hasTaskPropertyChanged(existingTask.getCompletionDate(), queryHit.getCompletionDate())) { +// existingTask.setCompletionDate(queryHit.getCompletionDate()); +// changed = true; +// } +// if (hasTaskPropertyChanged(existingTask.getCreationDate(), newTask.getCreationDate())) { +// existingTask.setCreationDate(newTask.getCreationDate()); +// changed = true; +// } + if (hasTaskPropertyChanged(existingTask.getDueDate(), queryHit.getDueDate())) { + existingTask.setDueDate(queryHit.getDueDate()); + changed = true; + } + if (hasTaskPropertyChanged(existingTask.getOwner(), queryHit.getOwner())) { + existingTask.setOwner(queryHit.getOwner()); + changed = true; + } + if (hasTaskPropertyChanged(existingTask.getPriority(), queryHit.getPriority())) { + existingTask.setPriority(queryHit.getPriority()); + changed = true; + } + if (hasTaskPropertyChanged(existingTask.getTaskUrl(), queryHit.getTaskUrl())) { + existingTask.setTaskUrl(queryHit.getTaskUrl()); + changed = true; + } + + return changed; + } + + protected final boolean hasTaskPropertyChanged(Object existingProperty, Object newProperty) { + // the query hit does not have this property + if (newProperty == null) { + return false; + } + return (existingProperty == null) ? true : !existingProperty.equals(newProperty); + } + public String[] repositoryPropertyNames() { return new String[] { IRepositoryConstants.PROPERTY_VERSION, IRepositoryConstants.PROPERTY_TIMEZONE, IRepositoryConstants.PROPERTY_ENCODING }; diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/QueryHitCollector.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/QueryHitCollector.java index cd1b9480b..6d9ecec7b 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/QueryHitCollector.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/QueryHitCollector.java @@ -32,12 +32,9 @@ public class QueryHitCollector implements ITaskCollector { private final Set<AbstractTask> taskResults = new HashSet<AbstractTask>(); - private final TaskList taskList; - private final ITaskFactory taskFactory; - public QueryHitCollector(TaskList tasklist, ITaskFactory taskFactory) { - this.taskList = tasklist; + public QueryHitCollector(ITaskFactory taskFactory) { this.taskFactory = taskFactory; } @@ -46,17 +43,7 @@ public class QueryHitCollector implements ITaskCollector { throw new IllegalArgumentException(); } - AbstractTask existingTask = taskList.getTask(task.getHandleIdentifier()); - if (existingTask == null) { - task.setStale(true); - task.setSyncState(RepositoryTaskSyncState.INCOMING); - } else { - // preserve meta attributes of existing task - task.setLastSyncDateStamp(existingTask.getLastSyncDateStamp()); - task.setStale(existingTask.isStale()); - } - - taskResults.add((AbstractTask) task); + taskResults.add(task); } public void accept(RepositoryTaskData taskData) throws CoreException { diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepositoryManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepositoryManager.java index 3c4b7bebe..11ba1cf60 100644 --- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepositoryManager.java +++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepositoryManager.java @@ -128,7 +128,7 @@ public class TaskRepositoryManager { } return sb.toString(); } - + public TaskRepository getRepository(String kind, String urlString) { urlString = stripSlashes(urlString); if (repositoryMap.containsKey(kind)) { @@ -162,8 +162,8 @@ public class TaskRepositoryManager { public AbstractRepositoryConnector getConnectorForRepositoryTaskUrl(String url) { for (AbstractRepositoryConnector connector : getRepositoryConnectors()) { if (connector.getRepositoryUrlFromTaskUrl(url) != null) { - for(TaskRepository repository : getRepositories(connector.getRepositoryType())) { - if(url.startsWith(repository.getUrl())) { + for (TaskRepository repository : getRepositories(connector.getRepositoryType())) { + if (url.startsWith(repository.getUrl())) { return connector; } } @@ -229,7 +229,7 @@ public class TaskRepositoryManager { repositoryMap.clear(); orphanedRepositories.clear(); - + loadRepositories(repositoriesFilePath); for (ITaskRepositoryListener listener : listeners) { @@ -298,8 +298,9 @@ public class TaskRepositoryManager { // Migration 2.0M1 - 2.0M2 private boolean migrateAnonymousRepository(TaskRepository repository) { - if (repository.getProperty(TaskRepository.ANONYMOUS_LOGIN) == null) { - if ((repository.getUserName() == null || repository.getPassword() == null) || ("".equals(repository.getUserName()) && "".equals(repository.getPassword()))) { + if (repository.getProperty(TaskRepository.ANONYMOUS_LOGIN) == null) { + if ((repository.getUserName() == null || repository.getPassword() == null) + || ("".equals(repository.getUserName()) && "".equals(repository.getPassword()))) { repository.setAnonymous(true); } else { repository.setAnonymous(false); diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java index 7104660e7..3089adb24 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java @@ -78,11 +78,11 @@ public class ScheduledTaskListSynchJob extends Job { scheduleDelay = -1; throw new OperationCanceledException(); } - + if (repository.isOffline()) { continue; } - + final AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager() .getRepositoryConnector(repository.getKind()); if (connector == null) { @@ -92,7 +92,7 @@ public class ScheduledTaskListSynchJob extends Job { // Occasionally update repository attributes if (count >= UPDATE_ATTRIBUTES_FREQUENCY) { - Job updateJob = new Job("Updating attributes for "+repository.getUrl()) { + Job updateJob = new Job("Updating attributes for " + repository.getUrl()) { @Override protected IStatus run(IProgressMonitor monitor) { @@ -113,9 +113,8 @@ public class ScheduledTaskListSynchJob extends Job { RepositorySynchronizationManager synchronizationManager = TasksUiPlugin.getSynchronizationManager(); Set<AbstractRepositoryQuery> queries = taskList.getRepositoryQueries(repository.getUrl()); - synchronizationManager.synchronize(connector, repository, queries, null, - Job.DECORATE, 0, false); - + synchronizationManager.synchronize(connector, repository, queries, null, Job.DECORATE, 0, false); + monitor.worked(1); } } finally { diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java index 60dbf4471..2bc4d2494 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java @@ -111,7 +111,7 @@ public class RepositorySynchronizationManager { // TasksUiPlugin.getTaskListManager().getTaskList().notifyContainerUpdated(repositoryQuery); } taskList.notifyContainersUpdated(repositoryQueries); - + final SynchronizeQueryJob job = new SynchronizeQueryJob(connector, repository, repositoryQueries, taskList); job.setSynchronizeChangedTasks(true); job.setForced(userForcedSync); @@ -140,19 +140,10 @@ public class RepositorySynchronizationManager { * to this method update TaskRepository.syncTime. */ public final void synchronizeChanged(final AbstractRepositoryConnector connector, final TaskRepository repository) { - final SynchronizeChangedTasksJob synchronizeChangedTasksJob = new SynchronizeChangedTasksJob(connector, - repository); - synchronizeChangedTasksJob.setSystem(true); - synchronizeChangedTasksJob.setRule(new RepositoryMutexRule(repository)); - if (!forceSyncExecForTesting) { - synchronizeChangedTasksJob.schedule(); - } else { - PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { - public void run() { - synchronizeChangedTasksJob.run(new NullProgressMonitor()); - } - }); - } + // Method left here for completeness. Currently unused since ScheduledTaskListSynchJob calls SynchronizeQueriesJob + // which synchronizes all changed if unforced (background). + Set<AbstractRepositoryQuery> emptySet = Collections.emptySet(); + synchronize(connector, repository, emptySet, null, Job.LONG, 0, false); } /** @@ -226,8 +217,7 @@ public class RepositorySynchronizationManager { repositoryTask.setNotified(false); } if (hasIncoming || previousTaskData == null || forceSync) { - TasksUiPlugin.getDefault().getTaskDataManager().setNewTaskData( - newTaskData); + TasksUiPlugin.getDefault().getTaskDataManager().setNewTaskData(newTaskData); } break; } @@ -305,7 +295,7 @@ public class RepositorySynchronizationManager { repositoryTask.setSyncState(RepositoryTaskSyncState.INCOMING); TasksUiPlugin.getTaskListManager().getTaskList().notifyTaskChanged(repositoryTask, false); } - + // for repositories that don't support task data or if no task data is available if (read && taskData == null) { repositoryTask.setLastSyncDateStamp(LocalTask.SYNC_DATE_NOW); diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeChangedTasksJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeChangedTasksJob.java deleted file mode 100644 index 4620ea4d9..000000000 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeChangedTasksJob.java +++ /dev/null @@ -1,89 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 - 2006 Mylar committers 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 - *******************************************************************************/ - -package org.eclipse.mylyn.tasks.ui; - -import java.util.Iterator; -import java.util.Set; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.SubProgressMonitor; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.mylyn.internal.monitor.core.util.StatusManager; -import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; -import org.eclipse.mylyn.tasks.core.AbstractTask; -import org.eclipse.mylyn.tasks.core.TaskList; -import org.eclipse.mylyn.tasks.core.TaskRepository; - -public class SynchronizeChangedTasksJob extends Job { - - private final AbstractRepositoryConnector connector; - - private final TaskRepository repository; - - private boolean forced; - - public SynchronizeChangedTasksJob(AbstractRepositoryConnector connector, TaskRepository repository) { - super("Get Changed Tasks"); - - this.connector = connector; - this.repository = repository; - } - - /** - * Returns true, if synchronization was triggered manually and not by an automatic background job. - */ - public boolean isForced() { - return forced; - } - - /** - * Indicates a manual synchronization (User initiated). If set to true, a dialog will be displayed in case of - * errors. Any tasks with missing data will be retrieved. - */ - public void setForced(boolean forced) { - this.forced = forced; - } - - @Override - public IStatus run(IProgressMonitor monitor) { - try { - monitor.beginTask("Synchronizing changed tasks", IProgressMonitor.UNKNOWN); - - TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList(); - Set<AbstractTask> tasks = taskList.getRepositoryTasks(repository.getUrl()); - - boolean changed = connector.markStaleTasks(repository, tasks, new SubProgressMonitor(monitor, 1)); - if (!changed) { - return Status.OK_STATUS; - } - - for (Iterator<AbstractTask> it = tasks.iterator(); it.hasNext();) { - if (!it.next().isStale()) { - it.remove(); - } - } - - if (tasks.isEmpty()) { - return Status.OK_STATUS; - } - - TasksUiPlugin.getSynchronizationManager().synchronize(connector, tasks, forced, null); - } catch (final CoreException e) { - StatusManager.log(e.getStatus()); - } finally { - monitor.done(); - } - - return Status.OK_STATUS; - }; - -} diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java index 584b08953..24b576bb0 100644 --- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java +++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java @@ -33,6 +33,7 @@ import org.eclipse.mylyn.tasks.core.AbstractTask; import org.eclipse.mylyn.tasks.core.QueryHitCollector; import org.eclipse.mylyn.tasks.core.TaskList; import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.core.AbstractTask.RepositoryTaskSyncState; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.IProgressConstants; @@ -108,7 +109,7 @@ class SynchronizeQueryJob extends Job { return Status.OK_STATUS; } - // synchronize queries + // synchronize queries, tasks changed within query are added to set of tasks to be synchronized int n = 0; for (AbstractRepositoryQuery repositoryQuery : queries) { repositoryQuery.setStatus(null); @@ -121,7 +122,7 @@ class SynchronizeQueryJob extends Job { } // for background synchronizations all changed tasks are synchronized including the ones that are not part of a query - if (forced) { + if (!forced) { for (AbstractTask task : allTasks) { if (task.isStale()) { tasksToBeSynchronized.add(task); @@ -171,7 +172,7 @@ class SynchronizeQueryJob extends Job { private void synchronizeQuery(AbstractRepositoryQuery repositoryQuery, IProgressMonitor monitor) { setProperty(IProgressConstants.ICON_PROPERTY, TasksUiImages.REPOSITORY_SYNCHRONIZE); - QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository, true, false)); + QueryHitCollector collector = new QueryHitCollector(new TaskFactory(repository, true, false)); final IStatus resultingStatus = connector.performQuery(repositoryQuery, repository, monitor, collector); if (resultingStatus.getSeverity() == IStatus.CANCEL) { @@ -184,10 +185,25 @@ class SynchronizeQueryJob extends Job { repositoryQuery.clear(); for (AbstractTask hit : collector.getTaskHits()) { - taskList.addTask(hit, repositoryQuery); - if (synchronizeChangedTasks && hit.isStale()) { - tasksToBeSynchronized.add(hit); - hit.setCurrentlySynchronizing(true); + AbstractTask task = taskList.getTask(hit.getHandleIdentifier()); + if (task != null) { + // update the existing task from the query hit + boolean changed = connector.updateTaskFromQueryHit(repository, task, hit); + if (changed && !task.isStale() && task.getSyncState() == RepositoryTaskSyncState.SYNCHRONIZED) { + // set incoming marker for web tasks + task.setSyncState(RepositoryTaskSyncState.INCOMING); + } + } else { + // new tasks are marked stale by default + task = hit; + task.setStale(true); + task.setSyncState(RepositoryTaskSyncState.INCOMING); + } + + taskList.addTask(task, repositoryQuery); + if (synchronizeChangedTasks && task.isStale()) { + tasksToBeSynchronized.add(task); + task.setCurrentlySynchronizing(true); } } diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java index 461ed441e..2327845d9 100644 --- a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java +++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java @@ -209,7 +209,7 @@ public class TracRepositoryConnectorTest extends TestCase { //MultiStatus queryStatus = new MultiStatus(TracUiPlugin.PLUGIN_ID, IStatus.OK, "Query result", null); final List<AbstractTask> result = new ArrayList<AbstractTask>(); - QueryHitCollector hitCollector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(repository)) { + QueryHitCollector hitCollector = new QueryHitCollector(new TaskFactory(repository)) { public void accept(RepositoryTaskData data) { fail("Unexpected call to accept()"); } |