Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrelves2007-06-20 19:13:29 +0000
committerrelves2007-06-20 19:13:29 +0000
commitc7d539a0b235a2488a18c4ad9a310b2722fcc710 (patch)
treef89ae00b09217110387fee7f8d924f73500761ae
parent9de32aadd302eb7f40f5f1174de0dc002c0f638b (diff)
downloadorg.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
-rw-r--r--org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java30
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchEngineTest.java2
-rw-r--r--org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java2
-rw-r--r--org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/DummySearchHitProvider.java2
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java53
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/QueryHitCollector.java17
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepositoryManager.java13
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java11
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java24
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeChangedTasksJob.java89
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java30
-rw-r--r--org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java2
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()");
}

Back to the top