Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 71190 Details for
Bug 191575
[api] optimize query synchronization
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
merged with recent changes
clipboard18063.txt (text/plain), 33.61 KB, created by
Eugene Kuleshov
on 2007-06-13 12:05:15 EDT
(
hide
)
Description:
merged with recent changes
Filename:
MIME Type:
Creator:
Eugene Kuleshov
Created:
2007-06-13 12:05:15 EDT
Size:
33.61 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.mylyn.trac.core >Index: src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java,v >retrieving revision 1.45 >diff -u -r1.45 TracRepositoryConnector.java >--- src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java 13 Jun 2007 08:00:07 -0000 1.45 >+++ src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java 13 Jun 2007 16:02:45 -0000 >@@ -151,7 +151,7 @@ > > @Override > public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository, >- Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException { >+ Set<AbstractTask> tasks, IProgressMonitor monitor, QueryHitCollector collector) throws CoreException { > if (repository.getSyncTimeStamp() == null) { > return tasks; > } >@@ -167,20 +167,22 @@ > } catch (NumberFormatException e) { > } > >- ITracClient client; > try { >- client = getClientManager().getRepository(repository); >+ ITracClient client = getClientManager().getRepository(repository); > Set<Integer> ids = client.getChangedTickets(since); >+ if(ids.isEmpty()) { >+ return null; // no changes >+ } > > Set<AbstractTask> result = new HashSet<AbstractTask>(); >- if (!ids.isEmpty()) { >- for (AbstractTask task : tasks) { >- Integer id = getTicketId(task.getTaskId()); >- if (ids.contains(id)) { >- result.add(task); >- } >+ for (AbstractTask task : tasks) { >+ Integer id = getTicketId(task.getTaskId()); >+ if (ids.contains(id)) { >+ result.add(task); > } > } >+ >+ // these changed tasks will be synchronized outside > return result; > } catch (Exception e) { > throw new CoreException(new Status(IStatus.ERROR, TracCorePlugin.PLUGIN_ID, IStatus.OK, >#P org.eclipse.mylyn.tasks.ui >Index: src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java,v >retrieving revision 1.15 >diff -u -r1.15 ScheduledTaskListSynchJob.java >--- src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java 13 Jun 2007 07:59:34 -0000 1.15 >+++ src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java 13 Jun 2007 16:02:46 -0000 >@@ -11,23 +11,21 @@ > > package org.eclipse.mylyn.internal.tasks.ui; > >-import java.util.Collections; > import java.util.List; > import java.util.Set; > > import org.eclipse.core.runtime.IProgressMonitor; > import org.eclipse.core.runtime.IStatus; >-import org.eclipse.core.runtime.NullProgressMonitor; > import org.eclipse.core.runtime.OperationCanceledException; > import org.eclipse.core.runtime.Status; > import org.eclipse.core.runtime.SubProgressMonitor; >-import org.eclipse.core.runtime.jobs.IJobChangeEvent; > import org.eclipse.core.runtime.jobs.Job; >-import org.eclipse.core.runtime.jobs.JobChangeAdapter; > import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; > import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; >-import org.eclipse.mylyn.tasks.core.getAllCategories; >+import org.eclipse.mylyn.tasks.core.AbstractTask; > import org.eclipse.mylyn.tasks.core.TaskRepository; >+import org.eclipse.mylyn.tasks.core.getAllCategories; >+import org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager; > import org.eclipse.mylyn.tasks.ui.TaskListManager; > import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; > >@@ -68,12 +66,8 @@ > } > > @Override >- public IStatus run(IProgressMonitor monitor) { >+ public IStatus run(final IProgressMonitor monitor) { > try { >- if (monitor == null) { >- monitor = new NullProgressMonitor(); >- } >- > taskList = taskListManager.getTaskList(); > if (repositories == null) { > repositories = TasksUiPlugin.getRepositoryManager().getAllRepositories(); >@@ -113,22 +107,18 @@ > updateJob.schedule(); > } > >- Set<AbstractRepositoryQuery> queries = Collections.unmodifiableSet(taskList >- .getRepositoryQueries(repository.getUrl())); >- if (queries.size() > 0) { >- if (connector != null) { >- JobChangeAdapter jobAdapter = new JobChangeAdapter() { >- @Override >- public void done(IJobChangeEvent event) { >- TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, repository); >- } >- }; >- TasksUiPlugin.getSynchronizationManager().synchronize(connector, queries, jobAdapter, >- Job.DECORATE, 0, false, false); >+ RepositorySynchronizationManager synchronizationManager = TasksUiPlugin.getSynchronizationManager(); >+ Set<AbstractTask> changedTasks = synchronizationManager.synchronizeChanged(connector, repository, >+ new SubProgressMonitor(monitor, SubProgressMonitor.UNKNOWN)); >+ if(changedTasks!=null) { >+ // only sync queries if there were any changes >+ Set<AbstractRepositoryQuery> queries = taskList.getRepositoryQueries(repository.getUrl()); >+ if (queries.size() > 0) { >+ synchronizationManager.synchronize(connector, queries, null, >+ Job.DECORATE, 0, false, changedTasks); > } >- } else { >- TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, repository); > } >+ > monitor.worked(1); > } > } finally { >Index: src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeSelectedAction.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeSelectedAction.java,v >retrieving revision 1.13 >diff -u -r1.13 SynchronizeSelectedAction.java >--- src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeSelectedAction.java 13 Jun 2007 07:59:34 -0000 1.13 >+++ src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeSelectedAction.java 13 Jun 2007 16:02:46 -0000 >@@ -19,6 +19,7 @@ > import java.util.Map; > import java.util.Set; > >+import org.eclipse.core.runtime.NullProgressMonitor; > import org.eclipse.core.runtime.jobs.Job; > import org.eclipse.jface.action.IAction; > import org.eclipse.jface.viewers.ISelection; >@@ -27,9 +28,9 @@ > 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.AbstractTask; > import org.eclipse.mylyn.tasks.core.TaskCategory; > import org.eclipse.mylyn.tasks.core.TaskRepository; >+import org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager; > import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; > import org.eclipse.ui.IActionBars; > import org.eclipse.ui.IViewActionDelegate; >@@ -69,11 +70,9 @@ > } else if (obj instanceof TaskCategory) { > TaskCategory cat = (TaskCategory) obj; > for (AbstractTask task : cat.getChildren()) { >- if (task instanceof AbstractTask) { >- AbstractRepositoryConnector client = TasksUiPlugin.getRepositoryManager() >- .getRepositoryConnector(((AbstractTask) task).getRepositoryKind()); >- addTaskToSync(client, (AbstractTask) task); >- } >+ AbstractRepositoryConnector client = TasksUiPlugin.getRepositoryManager() >+ .getRepositoryConnector(((AbstractTask) task).getRepositoryKind()); >+ addTaskToSync(client, (AbstractTask) task); > } > } else if (obj instanceof AbstractTask) { > AbstractTask repositoryTask = (AbstractTask) obj; >@@ -83,41 +82,49 @@ > } > } > >+ RepositorySynchronizationManager syncManager = TasksUiPlugin.getSynchronizationManager(); > if (!queriesToSyncMap.isEmpty()) { > > // determine which repositories to synch changed tasks for >- HashMap<String, Set<TaskRepository>> repositoriesToSync = new HashMap<String, Set<TaskRepository>>(); >+ HashMap<TaskRepository, Set<AbstractRepositoryQuery>> repositoriesToSync = new HashMap<TaskRepository, Set<AbstractRepositoryQuery>>(); > for (AbstractRepositoryConnector connector : queriesToSyncMap.keySet()) { > List<AbstractRepositoryQuery> queriesToSync = queriesToSyncMap.get(connector); >+ if(queriesToSync==null || queriesToSync.isEmpty()) { >+ continue; >+ } >+ > for (AbstractRepositoryQuery query : queriesToSync) { > TaskRepository repos = TasksUiPlugin.getRepositoryManager().getRepository(query.getRepositoryKind(), query.getRepositoryUrl()); >- Set<TaskRepository> repositories = repositoriesToSync.get(connector.getRepositoryType()); >- if(repositories == null) { >- repositories = new HashSet<TaskRepository>(); >- repositoriesToSync.put(connector.getRepositoryType(), repositories); >+ Set<AbstractRepositoryQuery> queries = repositoriesToSync.get(repos); >+ if(queries == null) { >+ queries = new HashSet<AbstractRepositoryQuery>(); >+ repositoriesToSync.put(repos, queries); > } >- repositories.add(repos); >+ queries.add(query); > } > } > >- // synch the queries followed by the repositories >- for (AbstractRepositoryConnector connector : queriesToSyncMap.keySet()) { >- List<AbstractRepositoryQuery> queriesToSync = queriesToSyncMap.get(connector); >- if (queriesToSync != null && queriesToSync.size() > 0) { >- TasksUiPlugin.getSynchronizationManager().synchronize(connector, new HashSet<AbstractRepositoryQuery>(queriesToSync), null, Job.LONG, 0, >- false, true); >- } >- //XXX enable? >-// for (TaskRepository taskRepository : repositoriesToSync.get(connector.getRepositoryType())) { >-// TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, taskRepository); >-// } >- } >+ for (Map.Entry<TaskRepository, Set<AbstractRepositoryQuery>> e : repositoriesToSync.entrySet()) { >+ TaskRepository repository = e.getKey(); >+ >+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager() >+ .getRepositoryConnector(repository.getKind()); >+ >+ Set<AbstractTask> changed = syncManager.synchronizeChanged(connector, repository, >+ new NullProgressMonitor()); >+ >+ if (changed != null) { >+ Set<AbstractRepositoryQuery> queries = e.getValue(); >+ syncManager.synchronize(connector, new HashSet<AbstractRepositoryQuery>(queries), null, >+ Job.LONG, 0L, true, changed); >+ } >+ } > } > if (!tasksToSyncMap.isEmpty()) { > for (AbstractRepositoryConnector connector : tasksToSyncMap.keySet()) { > List<AbstractTask> tasksToSync = tasksToSyncMap.get(connector); > if (tasksToSync != null && tasksToSync.size() > 0) { >- TasksUiPlugin.getSynchronizationManager().synchronize(connector, new HashSet<AbstractTask>(tasksToSync), true, null); >+ syncManager.synchronize(connector, new HashSet<AbstractTask>(tasksToSync), true, null); > } > } > } >Index: src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java,v >retrieving revision 1.56 >diff -u -r1.56 SynchronizeQueryJob.java >--- src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java 13 Jun 2007 07:59:35 -0000 1.56 >+++ src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java 13 Jun 2007 16:02:46 -0000 >@@ -28,8 +28,8 @@ > import org.eclipse.mylyn.tasks.core.AbstractTask; > import org.eclipse.mylyn.tasks.core.QueryHitCollector; > import org.eclipse.mylyn.tasks.core.RepositoryStatus; >-import org.eclipse.mylyn.tasks.core.getAllCategories; > import org.eclipse.mylyn.tasks.core.TaskRepository; >+import org.eclipse.mylyn.tasks.core.getAllCategories; > import org.eclipse.ui.PlatformUI; > import org.eclipse.ui.progress.IProgressConstants; > >@@ -39,36 +39,38 @@ > */ > class SynchronizeQueryJob extends Job { > >- private final AbstractRepositoryConnector connector; >- > private static final String JOB_LABEL = "Synchronizing queries"; >+ >+ private final AbstractRepositoryConnector connector; > >- private Set<AbstractRepositoryQuery> queries; >- >- private Set<TaskRepository> repositories; >- >- private boolean synchChangedTasks; >+ private final Set<AbstractRepositoryQuery> queries; > >- private getAllCategories taskList; >+ private final getAllCategories taskList; > >-// private RepositorySynchronizationManager synchronizationManager; >+ private final Set<AbstractTask> changedTasks; > >+// private final Set<TaskRepository> repositories; >+ >+// private boolean synchChangedTasks; >+ > private boolean forced = false; > >+ > public SynchronizeQueryJob(RepositorySynchronizationManager synchronizationManager, >- AbstractRepositoryConnector connector, Set<AbstractRepositoryQuery> queries, getAllCategories taskList) { >+ AbstractRepositoryConnector connector, Set<AbstractRepositoryQuery> queries, getAllCategories taskList, Set<AbstractTask> changedTasks) { > super(JOB_LABEL + ": " + connector.getRepositoryType()); > this.connector = connector; > this.queries = queries; > this.taskList = taskList; >- this.repositories = new HashSet<TaskRepository>(); >+ this.changedTasks = changedTasks; >+// this.repositories = new HashSet<TaskRepository>(); > // TODO: remove once architecture established > // this.synchronizationManager = synchronizationManager; > } > >- public void setSynchChangedTasks(boolean syncChangedTasks) { >- this.synchChangedTasks = syncChangedTasks; >- } >+// public void setSynchChangedTasks(boolean syncChangedTasks) { >+// this.synchChangedTasks = syncChangedTasks; >+// } > > /** > * Returns true, if synchronization was triggered manually and not by an >@@ -91,6 +93,8 @@ > protected IStatus run(IProgressMonitor monitor) { > monitor.beginTask(JOB_LABEL, queries.size()); > >+ >+ > for (AbstractRepositoryQuery repositoryQuery : queries) { > taskList.notifyContainerUpdated(repositoryQuery); > repositoryQuery.setStatus(null); >@@ -107,6 +111,8 @@ > QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository)); > SubProgressMonitor collectorMonitor = new SubProgressMonitor(monitor, 1); > collector.setProgressMonitor(collectorMonitor); >+ >+ // XXX may need to pass changedTasks to this call so it can skip synchronizing them again > final IStatus resultingStatus = connector.performQuery(repositoryQuery, repository, collectorMonitor, > collector, forced); > >@@ -120,13 +126,21 @@ > } > > repositoryQuery.clear(); >+ >+ HashSet<AbstractTask> hitsToBeSynchronized = new HashSet<AbstractTask>(); > for (AbstractTask hit : collector.getTaskHits()) { > taskList.addTask(hit, repositoryQuery); >+ if(changedTasks==null || !changedTasks.contains(hit)) { >+ hitsToBeSynchronized.add(hit); >+ } > } > >- if (synchChangedTasks) { >- repositories.add(repository); >- } >+ // XXX synchronize task data for hitsToBeSynchronized collection >+ >+ >+// if (synchChangedTasks) { >+// repositories.add(repository); >+// } > > repositoryQuery.setLastRefreshTimeStamp(DateUtil.getFormattedDate(new Date(), "MMM d, H:mm:ss")); > } else { >@@ -146,9 +160,9 @@ > taskList.notifyContainerUpdated(repositoryQuery); > } > >- for (TaskRepository repository : repositories) { >- TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, repository); >- } >+// for (TaskRepository repository : repositories) { >+// TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, repository); >+// } > > // HACK: force entire Task List to refresh in case containers need to > // appear or disappear >Index: src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java,v >retrieving revision 1.53 >diff -u -r1.53 RepositorySynchronizationManager.java >--- src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java 13 Jun 2007 07:59:35 -0000 1.53 >+++ src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java 13 Jun 2007 16:02:46 -0000 >@@ -28,6 +28,7 @@ > 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.QueryHitCollector; > import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute; > import org.eclipse.mylyn.tasks.core.RepositoryTaskData; > import org.eclipse.mylyn.tasks.core.getAllCategories; >@@ -103,17 +104,15 @@ > */ > public final Job synchronize(AbstractRepositoryConnector connector, final AbstractRepositoryQuery repositoryQuery, > IJobChangeListener listener, boolean forceSync) { >- HashSet<AbstractRepositoryQuery> items = new HashSet<AbstractRepositoryQuery>(); >- items.add(repositoryQuery); >- return synchronize(connector, items, listener, Job.LONG, 0, true, forceSync); >+ return synchronize(connector, Collections.singleton(repositoryQuery), listener, Job.LONG, 0, forceSync, null); > } > > public final Job synchronize(AbstractRepositoryConnector connector, > final Set<AbstractRepositoryQuery> repositoryQueries, final IJobChangeListener listener, int priority, >- long delay, boolean syncChangedTasks, boolean userForcedSync) { >+ long delay, boolean userForcedSync, Set<AbstractTask> changedTasks) { > getAllCategories taskList = TasksUiPlugin.getTaskListManager().getTaskList(); >- final SynchronizeQueryJob job = new SynchronizeQueryJob(this, connector, repositoryQueries, taskList); >- job.setSynchChangedTasks(syncChangedTasks); >+ final SynchronizeQueryJob job = new SynchronizeQueryJob(this, connector, repositoryQueries, taskList, changedTasks); >+// job.setSynchChangedTasks(syncChangedTasks); > job.setForced(userForcedSync); > for (AbstractRepositoryQuery repositoryQuery : repositoryQueries) { > repositoryQuery.setCurrentlySynchronizing(true); >@@ -143,22 +142,60 @@ > * Synchronizes only those tasks that have changed since the last time the > * given repository was synchronized. Calls to this method update > * TaskRepository.syncTime. >+ * >+ * @return tasks updated, or <code>null</code>, if there is no updated tasks found. > */ >- public final void synchronizeChanged(final AbstractRepositoryConnector connector, final TaskRepository repository) { >+ public final Set<AbstractTask> synchronizeChanged(final AbstractRepositoryConnector connector, >+ final TaskRepository repository, IProgressMonitor monitor) { > if (connector.getTaskDataHandler() != null) { >- final SynchronizeChangedTasksJob getChangedTasksJob = new SynchronizeChangedTasksJob(connector, repository); >- getChangedTasksJob.setSystem(true); >- getChangedTasksJob.setRule(new RepositoryMutexRule(repository)); >- if (!forceSyncExecForTesting) { >- getChangedTasksJob.schedule(); >- } else { >- PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { >- public void run() { >- getChangedTasksJob.run(new NullProgressMonitor()); >+ >+// THIS IS ONLY CALLED FROM OTHER JOBS, SO PROBABLY NO NEED TO CREATE ANOTHER NESTED JOB >+// final SynchronizeChangedTasksJob getChangedTasksJob = new SynchronizeChangedTasksJob(connector, repository); >+// getChangedTasksJob.setSystem(true); >+// getChangedTasksJob.setRule(new RepositoryMutexRule(repository)); >+// if (!forceSyncExecForTesting) { >+// getChangedTasksJob.schedule(); >+// } else { >+// PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { >+// public void run() { >+// getChangedTasksJob.run(new NullProgressMonitor()); >+// } >+// }); >+// } >+ >+ getAllCategories taskList = TasksUiPlugin.getTaskListManager().getTaskList(); >+ Set<AbstractTask> repositoryTasks = Collections.unmodifiableSet(taskList >+ .getRepositoryTasks(repository.getUrl())); >+ >+ try { >+ // XXX not sure if it is using right TaskFactory >+ QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository)); >+ >+ final Set<AbstractTask> changedTasks = connector.getChangedSinceLastSync(repository, repositoryTasks, monitor, collector); >+ if (changedTasks == null) { >+ return changedTasks; >+ } >+ >+ synchronize(connector, changedTasks, false, new JobChangeAdapter() { >+ @Override >+ public void done(IJobChangeEvent event) { >+ if (!Platform.isRunning() || TasksUiPlugin.getRepositoryManager() == null) { >+ return; >+ } >+ TasksUiPlugin.getRepositoryManager().setSyncTime(repository, >+ connector.getLastSyncTimestamp(repository, changedTasks), >+ TasksUiPlugin.getDefault().getRepositoriesFilePath()); > } > }); >+ >+ return changedTasks; >+ >+ } catch (final CoreException e) { >+ // ignore, indicates working offline >+ // error reported in ui (tooltip and warning icon) > } > } >+ return null; > } > > private class SynchronizeChangedTasksJob extends Job { >@@ -182,13 +219,20 @@ > .getRepositoryTasks(repository.getUrl())); > > try { >- changedTasks = connector.getChangedSinceLastSync(repository, repositoryTasks, monitor); >+ QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository)); >+ >+ changedTasks = connector.getChangedSinceLastSync(repository, repositoryTasks, monitor, collector); > > if (changedTasks == null || changedTasks.size() == 0) { > return Status.OK_STATUS; > } >+ >+ final Set<AbstractTask> taskHits = collector.getTaskHits(); >+ if(taskHits.isEmpty()) { >+ return Status.OK_STATUS; >+ } > >- synchronize(connector, changedTasks, false, new JobChangeAdapter() { >+ synchronize(connector, taskHits, false, new JobChangeAdapter() { > > @Override > public void done(IJobChangeEvent event) { >@@ -196,7 +240,7 @@ > return; > } > TasksUiPlugin.getRepositoryManager().setSyncTime(repository, >- connector.getLastSyncTimestamp(repository, changedTasks), >+ connector.getLastSyncTimestamp(repository, taskHits), > TasksUiPlugin.getDefault().getRepositoriesFilePath()); > } > }); >#P org.eclipse.mylyn.tasks.core >Index: src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java,v >retrieving revision 1.42 >diff -u -r1.42 AbstractRepositoryConnector.java >--- src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java 13 Jun 2007 07:59:43 -0000 1.42 >+++ src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java 13 Jun 2007 16:02:46 -0000 >@@ -250,19 +250,23 @@ > } > > /** >- * Of <code>tasks</code> provided, return all that have changed since last >- * synchronization of <code>repository</code> >+ * Of <code>tasks</code> provided, return all that have changed since last synchronization of >+ * <code>repository</code>. > * >- * All errors should be thrown as <code>CoreException</code> for the >- * framework to handle, since background synchronizations fail silently when >- * disconnected. >+ * Tasks that need to be synchronized (i.e. task data updated) should be passed to >+ * <code>collector.accept(Task)</code> method, or if repository connector can update task data, it can use >+ * <code>collector.accept(RepositoryTaskData)</code> call. > * >- * TODO: Add progress monitor as parameter >+ * All errors should be thrown as <code>CoreException</code> for the framework to handle, since background >+ * synchronizations fail silently when disconnected. >+ * >+ * @return null if there was no tasks changed in the repository, otherwise collection of updated tasks (within >+ * <code>tasks</code> collection), so empty collection means that there are some other tasks changed > * > * @throws CoreException > */ > public abstract Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository, >- Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException; >+ Set<AbstractTask> tasks, IProgressMonitor monitor, QueryHitCollector collector) throws CoreException; > > /** > * Attaches the associated context to <code>task</code>. >Index: src/org/eclipse/mylyn/tasks/core/TaskRepository.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepository.java,v >retrieving revision 1.30 >diff -u -r1.30 TaskRepository.java >--- src/org/eclipse/mylyn/tasks/core/TaskRepository.java 9 Jun 2007 01:37:20 -0000 1.30 >+++ src/org/eclipse/mylyn/tasks/core/TaskRepository.java 13 Jun 2007 16:02:46 -0000 >@@ -290,8 +290,23 @@ > > @Override > public boolean equals(Object object) { >- if (object instanceof TaskRepository && getUrl() != null) { >- return getUrl().equals(((TaskRepository) object).getUrl()); >+ if (object instanceof TaskRepository) { >+ TaskRepository repository = (TaskRepository) object; >+ if (getUrl() == null) { >+ if (repository.getUrl() != null) { >+ return false; >+ } >+ } else { >+ if(!getUrl().equals(repository.getUrl())) { >+ return false; >+ } >+ } >+ if (getKind() == null) { >+ return repository.getKind() == null; >+ } else { >+ return getKind().equals(repository.getKind()); >+ } >+ > } else { > return super.equals(object); > } >@@ -299,11 +314,8 @@ > > @Override > public int hashCode() { >- if (getUrl() != null) { >- return getUrl().hashCode(); >- } else { >- return super.hashCode(); >- } >+ int res = getUrl()==null ? 1 : getUrl().hashCode(); >+ return res * 31 + (getKind()==null ? 1 : getKind().hashCode()); > } > > @Override >Index: src/org/eclipse/mylyn/internal/tasks/core/LocalRepositoryConnector.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/LocalRepositoryConnector.java,v >retrieving revision 1.3 >diff -u -r1.3 LocalRepositoryConnector.java >--- src/org/eclipse/mylyn/internal/tasks/core/LocalRepositoryConnector.java 13 Jun 2007 07:59:44 -0000 1.3 >+++ src/org/eclipse/mylyn/internal/tasks/core/LocalRepositoryConnector.java 13 Jun 2007 16:02:46 -0000 >@@ -11,7 +11,6 @@ > > package org.eclipse.mylyn.internal.tasks.core; > >-import java.util.Collections; > import java.util.Set; > > import org.eclipse.core.runtime.CoreException; >@@ -64,8 +63,8 @@ > > @Override > public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository, >- Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException { >- return Collections.emptySet(); >+ Set<AbstractTask> tasks, IProgressMonitor monitor, QueryHitCollector collector) { >+ return null; > } > > @Override >#P org.eclipse.mylyn.bugzilla.core >Index: src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java,v >retrieving revision 1.61 >diff -u -r1.61 BugzillaRepositoryConnector.java >--- src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java 13 Jun 2007 08:00:14 -0000 1.61 >+++ src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java 13 Jun 2007 16:02:47 -0000 >@@ -225,7 +225,7 @@ > > @Override > public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository, >- Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException { >+ Set<AbstractTask> tasks, IProgressMonitor monitor, QueryHitCollector collector) throws CoreException { > try { > Set<AbstractTask> changedTasks = new HashSet<AbstractTask>(); > >@@ -237,14 +237,16 @@ > if (dateString == null) { > dateString = ""; > } >- String urlQueryBase; >- String urlQueryString; > >- urlQueryBase = repository.getUrl() + CHANGED_BUGS_CGI_QUERY >+ String urlQueryBase = repository.getUrl() + CHANGED_BUGS_CGI_QUERY > + URLEncoder.encode(dateString, repository.getCharacterEncoding()) + CHANGED_BUGS_CGI_ENDDATE; >- >- urlQueryString = urlQueryBase + BUG_ID; >- >+ >+ String urlQueryString = urlQueryBase + BUG_ID; >+ >+ // Need to replace this with query that would return list of tasks since last sync >+ // the trouble is that bugzilla only have 1 hour granularity for "changed since" query >+ // so, we can't say that no tasks has changed in repository >+ > int queryCounter = -1; > Iterator<AbstractTask> itr = tasks.iterator(); > while (itr.hasNext()) { >@@ -256,12 +258,10 @@ > queryForChanged(repository, changedTasks, urlQueryString); > queryCounter = 0; > urlQueryString = urlQueryBase + BUG_ID; >- urlQueryString += newurlQueryString; >- } else if (!itr.hasNext()) { >- urlQueryString += newurlQueryString; >+ } >+ urlQueryString += newurlQueryString; >+ if (!itr.hasNext()) { > queryForChanged(repository, changedTasks, urlQueryString); >- } else { >- urlQueryString += newurlQueryString; > } > } > return changedTasks; >#P org.eclipse.mylyn.jira.ui >Index: src/org/eclipse/mylyn/internal/jira/ui/JiraRepositoryConnector.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.jira.ui/src/org/eclipse/mylyn/internal/jira/ui/JiraRepositoryConnector.java,v >retrieving revision 1.54 >diff -u -r1.54 JiraRepositoryConnector.java >--- src/org/eclipse/mylyn/internal/jira/ui/JiraRepositoryConnector.java 13 Jun 2007 08:00:30 -0000 1.54 >+++ src/org/eclipse/mylyn/internal/jira/ui/JiraRepositoryConnector.java 13 Jun 2007 16:02:47 -0000 >@@ -46,7 +46,6 @@ > import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; > import org.eclipse.mylyn.tasks.core.AbstractTask; > import org.eclipse.mylyn.tasks.core.IAttachmentHandler; >-import org.eclipse.mylyn.tasks.core.AbstractTask; > import org.eclipse.mylyn.tasks.core.ITaskDataHandler; > import org.eclipse.mylyn.tasks.core.QueryHitCollector; > import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute; >@@ -157,9 +156,9 @@ > } > } > >+ @Override > public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository, >- Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException { >- >+ Set<AbstractTask> tasks, IProgressMonitor monitor, QueryHitCollector collector) throws CoreException { > String dateString = repository.getSyncTimeStamp(); > Date lastSyncDate = convertDate(dateString); > if (lastSyncDate == null) { >@@ -187,43 +186,41 @@ > FilterDefinition changedFilter = new FilterDefinition("Changed Tasks"); > changedFilter.setUpdatedDateFilter(new RelativeDateRangeFilter(RangeType.MINUTE, minutes)); > changedFilter.setOrdering(new Order[] { new Order(Order.Field.UPDATED, false) }); >- >- final List<Issue> issues = new ArrayList<Issue>(); >- // unlimited maxHits can create crazy amounts of traffic >- JiraIssueCollector collector = new JiraIssueCollector(new NullProgressMonitor(), issues, 500); >- JiraClient client = JiraClientFacade.getDefault().getJiraClient(repository); >- > // TODO: Need some way to further scope this query > >+ List<Issue> issues = new ArrayList<Issue>(); >+ JiraClient client = JiraClientFacade.getDefault().getJiraClient(repository); >+ // unlimited maxHits can create crazy amounts of traffic >+ JiraIssueCollector issueCollector = new JiraIssueCollector(new NullProgressMonitor(), issues, 500); > try { >- // XXX: disabled work around >- // TODO: remove, added to re-open connection, bug 164543 >- // jiraServer.getServerInfo(); >- // Will get ALL issues that have changed since lastSyncDate >- client.search(changedFilter, collector); >- } catch (JiraException e) { >- throw new CoreException(JiraCorePlugin.toStatus(repository, e)); >- } >- >- Set<AbstractTask> changedTasks = new HashSet<AbstractTask>(); >- for (Issue issue : issues) { >- // String handle = >- // AbstractTask.getHandle(repository.getUrl(), >- // issue.getId()); >- AbstractTask task = TasksUiPlugin.getTaskListManager().getTaskList().getTask(repository.getUrl(), issue.getId()); >- if (task instanceof AbstractTask) { >- changedTasks.add((AbstractTask) task); >+ client.search(changedFilter, issueCollector); >+ >+ if(issues.isEmpty()) { >+ return null; // no hits > } > >- if (issue.getUpdated() != null && issue.getUpdated().after(lastSyncDate)) { >- lastSyncDate = issue.getUpdated(); >+ for (Issue issue : issues) { >+ AbstractTask task = TasksUiPlugin.getTaskListManager().getTaskList().getTask(repository.getUrl(), issue.getId()); >+ if (!tasks.contains(task)) { >+ continue; >+ } >+ >+ RepositoryTaskData taskData = offlineHandler.createTaskData(repository, client, issue); >+ collector.accept(taskData); >+ >+ if (issue.getUpdated() != null && issue.getUpdated().after(lastSyncDate)) { >+ lastSyncDate = issue.getUpdated(); >+ } > } >- } > >- repository.setSyncTimeStamp( // >- new SimpleDateFormat(JiraAttributeFactory.JIRA_DATE_FORMAT, Locale.US).format(lastSyncDate)); >+ repository.setSyncTimeStamp( // >+ new SimpleDateFormat(JiraAttributeFactory.JIRA_DATE_FORMAT, Locale.US).format(lastSyncDate)); >+ >+ return Collections.emptySet(); // no need to synchronize anything > >- return changedTasks; >+ } catch (JiraException e) { >+ throw new CoreException(JiraCorePlugin.toStatus(repository, e)); >+ } > } > > private Date convertDate(String dateString) {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 191575
:
70795
|
71134
|
71135
| 71190 |
71272
|
71273
|
71276
|
71325
|
71344
|
71355
|
71364