Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 191575 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/tasks/core/TaskRepository.java (-7 / +19 lines)
Lines 294-301 Link Here
294
294
295
	@Override
295
	@Override
296
	public boolean equals(Object object) {
296
	public boolean equals(Object object) {
297
		if (object instanceof TaskRepository && getUrl() != null) {
297
		if (object instanceof TaskRepository) {
298
			return getUrl().equals(((TaskRepository) object).getUrl());
298
			TaskRepository repository = (TaskRepository) object;
299
			if (getUrl() == null) {
300
				if (repository.getUrl() != null) {
301
					return false;
302
				}
303
			} else {
304
				if(!getUrl().equals(repository.getUrl())) {
305
					return false;
306
				}
307
			}
308
			if (getKind() == null) {
309
				return repository.getKind() == null;
310
			} else {
311
				return getKind().equals(repository.getKind());
312
			}
313
299
		} else {
314
		} else {
300
			return super.equals(object);
315
			return super.equals(object);
301
		}
316
		}
Lines 303-313 Link Here
303
318
304
	@Override
319
	@Override
305
	public int hashCode() {
320
	public int hashCode() {
306
		if (getUrl() != null) {
321
		int res = getUrl()==null ? 1 : getUrl().hashCode();
307
			return getUrl().hashCode();
322
		return res * 31 + (getKind()==null ? 1 : getKind().hashCode());
308
		} else {
309
			return super.hashCode();
310
		}
311
	}
323
	}
312
324
313
	@Override
325
	@Override
(-)src/org/eclipse/mylyn/tasks/core/AbstractTask.java (+11 lines)
Lines 66-71 Link Here
66
66
67
	// transient
67
	// transient
68
	private IStatus errorStatus = null;
68
	private IStatus errorStatus = null;
69
70
	private boolean stale = false;
69
	
71
	
70
	public enum RepositoryTaskSyncState {
72
	public enum RepositoryTaskSyncState {
71
		OUTGOING, SYNCHRONIZED, INCOMING, CONFLICT
73
		OUTGOING, SYNCHRONIZED, INCOMING, CONFLICT
Lines 442-445 Link Here
442
	public void setDueDate(Date date) {
444
	public void setDueDate(Date date) {
443
		this.dueDate = date;
445
		this.dueDate = date;
444
	}
446
	}
447
448
	public boolean isStale() {
449
		return stale;
450
	}
451
	
452
	public void setStale(boolean stale) {
453
		this.stale = stale;
454
	}
455
	
445
}
456
}
(-)src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java (-9 / +15 lines)
Lines 171-177 Link Here
171
	 *            IQueryHitCollector that collects the hits found
171
	 *            IQueryHitCollector that collects the hits found
172
	 */
172
	 */
173
	public abstract IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository,
173
	public abstract IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository,
174
			IProgressMonitor monitor, QueryHitCollector resultCollector, boolean forced);
174
			IProgressMonitor monitor, ITaskCollector resultCollector);
175
175
176
	/**
176
	/**
177
	 * The connector's summary i.e. "JIRA (supports 3.3.1 and later)"
177
	 * The connector's summary i.e. "JIRA (supports 3.3.1 and later)"
Lines 250-267 Link Here
250
	}
250
	}
251
251
252
	/**
252
	/**
253
	 * Of <code>tasks</code> provided, return all that have changed since last
253
	 * Of <code>tasks</code> provided, return all that have changed since last synchronization of
254
	 * synchronization of <code>repository</code>
254
	 * <code>repository</code>.
255
	 * 
255
	 * 
256
	 * All errors should be thrown as <code>CoreException</code> for the
256
	 * Tasks that need to be synchronized (i.e. task data updated) should be passed to
257
	 * framework to handle, since background synchronizations fail silently when
257
	 * <code>collector.accept(Task)</code> method, or if repository connector can update task data, it can use
258
	 * disconnected.
258
	 * <code>collector.accept(RepositoryTaskData)</code> call.
259
	 * 
259
	 * 
260
	 * TODO: Add progress monitor as parameter
260
	 * All errors should be thrown as <code>CoreException</code> for the framework to handle, since background
261
	 * synchronizations fail silently when disconnected.
262
	 * @param tasks TODO
263
	 * 
264
	 * @return null if there was no tasks changed in the repository, otherwise collection of updated tasks (within
265
	 *         <code>tasks</code> collection), so empty collection means that there are some other tasks changed
261
	 * 
266
	 * 
262
	 * @throws CoreException
267
	 * @throws CoreException
263
	 */
268
	 */
264
	public abstract Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository,
269
	public abstract boolean markStaleTasks(TaskRepository repository, 
265
			Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException;
270
			Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException;
266
271
267
	/**
272
	/**
Lines 392-398 Link Here
392
	 * synchronization timestamp. Override to return actual timestamp from
397
	 * synchronization timestamp. Override to return actual timestamp from
393
	 * repository.
398
	 * repository.
394
	 */
399
	 */
395
	public String getLastSyncTimestamp(TaskRepository repository, Set<AbstractTask> changedTasks) {
400
	public String getSynchronizationTimestamp(TaskRepository repository, Set<AbstractTask> changedTasks) {
396
		Date mostRecent = new Date(0);
401
		Date mostRecent = new Date(0);
397
		String mostRecentTimeStamp = repository.getSyncTimeStamp();
402
		String mostRecentTimeStamp = repository.getSyncTimeStamp();
398
		for (AbstractTask task : changedTasks) {
403
		for (AbstractTask task : changedTasks) {
Lines 432-435 Link Here
432
		this.taskDataManager = taskDataManager;
437
		this.taskDataManager = taskDataManager;
433
	}
438
	}
434
439
440
435
}
441
}
(-)src/org/eclipse/mylyn/tasks/core/ITaskFactory.java (-1 / +1 lines)
Lines 23-28 Link Here
23
	 * @param forced -
23
	 * @param forced -
24
	 *            user requested synchronization
24
	 *            user requested synchronization
25
	 */
25
	 */
26
	public abstract AbstractTask createTask(RepositoryTaskData taskData, boolean synchData, boolean forced, IProgressMonitor monitor) throws CoreException;
26
	public abstract AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor) throws CoreException;
27
27
28
}
28
}
(-)src/org/eclipse/mylyn/tasks/core/QueryHitCollector.java (-87 / +20 lines)
Lines 10-140 Link Here
10
 *******************************************************************************/
10
 *******************************************************************************/
11
package org.eclipse.mylyn.tasks.core;
11
package org.eclipse.mylyn.tasks.core;
12
12
13
import java.text.MessageFormat;
14
import java.util.HashSet;
13
import java.util.HashSet;
15
import java.util.Set;
14
import java.util.Set;
16
15
17
import org.eclipse.core.runtime.CoreException;
16
import org.eclipse.core.runtime.CoreException;
18
import org.eclipse.core.runtime.IProgressMonitor;
19
import org.eclipse.core.runtime.NullProgressMonitor;
17
import org.eclipse.core.runtime.NullProgressMonitor;
20
import org.eclipse.core.runtime.SubProgressMonitor;
21
18
22
/**
19
/**
23
 * Collects QueryHits resulting from repository search
20
 * Collects QueryHits resulting from repository search
24
 * 
21
 * 
25
 * @author Shawn Minto
22
 * @author Shawn Minto
26
 * @author Rob Elves (generalized from bugzilla)
23
 * @author Rob Elves (generalized from bugzilla)
24
 * @author Steffen Pingel
27
 */
25
 */
28
public class QueryHitCollector {
26
public class QueryHitCollector implements ITaskCollector {
29
27
30
	public static final int MAX_HITS = 5000;
28
	public static final int MAX_HITS = 5000;
31
29
32
	public static final String MAX_HITS_REACHED = "Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope.";
30
	public static final String MAX_HITS_REACHED = "Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope.";
33
31
34
	protected Set<AbstractTask> taskResults = new HashSet<AbstractTask>();
32
	private final Set<AbstractTask> taskResults = new HashSet<AbstractTask>();
35
33
36
	/** The progress monitor for the search operation */
34
	private final TaskList taskList;
37
	private IProgressMonitor monitor = new NullProgressMonitor();
38
35
39
	/** The number of matches found */
36
	private final ITaskFactory taskFactory;
40
	private int matchCount;
41
42
	/** The string to display to the user while querying */
43
	private static final String STARTING = "querying the server";
44
45
	/** The string to display to the user when we have 1 match */
46
	private static final String MATCH = "1 match";
47
48
	/** The string to display to the user when we have multiple or no matches */
49
	private static final String MATCHES = "{0} matches";
50
51
	/** The string to display to the user when the query is done */
52
	private static final String DONE = "done";
53
54
	protected TaskList taskList;
55
56
	protected ITaskFactory taskFactory;
57
37
58
	public QueryHitCollector(TaskList tasklist, ITaskFactory taskFactory) {
38
	public QueryHitCollector(TaskList tasklist, ITaskFactory taskFactory) {
59
		this.taskList = tasklist;
39
		this.taskList = tasklist;
60
		this.taskFactory = taskFactory;
40
		this.taskFactory = taskFactory;
61
	}
41
	}
62
42
63
	public void aboutToStart(int startMatchCount) throws CoreException {
64
		taskResults.clear();
65
		matchCount = startMatchCount;
66
		monitor.setTaskName(STARTING);
67
	}
68
69
	public void accept(AbstractTask task) {
43
	public void accept(AbstractTask task) {
70
44
		if (task == null) {
71
		if (!getProgressMonitor().isCanceled()) {
45
			throw new IllegalArgumentException();
72
			getProgressMonitor().subTask(getFormattedMatchesString(matchCount));
73
			getProgressMonitor().worked(1);
74
		}
46
		}
75
47
		
76
		if (task == null)
48
		AbstractTask existingTask = taskList.getTask(task.getHandleIdentifier());
77
			return;
49
		if (existingTask == null) {
78
50
			task.setStale(true);
79
		AbstractTask hitTask = taskList.getTask(task.getHandleIdentifier());
51
		} else {
80
		if (hitTask == null) {
52
			// preserve meta attributes of existing task
81
			hitTask = task;
53
			task.setLastSyncDateStamp(existingTask.getLastSyncDateStamp());
82
			// task is new, add to tasklist
54
			task.setStale(existingTask.isStale());
83
			taskList.addTask(hitTask);
84
		}
55
		}
85
		taskResults.add((AbstractTask) hitTask);
56
		
86
		matchCount++;
57
		taskResults.add((AbstractTask) task);
87
	}
58
	}
88
59
89
	public void accept(RepositoryTaskData taskData) throws CoreException {
60
	public void accept(RepositoryTaskData taskData) throws CoreException {
90
		if (taskData == null)
61
		if (taskData == null) {
91
			return;
62
			throw new IllegalArgumentException();
92
93
		if (!getProgressMonitor().isCanceled()) {
94
			getProgressMonitor().subTask(getFormattedMatchesString(matchCount));
95
			getProgressMonitor().worked(1);
96
		}
63
		}
97
64
98
		AbstractTask task = taskFactory.createTask(taskData, true, false, new SubProgressMonitor(monitor, 1));
65
		AbstractTask task = taskFactory.createTask(taskData, new NullProgressMonitor());
99
		taskResults.add(task);
66
		taskResults.add(task);
100
		matchCount++;
101
	}
102
103
	public void done() {
104
		if (monitor != null && !monitor.isCanceled()) {
105
			// if the operation is cancelled, finish with the data that we
106
			// already have
107
			String matchesString = getFormattedMatchesString(matchCount);
108
			monitor.setTaskName(MessageFormat.format(DONE, new Object[] { matchesString }));
109
			monitor.done();
110
		}
111
112
		// Cut no longer used references because the collector might be re-used
113
		monitor = null;
114
	}
115
116
	protected String getFormattedMatchesString(int count) {
117
		if (count == 1) {
118
			return MATCH;
119
		}
120
		Object[] messageFormatArgs = { new Integer(count) };
121
		return MessageFormat.format(MATCHES, messageFormatArgs);
122
	}
123
124
	public IProgressMonitor getProgressMonitor() {
125
		return monitor;
126
	}
127
128
	public void setProgressMonitor(IProgressMonitor monitor) {
129
		this.monitor = monitor;
130
	}
67
	}
131
68
132
	public Set<AbstractTask> getTaskHits() {
69
	public Set<AbstractTask> getTaskHits() {
133
		return taskResults;
70
		return taskResults;
134
	}
71
	}
135
72
136
	public void clear() {
137
		taskResults.clear();
138
	}
139
140
}
73
}
(-)src/org/eclipse/mylyn/tasks/core/DelegatingTaskExternalizer.java (+12 lines)
Lines 126-131 Link Here
126
	public static final String KEY_SYNC_STATE = "offlineSyncState";
126
	public static final String KEY_SYNC_STATE = "offlineSyncState";
127
127
128
	public static final String KEY_OWNER = "Owner";
128
	public static final String KEY_OWNER = "Owner";
129
	
130
	public static final String KEY_STALE = "Stale";
129
131
130
	private List<ITaskListExternalizer> delegateExternalizers = new ArrayList<ITaskListExternalizer>();
132
	private List<ITaskListExternalizer> delegateExternalizers = new ArrayList<ITaskListExternalizer>();
131
133
Lines 204-209 Link Here
204
		} else {
206
		} else {
205
			node.setAttribute(KEY_REMINDED, VAL_FALSE);
207
			node.setAttribute(KEY_REMINDED, VAL_FALSE);
206
		}
208
		}
209
		if (task.isStale()) {
210
			node.setAttribute(KEY_STALE, VAL_TRUE);
211
		} else {
212
			node.setAttribute(KEY_STALE, VAL_FALSE);
213
		}
207
214
208
		if (task instanceof AbstractTask) {
215
		if (task instanceof AbstractTask) {
209
			AbstractTask abstractTask = (AbstractTask) task;
216
			AbstractTask abstractTask = (AbstractTask) task;
Lines 483-488 Link Here
483
		} else {
490
		} else {
484
			task.setReminded(false);
491
			task.setReminded(false);
485
		}
492
		}
493
		if (element.hasAttribute(KEY_STALE) && element.getAttribute(KEY_STALE).compareTo(VAL_TRUE) == 0) {
494
			task.setStale(true);
495
		} else {
496
			task.setStale(false);
497
		}
486
498
487
		if (task instanceof AbstractTask) {
499
		if (task instanceof AbstractTask) {
488
			AbstractTask abstractTask = (AbstractTask) task;
500
			AbstractTask abstractTask = (AbstractTask) task;
(-).refactorings/2007/6/24/refactorings.index (-6 / +11 lines)
Lines 23-31 Link Here
23
1181767990694	Rename type 'AbstractTaskListElement'
23
1181767990694	Rename type 'AbstractTaskListElement'
24
1181769454884	Rename type 'DateRangeContainer'
24
1181769454884	Rename type 'DateRangeContainer'
25
1181769501743	Rename type 'DateRangeActivityDelegate'
25
1181769501743	Rename type 'DateRangeActivityDelegate'
26
1181781818576	Rename method 'notifyLocalInfoChanged'
26
1181782714681	Rename method 'getChangedSinceLastSync'
27
1181788002784	Rename method 'add'
27
1181782786972	Change method 'updateNeedSynchronization'
28
1181788017786	Rename method 'remove'
28
1181785485666	Change method 'performQuery'
29
1181803285976	Rename field 'automaticCategory'
29
1181789110090	Change method 'updateNeedsSynchronization'
30
1181803314502	Rename method 'getAutomaticCategory'
30
1181791320957	Change method 'performQuery'
31
1181808412801	Change method 'moveToContainer'
31
1181799708110	Rename type 'IQueryHitCollector'
32
1181800787610	Rename method 'getLastModifiedTimestamp'
33
1181800884406	Rename method 'getTaskRepositorySynchronizationTimestamp'
34
1181841846726	Rename method 'getNeedsSynchronization'
35
1181841875963	Rename method 'setNeedsSynchronization'
36
1181841998942	Rename method 'updateNeedsSynchronization'
(-).refactorings/2007/6/24/refactorings.history (-8 / +12 lines)
Lines 1-4 Link Here
1
<?xml version="1.0" encoding="utf-8" standalone="no"?>
1
<?xml version="1.0" encoding="utf-8"?>
2
<session version="1.0">
2
<session version="1.0">
3
<refactoring comment="Rename field 'DESCRIPTION_DEFAULT' in 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector' to 'DEFAULT_SUMMARY'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector.DESCRIPTION_DEFAULT'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector.DEFAULT_SUMMARY'&#13;&#10;- Update references to refactored element&#13;&#10;- 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&lt;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"/>
3
<refactoring comment="Rename field 'DESCRIPTION_DEFAULT' in 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector' to 'DEFAULT_SUMMARY'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector.DESCRIPTION_DEFAULT'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector.DEFAULT_SUMMARY'&#13;&#10;- Update references to refactored element&#13;&#10;- 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&lt;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"/>
4
<refactoring comment="Push down members from 'org.eclipse.mylyn.tasks.core.Task'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original elements:&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.active&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasReminded&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.summary&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.priority&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.notes&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.estimatedTimeHours&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.completed&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.taskUrl&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.parentCategory&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.completionDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.creationDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.scheduledForDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.dueDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.kind&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.toString()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setActive(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isActive()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.equals(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hashCode()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isCompleted()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCompleted(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getPriority()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setPriority(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setTaskUrl(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getTaskUrl()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getNotes()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setNotes(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getEstimateTimeHours()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setEstimatedTimeHours(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setContainer(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getContainer()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getSummary()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getCompletionDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setScheduledForDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getScheduledForDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasBeenReminded()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setReminded(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getCreationDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCreationDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setSummary(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCompletionDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isPastReminder()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasValidUrl()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getTaskKind()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setKind(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.compareTo(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getDueDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setDueDate(...)&#13;&#10;- Pushed members:&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.active&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasReminded&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.summary&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.priority&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.notes&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.estimatedTimeHours&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.completed&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.taskUrl&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.parentCategory&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.completionDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.creationDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.scheduledForDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.dueDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.kind&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.toString()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setActive(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isActive()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.equals(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hashCode()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isCompleted()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCompleted(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getPriority()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setPriority(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setTaskUrl(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getTaskUrl()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getNotes()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setNotes(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getEstimateTimeHours()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setEstimatedTimeHours(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setContainer(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getContainer()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getSummary()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getCompletionDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setScheduledForDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getScheduledForDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasBeenReminded()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setReminded(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getCreationDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCreationDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setSummary(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCompletionDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isPastReminder()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasValidUrl()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getTaskKind()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setKind(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.compareTo(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getDueDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setDueDate(...)" description="Push down" element1="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^active" element10="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^completionDate" element11="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^creationDate" element12="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^scheduledForDate" element13="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^dueDate" element14="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~toSt" element15="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~toString" element16="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isActivee~Z" element17="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isActive" element18="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~hashCodeObject;" element19="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~hashCode" element2="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isCompleted" element20="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isCompleted" element21="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getPriorityd~Z" element22="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getPriority" element23="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setTaskUrl~QString;;" element24="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setTaskUrl~QString;" element25="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getNotesrl" element26="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getNotes" element27="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getEstimateTimeHo" element28="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getEstimateTimeHours" element29="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^summarymatedTimeHours~I" element3="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^summary" element30="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getContainer~QAbstractTaskContainer;" element31="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getContainer" element32="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getComplet" element33="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getCompletionDate" element34="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getScheduledForDate~QDate;" element35="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getScheduledForDate" element36="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setReminded~Zed" element37="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setReminded~Z" element38="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setCreationDate" element39="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setCreationDate~QDate;" element4="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setSumma" element40="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setSummary~QString;" element41="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isPastReminderate~QDate;" element42="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isPastReminder" element43="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getTaskKind" element44="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getTaskKind" element45="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~compareTo~QITask" element46="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~compareTo~QITaskListElement;" element47="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setDueDate" element48="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setDueDate~QDate;" element5="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^estim" element6="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^estimatedTimeHours" element7="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^taskUrled" element8="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^taskUrl" element9="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^parentCategory" flags="589830" id="org.eclipse.jdt.ui.push.down" input="/src&lt;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"/>
4
<refactoring comment="Push down members from 'org.eclipse.mylyn.tasks.core.Task'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original elements:&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.active&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasReminded&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.summary&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.priority&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.notes&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.estimatedTimeHours&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.completed&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.taskUrl&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.parentCategory&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.completionDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.creationDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.scheduledForDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.dueDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.kind&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.toString()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setActive(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isActive()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.equals(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hashCode()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isCompleted()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCompleted(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getPriority()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setPriority(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setTaskUrl(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getTaskUrl()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getNotes()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setNotes(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getEstimateTimeHours()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setEstimatedTimeHours(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setContainer(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getContainer()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getSummary()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getCompletionDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setScheduledForDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getScheduledForDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasBeenReminded()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setReminded(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getCreationDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCreationDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setSummary(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCompletionDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isPastReminder()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasValidUrl()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getTaskKind()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setKind(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.compareTo(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getDueDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setDueDate(...)&#13;&#10;- Pushed members:&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.active&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasReminded&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.summary&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.priority&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.notes&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.estimatedTimeHours&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.completed&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.taskUrl&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.parentCategory&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.completionDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.creationDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.scheduledForDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.dueDate&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.kind&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.toString()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setActive(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isActive()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.equals(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hashCode()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isCompleted()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCompleted(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getPriority()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setPriority(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setTaskUrl(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getTaskUrl()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getNotes()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setNotes(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getEstimateTimeHours()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setEstimatedTimeHours(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setContainer(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getContainer()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getSummary()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getCompletionDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setScheduledForDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getScheduledForDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasBeenReminded()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setReminded(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getCreationDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCreationDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setSummary(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setCompletionDate(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.isPastReminder()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.hasValidUrl()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getTaskKind()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setKind(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.compareTo(...)&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.getDueDate()&#13;&#10;     org.eclipse.mylyn.tasks.core.Task.setDueDate(...)" description="Push down" element1="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^active" element10="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^completionDate" element11="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^creationDate" element12="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^scheduledForDate" element13="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^dueDate" element14="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~toSt" element15="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~toString" element16="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isActivee~Z" element17="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isActive" element18="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~hashCodeObject;" element19="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~hashCode" element2="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isCompleted" element20="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isCompleted" element21="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getPriorityd~Z" element22="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getPriority" element23="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setTaskUrl~QString;;" element24="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setTaskUrl~QString;" element25="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getNotesrl" element26="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getNotes" element27="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getEstimateTimeHo" element28="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getEstimateTimeHours" element29="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^summarymatedTimeHours~I" element3="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^summary" element30="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getContainer~QAbstractTaskContainer;" element31="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getContainer" element32="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getComplet" element33="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getCompletionDate" element34="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getScheduledForDate~QDate;" element35="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getScheduledForDate" element36="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setReminded~Zed" element37="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setReminded~Z" element38="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setCreationDate" element39="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setCreationDate~QDate;" element4="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setSumma" element40="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setSummary~QString;" element41="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isPastReminderate~QDate;" element42="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~isPastReminder" element43="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getTaskKind" element44="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~getTaskKind" element45="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~compareTo~QITask" element46="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~compareTo~QITaskListElement;" element47="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setDueDate" element48="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task~setDueDate~QDate;" element5="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^estim" element6="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^estimatedTimeHours" element7="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^taskUrled" element8="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^taskUrl" element9="/src&lt;org.eclipse.mylyn.tasks.core{Task.java[Task^parentCategory" flags="589830" id="org.eclipse.jdt.ui.push.down" input="/src&lt;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"/>
Lines 21-35 Link Here
21
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.UnfiledCategory.java'&#13;&#10;- Update references to refactored element" description="Move compilation unit" destination="/src&lt;org.eclipse.mylyn.internal.tasks.core" element1="/src&lt;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"/>
21
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.UnfiledCategory.java'&#13;&#10;- Update references to refactored element" description="Move compilation unit" destination="/src&lt;org.eclipse.mylyn.internal.tasks.core" element1="/src&lt;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"/>
22
<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original elements:&#13;&#10;     org.eclipse.mylyn.tasks.core.DateRangeActivityDelegate.java&#13;&#10;     org.eclipse.mylyn.tasks.core.DateRangeContainer.java&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src&lt;org.eclipse.mylyn.internal.tasks.core" element1="/src&lt;org.eclipse.mylyn.tasks.core{DateRangeActivityDelegate.java" element2="/src&lt;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"/>
22
<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original elements:&#13;&#10;     org.eclipse.mylyn.tasks.core.DateRangeActivityDelegate.java&#13;&#10;     org.eclipse.mylyn.tasks.core.DateRangeContainer.java&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src&lt;org.eclipse.mylyn.internal.tasks.core" element1="/src&lt;org.eclipse.mylyn.tasks.core{DateRangeActivityDelegate.java" element2="/src&lt;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"/>
23
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.TaskArchive.java'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src&lt;org.eclipse.mylyn.internal.tasks.core" element1="/src&lt;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"/>
23
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.TaskArchive.java'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src&lt;org.eclipse.mylyn.internal.tasks.core" element1="/src&lt;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"/>
24
25
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer' to 'AbstractTaskCategory'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskCategory'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
24
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer' to 'AbstractTaskCategory'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskCategory'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
26
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement' to 'AbstractTaskContainer'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskListElement'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
25
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement' to 'AbstractTaskContainer'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskListElement'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
27
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.DateRangeContainer' to 'ScheduledTaskContainer'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.core.DateRangeContainer'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'DateRangeContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
26
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.DateRangeContainer' to 'ScheduledTaskContainer'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.core.DateRangeContainer'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'DateRangeContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
28
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.DateRangeActivityDelegate' to 'ScheduledTaskDelegate'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.core.DateRangeActivityDelegate'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ScheduledTaskDelegate'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'DateRangeActivityDelegate'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
27
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.DateRangeActivityDelegate' to 'ScheduledTaskDelegate'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.core.DateRangeActivityDelegate'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ScheduledTaskDelegate'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'DateRangeActivityDelegate'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
29
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.notifyLocalInfoChanged(...)' to 'notifyTaskChanged'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.TaskList.notifyLocalInfoChanged(...)'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.notifyTaskChanged(...)'&#13;&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'notifyLocalInfoChanged'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~notifyLocalInfoChanged~QAbstractTask;" name="notifyTaskChanged" references="true" stamp="1181781818576" version="1.0"/>
28
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getChangedSinceLastSync(...)' to 'updateNeedSynchronization'&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getChangedSinceLastSync(...)'&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateNeedSynchronization(...)'&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getChangedSinceLastSync'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getChangedSinceLastSync~QTaskRepository;~QSet\&lt;QAbstractTask;&gt;;~QIProgressMonitor;~QQueryHitCollector;" name="updateNeedSynchronization" references="true" stamp="1181782714681" version="1.0"/>
30
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.add(...)' to 'addChild'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.add(...)'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.addChild(...)'&#13;&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'add'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~add~QAbstractTask;" name="addChild" references="true" stamp="1181788002784" version="1.0"/>
29
<refactoring comment="Change method 'public Set&lt;AbstractTask&gt; org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateNeedSynchronization(TaskRepository repository, Set&lt;AbstractTask&gt; tasks, IProgressMonitor monitor, QueryHitCollector collector) throws CoreException' to 'public boolean updateNeedsSynchronization(TaskRepository repository, IProgressMonitor monitor) throws CoreException'&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#10;- New name: 'updateNeedsSynchronization'&#10;- New return type: 'boolean'&#10;- Removed parameters:&#10;     Set&lt;AbstractTask&gt; tasks&#10;     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&lt;org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src&lt;org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateNeedSynchronization~QTaskRepository;~QSet\&lt;QAbstractTask;&gt;;~QIProgressMonitor;~QQueryHitCollector;" kind1="0" name="updateNeedsSynchronization" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="Set&lt;AbstractTask&gt; tasks 1 Set&lt;AbstractTask&gt; tasks true" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" parameter4="QueryHitCollector collector 3 QueryHitCollector collector true" return="boolean" stamp="1181782786972" version="1.0"/>
31
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.remove(...)' to 'removeChild'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.remove(...)'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.removeChild(...)'&#13;&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'remove'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~remove~QAbstractTask;" name="removeChild" references="true" stamp="1181788017786" version="1.0"/>
30
<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)'&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#10;- Removed parameters:&#10;     boolean forced" delegate="false" deprecate="true" description="Change method 'performQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src&lt;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"/>
32
<refactoring comment="Rename field 'automaticCategory' in 'org.eclipse.mylyn.tasks.core.TaskList' to 'defaultCategory'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.TaskList.automaticCategory'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.defaultCategory'&#13;&#10;- Update references to refactored element&#13;&#10;- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'automaticCategory'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src&lt;org.eclipse.mylyn.tasks.core{TaskList.java[TaskList^automaticCategory" name="defaultCategory" references="true" setter="false" stamp="1181803285976" textual="false" version="1.0"/>
31
<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&lt;AbstractTask&gt; tasks, IProgressMonitor monitor) throws CoreException'&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#10;- Added parameters:&#10;     Set&lt;AbstractTask&gt; 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&lt;org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src&lt;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&lt;AbstractTask&gt; tasks false" parameter3="IProgressMonitor monitor 1 IProgressMonitor monitor false" stamp="1181789110090" version="1.0"/>
33
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.getAutomaticCategory()' to 'getDefaultCategory'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.core.TaskList.getAutomaticCategory()'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.getDefaultCategory()'&#13;&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getAutomaticCategory'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~getAutomaticCategory" name="getDefaultCategory" references="true" stamp="1181803314502" version="1.0"/>
32
<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)'&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#10;- Changed parameters:&#10;     QueryHitCollector resultCollector" delegate="false" deprecate="true" description="Change method 'performQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src&lt;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"/>
34
<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.TaskList.moveToContainer(AbstractTask task, AbstractTaskCategory toContainer)' to 'public void moveToContainer(AbstractTask task, AbstractTaskCategory toContainer)'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.core'" delegate="false" deprecate="true" description="Change method 'moveToContainer'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src&lt;org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~moveToContainer~QAbstractTaskCategory;~QAbstractTask;" name="moveToContainer" parameter1="AbstractTask task 1 AbstractTask task false" parameter2="AbstractTaskCategory toContainer 0 AbstractTaskCategory toContainer false" stamp="1181808412801" version="1.0"/>
33
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.IQueryHitCollector' to 'ITaskCollector'&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#10;- Original element: 'org.eclipse.mylyn.tasks.core.IQueryHitCollector'&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.ITaskCollector'&#10;- Update references to refactored element&#10;- Update textual occurrences in comments and strings" description="Rename type 'IQueryHitCollector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
34
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getLastModifiedTimestamp(...)' to 'getTaskRepositorySynchronizationTimestamp'&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getLastModifiedTimestamp(...)'&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getTaskRepositorySynchronizationTimestamp(...)'&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getLastModifiedTimestamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getLastModifiedTimestamp~QTaskRepository;~QSet\&lt;QAbstractTask;&gt;;" name="getTaskRepositorySynchronizationTimestamp" references="true" stamp="1181800787610" version="1.0"/>
35
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getTaskRepositorySynchronizationTimestamp(...)' to 'getSynchronizationTimestamp'&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getTaskRepositorySynchronizationTimestamp(...)'&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getSynchronizationTimestamp(...)'&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskRepositorySynchronizationTimestamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getTaskRepositorySynchronizationTimestamp~QTaskRepository;~QSet\&lt;QAbstractTask;&gt;;" name="getSynchronizationTimestamp" references="true" stamp="1181800884406" version="1.0"/>
36
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.getNeedsSynchronization()' to 'isStale'&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getNeedsSynchronization()'&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.isStale()'&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getNeedsSynchronization'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getNeedsSynchronization" name="isStale" references="true" stamp="1181841846726" version="1.0"/>
37
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.setNeedsSynchronization(...)' to 'setStale'&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setNeedsSynchronization(...)'&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setStale(...)'&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setNeedsSynchronization'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setNeedsSynchronization~Z" name="setStale" references="true" stamp="1181841875963" version="1.0"/>
38
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateNeedsSynchronization(...)' to 'markStaleTasks'&#10;- Original project: 'org.eclipse.mylyn.tasks.core'&#10;- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateNeedsSynchronization(...)'&#10;- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.markStaleTasks(...)'&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateNeedsSynchronization'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateNeedsSynchronization~QTaskRepository;~QSet\&lt;QAbstractTask;&gt;;~QIProgressMonitor;" name="markStaleTasks" references="true" stamp="1181841998942" version="1.0"/>
35
</session>
39
</session>
(-)src/org/eclipse/mylyn/internal/tasks/core/LocalRepositoryConnector.java (-6 / +6 lines)
Lines 11-17 Link Here
11
11
12
package org.eclipse.mylyn.internal.tasks.core;
12
package org.eclipse.mylyn.internal.tasks.core;
13
13
14
import java.util.Collections;
14
15
import java.util.Set;
15
import java.util.Set;
16
16
17
import org.eclipse.core.runtime.CoreException;
17
import org.eclipse.core.runtime.CoreException;
Lines 21-28 Link Here
21
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
21
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
22
import org.eclipse.mylyn.tasks.core.AbstractTask;
22
import org.eclipse.mylyn.tasks.core.AbstractTask;
23
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
23
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
24
import org.eclipse.mylyn.tasks.core.ITaskCollector;
24
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
25
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
25
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
26
import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
26
import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
27
import org.eclipse.mylyn.tasks.core.TaskRepository;
27
import org.eclipse.mylyn.tasks.core.TaskRepository;
28
28
Lines 63-71 Link Here
63
	}
63
	}
64
64
65
	@Override
65
	@Override
66
	public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository,
66
	public boolean markStaleTasks(TaskRepository repository,
67
			Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException {
67
			Set<AbstractTask> tasks, IProgressMonitor monitor) {
68
		return Collections.emptySet();
68
		return false;
69
	}
69
	}
70
70
71
	@Override
71
	@Override
Lines 104-110 Link Here
104
104
105
	@Override
105
	@Override
106
	public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor,
106
	public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor,
107
			QueryHitCollector resultCollector, boolean forced) {
107
			ITaskCollector resultCollector) {
108
		// ignore
108
		// ignore
109
		return null;
109
		return null;
110
	}
110
	}
(-)src/org/eclipse/mylyn/tasks/core/ITaskCollector.java (+22 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004 - 2006 University Of British Columbia and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     University Of British Columbia - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.tasks.core;
13
14
import org.eclipse.core.runtime.CoreException;
15
16
public interface ITaskCollector {
17
18
	void accept(AbstractTask task);
19
20
	void accept(RepositoryTaskData taskData) throws CoreException;
21
22
}
(-)src/org/eclipse/mylyn/tests/integration/LiveWebConnectorTemplatesTest.java (-2 / +1 lines)
Lines 55-62 Link Here
55
		QueryHitCollector collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(),
55
		QueryHitCollector collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(),
56
				new ITaskFactory() {
56
				new ITaskFactory() {
57
57
58
					public AbstractTask createTask(RepositoryTaskData taskData, boolean synchData,
58
					public AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor) throws CoreException {
59
							boolean forced, IProgressMonitor monitor) throws CoreException {
60
						// ignore
59
						// ignore
61
						return null;
60
						return null;
62
					}
61
					}
(-)src/org/eclipse/mylyn/jira/tests/JiraFilterTest.java (-4 / +4 lines)
Lines 136-142 Link Here
136
136
137
		QueryHitCollector hitCollector = new QueryHitCollector(taskList, new TaskFactory(repository));
137
		QueryHitCollector hitCollector = new QueryHitCollector(taskList, new TaskFactory(repository));
138
138
139
		connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector, false);
139
		connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector);
140
		assertEquals(1, hitCollector.getTaskHits().size());
140
		assertEquals(1, hitCollector.getTaskHits().size());
141
		assertEquals(issue.getSummary(), hitCollector.getTaskHits().iterator().next().getSummary());
141
		assertEquals(issue.getSummary(), hitCollector.getTaskHits().iterator().next().getSummary());
142
		//assertEquals(PriorityLevel.P1.toString(), hitCollector.getTaskDataHits().iterator().next().getPriority());
142
		//assertEquals(PriorityLevel.P1.toString(), hitCollector.getTaskDataHits().iterator().next().getPriority());
Lines 164-176 Link Here
164
164
165
		JiraCustomQuery query = new JiraCustomQuery(repository.getUrl(), filter, repository.getCharacterEncoding());
165
		JiraCustomQuery query = new JiraCustomQuery(repository.getUrl(), filter, repository.getCharacterEncoding());
166
		QueryHitCollector hitCollector = new QueryHitCollector(taskList, new TaskFactory(repository));
166
		QueryHitCollector hitCollector = new QueryHitCollector(taskList, new TaskFactory(repository));
167
		connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector, false);
167
		connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector);
168
		assertEquals(1, hitCollector.getTaskHits().size());
168
		assertEquals(1, hitCollector.getTaskHits().size());
169
		assertEquals(issue2.getSummary(), hitCollector.getTaskHits().iterator().next().getSummary());
169
		assertEquals(issue2.getSummary(), hitCollector.getTaskHits().iterator().next().getSummary());
170
170
171
		hitCollector.clear();
171
		hitCollector = new QueryHitCollector(taskList, new TaskFactory(repository));
172
		JiraClientFacade.getDefault().clearClientsAndConfigurationData();
172
		JiraClientFacade.getDefault().clearClientsAndConfigurationData();
173
		connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector, false);
173
		connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector);
174
		assertEquals(1, hitCollector.getTaskHits().size());
174
		assertEquals(1, hitCollector.getTaskHits().size());
175
		assertEquals(issue2.getSummary(), hitCollector.getTaskHits().iterator().next().getSummary());
175
		assertEquals(issue2.getSummary(), hitCollector.getTaskHits().iterator().next().getSummary());
176
	}
176
	}
(-)src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java (-7 / +10 lines)
Lines 386-394 Link Here
386
		TasksUiPlugin.getRepositoryManager().setSyncTime(repository, task5.getLastSyncDateStamp(),
386
		TasksUiPlugin.getRepositoryManager().setSyncTime(repository, task5.getLastSyncDateStamp(),
387
				TasksUiPlugin.getDefault().getRepositoriesFilePath());
387
				TasksUiPlugin.getDefault().getRepositoriesFilePath());
388
388
389
		Set<AbstractTask> changedTasks = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor());
389
		boolean changed = connector.markStaleTasks(repository, tasks, new NullProgressMonitor());
390
		assertTrue(changed);
390
		// Always last known changed returned
391
		// Always last known changed returned
391
		assertEquals(1, changedTasks.size());
392
		assertFalse(task4.isStale());
393
		assertTrue(task5.isStale());
392
394
393
		String priority4 = null;
395
		String priority4 = null;
394
		if (task4.getPriority().equals("P1")) {
396
		if (task4.getPriority().equals("P1")) {
Lines 414-427 Link Here
414
		submit(task4, taskData4);
416
		submit(task4, taskData4);
415
		submit(task5, taskData5);
417
		submit(task5, taskData5);
416
418
417
		changedTasks = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor());
419
		changed = connector.markStaleTasks(repository, tasks, new NullProgressMonitor());
418
420
419
		assertEquals("Changed reports expected ", 2, changedTasks.size());
421
		assertTrue(task4.isStale());
420
		assertTrue(tasks.containsAll(changedTasks));
422
		assertTrue(task5.isStale());
421
423
422
		TasksUiPlugin.getSynchronizationManager().synchronize(connector, changedTasks, true, null);
424
		TasksUiPlugin.getSynchronizationManager().synchronize(connector, tasks, true, null);
423
425
424
		for (AbstractTask task : changedTasks) {
426
427
		for (AbstractTask task : tasks) {
425
			if (task.getTaskId() == "4") {
428
			if (task.getTaskId() == "4") {
426
				assertEquals(priority4, task4.getPriority());
429
				assertEquals(priority4, task4.getPriority());
427
			}
430
			}
(-)src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchEngineTest.java (-1 / +1 lines)
Lines 118-124 Link Here
118
		TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList();
118
		TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList();
119
		QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository));
119
		QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository));
120
120
121
		connector.performQuery(repositoryQuery, repository, new NullProgressMonitor(), collector, false);
121
		connector.performQuery(repositoryQuery, repository, new NullProgressMonitor(), collector);
122
122
123
		// results.addAll(connector.performQuery(repositoryQuery, new
123
		// results.addAll(connector.performQuery(repositoryQuery, new
124
		// NullProgressMonitor(), new MultiStatus(TasksUiPlugin.PLUGIN_ID,
124
		// NullProgressMonitor(), new MultiStatus(TasksUiPlugin.PLUGIN_ID,
(-)src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java (-1 / +1 lines)
Lines 136-142 Link Here
136
		BugzillaRepositoryConnector connector = new BugzillaRepositoryConnector();
136
		BugzillaRepositoryConnector connector = new BugzillaRepositoryConnector();
137
		connector.init(taskList);
137
		connector.init(taskList);
138
		BugzillaRepositoryQuery query = new BugzillaRepositoryQuery(repository.getUrl(), queryUrlString, "summary");
138
		BugzillaRepositoryQuery query = new BugzillaRepositoryQuery(repository.getUrl(), queryUrlString, "summary");
139
		connector.performQuery(query, repository, new NullProgressMonitor(), collector, false);
139
		connector.performQuery(query, repository, new NullProgressMonitor(), collector);
140
		assertEquals(2, collector.getTaskHits().size());
140
		assertEquals(2, collector.getTaskHits().size());
141
		for (AbstractTask hit : collector.getTaskHits()) {
141
		for (AbstractTask hit : collector.getTaskHits()) {
142
			assertTrue(hit.getSummary().contains("search-match-test"));
142
			assertTrue(hit.getSummary().contains("search-match-test"));
(-)src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java (-5 / +6 lines)
Lines 22-29 Link Here
22
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
22
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
23
import org.eclipse.mylyn.tasks.core.AbstractTask;
23
import org.eclipse.mylyn.tasks.core.AbstractTask;
24
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
24
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
25
import org.eclipse.mylyn.tasks.core.ITaskCollector;
25
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
26
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
26
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
27
import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
27
import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
28
import org.eclipse.mylyn.tasks.core.TaskRepository;
28
import org.eclipse.mylyn.tasks.core.TaskRepository;
29
29
Lines 133-141 Link Here
133
	}
133
	}
134
134
135
	@Override
135
	@Override
136
	public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository,
136
	public boolean markStaleTasks(TaskRepository repository,
137
			Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException {
137
			Set<AbstractTask> tasks, IProgressMonitor monitor) {
138
		return Collections.emptySet();
138
		// ignore
139
		return false;
139
	}
140
	}
140
141
141
	@Override
142
	@Override
Lines 153-159 Link Here
153
154
154
	@Override
155
	@Override
155
	public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor,
156
	public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor,
156
			QueryHitCollector resultCollector, boolean forced) {
157
			ITaskCollector resultCollector) {
157
		// ignore
158
		// ignore
158
		return null;
159
		return null;
159
	}
160
	}
(-)src/org/eclipse/mylyn/internal/web/tasks/WebQueryWizardPage.java (-2 / +1 lines)
Lines 362-369 Link Here
362
					QueryHitCollector collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager()
362
					QueryHitCollector collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager()
363
							.getTaskList(), new ITaskFactory() {
363
							.getTaskList(), new ITaskFactory() {
364
364
365
						public AbstractTask createTask(RepositoryTaskData taskData, boolean synchData,
365
						public AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor) throws CoreException {
366
								boolean forced, IProgressMonitor monitor) throws CoreException {
367
							return null;
366
							return null;
368
						}
367
						}
369
					}) {
368
					}) {
(-)src/org/eclipse/mylyn/internal/web/tasks/WebRepositoryConnector.java (-9 / +10 lines)
Lines 42-49 Link Here
42
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
42
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
43
import org.eclipse.mylyn.tasks.core.AbstractTask;
43
import org.eclipse.mylyn.tasks.core.AbstractTask;
44
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
44
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
45
import org.eclipse.mylyn.tasks.core.ITaskCollector;
45
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
46
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
46
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
47
import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
47
import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
48
import org.eclipse.mylyn.tasks.core.TaskRepository;
48
import org.eclipse.mylyn.tasks.core.TaskRepository;
49
import org.eclipse.mylyn.tasks.core.TaskRepositoryManager;
49
import org.eclipse.mylyn.tasks.core.TaskRepositoryManager;
Lines 203-209 Link Here
203
203
204
	@Override
204
	@Override
205
	public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor,
205
	public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor,
206
			QueryHitCollector resultCollector, boolean forced) {
206
			ITaskCollector resultCollector) {
207
		if (query instanceof WebQuery) {
207
		if (query instanceof WebQuery) {
208
			WebQuery webQuery = (WebQuery) query;
208
			WebQuery webQuery = (WebQuery) query;
209
			Map<String, String> queryParameters = webQuery.getQueryParameters();
209
			Map<String, String> queryParameters = webQuery.getQueryParameters();
Lines 233-242 Link Here
233
		return null;
233
		return null;
234
	}
234
	}
235
235
236
	public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository,
236
	@Override
237
			Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException {
237
	public boolean markStaleTasks(TaskRepository repository,
238
			Set<AbstractTask> tasks, IProgressMonitor monitor) {
238
		// not supported
239
		// not supported
239
		return Collections.emptySet();
240
		return false;
240
	}
241
	}
241
242
242
	@Override
243
	@Override
Lines 258-264 Link Here
258
	// utility methods
259
	// utility methods
259
260
260
	public static IStatus performQuery(String resource, String regexp, String taskPrefix, IProgressMonitor monitor,
261
	public static IStatus performQuery(String resource, String regexp, String taskPrefix, IProgressMonitor monitor,
261
			QueryHitCollector collector, TaskRepository repository) {
262
			ITaskCollector resultCollector, TaskRepository repository) {
262
		Pattern p = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL
263
		Pattern p = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL
263
				| Pattern.UNICODE_CASE | Pattern.CANON_EQ);
264
				| Pattern.UNICODE_CASE | Pattern.CANON_EQ);
264
		Matcher matcher = p.matcher(resource);
265
		Matcher matcher = p.matcher(resource);
Lines 275-281 Link Here
275
				if (matcher.groupCount() >= 1) {
276
				if (matcher.groupCount() >= 1) {
276
					String id = matcher.group(1);
277
					String id = matcher.group(1);
277
					String description = matcher.groupCount() > 1 ? cleanup(matcher.group(2), repository) : null;
278
					String description = matcher.groupCount() > 1 ? cleanup(matcher.group(2), repository) : null;
278
					collector.accept(new WebTask(id, description, taskPrefix, repository.getUrl(), WebTask.REPOSITORY_TYPE));
279
					resultCollector.accept(new WebTask(id, description, taskPrefix, repository.getUrl(), WebTask.REPOSITORY_TYPE));
279
				}
280
				}
280
			} while (matcher.find() && !monitor.isCanceled());
281
			} while (matcher.find() && !monitor.isCanceled());
281
282
Lines 311-317 Link Here
311
		return sb.toString();
312
		return sb.toString();
312
	}
313
	}
313
314
314
	public static IStatus performRssQuery(String queryUrl, IProgressMonitor monitor, QueryHitCollector collector,
315
	public static IStatus performRssQuery(String queryUrl, IProgressMonitor monitor, ITaskCollector resultCollector,
315
			TaskRepository repository) {
316
			TaskRepository repository) {
316
		SyndFeedInput input = new SyndFeedInput();
317
		SyndFeedInput input = new SyndFeedInput();
317
		try {
318
		try {
Lines 340-346 Link Here
340
341
341
				String entrTitle = entry.getTitle();
342
				String entrTitle = entry.getTitle();
342
343
343
				collector.accept(new WebTask(entryUri, //
344
				resultCollector.accept(new WebTask(entryUri, //
344
						(date == null ? "" : df.format(date) + " - ") + entrTitle, //
345
						(date == null ? "" : df.format(date) + " - ") + entrTitle, //
345
						"", repository.getUrl(), WebTask.REPOSITORY_TYPE));
346
						"", repository.getUrl(), WebTask.REPOSITORY_TYPE));
346
			}
347
			}
(-)src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java (-49 / +44 lines)
Lines 21-27 Link Here
21
import java.util.Iterator;
21
import java.util.Iterator;
22
import java.util.List;
22
import java.util.List;
23
import java.util.Locale;
23
import java.util.Locale;
24
import java.util.Map;
25
import java.util.Set;
24
import java.util.Set;
26
25
27
import org.eclipse.core.runtime.CoreException;
26
import org.eclipse.core.runtime.CoreException;
Lines 34-39 Link Here
34
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
33
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
35
import org.eclipse.mylyn.tasks.core.AbstractTask;
34
import org.eclipse.mylyn.tasks.core.AbstractTask;
36
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
35
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
36
import org.eclipse.mylyn.tasks.core.ITaskCollector;
37
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
37
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
38
import org.eclipse.mylyn.tasks.core.ITaskFactory;
38
import org.eclipse.mylyn.tasks.core.ITaskFactory;
39
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
39
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
Lines 223-249 Link Here
223
223
224
224
225
	@Override
225
	@Override
226
	public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository,
226
	public boolean markStaleTasks(TaskRepository repository,
227
			Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException {
227
			Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException {
228
		try {
228
		try {
229
			Set<AbstractTask> changedTasks = new HashSet<AbstractTask>();
229
			monitor.beginTask("Checking for changed tasks", IProgressMonitor.UNKNOWN);
230
230
231
			if (repository.getSyncTimeStamp() == null) {
231
			if (repository.getSyncTimeStamp() == null) {
232
				return tasks;
232
				for (AbstractTask task : tasks) {
233
					task.setStale(true);
234
				}
235
				return true;
233
			}
236
			}
234
237
235
			String dateString = repository.getSyncTimeStamp();
238
			String dateString = repository.getSyncTimeStamp();
236
			if (dateString == null) {
239
			if (dateString == null) {
237
				dateString = "";
240
				dateString = "";
238
			}
241
			}
239
			String urlQueryBase;
240
			String urlQueryString;
241
242
242
			urlQueryBase = repository.getUrl() + CHANGED_BUGS_CGI_QUERY
243
			String urlQueryBase = repository.getUrl() + CHANGED_BUGS_CGI_QUERY
243
					+ URLEncoder.encode(dateString, repository.getCharacterEncoding()) + CHANGED_BUGS_CGI_ENDDATE;
244
					+ URLEncoder.encode(dateString, repository.getCharacterEncoding()) + CHANGED_BUGS_CGI_ENDDATE;
244
245
			
245
			urlQueryString = urlQueryBase + BUG_ID;
246
			String urlQueryString = urlQueryBase + BUG_ID;
246
247
			
248
			// Need to replace this with query that would return list of tasks since last sync
249
			// the trouble is that bugzilla only have 1 hour granularity for "changed since" query
250
			// so, we can't say that no tasks has changed in repository
251
			
252
			Set<AbstractTask> changedTasks = new HashSet<AbstractTask>();
247
			int queryCounter = -1;
253
			int queryCounter = -1;
248
			Iterator<AbstractTask> itr = tasks.iterator();
254
			Iterator<AbstractTask> itr = tasks.iterator();
249
			while (itr.hasNext()) {
255
			while (itr.hasNext()) {
Lines 255-273 Link Here
255
					queryForChanged(repository, changedTasks, urlQueryString);
261
					queryForChanged(repository, changedTasks, urlQueryString);
256
					queryCounter = 0;
262
					queryCounter = 0;
257
					urlQueryString = urlQueryBase + BUG_ID;
263
					urlQueryString = urlQueryBase + BUG_ID;
258
					urlQueryString += newurlQueryString;
264
				}
259
				} else if (!itr.hasNext()) {
265
				urlQueryString += newurlQueryString;
260
					urlQueryString += newurlQueryString;
266
				if (!itr.hasNext()) {
261
					queryForChanged(repository, changedTasks, urlQueryString);
267
					queryForChanged(repository, changedTasks, urlQueryString);
262
				} else {
263
					urlQueryString += newurlQueryString;
264
				}
268
				}
265
			}
269
			}
266
			return changedTasks;
270
			
271
			for (AbstractTask task : changedTasks) {
272
				task.setStale(true);
273
			}
274
			
275
			// FIXME check if new tasks were added
276
			//return changedTasks.isEmpty();
277
			return true;
267
		} catch (UnsupportedEncodingException e) {
278
		} catch (UnsupportedEncodingException e) {
279
			// XXX throw CoreException instead?
268
			MylarStatusHandler.fail(e, "Repository configured with unsupported encoding: "
280
			MylarStatusHandler.fail(e, "Repository configured with unsupported encoding: "
269
					+ repository.getCharacterEncoding() + "\n\n Unable to determine changed tasks.", true);
281
					+ repository.getCharacterEncoding() + "\n\n Unable to determine changed tasks.", true);
270
			return tasks;
282
			return false;
283
		} finally {
284
			monitor.done();
271
		}
285
		}
272
	}
286
	}
273
287
Lines 275-281 Link Here
275
			String urlQueryString) throws UnsupportedEncodingException, CoreException {
289
			String urlQueryString) throws UnsupportedEncodingException, CoreException {
276
		QueryHitCollector collector = new QueryHitCollector(taskList, new ITaskFactory() {
290
		QueryHitCollector collector = new QueryHitCollector(taskList, new ITaskFactory() {
277
291
278
			public AbstractTask createTask(RepositoryTaskData taskData, boolean synchData, boolean forced, IProgressMonitor monitor) {
292
			public AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor) {
279
				// do not construct actual task objects here as query shouldn't result in new tasks
293
				// do not construct actual task objects here as query shouldn't result in new tasks
280
				return taskList.getTask(taskData.getRepositoryUrl(), taskData.getId());
294
				return taskList.getTask(taskData.getRepositoryUrl(), taskData.getId());
281
			}
295
			}
Lines 283-289 Link Here
283
297
284
		BugzillaRepositoryQuery query = new BugzillaRepositoryQuery(repository.getUrl(), urlQueryString, "");
298
		BugzillaRepositoryQuery query = new BugzillaRepositoryQuery(repository.getUrl(), urlQueryString, "");
285
299
286
		performQuery(query, repository, new NullProgressMonitor(), collector, false);
300
		performQuery(query, repository, new NullProgressMonitor(), collector);
287
301
288
		for (AbstractTask taskHit : collector.getTaskHits()) {
302
		for (AbstractTask taskHit : collector.getTaskHits()) {
289
			// String handle =
303
			// String handle =
Lines 332-380 Link Here
332
346
333
	@Override
347
	@Override
334
	public IStatus performQuery(final AbstractRepositoryQuery query, TaskRepository repository,
348
	public IStatus performQuery(final AbstractRepositoryQuery query, TaskRepository repository,
335
			IProgressMonitor monitor, QueryHitCollector resultCollector, boolean forced) {
349
			IProgressMonitor monitor, ITaskCollector resultCollector) {
336
		IStatus queryStatus = Status.OK_STATUS;
337
		try {
350
		try {
351
			monitor.beginTask("Running query", IProgressMonitor.UNKNOWN);
338
			BugzillaClient client = getClientManager().getClient(repository);
352
			BugzillaClient client = getClientManager().getClient(repository);
339
			resultCollector.clear();
353
			boolean hitsReceived = client.getSearchHits(query, resultCollector);
340
			Set<String> ids = client.getSearchHits(query);
354
			if (!hitsReceived) {
341
			if (ids.size() == 0) {
342
				// XXX: HACK in case of ip change bugzilla can return 0 hits
355
				// XXX: HACK in case of ip change bugzilla can return 0 hits
343
				// due to invalid authorization token, forcing relogin fixes
356
				// due to invalid authorization token, forcing relogin fixes
344
				client.logout();
357
				client.logout();
345
				ids = client.getSearchHits(query);
358
				client.getSearchHits(query, resultCollector);
346
			}
347
348
			if (!forced) {
349
				// Only retrieve data for hits we don't already have
350
				for (AbstractTask existingTask : query.getChildren()) {
351
					AbstractTask repositoryTask = (AbstractTask) existingTask;
352
					if (ids.contains(repositoryTask.getTaskId())) {
353
						resultCollector.accept(repositoryTask);
354
						ids.remove(repositoryTask.getTaskId());
355
					}
356
				}
357
			}
358
359
			Map<String, RepositoryTaskData> hits = client.getTaskData(ids);
360
			for (RepositoryTaskData data : hits.values()) {
361
				if (data != null) {
362
					taskDataHandler.configureTaskData(repository, data);
363
					resultCollector.accept(data);
364
				}
365
			}
359
			}
366
360
361
			return Status.OK_STATUS;
367
		} catch (UnrecognizedReponseException e) {
362
		} catch (UnrecognizedReponseException e) {
368
			queryStatus = new Status(IStatus.ERROR, BugzillaCorePlugin.PLUGIN_ID, Status.INFO,
363
			return new Status(IStatus.ERROR, BugzillaCorePlugin.PLUGIN_ID, Status.INFO,
369
					"Unrecognized response from server", e);
364
					"Unrecognized response from server", e);
370
		} catch (IOException e) {
365
		} catch (IOException e) {
371
			queryStatus = new Status(IStatus.ERROR, BugzillaCorePlugin.PLUGIN_ID, Status.ERROR,
366
			return new Status(IStatus.ERROR, BugzillaCorePlugin.PLUGIN_ID, Status.ERROR,
372
					"Check repository configuration: " + e.getMessage(), e);
367
					"Check repository configuration: " + e.getMessage(), e);
373
		} catch (CoreException e) {
368
		} catch (CoreException e) {
374
			queryStatus = e.getStatus();
369
			return e.getStatus();
370
		} finally {
371
			monitor.done();
375
		}
372
		}
376
		return queryStatus;
377
378
	}
373
	}
379
374
380
	@Override
375
	@Override
(-)src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryQueryResultsFactory.java (-8 / +20 lines)
Lines 17-22 Link Here
17
import java.util.HashSet;
17
import java.util.HashSet;
18
import java.util.Set;
18
import java.util.Set;
19
19
20
import org.eclipse.mylyn.tasks.core.ITaskCollector;
21
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
22
20
/**
23
/**
21
 * @author Rob Elves
24
 * @author Rob Elves
22
 */
25
 */
Lines 28-41 Link Here
28
		super(inStream, encoding);
31
		super(inStream, encoding);
29
	}
32
	}
30
33
31
	/**
34
//	/**
32
	 * expects rdf returned from repository (ctype=rdf in url)
35
//	 * expects rdf returned from repository (ctype=rdf in url)
33
	 * 
36
//	 * 
34
	 * @throws GeneralSecurityException
37
//	 * @throws GeneralSecurityException
35
	 */
38
//	 */
36
	public void performQuery(String repositoryUrl, int maxHits) throws IOException {
39
//	public void performQuery(String repositoryUrl, int maxHits) throws IOException {
37
40
//
38
		SaxBugzillaQueryContentHandler contentHandler = new SaxBugzillaQueryContentHandler(repositoryUrl, hits, maxHits);
41
//		SaxBugzillaQueryContentHandler contentHandler = new SaxBugzillaQueryContentHandler(repositoryUrl, hits, maxHits);
42
//		collectResults(contentHandler, false);
43
//	}
44
	
45
	/** expects rdf returned from repository (ctype=rdf in url) 
46
	 * @throws GeneralSecurityException */
47
	public void performQuery(String repositoryUrl, ITaskCollector collector,  int maxHits) throws IOException {
48
		
49
		SaxBugzillaQueryContentHandler contentHandler = new SaxBugzillaQueryContentHandler(repositoryUrl,
50
				collector, hits, maxHits);		
39
		collectResults(contentHandler, false);
51
		collectResults(contentHandler, false);
40
	}
52
	}
41
	
53
	
(-)src/org/eclipse/mylyn/internal/bugzilla/core/SaxBugzillaQueryContentHandler.java (-46 / +52 lines)
Lines 14-19 Link Here
14
import java.util.Locale;
14
import java.util.Locale;
15
import java.util.Set;
15
import java.util.Set;
16
16
17
import org.eclipse.mylyn.tasks.core.AbstractTask;
18
import org.eclipse.mylyn.tasks.core.ITaskCollector;
19
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
17
import org.eclipse.mylyn.web.core.HtmlStreamTokenizer;
20
import org.eclipse.mylyn.web.core.HtmlStreamTokenizer;
18
import org.xml.sax.Attributes;
21
import org.xml.sax.Attributes;
19
import org.xml.sax.SAXException;
22
import org.xml.sax.SAXException;
Lines 29-46 Link Here
29
	/** The bug id */
32
	/** The bug id */
30
	private String id;
33
	private String id;
31
34
32
//	/** The summary of the bug */
35
	/** The summary of the bug */
33
//	private String description = "";
36
	private String description = "";
34
//
37
35
//	/** The priority of the bug */
38
	/** The priority of the bug */
36
//	private String priority = Task.PriorityLevel.getDefault().toString();
39
	private String priority = AbstractTask.PriorityLevel.getDefault().toString();
37
//
40
38
//	/** The state of the bug */
41
	/** The state of the bug */
39
//	private String state = "";
42
	private String state = "";
40
43
41
	private StringBuffer characters;
44
	private StringBuffer characters;
42
45
43
//	private String repositoryUrl;
46
	private ITaskCollector collector;
47
48
	private String repositoryUrl;
44
49
45
	private Set<String> bugIds;
50
	private Set<String> bugIds;
46
51
Lines 48-56 Link Here
48
53
49
	private int numCollected = 0;
54
	private int numCollected = 0;
50
55
51
	public SaxBugzillaQueryContentHandler(String repositoryUrl, Set<String> hits, int maxHits) {
56
	public SaxBugzillaQueryContentHandler(String repositoryUrl, ITaskCollector collector, Set<String> hits, int maxHits) {
52
		//this.repositoryUrl = repositoryUrl;
57
		this.repositoryUrl = repositoryUrl;
53
		this.maxHits = maxHits;
58
		this.maxHits = maxHits;
59
		this.collector = collector;
54
		this.bugIds = hits;
60
		this.bugIds = hits;
55
	}
61
	}
56
62
Lines 96-137 Link Here
96
					//System.err.println(">>> "+id);
102
					//System.err.println(">>> "+id);
97
					bugIds.add(id);
103
					bugIds.add(id);
98
					numCollected++;
104
					numCollected++;
99
				} 
105
				}
100
				break;
106
				break;
101
// // case BUG_SEVERITY:
107
			// case BUG_SEVERITY:
102
// // severity = parsedText;
108
			// severity = parsedText;
103
// // break;
109
			// break;
104
// case PRIORITY:
110
			case PRIORITY:
105
// priority = parsedText;
111
				priority = parsedText;
106
// break;
112
				break;
107
// // case REP_PLATFORM:
113
			// case REP_PLATFORM:
108
// // platform = parsedText;
114
			// platform = parsedText;
109
// // break;
115
			// break;
110
// case ASSIGNED_TO:
116
			case ASSIGNED_TO:
111
// //hit.setOwner(parsedText);
117
				//hit.setOwner(parsedText);
112
// break;
118
				break;
113
// case BUG_STATUS:
119
			case BUG_STATUS:
114
// state = parsedText;
120
				state = parsedText;
115
// break;
121
				break;
116
// // case RESOLUTION:
122
			// case RESOLUTION:
117
// // resolution = parsedText;
123
			// resolution = parsedText;
118
// // break;
124
			// break;
119
// case SHORT_DESC:
125
			case SHORT_DESC:
120
// description = parsedText;
126
				description = parsedText;
121
// break;
127
				break;
122
// case SHORT_SHORT_DESC:
128
			case SHORT_SHORT_DESC:
123
// description = parsedText;
129
				description = parsedText;
124
// break;
130
				break;
125
// case LI:
131
			case LI:
126
// if (numCollected < maxHits || maxHits == IBugzillaConstants.RETURN_ALL_HITS)
132
				if (numCollected < maxHits || maxHits == IBugzillaConstants.RETURN_ALL_HITS) {
127
// {
133
					BugzillaTask task = new BugzillaTask(repositoryUrl, id, description);
128
// hit = new BugzillaQueryHit(taskList, description, priority, repositoryUrl,
134
					task.setPriority(priority);
129
// id, null, state);
135
					// TODO set state
130
// collector.accept(hit);
136
					collector.accept(task);
131
// numCollected++;
137
					numCollected++;
132
// } else {
138
				} else {
133
// break;
139
					break;
134
// }
140
				}
135
			}
141
			}
136
		} catch (RuntimeException e) {
142
		} catch (RuntimeException e) {
137
			if (e instanceof IllegalArgumentException) {
143
			if (e instanceof IllegalArgumentException) {
(-)src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClient.java (-53 / +48 lines)
Lines 53-58 Link Here
53
import org.eclipse.mylyn.internal.bugzilla.core.history.BugzillaTaskHistoryParser;
53
import org.eclipse.mylyn.internal.bugzilla.core.history.BugzillaTaskHistoryParser;
54
import org.eclipse.mylyn.internal.bugzilla.core.history.TaskHistory;
54
import org.eclipse.mylyn.internal.bugzilla.core.history.TaskHistory;
55
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
55
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
56
import org.eclipse.mylyn.tasks.core.ITaskCollector;
56
import org.eclipse.mylyn.tasks.core.ITaskAttachment;
57
import org.eclipse.mylyn.tasks.core.ITaskAttachment;
57
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
58
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
58
import org.eclipse.mylyn.tasks.core.RepositoryOperation;
59
import org.eclipse.mylyn.tasks.core.RepositoryOperation;
Lines 436-488 Link Here
436
	// }
437
	// }
437
	// }
438
	// }
438
439
439
// public void getSearchHits(AbstractRepositoryQuery query, QueryHitCollector
440
	public boolean getSearchHits(AbstractRepositoryQuery query, ITaskCollector
440
// collector, TaskList taskList)
441
			collector)
441
// throws IOException, CoreException {
442
	throws IOException, CoreException {
442
// GetMethod method = null;
443
// try {
444
// String queryUrl = query.getUrl();
445
// // Test that we don't specify content type twice.
446
// // Should only be specified here (not in passed in url if possible)
447
// if (!queryUrl.contains("ctype=rdf")) {
448
// queryUrl = queryUrl.concat(IBugzillaConstants.CONTENT_TYPE_RDF);
449
// }
450
//
451
// method = getConnect(queryUrl);
452
// if (method.getResponseHeader("Content-Type") != null) {
453
// Header responseTypeHeader = method.getResponseHeader("Content-Type");
454
// for (String type : VALID_CONFIG_CONTENT_TYPES) {
455
// if (responseTypeHeader.getValue().toLowerCase(Locale.ENGLISH).contains(type))
456
// {
457
// RepositoryQueryResultsFactory queryFactory = new
458
// RepositoryQueryResultsFactory(method
459
// .getResponseBodyAsStream(), characterEncoding);
460
// queryFactory.performQuery(taskList, repositoryUrl.toString(), collector,
461
// QueryHitCollector.MAX_HITS);
462
//						
463
//
464
//						
465
//						
466
// //getTaskData(queryFactory.get)
467
// // pass t
468
//						
469
// return;
470
// }
471
// }
472
// }
473
// parseHtmlError(new BufferedReader(
474
// new InputStreamReader(method.getResponseBodyAsStream(), characterEncoding)));
475
// } finally {
476
// if (method != null) {
477
// method.releaseConnection();
478
// }
479
// }
480
// }
481
482
	/**
483
	 * Returns ids of bugs that match given query
484
	 */
485
	public Set<String> getSearchHits(AbstractRepositoryQuery query) throws IOException, CoreException {
486
		GetMethod method = null;
443
		GetMethod method = null;
487
		try {
444
		try {
488
			String queryUrl = query.getUrl();
445
			String queryUrl = query.getUrl();
Lines 496-507 Link Here
496
			if (method.getResponseHeader("Content-Type") != null) {
453
			if (method.getResponseHeader("Content-Type") != null) {
497
				Header responseTypeHeader = method.getResponseHeader("Content-Type");
454
				Header responseTypeHeader = method.getResponseHeader("Content-Type");
498
				for (String type : VALID_CONFIG_CONTENT_TYPES) {
455
				for (String type : VALID_CONFIG_CONTENT_TYPES) {
499
					if (responseTypeHeader.getValue().toLowerCase(Locale.ENGLISH).contains(type)) {
456
					if (responseTypeHeader.getValue().toLowerCase(Locale.ENGLISH).contains(type))
500
						RepositoryQueryResultsFactory queryFactory = new RepositoryQueryResultsFactory(method
457
					{
458
						RepositoryQueryResultsFactory queryFactory = new
459
						RepositoryQueryResultsFactory(method
501
								.getResponseBodyAsStream(), characterEncoding);
460
								.getResponseBodyAsStream(), characterEncoding);
502
						queryFactory.performQuery(repositoryUrl.toString(), QueryHitCollector.MAX_HITS);
461
						queryFactory.performQuery(repositoryUrl.toString(), collector,
503
462
								QueryHitCollector.MAX_HITS);
504
						return queryFactory.getHits();
463
						return !queryFactory.getHits().isEmpty();
505
					}
464
					}
506
				}
465
				}
507
			}
466
			}
Lines 512-520 Link Here
512
				method.releaseConnection();
471
				method.releaseConnection();
513
			}
472
			}
514
		}
473
		}
515
		return new HashSet<String>();
474
		return false;
516
	}
475
	}
517
476
477
//	/**
478
//	 * Returns ids of bugs that match given query
479
//	 */
480
//	public Set<String> getSearchHits(AbstractRepositoryQuery query) throws IOException, CoreException {
481
//		GetMethod method = null;
482
//		try {
483
//			String queryUrl = query.getUrl();
484
//			// Test that we don't specify content type twice.
485
//			// Should only be specified here (not in passed in url if possible)
486
//			if (!queryUrl.contains("ctype=rdf")) {
487
//				queryUrl = queryUrl.concat(IBugzillaConstants.CONTENT_TYPE_RDF);
488
//			}
489
//
490
//			method = getConnect(queryUrl);
491
//			if (method.getResponseHeader("Content-Type") != null) {
492
//				Header responseTypeHeader = method.getResponseHeader("Content-Type");
493
//				for (String type : VALID_CONFIG_CONTENT_TYPES) {
494
//					if (responseTypeHeader.getValue().toLowerCase(Locale.ENGLISH).contains(type)) {
495
//						RepositoryQueryResultsFactory queryFactory = new RepositoryQueryResultsFactory(method
496
//								.getResponseBodyAsStream(), characterEncoding);
497
//						queryFactory.performQuery(repositoryUrl.toString(), QueryHitCollector.MAX_HITS);
498
//
499
//						return queryFactory.getHits();
500
//					}
501
//				}
502
//			}
503
//			parseHtmlError(new BufferedReader(
504
//					new InputStreamReader(method.getResponseBodyAsStream(), characterEncoding)));
505
//		} finally {
506
//			if (method != null) {
507
//				method.releaseConnection();
508
//			}
509
//		}
510
//		return new HashSet<String>();
511
//	}
512
518
	public static void setupExistingBugAttributes(String serverUrl, RepositoryTaskData existingReport) {
513
	public static void setupExistingBugAttributes(String serverUrl, RepositoryTaskData existingReport) {
519
		// ordered list of elements as they appear in UI
514
		// ordered list of elements as they appear in UI
520
		// and additional elements that may not appear in the incoming xml
515
		// and additional elements that may not appear in the incoming xml
(-)src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java (-28 / +36 lines)
Lines 13-21 Link Here
13
13
14
import java.io.File;
14
import java.io.File;
15
import java.util.ArrayList;
15
import java.util.ArrayList;
16
import java.util.Collections;
17
import java.util.Date;
16
import java.util.Date;
18
import java.util.HashSet;
19
import java.util.List;
17
import java.util.List;
20
import java.util.Set;
18
import java.util.Set;
21
19
Lines 33-40 Link Here
33
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
31
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
34
import org.eclipse.mylyn.tasks.core.AbstractTask;
32
import org.eclipse.mylyn.tasks.core.AbstractTask;
35
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
33
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
34
import org.eclipse.mylyn.tasks.core.ITaskCollector;
36
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
35
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
37
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
38
import org.eclipse.mylyn.tasks.core.RepositoryOperation;
36
import org.eclipse.mylyn.tasks.core.RepositoryOperation;
39
import org.eclipse.mylyn.tasks.core.RepositoryStatus;
37
import org.eclipse.mylyn.tasks.core.RepositoryStatus;
40
import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute;
38
import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute;
Lines 126-132 Link Here
126
124
127
	@Override
125
	@Override
128
	public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor,
126
	public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor,
129
			QueryHitCollector resultCollector, boolean force) {
127
			ITaskCollector resultCollector) {
130
128
131
		final List<TracTicket> tickets = new ArrayList<TracTicket>();
129
		final List<TracTicket> tickets = new ArrayList<TracTicket>();
132
130
Lines 150-190 Link Here
150
	}
148
	}
151
149
152
	@Override
150
	@Override
153
	public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository,
151
	public boolean markStaleTasks(TaskRepository repository,
154
			Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException {
152
			Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException {
155
		if (repository.getSyncTimeStamp() == null) {
153
		try {
156
			return tasks;
154
			monitor.beginTask("Getting changed tasks", IProgressMonitor.UNKNOWN);
157
		}
155
			
156
			if (!TracRepositoryConnector.hasChangedSince(repository)) {
157
				// always run the queries for web mode
158
				return true;
159
			}
158
160
159
		if (!TracRepositoryConnector.hasChangedSince(repository)) {
161
			if (repository.getSyncTimeStamp() == null) {
160
			// return an empty list to avoid causing all tasks to synchronized
162
				for (AbstractTask task : tasks) {
161
			return Collections.emptySet();
163
					task.setStale(true);
162
		}
164
				}
165
				return true;
166
			}
163
167
164
		Date since = new Date(0);
168
			Date since = new Date(0);
165
		try {
169
			try {
166
			since = TracUtils.parseDate(Integer.parseInt(repository.getSyncTimeStamp()));
170
				since = TracUtils.parseDate(Integer.parseInt(repository.getSyncTimeStamp()));
167
		} catch (NumberFormatException e) {
171
			} catch (NumberFormatException e) {
168
		}
172
			}
169
173
170
		ITracClient client;
174
			try {
171
		try {
175
				ITracClient client = getClientManager().getRepository(repository);
172
			client = getClientManager().getRepository(repository);
176
				Set<Integer> ids = client.getChangedTickets(since);
173
			Set<Integer> ids = client.getChangedTickets(since);
177
				if (ids.isEmpty()) {
178
					// repository is unchanged
179
					return false; 
180
				}
174
181
175
			Set<AbstractTask> result = new HashSet<AbstractTask>();
176
			if (!ids.isEmpty()) {
177
				for (AbstractTask task : tasks) {
182
				for (AbstractTask task : tasks) {
178
					Integer id = getTicketId(task.getTaskId());
183
					Integer id = getTicketId(task.getTaskId());
179
					if (ids.contains(id)) {
184
					if (ids.contains(id)) {
180
						result.add(task);
185
						task.setStale(true);
181
					}
186
					}
182
				}
187
				}
188
189
				return true;
190
			} catch (Exception e) {
191
				throw new CoreException(new Status(IStatus.ERROR, TracCorePlugin.PLUGIN_ID, IStatus.OK,
192
						"Could not determine changed tasks", e));
183
			}
193
			}
184
			return result;
194
		} finally {
185
		} catch (Exception e) {
195
			monitor.done();
186
			throw new CoreException(new Status(IStatus.ERROR, TracCorePlugin.PLUGIN_ID, IStatus.OK,
187
					"could not determine changed tasks", e));
188
		}
196
		}
189
	}
197
	}
190
198
(-)src/org/eclipse/mylyn/internal/bugzilla/ui/editor/DummySearchHitProvider.java (-2 / +1 lines)
Lines 24-31 Link Here
24
	public DummySearchHitProvider(TaskList tasklist) {
24
	public DummySearchHitProvider(TaskList tasklist) {
25
		super(tasklist, new ITaskFactory() {
25
		super(tasklist, new ITaskFactory() {
26
26
27
			public AbstractTask createTask(RepositoryTaskData taskData, boolean synchData,
27
			public AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor) throws CoreException {
28
					boolean forced, IProgressMonitor monitor) throws CoreException {
29
				return null;
28
				return null;
30
			}
29
			}
31
		});
30
		});
(-)src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaSearchEngine.java (-5 / +4 lines)
Lines 29-35 Link Here
29
import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
29
import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
30
import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
30
import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
31
import org.eclipse.mylyn.internal.tasks.ui.util.WebBrowserDialog;
31
import org.eclipse.mylyn.internal.tasks.ui.util.WebBrowserDialog;
32
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
33
import org.eclipse.mylyn.tasks.core.TaskRepository;
32
import org.eclipse.mylyn.tasks.core.TaskRepository;
34
import org.eclipse.mylyn.tasks.core.UnrecognizedReponseException;
33
import org.eclipse.mylyn.tasks.core.UnrecognizedReponseException;
35
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
34
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
Lines 87-93 Link Here
87
	 * @param collector -
86
	 * @param collector -
88
	 *            The collector for the results to go into
87
	 *            The collector for the results to go into
89
	 */
88
	 */
90
	public IStatus search(QueryHitCollector collector) throws LoginException {
89
	public IStatus search(ProgressQueryHitCollector collector) throws LoginException {
91
		return this.search(collector, 0, IBugzillaConstants.RETURN_ALL_HITS);
90
		return this.search(collector, 0, IBugzillaConstants.RETURN_ALL_HITS);
92
	}
91
	}
93
92
Lines 99-105 Link Here
99
	 * @param startMatches -
98
	 * @param startMatches -
100
	 *            The number of matches to start with for the progress monitor
99
	 *            The number of matches to start with for the progress monitor
101
	 */
100
	 */
102
	public IStatus search(QueryHitCollector collector, int startMatches) throws LoginException {
101
	public IStatus search(ProgressQueryHitCollector collector, int startMatches) throws LoginException {
103
		return this.search(collector, startMatches, BugzillaUiPlugin.getDefault().getMaxResults());
102
		return this.search(collector, startMatches, BugzillaUiPlugin.getDefault().getMaxResults());
104
	}
103
	}
105
104
Lines 115-121 Link Here
115
	 *            the maximum number of matches to return or
114
	 *            the maximum number of matches to return or
116
	 *            IBugzillaConstants.RETURN_ALL_HITS for unlimited
115
	 *            IBugzillaConstants.RETURN_ALL_HITS for unlimited
117
	 */
116
	 */
118
	public IStatus search(QueryHitCollector collector, int startMatches, int maxHits) throws LoginException {
117
	public IStatus search(ProgressQueryHitCollector collector, int startMatches, int maxHits) throws LoginException {
119
		IProgressMonitor monitor = collector.getProgressMonitor();
118
		IProgressMonitor monitor = collector.getProgressMonitor();
120
		IStatus status = null;
119
		IStatus status = null;
121
		boolean possibleBadLogin = false;
120
		boolean possibleBadLogin = false;
Lines 136-142 Link Here
136
					.getRepositoryManager().getRepositoryConnector(BugzillaCorePlugin.REPOSITORY_KIND);
135
					.getRepositoryManager().getRepositoryConnector(BugzillaCorePlugin.REPOSITORY_KIND);
137
136
138
			BugzillaClient client = bugzillaConnector.getClientManager().getClient(repository);
137
			BugzillaClient client = bugzillaConnector.getClientManager().getClient(repository);
139
			client.getSearchHits(query);
138
			client.getSearchHits(query, collector);
140
139
141
		} catch (CoreException e) {
140
		} catch (CoreException e) {
142
			status = new MultiStatus(BugzillaUiPlugin.PLUGIN_ID, IStatus.ERROR,
141
			status = new MultiStatus(BugzillaUiPlugin.PLUGIN_ID, IStatus.ERROR,
(-)src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylarSearchOperation.java (-14 / +13 lines)
Lines 34-40 Link Here
34
import org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery;
34
import org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery;
35
import org.eclipse.mylyn.tasks.core.AbstractTask;
35
import org.eclipse.mylyn.tasks.core.AbstractTask;
36
import org.eclipse.mylyn.tasks.core.AbstractTaskContainer;
36
import org.eclipse.mylyn.tasks.core.AbstractTaskContainer;
37
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
38
import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
37
import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
39
import org.eclipse.mylyn.tasks.core.TaskComment;
38
import org.eclipse.mylyn.tasks.core.TaskComment;
40
import org.eclipse.mylyn.tasks.core.TaskRepository;
39
import org.eclipse.mylyn.tasks.core.TaskRepository;
Lines 54-60 Link Here
54
	private IMember javaElement;
53
	private IMember javaElement;
55
54
56
	/** The bugzilla collector for the search */
55
	/** The bugzilla collector for the search */
57
	private  QueryHitCollector collector = null;//SearchHitCollector
56
	private  ProgressQueryHitCollector collector = null;//SearchHitCollector
58
57
59
	/** The status of the search operation */
58
	/** The status of the search operation */
60
	private IStatus status;
59
	private IStatus status;
Lines 100-106 Link Here
100
	@Override
99
	@Override
101
	public void execute(IProgressMonitor monitor) {
100
	public void execute(IProgressMonitor monitor) {
102
101
103
		QueryHitCollector searchCollector = null;
102
		ProgressQueryHitCollector searchCollector = null;
104
103
105
		if (scope == BugzillaMylarSearch.FULLY_QUAL) {
104
		if (scope == BugzillaMylarSearch.FULLY_QUAL) {
106
			searchCollector = searchQualified(search.getServerUrl(), monitor);
105
			searchCollector = searchQualified(search.getServerUrl(), monitor);
Lines 141-153 Link Here
141
	 *            The progress monitor to search with
140
	 *            The progress monitor to search with
142
	 * @return The QueryHitCollector with the results of the search
141
	 * @return The QueryHitCollector with the results of the search
143
	 */
142
	 */
144
	private QueryHitCollector searchLocalQual(IProgressMonitor monitor) {
143
	private ProgressQueryHitCollector searchLocalQual(IProgressMonitor monitor) {
145
144
146
		// get the fully qualified name for searching
145
		// get the fully qualified name for searching
147
		String elementName = getFullyQualifiedName(javaElement);
146
		String elementName = getFullyQualifiedName(javaElement);
148
147
149
		// setup the search result collector
148
		// setup the search result collector
150
		collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList());
149
		collector = new ProgressQueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList());
151
		//collector.setOperation(this);
150
		//collector.setOperation(this);
152
		collector.setProgressMonitor(monitor);
151
		collector.setProgressMonitor(monitor);
153
152
Lines 169-181 Link Here
169
	 *            The progress monitor to search with
168
	 *            The progress monitor to search with
170
	 * @return The QueryHitCollector with the results of the search
169
	 * @return The QueryHitCollector with the results of the search
171
	 */
170
	 */
172
	private QueryHitCollector searchLocalUnQual(IProgressMonitor monitor) {
171
	private ProgressQueryHitCollector searchLocalUnQual(IProgressMonitor monitor) {
173
172
174
		// get the element name for searching
173
		// get the element name for searching
175
		String elementName = javaElement.getElementName();
174
		String elementName = javaElement.getElementName();
176
175
177
		// setup the search result collector
176
		// setup the search result collector
178
		collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList());
177
		collector = new ProgressQueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList());
179
		//collector.setOperation(this);
178
		//collector.setOperation(this);
180
		collector.setProgressMonitor(monitor);
179
		collector.setProgressMonitor(monitor);
181
180
Lines 201-207 Link Here
201
	 * @param monitor
200
	 * @param monitor
202
	 *            The progress monitor
201
	 *            The progress monitor
203
	 */
202
	 */
204
	private void searchLocal(Set<AbstractTask> tasks, QueryHitCollector searchCollector, String elementName,
203
	private void searchLocal(Set<AbstractTask> tasks, ProgressQueryHitCollector searchCollector, String elementName,
205
			IProgressMonitor monitor) {
204
			IProgressMonitor monitor) {
206
		if (tasks == null)
205
		if (tasks == null)
207
			return;
206
			return;
Lines 279-286 Link Here
279
	 *            The progress monitor to use for the search
278
	 *            The progress monitor to use for the search
280
	 * @return The QueryHitCollector with the search results
279
	 * @return The QueryHitCollector with the search results
281
	 */
280
	 */
282
	private QueryHitCollector search(String url, TaskRepository repository,
281
	private ProgressQueryHitCollector search(String url, TaskRepository repository,
283
			QueryHitCollector searchCollector, IProgressMonitor monitor) {
282
			ProgressQueryHitCollector searchCollector, IProgressMonitor monitor) {
284
283
285
		// set the initial number of matches to 0
284
		// set the initial number of matches to 0
286
		int matches = 0;
285
		int matches = 0;
Lines 316-324 Link Here
316
	 *            The progress monitor to use
315
	 *            The progress monitor to use
317
	 * @return The QueryHitCollector with the search results
316
	 * @return The QueryHitCollector with the search results
318
	 */
317
	 */
319
	private QueryHitCollector searchQualified(String repositoryUrl, IProgressMonitor monitor) {
318
	private ProgressQueryHitCollector searchQualified(String repositoryUrl, IProgressMonitor monitor) {
320
		// create a new collector for the results
319
		// create a new collector for the results
321
		collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList());
320
		collector = new ProgressQueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList());
322
		//collector.setOperation(this);
321
		//collector.setOperation(this);
323
		collector.setProgressMonitor(monitor);
322
		collector.setProgressMonitor(monitor);
324
323
Lines 336-344 Link Here
336
	 *            The progress monitor to use
335
	 *            The progress monitor to use
337
	 * @return The QueryHitCollector with the search results
336
	 * @return The QueryHitCollector with the search results
338
	 */
337
	 */
339
	private QueryHitCollector searchUnqualified(String repositoryUrl, IProgressMonitor monitor) {
338
	private ProgressQueryHitCollector searchUnqualified(String repositoryUrl, IProgressMonitor monitor) {
340
		// create a new collector for the results
339
		// create a new collector for the results
341
		collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList());
340
		collector = new ProgressQueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList());
342
		//collector.setOperation(this);
341
		//collector.setOperation(this);
343
		collector.setProgressMonitor(monitor);
342
		collector.setProgressMonitor(monitor);
344
343
(-)src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/ProgressQueryHitCollector.java (+137 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004 - 2006 Mylar committers and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *******************************************************************************/
8
9
package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
10
11
import java.text.MessageFormat;
12
import java.util.HashSet;
13
import java.util.Set;
14
15
import org.eclipse.core.runtime.CoreException;
16
import org.eclipse.core.runtime.IProgressMonitor;
17
import org.eclipse.core.runtime.NullProgressMonitor;
18
import org.eclipse.core.runtime.SubProgressMonitor;
19
import org.eclipse.mylyn.tasks.core.AbstractTask;
20
import org.eclipse.mylyn.tasks.core.ITaskCollector;
21
import org.eclipse.mylyn.tasks.core.ITaskFactory;
22
import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
23
import org.eclipse.mylyn.tasks.core.TaskList;
24
25
public class ProgressQueryHitCollector implements ITaskCollector {
26
27
	public static final int MAX_HITS = 5000;
28
29
	public static final String MAX_HITS_REACHED = "Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope.";
30
31
	protected Set<AbstractTask> taskResults = new HashSet<AbstractTask>();
32
33
	/** The progress monitor for the search operation */
34
	private IProgressMonitor monitor = new NullProgressMonitor();
35
36
	/** The number of matches found */
37
	private int matchCount;
38
39
	/** The string to display to the user while querying */
40
	private static final String STARTING = "querying the server";
41
42
	/** The string to display to the user when we have 1 match */
43
	private static final String MATCH = "1 match";
44
45
	/** The string to display to the user when we have multiple or no matches */
46
	private static final String MATCHES = "{0} matches";
47
48
	/** The string to display to the user when the query is done */
49
	private static final String DONE = "done";
50
51
	protected TaskList taskList;
52
53
	protected ITaskFactory taskFactory;
54
55
	public ProgressQueryHitCollector(TaskList tasklist, ITaskFactory taskFactory) {
56
		this.taskList = tasklist;
57
		this.taskFactory = taskFactory;
58
	}
59
60
	public void aboutToStart(int startMatchCount) throws CoreException {
61
		taskResults.clear();
62
		matchCount = startMatchCount;
63
		monitor.setTaskName(STARTING);
64
	}
65
66
	public void accept(AbstractTask task) {
67
68
		if (!getProgressMonitor().isCanceled()) {
69
			getProgressMonitor().subTask(getFormattedMatchesString(matchCount));
70
			getProgressMonitor().worked(1);
71
		}
72
73
		if (task == null)
74
			return;
75
76
		AbstractTask hitTask = taskList.getTask(task.getHandleIdentifier());
77
		if (hitTask == null) {
78
			hitTask = task;
79
			// task is new, add to tasklist
80
			taskList.addTask(hitTask);
81
		}
82
		taskResults.add((AbstractTask) hitTask);
83
		matchCount++;
84
	}
85
86
	public void accept(RepositoryTaskData taskData) throws CoreException {
87
		if (taskData == null)
88
			return;
89
90
		if (!getProgressMonitor().isCanceled()) {
91
			getProgressMonitor().subTask(getFormattedMatchesString(matchCount));
92
			getProgressMonitor().worked(1);
93
		}
94
95
		AbstractTask task = taskFactory.createTask(taskData, new SubProgressMonitor(monitor, 1));
96
		taskResults.add(task);
97
		matchCount++;
98
	}
99
100
	public void done() {
101
		if (monitor != null && !monitor.isCanceled()) {
102
			// if the operation is cancelled, finish with the data that we
103
			// already have
104
			String matchesString = getFormattedMatchesString(matchCount);
105
			monitor.setTaskName(MessageFormat.format(DONE, new Object[] { matchesString }));
106
			monitor.done();
107
		}
108
109
		// Cut no longer used references because the collector might be re-used
110
		monitor = null;
111
	}
112
113
	protected String getFormattedMatchesString(int count) {
114
		if (count == 1) {
115
			return MATCH;
116
		}
117
		Object[] messageFormatArgs = { new Integer(count) };
118
		return MessageFormat.format(MATCHES, messageFormatArgs);
119
	}
120
121
	public IProgressMonitor getProgressMonitor() {
122
		return monitor;
123
	}
124
125
	public void setProgressMonitor(IProgressMonitor monitor) {
126
		this.monitor = monitor;
127
	}
128
129
	public Set<AbstractTask> getTaskHits() {
130
		return taskResults;
131
	}
132
133
	public void clear() {
134
		taskResults.clear();
135
	}
136
137
}
(-).refactorings/2007/6/24/refactorings.history (-3 / +2 lines)
Lines 1-4 Link Here
1
<?xml version="1.0" encoding="utf-8" standalone="no"?>
1
<?xml version="1.0" encoding="utf-8"?>
2
<session version="1.0">
2
<session version="1.0">
3
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createStatusLayout(...)' to 'createSummaryLLayout'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createStatusLayout(...)'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)'&#13;&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createStatusLayout'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createStatusLayout~QComposite;" name="createSummaryLLayout" references="true" stamp="1181583329656" version="1.0"/>
3
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createStatusLayout(...)' to 'createSummaryLLayout'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createStatusLayout(...)'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)'&#13;&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createStatusLayout'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createStatusLayout~QComposite;" name="createSummaryLLayout" references="true" stamp="1181583329656" version="1.0"/>
4
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)' to 'createSummaryLayout'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLayout(...)'&#13;&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createSummaryLLayout'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createSummaryLLayout~QComposite;" name="createSummaryLayout" references="true" stamp="1181583348343" version="1.0"/>
4
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)' to 'createSummaryLayout'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLayout(...)'&#13;&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createSummaryLLayout'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createSummaryLLayout~QComposite;" name="createSummaryLayout" references="true" stamp="1181583348343" version="1.0"/>
Lines 18-23 Link Here
18
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryTaskPage' to 'NewTaskPage'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryTaskPage'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskPage'&#13;&#10;- Update references to refactored element&#13;&#10;- Rename similarly named elements&#13;&#10;- Update fully qualified names in '*.xml, *.xsd' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'NewRepositoryTaskPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
18
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryTaskPage' to 'NewTaskPage'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryTaskPage'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskPage'&#13;&#10;- Update references to refactored element&#13;&#10;- Rename similarly named elements&#13;&#10;- Update fully qualified names in '*.xml, *.xsd' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'NewRepositoryTaskPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
19
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTasksAction' to 'AbstractTaskAction'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTasksAction'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTaskAction'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'AbstractTasksAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
19
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTasksAction' to 'AbstractTaskAction'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTasksAction'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTaskAction'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'AbstractTasksAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;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"/>
20
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedFilters()' to 'getSelectedContainers'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedFilters()'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedContainers()'&#13;&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSelectedFilters'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.internal.tasks.ui.planner{TaskActivityWizardPage.java[TaskActivityWizardPage~getSelectedFilters" name="getSelectedContainers" references="true" stamp="1181756785343" version="1.0"/>
20
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedFilters()' to 'getSelectedContainers'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedFilters()'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedContainers()'&#13;&#10;- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSelectedFilters'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src&lt;org.eclipse.mylyn.internal.tasks.ui.planner{TaskActivityWizardPage.java[TaskActivityWizardPage~getSelectedFilters" name="getSelectedContainers" references="true" stamp="1181756785343" version="1.0"/>
21
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditor' to 'AbstractRepositoryTaskEditor'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditor'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditor.java[AbstractTaskEditor" matchStrategy="1" name="AbstractRepositoryTaskEditor" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181846452193" textual="false" version="1.0"/>
21
<refactoring comment="Convert member type 'org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager.SynchronizeChangedTasksJob' in 'org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager' to top level type&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#10;- Original element: 'org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager.SynchronizeChangedTasksJob'&#10;- Field name: 'repositorySynchronizationManager'&#10;- 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&lt;org.eclipse.mylyn.tasks.ui{RepositorySynchronizationManager.java[RepositorySynchronizationManager[SynchronizeChangedTasksJob" mandatory="false" possible="false" stamp="1181789707690" version="1.0"/>
22
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorInput' to 'AbstractRepositoryTaskEditorInput'&#13;&#10;- Original project: 'org.eclipse.mylyn.tasks.ui'&#13;&#10;- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorInput'&#13;&#10;- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditorInput'&#13;&#10;- Update references to refactored element&#13;&#10;- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files&#13;&#10;- Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskEditorInput'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src&lt;org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorInput.java[AbstractTaskEditorInput" matchStrategy="1" name="AbstractRepositoryTaskEditorInput" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181846547140" textual="false" version="1.0"/>
23
</session>
22
</session>
(-).refactorings/2007/6/24/refactorings.index (-2 / +1 lines)
Lines 16-20 Link Here
16
1181707563828	Rename type 'NewRepositoryTaskPage'
16
1181707563828	Rename type 'NewRepositoryTaskPage'
17
1181717209407	Rename type 'AbstractTasksAction'
17
1181717209407	Rename type 'AbstractTasksAction'
18
1181756785343	Rename method 'getSelectedFilters'
18
1181756785343	Rename method 'getSelectedFilters'
19
1181846452193	Rename type 'AbstractTaskEditor'
19
1181789707690	Convert member type 'SynchronizeChangedTasksJob' to top level
20
1181846547140	Rename type 'AbstractTaskEditorInput'
(-)src/org/eclipse/mylyn/tasks/ui/search/SearchHitCollector.java (-36 / +85 lines)
Lines 10-15 Link Here
10
 *******************************************************************************/
10
 *******************************************************************************/
11
package org.eclipse.mylyn.tasks.ui.search;
11
package org.eclipse.mylyn.tasks.ui.search;
12
12
13
import java.text.MessageFormat;
14
import java.util.HashSet;
15
import java.util.Set;
16
13
import org.eclipse.core.runtime.CoreException;
17
import org.eclipse.core.runtime.CoreException;
14
import org.eclipse.core.runtime.IProgressMonitor;
18
import org.eclipse.core.runtime.IProgressMonitor;
15
import org.eclipse.core.runtime.IStatus;
19
import org.eclipse.core.runtime.IStatus;
Lines 20-25 Link Here
20
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
24
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
21
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
25
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
22
import org.eclipse.mylyn.tasks.core.AbstractTask;
26
import org.eclipse.mylyn.tasks.core.AbstractTask;
27
import org.eclipse.mylyn.tasks.core.ITaskCollector;
23
import org.eclipse.mylyn.tasks.core.ITaskFactory;
28
import org.eclipse.mylyn.tasks.core.ITaskFactory;
24
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
29
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
25
import org.eclipse.mylyn.tasks.core.RepositoryStatus;
30
import org.eclipse.mylyn.tasks.core.RepositoryStatus;
Lines 39-45 Link Here
39
 * 
44
 * 
40
 * @author Rob Elves
45
 * @author Rob Elves
41
 */
46
 */
42
public class SearchHitCollector extends QueryHitCollector implements ISearchQuery {
47
public class SearchHitCollector implements ISearchQuery, ITaskCollector {
48
49
	public static final int MAX_HITS = 5000;
50
51
	public static final String MAX_HITS_REACHED = "Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope.";
52
53
	protected Set<AbstractTask> taskResults = new HashSet<AbstractTask>();
54
55
	/** The number of matches found */
56
	private int matchCount;
57
58
	/** The string to display to the user while querying */
59
	private static final String STARTING = "querying the server";
60
61
	/** The string to display to the user when we have 1 match */
62
	private static final String MATCH = "1 match";
63
64
	/** The string to display to the user when we have multiple or no matches */
65
	private static final String MATCHES = "{0} matches";
66
67
	/** The string to display to the user when the query is done */
68
	private static final String DONE = "done";
69
70
	private final TaskList taskList;
71
72
	private final ITaskFactory taskFactory;
43
73
44
	private static final String QUERYING_REPOSITORY = "Querying Repository...";
74
	private static final String QUERYING_REPOSITORY = "Querying Repository...";
45
	
75
	
Lines 51-69 Link Here
51
81
52
	private RepositorySearchResult searchResult;
82
	private RepositorySearchResult searchResult;
53
83
54
	private ITaskFactory taskFactory;
84
	private IProgressMonitor monitor;
55
85
56
	public SearchHitCollector(TaskList tasklist, TaskRepository repository, AbstractRepositoryQuery repositoryQuery, ITaskFactory taskFactory) {
86
	public SearchHitCollector(TaskList tasklist, TaskRepository repository, AbstractRepositoryQuery repositoryQuery, ITaskFactory taskFactory) {
57
		super(tasklist, taskFactory);
87
		this.taskList = tasklist;
58
		this.repository = repository;
88
		this.repository = repository;
59
		this.repositoryQuery = repositoryQuery;
89
		this.repositoryQuery = repositoryQuery;
60
		this.searchResult = new RepositorySearchResult(this);
90
		this.searchResult = new RepositorySearchResult(this);
61
		this.taskFactory = taskFactory;
91
		this.taskFactory = taskFactory;
62
	}
92
	}
63
93
64
	@Override
94
	public void aboutToStart(int startMatchCount) {
65
	public void aboutToStart(int startMatchCount) throws CoreException {
95
		taskResults.clear();
66
		super.aboutToStart(startMatchCount);
96
		matchCount = startMatchCount;
97
		monitor.setTaskName(STARTING);
98
67
		searchResult.removeAll();
99
		searchResult.removeAll();
68
		PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
100
		PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
69
			public void run() {
101
			public void run() {
Lines 72-86 Link Here
72
		});
104
		});
73
	}
105
	}
74
106
75
	@Override
76
	public void done() {
77
		super.done();
78
	}
79
80
	@Override
81
	public void accept(AbstractTask task) {
107
	public void accept(AbstractTask task) {
82
		if (task == null)
108
		if (task == null) {
83
			return;
109
			throw new IllegalArgumentException();
110
		}
84
111
85
		AbstractTask hitTask = taskList.getTask(task.getHandleIdentifier());
112
		AbstractTask hitTask = taskList.getTask(task.getHandleIdentifier());
86
		if (hitTask == null) {
113
		if (hitTask == null) {
Lines 88-114 Link Here
88
		}
115
		}
89
116
90
		
117
		
91
		if (!getProgressMonitor().isCanceled()) {
118
		if (!monitor.isCanceled()) {
92
			getProgressMonitor().subTask(getFormattedMatchesString(searchResult.getMatchCount()));
119
			monitor.subTask(getFormattedMatchesString(searchResult.getMatchCount()));
93
			getProgressMonitor().worked(1);
120
			monitor.worked(1);
94
		}
121
		}
95
		
122
		
96
		taskResults.add((AbstractTask)hitTask);	
123
		taskResults.add((AbstractTask)hitTask);	
97
		this.searchResult.addMatch(new Match(hitTask, 0, 0));
124
		this.searchResult.addMatch(new Match(hitTask, 0, 0));
98
	}
125
	}
99
126
100
	@Override
101
	public void accept(RepositoryTaskData taskData) throws CoreException {
127
	public void accept(RepositoryTaskData taskData) throws CoreException {
102
		if (taskData == null)
128
		if (taskData == null) {
103
			return;
129
			throw new IllegalArgumentException();
104
		
130
		}
105
		
131
		
106
		AbstractTask task = taskFactory.createTask(taskData, false, false, new SubProgressMonitor(getProgressMonitor(), 1));
132
		AbstractTask task = taskFactory.createTask(taskData, new SubProgressMonitor(monitor, 1));
107
		if (task != null) {
133
		if (task != null) {
108
			
134
			
109
			if (!getProgressMonitor().isCanceled()) {
135
			if (!monitor.isCanceled()) {
110
				getProgressMonitor().subTask(getFormattedMatchesString(searchResult.getMatchCount()));
136
				monitor.subTask(getFormattedMatchesString(searchResult.getMatchCount()));
111
				getProgressMonitor().worked(1);
137
				monitor.worked(1);
112
			}
138
			}
113
			
139
			
114
			taskResults.add(task);			
140
			taskResults.add(task);			
Lines 145-155 Link Here
145
	}
171
	}
146
172
147
	public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
173
	public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
148
		this.setProgressMonitor(monitor);
174
		this.monitor = monitor;
149
		IStatus status = Status.OK_STATUS;
175
		
150
		try {
176
		try {
151
			aboutToStart(0);
152
			monitor.beginTask(QUERYING_REPOSITORY, IProgressMonitor.UNKNOWN);
177
			monitor.beginTask(QUERYING_REPOSITORY, IProgressMonitor.UNKNOWN);
178
			
179
			aboutToStart(0);
153
180
154
			if (monitor.isCanceled()) {
181
			if (monitor.isCanceled()) {
155
				throw new OperationCanceledException("Search cancelled");
182
				throw new OperationCanceledException("Search cancelled");
Lines 157-178 Link Here
157
			AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
184
			AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
158
					repositoryQuery.getRepositoryKind());
185
					repositoryQuery.getRepositoryKind());
159
			if (connector != null) {
186
			if (connector != null) {
160
				status = connector.performQuery(repositoryQuery, repository, monitor, this, false);
187
				IStatus status = connector.performQuery(repositoryQuery, repository, monitor, this);
188
				if (!status.isOK()) {
189
					MylarStatusHandler.displayStatus("Search failed", status);
190
				}
161
			} else {
191
			} else {
162
				return new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, IStatus.OK,
192
				return new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, IStatus.OK,
163
						"repository connector could not be found", null);
193
						"repository connector could not be found", null);
164
			}
194
			}
165
195
166
			if (!status.isOK()) {
196
			return Status.OK_STATUS;
167
				throw new CoreException(status);
168
			}
169
170
		} catch (final CoreException exception) {
171
			MylarStatusHandler.displayStatus("Search failed", exception.getStatus());
172
		} finally {
197
		} finally {
173
			done();
198
			done();
174
		}
199
		}
175
		return Status.OK_STATUS;
200
	}
201
202
	public void done() {
203
		if (monitor != null && !monitor.isCanceled()) {
204
			// if the operation is cancelled, finish with the data that we
205
			// already have
206
			String matchesString = getFormattedMatchesString(matchCount);
207
			monitor.setTaskName(MessageFormat.format(DONE, new Object[] { matchesString }));
208
			monitor.done();
209
		}
210
211
		// Cut no longer used references because the collector might be re-used
212
		monitor = null;
213
	}
214
	
215
	protected String getFormattedMatchesString(int count) {
216
		if (count == 1) {
217
			return MATCH;
218
		}
219
		Object[] messageFormatArgs = { new Integer(count) };
220
		return MessageFormat.format(MATCHES, messageFormatArgs);
221
	}
222
223
	public Set<AbstractTask> getTaskHits() {
224
		return taskResults;
176
	}
225
	}
177
226
178
}
227
}
(-)src/org/eclipse/mylyn/tasks/ui/search/AbstractRepositoryQueryPage.java (-1 / +1 lines)
Lines 138-144 Link Here
138
				repository.getKind());
138
				repository.getKind());
139
		if (connector != null) {
139
		if (connector != null) {
140
			SearchHitCollector collector = new SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(),
140
			SearchHitCollector collector = new SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(),
141
					repository, getQuery(), new TaskFactory(repository));
141
					repository, getQuery(), new TaskFactory(repository, false, false));
142
			NewSearchUI.runQueryInBackground(collector);
142
			NewSearchUI.runQueryInBackground(collector);
143
		}
143
		}
144
		return true;
144
		return true;
(-)src/org/eclipse/mylyn/tasks/ui/SynchronizeQueryJob.java (-81 / +117 lines)
Lines 11-22 Link Here
11
11
12
package org.eclipse.mylyn.tasks.ui;
12
package org.eclipse.mylyn.tasks.ui;
13
13
14
import java.util.Collections;
14
import java.util.Date;
15
import java.util.Date;
15
import java.util.HashSet;
16
import java.util.HashSet;
16
import java.util.Set;
17
import java.util.Set;
17
18
19
import org.eclipse.core.runtime.CoreException;
18
import org.eclipse.core.runtime.IProgressMonitor;
20
import org.eclipse.core.runtime.IProgressMonitor;
19
import org.eclipse.core.runtime.IStatus;
21
import org.eclipse.core.runtime.IStatus;
22
import org.eclipse.core.runtime.Platform;
20
import org.eclipse.core.runtime.Status;
23
import org.eclipse.core.runtime.Status;
21
import org.eclipse.core.runtime.SubProgressMonitor;
24
import org.eclipse.core.runtime.SubProgressMonitor;
22
import org.eclipse.core.runtime.jobs.Job;
25
import org.eclipse.core.runtime.jobs.Job;
Lines 28-34 Link Here
28
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
31
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
29
import org.eclipse.mylyn.tasks.core.AbstractTask;
32
import org.eclipse.mylyn.tasks.core.AbstractTask;
30
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
33
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
31
import org.eclipse.mylyn.tasks.core.RepositoryStatus;
32
import org.eclipse.mylyn.tasks.core.TaskList;
34
import org.eclipse.mylyn.tasks.core.TaskList;
33
import org.eclipse.mylyn.tasks.core.TaskRepository;
35
import org.eclipse.mylyn.tasks.core.TaskRepository;
34
import org.eclipse.ui.PlatformUI;
36
import org.eclipse.ui.PlatformUI;
Lines 37-88 Link Here
37
/**
39
/**
38
 * @author Mik Kersten
40
 * @author Mik Kersten
39
 * @author Rob Elves
41
 * @author Rob Elves
42
 * @author Steffen Pingel
40
 */
43
 */
41
class SynchronizeQueryJob extends Job {
44
class SynchronizeQueryJob extends Job {
42
45
43
	private final AbstractRepositoryConnector connector;
46
	private final AbstractRepositoryConnector connector;
44
47
45
	private static final String JOB_LABEL = "Synchronizing queries";
48
	private final TaskRepository repository;
46
49
47
	private Set<AbstractRepositoryQuery> queries;
50
	private final Set<AbstractRepositoryQuery> queries;
48
51
49
	private Set<TaskRepository> repositories;
52
	private final TaskList taskList;
50
53
51
	private boolean synchChangedTasks;
54
	private boolean synchronizeChangedTasks;
52
55
53
	private TaskList taskList;
56
	private boolean forced = false;
54
57
55
// private RepositorySynchronizationManager synchronizationManager;
58
	private HashSet<AbstractTask> tasksToBeSynchronized = new HashSet<AbstractTask>();
56
59
57
	private boolean forced = false;
60
	public SynchronizeQueryJob(AbstractRepositoryConnector connector, TaskRepository repository,
61
			Set<AbstractRepositoryQuery> queries, TaskList taskList) {
62
		super("Synchronizying queries for " + repository.getRepositoryLabel());
58
63
59
	public SynchronizeQueryJob(RepositorySynchronizationManager synchronizationManager,
60
			AbstractRepositoryConnector connector, Set<AbstractRepositoryQuery> queries, TaskList taskList) {
61
		super(JOB_LABEL + ": " + connector.getRepositoryType());
62
		this.connector = connector;
64
		this.connector = connector;
65
		this.repository = repository;
63
		this.queries = queries;
66
		this.queries = queries;
64
		this.taskList = taskList;
67
		this.taskList = taskList;
65
		this.repositories = new HashSet<TaskRepository>();
66
		// TODO: remove once architecture established
67
		// this.synchronizationManager = synchronizationManager;
68
	}
68
	}
69
69
70
	public void setSynchChangedTasks(boolean syncChangedTasks) {
70
	public void setSynchronizeChangedTasks(boolean synchronizeChangedTasks) {
71
		this.synchChangedTasks = syncChangedTasks;
71
		this.synchronizeChangedTasks = synchronizeChangedTasks;
72
	}
72
	}
73
73
74
	/**
74
	/**
75
	 * Returns true, if synchronization was triggered manually and not by an
75
	 * Returns true, if synchronization was triggered manually and not by an automatic background job.
76
	 * automatic background job.
77
	 */
76
	 */
78
	public boolean isForced() {
77
	public boolean isForced() {
79
		return forced;
78
		return forced;
80
	}
79
	}
81
80
82
	/**
81
	/**
83
	 * Indicates a manual synchronization (User initiated). If set to true, a
82
	 * Indicates a manual synchronization (User initiated). If set to true, a dialog will be displayed in case of
84
	 * dialog will be displayed in case of errors. Any tasks with missing data
83
	 * errors. Any tasks with missing data will be retrieved.
85
	 * will be retrieved.
86
	 */
84
	 */
87
	public void setForced(boolean forced) {
85
	public void setForced(boolean forced) {
88
		this.forced = forced;
86
		this.forced = forced;
Lines 90-169 Link Here
90
88
91
	@Override
89
	@Override
92
	protected IStatus run(IProgressMonitor monitor) {
90
	protected IStatus run(IProgressMonitor monitor) {
93
		monitor.beginTask(JOB_LABEL, queries.size());
91
		try {
92
			monitor.beginTask("Synchronizing " + queries.size() + " queries", 20 + queries.size() * 10 + 40);
94
93
95
		taskList.notifyContainersUpdated(queries);
94
			Set<AbstractTask> allTasks = Collections.unmodifiableSet(taskList.getRepositoryTasks(repository.getUrl()));
96
		for (AbstractRepositoryQuery repositoryQuery : queries) {
97
//			taskList.notifyContainerUpdated(repositoryQuery);
98
			repositoryQuery.setStatus(null);
99
100
			monitor.setTaskName("Synchronizing: " + repositoryQuery.getSummary());
101
			setProperty(IProgressConstants.ICON_PROPERTY, TasksUiImages.REPOSITORY_SYNCHRONIZE);
102
			TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
103
					repositoryQuery.getRepositoryKind(), repositoryQuery.getRepositoryUrl());
104
			if (repository == null) {
105
				repositoryQuery.setStatus(RepositoryStatus.createNotFoundError(repositoryQuery.getRepositoryUrl(),
106
						TasksUiPlugin.PLUGIN_ID));
107
			} else {
108
109
				QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository));
110
				SubProgressMonitor collectorMonitor = new SubProgressMonitor(monitor, 1);
111
				collector.setProgressMonitor(collectorMonitor);
112
				final IStatus resultingStatus = connector.performQuery(repositoryQuery, repository, collectorMonitor,
113
						collector, forced);
114
115
				if (resultingStatus.getSeverity() == IStatus.CANCEL) {
116
					// do nothing
117
				} else if (resultingStatus.isOK()) {
118
119
					if (collector.getTaskHits().size() >= QueryHitCollector.MAX_HITS) {
120
						MylarStatusHandler.log(
121
								QueryHitCollector.MAX_HITS_REACHED + "\n" + repositoryQuery.getSummary(), this);
122
					}
123
95
124
					repositoryQuery.clear();
96
			// check if the repository has changed at all and have the connector mark tasks that need synchronization 
125
					for (AbstractTask hit : collector.getTaskHits()) {
97
			try {
126
						taskList.addTask(hit, repositoryQuery);
98
				monitor.subTask("Checking for changed tasks");
99
				boolean hasChangedOrNew = connector.markStaleTasks(repository, allTasks,
100
						new SubProgressMonitor(monitor, 20));
101
				if (!hasChangedOrNew && !forced) {
102
					for (AbstractRepositoryQuery repositoryQuery : queries) {
103
						repositoryQuery.setStatus(null);
104
						repositoryQuery.setCurrentlySynchronizing(false);
105
						taskList.notifyContainersUpdated(queries);
127
					}
106
					}
107
					return Status.OK_STATUS;
108
				}
109
			} catch (CoreException e) {
110
				// there is no good way of informing the user at this point, just log the error
111
				MylarStatusHandler.log(e.getStatus());
112
			}
128
113
129
					if (synchChangedTasks) {
114
			// synchronize queries
130
						repositories.add(repository);
115
			int n = 0;
131
					}
116
			for (AbstractRepositoryQuery repositoryQuery : queries) {
117
				repositoryQuery.setStatus(null);
118
				taskList.notifyContainersUpdated(Collections.singleton(repositoryQuery));
119
120
				monitor.setTaskName("Synchronizing " + ++n + "/" + queries.size() + ": " + repositoryQuery.getSummary());
121
				synchronizeQuery(repositoryQuery, new SubProgressMonitor(monitor, 10));
132
122
133
					repositoryQuery.setLastRefreshTimeStamp(DateUtil.getFormattedDate(new Date(), "MMM d, H:mm:ss"));
123
				repositoryQuery.setCurrentlySynchronizing(false);
134
				} else {
124
				taskList.notifyContainersUpdated(Collections.singleton(repositoryQuery));
135
					repositoryQuery.setStatus(resultingStatus);
125
			}
136
					if (isForced()) {
126
137
						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
127
			// for background synchronizations all changed tasks are synchronized including the ones that are not part of a query
138
							public void run() {
128
			if (forced) {
139
								MylarStatusHandler.displayStatus("Query Synchronization Failed", resultingStatus);
129
				for (AbstractTask task : allTasks) {
140
							}
130
					if (task.isStale()) {
141
						});
131
						tasksToBeSynchronized.add(task);
132
						task.setCurrentlySynchronizing(true);
142
					}
133
					}
143
				}
134
				}
144
			}
135
			}
145
136
146
			repositoryQuery.setCurrentlySynchronizing(false);
137
			// synchronize tasks that were marked by the connector
147
			taskList.notifyContainersUpdated(queries);
138
			if (!tasksToBeSynchronized.isEmpty()) {
148
//			taskList.notifyContainerUpdated(repositoryQuery);
139
				monitor.setTaskName("Synchronizing " + tasksToBeSynchronized.size() + " changed tasks");
149
		}
140
				SynchronizeTaskJob job = new SynchronizeTaskJob(connector, tasksToBeSynchronized);
141
				job.setForced(forced);
142
				job.run(new SubProgressMonitor(monitor, 40));
143
144
				if (Platform.isRunning() && !(TasksUiPlugin.getRepositoryManager() == null)) {
145
					TasksUiPlugin.getRepositoryManager().setSyncTime(repository,
146
							connector.getSynchronizationTimestamp(repository, tasksToBeSynchronized),
147
							TasksUiPlugin.getDefault().getRepositoriesFilePath());
148
				}
149
			}
150
150
151
		for (TaskRepository repository : repositories) {
151
			// HACK: force entire Task List to refresh in case containers need to
152
			TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, repository);
152
			// appear or disappear
153
		}
153
			PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
154
				public void run() {
155
					TaskListView view = TaskListView.getFromActivePerspective();
156
					if (view != null) {
157
						// TODO: remove explicit refresh
158
						view.getViewer().refresh();
159
					}
160
				}				
161
			});
154
162
155
		// HACK: force entire Task List to refresh in case containers need to
163
			return Status.OK_STATUS;
156
		// appear or disappear
164
		} finally {
157
		TaskListView view = TaskListView.getFromActivePerspective();
165
			monitor.done();
158
		if (view != null) {
159
			// TODO: remove explicit refresh
160
			view.getViewer().refresh();
161
		}
166
		}
162
//		taskList.notifyContainersUpdated(null);
167
	}
168
169
	private void synchronizeQuery(AbstractRepositoryQuery repositoryQuery, IProgressMonitor monitor) {
170
		setProperty(IProgressConstants.ICON_PROPERTY, TasksUiImages.REPOSITORY_SYNCHRONIZE);
171
172
		QueryHitCollector collector = new QueryHitCollector(taskList, new TaskFactory(repository));
173
174
		final IStatus resultingStatus = connector.performQuery(repositoryQuery, repository, monitor, collector);
175
		if (resultingStatus.getSeverity() == IStatus.CANCEL) {
176
			// do nothing
177
		} else if (resultingStatus.isOK()) {
178
			if (collector.getTaskHits().size() >= QueryHitCollector.MAX_HITS) {
179
				MylarStatusHandler.log(QueryHitCollector.MAX_HITS_REACHED + "\n" + repositoryQuery.getSummary(), this);
180
			}
163
181
164
		monitor.done();
182
			repositoryQuery.clear();
165
183
166
		return Status.OK_STATUS;
184
			for (AbstractTask hit : collector.getTaskHits()) {
185
				taskList.addTask(hit, repositoryQuery);
186
				if (synchronizeChangedTasks && hit.isStale()) {
187
					tasksToBeSynchronized.add(hit);
188
					hit.setCurrentlySynchronizing(true);
189
				}
190
			}
191
192
			repositoryQuery.setLastRefreshTimeStamp(DateUtil.getFormattedDate(new Date(), "MMM d, H:mm:ss"));
193
		} else {
194
			repositoryQuery.setStatus(resultingStatus);
195
			if (isForced()) {
196
				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
197
					public void run() {
198
						MylarStatusHandler.displayStatus("Query Synchronization Failed", resultingStatus);
199
					}
200
				});
201
			}
202
		}
167
	}
203
	}
168
204
169
}
205
}
(-)src/org/eclipse/mylyn/tasks/ui/SynchronizeTaskJob.java (-5 / +7 lines)
Lines 39-45 Link Here
39
 */
39
 */
40
class SynchronizeTaskJob extends Job {
40
class SynchronizeTaskJob extends Job {
41
41
42
	private static final String LABEL_SYNCHRONIZING = "Synchronizing ";
42
	private static final String LABEL_SYNCHRONIZING = "Synchronizing task ";
43
43
44
	private static final String LABEL_SYNCHRONIZE_TASK = "Task Synchronization";
44
	private static final String LABEL_SYNCHRONIZE_TASK = "Task Synchronization";
45
45
Lines 74-80 Link Here
74
	@Override
74
	@Override
75
	public IStatus run(IProgressMonitor monitor) {
75
	public IStatus run(IProgressMonitor monitor) {
76
		try {
76
		try {
77
			monitor.beginTask(LABEL_SYNCHRONIZE_TASK, repositoryTasks.size());
77
			monitor.beginTask(LABEL_SYNCHRONIZING, repositoryTasks.size());
78
			setProperty(IProgressConstants.ICON_PROPERTY, TasksUiImages.REPOSITORY_SYNCHRONIZE);
78
			setProperty(IProgressConstants.ICON_PROPERTY, TasksUiImages.REPOSITORY_SYNCHRONIZE);
79
79
80
			for (final AbstractTask repositoryTask : repositoryTasks) {
80
			for (final AbstractTask repositoryTask : repositoryTasks) {
Lines 117-123 Link Here
117
	}
117
	}
118
118
119
	private void syncTask(IProgressMonitor monitor, AbstractTask repositoryTask) throws CoreException {
119
	private void syncTask(IProgressMonitor monitor, AbstractTask repositoryTask) throws CoreException {
120
		monitor.setTaskName(LABEL_SYNCHRONIZING + repositoryTask.getSummary());
120
		monitor.subTask(repositoryTask.getSummary());
121
121
122
		final TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
122
		final TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
123
				repositoryTask.getRepositoryKind(), repositoryTask.getRepositoryUrl());
123
				repositoryTask.getRepositoryKind(), repositoryTask.getRepositoryUrl());
Lines 139-146 Link Here
139
				Date oldDueDate = repositoryTask.getDueDate();
139
				Date oldDueDate = repositoryTask.getDueDate();
140
				
140
				
141
				
141
				
142
				TaskFactory factory = new TaskFactory(repository);
142
				TaskFactory factory = new TaskFactory(repository, true, forced);
143
				repositoryTask = factory.createTask(downloadedTaskData, true, forced, new SubProgressMonitor(monitor, 1));
143
				repositoryTask = factory.createTask(downloadedTaskData, new SubProgressMonitor(monitor, 1));
144
144
145
//				TasksUiPlugin.getSynchronizationManager().saveIncoming(repositoryTask, downloadedTaskData, forced);
145
//				TasksUiPlugin.getSynchronizationManager().saveIncoming(repositoryTask, downloadedTaskData, forced);
146
//				connector.updateTaskFromTaskData(repository, repositoryTask, downloadedTaskData);
146
//				connector.updateTaskFromTaskData(repository, repositoryTask, downloadedTaskData);
Lines 176-180 Link Here
176
		} else {
176
		} else {
177
			connector.updateTaskFromRepository(repository, repositoryTask, monitor);
177
			connector.updateTaskFromRepository(repository, repositoryTask, monitor);
178
		}
178
		}
179
		
180
		repositoryTask.setStale(false);
179
	}
181
	}
180
}
182
}
(-)src/org/eclipse/mylyn/tasks/ui/RepositorySynchronizationManager.java (-76 / +20 lines)
Lines 12-28 Link Here
12
import java.util.HashSet;
12
import java.util.HashSet;
13
import java.util.Set;
13
import java.util.Set;
14
14
15
import org.eclipse.core.runtime.CoreException;
16
import org.eclipse.core.runtime.IProgressMonitor;
17
import org.eclipse.core.runtime.IStatus;
18
import org.eclipse.core.runtime.NullProgressMonitor;
15
import org.eclipse.core.runtime.NullProgressMonitor;
19
import org.eclipse.core.runtime.Platform;
20
import org.eclipse.core.runtime.Status;
21
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
22
import org.eclipse.core.runtime.jobs.IJobChangeListener;
16
import org.eclipse.core.runtime.jobs.IJobChangeListener;
23
import org.eclipse.core.runtime.jobs.ISchedulingRule;
17
import org.eclipse.core.runtime.jobs.ISchedulingRule;
24
import org.eclipse.core.runtime.jobs.Job;
18
import org.eclipse.core.runtime.jobs.Job;
25
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
26
import org.eclipse.mylyn.core.MylarStatusHandler;
19
import org.eclipse.mylyn.core.MylarStatusHandler;
27
import org.eclipse.mylyn.internal.tasks.core.TaskDataManager;
20
import org.eclipse.mylyn.internal.tasks.core.TaskDataManager;
28
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
21
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
Lines 103-124 Link Here
103
	 */
96
	 */
104
	public final Job synchronize(AbstractRepositoryConnector connector, final AbstractRepositoryQuery repositoryQuery,
97
	public final Job synchronize(AbstractRepositoryConnector connector, final AbstractRepositoryQuery repositoryQuery,
105
			IJobChangeListener listener, boolean forceSync) {
98
			IJobChangeListener listener, boolean forceSync) {
106
		HashSet<AbstractRepositoryQuery> items = new HashSet<AbstractRepositoryQuery>();
99
		TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
107
		items.add(repositoryQuery);
100
				repositoryQuery.getRepositoryKind(), repositoryQuery.getRepositoryUrl());
108
		return synchronize(connector, items, listener, Job.LONG, 0, true, forceSync);
101
		return synchronize(connector, repository, Collections.singleton(repositoryQuery), listener, Job.LONG, 0, forceSync);
109
	}
102
	}
110
103
111
	public final Job synchronize(AbstractRepositoryConnector connector,
104
	public final Job synchronize(AbstractRepositoryConnector connector, TaskRepository repository,
112
			final Set<AbstractRepositoryQuery> repositoryQueries, final IJobChangeListener listener, int priority,
105
			final Set<AbstractRepositoryQuery> repositoryQueries, final IJobChangeListener listener, int priority,
113
			long delay, boolean syncChangedTasks, boolean userForcedSync) {
106
			long delay, boolean userForcedSync) {
114
		TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList();
107
		TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList();
115
		final SynchronizeQueryJob job = new SynchronizeQueryJob(this, connector, repositoryQueries, taskList);
116
		job.setSynchChangedTasks(syncChangedTasks);
117
		job.setForced(userForcedSync);
118
		for (AbstractRepositoryQuery repositoryQuery : repositoryQueries) {
108
		for (AbstractRepositoryQuery repositoryQuery : repositoryQueries) {
119
			repositoryQuery.setCurrentlySynchronizing(true);
109
			repositoryQuery.setCurrentlySynchronizing(true);
120
			// TasksUiPlugin.getTaskListManager().getTaskList().notifyContainerUpdated(repositoryQuery);
110
			// TasksUiPlugin.getTaskListManager().getTaskList().notifyContainerUpdated(repositoryQuery);
121
		}
111
		}
112
113
		final SynchronizeQueryJob job = new SynchronizeQueryJob(connector, repository, repositoryQueries, taskList);
114
		job.setSynchronizeChangedTasks(true);
115
		job.setForced(userForcedSync);
122
		if (listener != null) {
116
		if (listener != null) {
123
			job.addJobChangeListener(listener);
117
			job.addJobChangeListener(listener);
124
		}
118
		}
Lines 145-214 Link Here
145
	 * TaskRepository.syncTime.
139
	 * TaskRepository.syncTime.
146
	 */
140
	 */
147
	public final void synchronizeChanged(final AbstractRepositoryConnector connector, final TaskRepository repository) {
141
	public final void synchronizeChanged(final AbstractRepositoryConnector connector, final TaskRepository repository) {
148
		if (connector.getTaskDataHandler() != null) {
142
		final SynchronizeChangedTasksJob synchronizeChangedTasksJob = new SynchronizeChangedTasksJob(connector, repository);
149
			final SynchronizeChangedTasksJob getChangedTasksJob = new SynchronizeChangedTasksJob(connector, repository);
143
		synchronizeChangedTasksJob.setSystem(true);
150
			getChangedTasksJob.setSystem(true);
144
		synchronizeChangedTasksJob.setRule(new RepositoryMutexRule(repository));
151
			getChangedTasksJob.setRule(new RepositoryMutexRule(repository));
145
		if (!forceSyncExecForTesting) {
152
			if (!forceSyncExecForTesting) {
146
			synchronizeChangedTasksJob.schedule();
153
				getChangedTasksJob.schedule();
147
		} else {
154
			} else {
148
			PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
155
				PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
149
				public void run() {
156
					public void run() {
150
					synchronizeChangedTasksJob.run(new NullProgressMonitor());
157
						getChangedTasksJob.run(new NullProgressMonitor());
151
				}
158
					}
152
			});
159
				});
160
			}
161
		}
153
		}
162
	}
154
	}
163
155
164
	private class SynchronizeChangedTasksJob extends Job {
165
166
		private AbstractRepositoryConnector connector;
167
168
		private TaskRepository repository;
169
170
		private Set<AbstractTask> changedTasks;
171
172
		public SynchronizeChangedTasksJob(AbstractRepositoryConnector connector, TaskRepository repository) {
173
			super("Get Changed Tasks");
174
			this.connector = connector;
175
			this.repository = repository;
176
		}
177
178
		@Override
179
		public IStatus run(IProgressMonitor monitor) {
180
			TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList();
181
			Set<AbstractTask> repositoryTasks = Collections.unmodifiableSet(taskList
182
					.getRepositoryTasks(repository.getUrl()));
183
184
			try {
185
				changedTasks = connector.getChangedSinceLastSync(repository, repositoryTasks, monitor);
186
187
				if (changedTasks == null || changedTasks.size() == 0) {
188
					return Status.OK_STATUS;
189
				}
190
191
				synchronize(connector, changedTasks, false, new JobChangeAdapter() {
192
193
					@Override
194
					public void done(IJobChangeEvent event) {
195
						if (!Platform.isRunning() || TasksUiPlugin.getRepositoryManager() == null) {
196
							return;
197
						}
198
						TasksUiPlugin.getRepositoryManager().setSyncTime(repository,
199
								connector.getLastSyncTimestamp(repository, changedTasks),
200
								TasksUiPlugin.getDefault().getRepositoriesFilePath());
201
					}
202
				});
203
204
			} catch (final CoreException e) {
205
				// ignore, indicates working offline
206
				// error reported in ui (tooltip and warning icon)
207
			}
208
			return Status.OK_STATUS;
209
		};
210
	};
211
212
	/**
156
	/**
213
	 * @param repositoryTask
157
	 * @param repositoryTask
214
	 *            task that changed
158
	 *            task that changed
(-)src/org/eclipse/mylyn/tasks/ui/TaskFactory.java (-9 / +17 lines)
Lines 26-53 Link Here
26
 */
26
 */
27
public class TaskFactory implements ITaskFactory {
27
public class TaskFactory implements ITaskFactory {
28
28
29
	private AbstractRepositoryConnector connector;
29
	private final AbstractRepositoryConnector connector;
30
30
31
	private RepositorySynchronizationManager synchManager;
31
	private final RepositorySynchronizationManager synchManager;
32
32
33
	private TaskRepository repository;
33
	private final TaskRepository repository;
34
34
35
	private TaskList taskList;
35
	private final TaskList taskList;
36
36
37
	//private TaskDataManager dataManager;
37
	//private TaskDataManager dataManager;
38
38
39
	private ITaskDataHandler dataHandler;
39
	private final ITaskDataHandler dataHandler;
40
40
41
	public TaskFactory(TaskRepository repository) {
41
	private final boolean updateTasklist;
42
43
	private final boolean forced;
44
45
	public TaskFactory(TaskRepository repository, boolean updateTasklist, boolean forced) {
42
		this.repository = repository;
46
		this.repository = repository;
47
		this.updateTasklist = updateTasklist;
48
		this.forced = forced;
43
		connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(repository.getKind());
49
		connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(repository.getKind());
44
		synchManager = TasksUiPlugin.getSynchronizationManager();
50
		synchManager = TasksUiPlugin.getSynchronizationManager();
45
		taskList = TasksUiPlugin.getTaskListManager().getTaskList();
51
		taskList = TasksUiPlugin.getTaskListManager().getTaskList();
46
		//dataManager = TasksUiPlugin.getDefault().getTaskDataManager();
52
		//dataManager = TasksUiPlugin.getDefault().getTaskDataManager();
47
		dataHandler = connector.getTaskDataHandler();
53
		dataHandler = connector.getTaskDataHandler();
48
49
	}
54
	}
50
55
56
	public TaskFactory(TaskRepository repository) {
57
		this(repository, true, false);
58
	}
59
	
51
	/**
60
	/**
52
	 * @param updateTasklist -
61
	 * @param updateTasklist -
53
	 *            synchronize task with the provided taskData
62
	 *            synchronize task with the provided taskData
Lines 55-62 Link Here
55
	 *            user requested synchronization
64
	 *            user requested synchronization
56
	 * @throws CoreException
65
	 * @throws CoreException
57
	 */
66
	 */
58
	public AbstractTask createTask(RepositoryTaskData taskData, boolean updateTasklist, boolean forced,
67
	public AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor) throws CoreException {
59
			IProgressMonitor monitor) throws CoreException {
60
		AbstractTask repositoryTask = taskList.getTask(taskData.getRepositoryUrl(), taskData.getId());
68
		AbstractTask repositoryTask = taskList.getTask(taskData.getRepositoryUrl(), taskData.getId());
61
		if (repositoryTask == null) {
69
		if (repositoryTask == null) {
62
70
(-)src/org/eclipse/mylyn/internal/tasks/ui/ScheduledTaskListSynchJob.java (-25 / +7 lines)
Lines 11-33 Link Here
11
11
12
package org.eclipse.mylyn.internal.tasks.ui;
12
package org.eclipse.mylyn.internal.tasks.ui;
13
13
14
import java.util.Collections;
15
import java.util.List;
14
import java.util.List;
16
import java.util.Set;
15
import java.util.Set;
17
16
18
import org.eclipse.core.runtime.IProgressMonitor;
17
import org.eclipse.core.runtime.IProgressMonitor;
19
import org.eclipse.core.runtime.IStatus;
18
import org.eclipse.core.runtime.IStatus;
20
import org.eclipse.core.runtime.NullProgressMonitor;
21
import org.eclipse.core.runtime.OperationCanceledException;
19
import org.eclipse.core.runtime.OperationCanceledException;
22
import org.eclipse.core.runtime.Status;
20
import org.eclipse.core.runtime.Status;
23
import org.eclipse.core.runtime.SubProgressMonitor;
21
import org.eclipse.core.runtime.SubProgressMonitor;
24
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
25
import org.eclipse.core.runtime.jobs.Job;
22
import org.eclipse.core.runtime.jobs.Job;
26
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
27
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
23
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
28
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
24
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
29
import org.eclipse.mylyn.tasks.core.TaskList;
25
import org.eclipse.mylyn.tasks.core.TaskList;
30
import org.eclipse.mylyn.tasks.core.TaskRepository;
26
import org.eclipse.mylyn.tasks.core.TaskRepository;
27
import org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager;
31
import org.eclipse.mylyn.tasks.ui.TaskListManager;
28
import org.eclipse.mylyn.tasks.ui.TaskListManager;
32
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
29
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
33
30
Lines 68-79 Link Here
68
	}
65
	}
69
66
70
	@Override
67
	@Override
71
	public IStatus run(IProgressMonitor monitor) {
68
	public IStatus run(final IProgressMonitor monitor) {
72
		try {
69
		try {
73
			if (monitor == null) {
74
				monitor = new NullProgressMonitor();
75
			}
76
77
			taskList = taskListManager.getTaskList();
70
			taskList = taskListManager.getTaskList();
78
			if (repositories == null) {
71
			if (repositories == null) {
79
				repositories = TasksUiPlugin.getRepositoryManager().getAllRepositories();
72
				repositories = TasksUiPlugin.getRepositoryManager().getAllRepositories();
Lines 113-134 Link Here
113
					updateJob.schedule();
106
					updateJob.schedule();
114
				}
107
				}
115
108
116
				Set<AbstractRepositoryQuery> queries = Collections.unmodifiableSet(taskList
109
				RepositorySynchronizationManager synchronizationManager = TasksUiPlugin.getSynchronizationManager();
117
						.getRepositoryQueries(repository.getUrl()));
110
				Set<AbstractRepositoryQuery> queries = taskList.getRepositoryQueries(repository.getUrl());
118
				if (queries.size() > 0) {
111
				synchronizationManager.synchronize(connector, repository, queries, null,
119
					if (connector != null) {
112
						Job.DECORATE, 0, false);
120
						JobChangeAdapter jobAdapter = new JobChangeAdapter() {
113
				
121
							@Override
122
							public void done(IJobChangeEvent event) {
123
								TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, repository);
124
							}
125
						};
126
						TasksUiPlugin.getSynchronizationManager().synchronize(connector, queries, jobAdapter,
127
								Job.DECORATE, 0, false, false);
128
					}
129
				} else {
130
					TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, repository);
131
				}
132
				monitor.worked(1);
114
				monitor.worked(1);
133
			}
115
			}
134
		} finally {
116
		} finally {
(-)src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeSelectedAction.java (-24 / +23 lines)
Lines 29-34 Link Here
29
import org.eclipse.mylyn.tasks.core.AbstractTask;
29
import org.eclipse.mylyn.tasks.core.AbstractTask;
30
import org.eclipse.mylyn.tasks.core.TaskCategory;
30
import org.eclipse.mylyn.tasks.core.TaskCategory;
31
import org.eclipse.mylyn.tasks.core.TaskRepository;
31
import org.eclipse.mylyn.tasks.core.TaskRepository;
32
import org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager;
32
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
33
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
33
import org.eclipse.ui.IActionBars;
34
import org.eclipse.ui.IActionBars;
34
import org.eclipse.ui.IViewActionDelegate;
35
import org.eclipse.ui.IViewActionDelegate;
Lines 68-78 Link Here
68
				} else if (obj instanceof TaskCategory) {
69
				} else if (obj instanceof TaskCategory) {
69
					TaskCategory cat = (TaskCategory) obj;
70
					TaskCategory cat = (TaskCategory) obj;
70
					for (AbstractTask task : cat.getChildren()) {
71
					for (AbstractTask task : cat.getChildren()) {
71
						if (task instanceof AbstractTask) {
72
						AbstractRepositoryConnector client = TasksUiPlugin.getRepositoryManager()
72
							AbstractRepositoryConnector client = TasksUiPlugin.getRepositoryManager()
73
								.getRepositoryConnector(((AbstractTask) task).getRepositoryKind());
73
									.getRepositoryConnector(((AbstractTask) task).getRepositoryKind());
74
						addTaskToSync(client, (AbstractTask) task);
74
							addTaskToSync(client, (AbstractTask) task);
75
						}
76
					}
75
					}
77
				} else if (obj instanceof AbstractTask) {
76
				} else if (obj instanceof AbstractTask) {
78
					AbstractTask repositoryTask = (AbstractTask) obj;
77
					AbstractTask repositoryTask = (AbstractTask) obj;
Lines 82-122 Link Here
82
				}
81
				}
83
			}
82
			}
84
83
84
			RepositorySynchronizationManager syncManager = TasksUiPlugin.getSynchronizationManager();
85
			if (!queriesToSyncMap.isEmpty()) {
85
			if (!queriesToSyncMap.isEmpty()) {
86
				
86
				
87
				// determine which repositories to synch changed tasks for
87
				// determine which repositories to synch changed tasks for
88
				HashMap<String, Set<TaskRepository>> repositoriesToSync = new HashMap<String, Set<TaskRepository>>();
88
				HashMap<TaskRepository, Set<AbstractRepositoryQuery>> repositoriesToSync = new HashMap<TaskRepository, Set<AbstractRepositoryQuery>>();
89
				for (AbstractRepositoryConnector connector : queriesToSyncMap.keySet()) {
89
				for (AbstractRepositoryConnector connector : queriesToSyncMap.keySet()) {
90
					List<AbstractRepositoryQuery> queriesToSync = queriesToSyncMap.get(connector);
90
					List<AbstractRepositoryQuery> queriesToSync = queriesToSyncMap.get(connector);
91
					if(queriesToSync==null || queriesToSync.isEmpty()) {
92
						continue;
93
					}
94
					
91
					for (AbstractRepositoryQuery query : queriesToSync) {
95
					for (AbstractRepositoryQuery query : queriesToSync) {
92
						TaskRepository repos = TasksUiPlugin.getRepositoryManager().getRepository(query.getRepositoryKind(), query.getRepositoryUrl());
96
						TaskRepository repos = TasksUiPlugin.getRepositoryManager().getRepository(query.getRepositoryKind(), query.getRepositoryUrl());
93
						Set<TaskRepository> repositories = repositoriesToSync.get(connector.getRepositoryType());
97
						Set<AbstractRepositoryQuery> queries = repositoriesToSync.get(repos);
94
						if(repositories == null) {
98
						if(queries == null) {
95
							repositories = new HashSet<TaskRepository>();
99
							queries = new HashSet<AbstractRepositoryQuery>();
96
							repositoriesToSync.put(connector.getRepositoryType(), repositories);
100
							repositoriesToSync.put(repos, queries);
97
						}
101
						}
98
						repositories.add(repos);
102
						queries.add(query);
99
					}
103
					}
100
				}
104
				}
101
				
105
				
102
				// synch the queries followed by the repositories
106
				for (Map.Entry<TaskRepository, Set<AbstractRepositoryQuery>> entry : repositoriesToSync.entrySet()) {
103
				for (AbstractRepositoryConnector connector : queriesToSyncMap.keySet()) {
107
					TaskRepository repository = entry.getKey();
104
					List<AbstractRepositoryQuery> queriesToSync = queriesToSyncMap.get(connector);
108
					AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager()
105
					if (queriesToSync != null && queriesToSync.size() > 0) {
109
							.getRepositoryConnector(repository.getKind());
106
						TasksUiPlugin.getSynchronizationManager().synchronize(connector, new HashSet<AbstractRepositoryQuery>(queriesToSync), null, Job.LONG, 0,
110
					Set<AbstractRepositoryQuery> queries = entry.getValue();
107
								false, true);
111
					syncManager.synchronize(connector, repository, queries, null, Job.LONG, 0L, true);
108
					}
112
				}
109
					//XXX enable?
110
//					for (TaskRepository taskRepository : repositoriesToSync.get(connector.getRepositoryType())) {
111
//						TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, taskRepository);
112
//					}
113
				}				
114
			}
113
			}
115
			if (!tasksToSyncMap.isEmpty()) {
114
			if (!tasksToSyncMap.isEmpty()) {
116
				for (AbstractRepositoryConnector connector : tasksToSyncMap.keySet()) {
115
				for (AbstractRepositoryConnector connector : tasksToSyncMap.keySet()) {
117
					List<AbstractTask> tasksToSync = tasksToSyncMap.get(connector);
116
					List<AbstractTask> tasksToSync = tasksToSyncMap.get(connector);
118
					if (tasksToSync != null && tasksToSync.size() > 0) {
117
					if (tasksToSync != null && tasksToSync.size() > 0) {
119
						TasksUiPlugin.getSynchronizationManager().synchronize(connector, new HashSet<AbstractTask>(tasksToSync), true, null);
118
						syncManager.synchronize(connector, new HashSet<AbstractTask>(tasksToSync), true, null);
120
					}
119
					}
121
				}
120
				}
122
			}
121
			}
(-)src/org/eclipse/mylyn/tasks/ui/SynchronizeChangedTasksJob.java (+89 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004 - 2006 Mylar committers and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *******************************************************************************/
8
9
package org.eclipse.mylyn.tasks.ui;
10
11
import java.util.Iterator;
12
import java.util.Set;
13
14
import org.eclipse.core.runtime.CoreException;
15
import org.eclipse.core.runtime.IProgressMonitor;
16
import org.eclipse.core.runtime.IStatus;
17
import org.eclipse.core.runtime.Status;
18
import org.eclipse.core.runtime.SubProgressMonitor;
19
import org.eclipse.core.runtime.jobs.Job;
20
import org.eclipse.mylyn.core.MylarStatusHandler;
21
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
22
import org.eclipse.mylyn.tasks.core.AbstractTask;
23
import org.eclipse.mylyn.tasks.core.TaskList;
24
import org.eclipse.mylyn.tasks.core.TaskRepository;
25
26
public class SynchronizeChangedTasksJob extends Job {
27
28
	private final AbstractRepositoryConnector connector;
29
30
	private final TaskRepository repository;
31
32
	private boolean forced;
33
34
	public SynchronizeChangedTasksJob(AbstractRepositoryConnector connector, TaskRepository repository) {
35
		super("Get Changed Tasks");
36
		
37
		this.connector = connector;
38
		this.repository = repository;
39
	}
40
41
	/**
42
	 * Returns true, if synchronization was triggered manually and not by an automatic background job.
43
	 */
44
	public boolean isForced() {
45
		return forced;
46
	}
47
48
	/**
49
	 * Indicates a manual synchronization (User initiated). If set to true, a dialog will be displayed in case of
50
	 * errors. Any tasks with missing data will be retrieved.
51
	 */
52
	public void setForced(boolean forced) {
53
		this.forced = forced;
54
	}
55
56
	@Override
57
	public IStatus run(IProgressMonitor monitor) {
58
		try {
59
			monitor.beginTask("Synchronizing changed tasks", IProgressMonitor.UNKNOWN);
60
			
61
			TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList();
62
			Set<AbstractTask> tasks = taskList.getRepositoryTasks(repository.getUrl());
63
64
			boolean changed = connector.markStaleTasks(repository, tasks, new SubProgressMonitor(monitor, 1));
65
			if (!changed) {
66
				return Status.OK_STATUS;
67
			}
68
			
69
			for (Iterator<AbstractTask> it = tasks.iterator(); it.hasNext();) {
70
				if (!it.next().isStale()) {
71
					it.remove();
72
				}
73
			}
74
75
			if (!tasks.isEmpty()) {
76
				return Status.OK_STATUS;
77
			}
78
79
			TasksUiPlugin.getSynchronizationManager().synchronize(connector, tasks, forced, null);
80
		} catch (final CoreException e) {
81
			MylarStatusHandler.log(e.getStatus());
82
		} finally {
83
			monitor.done();
84
		}
85
		
86
		return Status.OK_STATUS;
87
	};
88
	
89
}
(-)src/org/eclipse/mylyn/trac/tests/RepositorySearchQueryTest.java (-1 / +1 lines)
Lines 78-84 Link Here
78
		String queryUrl = repository.getUrl() + ITracClient.QUERY_URL + search.toUrl();
78
		String queryUrl = repository.getUrl() + ITracClient.QUERY_URL + search.toUrl();
79
		TracRepositoryQuery query = new TracRepositoryQuery(repository.getUrl(), queryUrl, "description");
79
		TracRepositoryQuery query = new TracRepositoryQuery(repository.getUrl(), queryUrl, "description");
80
		SearchHitCollector collector = new SearchHitCollector(TasksUiPlugin.getTaskListManager()
80
		SearchHitCollector collector = new SearchHitCollector(TasksUiPlugin.getTaskListManager()
81
				.getTaskList(), repository, query, new TaskFactory(repository));
81
				.getTaskList(), repository, query, new TaskFactory(repository, false, false));
82
				
82
				
83
		collector.run(new NullProgressMonitor());
83
		collector.run(new NullProgressMonitor());
84
		for (AbstractTask task : collector.getTaskHits()) {
84
		for (AbstractTask task : collector.getTaskHits()) {
(-)src/org/eclipse/mylyn/trac/tests/TracRepositoryConnectorTest.java (-1 / +1 lines)
Lines 217-223 Link Here
217
			public void accept(AbstractTask hit) {
217
			public void accept(AbstractTask hit) {
218
				result.add(hit);
218
				result.add(hit);
219
			}};
219
			}};
220
		IStatus queryStatus = connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector, false);
220
		IStatus queryStatus = connector.performQuery(query, repository, new NullProgressMonitor(), hitCollector);
221
221
222
		assertTrue(queryStatus.isOK());
222
		assertTrue(queryStatus.isOK());
223
		assertEquals(3, result.size());
223
		assertEquals(3, result.size());
(-)src/org/eclipse/mylyn/trac/tests/TracTaskDataHandlerTest.java (-22 / +34 lines)
Lines 79-97 Link Here
79
79
80
	public void testGetChangedSinceLastSyncWeb096() throws Exception {
80
	public void testGetChangedSinceLastSyncWeb096() throws Exception {
81
		init(TracTestConstants.TEST_TRAC_096_URL, Version.TRAC_0_9);
81
		init(TracTestConstants.TEST_TRAC_096_URL, Version.TRAC_0_9);
82
		TracTask task = (TracTask) connector.createTaskFromExistingId(repository, data.offlineHandlerTicketId + "", new NullProgressMonitor());
82
		TracTask task = (TracTask) connector.createTaskFromExistingId(repository, data.offlineHandlerTicketId + "",
83
				new NullProgressMonitor());
83
84
84
		Set<AbstractTask> tasks = new HashSet<AbstractTask>();
85
		Set<AbstractTask> tasks = new HashSet<AbstractTask>();
85
		tasks.add(task);
86
		tasks.add(task);
86
		
87
87
		assertEquals(null, repository.getSyncTimeStamp());
88
		assertEquals(null, repository.getSyncTimeStamp());
88
		Set<AbstractTask> result = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor());
89
		boolean changed = connector.markStaleTasks(repository, tasks, new NullProgressMonitor());
89
		assertEquals(tasks, result);
90
		assertEquals(true, changed);
90
		assertEquals(null, repository.getSyncTimeStamp());
91
		assertEquals(null, repository.getSyncTimeStamp());
91
		
92
		assertFalse(task.isStale());
92
		int time = (int)(System.currentTimeMillis() / 1000) + 1;
93
94
		int time = (int) (System.currentTimeMillis() / 1000) + 1;
93
		repository.setSyncTimeStamp(time + "");
95
		repository.setSyncTimeStamp(time + "");
94
		assertEquals(tasks, result);
96
		changed = connector.markStaleTasks(repository, tasks, new NullProgressMonitor());
97
		assertEquals(true, changed);
98
		assertFalse(task.isStale());
95
	}
99
	}
96
100
97
	public void testGetChangedSinceLastSyncXmlRpc010() throws Exception {
101
	public void testGetChangedSinceLastSyncXmlRpc010() throws Exception {
Lines 105-132 Link Here
105
	}
109
	}
106
110
107
	private void getChangedSinceLastSync() throws Exception {
111
	private void getChangedSinceLastSync() throws Exception {
108
		TracTask task = (TracTask) connector.createTaskFromExistingId(repository, data.offlineHandlerTicketId + "", new NullProgressMonitor());
112
		TracTask task = (TracTask) connector.createTaskFromExistingId(repository, data.offlineHandlerTicketId + "",
113
				new NullProgressMonitor());
109
		TasksUiPlugin.getSynchronizationManager().synchronize(connector, task, true, null);
114
		TasksUiPlugin.getSynchronizationManager().synchronize(connector, task, true, null);
110
		RepositoryTaskData taskData = TasksUiPlugin.getDefault().getTaskDataManager().getNewTaskData(task.getHandleIdentifier());
115
		RepositoryTaskData taskData = TasksUiPlugin.getDefault().getTaskDataManager().getNewTaskData(
111
		
116
				task.getHandleIdentifier());
117
112
		int lastModified = Integer.parseInt(taskData.getLastModified());
118
		int lastModified = Integer.parseInt(taskData.getLastModified());
113
		
119
114
		Set<AbstractTask> tasks = new HashSet<AbstractTask>();
120
		Set<AbstractTask> tasks = new HashSet<AbstractTask>();
115
		tasks.add(task);
121
		tasks.add(task);
116
122
117
		assertEquals(null, repository.getSyncTimeStamp());
123
		assertEquals(null, repository.getSyncTimeStamp());
118
		Set<AbstractTask> result = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor());
124
		boolean changed = connector.markStaleTasks(repository, tasks, new NullProgressMonitor());
119
		assertEquals(tasks, result);
125
		assertTrue(changed);
126
		assertTrue(task.isStale());
120
127
121
		// always returns the ticket because time comparison mode is >=
128
		// always returns the ticket because time comparison mode is >=
129
		task.setStale(false);
122
		repository.setSyncTimeStamp(lastModified + "");
130
		repository.setSyncTimeStamp(lastModified + "");
123
		result = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor());
131
		changed = connector.markStaleTasks(repository, tasks, new NullProgressMonitor());
124
		assertEquals(tasks, result);
132
		assertTrue(changed);
133
		assertTrue(task.isStale());
125
134
135
		task.setStale(false);
126
		repository.setSyncTimeStamp((lastModified + 1) + "");
136
		repository.setSyncTimeStamp((lastModified + 1) + "");
127
		result = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor());		
137
		changed = connector.markStaleTasks(repository, tasks, new NullProgressMonitor());
128
		assertTrue(result.isEmpty());
138
		assertTrue(changed);
129
		
139
		assertFalse(task.isStale());
140
130
		// change ticket making sure it gets a new change time
141
		// change ticket making sure it gets a new change time
131
		Thread.sleep(1000);
142
		Thread.sleep(1000);
132
		ITracClient client = connector.getClientManager().getRepository(repository);
143
		ITracClient client = connector.getClientManager().getRepository(repository);
Lines 138-148 Link Here
138
		}
149
		}
139
		client.updateTicket(ticket, "comment");
150
		client.updateTicket(ticket, "comment");
140
151
152
		task.setStale(false);
141
		repository.setSyncTimeStamp((lastModified + 1) + "");
153
		repository.setSyncTimeStamp((lastModified + 1) + "");
142
		result = connector.getChangedSinceLastSync(repository, tasks, new NullProgressMonitor());		
154
		changed = connector.markStaleTasks(repository, tasks, new NullProgressMonitor());
143
		assertEquals(tasks, result);
155
		assertTrue(changed);
156
		assertTrue(task.isStale());
144
	}
157
	}
145
	
158
146
	public void testNonNumericTaskId() {
159
	public void testNonNumericTaskId() {
147
		try {
160
		try {
148
			connector.getTaskDataHandler().getTaskData(repository, "abc", new NullProgressMonitor());
161
			connector.getTaskDataHandler().getTaskData(repository, "abc", new NullProgressMonitor());
Lines 150-155 Link Here
150
		} catch (CoreException e) {
163
		} catch (CoreException e) {
151
		}
164
		}
152
	}
165
	}
153
	
154
166
155
}
167
}
(-)src/org/eclipse/mylyn/internal/trac/ui/editor/NewTracTaskEditor.java (-1 / +1 lines)
Lines 49-55 Link Here
49
		TracRepositoryQuery query = new TracRepositoryQuery(repository.getUrl(), sb.toString(), "<Duplicate Search>");
49
		TracRepositoryQuery query = new TracRepositoryQuery(repository.getUrl(), sb.toString(), "<Duplicate Search>");
50
50
51
		SearchHitCollector collector = new SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(),
51
		SearchHitCollector collector = new SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(),
52
				repository, query, new TaskFactory(repository));
52
				repository, query, new TaskFactory(repository, false, false));
53
		return collector;
53
		return collector;
54
	}
54
	}
55
55
(-)src/org/eclipse/mylyn/internal/jira/ui/JiraTaskDataHandler.java (-17 / +34 lines)
Lines 81-87 Link Here
81
			}
81
			}
82
			Issue jiraIssue = getJiraIssue(server, taskId, repository.getUrl());
82
			Issue jiraIssue = getJiraIssue(server, taskId, repository.getUrl());
83
			if (jiraIssue != null) {
83
			if (jiraIssue != null) {
84
				return createTaskData(repository, server, jiraIssue);
84
				return createTaskData(repository, server, jiraIssue, null);
85
			}
85
			}
86
			throw new CoreException(new org.eclipse.core.runtime.Status(IStatus.ERROR, JiraCorePlugin.ID, IStatus.OK,
86
			throw new CoreException(new org.eclipse.core.runtime.Status(IStatus.ERROR, JiraCorePlugin.ID, IStatus.OK,
87
					"JIRA ticket not found: " + taskId, null));
87
					"JIRA ticket not found: " + taskId, null));
Lines 91-103 Link Here
91
		}
91
		}
92
	}
92
	}
93
93
94
	protected RepositoryTaskData createTaskData(TaskRepository repository, JiraClient server, Issue jiraIssue)
94
	protected RepositoryTaskData createTaskData(TaskRepository repository, JiraClient server, Issue jiraIssue, RepositoryTaskData oldTaskData)
95
			throws JiraException {
95
			throws JiraException {
96
		RepositoryTaskData data = new RepositoryTaskData(attributeFactory, JiraUiPlugin.REPOSITORY_KIND, repository
96
		RepositoryTaskData data = new RepositoryTaskData(attributeFactory, JiraUiPlugin.REPOSITORY_KIND, repository
97
				.getUrl(), jiraIssue.getId());
97
				.getUrl(), jiraIssue.getId());
98
		initializeTaskData(data, server, jiraIssue.getProject());
98
		initializeTaskData(data, server, jiraIssue.getProject());
99
		updateTaskData(data, jiraIssue, server);
99
		updateTaskData(data, jiraIssue, server, oldTaskData);
100
		addOperations(data, jiraIssue, server);
100
		addOperations(data, jiraIssue, server, oldTaskData);
101
		return data;
101
		return data;
102
	}
102
	}
103
103
Lines 169-175 Link Here
169
		return data.getAttribute(key);
169
		return data.getAttribute(key);
170
	}
170
	}
171
171
172
	public void updateTaskData(RepositoryTaskData data, Issue jiraIssue, JiraClient server) throws JiraException {
172
	private void updateTaskData(RepositoryTaskData data, Issue jiraIssue, JiraClient server, RepositoryTaskData oldTaskData) throws JiraException {
173
		String parentKey = jiraIssue.getParentKey();
173
		String parentKey = jiraIssue.getParentKey();
174
		if (parentKey != null) {
174
		if (parentKey != null) {
175
			data.setAttributeValue(JiraAttributeFactory.ATTRIBUTE_ISSUE_PARENT_KEY, parentKey);
175
			data.setAttributeValue(JiraAttributeFactory.ATTRIBUTE_ISSUE_PARENT_KEY, parentKey);
Lines 330-347 Link Here
330
330
331
		// TODO move into server configuration and populate lazily
331
		// TODO move into server configuration and populate lazily
332
		HashSet<String> editableKeys = new HashSet<String>();
332
		HashSet<String> editableKeys = new HashSet<String>();
333
		try {
333
		if (oldTaskData != null) {
334
			RepositoryTaskAttribute[] editableAttributes = server.getEditableAttributes(jiraIssue.getKey());
334
			// avoid server round-trips
335
			if (editableAttributes != null) {
335
			for (RepositoryTaskAttribute attribute : oldTaskData.getAttributes()) {
336
				// System.err.println(data.getTaskKey());
336
				if (!attribute.isReadOnly()) {
337
				for (RepositoryTaskAttribute attribute : editableAttributes) {
337
					editableKeys.add(attribute.getID());
338
					// System.err.println(" " + attribute.getID() + " : " +
339
					// attribute.getName());
340
					editableKeys.add(attributeFactory.mapCommonAttributeKey(attribute.getID()));
341
				}
338
				}
339
			}			
340
		} else {
341
			try {
342
				RepositoryTaskAttribute[] editableAttributes = server.getEditableAttributes(jiraIssue.getKey());
343
				if (editableAttributes != null) {
344
					// System.err.println(data.getTaskKey());
345
					for (RepositoryTaskAttribute attribute : editableAttributes) {
346
						// System.err.println(" " + attribute.getID() + " : " +
347
						// attribute.getName());
348
						editableKeys.add(attributeFactory.mapCommonAttributeKey(attribute.getID()));
349
					}
350
				}
351
			} catch (JiraInsufficientPermissionException ex) {
352
				// ignore
342
			}
353
			}
343
		} catch (JiraInsufficientPermissionException ex) {
344
			// ignore
345
		}
354
		}
346
355
347
		for (RepositoryTaskAttribute attribute : data.getAttributes()) {
356
		for (RepositoryTaskAttribute attribute : data.getAttributes()) {
Lines 419-427 Link Here
419
		}
428
		}
420
	}
429
	}
421
430
422
	public void addOperations(RepositoryTaskData data, Issue issue, JiraClient server) throws JiraException {
431
	public void addOperations(RepositoryTaskData data, Issue issue, JiraClient server, RepositoryTaskData oldTaskData) throws JiraException {
423
		Status status = issue.getStatus();
432
		// avoid server round-trips
433
		if (oldTaskData != null) {
434
			for (RepositoryOperation operation : oldTaskData.getOperations()) {
435
				data.addOperation(operation);
436
			}
437
			return;
438
		}
424
439
440
		Status status = issue.getStatus();
441
		
425
		RepositoryOperation leaveOperation = new RepositoryOperation(LEAVE_OPERATION, "Leave as "
442
		RepositoryOperation leaveOperation = new RepositoryOperation(LEAVE_OPERATION, "Leave as "
426
				+ issue.getStatus().getName());
443
				+ issue.getStatus().getName());
427
		leaveOperation.setChecked(true);
444
		leaveOperation.setChecked(true);
(-)src/org/eclipse/mylyn/internal/jira/ui/JiraRepositoryConnector.java (-76 / +92 lines)
Lines 15-21 Link Here
15
import java.text.SimpleDateFormat;
15
import java.text.SimpleDateFormat;
16
import java.util.ArrayList;
16
import java.util.ArrayList;
17
import java.util.Calendar;
17
import java.util.Calendar;
18
import java.util.Collections;
19
import java.util.Date;
18
import java.util.Date;
20
import java.util.HashSet;
19
import java.util.HashSet;
21
import java.util.List;
20
import java.util.List;
Lines 41-57 Link Here
41
import org.eclipse.mylyn.internal.jira.core.model.filter.RelativeDateRangeFilter.RangeType;
40
import org.eclipse.mylyn.internal.jira.core.model.filter.RelativeDateRangeFilter.RangeType;
42
import org.eclipse.mylyn.internal.jira.core.service.JiraClient;
41
import org.eclipse.mylyn.internal.jira.core.service.JiraClient;
43
import org.eclipse.mylyn.internal.jira.core.service.JiraException;
42
import org.eclipse.mylyn.internal.jira.core.service.JiraException;
43
import org.eclipse.mylyn.internal.tasks.core.RepositoryTaskHandleUtil;
44
import org.eclipse.mylyn.tasks.core.AbstractAttributeFactory;
44
import org.eclipse.mylyn.tasks.core.AbstractAttributeFactory;
45
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
45
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
46
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
46
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
47
import org.eclipse.mylyn.tasks.core.AbstractTask;
47
import org.eclipse.mylyn.tasks.core.AbstractTask;
48
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
48
import org.eclipse.mylyn.tasks.core.IAttachmentHandler;
49
import org.eclipse.mylyn.tasks.core.ITaskCollector;
49
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
50
import org.eclipse.mylyn.tasks.core.ITaskDataHandler;
50
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
51
import org.eclipse.mylyn.tasks.core.QueryHitCollector;
51
import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute;
52
import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute;
52
import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
53
import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
53
import org.eclipse.mylyn.tasks.core.TaskRepository;
54
import org.eclipse.mylyn.tasks.core.TaskRepository;
54
import org.eclipse.mylyn.tasks.core.AbstractTask.PriorityLevel;
55
import org.eclipse.mylyn.tasks.core.AbstractTask.PriorityLevel;
56
import org.eclipse.mylyn.tasks.ui.TaskFactory;
55
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
57
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
56
58
57
/**
59
/**
Lines 109-164 Link Here
109
111
110
	@Override
112
	@Override
111
	public IStatus performQuery(AbstractRepositoryQuery repositoryQuery, TaskRepository repository,
113
	public IStatus performQuery(AbstractRepositoryQuery repositoryQuery, TaskRepository repository,
112
			IProgressMonitor monitor, QueryHitCollector resultCollector, boolean forced) {
114
			IProgressMonitor monitor, ITaskCollector resultCollector) {
113
		JiraClient client = JiraClientFacade.getDefault().getJiraClient(repository);
115
		try {
116
			monitor.beginTask("Running query", IProgressMonitor.UNKNOWN);
117
			
118
			JiraClient client = JiraClientFacade.getDefault().getJiraClient(repository);
114
119
115
		Query filter;
120
			Query filter;
116
		if (repositoryQuery instanceof JiraRepositoryQuery) {
121
			if (repositoryQuery instanceof JiraRepositoryQuery) {
117
			filter = ((JiraRepositoryQuery) repositoryQuery).getNamedFilter();
122
				filter = ((JiraRepositoryQuery) repositoryQuery).getNamedFilter();
118
		} else if (repositoryQuery instanceof JiraCustomQuery) {
123
			} else if (repositoryQuery instanceof JiraCustomQuery) {
119
			try {
124
				try {
120
				if (!client.hasDetails()) {
125
					if (!client.hasDetails()) {
121
					client.refreshDetails(monitor);
126
						client.refreshDetails(monitor);
127
					}
128
					filter = ((JiraCustomQuery) repositoryQuery).getFilterDefinition(client, true);
129
				} catch (JiraException e) {
130
					return JiraCorePlugin.toStatus(repository, e);
131
				} catch (InvalidJiraQueryException e) {
132
					return new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, 0,
133
							"The query parameters do not match the repository configuration, please check the query properties; "
134
							+ e.getMessage(), null);
122
				}
135
				}
123
				filter = ((JiraCustomQuery) repositoryQuery).getFilterDefinition(client, true);
136
			} else {
137
				return new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, 0, //
138
						"Invalid query type: " + repositoryQuery.getClass(), null);
139
			}
140
141
			List<Issue> issues = new ArrayList<Issue>();
142
			try {
143
				client.search(filter, new JiraIssueCollector(monitor, issues, QueryHitCollector.MAX_HITS));
124
			} catch (JiraException e) {
144
			} catch (JiraException e) {
125
				return JiraCorePlugin.toStatus(repository, e);
145
				return JiraCorePlugin.toStatus(repository, e);
126
			} catch (InvalidJiraQueryException e) {
127
				return new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, 0,
128
						"The query parameters do not match the repository configuration, please check the query properties; "
129
								+ e.getMessage(), null);
130
			}
146
			}
131
		} else {
132
			return new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, 0, //
133
					"Invalid query type: " + repositoryQuery.getClass(), null);
134
		}
135
136
		List<Issue> issues = new ArrayList<Issue>();
137
		try {
138
			client.search(filter, new JiraIssueCollector(monitor, issues, QueryHitCollector.MAX_HITS));
139
		} catch (JiraException e) {
140
			return JiraCorePlugin.toStatus(repository, e);
141
		}
142
143
		try {
144
			int n = 0;
145
			for (Issue issue : issues) {
146
				if(monitor.isCanceled()) return Status.CANCEL_STATUS; 
147
147
148
				monitor.subTask(n++ + "/" + issues.size() +" " + issue.getKey() + " " + issue.getSummary());
148
			try {
149
				resultCollector.accept(offlineHandler.createTaskData(repository, client, issue));
149
				int n = 0;
150
				for (Issue issue : issues) {
151
					if (monitor.isCanceled())
152
						return Status.CANCEL_STATUS;
153
154
					monitor.subTask(++n + "/" + issues.size() + " " + issue.getKey() + " " + issue.getSummary());
155
					String handle = RepositoryTaskHandleUtil.getHandle(repository.getUrl(), issue.getId());
156
					RepositoryTaskData oldTaskData = TasksUiPlugin.getDefault().getTaskDataManager().getNewTaskData(handle);
157
					resultCollector.accept(offlineHandler.createTaskData(repository, client, issue, oldTaskData));
158
				}
159
				return Status.OK_STATUS;
160
			} catch (JiraException e) {
161
				return JiraCorePlugin.toStatus(repository, e);
162
			} catch (CoreException e) {
163
				return e.getStatus();
150
			}
164
			}
151
			return Status.OK_STATUS;
165
		} finally {
152
		} catch (JiraException e) {
166
			monitor.done();
153
			return JiraCorePlugin.toStatus(repository, e);
154
		} catch (CoreException e) {
155
			return e.getStatus();
156
		}
167
		}
157
	}
168
	}
158
169
159
	public Set<AbstractTask> getChangedSinceLastSync(TaskRepository repository,
170
	@Override
160
			Set<AbstractTask> tasks, IProgressMonitor monitor) throws CoreException {
171
	public boolean markStaleTasks(TaskRepository repository, Set<AbstractTask> tasks,
161
172
			IProgressMonitor monitor) throws CoreException {
162
		String dateString = repository.getSyncTimeStamp();
173
		String dateString = repository.getSyncTimeStamp();
163
		Date lastSyncDate = convertDate(dateString);
174
		Date lastSyncDate = convertDate(dateString);
164
		if (lastSyncDate == null) {
175
		if (lastSyncDate == null) {
Lines 170-228 Link Here
170
			}
181
			}
171
		}
182
		}
172
		if (lastSyncDate == null) {
183
		if (lastSyncDate == null) {
173
			return tasks;
184
			for (AbstractTask task : tasks) {
185
				task.setStale(true);
186
			}
187
			return true;
174
		}
188
		}
175
189
176
		long mil = lastSyncDate.getTime();
190
		long mil = lastSyncDate.getTime();
177
		long now = Calendar.getInstance().getTimeInMillis();
191
		long now = Calendar.getInstance().getTimeInMillis();
178
		if (now - mil <= 0) {
192
		if (now - mil <= 0) {
179
			return Collections.emptySet();
193
			return false;
180
		}
194
		}
181
		long minutes = -1 * ((now - mil) / (1000 * 60));
195
		long minutes = -1 * ((now - mil) / (1000 * 60));
182
		if (minutes == 0) {
196
		if (minutes == 0) {
183
			return Collections.emptySet();
197
			return false;
184
		}
198
		}
185
199
186
		FilterDefinition changedFilter = new FilterDefinition("Changed Tasks");
200
		FilterDefinition changedFilter = new FilterDefinition("Changed Tasks");
187
		changedFilter.setUpdatedDateFilter(new RelativeDateRangeFilter(RangeType.MINUTE, minutes));
201
		changedFilter.setUpdatedDateFilter(new RelativeDateRangeFilter(RangeType.MINUTE, minutes));
188
		changedFilter.setOrdering(new Order[] { new Order(Order.Field.UPDATED, false) });
202
		changedFilter.setOrdering(new Order[] { new Order(Order.Field.UPDATED, false) });
189
190
		final List<Issue> issues = new ArrayList<Issue>();
191
		// unlimited maxHits can create crazy amounts of traffic
192
		JiraIssueCollector collector = new JiraIssueCollector(new NullProgressMonitor(), issues, 500);
193
		JiraClient client = JiraClientFacade.getDefault().getJiraClient(repository);
194
195
		// TODO: Need some way to further scope this query
203
		// TODO: Need some way to further scope this query
196
204
205
		List<Issue> issues = new ArrayList<Issue>();
206
		JiraClient client = JiraClientFacade.getDefault().getJiraClient(repository);
207
		// unlimited maxHits can create crazy amounts of traffic
208
		JiraIssueCollector issueCollector = new JiraIssueCollector(new NullProgressMonitor(), issues, 500);
197
		try {
209
		try {
198
			// XXX: disabled work around
210
			client.search(changedFilter, issueCollector);
199
			// TODO: remove, added to re-open connection, bug 164543
200
			// jiraServer.getServerInfo();
201
			// Will get ALL issues that have changed since lastSyncDate
202
			client.search(changedFilter, collector);
203
		} catch (JiraException e) {
204
			throw new CoreException(JiraCorePlugin.toStatus(repository, e));
205
		}
206
211
207
		Set<AbstractTask> changedTasks = new HashSet<AbstractTask>();
212
			if (issues.isEmpty()) {
208
		for (Issue issue : issues) {
213
				return false; // no hits
209
			// String handle =
210
			// AbstractTask.getHandle(repository.getUrl(),
211
			// issue.getId());
212
			AbstractTask task = TasksUiPlugin.getTaskListManager().getTaskList().getTask(repository.getUrl(), issue.getId());
213
			if (task instanceof AbstractTask) {
214
				changedTasks.add((AbstractTask) task);
215
			}
214
			}
216
215
217
			if (issue.getUpdated() != null && issue.getUpdated().after(lastSyncDate)) {
216
			int n = 0;
218
				lastSyncDate = issue.getUpdated();
217
			TaskFactory factory = new TaskFactory(repository);
218
			for (Issue issue : issues) {
219
				AbstractTask task = TasksUiPlugin.getTaskListManager().getTaskList().getTask(repository.getUrl(),
220
						issue.getId());
221
				if (!tasks.contains(task)) {
222
					continue;
223
				}
224
225
				monitor.subTask(++n + "/" + issues.size() + " " + issue.getKey() + " " + issue.getSummary());
226
				String handle = RepositoryTaskHandleUtil.getHandle(repository.getUrl(), issue.getId());
227
				RepositoryTaskData oldTaskData = TasksUiPlugin.getDefault().getTaskDataManager().getNewTaskData(handle);
228
				RepositoryTaskData taskData = offlineHandler.createTaskData(repository, client, issue, oldTaskData);
229
				factory.createTask(taskData, new NullProgressMonitor());
230
231
				if (issue.getUpdated() != null && issue.getUpdated().after(lastSyncDate)) {
232
					lastSyncDate = issue.getUpdated();
233
				}
219
			}
234
			}
220
		}
221
235
222
		repository.setSyncTimeStamp( // 
236
			repository.setSyncTimeStamp( // 
223
				new SimpleDateFormat(JiraAttributeFactory.JIRA_DATE_FORMAT, Locale.US).format(lastSyncDate));
237
			new SimpleDateFormat(JiraAttributeFactory.JIRA_DATE_FORMAT, Locale.US).format(lastSyncDate));
224
238
225
		return changedTasks;
239
			return true;
240
		} catch (JiraException e) {
241
			throw new CoreException(JiraCorePlugin.toStatus(repository, e));
242
		}
226
	}
243
	}
227
244
228
	private Date convertDate(String dateString) {
245
	private Date convertDate(String dateString) {
Lines 238-245 Link Here
238
	}
255
	}
239
256
240
	@Override
257
	@Override
241
	public String getLastSyncTimestamp(TaskRepository repository, Set<AbstractTask> changedTasks) {
258
	public String getSynchronizationTimestamp(TaskRepository repository, Set<AbstractTask> changedTasks) {
242
		// XXX to late for JIRA to calcualate the timestamp: bug 176934
259
		// the timestamp is updated in markStaleTasks()
243
		return repository.getSyncTimeStamp();
260
		return repository.getSyncTimeStamp();
244
	}
261
	}
245
262
Lines 372-379 Link Here
372
			jiraTask.setTaskUrl(getTaskUrl(repository.getUrl(), repositoryTask.getTaskKey()));
389
			jiraTask.setTaskUrl(getTaskUrl(repository.getUrl(), repositoryTask.getTaskKey()));
373
390
374
			JiraClient client = JiraClientFacade.getDefault().getJiraClient(repository);
391
			JiraClient client = JiraClientFacade.getDefault().getJiraClient(repository);
375
			jiraTask.setPriority(getMylarPriority(client, taskData.getAttributeValue(RepositoryTaskAttribute.PRIORITY))
392
			jiraTask.setPriority(getMylarPriority(client, taskData.getAttributeValue(RepositoryTaskAttribute.PRIORITY)).toString());
376
					.toString());
377
			for (org.eclipse.mylyn.internal.jira.core.model.Status status : client.getStatuses()) {
393
			for (org.eclipse.mylyn.internal.jira.core.model.Status status : client.getStatuses()) {
378
				if (status.getName().equals(taskData.getAttributeValue(RepositoryTaskAttribute.STATUS))) {
394
				if (status.getName().equals(taskData.getAttributeValue(RepositoryTaskAttribute.STATUS))) {
379
					if (isCompleted(status)) {
395
					if (isCompleted(status)) {
(-)src/org/eclipse/mylyn/internal/jira/ui/editor/NewJiraTaskEditor.java (-1 / +1 lines)
Lines 36-42 Link Here
36
		JiraCustomQuery query = new JiraCustomQuery(repository.getUrl(), filter, repository.getCharacterEncoding());
36
		JiraCustomQuery query = new JiraCustomQuery(repository.getUrl(), filter, repository.getCharacterEncoding());
37
37
38
		SearchHitCollector collector = new SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(),
38
		SearchHitCollector collector = new SearchHitCollector(TasksUiPlugin.getTaskListManager().getTaskList(),
39
				repository, query, new TaskFactory(repository));
39
				repository, query, new TaskFactory(repository, false, false));
40
		return collector;
40
		return collector;
41
	}
41
	}

Return to bug 191575