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

Collapse All | Expand All

(-)src/org/eclipse/mylar/internal/tasks/web/WebRepositorySettingsPage.java (-3 / +107 lines)
Lines 18-23 Link Here
18
import org.eclipse.jface.util.IPropertyChangeListener;
18
import org.eclipse.jface.util.IPropertyChangeListener;
19
import org.eclipse.jface.util.PropertyChangeEvent;
19
import org.eclipse.jface.util.PropertyChangeEvent;
20
import org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage;
20
import org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage;
21
import org.eclipse.mylar.internal.tasks.web.restui.EHttpMethod;
22
import org.eclipse.mylar.internal.tasks.web.restui.RESTRequestEditor;
21
import org.eclipse.mylar.tasks.core.RepositoryTemplate;
23
import org.eclipse.mylar.tasks.core.RepositoryTemplate;
22
import org.eclipse.mylar.tasks.core.TaskRepository;
24
import org.eclipse.mylar.tasks.core.TaskRepository;
23
import org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi;
25
import org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi;
Lines 32-37 Link Here
32
import org.eclipse.swt.widgets.Text;
34
import org.eclipse.swt.widgets.Text;
33
import org.eclipse.ui.forms.events.ExpansionAdapter;
35
import org.eclipse.ui.forms.events.ExpansionAdapter;
34
import org.eclipse.ui.forms.events.ExpansionEvent;
36
import org.eclipse.ui.forms.events.ExpansionEvent;
37
import org.eclipse.ui.forms.widgets.ColumnLayout;
35
import org.eclipse.ui.forms.widgets.ExpandableComposite;
38
import org.eclipse.ui.forms.widgets.ExpandableComposite;
36
import org.eclipse.ui.forms.widgets.FormToolkit;
39
import org.eclipse.ui.forms.widgets.FormToolkit;
37
import org.eclipse.ui.forms.widgets.Section;
40
import org.eclipse.ui.forms.widgets.Section;
Lines 56-63 Link Here
56
59
57
	private Text queryPatternText;
60
	private Text queryPatternText;
58
61
62
	private Text loginFormUrlText;
63
64
	private Text loginTokenPatternText;
65
59
	private ParametersEditor parametersEditor;
66
	private ParametersEditor parametersEditor;
60
67
68
	private RESTRequestEditor loginRequestEditor;
69
61
	private FormToolkit toolkit = new FormToolkit(Display.getCurrent());
70
	private FormToolkit toolkit = new FormToolkit(Display.getCurrent());
62
71
63
	private Map<String, String> oldProperties;
72
	private Map<String, String> oldProperties;
Lines 84-89 Link Here
84
					newTaskText.setText(template.newTaskUrl);
93
					newTaskText.setText(template.newTaskUrl);
85
					queryUrlText.setText(template.taskQueryUrl);
94
					queryUrlText.setText(template.taskQueryUrl);
86
					queryPatternText.setText(template.getAttribute(WebRepositoryConnector.PROPERTY_QUERY_REGEXP));
95
					queryPatternText.setText(template.getAttribute(WebRepositoryConnector.PROPERTY_QUERY_REGEXP));
96
					loginFormUrlText
97
							.setText(nvl(template.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL)));
98
					loginTokenPatternText.setText(nvl(template
99
							.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP)));
100
					String method = template.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD);
101
					if (method != null) {
102
						try {
103
							loginRequestEditor.setMethod(EHttpMethod.valueOf(method));
104
						} catch (IllegalArgumentException e1) {
105
							loginRequestEditor.setMethod(null);
106
						}
107
					} else {
108
						loginRequestEditor.setMethod(null);
109
					}
110
					loginRequestEditor.setUrl(nvl(template
111
							.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL)));
87
112
88
					parametersEditor.removeAll();
113
					parametersEditor.removeAll();
89
114
Lines 114-133 Link Here
114
			newTaskText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_TASK_CREATION_URL));
139
			newTaskText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_TASK_CREATION_URL));
115
			queryUrlText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_QUERY_URL));
140
			queryUrlText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_QUERY_URL));
116
			queryPatternText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_QUERY_REGEXP));
141
			queryPatternText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_QUERY_REGEXP));
142
			loginFormUrlText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL));
143
			loginTokenPatternText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP));
144
			try {
145
				loginRequestEditor.setMethod(EHttpMethod
146
						.valueOf(getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD)));
147
			} catch (IllegalArgumentException e) {
148
				// ignore
149
			}
150
			loginRequestEditor.setUrl(getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL));
117
151
118
			oldProperties = repository.getProperties();
152
			oldProperties = repository.getProperties();
119
			parametersEditor.addParams(oldProperties, new LinkedHashMap<String, String>());
153
			parametersEditor.addParams(oldProperties, new LinkedHashMap<String, String>());
120
		}
154
		}
121
	}
155
	}
122
156
123
	private String getTextProperty(String name) {
157
	private String nvl(String value) {
124
		String value = repository.getProperty(name);
125
		if (value == null) {
158
		if (value == null) {
126
			return "";
159
			return "";
127
		}
160
		}
128
		return value;
161
		return value;
129
	}
162
	}
130
163
164
	private String getTextProperty(String name) {
165
		return nvl(repository.getProperty(name));
166
	}
167
131
	protected boolean isValidUrl(String name) {
168
	protected boolean isValidUrl(String name) {
132
		return true;
169
		return true;
133
	}
170
	}
Lines 153-158 Link Here
153
		gridData_1.minimumHeight = 80;
190
		gridData_1.minimumHeight = 80;
154
		parametersEditor.setLayoutData(gridData_1);
191
		parametersEditor.setLayoutData(gridData_1);
155
192
193
		createAdvancedComposite(parent, composite);
194
		createLoginComposite(parent, composite);
195
196
		return composite;
197
	}
198
199
	private void createAdvancedComposite(Composite parent, final Composite composite) {
156
		ExpandableComposite expComposite = toolkit.createExpandableComposite(composite, Section.COMPACT
200
		ExpandableComposite expComposite = toolkit.createExpandableComposite(composite, Section.COMPACT
157
				| Section.TWISTIE | Section.TITLE_BAR);
201
				| Section.TWISTIE | Section.TITLE_BAR);
158
		expComposite.clientVerticalSpacing = 0;
202
		expComposite.clientVerticalSpacing = 0;
Lines 201-208 Link Here
201
		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
245
		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
202
		gridData.heightHint = 40;
246
		gridData.heightHint = 40;
203
		queryPatternText.setLayoutData(gridData);
247
		queryPatternText.setLayoutData(gridData);
248
	}
204
249
205
		return composite;
250
	private void createLoginComposite(final Composite parent, final Composite composite) {
251
		ExpandableComposite expComposite = toolkit.createExpandableComposite(composite, Section.COMPACT
252
				| Section.TWISTIE | Section.TITLE_BAR);
253
		expComposite.clientVerticalSpacing = 0;
254
		GridData gridData_2 = new GridData(SWT.FILL, SWT.FILL, true, false);
255
		gridData_2.horizontalIndent = -5;
256
		expComposite.setLayoutData(gridData_2);
257
		expComposite.setFont(parent.getFont());
258
		expComposite.setBackground(parent.getBackground());
259
		expComposite.setText("&Login Configuration (Expert)");
260
		expComposite.addExpansionListener(new ExpansionAdapter() {
261
			public void expansionStateChanged(ExpansionEvent e) {
262
				composite.layout();
263
			}
264
		});
265
266
		Composite loginComposite = toolkit.createComposite(expComposite, SWT.BORDER);
267
		loginComposite.setLayout(new ColumnLayout());
268
		Section loginTokenSection = toolkit.createSection(loginComposite, Section.TWISTIE | Section.TITLE_BAR);
269
		loginTokenSection.setText("Step 1. Retrieve login token (optional)");
270
		Composite composite2 = toolkit.createComposite(loginTokenSection);
271
		GridLayout gridLayout2 = new GridLayout();
272
		gridLayout2.numColumns = 2;
273
		gridLayout2.verticalSpacing = 0;
274
		composite2.setLayout(gridLayout2);
275
276
		Label queryUrlLabel = toolkit.createLabel(composite2, "Login &Page URL:", SWT.NONE);
277
		queryUrlLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
278
279
		loginFormUrlText = new Text(composite2, SWT.BORDER);
280
		loginFormUrlText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
281
282
		Label queryPatternLabel = toolkit.createLabel(composite2, "Login &Token Pattern:", SWT.NONE);
283
		queryPatternLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, false, true));
284
285
		loginTokenPatternText = new Text(composite2, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP);
286
		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
287
		gridData.heightHint = 40;
288
		loginTokenPatternText.setLayoutData(gridData);
289
290
		loginTokenSection.setClient(composite2);
291
292
		Section loginRequestSection = toolkit.createSection(loginComposite, Section.TWISTIE | Section.TITLE_BAR
293
				| Section.EXPANDED);
294
		loginRequestSection.setText("Step 2. Login request");
295
296
		loginRequestEditor = new RESTRequestEditor(loginRequestSection, SWT.NONE);
297
		toolkit.adapt(loginRequestEditor);
298
		loginRequestSection.setClient(loginRequestEditor);
299
300
		expComposite.setClient(loginComposite);
206
	}
301
	}
207
302
208
	public void propertyChange(PropertyChangeEvent event) {
303
	public void propertyChange(PropertyChangeEvent event) {
Lines 218-223 Link Here
218
		repository.setProperty(WebRepositoryConnector.PROPERTY_TASK_CREATION_URL, newTaskText.getText());
313
		repository.setProperty(WebRepositoryConnector.PROPERTY_TASK_CREATION_URL, newTaskText.getText());
219
		repository.setProperty(WebRepositoryConnector.PROPERTY_QUERY_URL, queryUrlText.getText());
314
		repository.setProperty(WebRepositoryConnector.PROPERTY_QUERY_URL, queryUrlText.getText());
220
		repository.setProperty(WebRepositoryConnector.PROPERTY_QUERY_REGEXP, queryPatternText.getText());
315
		repository.setProperty(WebRepositoryConnector.PROPERTY_QUERY_REGEXP, queryPatternText.getText());
316
		repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL, loginFormUrlText.getText());
317
		repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP, loginTokenPatternText.getText());
318
		EHttpMethod method = loginRequestEditor.getMethod();
319
		if (method == null) {
320
			repository.removeProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD);
321
		} else {
322
			repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD, method.name());
323
		}
324
		repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL, loginRequestEditor.getUrl());
221
325
222
		if (oldProperties != null) {
326
		if (oldProperties != null) {
223
			for (Map.Entry<String, String> e : oldProperties.entrySet()) {
327
			for (Map.Entry<String, String> e : oldProperties.entrySet()) {
(-)src/org/eclipse/mylar/internal/tasks/web/WebRepositoryConnector.java (-31 / +127 lines)
Lines 14-31 Link Here
14
import java.io.IOException;
14
import java.io.IOException;
15
import java.io.UnsupportedEncodingException;
15
import java.io.UnsupportedEncodingException;
16
import java.net.Proxy;
16
import java.net.Proxy;
17
import java.net.URL;
17
import java.net.URLDecoder;
18
import java.net.URLDecoder;
18
import java.util.ArrayList;
19
import java.util.ArrayList;
19
import java.util.Collections;
20
import java.util.Collections;
21
import java.util.HashMap;
20
import java.util.List;
22
import java.util.List;
21
import java.util.Map;
23
import java.util.Map;
22
import java.util.Set;
24
import java.util.Set;
25
import java.util.StringTokenizer;
23
import java.util.regex.Matcher;
26
import java.util.regex.Matcher;
24
import java.util.regex.Pattern;
27
import java.util.regex.Pattern;
25
28
26
import org.apache.commons.httpclient.Header;
29
import org.apache.commons.httpclient.Header;
27
import org.apache.commons.httpclient.HttpClient;
30
import org.apache.commons.httpclient.HttpClient;
31
import org.apache.commons.httpclient.HttpException;
32
import org.apache.commons.httpclient.HttpMethod;
28
import org.apache.commons.httpclient.methods.GetMethod;
33
import org.apache.commons.httpclient.methods.GetMethod;
34
import org.apache.commons.httpclient.methods.PostMethod;
29
import org.eclipse.core.runtime.CoreException;
35
import org.eclipse.core.runtime.CoreException;
30
import org.eclipse.core.runtime.IProgressMonitor;
36
import org.eclipse.core.runtime.IProgressMonitor;
31
import org.eclipse.core.runtime.IStatus;
37
import org.eclipse.core.runtime.IStatus;
Lines 34-39 Link Here
34
import org.eclipse.mylar.internal.tasks.core.WebQueryHit;
40
import org.eclipse.mylar.internal.tasks.core.WebQueryHit;
35
import org.eclipse.mylar.internal.tasks.core.WebTask;
41
import org.eclipse.mylar.internal.tasks.core.WebTask;
36
import org.eclipse.mylar.internal.tasks.ui.RetrieveTitleFromUrlJob;
42
import org.eclipse.mylar.internal.tasks.ui.RetrieveTitleFromUrlJob;
43
import org.eclipse.mylar.internal.tasks.web.restui.EHttpMethod;
37
import org.eclipse.mylar.tasks.core.AbstractRepositoryConnector;
44
import org.eclipse.mylar.tasks.core.AbstractRepositoryConnector;
38
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
45
import org.eclipse.mylar.tasks.core.AbstractRepositoryQuery;
39
import org.eclipse.mylar.tasks.core.AbstractRepositoryTask;
46
import org.eclipse.mylar.tasks.core.AbstractRepositoryTask;
Lines 60-65 Link Here
60
67
61
	public static final String PROPERTY_QUERY_REGEXP = "queryPattern";
68
	public static final String PROPERTY_QUERY_REGEXP = "queryPattern";
62
69
70
	public static final String PROPERTY_LOGIN_FORM_URL = "loginFormUrl";
71
72
	public static final String PROPERTY_LOGIN_TOKEN_REGEXP = "loginTokenPattern";
73
74
	public static final String PROPERTY_LOGIN_REQUEST_METHOD = "loginRequestMethod";
75
76
	public static final String PROPERTY_LOGIN_REQUEST_URL = "loginRequestUrl";
77
63
	public static final String PARAM_PREFIX = "param_";
78
	public static final String PARAM_PREFIX = "param_";
64
79
65
	public static final String PARAM_SERVER_URL = "serverUrl";
80
	public static final String PARAM_SERVER_URL = "serverUrl";
Lines 68-73 Link Here
68
83
69
	public static final String PARAM_PASSWORD = "password";
84
	public static final String PARAM_PASSWORD = "password";
70
85
86
	public static final String PARAM_LOGIN_TOKEN = "loginToken";
87
71
	public String getRepositoryType() {
88
	public String getRepositoryType() {
72
		return WebTask.REPOSITORY_TYPE;
89
		return WebTask.REPOSITORY_TYPE;
73
	}
90
	}
Lines 151-168 Link Here
151
	public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor,
168
	public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor,
152
			QueryHitCollector resultCollector) {
169
			QueryHitCollector resultCollector) {
153
		if (query instanceof WebQuery) {
170
		if (query instanceof WebQuery) {
154
			String repositoryUser = repository.getUserName();
155
			String repositoryPassword = repository.getPassword();
156
157
			WebQuery webQuery = (WebQuery) query;
171
			WebQuery webQuery = (WebQuery) query;
158
			Map<String, String> queryParameters = webQuery.getQueryParameters();
172
			Map<String, String> queryParameters = webQuery.getQueryParameters();
159
			String queryUrl = evaluateParams(query.getUrl(), queryParameters, repository);
173
			String queryUrl = evaluateParams(query.getUrl(), queryParameters, repository);
160
			String queryPattern = evaluateParams(webQuery.getQueryPattern(), queryParameters, repository);
174
			String queryPattern = evaluateParams(webQuery.getQueryPattern(), queryParameters, repository);
161
			String taskPrefix = evaluateParams(webQuery.getTaskPrefix(), queryParameters, repository);
175
			String taskPrefix = evaluateParams(webQuery.getTaskPrefix(), queryParameters, repository);
176
			Map<String, String> loginParams = new HashMap<String, String>();
177
			loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL, evaluateParams(repository
178
					.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL), queryParameters, repository));
179
			loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP, evaluateParams(repository
180
					.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP), queryParameters, repository));
181
			loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD, evaluateParams(repository
182
					.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD), queryParameters, repository));
183
			loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL, repository
184
					.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL));
162
185
163
			try {
186
			try {
164
				// if (regexp != null && regexp.trim().length() > 0) {
187
				// if (regexp != null && regexp.trim().length() > 0) {
165
				return performQuery(fetchResource(queryUrl, repositoryUser, repositoryPassword, repository.getProxy()), queryPattern,
188
				return performQuery(fetchResource(queryUrl, queryParameters, loginParams, repository), queryPattern,
166
						taskPrefix, monitor, resultCollector, repository);
189
						taskPrefix, monitor, resultCollector, repository);
167
				// } else {
190
				// } else {
168
				// return performRssQuery(queryUrl, taskPrefix, repositoryUrl,
191
				// return performRssQuery(queryUrl, taskPrefix, repositoryUrl,
Lines 275-313 Link Here
275
	 * "Could not fetch resource: " + queryUrl, ex); } }
298
	 * "Could not fetch resource: " + queryUrl, ex); } }
276
	 */
299
	 */
277
300
278
	public static String fetchResource(String url, String user, String password, Proxy proxySettings) throws IOException {
301
	public static String fetchResource(String url, Map<String, String> params, Map<String, String> loginParams, TaskRepository repository) throws IOException {
279
		HttpClient client = new HttpClient();
302
		HttpClient client = new HttpClient();
280
		WebClientUtil.setupHttpClient(client, proxySettings, url, user, password);
303
		WebClientUtil.setupHttpClient(client, repository.getProxy(), url, repository.getUserName(), repository.getPassword());
281
304
282
		GetMethod get = new GetMethod(url);
305
		if (loginParams != null) {
283
		try {
306
			String loginFormUrl = loginParams.get(PROPERTY_LOGIN_FORM_URL);
284
			client.executeMethod(get);
307
			if (loginFormUrl != null && !"".equals(loginFormUrl)) {
285
			Header refreshHeader = get.getResponseHeader("Refresh");
308
				GetMethod get = new GetMethod(loginFormUrl);
286
309
				String loginFormPage = null;
287
			if (refreshHeader != null) {
310
				try {
288
				String value = refreshHeader.getValue();
311
					client.executeMethod(get);
289
				int n = value.indexOf(";url=");
312
					Header locationHeader = get.getResponseHeader("Location");
290
				if (n != -1) {
313
					if (locationHeader != null) {
291
					value = value.substring(n + 5);
314
						get = new GetMethod(locationHeader.getValue());
292
					int requestPath;
315
						client.executeMethod(get);
293
					if (value.charAt(0) == '/') {
294
						int colonSlashSlash = url.indexOf("://");
295
						requestPath = url.indexOf('/', colonSlashSlash + 3);
296
					} else {
297
						requestPath = url.lastIndexOf('/');
298
					}
316
					}
299
317
					refreshIfNeeded(loginFormUrl, client, get);
300
					String refreshUrl;
318
					loginFormPage = get.getResponseBodyAsString();
301
					if (requestPath == -1) {
319
				} catch (Exception e) {
302
						refreshUrl = url + "/" + value;
320
					// ignore
303
					} else {
321
					e.printStackTrace();
304
						refreshUrl = url.substring(0, requestPath + 1) + value;
322
				} finally {
323
					get.releaseConnection();
324
				}
325
				if (loginFormPage != null) {
326
					String loginTokenPattern = loginParams.get(PROPERTY_LOGIN_TOKEN_REGEXP);
327
					if (loginTokenPattern != null && !"".equals(loginTokenPattern)) {
328
						Pattern p = Pattern.compile(loginTokenPattern);
329
						Matcher m = p.matcher(loginFormPage);
330
						if (m.find()) {
331
							// TODO is it ok to modify the params map?
332
							params.put(PARAM_PREFIX + PARAM_LOGIN_TOKEN, m.group(1));
333
						}
305
					}
334
					}
306
307
					get = new GetMethod(refreshUrl);
308
					client.executeMethod(get);
309
				}
335
				}
310
			}
336
			}
337
			HttpMethod method = null;
338
			try {
339
				String loginUrlStr = loginParams.get(PROPERTY_LOGIN_REQUEST_URL);
340
				loginUrlStr = evaluateParams(loginUrlStr, params, repository);
341
				switch (EHttpMethod.valueOf(loginParams.get(PROPERTY_LOGIN_REQUEST_METHOD))) {
342
				case GET:
343
					method = new GetMethod(loginUrlStr);
344
					break;
345
				case POST:
346
					String query = new URL(loginUrlStr).getQuery();
347
					if (query != null) {
348
						StringTokenizer tokenizer = new StringTokenizer(query, "&");
349
						method = new PostMethod(loginUrlStr.substring(0, loginUrlStr.indexOf(query) - 1));
350
						while (tokenizer.hasMoreTokens()) {
351
							String nameValuePair = tokenizer.nextToken();
352
							String[] nv = nameValuePair.split("=");
353
							if (nv.length < 2) {
354
								((PostMethod) method).addParameter(nv[0], "");
355
							} else {
356
								((PostMethod) method).addParameter(nv[0], nv[1]);
357
							}
358
						}
359
					}
360
					break;
361
				}
362
				client.executeMethod(method);
363
			} catch (Exception e) {
364
				// ignore
365
			} finally {
366
				if (method != null) {
367
					method.releaseConnection();
368
				}
369
			}
370
		}
371
372
		GetMethod get = new GetMethod(url);
373
		try {
374
			client.executeMethod(get);
375
			get = refreshIfNeeded(url, client, get);
311
			return get.getResponseBodyAsString();
376
			return get.getResponseBodyAsString();
312
377
313
		} finally {
378
		} finally {
Lines 315-320 Link Here
315
		}
380
		}
316
	}
381
	}
317
382
383
	private static GetMethod refreshIfNeeded(String url, HttpClient client, GetMethod get) throws IOException,
384
			HttpException {
385
		Header refreshHeader = get.getResponseHeader("Refresh");
386
387
		if (refreshHeader != null) {
388
			String value = refreshHeader.getValue();
389
			int n = value.indexOf(";url=");
390
			if (n != -1) {
391
				value = value.substring(n + 5);
392
				int requestPath;
393
				if (value.charAt(0) == '/') {
394
					int colonSlashSlash = url.indexOf("://");
395
					requestPath = url.indexOf('/', colonSlashSlash + 3);
396
				} else {
397
					requestPath = url.lastIndexOf('/');
398
				}
399
400
				String refreshUrl;
401
				if (requestPath == -1) {
402
					refreshUrl = url + "/" + value;
403
				} else {
404
					refreshUrl = url.substring(0, requestPath + 1) + value;
405
				}
406
407
				get = new GetMethod(refreshUrl);
408
				client.executeMethod(get);
409
			}
410
		}
411
		return get;
412
	}
413
318
	public static String evaluateParams(String value, Map<String, String> params, TaskRepository repository) {
414
	public static String evaluateParams(String value, Map<String, String> params, TaskRepository repository) {
319
		return evaluateParams(evaluateParams(value, params), repository);
415
		return evaluateParams(evaluateParams(value, params), repository);
320
	}
416
	}
(-)src/org/eclipse/mylar/internal/tasks/web/WebQueryWizardPage.java (-1 / +16 lines)
Lines 10-15 Link Here
10
10
11
import java.io.IOException;
11
import java.io.IOException;
12
import java.util.ArrayList;
12
import java.util.ArrayList;
13
import java.util.HashMap;
13
import java.util.LinkedHashMap;
14
import java.util.LinkedHashMap;
14
import java.util.List;
15
import java.util.List;
15
import java.util.Map;
16
import java.util.Map;
Lines 316-322 Link Here
316
				final List<AbstractQueryHit> queryHits = new ArrayList<AbstractQueryHit>();
317
				final List<AbstractQueryHit> queryHits = new ArrayList<AbstractQueryHit>();
317
				try {
318
				try {
318
					if(webPage==null) {
319
					if(webPage==null) {
319
						webPage = WebRepositoryConnector.fetchResource(evaluatedUrl, repository.getUserName(), repository.getPassword(), repository.getProxy());
320
						HashMap<String, String> loginParams = new HashMap<String, String>();
321
						loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL, WebRepositoryConnector
322
								.evaluateParams(repository.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL),
323
										params, repository));
324
						loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP, WebRepositoryConnector
325
								.evaluateParams(repository
326
										.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP), params,
327
										repository));
328
						loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD, WebRepositoryConnector
329
								.evaluateParams(repository
330
										.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD), params,
331
										repository));
332
						loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL, repository
333
								.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL));
334
						webPage = WebRepositoryConnector.fetchResource(evaluatedUrl, params, loginParams, repository);
320
					}
335
					}
321
336
322
					QueryHitCollector collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList()) {
337
					QueryHitCollector collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList()) {
(-).project (+1 lines)
Lines 24-28 Link Here
24
	<natures>
24
	<natures>
25
		<nature>org.eclipse.pde.PluginNature</nature>
25
		<nature>org.eclipse.pde.PluginNature</nature>
26
		<nature>org.eclipse.jdt.core.javanature</nature>
26
		<nature>org.eclipse.jdt.core.javanature</nature>
27
		<nature>org.eclipse.jem.beaninfo.BeanInfoNature</nature>
27
	</natures>
28
	</natures>
28
</projectDescription>
29
</projectDescription>
(-)plugin.xml (+50 lines)
Lines 141-146 Link Here
141
        <attribute name="queryPattern"
141
        <attribute name="queryPattern"
142
                   value="&lt;tr .+?&lt;a href=&quot;view.php\?id=(.+?)&quot;&gt;.+?&lt;td class=&quot;left&quot;&gt;(.+?)&lt;/td&gt;&lt;/tr&gt;"/>
142
                   value="&lt;tr .+?&lt;a href=&quot;view.php\?id=(.+?)&quot;&gt;.+?&lt;td class=&quot;left&quot;&gt;(.+?)&lt;/td&gt;&lt;/tr&gt;"/>
143
     </repository>
143
     </repository>
144
     <repository
145
           anonymous="true"
146
           label="ChangeLogic (anonymous)"
147
           repositoryKind="web"
148
           urlNewTask="${serverUrl}/index.php?event=Add_task"
149
           urlRepository="http://changelogic.araneaframework.org"
150
           urlTask="${serverUrl}/index.php?event=Show_public_task&amp;task_id="
151
           urlTaskQuery="${serverUrl}/index.php?event=Show_public_task_list">
152
        <attribute
153
              name="queryPattern"
154
              value="&lt;a href=&quot;index.php\?event\=Show_public_task&amp;amp;task_id\=.+?&amp;amp;project_id\=0&quot;&gt;(.+?)&lt;/a&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;(.+?)&lt;/td&gt;">
155
        </attribute>
156
        <attribute
157
              name="loginFormUrl"
158
              value="${serverUrl}">
159
        </attribute>
160
     </repository>
161
     <repository
162
           anonymous="false"
163
           label="ChangeLogic (private)"
164
           repositoryKind="web"
165
           urlNewTask="${serverUrl}/index.php?event=Add_task&amp;project_id=${projectId}"
166
           urlRepository="http://changelogic.araneaframework.org"
167
           urlTask="${serverUrl}/index.php?event=Show_task&amp;task_id="
168
           urlTaskQuery="${serverUrl}/index.php?event=Show_task_list&amp;project_id=${projectId}">
169
        <attribute
170
              name="loginFormUrl"
171
              value="${serverUrl}">
172
        </attribute>
173
        <attribute
174
              name="loginTokenPattern"
175
              value="&lt;form name=&quot;Login_form&quot; method=&quot;POST&quot; action=&quot;index.php\?event\=Login&amp;amp;project_id\=0&amp;amp;link_uid\=(\p{Alnum}+?)\&quot;(?:.*?)&gt;">
176
        </attribute>
177
        <attribute
178
              name="loginRequestMethod"
179
              value="POST">
180
        </attribute>
181
        <attribute
182
              name="loginRequestUrl"
183
              value="${serverUrl}/index.php?event=Login&amp;link_uid=${loginToken}&amp;username=${userId}&amp;password=${password}">
184
        </attribute>
185
        <attribute
186
              name="queryPattern"
187
              value="&lt;a href=&quot;index.php\?event\=Show_task&amp;amp;task_id\=.+?&amp;amp;project_id\=${projectId}&amp;amp;recent_list_id=.+?&quot;&gt;(.+?)&lt;/a&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;(.+?)&lt;/td&gt;">
188
        </attribute>
189
        <attribute
190
              name="param_projectId"
191
              value="1">
192
        </attribute>
193
     </repository>
144
   </extension>
194
   </extension>
145
195
146
</plugin>
196
</plugin>
(-)src/org/eclipse/mylar/internal/tasks/web/restui/MethodTypeContentProvider.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2005, 2006 Erkki Lindpere 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
 *     Erkki Lindpere - initial API and implementation
10
 *******************************************************************************/
11
package org.eclipse.mylar.internal.tasks.web.restui;
12
13
import org.eclipse.jface.viewers.IStructuredContentProvider;
14
import org.eclipse.jface.viewers.Viewer;
15
16
public class MethodTypeContentProvider implements IStructuredContentProvider {
17
18
	public Object[] getElements(Object inputElement) {
19
		return EHttpMethod.values();
20
	}
21
22
	public void dispose() {
23
	}
24
25
	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
26
	}
27
28
}
(-).refactorings/2006/11/47/refactorings.index (+1 lines)
Added Link Here
1
1164139617968	Extract method 'refreshIfNeeded'
(-)src/org/eclipse/mylar/internal/tasks/web/restui/EHttpMethod.java (+20 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2005, 2006 Erkki Lindpere 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
 *     Erkki Lindpere - initial API and implementation
10
 *******************************************************************************/
11
package org.eclipse.mylar.internal.tasks.web.restui;
12
13
/**
14
 * Represents a subset of HTTP methods: GET and POST
15
 * 
16
 * @author Erkki Lindpere
17
 */
18
public enum EHttpMethod {
19
	GET, POST
20
}
(-)src/org/eclipse/mylar/internal/tasks/web/restui/RESTRequestEditor.java (+88 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2005, 2006 Erkki Lindpere 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
 *     Erkki Lindpere - initial API and implementation
10
 *******************************************************************************/
11
package org.eclipse.mylar.internal.tasks.web.restui;
12
13
import org.eclipse.jface.viewers.ComboViewer;
14
import org.eclipse.jface.viewers.ISelection;
15
import org.eclipse.jface.viewers.IStructuredSelection;
16
import org.eclipse.jface.viewers.StructuredSelection;
17
import org.eclipse.swt.SWT;
18
import org.eclipse.swt.layout.GridData;
19
import org.eclipse.swt.layout.GridLayout;
20
import org.eclipse.swt.widgets.Combo;
21
import org.eclipse.swt.widgets.Composite;
22
import org.eclipse.swt.widgets.Label;
23
import org.eclipse.swt.widgets.Text;
24
25
public class RESTRequestEditor extends Composite {
26
27
	private Label urlLabel = null;
28
29
	private Text urlText = null;
30
31
	private Combo methodCombo = null;
32
33
	private ComboViewer comboViewer = null;
34
35
	public RESTRequestEditor(Composite parent, int style) {
36
		super(parent, style);
37
		initialize();
38
	}
39
40
	private void initialize() {
41
		GridData gridData = new GridData();
42
		gridData.grabExcessHorizontalSpace = true;
43
		gridData.verticalAlignment = GridData.CENTER;
44
		gridData.horizontalAlignment = GridData.FILL;
45
		GridLayout gridLayout = new GridLayout();
46
		gridLayout.numColumns = 3;
47
		createMethodCombo();
48
		urlLabel = new Label(this, SWT.NONE);
49
		urlLabel.setText("URL:");
50
		urlText = new Text(this, SWT.BORDER);
51
		urlText.setLayoutData(gridData);
52
		this.setLayout(gridLayout);
53
	}
54
55
	/**
56
	 * This method initializes methodCombo
57
	 * 
58
	 */
59
	private void createMethodCombo() {
60
		methodCombo = new Combo(this, SWT.NONE);
61
		comboViewer = new ComboViewer(methodCombo);
62
		comboViewer.setContentProvider(new MethodTypeContentProvider());
63
		comboViewer.setInput(new Object());
64
		comboViewer.setLabelProvider(new MethodTypeLabelProvider());
65
	}
66
67
	public String getUrl() {
68
		return urlText.getText();
69
	}
70
71
	public void setUrl(String url) {
72
		urlText.setText(url);
73
	}
74
75
	public EHttpMethod getMethod() {
76
		return (EHttpMethod) ((IStructuredSelection) comboViewer.getSelection()).getFirstElement();
77
	}
78
79
	public void setMethod(EHttpMethod method) {
80
		ISelection selection = null;
81
		if (method == null) {
82
			selection = new StructuredSelection();
83
		} else {
84
			selection = new StructuredSelection(method);
85
		}
86
		comboViewer.setSelection(selection);
87
	}
88
}
(-).refactorings/2006/11/47/refactorings.history (+4 lines)
Added Link Here
1
<?xml version="1.0" encoding="utf-8"?>
2
<session version="1.0">
3
<refactoring comment="Extract method 'private static GetMethod refreshIfNeeded(String url,HttpClient client,GetMethod get) throws IOException, HttpException ' from 'org.eclipse.mylar.internal.tasks.web.WebRepositoryConnector.fetchResource()' to 'org.eclipse.mylar.internal.tasks.web.WebRepositoryConnector'&#13;&#10;- Original project: 'org.eclipse.mylar.tasks.web'&#13;&#10;- Method name: 'refreshIfNeeded'&#13;&#10;- Destination type: 'org.eclipse.mylar.internal.tasks.web.WebRepositoryConnector'&#13;&#10;- Declared visibility: 'private'&#13;&#10;- Declare thrown runtime exceptions&#13;&#10;- Generate method comment" comments="true" description="Extract method 'refreshIfNeeded'" destination="0" exceptions="true" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src&lt;org.eclipse.mylar.internal.tasks.web{WebRepositoryConnector.java" name="refreshIfNeeded" replace="false" selection="15304 741" stamp="1164139617968" version="1.0" visibility="2"/>
4
</session>
(-)src/org/eclipse/mylar/internal/tasks/web/restui/MethodTypeLabelProvider.java (+26 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2005, 2006 Erkki Lindpere 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
 *     Erkki Lindpere - initial API and implementation
10
 *******************************************************************************/
11
package org.eclipse.mylar.internal.tasks.web.restui;
12
13
import org.eclipse.jface.viewers.LabelProvider;
14
15
public class MethodTypeLabelProvider extends LabelProvider {
16
17
	@Override
18
	public String getText(Object element) {
19
		if (element instanceof EHttpMethod) {
20
			EHttpMethod type = (EHttpMethod) element;
21
			return type.name();
22
		}
23
		return super.getText(element);
24
	}
25
26
}

Return to bug 151602