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 139312 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylar/internal/jira/JiraRepositoryUi.java (-2 / +1 lines)
Lines 39-47 Link Here
39
	public IWizard getQueryWizard(TaskRepository repository, AbstractRepositoryQuery query) {
39
	public IWizard getQueryWizard(TaskRepository repository, AbstractRepositoryQuery query) {
40
		if (query instanceof JiraRepositoryQuery || query instanceof JiraCustomQuery) {
40
		if (query instanceof JiraRepositoryQuery || query instanceof JiraCustomQuery) {
41
			return new EditJiraQueryWizard(repository, query);
41
			return new EditJiraQueryWizard(repository, query);
42
		} else {
43
			return new NewJiraQueryWizard(repository);
44
		}
42
		}
43
		return new NewJiraQueryWizard(repository);
45
	}
44
	}
46
	
45
	
47
	@Override
46
	@Override
(-)src/org/eclipse/mylar/internal/jira/JiraRepositoryQuery.java (-2 / +2 lines)
Lines 16-22 Link Here
16
import org.tigris.jira.core.model.NamedFilter;
16
import org.tigris.jira.core.model.NamedFilter;
17
17
18
/**
18
/**
19
 * A JiraFilter represents a query for issues from a Jira repository.
19
 * A JiraRepositoryQuery represents a server-side query for Jira repository.
20
 * 
20
 * 
21
 * @author Mik Kersten
21
 * @author Mik Kersten
22
 */
22
 */
Lines 31-37 Link Here
31
		setMaxHits(MAX_HITS);
31
		setMaxHits(MAX_HITS);
32
		this.filter = filter;
32
		this.filter = filter;
33
		super.repositoryUrl = repositoryUrl;
33
		super.repositoryUrl = repositoryUrl;
34
		setUrl(repositoryUrl + MylarJiraPlugin.FILTER_URL_PREFIX + filter.getId());
34
		setUrl(repositoryUrl + MylarJiraPlugin.FILTER_URL_PREFIX + "&requestId=" + filter.getId());
35
//		super.setDescription(filter.getName());
35
//		super.setDescription(filter.getName());
36
	}
36
	}
37
37
(-)src/org/eclipse/mylar/internal/jira/JiraCustomQuery.java (-8 / +402 lines)
Lines 11-46 Link Here
11
11
12
package org.eclipse.mylar.internal.jira;
12
package org.eclipse.mylar.internal.jira;
13
13
14
import java.io.UnsupportedEncodingException;
15
import java.net.URLDecoder;
16
import java.net.URLEncoder;
17
import java.text.SimpleDateFormat;
18
import java.util.ArrayList;
19
import java.util.Collections;
20
import java.util.Date;
21
import java.util.HashMap;
22
import java.util.List;
23
import java.util.Map;
24
14
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
25
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
15
import org.eclipse.mylar.tasks.core.TaskList;
26
import org.eclipse.mylar.tasks.core.TaskList;
27
import org.eclipse.mylar.tasks.core.TaskRepository;
28
import org.tigris.jira.core.model.Component;
29
import org.tigris.jira.core.model.IssueType;
30
import org.tigris.jira.core.model.Priority;
31
import org.tigris.jira.core.model.Project;
32
import org.tigris.jira.core.model.Resolution;
33
import org.tigris.jira.core.model.Status;
34
import org.tigris.jira.core.model.Version;
35
import org.tigris.jira.core.model.filter.ComponentFilter;
36
import org.tigris.jira.core.model.filter.ContentFilter;
37
import org.tigris.jira.core.model.filter.CurrentUserFilter;
38
import org.tigris.jira.core.model.filter.DateFilter;
39
import org.tigris.jira.core.model.filter.DateRangeFilter;
16
import org.tigris.jira.core.model.filter.FilterDefinition;
40
import org.tigris.jira.core.model.filter.FilterDefinition;
41
import org.tigris.jira.core.model.filter.IssueTypeFilter;
42
import org.tigris.jira.core.model.filter.NobodyFilter;
43
import org.tigris.jira.core.model.filter.PriorityFilter;
44
import org.tigris.jira.core.model.filter.ProjectFilter;
45
import org.tigris.jira.core.model.filter.ResolutionFilter;
46
import org.tigris.jira.core.model.filter.SpecificUserFilter;
47
import org.tigris.jira.core.model.filter.StatusFilter;
48
import org.tigris.jira.core.model.filter.UserFilter;
49
import org.tigris.jira.core.model.filter.UserInGroupFilter;
50
import org.tigris.jira.core.model.filter.VersionFilter;
51
import org.tigris.jira.core.service.JiraServer;
17
52
18
/**
53
/**
19
 * A JiraFilter represents a query for issues from a Jira repository.
54
 * A JiraCustomQuery represents a custom query for issues from a Jira repository.
20
 * 
55
 *
21
 * @author Mik Kersten
56
 * @author Mik Kersten
57
 * @author Eugene Kuleshov
22
 */
58
 */
23
public class JiraCustomQuery extends AbstractRepositoryQuery {
59
public class JiraCustomQuery extends AbstractRepositoryQuery {
24
60
61
	private static final String PROJECT_KEY = "pid";
62
	private static final String COMPONENT_KEY = "component";
63
	private static final String TYPE_KEY = "type";
64
	private static final String PRIORITY_KEY = "priority";
65
	private static final String STATUS_KEY = "status";
66
	private static final String RESOLUTION_KEY = "resolution";
67
68
	private static final String FIXFOR_KEY = "fixfor";
69
	private static final String VERSION_KEY = "version";
70
71
	private static final String QUERY_KEY = "query";
72
	private static final String ENVIRONMENT_KEY = "environment";
73
	private static final String BODY_KEY = "body";
74
	private static final String DESCRIPTION_KEY = "description";
75
	private static final String SUMMARY_KEY = "summary";
76
77
	private static final String ASSIGNEE_KEY = "assignee";
78
	private static final String REPORTER_KEY = "reporter";
79
80
	private static final String CREATED_KEY = "created";
81
	private static final String UPDATED_KEY = "updated";
82
	private static final String DUEDATE_KEY = "duedate";
83
84
	private static final String ISSUE_SPECIFIC_GROUP = "specificgroup";
85
	private static final String ISSUE_SPECIFIC_USER = "specificuser";
86
	private static final String ISSUE_CURRENT_USER = "issue_current_user";
87
	private static final String ISSUE_NO_REPORTER = "issue_no_reporter";
88
25
	private static final int MAX_HITS = 200;
89
	private static final int MAX_HITS = 200;
26
90
27
	protected FilterDefinition filter = null;
28
91
29
	public JiraCustomQuery(String repositoryUrl, FilterDefinition filter, TaskList taskList) {
92
	private final FilterDefinition filter;
93
	private String encoding;
94
95
96
	public JiraCustomQuery(String repositoryUrl, FilterDefinition filter, TaskList taskList, TaskRepository taskRepository) {
30
		super(filter.getName(), taskList);
97
		super(filter.getName(), taskList);
31
		setMaxHits(MAX_HITS);
32
		this.filter = filter;
98
		this.filter = filter;
33
		super.repositoryUrl = repositoryUrl;
99
		this.repositoryUrl = repositoryUrl;
34
		setUrl(repositoryUrl + MylarJiraPlugin.FILTER_URL_PREFIX + filter.getName());
100
		this.encoding = taskRepository.getCharacterEncoding();
101
		this.url = repositoryUrl + MylarJiraPlugin.FILTER_URL_PREFIX + "&reset=true" + getQueryParams(filter);
102
		this.maxHits = MAX_HITS;
103
	}
104
105
	public JiraCustomQuery(String name, String queryUrl, String repositoryUrl,
106
			JiraServer jiraServer, TaskList taskList, TaskRepository taskRepository) {
107
		super(name, taskList);
108
		this.repositoryUrl = repositoryUrl;
109
		this.url = queryUrl;
110
		this.encoding = taskRepository.getCharacterEncoding();
111
		this.filter = createFilter(jiraServer, queryUrl);
112
		this.filter.setName(name);
113
		this.maxHits = MAX_HITS;
35
	}
114
	}
36
115
37
	public String getRepositoryKind() {
116
	public String getRepositoryKind() {
38
		return MylarJiraPlugin.REPOSITORY_KIND;
117
		return MylarJiraPlugin.REPOSITORY_KIND;
39
	}
118
	}
40
	
119
41
	public FilterDefinition getFilterDefinition() {
120
	public FilterDefinition getFilterDefinition() {
42
		return filter;
121
		return filter;
43
	}
122
	}
123
124
125
	private FilterDefinition createFilter(JiraServer jiraServer, String url) {
126
		FilterDefinition filter = new FilterDefinition();
127
128
		int n = url.indexOf('?');
129
		if(n==-1) {
130
			return filter;
131
		}
132
133
		HashMap<String, List<String>> params = new HashMap<String, List<String>>();
134
		for (String pair : url.substring(n+1).split("&")) {
135
			String[] tokens = pair.split("=");
136
			if (tokens.length > 1) {
137
				try {
138
					String key = tokens[0];
139
					String value = tokens.length==1 ? "" : URLDecoder.decode(tokens[1], encoding);
140
					List<String> values = params.get(key);
141
					if(values==null) {
142
						values = new ArrayList<String>();
143
						params.put(key, values);
144
					}
145
					values.add(value);
146
				} catch (UnsupportedEncodingException ex) {
147
					// ignore
148
				}
149
			}
150
		}
151
152
		List<String> projectIds = getIds(params, PROJECT_KEY);
153
		for (String projectId : projectIds) {
154
			Project project = jiraServer.getProjectById(projectId);
155
			filter.setProjectFilter(new ProjectFilter(project));
156
157
			List<String> componentIds = getIds(params, COMPONENT_KEY);
158
			List<Component> components = new ArrayList<Component>();
159
			for (String componentId : componentIds) {
160
				Component[] projectComponents = project.getComponents();
161
				for(Component component : projectComponents) {
162
					if(component.getId().equals(componentId)) {
163
						components.add(component);
164
					}
165
				}
166
			}
167
			if(!components.isEmpty()) {
168
				filter.setComponentFilter(new ComponentFilter(components.toArray(new Component[components.size()])));
169
			}
170
171
			Version[] projectVersions = project.getVersions();
172
173
			List<String> fixForIds = getIds(params, FIXFOR_KEY);
174
			List<Version> fixForversions = new ArrayList<Version>();
175
			for (String fixForId : fixForIds) {
176
				for (Version projectVersion : projectVersions) {
177
					if(projectVersion.getId().equals(fixForId)) {
178
						fixForversions.add(projectVersion);
179
					}
180
				}
181
			}
182
			if(!fixForversions.isEmpty()) {
183
				filter.setFixForVersionFilter(new VersionFilter(fixForversions.toArray(new Version[fixForversions.size()])));
184
			}
185
186
			List<String> versionIds = getIds(params, VERSION_KEY);
187
			List<Version> versions = new ArrayList<Version>();
188
			for (String versionId : versionIds) {
189
				for (Version projectVersion : projectVersions) {
190
					if(projectVersion.getId().equals(versionId)) {
191
						versions.add(projectVersion);
192
					}
193
				}
194
			}
195
			if(!versions.isEmpty()) {
196
				filter.setReportedInVersionFilter(new VersionFilter(versions.toArray(new Version[versions.size()])));
197
			}
198
		}
199
200
		List<String> typeIds = getIds(params, TYPE_KEY);
201
		List<IssueType> issueTypes = new ArrayList<IssueType>();
202
		for (String typeId : typeIds) {
203
			IssueType issueType = jiraServer.getIssueTypeById(typeId);
204
			if(!IssueType.MISSING_ISSUE_TYPE.equals(issueType)) {
205
				issueTypes.add(issueType);
206
			}
207
		}
208
		if(!issueTypes.isEmpty()) {
209
			filter.setIssueTypeFilter(new IssueTypeFilter(issueTypes.toArray(new IssueType[issueTypes.size()])));
210
		}
211
212
		List<String> statusIds = getIds(params, STATUS_KEY);
213
		List<Status> statuses = new ArrayList<Status>();
214
		for (String statusId : statusIds) {
215
			Status status = jiraServer.getStatusById(statusId);
216
			if(!Status.MISSING_STATUS.equals(status)) {
217
				statuses.add(status);
218
			}
219
		}
220
		if(!statuses.isEmpty()) {
221
			filter.setStatusFilter(new StatusFilter(statuses.toArray(new Status[statuses.size()])));
222
		}
223
224
		List<String> resolutionIds = getIds(params, RESOLUTION_KEY);
225
		List<Resolution> resolutions = new ArrayList<Resolution>();
226
		for (String resolutionId : resolutionIds) {
227
			Resolution resolution = jiraServer.getResolutionById(resolutionId);
228
			if(!Resolution.UNKNOWN_RESOLUTION.equals(resolution)) {
229
				resolutions.add(resolution);
230
			}
231
		}
232
		if(!resolutions.isEmpty()) {
233
			filter.setResolutionFilter(new ResolutionFilter(resolutions.toArray(new Resolution[resolutions.size()])));
234
		}
235
236
		List<String> queries = getIds(params, QUERY_KEY);
237
		for (String query : queries) {
238
			boolean searchSummary = getIds(params, SUMMARY_KEY).contains("true");
239
			boolean searchDescription = getIds(params, DESCRIPTION_KEY).contains("true");
240
			boolean searchEnvironment = getIds(params, ENVIRONMENT_KEY).contains("true");
241
			boolean searchComments = getIds(params, BODY_KEY).contains("true");
242
			filter.setContentFilter(new ContentFilter(query, searchSummary, searchDescription, searchEnvironment, searchComments));
243
		}
244
245
		filter.setReportedByFilter(createUserFilter(params, REPORTER_KEY));
246
		filter.setAssignedToFilter(createUserFilter(params, ASSIGNEE_KEY));
247
248
		filter.setCreatedDateFilter(createDateFilter(params, CREATED_KEY));
249
		filter.setUpdatedDateFilter(createDateFilter(params, UPDATED_KEY));
250
		filter.setDueDateFilter(createDateFilter(params, DUEDATE_KEY));
251
252
		return filter;
253
	}
254
255
	private DateFilter createDateFilter(Map<String, List<String>> params, String key) {
256
		String after = getId(params, key + ":after");
257
		String before = getId(params, key + ":before");
258
259
		SimpleDateFormat df = new SimpleDateFormat("d/MMM/yy");
260
		Date fromDate;
261
		try {
262
			fromDate = df.parse(after);
263
		} catch (Exception ex) {
264
			fromDate = null;
265
		}
266
		Date toDate;
267
		try {
268
			toDate = df.parse(before);
269
		} catch (Exception ex) {
270
			toDate = null;
271
		}
272
273
		return fromDate==null && toDate==null ? null : new DateRangeFilter(fromDate, toDate);
274
	}
275
276
	private UserFilter createUserFilter(Map<String, List<String>> params, String key) {
277
		String type = getId(params, key + "Select");
278
		if(ISSUE_NO_REPORTER.equals(type)) {
279
			return new NobodyFilter();
280
		} else if(ISSUE_CURRENT_USER.equals(type)) {
281
			return new CurrentUserFilter();
282
		} else {
283
			String reporter = getId(params, key);
284
			if(reporter!=null) {
285
				if(ISSUE_SPECIFIC_USER.equals(type)) {
286
					return new SpecificUserFilter(reporter);
287
				} else if(ISSUE_SPECIFIC_GROUP.equals(type)) {
288
					return new UserInGroupFilter(reporter);
289
				}
290
			}
291
		}
292
		return null;
293
	}
294
295
	private String getId(Map<String, List<String>> params, String key) {
296
		List<String> ids = getIds(params, key);
297
		return ids.isEmpty() ? null : ids.get(0);
298
	}
299
300
	private List<String> getIds(Map<String, List<String>> params, String key) {
301
		List<String> ids = params.get(key);
302
		if (ids==null) {
303
			return Collections.emptyList();
304
		}
305
		return ids;
306
	}
307
308
309
	private String getQueryParams(FilterDefinition filter) {
310
		StringBuffer sb = new StringBuffer();
311
312
		ProjectFilter projectFilter = filter.getProjectFilter();
313
		if(projectFilter!=null) {
314
			Project project = projectFilter.getProject();
315
			// TODO all projects
316
			addParameter(sb, PROJECT_KEY, project.getId());
317
		}
318
319
		ComponentFilter componentFilter = filter.getComponentFilter();
320
		// TODO all components
321
		if(componentFilter!=null) {
322
			if(componentFilter.hasNoComponent()) {
323
				addParameter(sb, COMPONENT_KEY, "-1");
324
			} else {
325
				for (Component component : componentFilter.getComponents()) {
326
					addParameter(sb, COMPONENT_KEY, component.getId());
327
				}
328
			}
329
		}
330
331
		// TODO
332
		VersionFilter fixForVersionFilter = filter.getFixForVersionFilter();
333
		if (fixForVersionFilter != null) {
334
			for ( Version fixVersion : fixForVersionFilter.getVersions()) {
335
				addParameter(sb, FIXFOR_KEY, fixVersion.getId());
336
			}
337
		}
338
339
		// TODO
340
		VersionFilter reportedInVersionFilter = filter.getReportedInVersionFilter();
341
		if (reportedInVersionFilter != null) {
342
			for (Version reportedVersion : reportedInVersionFilter.getVersions()) {
343
				addParameter(sb, VERSION_KEY, reportedVersion.getId());
344
			}
345
		}
346
347
		// TODO
348
		IssueTypeFilter issueTypeFilter = filter.getIssueTypeFilter();
349
		if (issueTypeFilter != null) {
350
			for (IssueType issueType : issueTypeFilter.getIsueTypes()) {
351
				addParameter(sb, TYPE_KEY, issueType.getId());
352
			}
353
		}
354
355
		// TODO
356
		StatusFilter statusFilter = filter.getStatusFilter();
357
		if(statusFilter!=null) {
358
			for ( Status status : statusFilter.getStatuses()) {
359
				addParameter(sb, STATUS_KEY, status.getId());
360
			}
361
		}
362
363
		ResolutionFilter resolutionFilter = filter.getResolutionFilter();
364
		if(resolutionFilter!=null) {
365
			for (Resolution resolution : resolutionFilter.getResolutions()) {
366
				addParameter(sb, RESOLUTION_KEY, resolution.getId());
367
			}
368
		}
369
370
		PriorityFilter priorityFilter = filter.getPriorityFilter();
371
		if(priorityFilter!=null) {
372
			for ( Priority priority : priorityFilter.getPriorities()) {
373
				addParameter(sb, PRIORITY_KEY, priority.getId());
374
			}
375
		}
376
377
		ContentFilter contentFilter = filter.getContentFilter();
378
		if(contentFilter!=null) {
379
			String queryString = contentFilter.getQueryString();
380
			if(queryString!=null) {
381
				addParameter(sb, QUERY_KEY, queryString);
382
			}
383
			if(contentFilter.isSearchingSummary()) {
384
				addParameter(sb, SUMMARY_KEY, "true");
385
			}
386
			if(contentFilter.isSearchingDescription()) {
387
				addParameter(sb, DESCRIPTION_KEY, "true");
388
			}
389
			if(contentFilter.isSearchingComments()) {
390
				addParameter(sb, BODY_KEY, "true");
391
			}
392
			if(contentFilter.isSearchingEnvironment()) {
393
				addParameter(sb, ENVIRONMENT_KEY, "true");
394
			}
395
		}
396
397
		addUserFilter(sb, filter.getReportedByFilter(), REPORTER_KEY);
398
		addUserFilter(sb, filter.getAssignedToFilter(), ASSIGNEE_KEY);
399
400
		addDateFilter(sb, filter.getCreatedDateFilter(), CREATED_KEY);
401
		addDateFilter(sb, filter.getUpdatedDateFilter(), UPDATED_KEY);
402
		addDateFilter(sb, filter.getDueDateFilter(), DUEDATE_KEY);
403
404
		return sb.toString();
405
	}
406
407
	private void addDateFilter(StringBuffer sb, DateFilter filter, String type) {
408
		if(filter instanceof DateRangeFilter) {
409
			SimpleDateFormat df = new SimpleDateFormat("d/MMM/yy");
410
			DateRangeFilter rangeFilter = (DateRangeFilter) filter;
411
			addParameter(sb, type + ":after", df.format(rangeFilter.getFromDate()));
412
			addParameter(sb, type + ":before", df.format(rangeFilter.getToDate()));
413
		}
414
	}
415
416
	private void addUserFilter(StringBuffer sb, UserFilter filter, String type) {
417
		if(filter instanceof NobodyFilter) {
418
			addParameter(sb, type + "Select", ISSUE_NO_REPORTER);
419
		} else if(filter instanceof CurrentUserFilter) {
420
			addParameter(sb, type + "Select", ISSUE_CURRENT_USER);
421
		} else if(filter instanceof SpecificUserFilter) {
422
			addParameter(sb, type + "Select", ISSUE_SPECIFIC_USER);
423
			addParameter(sb, type, ((SpecificUserFilter) filter).getUser());
424
		} else if(filter instanceof UserInGroupFilter) {
425
			addParameter(sb, type + "Select", ISSUE_SPECIFIC_GROUP);
426
			addParameter(sb, type, ((UserInGroupFilter) filter).getGroup());
427
		}
428
	}
429
430
	private void addParameter(StringBuffer sb, String name, String value) {
431
		try {
432
			sb.append('&').append(name).append('=').append(URLEncoder.encode(value, encoding));
433
		} catch (UnsupportedEncodingException ex) {
434
			// ignore
435
		}
436
	}
437
44
}
438
}
45
439
46
//public void refreshHits() {
440
//public void refreshHits() {
(-)src/org/eclipse/mylar/internal/jira/JiraTaskExternalizer.java (-44 / +33 lines)
Lines 12-22 Link Here
12
package org.eclipse.mylar.internal.jira;
12
package org.eclipse.mylar.internal.jira;
13
13
14
import java.io.ByteArrayInputStream;
14
import java.io.ByteArrayInputStream;
15
import java.io.ByteArrayOutputStream;
16
import java.io.IOException;
17
import java.io.ObjectInputStream;
15
import java.io.ObjectInputStream;
18
import java.io.ObjectOutputStream;
19
import java.io.StringWriter;
20
16
21
import org.eclipse.mylar.context.core.MylarStatusHandler;
17
import org.eclipse.mylar.context.core.MylarStatusHandler;
22
import org.eclipse.mylar.tasks.core.AbstractQueryHit;
18
import org.eclipse.mylar.tasks.core.AbstractQueryHit;
Lines 28-36 Link Here
28
import org.eclipse.mylar.tasks.core.ITaskListExternalizer;
24
import org.eclipse.mylar.tasks.core.ITaskListExternalizer;
29
import org.eclipse.mylar.tasks.core.TaskExternalizationException;
25
import org.eclipse.mylar.tasks.core.TaskExternalizationException;
30
import org.eclipse.mylar.tasks.core.TaskList;
26
import org.eclipse.mylar.tasks.core.TaskList;
27
import org.eclipse.mylar.tasks.core.TaskRepository;
31
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
28
import org.eclipse.mylar.tasks.ui.TasksUiPlugin;
32
import org.tigris.jira.core.model.NamedFilter;
29
import org.tigris.jira.core.model.NamedFilter;
33
import org.tigris.jira.core.model.filter.FilterDefinition;
30
import org.tigris.jira.core.model.filter.FilterDefinition;
31
import org.tigris.jira.core.service.JiraServer;
34
import org.w3c.dom.Document;
32
import org.w3c.dom.Document;
35
import org.w3c.dom.Element;
33
import org.w3c.dom.Element;
36
import org.w3c.dom.Node;
34
import org.w3c.dom.Node;
Lines 60-69 Link Here
60
58
61
	private static final String KEY_FILTER_ID = "FilterID";
59
	private static final String KEY_FILTER_ID = "FilterID";
62
60
63
	private static final String KEY_FILTER_DESCRIPTION = "FilterDesc";
61
//	private static final String KEY_FILTER_DESCRIPTION = "FilterDesc";
64
62
65
	private static final String KEY_FILTER_CUSTOM = "FilterCustom";
63
	private static final String KEY_FILTER_CUSTOM = "FilterCustom";
66
64
65
	private static final String KEY_FILTER_CUSTOM_URL = "FilterCustomUrl";
66
67
	private static final String KEY_KEY = "Key";
67
	private static final String KEY_KEY = "Key";
68
68
69
	public boolean canReadQuery(Node node) {
69
	public boolean canReadQuery(Node node) {
Lines 81-87 Link Here
81
		node.setAttribute(KEY_KEY, ((JiraQueryHit) queryHit).getKey());
81
		node.setAttribute(KEY_KEY, ((JiraQueryHit) queryHit).getKey());
82
		return node;
82
		return node;
83
	}
83
	}
84
		
84
85
	public boolean canCreateElementFor(AbstractRepositoryQuery category) {
85
	public boolean canCreateElementFor(AbstractRepositoryQuery category) {
86
		return category instanceof JiraRepositoryQuery || category instanceof JiraCustomQuery;
86
		return category instanceof JiraRepositoryQuery || category instanceof JiraCustomQuery;
87
	}
87
	}
Lines 94-120 Link Here
94
		boolean hasCaughtException = false;
94
		boolean hasCaughtException = false;
95
		Element element = (Element) node;
95
		Element element = (Element) node;
96
96
97
		AbstractRepositoryQuery query;
97
		String repositoryUrl = element.getAttribute(KEY_REPOSITORY_URL);
98
		String custom = element.getAttribute(KEY_FILTER_CUSTOM);
98
		String custom = element.getAttribute(KEY_FILTER_CUSTOM);
99
		String customUrl = element.getAttribute(KEY_FILTER_CUSTOM_URL);
100
		AbstractRepositoryQuery query;
99
		if (custom != null && custom.length() > 0) {
101
		if (custom != null && custom.length() > 0) {
102
			// TODO remove this at some point
100
			FilterDefinition filter = decodeFilter(custom);
103
			FilterDefinition filter = decodeFilter(custom);
101
			if (filter == null) {
104
			if (filter == null) {
102
				throw new TaskExternalizationException("Failed to restore custom query "
105
				throw new TaskExternalizationException("Failed to restore custom query "
103
						+ element.getAttribute(KEY_FILTER_ID));
106
						+ element.getAttribute(KEY_FILTER_ID));
104
			}
107
			}
105
			filter.setName(element.getAttribute(KEY_FILTER_ID));
108
			filter.setName(element.getAttribute(KEY_FILTER_ID));
106
			filter.setDescription(element.getAttribute(KEY_FILTER_DESCRIPTION));
109
			// filter.setDescription(element.getAttribute(KEY_FILTER_DESCRIPTION));
110
111
			query = new JiraCustomQuery(repositoryUrl, filter,
112
					TasksUiPlugin.getTaskListManager().getTaskList(),
113
					TasksUiPlugin.getRepositoryManager().getRepository(MylarJiraPlugin.REPOSITORY_KIND, repositoryUrl));
114
		} else if (customUrl != null && customUrl.length() > 0) {
115
			TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(MylarJiraPlugin.REPOSITORY_KIND, repositoryUrl);
116
			JiraServer jiraServer = JiraServerFacade.getDefault().getJiraServer(repository);
117
			query = new JiraCustomQuery(element.getAttribute(KEY_FILTER_ID),
118
					customUrl, repositoryUrl, jiraServer, TasksUiPlugin.getTaskListManager().getTaskList(), repository);
107
119
108
			query = new JiraCustomQuery(element.getAttribute(KEY_REPOSITORY_URL), filter, TasksUiPlugin
109
					.getTaskListManager().getTaskList());
110
		} else {
120
		} else {
111
			NamedFilter namedFilter = new NamedFilter();
121
			NamedFilter namedFilter = new NamedFilter();
112
			namedFilter.setId(element.getAttribute(KEY_FILTER_ID));
122
			namedFilter.setId(element.getAttribute(KEY_FILTER_ID));
113
			namedFilter.setName(element.getAttribute(KEY_FILTER_NAME));
123
			namedFilter.setName(element.getAttribute(KEY_FILTER_NAME));
114
			namedFilter.setDescription(element.getAttribute(KEY_FILTER_DESCRIPTION));
124
			// namedFilter.setDescription(element.getAttribute(KEY_FILTER_DESCRIPTION));
115
125
116
			query = new JiraRepositoryQuery(element.getAttribute(KEY_REPOSITORY_URL), namedFilter, TasksUiPlugin
126
			query = new JiraRepositoryQuery(repositoryUrl, namedFilter,
117
					.getTaskListManager().getTaskList());
127
					TasksUiPlugin.getTaskListManager().getTaskList());
118
		}
128
		}
119
129
120
		NodeList list = node.getChildNodes();
130
		NodeList list = node.getChildNodes();
Lines 145-159 Link Here
145
			NamedFilter filter = ((JiraRepositoryQuery) query).getNamedFilter();
155
			NamedFilter filter = ((JiraRepositoryQuery) query).getNamedFilter();
146
			node.setAttribute(KEY_FILTER_ID, filter.getId());
156
			node.setAttribute(KEY_FILTER_ID, filter.getId());
147
			node.setAttribute(KEY_FILTER_NAME, filter.getName());
157
			node.setAttribute(KEY_FILTER_NAME, filter.getName());
148
			node.setAttribute(KEY_FILTER_DESCRIPTION, filter.getDescription());
158
			// node.setAttribute(KEY_FILTER_DESCRIPTION, filter.getDescription());
149
		} else {
159
		} else if(query instanceof JiraCustomQuery) {
150
			FilterDefinition filter = ((JiraCustomQuery) query).getFilterDefinition();
160
			JiraCustomQuery customQuery = (JiraCustomQuery) query;
161
			FilterDefinition filter = customQuery.getFilterDefinition();
151
			node.setAttribute(KEY_FILTER_ID, filter.getName());
162
			node.setAttribute(KEY_FILTER_ID, filter.getName());
152
			node.setAttribute(KEY_FILTER_NAME, filter.getName());
163
			node.setAttribute(KEY_FILTER_NAME, filter.getName());
153
			node.setAttribute(KEY_FILTER_DESCRIPTION, filter.getDescription());
164
			// node.setAttribute(KEY_FILTER_DESCRIPTION, filter.getDescription());
154
165
			node.setAttribute(KEY_FILTER_CUSTOM_URL, customQuery.getUrl());
155
			// XXX implement actual export
156
			node.setAttribute(KEY_FILTER_CUSTOM, encodeFilter(filter));
157
		}
166
		}
158
167
159
		for (AbstractQueryHit hit : query.getHits()) {
168
		for (AbstractQueryHit hit : query.getHits()) {
Lines 162-168 Link Here
162
				for (ITaskListExternalizer externalizer : super.getDelegateExternalizers()) {
171
				for (ITaskListExternalizer externalizer : super.getDelegateExternalizers()) {
163
					if (externalizer.canCreateElementFor(hit)) {
172
					if (externalizer.canCreateElementFor(hit)) {
164
						element = externalizer.createQueryHitElement(hit, doc, node);
173
						element = externalizer.createQueryHitElement(hit, doc, node);
165
					}
174
				    }
166
				}
175
				}
167
				if (element == null) {
176
				if (element == null) {
168
					createQueryHitElement(hit, doc, node);
177
					createQueryHitElement(hit, doc, node);
Lines 176-201 Link Here
176
		return node;
185
		return node;
177
	}
186
	}
178
187
179
	private String encodeFilter(FilterDefinition filter) {
180
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
181
		ObjectOutputStream oos;
182
		try {
183
			oos = new ObjectOutputStream(bos);
184
			oos.writeObject(filter);
185
			oos.flush();
186
		} catch (IOException ex) {
187
			return null;
188
		}
189
190
		StringWriter sw = new StringWriter();
191
		byte[] bytes = bos.toByteArray();
192
		for (int i = 0; i < bytes.length; i++) {
193
			byte b = bytes[i];
194
			sw.append((char) ('A' + (b >> 4))).append((char) ('A' + (b & 0xf)));
195
		}
196
		return sw.toString();
197
	}
198
199
	private FilterDefinition decodeFilter(String filter) {
188
	private FilterDefinition decodeFilter(String filter) {
200
		byte[] buff = new byte[filter.length() / 2];
189
		byte[] buff = new byte[filter.length() / 2];
201
		char[] chars = filter.toCharArray();
190
		char[] chars = filter.toCharArray();
Lines 222-228 Link Here
222
		Element node = super.createTaskElement(task, doc, parent);
211
		Element node = super.createTaskElement(task, doc, parent);
223
		node.setAttribute(KEY_KEY, ((JiraTask) task).getKey());
212
		node.setAttribute(KEY_KEY, ((JiraTask) task).getKey());
224
		return node;
213
		return node;
225
	} 
214
	}
226
215
227
	@Override
216
	@Override
228
	public ITask readTask(Node node, TaskList taskList, AbstractTaskContainer category, ITask parent)
217
	public ITask readTask(Node node, TaskList taskList, AbstractTaskContainer category, ITask parent)
Lines 275-286 Link Here
275
			key = element.getAttribute(KEY_KEY);
264
			key = element.getAttribute(KEY_KEY);
276
		}
265
		}
277
266
278
		String issueId = AbstractRepositoryTask.getTaskId(handle);
267
			String issueId = AbstractRepositoryTask.getTaskId(handle);
279
268
280
		// TODO: implement completion
269
		// TODO: implement completion
281
		JiraQueryHit hit = new JiraQueryHit(taskList, "<description>", query.getRepositoryUrl(), issueId, key, false);
270
		JiraQueryHit hit = new JiraQueryHit(taskList, "<description>", query.getRepositoryUrl(), issueId, key, false);
282
		readQueryHitInfo(hit, taskList, query, element);
271
		readQueryHitInfo(hit, taskList, query, element);
283
	}
272
		}
284
273
285
	public String getQueryTagNameForElement(AbstractRepositoryQuery query) {
274
	public String getQueryTagNameForElement(AbstractRepositoryQuery query) {
286
		if (query instanceof JiraRepositoryQuery) {
275
		if (query instanceof JiraRepositoryQuery) {
(-)src/org/eclipse/mylar/internal/jira/MylarJiraPlugin.java (-1 / +1 lines)
Lines 34-40 Link Here
34
	public final static String ISSUE_URL_PREFIX = "/browse/";
34
	public final static String ISSUE_URL_PREFIX = "/browse/";
35
35
36
	/** Repository address + Filter Prefix + Issue key = the filter's web address */
36
	/** Repository address + Filter Prefix + Issue key = the filter's web address */
37
	public final static String FILTER_URL_PREFIX = "/secure/IssueNavigator.jspa?mode=hide&requestId=";
37
	public final static String FILTER_URL_PREFIX = "/secure/IssueNavigator.jspa?mode=hide";
38
38
39
	public MylarJiraPlugin() {
39
	public MylarJiraPlugin() {
40
		INSTANCE = this;
40
		INSTANCE = this;
(-)src/org/eclipse/mylar/internal/jira/ui/wizards/JiraQueryPage.java (-11 / +14 lines)
Lines 30-35 Link Here
30
import org.eclipse.jface.viewers.Viewer;
30
import org.eclipse.jface.viewers.Viewer;
31
import org.eclipse.mylar.internal.jira.JiraCustomQuery;
31
import org.eclipse.mylar.internal.jira.JiraCustomQuery;
32
import org.eclipse.mylar.internal.jira.JiraServerFacade;
32
import org.eclipse.mylar.internal.jira.JiraServerFacade;
33
import org.eclipse.mylar.internal.jira.MylarJiraPlugin;
33
import org.eclipse.mylar.internal.tasks.ui.search.AbstractRepositoryQueryPage;
34
import org.eclipse.mylar.internal.tasks.ui.search.AbstractRepositoryQueryPage;
34
import org.eclipse.mylar.internal.tasks.ui.views.DatePicker;
35
import org.eclipse.mylar.internal.tasks.ui.views.DatePicker;
35
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
36
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
Lines 138-144 Link Here
138
139
139
	private final JiraServer server;
140
	private final JiraServer server;
140
141
141
//	private Text name;
142
	private Text name;
142
143
143
	private ListViewer project;
144
	private ListViewer project;
144
145
Lines 199-205 Link Here
199
		this.workingCopy = workingCopy;
200
		this.workingCopy = workingCopy;
200
		this.isNew = isNew;
201
		this.isNew = isNew;
201
		this.namedQuery = namedQuery;
202
		this.namedQuery = namedQuery;
202
		
203
203
		setDescription("Add search filters to define query.");
204
		setDescription("Add search filters to define query.");
204
		setPageComplete(false);
205
		setPageComplete(false);
205
	}
206
	}
Lines 213-227 Link Here
213
			final GridData gridData = new GridData();
214
			final GridData gridData = new GridData();
214
			lblName.setLayoutData(gridData);
215
			lblName.setLayoutData(gridData);
215
			lblName.setText("Name:");
216
			lblName.setText("Name:");
216
	
217
217
			title = new Text(c, SWT.BORDER);
218
			title = new Text(c, SWT.BORDER);
218
			title.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1));
219
			title.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1));
219
			title.addModifyListener(new ModifyListener() {
220
			title.addModifyListener(new ModifyListener() {
220
	
221
221
				public void modifyText(ModifyEvent e) {
222
				public void modifyText(ModifyEvent e) {
222
					validatePage();
223
					validatePage();
223
				}
224
				}
224
	
225
225
			});
226
			});
226
		}
227
		}
227
228
Lines 865-871 Link Here
865
866
866
	}
867
	}
867
868
868
	
869
869
//	public boolean isPageComplete() {
870
//	public boolean isPageComplete() {
870
//		if (namedQuery && name != null && name.getText().length() == 0) {
871
//		if (namedQuery && name != null && name.getText().length() == 0) {
871
//			return false;
872
//			return false;
Lines 873-885 Link Here
873
//			return true;
874
//			return true;
874
//		}
875
//		}
875
//	}
876
//	}
876
	
877
877
	void validatePage() {
878
	void validatePage() {
878
		if (namedQuery && super.isPageComplete()) {
879
		if (namedQuery && super.isPageComplete()) {
879
			setErrorMessage("Name is mandatory"); 
880
			setErrorMessage("Name is mandatory");
880
			setPageComplete(false);
881
			setPageComplete(false);
881
			return;
882
			return;
882
		} else { 
883
		} else {
883
			setPageComplete(true);
884
			setPageComplete(true);
884
			setErrorMessage(null);
885
			setErrorMessage(null);
885
		}
886
		}
Lines 1417-1423 Link Here
1417
1418
1418
		/*
1419
		/*
1419
		 * (non-Javadoc)
1420
		 * (non-Javadoc)
1420
		 * 
1421
		 *
1421
		 * @see java.lang.Object#equals(java.lang.Object)
1422
		 * @see java.lang.Object#equals(java.lang.Object)
1422
		 */
1423
		 */
1423
		public boolean equals(Object obj) {
1424
		public boolean equals(Object obj) {
Lines 1441-1446 Link Here
1441
			server.addLocalFilter(workingCopy);
1442
			server.addLocalFilter(workingCopy);
1442
		}
1443
		}
1443
1444
1444
		return new JiraCustomQuery(repository.getUrl(), workingCopy, TasksUiPlugin.getTaskListManager().getTaskList());
1445
		String url = repository.getUrl();
1446
		return new JiraCustomQuery(url, workingCopy, TasksUiPlugin.getTaskListManager().getTaskList(),
1447
				TasksUiPlugin.getRepositoryManager().getRepository(MylarJiraPlugin.REPOSITORY_KIND, url));
1445
	}
1448
	}
1446
}
1449
}
(-)src/org/eclipse/mylar/internal/jira/JiraCustomQueryTest.java (+221 lines)
Added Link Here
1
package org.eclipse.mylar.internal.jira;
2
3
import java.lang.reflect.InvocationHandler;
4
import java.lang.reflect.Method;
5
import java.lang.reflect.Proxy;
6
import java.util.Date;
7
8
import org.eclipse.mylar.tasks.core.TaskList;
9
import org.eclipse.mylar.tasks.core.TaskRepository;
10
import org.tigris.jira.core.model.Component;
11
import org.tigris.jira.core.model.IssueType;
12
import org.tigris.jira.core.model.Project;
13
import org.tigris.jira.core.model.Resolution;
14
import org.tigris.jira.core.model.Status;
15
import org.tigris.jira.core.model.Version;
16
import org.tigris.jira.core.model.filter.ComponentFilter;
17
import org.tigris.jira.core.model.filter.ContentFilter;
18
import org.tigris.jira.core.model.filter.DateFilter;
19
import org.tigris.jira.core.model.filter.DateRangeFilter;
20
import org.tigris.jira.core.model.filter.FilterDefinition;
21
import org.tigris.jira.core.model.filter.IssueTypeFilter;
22
import org.tigris.jira.core.model.filter.ProjectFilter;
23
import org.tigris.jira.core.model.filter.ResolutionFilter;
24
import org.tigris.jira.core.model.filter.SpecificUserFilter;
25
import org.tigris.jira.core.model.filter.StatusFilter;
26
import org.tigris.jira.core.model.filter.UserFilter;
27
import org.tigris.jira.core.model.filter.VersionFilter;
28
import org.tigris.jira.core.service.JiraServer;
29
30
import junit.framework.TestCase;
31
32
33
public class JiraCustomQueryTest extends TestCase {
34
35
	private Project project;
36
37
	protected void setUp() throws Exception {
38
		super.setUp();
39
40
		Component[] comps = new Component[3];
41
		comps[0] = new Component();
42
		comps[0].setId("comp0");
43
		comps[1] = new Component();
44
		comps[1].setId("comp1");
45
		comps[2] = new Component();
46
		comps[2].setId("comp2");
47
48
		Version[] vers = new Version[3];
49
		vers[0] = new Version();
50
		vers[0].setId("ver0");
51
		vers[1] = new Version();
52
		vers[1].setId("ver1");
53
		vers[2] = new Version();
54
		vers[2].setId("ver2");
55
56
		project = new Project();
57
		project.setId("000");
58
		project.setComponents(comps);
59
		project.setVersions(vers);
60
	}
61
62
	public void testJiraCustomQuery() {
63
		String repositoryUrl = "http://host.net/";
64
65
		Component[] components = new Component[2];
66
		components[0] = new Component();
67
		components[0].setId("comp0");
68
		components[1] = new Component();
69
		components[1].setId("comp1");
70
71
		Version[] fixVersions = new Version[2];
72
		fixVersions[0] = new Version();
73
		fixVersions[0].setId("ver0");
74
		fixVersions[1] = new Version();
75
		fixVersions[1].setId("ver1");
76
77
		Version[] repoVersions = new Version[2];
78
		repoVersions[0] = new Version();
79
		repoVersions[0].setId("ver1");
80
		repoVersions[1] = new Version();
81
		repoVersions[1].setId("ver2");
82
83
		IssueType[] issueTypes = new IssueType[2];
84
		issueTypes[0] = new IssueType();
85
		issueTypes[0].setId("issue0");
86
		issueTypes[1] = new IssueType();
87
		issueTypes[1].setId("issue1");
88
89
		Status[] statuses = new Status[2];
90
		statuses[0] = new Status();
91
		statuses[0].setId("status0");
92
		statuses[1] = new Status();
93
		statuses[1].setId("status1");
94
95
		Resolution[] resolutions = new Resolution[2];
96
		resolutions[0] = new Resolution();
97
		resolutions[0].setId("resolution0");
98
		resolutions[1] = new Resolution();
99
		resolutions[1].setId("resolution1");
100
101
		FilterDefinition filter = new FilterDefinition();
102
		filter.setName("filter");
103
	    filter.setProjectFilter(new ProjectFilter(project));
104
		filter.setComponentFilter(new ComponentFilter(components));
105
		filter.setFixForVersionFilter(new VersionFilter(fixVersions));
106
		filter.setReportedInVersionFilter(new VersionFilter(repoVersions));
107
		filter.setIssueTypeFilter(new IssueTypeFilter(issueTypes));
108
		filter.setStatusFilter(new StatusFilter(statuses));
109
		filter.setResolutionFilter(new ResolutionFilter(resolutions));
110
111
		filter.setContentFilter(new ContentFilter("query", true, true, true, true));
112
113
		filter.setReportedByFilter(new SpecificUserFilter("reporter"));
114
		filter.setAssignedToFilter(new SpecificUserFilter("assignee"));
115
116
		filter.setCreatedDateFilter(new DateRangeFilter(new Date(10), new Date(12)));
117
		filter.setUpdatedDateFilter(new DateRangeFilter(new Date(20), new Date(22)));
118
		filter.setDueDateFilter(new DateRangeFilter(new Date(30), new Date(32)));
119
120
		TaskList taskList = new TaskList();
121
122
		TaskRepository taskRepository = new TaskRepository(MylarJiraPlugin.REPOSITORY_KIND, repositoryUrl);
123
		taskRepository.setCharacterEncoding("ASCII");
124
125
		JiraCustomQuery customQuery = new JiraCustomQuery(repositoryUrl, filter, taskList, taskRepository);
126
127
		String queryUrl = customQuery.getUrl();
128
129
		JiraServer jiraServer = (JiraServer) Proxy.newProxyInstance(getClass().getClassLoader(),
130
				new Class[] {JiraServer.class},
131
				new InvocationHandler() {
132
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
133
						String name = method.getName();
134
						if("getProjectById".equals(name)) {
135
							return project;
136
						} else if("getIssueTypeById".equals(name)) {
137
							IssueType issueType = new IssueType();
138
							issueType.setId((String) args[0]);
139
							return issueType;
140
						} else if("getStatusById".equals(name)) {
141
							Status status = new Status();
142
							status.setId((String) args[0]);
143
							return status;
144
						} else if("getResolutionById".equals(name)) {
145
							Resolution resolution = new Resolution();
146
							resolution.setId((String) args[0]);
147
							return resolution;
148
						}
149
						return null;
150
					}
151
				});
152
153
		JiraCustomQuery customQuery2 = new JiraCustomQuery("test", queryUrl, repositoryUrl, jiraServer, taskList, taskRepository);
154
155
		FilterDefinition filter2 = customQuery2.getFilterDefinition();
156
157
		ProjectFilter projectFilter2 = filter2.getProjectFilter();
158
		assertEquals(project.getId(), projectFilter2.getProject().getId());
159
160
		Component[] components2 = filter2.getComponentFilter().getComponents();
161
		assertEquals(2, components2.length);
162
		assertEquals(components[0].getId(), components2[0].getId());
163
		assertEquals(components[1].getId(), components2[1].getId());
164
165
		Version[] repoVersions2 = filter2.getReportedInVersionFilter().getVersions();
166
		assertEquals(2, repoVersions2.length);
167
		assertEquals(repoVersions[0].getId(), repoVersions2[0].getId());
168
		assertEquals(repoVersions[1].getId(), repoVersions2[1].getId());
169
170
		Version[] fixVersions2 = filter2.getFixForVersionFilter().getVersions();
171
		assertEquals(2, fixVersions2.length);
172
		assertEquals(fixVersions[0].getId(), fixVersions2[0].getId());
173
		assertEquals(fixVersions[1].getId(), fixVersions2[1].getId());
174
175
		IssueType[] issueTypes2 = filter2.getIssueTypeFilter().getIsueTypes();
176
		assertEquals(2, issueTypes2.length);
177
		assertEquals(issueTypes[0].getId(), issueTypes2[0].getId());
178
		assertEquals(issueTypes[1].getId(), issueTypes2[1].getId());
179
180
		Status[] statuses2 = filter2.getStatusFilter().getStatuses();
181
		assertEquals(2, statuses2.length);
182
		assertEquals(statuses[0].getId(), statuses2[0].getId());
183
		assertEquals(statuses[1].getId(), statuses2[1].getId());
184
185
		Resolution[] resolutions2 = filter2.getResolutionFilter().getResolutions();
186
		assertEquals(2, resolutions2.length);
187
		assertEquals(resolutions[0].getId(), resolutions2[0].getId());
188
		assertEquals(resolutions[1].getId(), resolutions2[1].getId());
189
190
		ContentFilter contentFilter2 = filter2.getContentFilter();
191
		assertEquals("query", contentFilter2.getQueryString());
192
		assertEquals(true, contentFilter2.isSearchingComments());
193
		assertEquals(true, contentFilter2.isSearchingDescription());
194
		assertEquals(true, contentFilter2.isSearchingEnvironment());
195
		assertEquals(true, contentFilter2.isSearchingSummary());
196
197
		UserFilter reportedByFilter2 = filter2.getReportedByFilter();
198
		assertTrue(reportedByFilter2 instanceof SpecificUserFilter);
199
		assertEquals("reporter", ((SpecificUserFilter) reportedByFilter2).getUser());
200
201
		UserFilter assigneeFilter2 = filter2.getAssignedToFilter();
202
		assertTrue(assigneeFilter2 instanceof SpecificUserFilter);
203
		assertEquals("assignee", ((SpecificUserFilter) assigneeFilter2).getUser());
204
205
		DateFilter createdDateFilter2 = filter.getCreatedDateFilter();
206
		assertTrue(createdDateFilter2 instanceof DateRangeFilter);
207
		assertEquals(10, ((DateRangeFilter) createdDateFilter2).getFromDate().getTime());
208
		assertEquals(12, ((DateRangeFilter) createdDateFilter2).getToDate().getTime());
209
210
		DateFilter updatedDateFilter2 = filter.getUpdatedDateFilter();
211
		assertTrue(updatedDateFilter2 instanceof DateRangeFilter);
212
		assertEquals(20, ((DateRangeFilter) updatedDateFilter2).getFromDate().getTime());
213
		assertEquals(22, ((DateRangeFilter) updatedDateFilter2).getToDate().getTime());
214
215
		DateFilter dueDateFilter2 = filter.getDueDateFilter();
216
		assertTrue(dueDateFilter2 instanceof DateRangeFilter);
217
		assertEquals(30, ((DateRangeFilter) dueDateFilter2).getFromDate().getTime());
218
		assertEquals(32, ((DateRangeFilter) dueDateFilter2).getToDate().getTime());
219
	}
220
221
}

Return to bug 139312