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

Collapse All | Expand All

(-)src/org/eclipse/mylar/internal/sandbox/web/WebQuery.java (-1 lines)
Lines 25-31 Link Here
25
			TaskList taskList, String repositoryUrl) {
25
			TaskList taskList, String repositoryUrl) {
26
		super(description, taskList);
26
		super(description, taskList);
27
		this.taskPrefix = taskPrefix;
27
		this.taskPrefix = taskPrefix;
28
29
		this.regexp = regexp;
28
		this.regexp = regexp;
30
		
29
		
31
		setQueryUrl(queryUrl);
30
		setQueryUrl(queryUrl);
(-)src/org/eclipse/mylar/internal/sandbox/web/WebQueryWizardPage.java (-3 / +58 lines)
Lines 11-16 Link Here
11
import java.util.regex.Matcher;
11
import java.util.regex.Matcher;
12
import java.util.regex.Pattern;
12
import java.util.regex.Pattern;
13
13
14
import org.eclipse.jface.bindings.keys.KeyStroke;
15
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
16
import org.eclipse.jface.fieldassist.IContentProposal;
17
import org.eclipse.jface.fieldassist.IContentProposalProvider;
18
import org.eclipse.jface.fieldassist.TextContentAdapter;
14
import org.eclipse.jface.wizard.WizardPage;
19
import org.eclipse.jface.wizard.WizardPage;
15
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
20
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
16
import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
21
import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
Lines 67-74 Link Here
67
		this.query = query;
72
		this.query = query;
68
73
69
		setTitle("Create web query");
74
		setTitle("Create web query");
70
		setDescription("http://subclipse.tigris.org/issues/buglist.cgi?issue_status=NEW;issue_status=STARTED;issue_status=REOPENED&order=issues.issue_id\n" +
75
		setDescription("Specify URL for web page that show query results and regexp to extract id and description " +
71
			"<a href=\"show_bug.cgi\\?id\\=(.+?)\">.+?<span class=\"summary\">(.+?)</span>");
76
				repository.getUrl());
72
	}
77
	}
73
78
74
	public void createControl(Composite parent) {
79
	public void createControl(Composite parent) {
Lines 102-107 Link Here
102
		preview.setText("Preview");
107
		preview.setText("Preview");
103
		preview.addSelectionListener(new SelectionAdapter() {
108
		preview.addSelectionListener(new SelectionAdapter() {
104
			public void widgetSelected(final SelectionEvent e) {
109
			public void widgetSelected(final SelectionEvent e) {
110
				webPage = null;
105
				updatePreview();
111
				updatePreview();
106
			}
112
			}
107
		});
113
		});
Lines 118-124 Link Here
118
		regexpLabel.setText("Regexp:");
124
		regexpLabel.setText("Regexp:");
119
		regexpLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, true));
125
		regexpLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, true));
120
126
121
		regexpText = new Text(composite, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER);
127
		regexpText = new Text(composite, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP);
122
		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
128
		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
123
		gridData.heightHint = 39;
129
		gridData.heightHint = 39;
124
		regexpText.setLayoutData(gridData);
130
		regexpText.setLayoutData(gridData);
Lines 129-134 Link Here
129
				}
135
				}
130
			}
136
			}
131
		});
137
		});
138
		
139
		
140
		ContentProposalAdapter adapter = new ContentProposalAdapter(regexpText, new TextContentAdapter(),
141
				new RegExpProposalProvider(), KeyStroke.getInstance(SWT.CTRL, ' '), null);
132
142
133
		previewTable = new Table(sashForm, SWT.BORDER);
143
		previewTable = new Table(sashForm, SWT.BORDER);
134
		previewTable.setLinesVisible(true);
144
		previewTable.setLinesVisible(true);
Lines 206-210 Link Here
206
		}
216
		}
207
		return webPage;
217
		return webPage;
208
	}
218
	}
219
220
221
	/**
222
	 * Simple proposal provider for regexps  
223
	 */
224
	private static final class RegExpProposalProvider implements IContentProposalProvider {
225
		private static final String[] LABELS = {
226
				"IssueZilla",
227
				"GForge",
228
				"Trac",
229
				"Jira",
230
				"vBulletin"
231
			};
232
		private static final String[] PROPOSALS = {
233
				"<a href=\"show_bug.cgi\\?id\\=(.+?)\">.+?<span class=\"summary\">(.+?)</span>",
234
				"<a class=\"tracker\" href=\"/tracker/index.php\\?func=detail&aid=(.+?)&group_id=GROUP&atid=ATID\">(.+?)</a></td>",
235
				"<td class=\"summary\"><a title=\"View ticket\" href=\"/project/ticket/(.+?)\">(.+?)</a></td>",
236
				"<td class=\"nav summary\">\\s+?<a href=\"/browse/(.+?)\".+?>(.+?)</a>",
237
				"<a href=\"showthread.php\\?.+?t=(\\d+?)\" id=\"thread_title_\\1\">(.+?)</a>"
238
			};
239
240
		public IContentProposal[] getProposals(String contents, int position) {
241
			IContentProposal[] res = new IContentProposal[LABELS.length]; 
242
			for (int i = 0; i < LABELS.length; i++) {
243
				final String label = LABELS[i];
244
				final String content = PROPOSALS[i];
245
				res[i] = new IContentProposal() {
246
						public String getContent() {
247
							return content;
248
						}
249
						public int getCursorPosition() {
250
							return content.length();
251
						}
252
						public String getDescription() {
253
							return content;
254
						}
255
						public String getLabel() {
256
							return label;
257
						}
258
					};
259
			}
260
			return res;
261
		}
262
	}
209
	
263
	
210
}
264
}
265
(-)src/org/eclipse/mylar/internal/sandbox/web/WebRepositoryConnector.java (-9 / +30 lines)
Lines 31-36 Link Here
31
import org.eclipse.jface.wizard.IWizard;
31
import org.eclipse.jface.wizard.IWizard;
32
import org.eclipse.jface.wizard.WizardDialog;
32
import org.eclipse.jface.wizard.WizardDialog;
33
import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
33
import org.eclipse.mylar.internal.core.util.MylarStatusHandler;
34
import org.eclipse.mylar.internal.tasklist.RetrieveTitleFromUrlJob;
34
import org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractAddExistingTaskWizard;
35
import org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractAddExistingTaskWizard;
35
import org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractRepositorySettingsPage;
36
import org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractRepositorySettingsPage;
36
import org.eclipse.mylar.internal.tasklist.ui.wizards.ExistingTaskWizardPage;
37
import org.eclipse.mylar.internal.tasklist.ui.wizards.ExistingTaskWizardPage;
Lines 88-102 Link Here
88
	
89
	
89
	// Support
90
	// Support
90
	
91
	
91
	public ITask createTaskFromExistingKey(TaskRepository repository, String id) {
92
	public ITask createTaskFromExistingKey(TaskRepository repository, final String id) {
92
		if(REPOSITORY_TYPE.equals(repository.getKind())) {
93
		if(REPOSITORY_TYPE.equals(repository.getKind())) {
93
			String taskUrl = repository.getProperty(PROPERTY_TASK_PREFIX_URL) + id;
94
			String taskPrefix = repository.getProperty(PROPERTY_TASK_PREFIX_URL);
94
			String label = "#"+id;
95
			
95
			// TODO fetch the task description?
96
			final WebTask task = new WebTask(id, id, taskPrefix, repository.getUrl());
97
98
			RetrieveTitleFromUrlJob job = new RetrieveTitleFromUrlJob(taskPrefix+id) {
99
					protected void setTitle(String pageTitle) {
100
						task.setDescription(id+": "+pageTitle);
101
						MylarTaskListPlugin.getTaskListManager().getTaskList().notifyLocalInfoChanged(task);
102
					}
103
				};
104
			job.schedule();
96
			
105
			
97
			String handle = AbstractRepositoryTask.getHandle(repository.getUrl(), id);
98
			WebTask task = new WebTask(handle, label, id);
99
			task.setUrl(taskUrl);
100
			return task;
106
			return task;
101
		}
107
		}
102
		
108
		
Lines 150-156 Link Here
150
			    	do {
156
			    	do {
151
			    		String id = matcher.group(1);
157
			    		String id = matcher.group(1);
152
			    		String description = matcher.group(2);
158
			    		String description = matcher.group(2);
153
			    		hits.add(new WebQueryHit(id, description, query.getRepositoryUrl()));
159
			    		hits.add(new WebQueryHit(id, id+": "+description, ((WebQuery) query).getTaskPrefix(), query.getRepositoryUrl()));
154
			    	} while(matcher.find());
160
			    	} while(matcher.find());
155
			    	queryStatus.add(Status.OK_STATUS);
161
			    	queryStatus.add(Status.OK_STATUS);
156
			    }
162
			    }
Lines 255-261 Link Here
255
261
256
		    StringBuffer resource = new StringBuffer();
262
		    StringBuffer resource = new StringBuffer();
257
		    String line;
263
		    String line;
258
		    while((line = r.readLine())!=null) {
264
		    while(true) {
265
		    	int retryCount = 0;
266
		    	do {
267
		    		if(retryCount>0) {
268
		    			try {
269
							Thread.sleep(1000L);
270
						} catch (InterruptedException ex) {
271
							// ignore
272
						}
273
		    		}
274
		    		line = r.readLine();
275
		    		retryCount++;
276
		    	} while(line==null && retryCount<5);
277
		    	if(line==null) {
278
		    		break;
279
		    	}
259
		    	resource.append(line).append("\n");
280
		    	resource.append(line).append("\n");
260
		    }
281
		    }
261
		    return resource;
282
		    return resource;
(-)src/org/eclipse/mylar/internal/sandbox/web/WebTask.java (-8 / +22 lines)
Lines 21-37 Link Here
21
 */
21
 */
22
public class WebTask extends AbstractRepositoryTask {
22
public class WebTask extends AbstractRepositoryTask {
23
23
24
	private String id;
24
	private final String id;
25
	private final String taskPrefix;
26
	private final String repositoryUrl;
25
	
27
	
26
	public WebTask(String handle, String label, String id) {
28
	public WebTask(String id, String label, String taskPrefix, String repositoryUrl) {
27
		super(handle, label, false);
29
		super(taskPrefix + id, label, false);
28
		this.id = id;
30
		this.id = id;
31
		this.taskPrefix = taskPrefix;
32
		this.repositoryUrl = repositoryUrl;
33
		setUrl(taskPrefix + id);
29
	}
34
	}
30
35
31
	public String getId() {
32
		return this.id;
33
	}
34
	
35
	public String getRepositoryKind() {
36
	public String getRepositoryKind() {
36
		return WebRepositoryConnector.REPOSITORY_TYPE;
37
		return WebRepositoryConnector.REPOSITORY_TYPE;
37
	}
38
	}
Lines 43-48 Link Here
43
	public boolean isPersistentInWorkspace() {
44
	public boolean isPersistentInWorkspace() {
44
		return false;
45
		return false;
45
	}
46
	}
46
47
	
48
	public String getTaskPrefix() {
49
		return this.taskPrefix;
50
	}
51
	
52
	public String getId() {
53
		return this.id;
54
	}
55
	
56
	@Override
57
	public String getRepositoryUrl() {
58
		return repositoryUrl;
59
	}
60
	
47
}
61
}
48
62
(-)src/org/eclipse/mylar/internal/sandbox/web/WebQueryHit.java (-6 / +28 lines)
Lines 10-15 Link Here
10
10
11
import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
11
import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
12
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask;
12
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask;
13
import org.eclipse.mylar.provisional.tasklist.ITask;
14
import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
15
import org.eclipse.mylar.provisional.tasklist.TaskList;
13
16
14
/**
17
/**
15
 * Represents issue returned by <code>WebQuery</code> 
18
 * Represents issue returned by <code>WebQuery</code> 
Lines 17-32 Link Here
17
 * @author Eugene Kuleshov
20
 * @author Eugene Kuleshov
18
 */
21
 */
19
public class WebQueryHit extends AbstractQueryHit {
22
public class WebQueryHit extends AbstractQueryHit {
23
	private final String taskPrefix;
20
24
21
	private AbstractRepositoryTask task;
25
	private AbstractRepositoryTask task;
22
26
23
27
24
	public WebQueryHit(String id, String description, String repositoryUrl) {
28
	public WebQueryHit(String id, String description, String taskPrefix, String repositoryUrl) {
25
		super(repositoryUrl, description, Integer.parseInt(id));
29
		super(repositoryUrl, description, id);
30
		this.taskPrefix = taskPrefix;
26
	}
31
	}
27
32
28
	public String getDescription() {
33
	public String getDescription() {
29
		return id + ": "+ description;
34
		return description;
30
	}
35
	}
31
	
36
	
32
	public String getPriority() {
37
	public String getPriority() {
Lines 46-58 Link Here
46
	}
51
	}
47
52
48
	public AbstractRepositoryTask getOrCreateCorrespondingTask() {
53
	public AbstractRepositoryTask getOrCreateCorrespondingTask() {
49
		// TODO
54
		TaskList taskList = MylarTaskListPlugin.getTaskListManager().getTaskList();
50
		return null;
55
		
56
		ITask existingTask = taskList.getTask(getHandleIdentifier());		 
57
		if (existingTask instanceof WebTask) {
58
			this.task = (WebTask) existingTask;
59
		} else {
60
			task = new WebTask(id, description, taskPrefix, repositoryUrl);
61
			taskList.addTask(task);			
62
		} 	
63
		return task;
51
	}
64
	}
52
	
65
	
53
	public void setHandleIdentifier(String id) {
66
	public void setHandleIdentifier(String id) {
54
		// TODO
67
		task.setHandleIdentifier(id);
68
	}
69
70
	@Override
71
	public String getHandleIdentifier() {
72
		return taskPrefix + getId();
55
	}
73
	}
56
74
75
	public String getTaskPrefix() {
76
		return this.taskPrefix;
77
	}
78
	
57
}
79
}
58
80
(-)plugin.xml (-2 lines)
Lines 131-141 Link Here
131
            id="org.eclipse.mylar.web.tasklist.repositories"
131
            id="org.eclipse.mylar.web.tasklist.repositories"
132
            name="Generic web-based repository"
132
            name="Generic web-based repository"
133
            type="web"/>
133
            type="web"/>
134
      <!--            
135
      <externalizer
134
      <externalizer
136
            class="org.eclipse.mylar.internal.sandbox.web.WebTaskExternalizer" 
135
            class="org.eclipse.mylar.internal.sandbox.web.WebTaskExternalizer" 
137
            id="org.eclipse.mylar.web.tasklist.externalizer"/>
136
            id="org.eclipse.mylar.web.tasklist.externalizer"/>
138
      -->      
139
   </extension>  
137
   </extension>  
140
  
138
  
141
</plugin>
139
</plugin>
(-)src/org/eclipse/mylar/internal/sandbox/web/WebTaskExternalizer.java (+204 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.mylar.internal.sandbox.web;
10
11
import org.eclipse.mylar.internal.tasklist.TaskExternalizationException;
12
import org.eclipse.mylar.provisional.tasklist.AbstractQueryHit;
13
import org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery;
14
import org.eclipse.mylar.provisional.tasklist.AbstractTaskContainer;
15
import org.eclipse.mylar.provisional.tasklist.DelegatingTaskExternalizer;
16
import org.eclipse.mylar.provisional.tasklist.ITask;
17
import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin;
18
import org.eclipse.mylar.provisional.tasklist.TaskList;
19
import org.w3c.dom.Document;
20
import org.w3c.dom.Element;
21
import org.w3c.dom.Node;
22
import org.w3c.dom.NodeList;
23
24
/**
25
 * Task externalizer for generic web based issue tracking systems
26
 * 
27
 * @author Eugene Kuleshov
28
 */
29
public class WebTaskExternalizer extends DelegatingTaskExternalizer {
30
31
	private static final String KEY_WEB = "Web";
32
33
	private static final String KEY_WEB_CATEGORY = "WebQuery" + KEY_CATEGORY;
34
35
	private static final String KEY_WEB_QUERY_HIT = KEY_WEB + KEY_QUERY_HIT;
36
37
	private static final String KEY_WEB_QUERY = KEY_WEB + KEY_QUERY;
38
39
	private static final String KEY_WEB_ISSUE = "WebIssue";
40
41
	private static final String KEY_REGEXP = "Regexp";
42
43
	private static final String KEY_PREFIX = "TaskPrefix";
44
45
	private static final String KEY_KEY = "Key";
46
47
48
	@Override
49
	public boolean canReadQuery(Node node) {
50
		return node.getNodeName().equals(KEY_WEB_QUERY);
51
	}
52
53
	@Override
54
	public boolean canCreateElementFor(AbstractRepositoryQuery category) {
55
		return category instanceof WebQuery;
56
	}
57
58
	@Override
59
	public boolean canCreateElementFor(ITask task) {
60
		return task instanceof WebTask;
61
	}
62
	
63
	@Override
64
	public boolean canReadQueryHit(Node node) {
65
		return node.getNodeName().equals(getQueryHitTagName());
66
	}
67
68
	@Override
69
	public Element createQueryElement(AbstractRepositoryQuery query, Document doc, Element parent) {
70
		Element node = super.createQueryElement(query, doc, parent);
71
72
		if (query instanceof WebQuery) {
73
			WebQuery webQuery = (WebQuery) query;
74
			node.setAttribute(KEY_REGEXP, webQuery.getRegexp());
75
			node.setAttribute(KEY_PREFIX, webQuery.getTaskPrefix());
76
		}
77
78
		return node;
79
	}
80
81
	@Override
82
	public Element createQueryHitElement(AbstractQueryHit queryHit, Document doc, Element parent) {
83
		Element node = doc.createElement(getQueryHitTagName());
84
		
85
		node.setAttribute(KEY_KEY, queryHit.getId());
86
		node.setAttribute(KEY_NAME, queryHit.getDescription());
87
		// node.setAttribute(KEY_PREFIX, ((WebQueryHit) queryHit).getTaskPrefix());
88
		// node.setAttribute(KEY_REPOSITORY_URL, queryHit.getRepositoryUrl());
89
		
90
		parent.appendChild(node);
91
		return null;
92
	}
93
	
94
	@Override
95
	public Element createTaskElement(ITask task, Document doc, Element parent) {
96
		Element node = super.createTaskElement(task, doc, parent);
97
		node.setAttribute(KEY_KEY, ((WebTask) task).getId());
98
		node.setAttribute(KEY_NAME, ((WebTask) task).getDescription());
99
		node.setAttribute(KEY_PREFIX, ((WebTask) task).getTaskPrefix());
100
		node.setAttribute(KEY_REPOSITORY_URL, ((WebTask) task).getRepositoryUrl());
101
		return node;
102
	}
103
	
104
	@Override
105
	public ITask readTask(Node node, TaskList taskList, AbstractTaskContainer category, ITask parent)
106
			throws TaskExternalizationException {
107
		Element element = (Element) node;
108
109
		String id = null;
110
		if (element.hasAttribute(KEY_KEY)) {
111
			id = element.getAttribute(KEY_KEY);
112
		} else {
113
			throw new TaskExternalizationException("Id not stored for bug report");
114
		}
115
		
116
		String label;
117
		if (element.hasAttribute(KEY_NAME)) {
118
			label = element.getAttribute(KEY_NAME);
119
		} else {
120
			throw new TaskExternalizationException("Description not stored for bug report");
121
		}
122
123
		String prefix = null;
124
		if (element.hasAttribute(KEY_PREFIX)) {
125
			prefix = element.getAttribute(KEY_PREFIX);
126
		} else {
127
			throw new TaskExternalizationException("Prefix not stored for bug report");
128
		}
129
		
130
		String repositoryUrl = null;
131
		if (element.hasAttribute(KEY_REPOSITORY_URL)) {
132
			repositoryUrl = element.getAttribute(KEY_REPOSITORY_URL);
133
		} else {
134
			throw new TaskExternalizationException("Repository URL not stored for bug report");
135
		}
136
		
137
		WebTask task = new WebTask(id, label, prefix, repositoryUrl);
138
139
		readTaskInfo(task, taskList, element, parent, category);
140
		return task;
141
	}
142
143
	@Override
144
	public AbstractRepositoryQuery readQuery(Node node, TaskList taskList) throws TaskExternalizationException {
145
		Element element = (Element) node;
146
147
		String description = element.getAttribute(KEY_NAME);
148
		String queryUrl = element.getAttribute(KEY_QUERY_STRING);
149
		String taskPrefix = element.getAttribute(KEY_PREFIX);
150
		String regexp = element.getAttribute(KEY_REGEXP);
151
		String repositoryUrl = element.getAttribute(KEY_REPOSITORY_URL);
152
		
153
		AbstractRepositoryQuery query = new WebQuery(description, queryUrl, taskPrefix, regexp, 
154
				MylarTaskListPlugin.getTaskListManager().getTaskList(), repositoryUrl);
155
		
156
		boolean hasCaughtException = false;
157
		NodeList list = node.getChildNodes();
158
		for (int i = 0; i < list.getLength(); i++) {
159
			Node child = list.item(i);
160
			try {
161
				readQueryHit(child, taskList, query);
162
			} catch (TaskExternalizationException e) {
163
				hasCaughtException = true;
164
			}
165
		}
166
		if (hasCaughtException) {
167
			throw new TaskExternalizationException("Failed to load all hits");
168
		}
169
		return query;
170
	}
171
172
	@Override
173
	public void readQueryHit(Node node, TaskList taskList, AbstractRepositoryQuery query)
174
			throws TaskExternalizationException {
175
		Element element = (Element) node;
176
177
		String id = element.getAttribute(KEY_KEY);
178
		String description = element.getAttribute(KEY_NAME);
179
180
		WebQueryHit hit = new WebQueryHit(id, description, ((WebQuery) query).getTaskPrefix(), query.getRepositoryUrl());
181
		query.addHit(hit);
182
	}
183
184
	@Override
185
	public String getQueryTagNameForElement(AbstractRepositoryQuery query) {
186
		return query instanceof WebQuery ? KEY_WEB_QUERY : "";
187
	}
188
189
	@Override
190
	public String getCategoryTagName() {
191
		return KEY_WEB_CATEGORY;
192
	}
193
194
	@Override
195
	public String getQueryHitTagName() {
196
		return KEY_WEB_QUERY_HIT;
197
	}
198
199
	@Override
200
	public String getTaskTagName() {
201
		return KEY_WEB_ISSUE;
202
	}
203
204
}

Return to bug 145123