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 71272 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.
next patch iteration
synchronize-optimizations.patch (text/plain), 151.22 KB, created by
Steffen Pingel
on 2007-06-14 03:10:10 EDT
(
hide
)
Description:
next patch iteration
Filename:
MIME Type:
Creator:
Steffen Pingel
Created:
2007-06-14 03:10:10 EDT
Size:
151.22 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.mylyn.sandbox.ui >Index: src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaSearchEngine.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/sandbox/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaSearchEngine.java,v >retrieving revision 1.16 >diff -u -r1.16 BugzillaSearchEngine.java >--- src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaSearchEngine.java 8 Jun 2007 03:02:39 -0000 1.16 >+++ src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaSearchEngine.java 14 Jun 2007 06:25:26 -0000 >@@ -29,7 +29,6 @@ > import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants; > import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin; > import org.eclipse.mylyn.internal.tasks.ui.util.WebBrowserDialog; >-import org.eclipse.mylyn.tasks.core.QueryHitCollector; > import org.eclipse.mylyn.tasks.core.TaskRepository; > import org.eclipse.mylyn.tasks.core.UnrecognizedReponseException; > import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; >@@ -87,7 +86,7 @@ > * @param collector - > * The collector for the results to go into > */ >- public IStatus search(QueryHitCollector collector) throws LoginException { >+ public IStatus search(ProgressQueryHitCollector collector) throws LoginException { > return this.search(collector, 0, IBugzillaConstants.RETURN_ALL_HITS); > } > >@@ -99,7 +98,7 @@ > * @param startMatches - > * The number of matches to start with for the progress monitor > */ >- public IStatus search(QueryHitCollector collector, int startMatches) throws LoginException { >+ public IStatus search(ProgressQueryHitCollector collector, int startMatches) throws LoginException { > return this.search(collector, startMatches, BugzillaUiPlugin.getDefault().getMaxResults()); > } > >@@ -115,7 +114,7 @@ > * the maximum number of matches to return or > * IBugzillaConstants.RETURN_ALL_HITS for unlimited > */ >- public IStatus search(QueryHitCollector collector, int startMatches, int maxHits) throws LoginException { >+ public IStatus search(ProgressQueryHitCollector collector, int startMatches, int maxHits) throws LoginException { > IProgressMonitor monitor = collector.getProgressMonitor(); > IStatus status = null; > boolean possibleBadLogin = false; >@@ -136,7 +135,7 @@ > .getRepositoryManager().getRepositoryConnector(BugzillaCorePlugin.REPOSITORY_KIND); > > BugzillaClient client = bugzillaConnector.getClientManager().getClient(repository); >- client.getSearchHits(query); >+ client.getSearchHits(query, collector); > > } catch (CoreException e) { > status = new MultiStatus(BugzillaUiPlugin.PLUGIN_ID, IStatus.ERROR, >Index: src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylarSearchOperation.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/sandbox/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylarSearchOperation.java,v >retrieving revision 1.22 >diff -u -r1.22 BugzillaMylarSearchOperation.java >--- src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylarSearchOperation.java 14 Jun 2007 03:35:27 -0000 1.22 >+++ src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylarSearchOperation.java 14 Jun 2007 06:25:26 -0000 >@@ -34,7 +34,6 @@ > import org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery; > import org.eclipse.mylyn.tasks.core.AbstractTask; > import org.eclipse.mylyn.tasks.core.AbstractTaskContainer; >-import org.eclipse.mylyn.tasks.core.QueryHitCollector; > import org.eclipse.mylyn.tasks.core.RepositoryTaskData; > import org.eclipse.mylyn.tasks.core.TaskComment; > import org.eclipse.mylyn.tasks.core.TaskRepository; >@@ -54,7 +53,7 @@ > private IMember javaElement; > > /** The bugzilla collector for the search */ >- private QueryHitCollector collector = null;//SearchHitCollector >+ private ProgressQueryHitCollector collector = null;//SearchHitCollector > > /** The status of the search operation */ > private IStatus status; >@@ -100,7 +99,7 @@ > @Override > public void execute(IProgressMonitor monitor) { > >- QueryHitCollector searchCollector = null; >+ ProgressQueryHitCollector searchCollector = null; > > if (scope == BugzillaMylarSearch.FULLY_QUAL) { > searchCollector = searchQualified(search.getServerUrl(), monitor); >@@ -141,13 +140,13 @@ > * The progress monitor to search with > * @return The QueryHitCollector with the results of the search > */ >- private QueryHitCollector searchLocalQual(IProgressMonitor monitor) { >+ private ProgressQueryHitCollector searchLocalQual(IProgressMonitor monitor) { > > // get the fully qualified name for searching > String elementName = getFullyQualifiedName(javaElement); > > // setup the search result collector >- collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList()); >+ collector = new ProgressQueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList()); > //collector.setOperation(this); > collector.setProgressMonitor(monitor); > >@@ -169,13 +168,13 @@ > * The progress monitor to search with > * @return The QueryHitCollector with the results of the search > */ >- private QueryHitCollector searchLocalUnQual(IProgressMonitor monitor) { >+ private ProgressQueryHitCollector searchLocalUnQual(IProgressMonitor monitor) { > > // get the element name for searching > String elementName = javaElement.getElementName(); > > // setup the search result collector >- collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList()); >+ collector = new ProgressQueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList()); > //collector.setOperation(this); > collector.setProgressMonitor(monitor); > >@@ -201,7 +200,7 @@ > * @param monitor > * The progress monitor > */ >- private void searchLocal(Set<AbstractTask> tasks, QueryHitCollector searchCollector, String elementName, >+ private void searchLocal(Set<AbstractTask> tasks, ProgressQueryHitCollector searchCollector, String elementName, > IProgressMonitor monitor) { > if (tasks == null) > return; >@@ -279,8 +278,8 @@ > * The progress monitor to use for the search > * @return The QueryHitCollector with the search results > */ >- private QueryHitCollector search(String url, TaskRepository repository, >- QueryHitCollector searchCollector, IProgressMonitor monitor) { >+ private ProgressQueryHitCollector search(String url, TaskRepository repository, >+ ProgressQueryHitCollector searchCollector, IProgressMonitor monitor) { > > // set the initial number of matches to 0 > int matches = 0; >@@ -316,9 +315,9 @@ > * The progress monitor to use > * @return The QueryHitCollector with the search results > */ >- private QueryHitCollector searchQualified(String repositoryUrl, IProgressMonitor monitor) { >+ private ProgressQueryHitCollector searchQualified(String repositoryUrl, IProgressMonitor monitor) { > // create a new collector for the results >- collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList()); >+ collector = new ProgressQueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList()); > //collector.setOperation(this); > collector.setProgressMonitor(monitor); > >@@ -336,9 +335,9 @@ > * The progress monitor to use > * @return The QueryHitCollector with the search results > */ >- private QueryHitCollector searchUnqualified(String repositoryUrl, IProgressMonitor monitor) { >+ private ProgressQueryHitCollector searchUnqualified(String repositoryUrl, IProgressMonitor monitor) { > // create a new collector for the results >- collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList()); >+ collector = new ProgressQueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList()); > //collector.setOperation(this); > collector.setProgressMonitor(monitor); > >Index: src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/ProgressQueryHitCollector.java >=================================================================== >RCS file: src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/ProgressQueryHitCollector.java >diff -N src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/ProgressQueryHitCollector.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/ProgressQueryHitCollector.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,137 @@ >+/******************************************************************************* >+ * 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.internal.sandbox.bridge.bugs; >+ >+import java.text.MessageFormat; >+import java.util.HashSet; >+import java.util.Set; >+ >+import org.eclipse.core.runtime.CoreException; >+import org.eclipse.core.runtime.IProgressMonitor; >+import org.eclipse.core.runtime.NullProgressMonitor; >+import org.eclipse.core.runtime.SubProgressMonitor; >+import org.eclipse.mylyn.tasks.core.AbstractTask; >+import org.eclipse.mylyn.tasks.core.ITaskCollector; >+import org.eclipse.mylyn.tasks.core.ITaskFactory; >+import org.eclipse.mylyn.tasks.core.RepositoryTaskData; >+import org.eclipse.mylyn.tasks.core.TaskList; >+ >+public class ProgressQueryHitCollector implements ITaskCollector { >+ >+ public static final int MAX_HITS = 5000; >+ >+ public static final String MAX_HITS_REACHED = "Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope."; >+ >+ protected Set<AbstractTask> taskResults = new HashSet<AbstractTask>(); >+ >+ /** The progress monitor for the search operation */ >+ private IProgressMonitor monitor = new NullProgressMonitor(); >+ >+ /** The number of matches found */ >+ private int matchCount; >+ >+ /** The string to display to the user while querying */ >+ private static final String STARTING = "querying the server"; >+ >+ /** The string to display to the user when we have 1 match */ >+ private static final String MATCH = "1 match"; >+ >+ /** The string to display to the user when we have multiple or no matches */ >+ private static final String MATCHES = "{0} matches"; >+ >+ /** The string to display to the user when the query is done */ >+ private static final String DONE = "done"; >+ >+ protected TaskList taskList; >+ >+ protected ITaskFactory taskFactory; >+ >+ public ProgressQueryHitCollector(TaskList tasklist, ITaskFactory taskFactory) { >+ this.taskList = tasklist; >+ this.taskFactory = taskFactory; >+ } >+ >+ public void aboutToStart(int startMatchCount) throws CoreException { >+ taskResults.clear(); >+ matchCount = startMatchCount; >+ monitor.setTaskName(STARTING); >+ } >+ >+ public void accept(AbstractTask task) { >+ >+ if (!getProgressMonitor().isCanceled()) { >+ getProgressMonitor().subTask(getFormattedMatchesString(matchCount)); >+ getProgressMonitor().worked(1); >+ } >+ >+ if (task == null) >+ return; >+ >+ AbstractTask hitTask = taskList.getTask(task.getHandleIdentifier()); >+ if (hitTask == null) { >+ hitTask = task; >+ // task is new, add to tasklist >+ taskList.addTask(hitTask); >+ } >+ taskResults.add((AbstractTask) hitTask); >+ matchCount++; >+ } >+ >+ public void accept(RepositoryTaskData taskData) throws CoreException { >+ if (taskData == null) >+ return; >+ >+ if (!getProgressMonitor().isCanceled()) { >+ getProgressMonitor().subTask(getFormattedMatchesString(matchCount)); >+ getProgressMonitor().worked(1); >+ } >+ >+ AbstractTask task = taskFactory.createTask(taskData, true, false, new SubProgressMonitor(monitor, 1)); >+ taskResults.add(task); >+ matchCount++; >+ } >+ >+ public void done() { >+ if (monitor != null && !monitor.isCanceled()) { >+ // if the operation is cancelled, finish with the data that we >+ // already have >+ String matchesString = getFormattedMatchesString(matchCount); >+ monitor.setTaskName(MessageFormat.format(DONE, new Object[] { matchesString })); >+ monitor.done(); >+ } >+ >+ // Cut no longer used references because the collector might be re-used >+ monitor = null; >+ } >+ >+ protected String getFormattedMatchesString(int count) { >+ if (count == 1) { >+ return MATCH; >+ } >+ Object[] messageFormatArgs = { new Integer(count) }; >+ return MessageFormat.format(MATCHES, messageFormatArgs); >+ } >+ >+ public IProgressMonitor getProgressMonitor() { >+ return monitor; >+ } >+ >+ public void setProgressMonitor(IProgressMonitor monitor) { >+ this.monitor = monitor; >+ } >+ >+ public Set<AbstractTask> getTaskHits() { >+ return taskResults; >+ } >+ >+ public void clear() { >+ taskResults.clear(); >+ } >+ >+} >#P org.eclipse.mylyn.tasks.core >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 14 Jun 2007 06:25:26 -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/tasks/core/AbstractTask.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTask.java,v >retrieving revision 1.5 >diff -u -r1.5 AbstractTask.java >--- src/org/eclipse/mylyn/tasks/core/AbstractTask.java 14 Jun 2007 05:18:59 -0000 1.5 >+++ src/org/eclipse/mylyn/tasks/core/AbstractTask.java 14 Jun 2007 06:25:26 -0000 >@@ -66,6 +66,8 @@ > > // transient > private IStatus errorStatus = null; >+ >+ private boolean needsSynchronization = false; > > public enum RepositoryTaskSyncState { > OUTGOING, SYNCHRONIZED, INCOMING, CONFLICT >@@ -442,4 +444,13 @@ > public void setDueDate(Date date) { > this.dueDate = date; > } >+ >+ public boolean getNeedsSynchronization() { >+ return needsSynchronization; >+ } >+ >+ public void setNeedsSynchronization(boolean needsSynchronization) { >+ this.needsSynchronization = needsSynchronization; >+ } >+ > } >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.43 >diff -u -r1.43 AbstractRepositoryConnector.java >--- src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java 13 Jun 2007 18:09:31 -0000 1.43 >+++ src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java 14 Jun 2007 06:25:26 -0000 >@@ -171,7 +171,7 @@ > * IQueryHitCollector that collects the hits found > */ > public abstract IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, >- IProgressMonitor monitor, QueryHitCollector resultCollector, boolean forced); >+ IProgressMonitor monitor, ITaskCollector resultCollector); > > /** > * The connector's summary i.e. "JIRA (supports 3.3.1 and later)" >@@ -250,18 +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. >+ * @param tasks TODO >+ * >+ * @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, >+ public abstract boolean updateNeedsSynchronization(TaskRepository repository, > Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException; > > /** >@@ -392,7 +397,7 @@ > * synchronization timestamp. Override to return actual timestamp from > * repository. > */ >- public String getLastSyncTimestamp(TaskRepository repository, Set<AbstractTask> changedTasks) { >+ public String getSynchronizationTimestamp(TaskRepository repository, Set<AbstractTask> changedTasks) { > Date mostRecent = new Date(0); > String mostRecentTimeStamp = repository.getSyncTimeStamp(); > for (AbstractTask task : changedTasks) { >@@ -432,4 +437,5 @@ > this.taskDataManager = taskDataManager; > } > >+ > } >Index: src/org/eclipse/mylyn/tasks/core/QueryHitCollector.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/QueryHitCollector.java,v >retrieving revision 1.11 >diff -u -r1.11 QueryHitCollector.java >--- src/org/eclipse/mylyn/tasks/core/QueryHitCollector.java 13 Jun 2007 18:09:31 -0000 1.11 >+++ src/org/eclipse/mylyn/tasks/core/QueryHitCollector.java 14 Jun 2007 06:25:26 -0000 >@@ -10,131 +10,62 @@ > *******************************************************************************/ > package org.eclipse.mylyn.tasks.core; > >-import java.text.MessageFormat; > import java.util.HashSet; > import java.util.Set; > > import org.eclipse.core.runtime.CoreException; >-import org.eclipse.core.runtime.IProgressMonitor; > import org.eclipse.core.runtime.NullProgressMonitor; >-import org.eclipse.core.runtime.SubProgressMonitor; > > /** > * Collects QueryHits resulting from repository search > * > * @author Shawn Minto > * @author Rob Elves (generalized from bugzilla) >+ * @author Steffen Pingel > */ >-public class QueryHitCollector { >+public class QueryHitCollector implements ITaskCollector { > > public static final int MAX_HITS = 5000; > > public static final String MAX_HITS_REACHED = "Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope."; > >- protected Set<AbstractTask> taskResults = new HashSet<AbstractTask>(); >+ private final Set<AbstractTask> taskResults = new HashSet<AbstractTask>(); > >- /** The progress monitor for the search operation */ >- private IProgressMonitor monitor = new NullProgressMonitor(); >+ private final TaskList taskList; > >- /** The number of matches found */ >- private int matchCount; >- >- /** The string to display to the user while querying */ >- private static final String STARTING = "querying the server"; >- >- /** The string to display to the user when we have 1 match */ >- private static final String MATCH = "1 match"; >- >- /** The string to display to the user when we have multiple or no matches */ >- private static final String MATCHES = "{0} matches"; >- >- /** The string to display to the user when the query is done */ >- private static final String DONE = "done"; >- >- protected TaskList taskList; >- >- protected ITaskFactory taskFactory; >+ private final ITaskFactory taskFactory; > > public QueryHitCollector(TaskList tasklist, ITaskFactory taskFactory) { > this.taskList = tasklist; > this.taskFactory = taskFactory; > } > >- public void aboutToStart(int startMatchCount) throws CoreException { >- taskResults.clear(); >- matchCount = startMatchCount; >- monitor.setTaskName(STARTING); >- } >- > public void accept(AbstractTask task) { >- >- if (!getProgressMonitor().isCanceled()) { >- getProgressMonitor().subTask(getFormattedMatchesString(matchCount)); >- getProgressMonitor().worked(1); >+ if (task == null) { >+ throw new IllegalArgumentException(); > } >- >- if (task == null) >- return; >- >- AbstractTask hitTask = taskList.getTask(task.getHandleIdentifier()); >- if (hitTask == null) { >- hitTask = task; >- // task is new, add to tasklist >- taskList.addTask(hitTask); >+ >+ AbstractTask existingTask = taskList.getTask(task.getHandleIdentifier()); >+ if (existingTask == null) { >+ task.setNeedsSynchronization(true); >+ } else { >+ task.setNeedsSynchronization(existingTask.getNeedsSynchronization()); > } >- taskResults.add((AbstractTask) hitTask); >- matchCount++; >+ >+ taskResults.add((AbstractTask) task); > } > > public void accept(RepositoryTaskData taskData) throws CoreException { >- if (taskData == null) >- return; >- >- if (!getProgressMonitor().isCanceled()) { >- getProgressMonitor().subTask(getFormattedMatchesString(matchCount)); >- getProgressMonitor().worked(1); >+ if (taskData == null) { >+ throw new IllegalArgumentException(); > } > >- AbstractTask task = taskFactory.createTask(taskData, true, false, new SubProgressMonitor(monitor, 1)); >+ AbstractTask task = taskFactory.createTask(taskData, true, false, new NullProgressMonitor()); > taskResults.add(task); >- matchCount++; >- } >- >- public void done() { >- if (monitor != null && !monitor.isCanceled()) { >- // if the operation is cancelled, finish with the data that we >- // already have >- String matchesString = getFormattedMatchesString(matchCount); >- monitor.setTaskName(MessageFormat.format(DONE, new Object[] { matchesString })); >- monitor.done(); >- } >- >- // Cut no longer used references because the collector might be re-used >- monitor = null; >- } >- >- protected String getFormattedMatchesString(int count) { >- if (count == 1) { >- return MATCH; >- } >- Object[] messageFormatArgs = { new Integer(count) }; >- return MessageFormat.format(MATCHES, messageFormatArgs); >- } >- >- public IProgressMonitor getProgressMonitor() { >- return monitor; >- } >- >- public void setProgressMonitor(IProgressMonitor monitor) { >- this.monitor = monitor; > } > > public Set<AbstractTask> getTaskHits() { > return taskResults; > } > >- public void clear() { >- taskResults.clear(); >- } >- > } >Index: src/org/eclipse/mylyn/tasks/core/DelegatingTaskExternalizer.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/DelegatingTaskExternalizer.java,v >retrieving revision 1.49 >diff -u -r1.49 DelegatingTaskExternalizer.java >--- src/org/eclipse/mylyn/tasks/core/DelegatingTaskExternalizer.java 14 Jun 2007 05:18:59 -0000 1.49 >+++ src/org/eclipse/mylyn/tasks/core/DelegatingTaskExternalizer.java 14 Jun 2007 06:25:26 -0000 >@@ -130,6 +130,8 @@ > public static final String KEY_SYNC_STATE = "offlineSyncState"; > > public static final String KEY_OWNER = "Owner"; >+ >+ public static final String KEY_NEEDS_SYNCHRONIZATION = "NeedsSynchronization"; > > private List<ITaskListExternalizer> delegateExternalizers = new ArrayList<ITaskListExternalizer>(); > >@@ -204,6 +206,11 @@ > } else { > node.setAttribute(KEY_REMINDED, VAL_FALSE); > } >+ if (task.getNeedsSynchronization()) { >+ node.setAttribute(KEY_NEEDS_SYNCHRONIZATION, VAL_TRUE); >+ } else { >+ node.setAttribute(KEY_NEEDS_SYNCHRONIZATION, VAL_FALSE); >+ } > > if (task instanceof AbstractTask) { > AbstractTask abstractTask = (AbstractTask) task; >@@ -484,6 +491,11 @@ > } else { > task.setReminded(false); > } >+ if (element.hasAttribute(KEY_NEEDS_SYNCHRONIZATION) && element.getAttribute(KEY_NEEDS_SYNCHRONIZATION).compareTo(VAL_TRUE) == 0) { >+ task.setNeedsSynchronization(true); >+ } else { >+ task.setNeedsSynchronization(false); >+ } > > if (task instanceof AbstractTask) { > AbstractTask abstractTask = (AbstractTask) task; >Index: .refactorings/2007/6/24/refactorings.index >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/24/refactorings.index,v >retrieving revision 1.8 >diff -u -r1.8 refactorings.index >--- .refactorings/2007/6/24/refactorings.index 14 Jun 2007 03:35:22 -0000 1.8 >+++ .refactorings/2007/6/24/refactorings.index 14 Jun 2007 06:25:26 -0000 >@@ -23,6 +23,11 @@ > 1181767990694 Rename type 'AbstractTaskListElement' > 1181769454884 Rename type 'DateRangeContainer' > 1181769501743 Rename type 'DateRangeActivityDelegate' >-1181781818576 Rename method 'notifyLocalInfoChanged' >-1181788002784 Rename method 'add' >-1181788017786 Rename method 'remove' >+1181782714681 Rename method 'getChangedSinceLastSync' >+1181782786972 Change method 'updateNeedSynchronization' >+1181785485666 Change method 'performQuery' >+1181789110090 Change method 'updateNeedsSynchronization' >+1181791320957 Change method 'performQuery' >+1181799708110 Rename type 'IQueryHitCollector' >+1181800787610 Rename method 'getLastModifiedTimestamp' >+1181800884406 Rename method 'getTaskRepositorySynchronizationTimestamp' >Index: .refactorings/2007/6/24/refactorings.history >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/24/refactorings.history,v >retrieving revision 1.8 >diff -u -r1.8 refactorings.history >--- .refactorings/2007/6/24/refactorings.history 14 Jun 2007 03:35:22 -0000 1.8 >+++ .refactorings/2007/6/24/refactorings.history 14 Jun 2007 06:25:26 -0000 >@@ -1,4 +1,4 @@ >-<?xml version="1.0" encoding="utf-8" standalone="no"?> >+<?xml version="1.0" encoding="utf-8"?> > <session version="1.0"> > <refactoring comment="Rename field 'DESCRIPTION_DEFAULT' in 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector' to 'DEFAULT_SUMMARY' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector.DESCRIPTION_DEFAULT' - Renamed element: 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector.DEFAULT_SUMMARY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'DESCRIPTION_DEFAULT'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.core{LocalRepositoryConnector.java[LocalRepositoryConnector^DESCRIPTION_DEFAULT" name="DEFAULT_SUMMARY" references="true" setter="false" stamp="1181677842500" textual="true" version="1.0"/> > <refactoring comment="Push down members from 'org.eclipse.mylyn.tasks.core.Task' - Original project: 'org.eclipse.mylyn.tasks.core' - Original elements: org.eclipse.mylyn.tasks.core.Task.active org.eclipse.mylyn.tasks.core.Task.hasReminded org.eclipse.mylyn.tasks.core.Task.summary org.eclipse.mylyn.tasks.core.Task.priority org.eclipse.mylyn.tasks.core.Task.notes org.eclipse.mylyn.tasks.core.Task.estimatedTimeHours org.eclipse.mylyn.tasks.core.Task.completed org.eclipse.mylyn.tasks.core.Task.taskUrl org.eclipse.mylyn.tasks.core.Task.parentCategory org.eclipse.mylyn.tasks.core.Task.completionDate org.eclipse.mylyn.tasks.core.Task.creationDate org.eclipse.mylyn.tasks.core.Task.scheduledForDate org.eclipse.mylyn.tasks.core.Task.dueDate org.eclipse.mylyn.tasks.core.Task.kind org.eclipse.mylyn.tasks.core.Task.toString() org.eclipse.mylyn.tasks.core.Task.setActive(...) org.eclipse.mylyn.tasks.core.Task.isActive() org.eclipse.mylyn.tasks.core.Task.equals(...) org.eclipse.mylyn.tasks.core.Task.hashCode() org.eclipse.mylyn.tasks.core.Task.isCompleted() org.eclipse.mylyn.tasks.core.Task.setCompleted(...) org.eclipse.mylyn.tasks.core.Task.getPriority() org.eclipse.mylyn.tasks.core.Task.setPriority(...) org.eclipse.mylyn.tasks.core.Task.setTaskUrl(...) org.eclipse.mylyn.tasks.core.Task.getTaskUrl() org.eclipse.mylyn.tasks.core.Task.getNotes() org.eclipse.mylyn.tasks.core.Task.setNotes(...) org.eclipse.mylyn.tasks.core.Task.getEstimateTimeHours() org.eclipse.mylyn.tasks.core.Task.setEstimatedTimeHours(...) org.eclipse.mylyn.tasks.core.Task.setContainer(...) org.eclipse.mylyn.tasks.core.Task.getContainer() org.eclipse.mylyn.tasks.core.Task.getSummary() org.eclipse.mylyn.tasks.core.Task.getCompletionDate() org.eclipse.mylyn.tasks.core.Task.setScheduledForDate(...) org.eclipse.mylyn.tasks.core.Task.getScheduledForDate() org.eclipse.mylyn.tasks.core.Task.hasBeenReminded() org.eclipse.mylyn.tasks.core.Task.setReminded(...) org.eclipse.mylyn.tasks.core.Task.getCreationDate() org.eclipse.mylyn.tasks.core.Task.setCreationDate(...) org.eclipse.mylyn.tasks.core.Task.setSummary(...) org.eclipse.mylyn.tasks.core.Task.setCompletionDate(...) org.eclipse.mylyn.tasks.core.Task.isPastReminder() org.eclipse.mylyn.tasks.core.Task.hasValidUrl() org.eclipse.mylyn.tasks.core.Task.getTaskKind() org.eclipse.mylyn.tasks.core.Task.setKind(...) org.eclipse.mylyn.tasks.core.Task.compareTo(...) org.eclipse.mylyn.tasks.core.Task.getDueDate() org.eclipse.mylyn.tasks.core.Task.setDueDate(...) - Pushed members: org.eclipse.mylyn.tasks.core.Task.active org.eclipse.mylyn.tasks.core.Task.hasReminded org.eclipse.mylyn.tasks.core.Task.summary org.eclipse.mylyn.tasks.core.Task.priority org.eclipse.mylyn.tasks.core.Task.notes org.eclipse.mylyn.tasks.core.Task.estimatedTimeHours org.eclipse.mylyn.tasks.core.Task.completed org.eclipse.mylyn.tasks.core.Task.taskUrl org.eclipse.mylyn.tasks.core.Task.parentCategory org.eclipse.mylyn.tasks.core.Task.completionDate org.eclipse.mylyn.tasks.core.Task.creationDate org.eclipse.mylyn.tasks.core.Task.scheduledForDate org.eclipse.mylyn.tasks.core.Task.dueDate org.eclipse.mylyn.tasks.core.Task.kind org.eclipse.mylyn.tasks.core.Task.toString() org.eclipse.mylyn.tasks.core.Task.setActive(...) org.eclipse.mylyn.tasks.core.Task.isActive() org.eclipse.mylyn.tasks.core.Task.equals(...) org.eclipse.mylyn.tasks.core.Task.hashCode() org.eclipse.mylyn.tasks.core.Task.isCompleted() org.eclipse.mylyn.tasks.core.Task.setCompleted(...) org.eclipse.mylyn.tasks.core.Task.getPriority() org.eclipse.mylyn.tasks.core.Task.setPriority(...) org.eclipse.mylyn.tasks.core.Task.setTaskUrl(...) org.eclipse.mylyn.tasks.core.Task.getTaskUrl() org.eclipse.mylyn.tasks.core.Task.getNotes() org.eclipse.mylyn.tasks.core.Task.setNotes(...) org.eclipse.mylyn.tasks.core.Task.getEstimateTimeHours() org.eclipse.mylyn.tasks.core.Task.setEstimatedTimeHours(...) org.eclipse.mylyn.tasks.core.Task.setContainer(...) org.eclipse.mylyn.tasks.core.Task.getContainer() org.eclipse.mylyn.tasks.core.Task.getSummary() org.eclipse.mylyn.tasks.core.Task.getCompletionDate() org.eclipse.mylyn.tasks.core.Task.setScheduledForDate(...) org.eclipse.mylyn.tasks.core.Task.getScheduledForDate() org.eclipse.mylyn.tasks.core.Task.hasBeenReminded() org.eclipse.mylyn.tasks.core.Task.setReminded(...) org.eclipse.mylyn.tasks.core.Task.getCreationDate() org.eclipse.mylyn.tasks.core.Task.setCreationDate(...) org.eclipse.mylyn.tasks.core.Task.setSummary(...) org.eclipse.mylyn.tasks.core.Task.setCompletionDate(...) org.eclipse.mylyn.tasks.core.Task.isPastReminder() org.eclipse.mylyn.tasks.core.Task.hasValidUrl() org.eclipse.mylyn.tasks.core.Task.getTaskKind() org.eclipse.mylyn.tasks.core.Task.setKind(...) org.eclipse.mylyn.tasks.core.Task.compareTo(...) org.eclipse.mylyn.tasks.core.Task.getDueDate() org.eclipse.mylyn.tasks.core.Task.setDueDate(...)" description="Push down" element1="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^active" element10="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^completionDate" element11="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^creationDate" element12="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^scheduledForDate" element13="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^dueDate" element14="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~toSt" element15="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~toString" element16="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isActivee~Z" element17="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isActive" element18="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~hashCodeObject;" element19="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~hashCode" element2="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isCompleted" element20="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isCompleted" element21="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getPriorityd~Z" element22="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getPriority" element23="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setTaskUrl~QString;;" element24="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setTaskUrl~QString;" element25="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getNotesrl" element26="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getNotes" element27="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getEstimateTimeHo" element28="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getEstimateTimeHours" element29="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^summarymatedTimeHours~I" element3="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^summary" element30="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getContainer~QAbstractTaskContainer;" element31="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getContainer" element32="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getComplet" element33="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getCompletionDate" element34="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getScheduledForDate~QDate;" element35="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getScheduledForDate" element36="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setReminded~Zed" element37="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setReminded~Z" element38="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setCreationDate" element39="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setCreationDate~QDate;" element4="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setSumma" element40="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setSummary~QString;" element41="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isPastReminderate~QDate;" element42="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isPastReminder" element43="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getTaskKind" element44="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getTaskKind" element45="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~compareTo~QITask" element46="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~compareTo~QITaskListElement;" element47="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setDueDate" element48="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setDueDate~QDate;" element5="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^estim" element6="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^estimatedTimeHours" element7="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^taskUrled" element8="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^taskUrl" element9="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^parentCategory" flags="589830" id="org.eclipse.jdt.ui.push.down" input="/src<org.eclipse.mylyn.tasks.core{Task.java[Task" push1="true" push10="true" push11="true" push12="true" push13="true" push14="true" push15="true" push16="true" push17="true" push18="true" push19="true" push2="true" push20="true" push21="true" push22="true" push23="true" push24="true" push25="true" push26="true" push27="true" push28="true" push29="true" push3="true" push30="true" push31="true" push32="true" push33="true" push34="true" push35="true" push36="true" push37="true" push38="true" push39="true" push4="true" push40="true" push41="true" push42="true" push43="true" push44="true" push45="true" push46="true" push47="true" push48="true" push5="true" push6="true" push7="true" push8="true" push9="true" stamp="1181700191533" version="1.0"/> >@@ -21,12 +21,16 @@ > <refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.UnfiledCategory.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{UnfiledCategory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1181766121554" units="1" version="1.0"/> > <refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original elements: org.eclipse.mylyn.tasks.core.DateRangeActivityDelegate.java org.eclipse.mylyn.tasks.core.DateRangeContainer.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{DateRangeActivityDelegate.java" element2="/src<org.eclipse.mylyn.tasks.core{DateRangeContainer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181766148799" units="2" version="1.0"/> > <refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskArchive.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{TaskArchive.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181766292096" units="1" version="1.0"/> >- > <refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer' to 'AbstractTaskCategory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskCategory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer" matchStrategy="1" name="AbstractTaskCategory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181767911702" textual="false" version="1.0"/> > <refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement' to 'AbstractTaskContainer' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskListElement'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListElement.java[AbstractTaskListElement" matchStrategy="1" name="AbstractTaskContainer" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181767990694" textual="false" version="1.0"/> > <refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.DateRangeContainer' to 'ScheduledTaskContainer' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.DateRangeContainer' - Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'DateRangeContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{DateRangeContainer.java[DateRangeContainer" matchStrategy="1" name="ScheduledTaskContainer" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181769454884" textual="false" version="1.0"/> > <refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.DateRangeActivityDelegate' to 'ScheduledTaskDelegate' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.DateRangeActivityDelegate' - Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ScheduledTaskDelegate' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'DateRangeActivityDelegate'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{DateRangeActivityDelegate.java[DateRangeActivityDelegate" matchStrategy="1" name="ScheduledTaskDelegate" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181769501743" textual="false" version="1.0"/> >-<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.notifyLocalInfoChanged(...)' to 'notifyTaskChanged' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.notifyLocalInfoChanged(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.notifyTaskChanged(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'notifyLocalInfoChanged'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~notifyLocalInfoChanged~QAbstractTask;" name="notifyTaskChanged" references="true" stamp="1181781818576" version="1.0"/> >-<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.add(...)' to 'addChild' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.add(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.addChild(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'add'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~add~QAbstractTask;" name="addChild" references="true" stamp="1181788002784" version="1.0"/> >-<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.remove(...)' to 'removeChild' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.remove(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.removeChild(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'remove'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~remove~QAbstractTask;" name="removeChild" references="true" stamp="1181788017786" version="1.0"/> >+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getChangedSinceLastSync(...)' to 'updateNeedSynchronization' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getChangedSinceLastSync(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateNeedSynchronization(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getChangedSinceLastSync'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getChangedSinceLastSync~QTaskRepository;~QSet\<QAbstractTask;>;~QIProgressMonitor;~QQueryHitCollector;" name="updateNeedSynchronization" references="true" stamp="1181782714681" version="1.0"/> >+<refactoring comment="Change method 'public Set<AbstractTask> org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateNeedSynchronization(TaskRepository repository, Set<AbstractTask> tasks, IProgressMonitor monitor, QueryHitCollector collector) throws CoreException' to 'public boolean updateNeedsSynchronization(TaskRepository repository, IProgressMonitor monitor) throws CoreException' - Original project: 'org.eclipse.mylyn.tasks.core' - New name: 'updateNeedsSynchronization' - New return type: 'boolean' - Removed parameters: Set<AbstractTask> tasks QueryHitCollector collector" delegate="false" deprecate="true" description="Change method 'updateNeedSynchronization'" element1="/\/usr\/local\/eclipse-3.3RC4\/plugins\/org.eclipse.equinox.common_3.3.0.v20070426.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateNeedSynchronization~QTaskRepository;~QSet\<QAbstractTask;>;~QIProgressMonitor;~QQueryHitCollector;" kind1="0" name="updateNeedsSynchronization" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="Set<AbstractTask> tasks 1 Set<AbstractTask> tasks true" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" parameter4="QueryHitCollector collector 3 QueryHitCollector collector true" return="boolean" stamp="1181782786972" version="1.0"/> >+<refactoring comment="Change method 'public IStatus org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, QueryHitCollector resultCollector, boolean forced)' to 'public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, QueryHitCollector resultCollector)' - Original project: 'org.eclipse.mylyn.tasks.core' - Removed parameters: boolean forced" delegate="false" deprecate="true" description="Change method 'performQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~performQuery~QAbstractRepositoryQuery;~QTaskRepository;~QIProgressMonitor;~QQueryHitCollector;~Z" name="performQuery" parameter1="AbstractRepositoryQuery query 0 AbstractRepositoryQuery query false" parameter2="TaskRepository repository 1 TaskRepository repository false" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" parameter4="QueryHitCollector resultCollector 3 QueryHitCollector resultCollector false" parameter5="boolean forced 4 boolean forced true" stamp="1181785485666" version="1.0"/> >+<refactoring comment="Change method 'public boolean org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateNeedsSynchronization(TaskRepository repository, IProgressMonitor monitor) throws CoreException' to 'public boolean updateNeedsSynchronization(TaskRepository repository, Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException' - Original project: 'org.eclipse.mylyn.tasks.core' - Added parameters: Set<AbstractTask> tasks" default2="foo" delegate="false" deprecate="true" description="Change method 'updateNeedsSynchronization'" element1="/\/usr\/local\/eclipse-3.3RC4\/plugins\/org.eclipse.equinox.common_3.3.0.v20070426.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateNeedsSynchronization~QTaskRepository;~QIProgressMonitor;" kind1="0" name="updateNeedsSynchronization" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2=" -1 Set<AbstractTask> tasks false" parameter3="IProgressMonitor monitor 1 IProgressMonitor monitor false" stamp="1181789110090" version="1.0"/> >+<refactoring comment="Change method 'public IStatus org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, IQueryHitCollector resultCollector)' to 'public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, IQueryHitCollector resultCollector)' - Original project: 'org.eclipse.mylyn.tasks.core' - Changed parameters: QueryHitCollector resultCollector" delegate="false" deprecate="true" description="Change method 'performQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~performQuery~QAbstractRepositoryQuery;~QTaskRepository;~QIProgressMonitor;~QQueryHitCollector;" name="performQuery" parameter1="AbstractRepositoryQuery query 0 AbstractRepositoryQuery query false" parameter2="TaskRepository repository 1 TaskRepository repository false" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" parameter4="QueryHitCollector resultCollector 3 IQueryHitCollector resultCollector false" stamp="1181791320957" version="1.0"/> >+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.IQueryHitCollector' to 'ITaskCollector' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IQueryHitCollector' - Renamed element: 'org.eclipse.mylyn.tasks.core.ITaskCollector' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'IQueryHitCollector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{IQueryHitCollector.java[IQueryHitCollector" matchStrategy="1" name="ITaskCollector" qualified="false" references="true" similarDeclarations="false" stamp="1181799708110" textual="false" version="1.0"/> >+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getLastModifiedTimestamp(...)' to 'getTaskRepositorySynchronizationTimestamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getLastModifiedTimestamp(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getTaskRepositorySynchronizationTimestamp(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getLastModifiedTimestamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getLastModifiedTimestamp~QTaskRepository;~QSet\<QAbstractTask;>;" name="getTaskRepositorySynchronizationTimestamp" references="true" stamp="1181800787610" version="1.0"/> >+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getTaskRepositorySynchronizationTimestamp(...)' to 'getSynchronizationTimestamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getTaskRepositorySynchronizationTimestamp(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getSynchronizationTimestamp(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskRepositorySynchronizationTimestamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getTaskRepositorySynchronizationTimestamp~QTaskRepository;~QSet\<QAbstractTask;>;" name="getSynchronizationTimestamp" references="true" stamp="1181800884406" version="1.0"/> > </session> >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 14 Jun 2007 06:25:26 -0000 >@@ -11,7 +11,7 @@ > > package org.eclipse.mylyn.internal.tasks.core; > >-import java.util.Collections; >+ > import java.util.Set; > > import org.eclipse.core.runtime.CoreException; >@@ -21,8 +21,8 @@ > 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.ITaskCollector; > import org.eclipse.mylyn.tasks.core.ITaskDataHandler; >-import org.eclipse.mylyn.tasks.core.QueryHitCollector; > import org.eclipse.mylyn.tasks.core.RepositoryTaskData; > import org.eclipse.mylyn.tasks.core.TaskRepository; > >@@ -63,9 +63,9 @@ > } > > @Override >- public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository, >- Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException { >- return Collections.emptySet(); >+ public boolean updateNeedsSynchronization(TaskRepository repository, >+ Set<AbstractTask> tasks, IProgressMonitor monitor) { >+ return false; > } > > @Override >@@ -104,7 +104,7 @@ > > @Override > public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, >- QueryHitCollector resultCollector, boolean forced) { >+ ITaskCollector resultCollector) { > // ignore > return null; > } >Index: src/org/eclipse/mylyn/tasks/core/ITaskCollector.java >=================================================================== >RCS file: src/org/eclipse/mylyn/tasks/core/ITaskCollector.java >diff -N src/org/eclipse/mylyn/tasks/core/ITaskCollector.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/mylyn/tasks/core/ITaskCollector.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,22 @@ >+/******************************************************************************* >+ * Copyright (c) 2004 - 2006 University Of British Columbia and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * University Of British Columbia - initial API and implementation >+ *******************************************************************************/ >+ >+package org.eclipse.mylyn.tasks.core; >+ >+import org.eclipse.core.runtime.CoreException; >+ >+public interface ITaskCollector { >+ >+ void accept(AbstractTask task); >+ >+ void accept(RepositoryTaskData taskData) throws CoreException; >+ >+} >#P org.eclipse.mylyn.jira.tests >Index: src/org/eclipse/mylyn/jira/tests/JiraFilterTest.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.jira.tests/src/org/eclipse/mylyn/jira/tests/JiraFilterTest.java,v >retrieving revision 1.44 >diff -u -r1.44 JiraFilterTest.java >--- src/org/eclipse/mylyn/jira/tests/JiraFilterTest.java 13 Jun 2007 18:09:30 -0000 1.44 >+++ src/org/eclipse/mylyn/jira/tests/JiraFilterTest.java 14 Jun 2007 06:25:27 -0000 >@@ -136,7 +136,7 @@ > > QueryHitCollector hitCollector = new QueryHitCollector(taskList, new TaskFactory(repository)); > >- connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector, false); >+ connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector); > assertEquals(1, hitCollector.getTaskHits().size()); > assertEquals(issue.getSummary(), hitCollector.getTaskHits().iterator().next().getSummary()); > //assertEquals(PriorityLevel.P1.toString(), hitCollector.getTaskDataHits().iterator().next().getPriority()); >@@ -164,13 +164,13 @@ > > JiraCustomQuery query = new JiraCustomQuery(repository.getUrl(), filter, repository.getCharacterEncoding()); > QueryHitCollector hitCollector = new QueryHitCollector(taskList, new TaskFactory(repository)); >- connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector, false); >+ connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector); > assertEquals(1, hitCollector.getTaskHits().size()); > assertEquals(issue2.getSummary(), hitCollector.getTaskHits().iterator().next().getSummary()); > >- hitCollector.clear(); >+ hitCollector = new QueryHitCollector(taskList, new TaskFactory(repository)); > JiraClientFacade.getDefault().clearClientsAndConfigurationData(); >- connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector, false); >+ connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector); > assertEquals(1, hitCollector.getTaskHits().size()); > assertEquals(issue2.getSummary(), hitCollector.getTaskHits().iterator().next().getSummary()); > } >#P org.eclipse.mylyn.bugzilla.tests >Index: src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java,v >retrieving revision 1.104 >diff -u -r1.104 BugzillaRepositoryConnectorTest.java >--- src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java 13 Jun 2007 08:00:33 -0000 1.104 >+++ src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java 14 Jun 2007 06:25:27 -0000 >@@ -386,9 +386,11 @@ > TasksUiPlugin.getRepositoryManager().setSyncTime(repository, task5.getLastSyncDateStamp(), > TasksUiPlugin.getDefault().getRepositoriesFilePath()); > >- Set<AbstractTask> changedTasks = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor()); >+ boolean changed = connector.updateNeedsSynchronization(repository, tasks, new NullProgressMonitor()); >+ assertTrue(changed); > // Always last known changed returned >- assertEquals(1, changedTasks.size()); >+ assertFalse(task4.getNeedsSynchronization()); >+ assertTrue(task5.getNeedsSynchronization()); > > String priority4 = null; > if (task4.getPriority().equals("P1")) { >@@ -414,14 +416,15 @@ > submit(task4, taskData4); > submit(task5, taskData5); > >- changedTasks = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor()); >+ changed = connector.updateNeedsSynchronization(repository, tasks, new NullProgressMonitor()); > >- assertEquals("Changed reports expected ", 2, changedTasks.size()); >- assertTrue(tasks.containsAll(changedTasks)); >+ assertTrue(task4.getNeedsSynchronization()); >+ assertTrue(task5.getNeedsSynchronization()); > >- TasksUiPlugin.getSynchronizationManager().synchronize(connector, changedTasks, true, null); >+ TasksUiPlugin.getSynchronizationManager().synchronize(connector, tasks, true, null); > >- for (AbstractTask task : changedTasks) { >+ >+ for (AbstractTask task : tasks) { > if (task.getTaskId() == "4") { > assertEquals(priority4, task4.getPriority()); > } >Index: src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchEngineTest.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchEngineTest.java,v >retrieving revision 1.23 >diff -u -r1.23 BugzillaSearchEngineTest.java >--- src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchEngineTest.java 13 Jun 2007 18:09:36 -0000 1.23 >+++ src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchEngineTest.java 14 Jun 2007 06:25:27 -0000 >@@ -118,7 +118,7 @@ > TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList(); > QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository)); > >- connector.performQuery(repositoryQuery, repository, new NullProgressMonitor(), collector, false); >+ connector.performQuery(repositoryQuery, repository, new NullProgressMonitor(), collector); > > // results.addAll(connector.performQuery(repositoryQuery, new > // NullProgressMonitor(), new MultiStatus(TasksUiPlugin.PLUGIN_ID, >Index: src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java,v >retrieving revision 1.29 >diff -u -r1.29 BugzillaQueryTest.java >--- src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java 13 Jun 2007 18:09:36 -0000 1.29 >+++ src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java 14 Jun 2007 06:25:27 -0000 >@@ -136,7 +136,7 @@ > BugzillaRepositoryConnector connector = new BugzillaRepositoryConnector(); > connector.init(taskList); > BugzillaRepositoryQuery query = new BugzillaRepositoryQuery(repository.getUrl(), queryUrlString, "summary"); >- connector.performQuery(query, repository, new NullProgressMonitor(), collector, false); >+ connector.performQuery(query, repository, new NullProgressMonitor(), collector); > assertEquals(2, collector.getTaskHits().size()); > for (AbstractTask hit : collector.getTaskHits()) { > assertTrue(hit.getSummary().contains("search-match-test")); >#P org.eclipse.mylyn.web.tasks >Index: src/org/eclipse/mylyn/internal/web/tasks/WebRepositoryConnector.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositoryConnector.java,v >retrieving revision 1.3 >diff -u -r1.3 WebRepositoryConnector.java >--- src/org/eclipse/mylyn/internal/web/tasks/WebRepositoryConnector.java 14 Jun 2007 03:35:25 -0000 1.3 >+++ src/org/eclipse/mylyn/internal/web/tasks/WebRepositoryConnector.java 14 Jun 2007 06:25:27 -0000 >@@ -42,8 +42,8 @@ > 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.ITaskCollector; > import org.eclipse.mylyn.tasks.core.ITaskDataHandler; >-import org.eclipse.mylyn.tasks.core.QueryHitCollector; > import org.eclipse.mylyn.tasks.core.RepositoryTaskData; > import org.eclipse.mylyn.tasks.core.TaskRepository; > import org.eclipse.mylyn.tasks.core.TaskRepositoryManager; >@@ -203,7 +203,7 @@ > > @Override > public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, >- QueryHitCollector resultCollector, boolean forced) { >+ ITaskCollector resultCollector) { > if (query instanceof WebQuery) { > WebQuery webQuery = (WebQuery) query; > Map<String, String> queryParameters = webQuery.getQueryParameters(); >@@ -233,10 +233,11 @@ > return null; > } > >- public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository, >- Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException { >+ @Override >+ public boolean updateNeedsSynchronization(TaskRepository repository, >+ Set<AbstractTask> tasks, IProgressMonitor monitor) { > // not supported >- return Collections.emptySet(); >+ return false; > } > > @Override >@@ -258,7 +259,7 @@ > // utility methods > > public static IStatus performQuery(String resource, String regexp, String taskPrefix, IProgressMonitor monitor, >- QueryHitCollector collector, TaskRepository repository) { >+ ITaskCollector resultCollector, TaskRepository repository) { > Pattern p = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL > | Pattern.UNICODE_CASE | Pattern.CANON_EQ); > Matcher matcher = p.matcher(resource); >@@ -275,7 +276,7 @@ > if (matcher.groupCount() >= 1) { > String id = matcher.group(1); > String description = matcher.groupCount() > 1 ? cleanup(matcher.group(2), repository) : null; >- collector.accept(new WebTask(id, description, taskPrefix, repository.getUrl(), WebTask.REPOSITORY_TYPE)); >+ resultCollector.accept(new WebTask(id, description, taskPrefix, repository.getUrl(), WebTask.REPOSITORY_TYPE)); > } > } while (matcher.find() && !monitor.isCanceled()); > >@@ -311,7 +312,7 @@ > return sb.toString(); > } > >- public static IStatus performRssQuery(String queryUrl, IProgressMonitor monitor, QueryHitCollector collector, >+ public static IStatus performRssQuery(String queryUrl, IProgressMonitor monitor, ITaskCollector resultCollector, > TaskRepository repository) { > SyndFeedInput input = new SyndFeedInput(); > try { >@@ -340,7 +341,7 @@ > > String entrTitle = entry.getTitle(); > >- collector.accept(new WebTask(entryUri, // >+ resultCollector.accept(new WebTask(entryUri, // > (date == null ? "" : df.format(date) + " - ") + entrTitle, // > "", repository.getUrl(), WebTask.REPOSITORY_TYPE)); > } >#P org.eclipse.mylyn.tasks.tests >Index: src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java,v >retrieving revision 1.37 >diff -u -r1.37 MockRepositoryConnector.java >--- src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java 13 Jun 2007 08:00:39 -0000 1.37 >+++ src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java 14 Jun 2007 06:25:27 -0000 >@@ -22,8 +22,8 @@ > 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.ITaskCollector; > import org.eclipse.mylyn.tasks.core.ITaskDataHandler; >-import org.eclipse.mylyn.tasks.core.QueryHitCollector; > import org.eclipse.mylyn.tasks.core.RepositoryTaskData; > import org.eclipse.mylyn.tasks.core.TaskRepository; > >@@ -133,9 +133,10 @@ > } > > @Override >- public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository, >- Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException { >- return Collections.emptySet(); >+ public boolean updateNeedsSynchronization(TaskRepository repository, >+ Set<AbstractTask> tasks, IProgressMonitor monitor) { >+ // ignore >+ return false; > } > > @Override >@@ -153,7 +154,7 @@ > > @Override > public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, >- QueryHitCollector resultCollector, boolean forced) { >+ ITaskCollector resultCollector) { > // ignore > return null; > } >#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.63 >diff -u -r1.63 BugzillaRepositoryConnector.java >--- src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java 14 Jun 2007 03:35:30 -0000 1.63 >+++ src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java 14 Jun 2007 06:25:28 -0000 >@@ -21,7 +21,6 @@ > import java.util.Iterator; > import java.util.List; > import java.util.Locale; >-import java.util.Map; > import java.util.Set; > > import org.eclipse.core.runtime.CoreException; >@@ -34,6 +33,7 @@ > 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.ITaskCollector; > import org.eclipse.mylyn.tasks.core.ITaskDataHandler; > import org.eclipse.mylyn.tasks.core.ITaskFactory; > import org.eclipse.mylyn.tasks.core.QueryHitCollector; >@@ -223,27 +223,33 @@ > > > @Override >- public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository, >+ public boolean updateNeedsSynchronization(TaskRepository repository, > Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException { > try { >- Set<AbstractTask> changedTasks = new HashSet<AbstractTask>(); >+ monitor.beginTask("Running query", IProgressMonitor.UNKNOWN); > > if (repository.getSyncTimeStamp() == null) { >- return tasks; >+ for (AbstractTask task : tasks) { >+ task.setNeedsSynchronization(true); >+ } >+ return true; > } > > String dateString = repository.getSyncTimeStamp(); > 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 >+ >+ Set<AbstractTask> changedTasks = new HashSet<AbstractTask>(); > int queryCounter = -1; > Iterator<AbstractTask> itr = tasks.iterator(); > while (itr.hasNext()) { >@@ -255,19 +261,26 @@ > 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; >+ >+ for (AbstractTask task : changedTasks) { >+ task.setNeedsSynchronization(true); >+ } >+ >+ repository.setSyncTimeStamp(getSynchronizationTimestamp(repository, changedTasks)); >+ >+ // FIXME check if new tasks were added >+ return changedTasks.isEmpty(); > } catch (UnsupportedEncodingException e) { >+ // XXX throw CoreException instead? > MylarStatusHandler.fail(e, "Repository configured with unsupported encoding: " > + repository.getCharacterEncoding() + "\n\n Unable to determine changed tasks.", true); >- return tasks; >+ return false; > } > } > >@@ -283,7 +296,7 @@ > > BugzillaRepositoryQuery query = new BugzillaRepositoryQuery(repository.getUrl(), urlQueryString, ""); > >- performQuery(query, repository, new NullProgressMonitor(), collector, false); >+ performQuery(query, repository, new NullProgressMonitor(), collector); > > for (AbstractTask taskHit : collector.getTaskHits()) { > // String handle = >@@ -332,49 +345,30 @@ > > @Override > public IStatus performQuery(final AbstractRepositoryQuery query, TaskRepository repository, >- IProgressMonitor monitor, QueryHitCollector resultCollector, boolean forced) { >- IStatus queryStatus = Status.OK_STATUS; >+ IProgressMonitor monitor, ITaskCollector resultCollector) { > try { >+ monitor.beginTask("Running query", IProgressMonitor.UNKNOWN); > BugzillaClient client = getClientManager().getClient(repository); >- resultCollector.clear(); >- Set<String> ids = client.getSearchHits(query); >- if (ids.size() == 0) { >+ boolean hitsReceived = client.getSearchHits(query, resultCollector); >+ if (!hitsReceived) { > // XXX: HACK in case of ip change bugzilla can return 0 hits > // due to invalid authorization token, forcing relogin fixes > client.logout(); >- ids = client.getSearchHits(query); >- } >- >- if (!forced) { >- // Only retrieve data for hits we don't already have >- for (AbstractTask existingTask : query.getChildren()) { >- AbstractTask repositoryTask = (AbstractTask) existingTask; >- if (ids.contains(repositoryTask.getTaskId())) { >- resultCollector.accept(repositoryTask); >- ids.remove(repositoryTask.getTaskId()); >- } >- } >- } >- >- Map<String, RepositoryTaskData> hits = client.getTaskData(ids); >- for (RepositoryTaskData data : hits.values()) { >- if (data != null) { >- taskDataHandler.configureTaskData(repository, data); >- resultCollector.accept(data); >- } >+ client.getSearchHits(query, resultCollector); > } > >+ return Status.OK_STATUS; > } catch (UnrecognizedReponseException e) { >- queryStatus = new Status(IStatus.ERROR, BugzillaCorePlugin.PLUGIN_ID, Status.INFO, >+ return new Status(IStatus.ERROR, BugzillaCorePlugin.PLUGIN_ID, Status.INFO, > "Unrecognized response from server", e); > } catch (IOException e) { >- queryStatus = new Status(IStatus.ERROR, BugzillaCorePlugin.PLUGIN_ID, Status.ERROR, >+ return new Status(IStatus.ERROR, BugzillaCorePlugin.PLUGIN_ID, Status.ERROR, > "Check repository configuration: " + e.getMessage(), e); > } catch (CoreException e) { >- queryStatus = e.getStatus(); >+ return e.getStatus(); >+ } finally { >+ monitor.done(); > } >- return queryStatus; >- > } > > @Override >Index: src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryQueryResultsFactory.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryQueryResultsFactory.java,v >retrieving revision 1.9 >diff -u -r1.9 RepositoryQueryResultsFactory.java >--- src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryQueryResultsFactory.java 8 Jun 2007 00:35:34 -0000 1.9 >+++ src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryQueryResultsFactory.java 14 Jun 2007 06:25:28 -0000 >@@ -17,6 +17,9 @@ > import java.util.HashSet; > import java.util.Set; > >+import org.eclipse.mylyn.tasks.core.ITaskCollector; >+import org.eclipse.mylyn.tasks.core.QueryHitCollector; >+ > /** > * @author Rob Elves > */ >@@ -28,14 +31,23 @@ > super(inStream, encoding); > } > >- /** >- * expects rdf returned from repository (ctype=rdf in url) >- * >- * @throws GeneralSecurityException >- */ >- public void performQuery(String repositoryUrl, int maxHits) throws IOException { >- >- SaxBugzillaQueryContentHandler contentHandler = new SaxBugzillaQueryContentHandler(repositoryUrl, hits, maxHits); >+// /** >+// * expects rdf returned from repository (ctype=rdf in url) >+// * >+// * @throws GeneralSecurityException >+// */ >+// public void performQuery(String repositoryUrl, int maxHits) throws IOException { >+// >+// SaxBugzillaQueryContentHandler contentHandler = new SaxBugzillaQueryContentHandler(repositoryUrl, hits, maxHits); >+// collectResults(contentHandler, false); >+// } >+ >+ /** expects rdf returned from repository (ctype=rdf in url) >+ * @throws GeneralSecurityException */ >+ public void performQuery(String repositoryUrl, ITaskCollector collector, int maxHits) throws IOException { >+ >+ SaxBugzillaQueryContentHandler contentHandler = new SaxBugzillaQueryContentHandler(repositoryUrl, >+ collector, hits, maxHits); > collectResults(contentHandler, false); > } > >Index: src/org/eclipse/mylyn/internal/bugzilla/core/SaxBugzillaQueryContentHandler.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/SaxBugzillaQueryContentHandler.java,v >retrieving revision 1.12 >diff -u -r1.12 SaxBugzillaQueryContentHandler.java >--- src/org/eclipse/mylyn/internal/bugzilla/core/SaxBugzillaQueryContentHandler.java 9 Jun 2007 02:10:20 -0000 1.12 >+++ src/org/eclipse/mylyn/internal/bugzilla/core/SaxBugzillaQueryContentHandler.java 14 Jun 2007 06:25:28 -0000 >@@ -14,6 +14,9 @@ > import java.util.Locale; > import java.util.Set; > >+import org.eclipse.mylyn.tasks.core.AbstractTask; >+import org.eclipse.mylyn.tasks.core.ITaskCollector; >+import org.eclipse.mylyn.tasks.core.QueryHitCollector; > import org.eclipse.mylyn.web.core.HtmlStreamTokenizer; > import org.xml.sax.Attributes; > import org.xml.sax.SAXException; >@@ -29,18 +32,20 @@ > /** The bug id */ > private String id; > >-// /** The summary of the bug */ >-// private String description = ""; >-// >-// /** The priority of the bug */ >-// private String priority = Task.PriorityLevel.getDefault().toString(); >-// >-// /** The state of the bug */ >-// private String state = ""; >+ /** The summary of the bug */ >+ private String description = ""; >+ >+ /** The priority of the bug */ >+ private String priority = AbstractTask.PriorityLevel.getDefault().toString(); >+ >+ /** The state of the bug */ >+ private String state = ""; > > private StringBuffer characters; > >-// private String repositoryUrl; >+ private ITaskCollector collector; >+ >+ private String repositoryUrl; > > private Set<String> bugIds; > >@@ -48,9 +53,10 @@ > > private int numCollected = 0; > >- public SaxBugzillaQueryContentHandler(String repositoryUrl, Set<String> hits, int maxHits) { >- //this.repositoryUrl = repositoryUrl; >+ public SaxBugzillaQueryContentHandler(String repositoryUrl, ITaskCollector collector, Set<String> hits, int maxHits) { >+ this.repositoryUrl = repositoryUrl; > this.maxHits = maxHits; >+ this.collector = collector; > this.bugIds = hits; > } > >@@ -96,42 +102,42 @@ > //System.err.println(">>> "+id); > bugIds.add(id); > numCollected++; >- } >+ } > break; >-// // case BUG_SEVERITY: >-// // severity = parsedText; >-// // break; >-// case PRIORITY: >-// priority = parsedText; >-// break; >-// // case REP_PLATFORM: >-// // platform = parsedText; >-// // break; >-// case ASSIGNED_TO: >-// //hit.setOwner(parsedText); >-// break; >-// case BUG_STATUS: >-// state = parsedText; >-// break; >-// // case RESOLUTION: >-// // resolution = parsedText; >-// // break; >-// case SHORT_DESC: >-// description = parsedText; >-// break; >-// case SHORT_SHORT_DESC: >-// description = parsedText; >-// break; >-// case LI: >-// if (numCollected < maxHits || maxHits == IBugzillaConstants.RETURN_ALL_HITS) >-// { >-// hit = new BugzillaQueryHit(taskList, description, priority, repositoryUrl, >-// id, null, state); >-// collector.accept(hit); >-// numCollected++; >-// } else { >-// break; >-// } >+ // case BUG_SEVERITY: >+ // severity = parsedText; >+ // break; >+ case PRIORITY: >+ priority = parsedText; >+ break; >+ // case REP_PLATFORM: >+ // platform = parsedText; >+ // break; >+ case ASSIGNED_TO: >+ //hit.setOwner(parsedText); >+ break; >+ case BUG_STATUS: >+ state = parsedText; >+ break; >+ // case RESOLUTION: >+ // resolution = parsedText; >+ // break; >+ case SHORT_DESC: >+ description = parsedText; >+ break; >+ case SHORT_SHORT_DESC: >+ description = parsedText; >+ break; >+ case LI: >+ if (numCollected < maxHits || maxHits == IBugzillaConstants.RETURN_ALL_HITS) { >+ BugzillaTask task = new BugzillaTask(repositoryUrl, id, description); >+ task.setPriority(priority); >+ // TODO set state >+ collector.accept(task); >+ numCollected++; >+ } else { >+ break; >+ } > } > } catch (RuntimeException e) { > if (e instanceof IllegalArgumentException) { >Index: src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClient.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClient.java,v >retrieving revision 1.74 >diff -u -r1.74 BugzillaClient.java >--- src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClient.java 13 Jun 2007 22:49:32 -0000 1.74 >+++ src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClient.java 14 Jun 2007 06:25:28 -0000 >@@ -53,6 +53,7 @@ > import org.eclipse.mylyn.internal.bugzilla.core.history.BugzillaTaskHistoryParser; > import org.eclipse.mylyn.internal.bugzilla.core.history.TaskHistory; > import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery; >+import org.eclipse.mylyn.tasks.core.ITaskCollector; > import org.eclipse.mylyn.tasks.core.ITaskAttachment; > import org.eclipse.mylyn.tasks.core.QueryHitCollector; > import org.eclipse.mylyn.tasks.core.RepositoryOperation; >@@ -436,53 +437,9 @@ > // } > // } > >-// public void getSearchHits(AbstractRepositoryQuery query, QueryHitCollector >-// collector, TaskList taskList) >-// throws IOException, CoreException { >-// GetMethod method = null; >-// try { >-// String queryUrl = query.getUrl(); >-// // Test that we don't specify content type twice. >-// // Should only be specified here (not in passed in url if possible) >-// if (!queryUrl.contains("ctype=rdf")) { >-// queryUrl = queryUrl.concat(IBugzillaConstants.CONTENT_TYPE_RDF); >-// } >-// >-// method = getConnect(queryUrl); >-// if (method.getResponseHeader("Content-Type") != null) { >-// Header responseTypeHeader = method.getResponseHeader("Content-Type"); >-// for (String type : VALID_CONFIG_CONTENT_TYPES) { >-// if (responseTypeHeader.getValue().toLowerCase(Locale.ENGLISH).contains(type)) >-// { >-// RepositoryQueryResultsFactory queryFactory = new >-// RepositoryQueryResultsFactory(method >-// .getResponseBodyAsStream(), characterEncoding); >-// queryFactory.performQuery(taskList, repositoryUrl.toString(), collector, >-// QueryHitCollector.MAX_HITS); >-// >-// >-// >-// >-// //getTaskData(queryFactory.get) >-// // pass t >-// >-// return; >-// } >-// } >-// } >-// parseHtmlError(new BufferedReader( >-// new InputStreamReader(method.getResponseBodyAsStream(), characterEncoding))); >-// } finally { >-// if (method != null) { >-// method.releaseConnection(); >-// } >-// } >-// } >- >- /** >- * Returns ids of bugs that match given query >- */ >- public Set<String> getSearchHits(AbstractRepositoryQuery query) throws IOException, CoreException { >+ public boolean getSearchHits(AbstractRepositoryQuery query, ITaskCollector >+ collector) >+ throws IOException, CoreException { > GetMethod method = null; > try { > String queryUrl = query.getUrl(); >@@ -496,12 +453,14 @@ > if (method.getResponseHeader("Content-Type") != null) { > Header responseTypeHeader = method.getResponseHeader("Content-Type"); > for (String type : VALID_CONFIG_CONTENT_TYPES) { >- if (responseTypeHeader.getValue().toLowerCase(Locale.ENGLISH).contains(type)) { >- RepositoryQueryResultsFactory queryFactory = new RepositoryQueryResultsFactory(method >+ if (responseTypeHeader.getValue().toLowerCase(Locale.ENGLISH).contains(type)) >+ { >+ RepositoryQueryResultsFactory queryFactory = new >+ RepositoryQueryResultsFactory(method > .getResponseBodyAsStream(), characterEncoding); >- queryFactory.performQuery(repositoryUrl.toString(), QueryHitCollector.MAX_HITS); >- >- return queryFactory.getHits(); >+ queryFactory.performQuery(repositoryUrl.toString(), collector, >+ QueryHitCollector.MAX_HITS); >+ return !queryFactory.getHits().isEmpty(); > } > } > } >@@ -512,9 +471,45 @@ > method.releaseConnection(); > } > } >- return new HashSet<String>(); >+ return false; > } > >+// /** >+// * Returns ids of bugs that match given query >+// */ >+// public Set<String> getSearchHits(AbstractRepositoryQuery query) throws IOException, CoreException { >+// GetMethod method = null; >+// try { >+// String queryUrl = query.getUrl(); >+// // Test that we don't specify content type twice. >+// // Should only be specified here (not in passed in url if possible) >+// if (!queryUrl.contains("ctype=rdf")) { >+// queryUrl = queryUrl.concat(IBugzillaConstants.CONTENT_TYPE_RDF); >+// } >+// >+// method = getConnect(queryUrl); >+// if (method.getResponseHeader("Content-Type") != null) { >+// Header responseTypeHeader = method.getResponseHeader("Content-Type"); >+// for (String type : VALID_CONFIG_CONTENT_TYPES) { >+// if (responseTypeHeader.getValue().toLowerCase(Locale.ENGLISH).contains(type)) { >+// RepositoryQueryResultsFactory queryFactory = new RepositoryQueryResultsFactory(method >+// .getResponseBodyAsStream(), characterEncoding); >+// queryFactory.performQuery(repositoryUrl.toString(), QueryHitCollector.MAX_HITS); >+// >+// return queryFactory.getHits(); >+// } >+// } >+// } >+// parseHtmlError(new BufferedReader( >+// new InputStreamReader(method.getResponseBodyAsStream(), characterEncoding))); >+// } finally { >+// if (method != null) { >+// method.releaseConnection(); >+// } >+// } >+// return new HashSet<String>(); >+// } >+ > public static void setupExistingBugAttributes(String serverUrl, RepositoryTaskData existingReport) { > // ordered list of elements as they appear in UI > // and additional elements that may not appear in the incoming xml >#P org.eclipse.mylyn.tasks.ui >Index: .refactorings/2007/6/24/refactorings.history >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/24/refactorings.history,v >retrieving revision 1.7 >diff -u -r1.7 refactorings.history >--- .refactorings/2007/6/24/refactorings.history 13 Jun 2007 18:09:29 -0000 1.7 >+++ .refactorings/2007/6/24/refactorings.history 14 Jun 2007 06:25:28 -0000 >@@ -1,4 +1,4 @@ >-<?xml version="1.0" encoding="utf-8" standalone="no"?> >+<?xml version="1.0" encoding="utf-8"?> > <session version="1.0"> > <refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createStatusLayout(...)' to 'createSummaryLLayout' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createStatusLayout(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createStatusLayout'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createStatusLayout~QComposite;" name="createSummaryLLayout" references="true" stamp="1181583329656" version="1.0"/> > <refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)' to 'createSummaryLayout' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLayout(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createSummaryLLayout'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createSummaryLLayout~QComposite;" name="createSummaryLayout" references="true" stamp="1181583348343" version="1.0"/> >@@ -18,4 +18,5 @@ > <refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryTaskPage' to 'NewTaskPage' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryTaskPage' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskPage' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'NewRepositoryTaskPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{NewRepositoryTaskPage.java[NewRepositoryTaskPage" matchStrategy="1" name="NewTaskPage" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1181707563828" textual="true" version="1.0"/> > <refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTasksAction' to 'AbstractTaskAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTasksAction' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTaskAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractTasksAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AbstractTasksAction.java[AbstractTasksAction" matchStrategy="1" name="AbstractTaskAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181717209407" textual="false" version="1.0"/> > <refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedFilters()' to 'getSelectedContainers' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedFilters()' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedContainers()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSelectedFilters'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskActivityWizardPage.java[TaskActivityWizardPage~getSelectedFilters" name="getSelectedContainers" references="true" stamp="1181756785343" version="1.0"/> >+<refactoring comment="Convert member type 'org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager.SynchronizeChangedTasksJob' in 'org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager' to top level type - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager.SynchronizeChangedTasksJob' - Field name: 'repositorySynchronizationManager' - Declare field 'final'" description="Convert member type 'SynchronizeChangedTasksJob' to top level" field="false" fieldName="repositorySynchronizationManager" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.tasks.ui{RepositorySynchronizationManager.java[RepositorySynchronizationManager[SynchronizeChangedTasksJob" mandatory="false" possible="false" stamp="1181789707690" version="1.0"/> > </session> >Index: .refactorings/2007/6/24/refactorings.index >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/24/refactorings.index,v >retrieving revision 1.7 >diff -u -r1.7 refactorings.index >--- .refactorings/2007/6/24/refactorings.index 13 Jun 2007 18:09:29 -0000 1.7 >+++ .refactorings/2007/6/24/refactorings.index 14 Jun 2007 06:25:28 -0000 >@@ -16,3 +16,4 @@ > 1181707563828 Rename type 'NewRepositoryTaskPage' > 1181717209407 Rename type 'AbstractTasksAction' > 1181756785343 Rename method 'getSelectedFilters' >+1181789707690 Convert member type 'SynchronizeChangedTasksJob' to top level >Index: src/org/eclipse/mylyn/tasks/ui/search/SearchHitCollector.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/search/SearchHitCollector.java,v >retrieving revision 1.14 >diff -u -r1.14 SearchHitCollector.java >--- src/org/eclipse/mylyn/tasks/ui/search/SearchHitCollector.java 14 Jun 2007 03:35:24 -0000 1.14 >+++ src/org/eclipse/mylyn/tasks/ui/search/SearchHitCollector.java 14 Jun 2007 06:25:28 -0000 >@@ -10,6 +10,10 @@ > *******************************************************************************/ > package org.eclipse.mylyn.tasks.ui.search; > >+import java.text.MessageFormat; >+import java.util.HashSet; >+import java.util.Set; >+ > import org.eclipse.core.runtime.CoreException; > import org.eclipse.core.runtime.IProgressMonitor; > import org.eclipse.core.runtime.IStatus; >@@ -20,6 +24,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.ITaskCollector; > import org.eclipse.mylyn.tasks.core.ITaskFactory; > import org.eclipse.mylyn.tasks.core.QueryHitCollector; > import org.eclipse.mylyn.tasks.core.RepositoryStatus; >@@ -39,7 +44,32 @@ > * > * @author Rob Elves > */ >-public class SearchHitCollector extends QueryHitCollector implements ISearchQuery { >+public class SearchHitCollector implements ISearchQuery, ITaskCollector { >+ >+ public static final int MAX_HITS = 5000; >+ >+ public static final String MAX_HITS_REACHED = "Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope."; >+ >+ protected Set<AbstractTask> taskResults = new HashSet<AbstractTask>(); >+ >+ /** The number of matches found */ >+ private int matchCount; >+ >+ /** The string to display to the user while querying */ >+ private static final String STARTING = "querying the server"; >+ >+ /** The string to display to the user when we have 1 match */ >+ private static final String MATCH = "1 match"; >+ >+ /** The string to display to the user when we have multiple or no matches */ >+ private static final String MATCHES = "{0} matches"; >+ >+ /** The string to display to the user when the query is done */ >+ private static final String DONE = "done"; >+ >+ private final TaskList taskList; >+ >+ private final ITaskFactory taskFactory; > > private static final String QUERYING_REPOSITORY = "Querying Repository..."; > >@@ -51,19 +81,21 @@ > > private RepositorySearchResult searchResult; > >- private ITaskFactory taskFactory; >+ private IProgressMonitor monitor; > > public SearchHitCollector(TaskList tasklist, TaskRepository repository, AbstractRepositoryQuery repositoryQuery, ITaskFactory taskFactory) { >- super(tasklist, taskFactory); >+ this.taskList = tasklist; > this.repository = repository; > this.repositoryQuery = repositoryQuery; > this.searchResult = new RepositorySearchResult(this); > this.taskFactory = taskFactory; > } > >- @Override >- public void aboutToStart(int startMatchCount) throws CoreException { >- super.aboutToStart(startMatchCount); >+ public void aboutToStart(int startMatchCount) { >+ taskResults.clear(); >+ matchCount = startMatchCount; >+ monitor.setTaskName(STARTING); >+ > searchResult.removeAll(); > PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { > public void run() { >@@ -72,15 +104,10 @@ > }); > } > >- @Override >- public void done() { >- super.done(); >- } >- >- @Override > public void accept(AbstractTask task) { >- if (task == null) >- return; >+ if (task == null) { >+ throw new IllegalArgumentException(); >+ } > > AbstractTask hitTask = taskList.getTask(task.getHandleIdentifier()); > if (hitTask == null) { >@@ -88,27 +115,26 @@ > } > > >- if (!getProgressMonitor().isCanceled()) { >- getProgressMonitor().subTask(getFormattedMatchesString(searchResult.getMatchCount())); >- getProgressMonitor().worked(1); >+ if (!monitor.isCanceled()) { >+ monitor.subTask(getFormattedMatchesString(searchResult.getMatchCount())); >+ monitor.worked(1); > } > > taskResults.add((AbstractTask)hitTask); > this.searchResult.addMatch(new Match(hitTask, 0, 0)); > } > >- @Override > public void accept(RepositoryTaskData taskData) throws CoreException { >- if (taskData == null) >- return; >- >+ if (taskData == null) { >+ throw new IllegalArgumentException(); >+ } > >- AbstractTask task = taskFactory.createTask(taskData, false, false, new SubProgressMonitor(getProgressMonitor(), 1)); >+ AbstractTask task = taskFactory.createTask(taskData, false, false, new SubProgressMonitor(monitor, 1)); > if (task != null) { > >- if (!getProgressMonitor().isCanceled()) { >- getProgressMonitor().subTask(getFormattedMatchesString(searchResult.getMatchCount())); >- getProgressMonitor().worked(1); >+ if (!monitor.isCanceled()) { >+ monitor.subTask(getFormattedMatchesString(searchResult.getMatchCount())); >+ monitor.worked(1); > } > > taskResults.add(task); >@@ -145,11 +171,12 @@ > } > > public IStatus run(IProgressMonitor monitor) throws OperationCanceledException { >- this.setProgressMonitor(monitor); >- IStatus status = Status.OK_STATUS; >+ this.monitor = monitor; >+ > try { >- aboutToStart(0); > monitor.beginTask(QUERYING_REPOSITORY, IProgressMonitor.UNKNOWN); >+ >+ aboutToStart(0); > > if (monitor.isCanceled()) { > throw new OperationCanceledException("Search cancelled"); >@@ -157,22 +184,44 @@ > AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector( > repositoryQuery.getRepositoryKind()); > if (connector != null) { >- status = connector.performQuery(repositoryQuery, repository, monitor, this, false); >+ IStatus status = connector.performQuery(repositoryQuery, repository, monitor, this); >+ if (!status.isOK()) { >+ MylarStatusHandler.displayStatus("Search failed", status); >+ } > } else { > return new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, IStatus.OK, > "repository connector could not be found", null); > } > >- if (!status.isOK()) { >- throw new CoreException(status); >- } >- >- } catch (final CoreException exception) { >- MylarStatusHandler.displayStatus("Search failed", exception.getStatus()); >+ return Status.OK_STATUS; > } finally { > done(); > } >- return Status.OK_STATUS; >+ } >+ >+ public void done() { >+ if (monitor != null && !monitor.isCanceled()) { >+ // if the operation is cancelled, finish with the data that we >+ // already have >+ String matchesString = getFormattedMatchesString(matchCount); >+ monitor.setTaskName(MessageFormat.format(DONE, new Object[] { matchesString })); >+ monitor.done(); >+ } >+ >+ // Cut no longer used references because the collector might be re-used >+ monitor = null; >+ } >+ >+ protected String getFormattedMatchesString(int count) { >+ if (count == 1) { >+ return MATCH; >+ } >+ Object[] messageFormatArgs = { new Integer(count) }; >+ return MessageFormat.format(MATCHES, messageFormatArgs); >+ } >+ >+ public Set<AbstractTask> getTaskHits() { >+ return taskResults; > } > > } >\ No newline at end of file >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.58 >diff -u -r1.58 SynchronizeQueryJob.java >--- src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java 14 Jun 2007 05:19:22 -0000 1.58 >+++ src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java 14 Jun 2007 06:25:28 -0000 >@@ -11,15 +11,20 @@ > > package org.eclipse.mylyn.tasks.ui; > >+import java.util.Collections; > import java.util.Date; > import java.util.HashSet; > 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.Platform; > 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.core.MylarStatusHandler; > import org.eclipse.mylyn.internal.tasks.ui.TasksUiImages; > import org.eclipse.mylyn.monitor.core.DateUtil; >@@ -27,7 +32,6 @@ > 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.RepositoryStatus; > import org.eclipse.mylyn.tasks.core.TaskList; > import org.eclipse.mylyn.tasks.core.TaskRepository; > import org.eclipse.ui.PlatformUI; >@@ -36,52 +40,50 @@ > /** > * @author Mik Kersten > * @author Rob Elves >+ * @author Steffen Pingel > */ > class SynchronizeQueryJob extends Job { > >- private final AbstractRepositoryConnector connector; >- > private static final String JOB_LABEL = "Synchronizing queries"; > >- private Set<AbstractRepositoryQuery> queries; >+ private final AbstractRepositoryConnector connector; > >- private Set<TaskRepository> repositories; >+ private final TaskRepository repository; > >- private boolean synchChangedTasks; >+ private final Set<AbstractRepositoryQuery> queries; > >- private TaskList taskList; >+ private final TaskList taskList; > >-// private RepositorySynchronizationManager synchronizationManager; >+ private boolean synchronizeChangedTasks; > > private boolean forced = false; > >- public SynchronizeQueryJob(RepositorySynchronizationManager synchronizationManager, >- AbstractRepositoryConnector connector, Set<AbstractRepositoryQuery> queries, TaskList taskList) { >+ private HashSet<AbstractTask> tasksToBeSynchronized = new HashSet<AbstractTask>(); >+ >+ public SynchronizeQueryJob(AbstractRepositoryConnector connector, TaskRepository repository, >+ Set<AbstractRepositoryQuery> queries, TaskList taskList) { > super(JOB_LABEL + ": " + connector.getRepositoryType()); >+ > this.connector = connector; >+ this.repository = repository; > this.queries = queries; > this.taskList = taskList; >- this.repositories = new HashSet<TaskRepository>(); >- // TODO: remove once architecture established >- // this.synchronizationManager = synchronizationManager; > } > >- public void setSynchChangedTasks(boolean syncChangedTasks) { >- this.synchChangedTasks = syncChangedTasks; >+ public void setSynchronizeChangedTasks(boolean synchronizeChangedTasks) { >+ this.synchronizeChangedTasks = synchronizeChangedTasks; > } > > /** >- * Returns true, if synchronization was triggered manually and not by an >- * automatic background job. >+ * 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. >+ * 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; >@@ -89,75 +91,108 @@ > > @Override > protected IStatus run(IProgressMonitor monitor) { >- monitor.beginTask(JOB_LABEL, queries.size()); >+ try { >+ monitor.beginTask(JOB_LABEL, queries.size() + 1); > >- taskList.notifyContainersUpdated(queries); >- for (AbstractRepositoryQuery repositoryQuery : queries) { >-// taskList.notifyContainerUpdated(repositoryQuery); >- repositoryQuery.setStatus(null); >- >- monitor.setTaskName("Synchronizing: " + repositoryQuery.getSummary()); >- setProperty(IProgressConstants.ICON_PROPERTY, TasksUiImages.REPOSITORY_SYNCHRONIZE); >- TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository( >- repositoryQuery.getRepositoryKind(), repositoryQuery.getRepositoryUrl()); >- if (repository == null) { >- repositoryQuery.setStatus(RepositoryStatus.createNotFoundError(repositoryQuery.getRepositoryUrl(), >- TasksUiPlugin.PLUGIN_ID)); >- } else { >- >- QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository)); >- SubProgressMonitor collectorMonitor = new SubProgressMonitor(monitor, 1); >- collector.setProgressMonitor(collectorMonitor); >- final IStatus resultingStatus = connector.performQuery(repositoryQuery, repository, collectorMonitor, >- collector, forced); >- >- if (resultingStatus.getSeverity() == IStatus.CANCEL) { >- // do nothing >- } else if (resultingStatus.isOK()) { >- >- if (collector.getTaskHits().size() >= QueryHitCollector.MAX_HITS) { >- MylarStatusHandler.log( >- QueryHitCollector.MAX_HITS_REACHED + "\n" + repositoryQuery.getSummary(), this); >- } >+ Set<AbstractTask> allTasks = Collections.unmodifiableSet(taskList.getRepositoryTasks(repository.getUrl())); > >- repositoryQuery.clear(); >- for (AbstractTask hit : collector.getTaskHits()) { >- taskList.addTask(hit, repositoryQuery); >+ // check if the repository has changed at all and have the connector mark tasks that need synchronization >+ try { >+ boolean hasChangedOrNew = connector.updateNeedsSynchronization(repository, allTasks, >+ new SubProgressMonitor(monitor, 1)); >+ if (!hasChangedOrNew && !forced) { >+ for (AbstractRepositoryQuery repositoryQuery : queries) { >+ repositoryQuery.setStatus(null); >+ repositoryQuery.setCurrentlySynchronizing(false); >+ taskList.notifyContainersUpdated(queries); > } >+ return Status.OK_STATUS; >+ } >+ } catch (CoreException e) { >+ // there is no good way of informing the user at this point, just log the error >+ MylarStatusHandler.log(e.getStatus()); >+ } >+ >+ // synchronize queries >+ for (AbstractRepositoryQuery repositoryQuery : queries) { >+ repositoryQuery.setStatus(null); >+ taskList.notifyContainersUpdated(queries); >+ >+ synchronizeQuery(repositoryQuery, new SubProgressMonitor(monitor, 1)); >+ >+ repositoryQuery.setCurrentlySynchronizing(false); >+ taskList.notifyContainersUpdated(queries); >+ } > >- if (synchChangedTasks) { >- repositories.add(repository); >+ // for background synchronizations all changed tasks are synchronized including the ones that are not part of a query >+ if (forced) { >+ for (AbstractTask task : allTasks) { >+ if (task.getNeedsSynchronization()) { >+ tasksToBeSynchronized.add(task); > } >+ } >+ } > >- repositoryQuery.setLastRefreshTimeStamp(DateUtil.getFormattedDate(new Date(), "MMM d, H:mm:ss")); >- } else { >- repositoryQuery.setStatus(resultingStatus); >- if (isForced()) { >- PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { >- public void run() { >- MylarStatusHandler.displayStatus("Query Synchronization Failed", resultingStatus); >+ // synchronize tasks that were marked by the connector >+ if (!tasksToBeSynchronized.isEmpty()) { >+ TasksUiPlugin.getSynchronizationManager().synchronize(connector, tasksToBeSynchronized, forced, >+ new JobChangeAdapter() { >+ @Override >+ public void done(IJobChangeEvent event) { >+ if (!Platform.isRunning() || TasksUiPlugin.getRepositoryManager() == null) { >+ return; >+ } >+ TasksUiPlugin.getRepositoryManager().setSyncTime(repository, >+ connector.getSynchronizationTimestamp(repository, tasksToBeSynchronized), >+ TasksUiPlugin.getDefault().getRepositoriesFilePath()); > } > }); >- } >- } > } > >- repositoryQuery.setCurrentlySynchronizing(false); >- taskList.notifyContainersUpdated(queries); >-// taskList.notifyContainerUpdated(repositoryQuery); >+ // HACK: force entire Task List to refresh in case containers need to >+ // appear or disappear >+ taskList.notifyContainersUpdated(null); >+ >+ return Status.OK_STATUS; >+ } finally { >+ monitor.done(); > } >+ } > >- for (TaskRepository repository : repositories) { >- TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, repository); >- } >+ private void synchronizeQuery(AbstractRepositoryQuery repositoryQuery, IProgressMonitor monitor) { >+ monitor.setTaskName("Synchronizing: " + repositoryQuery.getSummary()); >+ setProperty(IProgressConstants.ICON_PROPERTY, TasksUiImages.REPOSITORY_SYNCHRONIZE); >+ >+ QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository)); >+ >+ final IStatus resultingStatus = connector.performQuery(repositoryQuery, repository, monitor, collector); >+ if (resultingStatus.getSeverity() == IStatus.CANCEL) { >+ // do nothing >+ } else if (resultingStatus.isOK()) { >+ if (collector.getTaskHits().size() >= QueryHitCollector.MAX_HITS) { >+ MylarStatusHandler.log(QueryHitCollector.MAX_HITS_REACHED + "\n" + repositoryQuery.getSummary(), this); >+ } > >- // HACK: force entire Task List to refresh in case containers need to >- // appear or disappear >- taskList.notifyContainersUpdated(null); >+ repositoryQuery.clear(); > >- monitor.done(); >+ for (AbstractTask hit : collector.getTaskHits()) { >+ taskList.addTask(hit, repositoryQuery); >+ if (synchronizeChangedTasks && hit.getNeedsSynchronization()) { >+ tasksToBeSynchronized.add(hit); >+ } >+ } > >- return Status.OK_STATUS; >+ repositoryQuery.setLastRefreshTimeStamp(DateUtil.getFormattedDate(new Date(), "MMM d, H:mm:ss")); >+ } else { >+ repositoryQuery.setStatus(resultingStatus); >+ if (isForced()) { >+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { >+ public void run() { >+ MylarStatusHandler.displayStatus("Query Synchronization Failed", resultingStatus); >+ } >+ }); >+ } >+ } > } > > } >\ No newline at end of file >Index: src/org/eclipse/mylyn/tasks/ui/SynchronizeTaskJob.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/SynchronizeTaskJob.java,v >retrieving revision 1.54 >diff -u -r1.54 SynchronizeTaskJob.java >--- src/org/eclipse/mylyn/tasks/ui/SynchronizeTaskJob.java 14 Jun 2007 05:19:22 -0000 1.54 >+++ src/org/eclipse/mylyn/tasks/ui/SynchronizeTaskJob.java 14 Jun 2007 06:25:28 -0000 >@@ -176,5 +176,7 @@ > } else { > connector.updateTaskFromRepository(repository, repositoryTask, monitor); > } >+ >+ repositoryTask.setNeedsSynchronization(false); > } > } >\ No newline at end of file >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.55 >diff -u -r1.55 RepositorySynchronizationManager.java >--- src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java 14 Jun 2007 05:19:22 -0000 1.55 >+++ src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java 14 Jun 2007 06:25:28 -0000 >@@ -12,17 +12,10 @@ > import java.util.HashSet; > 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.NullProgressMonitor; >-import org.eclipse.core.runtime.Platform; >-import org.eclipse.core.runtime.Status; >-import org.eclipse.core.runtime.jobs.IJobChangeEvent; > import org.eclipse.core.runtime.jobs.IJobChangeListener; > import org.eclipse.core.runtime.jobs.ISchedulingRule; > import org.eclipse.core.runtime.jobs.Job; >-import org.eclipse.core.runtime.jobs.JobChangeAdapter; > import org.eclipse.mylyn.core.MylarStatusHandler; > import org.eclipse.mylyn.internal.tasks.core.TaskDataManager; > import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; >@@ -103,22 +96,23 @@ > */ > 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); >+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository( >+ repositoryQuery.getRepositoryKind(), repositoryQuery.getRepositoryUrl()); >+ return synchronize(connector, repository, Collections.singleton(repositoryQuery), listener, Job.LONG, 0, forceSync); > } > >- public final Job synchronize(AbstractRepositoryConnector connector, >+ public final Job synchronize(AbstractRepositoryConnector connector, TaskRepository repository, > final Set<AbstractRepositoryQuery> repositoryQueries, final IJobChangeListener listener, int priority, >- long delay, boolean syncChangedTasks, boolean userForcedSync) { >+ long delay, boolean userForcedSync) { > TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList(); >- final SynchronizeQueryJob job = new SynchronizeQueryJob(this, connector, repositoryQueries, taskList); >- job.setSynchChangedTasks(syncChangedTasks); >- job.setForced(userForcedSync); > for (AbstractRepositoryQuery repositoryQuery : repositoryQueries) { > repositoryQuery.setCurrentlySynchronizing(true); > // TasksUiPlugin.getTaskListManager().getTaskList().notifyContainerUpdated(repositoryQuery); > } >+ >+ final SynchronizeQueryJob job = new SynchronizeQueryJob(connector, repository, repositoryQueries, taskList); >+ job.setSynchronizeChangedTasks(true); >+ job.setForced(userForcedSync); > if (listener != null) { > job.addJobChangeListener(listener); > } >@@ -145,70 +139,20 @@ > * TaskRepository.syncTime. > */ > public final void synchronizeChanged(final AbstractRepositoryConnector connector, final TaskRepository repository) { >- 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()); >- } >- }); >- } >+ 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()); >+ } >+ }); > } > } > >- private class SynchronizeChangedTasksJob extends Job { >- >- private AbstractRepositoryConnector connector; >- >- private TaskRepository repository; >- >- private Set<AbstractTask> changedTasks; >- >- public SynchronizeChangedTasksJob(AbstractRepositoryConnector connector, TaskRepository repository) { >- super("Get Changed Tasks"); >- this.connector = connector; >- this.repository = repository; >- } >- >- @Override >- public IStatus run(IProgressMonitor monitor) { >- TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList(); >- Set<AbstractTask> repositoryTasks = Collections.unmodifiableSet(taskList >- .getRepositoryTasks(repository.getUrl())); >- >- try { >- changedTasks = connector.getChangedSinceLastSync(repository, repositoryTasks, monitor); >- >- if (changedTasks == null || changedTasks.size() == 0) { >- return Status.OK_STATUS; >- } >- >- 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()); >- } >- }); >- >- } catch (final CoreException e) { >- // ignore, indicates working offline >- // error reported in ui (tooltip and warning icon) >- } >- return Status.OK_STATUS; >- }; >- }; >- > /** > * @param repositoryTask > * task that changed >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.16 >diff -u -r1.16 ScheduledTaskListSynchJob.java >--- src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java 13 Jun 2007 18:09:28 -0000 1.16 >+++ src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java 14 Jun 2007 06:25:28 -0000 >@@ -11,23 +11,20 @@ > > 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.TaskList; > import org.eclipse.mylyn.tasks.core.TaskRepository; >+import org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager; > import org.eclipse.mylyn.tasks.ui.TaskListManager; > import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; > >@@ -68,12 +65,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 +106,11 @@ > 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); >- } >- } else { >- TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, repository); >- } >+ RepositorySynchronizationManager synchronizationManager = TasksUiPlugin.getSynchronizationManager(); >+ Set<AbstractRepositoryQuery> queries = taskList.getRepositoryQueries(repository.getUrl()); >+ synchronizationManager.synchronize(connector, repository, queries, null, >+ Job.DECORATE, 0, false); >+ > 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.14 >diff -u -r1.14 SynchronizeSelectedAction.java >--- src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeSelectedAction.java 14 Jun 2007 03:35:24 -0000 1.14 >+++ src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeSelectedAction.java 14 Jun 2007 06:25:28 -0000 >@@ -29,6 +29,7 @@ > 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; >@@ -68,11 +69,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; >@@ -82,41 +81,41 @@ > } > } > >+ 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>> entry : repositoriesToSync.entrySet()) { >+ TaskRepository repository = entry.getKey(); >+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager() >+ .getRepositoryConnector(repository.getKind()); >+ Set<AbstractRepositoryQuery> queries = entry.getValue(); >+ syncManager.synchronize(connector, repository, queries, null, Job.LONG, 0L, true); >+ } > } > 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/SynchronizeChangedTasksJob.java >=================================================================== >RCS file: src/org/eclipse/mylyn/tasks/ui/SynchronizeChangedTasksJob.java >diff -N src/org/eclipse/mylyn/tasks/ui/SynchronizeChangedTasksJob.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/mylyn/tasks/ui/SynchronizeChangedTasksJob.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,89 @@ >+/******************************************************************************* >+ * 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.core.MylarStatusHandler; >+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.updateNeedsSynchronization(repository, tasks, new SubProgressMonitor(monitor, 1)); >+ if (!changed) { >+ return Status.OK_STATUS; >+ } >+ >+ for (Iterator<AbstractTask> it = tasks.iterator(); it.hasNext();) { >+ if (!it.next().getNeedsSynchronization()) { >+ it.remove(); >+ } >+ } >+ >+ if (!tasks.isEmpty()) { >+ return Status.OK_STATUS; >+ } >+ >+ TasksUiPlugin.getSynchronizationManager().synchronize(connector, tasks, forced, null); >+ } catch (final CoreException e) { >+ MylarStatusHandler.log(e.getStatus()); >+ } finally { >+ monitor.done(); >+ } >+ >+ return Status.OK_STATUS; >+ }; >+ >+} >#P org.eclipse.mylyn.trac.tests >Index: src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java,v >retrieving revision 1.53 >diff -u -r1.53 TracRepositoryConnectorTest.java >--- src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java 14 Jun 2007 05:19:38 -0000 1.53 >+++ src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java 14 Jun 2007 06:25:29 -0000 >@@ -217,7 +217,7 @@ > public void accept(AbstractTask hit) { > result.add(hit); > }}; >- IStatus queryStatus = connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector, false); >+ IStatus queryStatus = connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector); > > assertTrue(queryStatus.isOK()); > assertEquals(3, result.size()); >Index: src/org/eclipse/mylyn/trac/tests/TracTaskDataHandlerTest.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/TracTaskDataHandlerTest.java,v >retrieving revision 1.11 >diff -u -r1.11 TracTaskDataHandlerTest.java >--- src/org/eclipse/mylyn/trac/tests/TracTaskDataHandlerTest.java 13 Jun 2007 07:59:46 -0000 1.11 >+++ src/org/eclipse/mylyn/trac/tests/TracTaskDataHandlerTest.java 14 Jun 2007 06:25:29 -0000 >@@ -79,19 +79,23 @@ > > public void testGetChangedSinceLastSyncWeb096() throws Exception { > init(TracTestConstants.TEST_TRAC_096_URL, Version.TRAC_0_9); >- TracTask task = (TracTask) connector.createTaskFromExistingId(repository, data.offlineHandlerTicketId + "", new NullProgressMonitor()); >+ TracTask task = (TracTask) connector.createTaskFromExistingId(repository, data.offlineHandlerTicketId + "", >+ new NullProgressMonitor()); > > Set<AbstractTask> tasks = new HashSet<AbstractTask>(); > tasks.add(task); >- >+ > assertEquals(null, repository.getSyncTimeStamp()); >- Set<AbstractTask> result = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor()); >- assertEquals(tasks, result); >+ boolean changed = connector.updateNeedsSynchronization(repository, tasks, new NullProgressMonitor()); >+ assertEquals(true, changed); > assertEquals(null, repository.getSyncTimeStamp()); >- >- int time = (int)(System.currentTimeMillis() / 1000) + 1; >+ assertFalse(task.getNeedsSynchronization()); >+ >+ int time = (int) (System.currentTimeMillis() / 1000) + 1; > repository.setSyncTimeStamp(time + ""); >- assertEquals(tasks, result); >+ changed = connector.updateNeedsSynchronization(repository, tasks, new NullProgressMonitor()); >+ assertEquals(true, changed); >+ assertFalse(task.getNeedsSynchronization()); > } > > public void testGetChangedSinceLastSyncXmlRpc010() throws Exception { >@@ -105,28 +109,35 @@ > } > > private void getChangedSinceLastSync() throws Exception { >- TracTask task = (TracTask) connector.createTaskFromExistingId(repository, data.offlineHandlerTicketId + "", new NullProgressMonitor()); >+ TracTask task = (TracTask) connector.createTaskFromExistingId(repository, data.offlineHandlerTicketId + "", >+ new NullProgressMonitor()); > TasksUiPlugin.getSynchronizationManager().synchronize(connector, task, true, null); >- RepositoryTaskData taskData = TasksUiPlugin.getDefault().getTaskDataManager().getNewTaskData(task.getHandleIdentifier()); >- >+ RepositoryTaskData taskData = TasksUiPlugin.getDefault().getTaskDataManager().getNewTaskData( >+ task.getHandleIdentifier()); >+ > int lastModified = Integer.parseInt(taskData.getLastModified()); >- >+ > Set<AbstractTask> tasks = new HashSet<AbstractTask>(); > tasks.add(task); > > assertEquals(null, repository.getSyncTimeStamp()); >- Set<AbstractTask> result = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor()); >- assertEquals(tasks, result); >+ boolean changed = connector.updateNeedsSynchronization(repository, tasks, new NullProgressMonitor()); >+ assertTrue(changed); >+ assertTrue(task.getNeedsSynchronization()); > > // always returns the ticket because time comparison mode is >= >+ task.setNeedsSynchronization(false); > repository.setSyncTimeStamp(lastModified + ""); >- result = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor()); >- assertEquals(tasks, result); >+ changed = connector.updateNeedsSynchronization(repository, tasks, new NullProgressMonitor()); >+ assertTrue(changed); >+ assertTrue(task.getNeedsSynchronization()); > >+ task.setNeedsSynchronization(false); > repository.setSyncTimeStamp((lastModified + 1) + ""); >- result = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor()); >- assertTrue(result.isEmpty()); >- >+ changed = connector.updateNeedsSynchronization(repository, tasks, new NullProgressMonitor()); >+ assertTrue(changed); >+ assertFalse(task.getNeedsSynchronization()); >+ > // change ticket making sure it gets a new change time > Thread.sleep(1000); > ITracClient client = connector.getClientManager().getRepository(repository); >@@ -138,11 +149,13 @@ > } > client.updateTicket(ticket, "comment"); > >+ task.setNeedsSynchronization(false); > repository.setSyncTimeStamp((lastModified + 1) + ""); >- result = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor()); >- assertEquals(tasks, result); >+ changed = connector.updateNeedsSynchronization(repository, tasks, new NullProgressMonitor()); >+ assertTrue(changed); >+ assertTrue(task.getNeedsSynchronization()); > } >- >+ > public void testNonNumericTaskId() { > try { > connector.getTaskDataHandler().getTaskData(repository, "abc", new NullProgressMonitor()); >@@ -150,6 +163,5 @@ > } catch (CoreException e) { > } > } >- > > } >#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.46 >diff -u -r1.46 TracRepositoryConnector.java >--- src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java 14 Jun 2007 03:35:19 -0000 1.46 >+++ src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java 14 Jun 2007 06:25:29 -0000 >@@ -13,9 +13,7 @@ > > import java.io.File; > import java.util.ArrayList; >-import java.util.Collections; > import java.util.Date; >-import java.util.HashSet; > import java.util.List; > import java.util.Set; > >@@ -33,8 +31,8 @@ > 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.ITaskCollector; > import org.eclipse.mylyn.tasks.core.ITaskDataHandler; >-import org.eclipse.mylyn.tasks.core.QueryHitCollector; > import org.eclipse.mylyn.tasks.core.RepositoryOperation; > import org.eclipse.mylyn.tasks.core.RepositoryStatus; > import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute; >@@ -126,7 +124,7 @@ > > @Override > public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, >- QueryHitCollector resultCollector, boolean force) { >+ ITaskCollector resultCollector) { > > final List<TracTicket> tickets = new ArrayList<TracTicket>(); > >@@ -150,15 +148,18 @@ > } > > @Override >- public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository, >+ public boolean updateNeedsSynchronization(TaskRepository repository, > Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException { >- if (repository.getSyncTimeStamp() == null) { >- return tasks; >- } >- > if (!TracRepositoryConnector.hasChangedSince(repository)) { >- // return an empty list to avoid causing all tasks to synchronized >- return Collections.emptySet(); >+ // always run the queries for web mode >+ return true; >+ } >+ >+ if (repository.getSyncTimeStamp() == null) { >+ for (AbstractTask task : tasks) { >+ task.setNeedsSynchronization(true); >+ } >+ return true; > } > > Date since = new Date(0); >@@ -167,24 +168,25 @@ > } catch (NumberFormatException e) { > } > >- ITracClient client; > try { >- client = getClientManager().getRepository(repository); >+ ITracClient client = getClientManager().getRepository(repository); > Set<Integer> ids = client.getChangedTickets(since); >+ if (ids.isEmpty()) { >+ // repository is unchanged >+ return false; >+ } > >- 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)) { >+ task.setNeedsSynchronization(true); > } > } >- return result; >+ >+ return true; > } catch (Exception e) { > throw new CoreException(new Status(IStatus.ERROR, TracCorePlugin.PLUGIN_ID, IStatus.OK, >- "could not determine changed tasks", e)); >+ "Could not determine changed tasks", e)); > } > } > >#P org.eclipse.mylyn.jira.ui >Index: src/org/eclipse/mylyn/internal/jira/ui/JiraTaskDataHandler.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.jira.ui/src/org/eclipse/mylyn/internal/jira/ui/JiraTaskDataHandler.java,v >retrieving revision 1.48 >diff -u -r1.48 JiraTaskDataHandler.java >--- src/org/eclipse/mylyn/internal/jira/ui/JiraTaskDataHandler.java 14 Jun 2007 03:35:23 -0000 1.48 >+++ src/org/eclipse/mylyn/internal/jira/ui/JiraTaskDataHandler.java 14 Jun 2007 06:25:29 -0000 >@@ -81,7 +81,7 @@ > } > Issue jiraIssue = getJiraIssue(server, taskId, repository.getUrl()); > if (jiraIssue != null) { >- return createTaskData(repository, server, jiraIssue); >+ return createTaskData(repository, server, jiraIssue, null); > } > throw new CoreException(new org.eclipse.core.runtime.Status(IStatus.ERROR, JiraCorePlugin.ID, IStatus.OK, > "JIRA ticket not found: " + taskId, null)); >@@ -91,13 +91,13 @@ > } > } > >- protected RepositoryTaskData createTaskData(TaskRepository repository, JiraClient server, Issue jiraIssue) >+ protected RepositoryTaskData createTaskData(TaskRepository repository, JiraClient server, Issue jiraIssue, RepositoryTaskData oldTaskData) > throws JiraException { > RepositoryTaskData data = new RepositoryTaskData(attributeFactory, JiraUiPlugin.REPOSITORY_KIND, repository > .getUrl(), jiraIssue.getId()); > initializeTaskData(data, server, jiraIssue.getProject()); >- updateTaskData(data, jiraIssue, server); >- addOperations(data, jiraIssue, server); >+ updateTaskData(data, jiraIssue, server, oldTaskData); >+ addOperations(data, jiraIssue, server, oldTaskData); > return data; > } > >@@ -169,7 +169,7 @@ > return data.getAttribute(key); > } > >- public void updateTaskData(RepositoryTaskData data, Issue jiraIssue, JiraClient server) throws JiraException { >+ private void updateTaskData(RepositoryTaskData data, Issue jiraIssue, JiraClient server, RepositoryTaskData oldTaskData) throws JiraException { > String parentKey = jiraIssue.getParentKey(); > if (parentKey != null) { > data.setAttributeValue(JiraAttributeFactory.ATTRIBUTE_ISSUE_PARENT_KEY, parentKey); >@@ -330,18 +330,27 @@ > > // TODO move into server configuration and populate lazily > HashSet<String> editableKeys = new HashSet<String>(); >- try { >- RepositoryTaskAttribute[] editableAttributes = server.getEditableAttributes(jiraIssue.getKey()); >- if (editableAttributes != null) { >- // System.err.println(data.getTaskKey()); >- for (RepositoryTaskAttribute attribute : editableAttributes) { >- // System.err.println(" " + attribute.getID() + " : " + >- // attribute.getName()); >- editableKeys.add(attributeFactory.mapCommonAttributeKey(attribute.getID())); >+ if (oldTaskData != null) { >+ // avoid server round-trips >+ for (RepositoryTaskAttribute attribute : oldTaskData.getAttributes()) { >+ if (!attribute.isReadOnly()) { >+ editableKeys.add(attribute.getID()); > } >+ } >+ } else { >+ try { >+ RepositoryTaskAttribute[] editableAttributes = server.getEditableAttributes(jiraIssue.getKey()); >+ if (editableAttributes != null) { >+ // System.err.println(data.getTaskKey()); >+ for (RepositoryTaskAttribute attribute : editableAttributes) { >+ // System.err.println(" " + attribute.getID() + " : " + >+ // attribute.getName()); >+ editableKeys.add(attributeFactory.mapCommonAttributeKey(attribute.getID())); >+ } >+ } >+ } catch (JiraInsufficientPermissionException ex) { >+ // ignore > } >- } catch (JiraInsufficientPermissionException ex) { >- // ignore > } > > for (RepositoryTaskAttribute attribute : data.getAttributes()) { >@@ -419,9 +428,17 @@ > } > } > >- public void addOperations(RepositoryTaskData data, Issue issue, JiraClient server) throws JiraException { >- Status status = issue.getStatus(); >+ public void addOperations(RepositoryTaskData data, Issue issue, JiraClient server, RepositoryTaskData oldTaskData) throws JiraException { >+ // avoid server round-trips >+ if (oldTaskData != null) { >+ for (RepositoryOperation operation : oldTaskData.getOperations()) { >+ data.addOperation(operation); >+ } >+ return; >+ } > >+ Status status = issue.getStatus(); >+ > RepositoryOperation leaveOperation = new RepositoryOperation(LEAVE_OPERATION, "Leave as " > + issue.getStatus().getName()); > leaveOperation.setChecked(true); >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.55 >diff -u -r1.55 JiraRepositoryConnector.java >--- src/org/eclipse/mylyn/internal/jira/ui/JiraRepositoryConnector.java 14 Jun 2007 03:35:23 -0000 1.55 >+++ src/org/eclipse/mylyn/internal/jira/ui/JiraRepositoryConnector.java 14 Jun 2007 06:25:29 -0000 >@@ -15,7 +15,6 @@ > import java.text.SimpleDateFormat; > import java.util.ArrayList; > import java.util.Calendar; >-import java.util.Collections; > import java.util.Date; > import java.util.HashSet; > import java.util.List; >@@ -41,17 +40,20 @@ > import org.eclipse.mylyn.internal.jira.core.model.filter.RelativeDateRangeFilter.RangeType; > import org.eclipse.mylyn.internal.jira.core.service.JiraClient; > import org.eclipse.mylyn.internal.jira.core.service.JiraException; >+import org.eclipse.mylyn.internal.tasks.core.RepositoryTaskHandleUtil; > import org.eclipse.mylyn.tasks.core.AbstractAttributeFactory; > 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.IAttachmentHandler; >+import org.eclipse.mylyn.tasks.core.ITaskCollector; > import org.eclipse.mylyn.tasks.core.ITaskDataHandler; > 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.TaskRepository; > import org.eclipse.mylyn.tasks.core.AbstractTask.PriorityLevel; >+import org.eclipse.mylyn.tasks.ui.TaskFactory; > import org.eclipse.mylyn.tasks.ui.TasksUiPlugin; > > /** >@@ -109,7 +111,7 @@ > > @Override > public IStatus performQuery(AbstractRepositoryQuery repositoryQuery, TaskRepository repository, >- IProgressMonitor monitor, QueryHitCollector resultCollector, boolean forced) { >+ IProgressMonitor monitor, ITaskCollector resultCollector) { > JiraClient client = JiraClientFacade.getDefault().getJiraClient(repository); > > Query filter; >@@ -143,10 +145,13 @@ > try { > int n = 0; > for (Issue issue : issues) { >- if(monitor.isCanceled()) return Status.CANCEL_STATUS; >+ if (monitor.isCanceled()) >+ return Status.CANCEL_STATUS; > >- monitor.subTask(n++ + "/" + issues.size() +" " + issue.getKey() + " " + issue.getSummary()); >- resultCollector.accept(offlineHandler.createTaskData(repository, client, issue)); >+ monitor.subTask(++n + "/" + issues.size() + " " + issue.getKey() + " " + issue.getSummary()); >+ String handle = RepositoryTaskHandleUtil.getHandle(repository.getUrl(), issue.getId()); >+ RepositoryTaskData oldTaskData = TasksUiPlugin.getDefault().getTaskDataManager().getNewTaskData(handle); >+ resultCollector.accept(offlineHandler.createTaskData(repository, client, issue, oldTaskData)); > } > return Status.OK_STATUS; > } catch (JiraException e) { >@@ -156,9 +161,9 @@ > } > } > >- public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository, >- Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException { >- >+ @Override >+ public boolean updateNeedsSynchronization(TaskRepository repository, Set<AbstractTask> tasks, >+ IProgressMonitor monitor) throws CoreException { > String dateString = repository.getSyncTimeStamp(); > Date lastSyncDate = convertDate(dateString); > if (lastSyncDate == null) { >@@ -170,59 +175,65 @@ > } > } > if (lastSyncDate == null) { >- return tasks; >+ for (AbstractTask task : tasks) { >+ task.setNeedsSynchronization(true); >+ } >+ return true; > } > > long mil = lastSyncDate.getTime(); > long now = Calendar.getInstance().getTimeInMillis(); > if (now - mil <= 0) { >- return Collections.emptySet(); >+ return false; > } > long minutes = -1 * ((now - mil) / (1000 * 60)); > if (minutes == 0) { >- return Collections.emptySet(); >+ return false; > } > > 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)); >- } >+ client.search(changedFilter, issueCollector); > >- 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); >+ if (issues.isEmpty()) { >+ return false; // no hits > } > >- if (issue.getUpdated() != null && issue.getUpdated().after(lastSyncDate)) { >- lastSyncDate = issue.getUpdated(); >+ int n = 0; >+ TaskFactory factory = new TaskFactory(repository); >+ for (Issue issue : issues) { >+ AbstractTask task = TasksUiPlugin.getTaskListManager().getTaskList().getTask(repository.getUrl(), >+ issue.getId()); >+ if (!tasks.contains(task)) { >+ continue; >+ } >+ >+ monitor.subTask(++n + "/" + issues.size() + " " + issue.getKey() + " " + issue.getSummary()); >+ String handle = RepositoryTaskHandleUtil.getHandle(repository.getUrl(), issue.getId()); >+ RepositoryTaskData oldTaskData = TasksUiPlugin.getDefault().getTaskDataManager().getNewTaskData(handle); >+ RepositoryTaskData taskData = offlineHandler.createTaskData(repository, client, issue, oldTaskData); >+ factory.createTask(taskData, true, false, new NullProgressMonitor()); >+ >+ 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 changedTasks; >+ return true; >+ } catch (JiraException e) { >+ throw new CoreException(JiraCorePlugin.toStatus(repository, e)); >+ } > } > > private Date convertDate(String dateString) { >@@ -238,8 +249,8 @@ > } > > @Override >- public String getLastSyncTimestamp(TaskRepository repository, Set<AbstractTask> changedTasks) { >- // XXX to late for JIRA to calcualate the timestamp: bug 176934 >+ public String getSynchronizationTimestamp(TaskRepository repository, Set<AbstractTask> changedTasks) { >+ // the timestamp is updated in updateNeedsSynchronization() > return repository.getSyncTimeStamp(); > } > >@@ -372,8 +383,7 @@ > jiraTask.setTaskUrl(getTaskUrl(repository.getUrl(), repositoryTask.getTaskKey())); > > JiraClient client = JiraClientFacade.getDefault().getJiraClient(repository); >- jiraTask.setPriority(getMylarPriority(client, taskData.getAttributeValue(RepositoryTaskAttribute.PRIORITY)) >- .toString()); >+ jiraTask.setPriority(getMylarPriority(client, taskData.getAttributeValue(RepositoryTaskAttribute.PRIORITY)).toString()); > for (org.eclipse.mylyn.internal.jira.core.model.Status status : client.getStatuses()) { > if (status.getName().equals(taskData.getAttributeValue(RepositoryTaskAttribute.STATUS))) { > if (isCompleted(status)) {
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 Raw
Actions:
View
Attachments on
bug 191575
:
70795
|
71134
|
71135
|
71190
| 71272 |
71273
|
71276
|
71325
|
71344
|
71355
|
71364