|
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 49-79
Link Here
|
| 49 |
|
50 |
|
| 50 |
/** |
51 |
/** |
| 51 |
* Wizard page for configuring and preview web query |
52 |
* Wizard page for configuring and preview web query |
| 52 |
* |
53 |
* |
| 53 |
* @author Eugene Kuleshov |
54 |
* @author Eugene Kuleshov |
| 54 |
*/ |
55 |
*/ |
| 55 |
public class WebQueryWizardPage extends AbstractRepositoryQueryPage { |
56 |
public class WebQueryWizardPage extends AbstractRepositoryQueryPage { |
| 56 |
private Text queryUrlText; |
57 |
private Text queryUrlText; |
|
|
58 |
|
| 57 |
private Text queryPatternText; |
59 |
private Text queryPatternText; |
|
|
60 |
|
| 58 |
private Table previewTable; |
61 |
private Table previewTable; |
| 59 |
|
62 |
|
| 60 |
private String webPage; |
63 |
private String webPage; |
| 61 |
|
64 |
|
| 62 |
private TaskRepository repository; |
65 |
private TaskRepository repository; |
|
|
66 |
|
| 63 |
private WebQuery query; |
67 |
private WebQuery query; |
|
|
68 |
|
| 64 |
private UpdatePreviewJob updatePreviewJob; |
69 |
private UpdatePreviewJob updatePreviewJob; |
| 65 |
|
70 |
|
| 66 |
private FormToolkit toolkit = new FormToolkit(Display.getCurrent()); |
71 |
private FormToolkit toolkit = new FormToolkit(Display.getCurrent()); |
|
|
72 |
|
| 67 |
private ParametersEditor parametersEditor; |
73 |
private ParametersEditor parametersEditor; |
| 68 |
private Map<String, String> oldProperties; |
|
|
| 69 |
|
74 |
|
|
|
75 |
private Map<String, String> oldProperties; |
| 70 |
|
76 |
|
| 71 |
public WebQueryWizardPage(TaskRepository repository) { |
77 |
public WebQueryWizardPage(TaskRepository repository) { |
| 72 |
this(repository, null); |
78 |
this(repository, null); |
| 73 |
} |
79 |
} |
| 74 |
|
80 |
|
| 75 |
public WebQueryWizardPage(TaskRepository repository, WebQuery query) { |
81 |
public WebQueryWizardPage(TaskRepository repository, WebQuery query) { |
| 76 |
super("New web query", query==null ? getDefaultQueryTitle(repository) : query.getDescription()); |
82 |
super("New web query", query == null ? getDefaultQueryTitle(repository) : query.getDescription()); |
| 77 |
this.repository = repository; |
83 |
this.repository = repository; |
| 78 |
this.query = query; |
84 |
this.query = query; |
| 79 |
setTitle("Create web query"); |
85 |
setTitle("Create web query"); |
|
Lines 83-97
Link Here
|
| 83 |
private static String getDefaultQueryTitle(TaskRepository repository) { |
89 |
private static String getDefaultQueryTitle(TaskRepository repository) { |
| 84 |
String label = repository.getRepositoryLabel(); |
90 |
String label = repository.getRepositoryLabel(); |
| 85 |
String title = label; |
91 |
String title = label; |
| 86 |
Set<AbstractRepositoryQuery> queries = TasksUiPlugin.getTaskListManager().getTaskList().getRepositoryQueries(repository.getUrl()); |
92 |
Set<AbstractRepositoryQuery> queries = TasksUiPlugin.getTaskListManager().getTaskList().getRepositoryQueries( |
| 87 |
for(int n = 1; true; n++) { |
93 |
repository.getUrl()); |
|
|
94 |
for (int n = 1; true; n++) { |
| 88 |
for (AbstractRepositoryQuery query : queries) { |
95 |
for (AbstractRepositoryQuery query : queries) { |
| 89 |
if(query.getDescription().equals(title)) { |
96 |
if (query.getDescription().equals(title)) { |
| 90 |
title = label + " " + n; |
97 |
title = label + " " + n; |
| 91 |
} |
98 |
} |
| 92 |
} |
99 |
} |
| 93 |
return title; |
100 |
return title; |
| 94 |
} |
101 |
} |
| 95 |
} |
102 |
} |
| 96 |
|
103 |
|
| 97 |
public void createControl(Composite parent) { |
104 |
public void createControl(Composite parent) { |
|
Lines 105-121
Link Here
|
| 105 |
|
112 |
|
| 106 |
super.createControl(composite); |
113 |
super.createControl(composite); |
| 107 |
|
114 |
|
| 108 |
// Label descriptionLabel = new Label(composite, SWT.NONE); |
115 |
// Label descriptionLabel = new Label(composite, SWT.NONE); |
| 109 |
// descriptionLabel.setLayoutData(new GridData()); |
116 |
// descriptionLabel.setLayoutData(new GridData()); |
| 110 |
// descriptionLabel.setText("Query Title:"); |
117 |
// descriptionLabel.setText("Query Title:"); |
| 111 |
|
118 |
|
| 112 |
// queryTitleText = new Text(composite, SWT.BORDER); |
119 |
// queryTitleText = new Text(composite, SWT.BORDER); |
| 113 |
// queryTitleText.addModifyListener(new ModifyListener() { |
120 |
// queryTitleText.addModifyListener(new ModifyListener() { |
| 114 |
// public void modifyText(ModifyEvent e) { |
121 |
// public void modifyText(ModifyEvent e) { |
| 115 |
// setPageComplete(isPageComplete()); |
122 |
// setPageComplete(isPageComplete()); |
| 116 |
// } |
123 |
// } |
| 117 |
// }); |
124 |
// }); |
| 118 |
// queryTitleText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); |
125 |
// queryTitleText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, |
|
|
126 |
// false)); |
| 119 |
|
127 |
|
| 120 |
parametersEditor = new ParametersEditor(composite, SWT.NONE); |
128 |
parametersEditor = new ParametersEditor(composite, SWT.NONE); |
| 121 |
GridData gridData1 = new GridData(SWT.FILL, SWT.FILL, true, true); |
129 |
GridData gridData1 = new GridData(SWT.FILL, SWT.FILL, true, true); |
|
Lines 123-129
Link Here
|
| 123 |
gridData1.minimumHeight = 80; |
131 |
gridData1.minimumHeight = 80; |
| 124 |
parametersEditor.setLayoutData(gridData1); |
132 |
parametersEditor.setLayoutData(gridData1); |
| 125 |
|
133 |
|
| 126 |
ExpandableComposite expComposite = toolkit.createExpandableComposite(composite, Section.COMPACT | Section.TWISTIE); |
134 |
ExpandableComposite expComposite = toolkit.createExpandableComposite(composite, Section.COMPACT |
|
|
135 |
| Section.TWISTIE); |
| 127 |
expComposite.setFont(parent.getFont()); |
136 |
expComposite.setFont(parent.getFont()); |
| 128 |
GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, true, false); |
137 |
GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, true, false); |
| 129 |
gridData_1.heightHint = 150; |
138 |
gridData_1.heightHint = 150; |
|
Lines 161-173
Link Here
|
| 161 |
gridData.heightHint = 45; |
170 |
gridData.heightHint = 45; |
| 162 |
queryPatternText.setLayoutData(gridData); |
171 |
queryPatternText.setLayoutData(gridData); |
| 163 |
|
172 |
|
| 164 |
// regexpText.addModifyListener(new ModifyListener() { |
173 |
// regexpText.addModifyListener(new ModifyListener() { |
| 165 |
// public void modifyText(final ModifyEvent e) { |
174 |
// public void modifyText(final ModifyEvent e) { |
| 166 |
// if(webPage!=null) { |
175 |
// if(webPage!=null) { |
| 167 |
// updatePreview(); |
176 |
// updatePreview(); |
| 168 |
// } |
177 |
// } |
| 169 |
// } |
178 |
// } |
| 170 |
// }); |
179 |
// }); |
| 171 |
|
180 |
|
| 172 |
Button preview = new Button(composite1, SWT.NONE); |
181 |
Button preview = new Button(composite1, SWT.NONE); |
| 173 |
preview.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false)); |
182 |
preview.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false)); |
|
Lines 198-213
Link Here
|
| 198 |
|
207 |
|
| 199 |
LinkedHashMap<String, String> vars = new LinkedHashMap<String, String>(); |
208 |
LinkedHashMap<String, String> vars = new LinkedHashMap<String, String>(); |
| 200 |
Map<String, String> params = new LinkedHashMap<String, String>(); |
209 |
Map<String, String> params = new LinkedHashMap<String, String>(); |
| 201 |
if(repository!=null) { |
210 |
if (repository != null) { |
| 202 |
|
|
|
| 203 |
|
211 |
|
| 204 |
queryUrlText.setText(addVars(vars, repository.getProperty(WebRepositoryConnector.PROPERTY_QUERY_URL))); |
212 |
queryUrlText.setText(addVars(vars, repository.getProperty(WebRepositoryConnector.PROPERTY_QUERY_URL))); |
| 205 |
queryPatternText.setText(addVars(vars, repository.getProperty(WebRepositoryConnector.PROPERTY_QUERY_REGEXP))); |
213 |
queryPatternText |
|
|
214 |
.setText(addVars(vars, repository.getProperty(WebRepositoryConnector.PROPERTY_QUERY_REGEXP))); |
| 206 |
|
215 |
|
| 207 |
oldProperties = repository.getProperties(); |
216 |
oldProperties = repository.getProperties(); |
| 208 |
params.putAll(oldProperties); |
217 |
params.putAll(oldProperties); |
| 209 |
} |
218 |
} |
| 210 |
if(query!=null) { |
219 |
if (query != null) { |
| 211 |
setTitle(query.getDescription()); |
220 |
setTitle(query.getDescription()); |
| 212 |
queryUrlText.setText(addVars(vars, query.getUrl())); |
221 |
queryUrlText.setText(addVars(vars, query.getUrl())); |
| 213 |
queryPatternText.setText(addVars(vars, query.getQueryPattern())); |
222 |
queryPatternText.setText(addVars(vars, query.getQueryPattern())); |
|
Lines 217-226
Link Here
|
| 217 |
} |
226 |
} |
| 218 |
|
227 |
|
| 219 |
private static String addVars(LinkedHashMap<String, String> vars, String property) { |
228 |
private static String addVars(LinkedHashMap<String, String> vars, String property) { |
| 220 |
if(property==null) { |
229 |
if (property == null) { |
| 221 |
return ""; |
230 |
return ""; |
| 222 |
} |
231 |
} |
| 223 |
for(String var : WebRepositoryConnector.getTemplateVariables(property)) { |
232 |
for (String var : WebRepositoryConnector.getTemplateVariables(property)) { |
| 224 |
vars.put(var, ""); |
233 |
vars.put(var, ""); |
| 225 |
} |
234 |
} |
| 226 |
return property; |
235 |
return property; |
|
Lines 232-279
Link Here
|
| 232 |
String queryPattern = queryPatternText.getText(); |
241 |
String queryPattern = queryPatternText.getText(); |
| 233 |
Map<String, String> params = parametersEditor.getParameters(); |
242 |
Map<String, String> params = parametersEditor.getParameters(); |
| 234 |
return new WebQuery(TasksUiPlugin.getTaskListManager().getTaskList(), description, queryUrl, queryPattern, |
243 |
return new WebQuery(TasksUiPlugin.getTaskListManager().getTaskList(), description, queryUrl, queryPattern, |
| 235 |
repository.getProperty(WebRepositoryConnector.PROPERTY_TASK_URL), |
244 |
repository.getProperty(WebRepositoryConnector.PROPERTY_TASK_URL), repository.getUrl(), params); |
| 236 |
repository.getUrl(), params); |
|
|
| 237 |
} |
245 |
} |
| 238 |
|
246 |
|
| 239 |
synchronized void updatePreview() { |
247 |
synchronized void updatePreview() { |
| 240 |
if(updatePreviewJob==null) { |
248 |
if (updatePreviewJob == null) { |
| 241 |
updatePreviewJob = new UpdatePreviewJob("Updating preview"); |
249 |
updatePreviewJob = new UpdatePreviewJob("Updating preview"); |
| 242 |
updatePreviewJob.setPriority(Job.DECORATE); |
250 |
updatePreviewJob.setPriority(Job.DECORATE); |
| 243 |
} |
251 |
} |
| 244 |
updatePreviewJob.setParams(queryUrlText.getText(), queryPatternText.getText(), parametersEditor.getParameters()); |
252 |
updatePreviewJob |
| 245 |
if(!updatePreviewJob.isActive()) { |
253 |
.setParams(queryUrlText.getText(), queryPatternText.getText(), parametersEditor.getParameters()); |
|
|
254 |
if (!updatePreviewJob.isActive()) { |
| 246 |
updatePreviewJob.schedule(); |
255 |
updatePreviewJob.schedule(); |
| 247 |
} |
256 |
} |
| 248 |
} |
257 |
} |
| 249 |
|
258 |
|
| 250 |
public boolean isPageComplete() { |
259 |
public boolean isPageComplete() { |
| 251 |
if(getErrorMessage()!=null) { |
260 |
if (getErrorMessage() != null) { |
| 252 |
return false; |
261 |
return false; |
| 253 |
} |
262 |
} |
| 254 |
return super.isPageComplete(); |
263 |
return super.isPageComplete(); |
| 255 |
} |
264 |
} |
| 256 |
|
265 |
|
| 257 |
void updatePreviewTable(List<AbstractQueryHit> hits, MultiStatus queryStatus) { |
266 |
void updatePreviewTable(List<AbstractQueryHit> hits, MultiStatus queryStatus) { |
| 258 |
if(previewTable.isDisposed()) { |
267 |
if (previewTable.isDisposed()) { |
| 259 |
return; |
268 |
return; |
| 260 |
} |
269 |
} |
| 261 |
|
270 |
|
| 262 |
previewTable.removeAll(); |
271 |
previewTable.removeAll(); |
| 263 |
|
272 |
|
| 264 |
if(hits!=null) { |
273 |
if (hits != null) { |
| 265 |
for (AbstractQueryHit hit : hits) { |
274 |
for (AbstractQueryHit hit : hits) { |
| 266 |
TableItem item = new TableItem(previewTable, SWT.NONE); |
275 |
TableItem item = new TableItem(previewTable, SWT.NONE); |
| 267 |
if(hit.getId()!=null) { |
276 |
if (hit.getId() != null) { |
| 268 |
item.setText(0, hit.getId()); |
277 |
item.setText(0, hit.getId()); |
| 269 |
if(hit.getDescription()!=null) { |
278 |
if (hit.getDescription() != null) { |
| 270 |
item.setText(1, hit.getDescription()); |
279 |
item.setText(1, hit.getDescription()); |
| 271 |
} |
280 |
} |
| 272 |
} |
281 |
} |
| 273 |
} |
282 |
} |
| 274 |
} |
283 |
} |
| 275 |
|
284 |
|
| 276 |
if(queryStatus.isOK()) { |
285 |
if (queryStatus.isOK()) { |
| 277 |
setErrorMessage(null); |
286 |
setErrorMessage(null); |
| 278 |
setPageComplete(true); |
287 |
setPageComplete(true); |
| 279 |
} else { |
288 |
} else { |
|
Lines 288-295
Link Here
|
| 288 |
|
297 |
|
| 289 |
private final class UpdatePreviewJob extends Job { |
298 |
private final class UpdatePreviewJob extends Job { |
| 290 |
private volatile String url; |
299 |
private volatile String url; |
|
|
300 |
|
| 291 |
private volatile String regexp; |
301 |
private volatile String regexp; |
|
|
302 |
|
| 292 |
private volatile Map<String, String> params; |
303 |
private volatile Map<String, String> params; |
|
|
304 |
|
| 293 |
private volatile boolean active = false; |
305 |
private volatile boolean active = false; |
| 294 |
|
306 |
|
| 295 |
private UpdatePreviewJob(String name) { |
307 |
private UpdatePreviewJob(String name) { |
|
Lines 312-342
Link Here
|
| 312 |
String evaluatedUrl = WebRepositoryConnector.evaluateParams(url, params, repository); |
324 |
String evaluatedUrl = WebRepositoryConnector.evaluateParams(url, params, repository); |
| 313 |
active = true; |
325 |
active = true; |
| 314 |
do { |
326 |
do { |
| 315 |
final MultiStatus queryStatus = new MultiStatus(TasksUiPlugin.PLUGIN_ID, IStatus.OK, "Query result", null); |
327 |
final MultiStatus queryStatus = new MultiStatus(TasksUiPlugin.PLUGIN_ID, IStatus.OK, "Query result", |
|
|
328 |
null); |
| 316 |
final List<AbstractQueryHit> queryHits = new ArrayList<AbstractQueryHit>(); |
329 |
final List<AbstractQueryHit> queryHits = new ArrayList<AbstractQueryHit>(); |
| 317 |
try { |
330 |
try { |
| 318 |
if(webPage==null) { |
331 |
if (webPage == null) { |
| 319 |
webPage = WebRepositoryConnector.fetchResource(evaluatedUrl, repository.getUserName(), repository.getPassword()); |
332 |
HashMap<String, String> loginParams = new HashMap<String, String>(); |
|
|
333 |
loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL, WebRepositoryConnector |
| 334 |
.evaluateParams(repository.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL), |
| 335 |
params, repository)); |
| 336 |
loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP, WebRepositoryConnector |
| 337 |
.evaluateParams(repository |
| 338 |
.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP), params, |
| 339 |
repository)); |
| 340 |
loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD, WebRepositoryConnector |
| 341 |
.evaluateParams(repository |
| 342 |
.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD), params, |
| 343 |
repository)); |
| 344 |
loginParams.put(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL, WebRepositoryConnector |
| 345 |
.evaluateParams(repository |
| 346 |
.getProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL), params, |
| 347 |
repository)); |
| 348 |
for (Map.Entry<String, String> entry : repository.getProperties().entrySet()) { |
| 349 |
if (entry.getKey().startsWith(WebRepositoryConnector.LOGIN_REQUEST_PARAM_PREFIX)) { |
| 350 |
loginParams.put(entry.getKey(), entry.getValue()); |
| 351 |
} |
| 352 |
} |
| 353 |
webPage = WebRepositoryConnector.fetchResource(evaluatedUrl, repository.getUserName(), |
| 354 |
repository.getPassword(), loginParams, params, repository); |
| 320 |
} |
355 |
} |
| 321 |
|
356 |
|
| 322 |
QueryHitCollector collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager().getTaskList()) { |
357 |
QueryHitCollector collector = new QueryHitCollector(TasksUiPlugin.getTaskListManager() |
|
|
358 |
.getTaskList()) { |
| 323 |
@Override |
359 |
@Override |
| 324 |
public void addMatch(AbstractQueryHit hit) { |
360 |
public void addMatch(AbstractQueryHit hit) { |
| 325 |
queryHits.add(hit); |
361 |
queryHits.add(hit); |
| 326 |
} |
362 |
} |
| 327 |
}; |
363 |
}; |
| 328 |
|
364 |
|
| 329 |
IStatus status = WebRepositoryConnector.performQuery(webPage, evaluatedRegexp, null, monitor, collector, repository); |
365 |
IStatus status = WebRepositoryConnector.performQuery(webPage, evaluatedRegexp, null, monitor, |
| 330 |
if(!status.isOK()) { |
366 |
collector, repository); |
|
|
367 |
if (!status.isOK()) { |
| 331 |
queryStatus.add(status); |
368 |
queryStatus.add(status); |
| 332 |
} |
369 |
} |
| 333 |
|
370 |
|
| 334 |
} catch (final IOException ex) { |
371 |
} catch (final IOException ex) { |
| 335 |
queryStatus.add(new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, IStatus.ERROR, |
372 |
queryStatus.add(new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, IStatus.ERROR, |
| 336 |
"Unable to fetch resource: "+ex.getMessage(), null)); |
373 |
"Unable to fetch resource: " + ex.getMessage(), null)); |
| 337 |
} catch (final Exception ex) { |
374 |
} catch (final Exception ex) { |
| 338 |
queryStatus.add(new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, IStatus.ERROR, |
375 |
queryStatus.add(new Status(IStatus.ERROR, TasksUiPlugin.PLUGIN_ID, IStatus.ERROR, "Parsing error: " |
| 339 |
"Parsing error: "+ex.getMessage(), null)); |
376 |
+ ex.getMessage(), null)); |
| 340 |
} |
377 |
} |
| 341 |
|
378 |
|
| 342 |
Display.getDefault().asyncExec(new Runnable() { |
379 |
Display.getDefault().asyncExec(new Runnable() { |
|
Lines 344-354
Link Here
|
| 344 |
updatePreviewTable(queryHits, queryStatus); |
381 |
updatePreviewTable(queryHits, queryStatus); |
| 345 |
} |
382 |
} |
| 346 |
}); |
383 |
}); |
| 347 |
} while(!currentRegexp.equals(currentRegexp) && !monitor.isCanceled()); |
384 |
} while (!currentRegexp.equals(currentRegexp) && !monitor.isCanceled()); |
| 348 |
active = false; |
385 |
active = false; |
| 349 |
return Status.OK_STATUS; |
386 |
return Status.OK_STATUS; |
| 350 |
} |
387 |
} |
| 351 |
} |
388 |
} |
| 352 |
|
389 |
|
| 353 |
} |
390 |
} |
| 354 |
|
|
|