Class |
Line # |
Actions |
|||
---|---|---|---|---|---|
MsaWSClient | 53 | 94 | 40 |
1 | /* | |
2 | * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) | |
3 | * Copyright (C) $$Year-Rel$$ The Jalview Authors | |
4 | * | |
5 | * This file is part of Jalview. | |
6 | * | |
7 | * Jalview is free software: you can redistribute it and/or | |
8 | * modify it under the terms of the GNU General Public License | |
9 | * as published by the Free Software Foundation, either version 3 | |
10 | * of the License, or (at your option) any later version. | |
11 | * | |
12 | * Jalview is distributed in the hope that it will be useful, but | |
13 | * WITHOUT ANY WARRANTY; without even the implied warranty | |
14 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
15 | * PURPOSE. See the GNU General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU General Public License | |
18 | * along with Jalview. If not, see <http://www.gnu.org/licenses/>. | |
19 | * The Jalview Authors are detailed in the 'AUTHORS' file. | |
20 | */ | |
21 | package jalview.ws.jws2; | |
22 | ||
23 | import java.util.Locale; | |
24 | ||
25 | import java.awt.event.ActionEvent; | |
26 | import java.awt.event.ActionListener; | |
27 | import java.awt.event.MouseAdapter; | |
28 | import java.awt.event.MouseEvent; | |
29 | import java.util.List; | |
30 | ||
31 | import javax.swing.JMenu; | |
32 | import javax.swing.JMenuItem; | |
33 | import javax.swing.ToolTipManager; | |
34 | ||
35 | import compbio.data.msa.MsaWS; | |
36 | import compbio.metadata.Argument; | |
37 | import jalview.datamodel.AlignmentI; | |
38 | import jalview.datamodel.AlignmentView; | |
39 | import jalview.gui.AlignFrame; | |
40 | import jalview.gui.Desktop; | |
41 | import jalview.gui.JvOptionPane; | |
42 | import jalview.gui.JvSwingUtils; | |
43 | import jalview.util.MessageManager; | |
44 | import jalview.ws.jws2.jabaws2.Jws2Instance; | |
45 | import jalview.ws.params.WsParamSetI; | |
46 | ||
47 | /** | |
48 | * DOCUMENT ME! | |
49 | * | |
50 | * @author $author$ | |
51 | * @version $Revision$ | |
52 | */ | |
53 | public class MsaWSClient extends Jws2Client | |
54 | { | |
55 | /** | |
56 | * server is a WSDL2Java generated stub for an archetypal MsaWSI service. | |
57 | */ | |
58 | MsaWS server; | |
59 | ||
60 | 0 | public MsaWSClient(Jws2Instance sh, String altitle, |
61 | jalview.datamodel.AlignmentView msa, boolean submitGaps, | |
62 | boolean preserveOrder, AlignmentI seqdataset, | |
63 | AlignFrame _alignFrame) | |
64 | { | |
65 | 0 | this(sh, null, null, false, altitle, msa, submitGaps, preserveOrder, |
66 | seqdataset, _alignFrame); | |
67 | // TODO Auto-generated constructor stub | |
68 | } | |
69 | ||
70 | 0 | public MsaWSClient(Jws2Instance sh, WsParamSetI preset, String altitle, |
71 | jalview.datamodel.AlignmentView msa, boolean submitGaps, | |
72 | boolean preserveOrder, AlignmentI seqdataset, | |
73 | AlignFrame _alignFrame) | |
74 | { | |
75 | 0 | this(sh, preset, null, false, altitle, msa, submitGaps, preserveOrder, |
76 | seqdataset, _alignFrame); | |
77 | // TODO Auto-generated constructor stub | |
78 | } | |
79 | ||
80 | /** | |
81 | * Creates a new MsaWSClient object that uses a service given by an externally | |
82 | * retrieved ServiceHandle | |
83 | * | |
84 | * @param sh | |
85 | * service handle of type AbstractName(MsaWS) | |
86 | * @param altitle | |
87 | * DOCUMENT ME! | |
88 | * @param msa | |
89 | * DOCUMENT ME! | |
90 | * @param submitGaps | |
91 | * DOCUMENT ME! | |
92 | * @param preserveOrder | |
93 | * DOCUMENT ME! | |
94 | */ | |
95 | ||
96 | 0 | public MsaWSClient(Jws2Instance sh, WsParamSetI preset, |
97 | List<Argument> arguments, boolean editParams, String altitle, | |
98 | jalview.datamodel.AlignmentView msa, boolean submitGaps, | |
99 | boolean preserveOrder, AlignmentI seqdataset, | |
100 | AlignFrame _alignFrame) | |
101 | { | |
102 | 0 | super(_alignFrame, preset, arguments); |
103 | 0 | if (!processParams(sh, editParams)) |
104 | { | |
105 | 0 | return; |
106 | } | |
107 | ||
108 | 0 | if (!(sh.service instanceof MsaWS)) |
109 | { | |
110 | // redundant at mo - but may change | |
111 | 0 | JvOptionPane.showMessageDialog(Desktop.desktop, |
112 | MessageManager.formatMessage( | |
113 | "label.service_called_is_not_msa_service", | |
114 | new String[] | |
115 | { sh.serviceType }), | |
116 | MessageManager.getString("label.internal_jalview_error"), | |
117 | JvOptionPane.WARNING_MESSAGE); | |
118 | ||
119 | 0 | return; |
120 | } | |
121 | 0 | server = (MsaWS) sh.service; |
122 | 0 | if ((wsInfo = setWebService(sh, false)) == null) |
123 | { | |
124 | 0 | JvOptionPane.showMessageDialog(Desktop.desktop, MessageManager |
125 | .formatMessage("label.msa_service_is_unknown", new String[] | |
126 | { sh.serviceType }), | |
127 | MessageManager.getString("label.internal_jalview_error"), | |
128 | JvOptionPane.WARNING_MESSAGE); | |
129 | ||
130 | 0 | return; |
131 | } | |
132 | ||
133 | 0 | startMsaWSClient(altitle, msa, submitGaps, preserveOrder, seqdataset); |
134 | ||
135 | } | |
136 | ||
137 | 4389 | public MsaWSClient() |
138 | { | |
139 | 4389 | super(); |
140 | // add a class reference to the list | |
141 | } | |
142 | ||
143 | 0 | private void startMsaWSClient(String altitle, AlignmentView msa, |
144 | boolean submitGaps, boolean preserveOrder, AlignmentI seqdataset) | |
145 | { | |
146 | // if (!locateWebService()) | |
147 | // { | |
148 | // return; | |
149 | // } | |
150 | ||
151 | 0 | wsInfo.setProgressText(((submitGaps) ? "Re-alignment" : "Alignment") |
152 | + " of " + altitle + "\nJob details\n"); | |
153 | 0 | String jobtitle = WebServiceName.toLowerCase(Locale.ROOT); |
154 | 0 | if (jobtitle.endsWith("alignment")) |
155 | { | |
156 | 0 | if (submitGaps && (!jobtitle.endsWith("realignment") |
157 | || jobtitle.indexOf("profile") == -1)) | |
158 | { | |
159 | 0 | int pos = jobtitle.indexOf("alignment"); |
160 | 0 | jobtitle = WebServiceName.substring(0, pos) + "re-alignment of " |
161 | + altitle; | |
162 | } | |
163 | else | |
164 | { | |
165 | 0 | jobtitle = WebServiceName + " of " + altitle; |
166 | } | |
167 | } | |
168 | else | |
169 | { | |
170 | 0 | jobtitle = WebServiceName + (submitGaps ? " re" : " ") |
171 | + "alignment of " + altitle; | |
172 | } | |
173 | ||
174 | 0 | MsaWSThread msathread = new MsaWSThread(server, preset, paramset, WsURL, |
175 | wsInfo, alignFrame, WebServiceName, jobtitle, msa, submitGaps, | |
176 | preserveOrder, seqdataset); | |
177 | 0 | if (msathread.hasValidInput()) |
178 | { | |
179 | 0 | wsInfo.setthisService(msathread); |
180 | 0 | wsInfo.setVisible(true); |
181 | 0 | msathread.start(); |
182 | } | |
183 | else | |
184 | { | |
185 | 0 | wsInfo.setVisible(false); |
186 | 0 | JvOptionPane.showMessageDialog(alignFrame, |
187 | MessageManager.getString("info.invalid_msa_input_mininfo"), | |
188 | MessageManager.getString("info.invalid_msa_notenough"), | |
189 | JvOptionPane.INFORMATION_MESSAGE); | |
190 | } | |
191 | } | |
192 | ||
193 | 0 | protected String getServiceActionKey() |
194 | { | |
195 | 0 | return "MsaWS"; |
196 | } | |
197 | ||
198 | 0 | protected String getServiceActionDescription() |
199 | { | |
200 | 0 | return "Multiple Sequence Alignment"; |
201 | } | |
202 | ||
203 | /** | |
204 | * look at ourselves and work out if we are a service that can take a profile | |
205 | * and align to it | |
206 | * | |
207 | * @return true if we can send gapped sequences to the alignment service | |
208 | */ | |
209 | 8778 | private boolean canSubmitGaps() |
210 | { | |
211 | // TODO: query service or extract service handle props to check if we can | |
212 | // realign | |
213 | 8778 | return (WebServiceName.indexOf("lustal") > -1); // cheat! |
214 | } | |
215 | ||
216 | 4389 | @Override |
217 | public void attachWSMenuEntry(JMenu rmsawsmenu, | |
218 | final Jws2Instance service, final AlignFrame af) | |
219 | { | |
220 | 4389 | if (registerAAConWSInstance(rmsawsmenu, service, af)) |
221 | { | |
222 | // Alignment dependent analysis calculation WS gui | |
223 | 0 | return; |
224 | } | |
225 | 4389 | setWebService(service, true); // headless |
226 | 4389 | boolean finished = true, submitGaps = false; |
227 | 4389 | JMenu msawsmenu = rmsawsmenu; |
228 | 4389 | String svcname = WebServiceName; |
229 | 4389 | if (svcname.endsWith("WS")) |
230 | { | |
231 | 4389 | svcname = svcname.substring(0, svcname.length() - 2); |
232 | } | |
233 | 4389 | String calcName = svcname + " "; |
234 | 4389 | if (canSubmitGaps()) |
235 | { | |
236 | 1296 | msawsmenu = new JMenu(svcname); |
237 | 1296 | rmsawsmenu.add(msawsmenu); |
238 | 1296 | calcName = ""; |
239 | } | |
240 | 4389 | boolean hasparams = service.hasParameters(); |
241 | 4389 | do |
242 | { | |
243 | 5685 | String action = "Align "; |
244 | 5685 | if (submitGaps == true) |
245 | { | |
246 | 1296 | action = "Realign "; |
247 | 1296 | msawsmenu = new JMenu(MessageManager |
248 | .formatMessage("label.realign_with_params", new String[] | |
249 | { svcname })); | |
250 | 1296 | msawsmenu.setToolTipText(MessageManager |
251 | .getString("label.align_sequences_to_existing_alignment")); | |
252 | 1296 | rmsawsmenu.add(msawsmenu); |
253 | } | |
254 | 5685 | final boolean withGaps = submitGaps; |
255 | ||
256 | 5685 | JMenuItem method = new JMenuItem(MessageManager.formatMessage( |
257 | "label.calcname_with_default_settings", new String[] | |
258 | { calcName })); | |
259 | 5685 | method.setToolTipText(MessageManager.formatMessage( |
260 | "label.action_with_default_settings", new String[] | |
261 | { action })); | |
262 | ||
263 | 5685 | method.addActionListener(new ActionListener() |
264 | { | |
265 | 0 | @Override |
266 | public void actionPerformed(ActionEvent e) | |
267 | { | |
268 | 0 | AlignmentView msa = af.gatherSequencesForAlignment(); |
269 | ||
270 | 0 | if (msa != null) |
271 | { | |
272 | 0 | new MsaWSClient(service, af.getTitle(), msa, withGaps, true, |
273 | af.getViewport().getAlignment().getDataset(), af); | |
274 | } | |
275 | ||
276 | } | |
277 | }); | |
278 | 5685 | msawsmenu.add(method); |
279 | 5685 | if (hasparams) |
280 | { | |
281 | // only add these menu options if the service has user-modifiable | |
282 | // arguments | |
283 | 5684 | method = new JMenuItem( |
284 | MessageManager.getString("label.edit_settings_and_run")); | |
285 | 5684 | method.setToolTipText(MessageManager.getString( |
286 | "label.view_and_change_parameters_before_alignment")); | |
287 | ||
288 | 5684 | method.addActionListener(new ActionListener() |
289 | { | |
290 | 0 | @Override |
291 | public void actionPerformed(ActionEvent e) | |
292 | { | |
293 | 0 | AlignmentView msa = af.gatherSequencesForAlignment(); |
294 | 0 | if (msa != null) |
295 | { | |
296 | 0 | startJob(service, af, withGaps, msa); |
297 | } | |
298 | ||
299 | } | |
300 | }); | |
301 | 5684 | msawsmenu.add(method); |
302 | 5684 | List<WsParamSetI> presets = service.getParamStore().getPresets(); |
303 | 5684 | if (presets != null && presets.size() > 0) |
304 | { | |
305 | 4695 | JMenu presetlist = new JMenu(MessageManager.formatMessage( |
306 | "label.run_with_preset_params", new String[] | |
307 | { calcName })); | |
308 | ||
309 | 4695 | final int showToolTipFor = ToolTipManager.sharedInstance() |
310 | .getDismissDelay(); | |
311 | 4695 | for (final WsParamSetI preSet : presets) |
312 | { | |
313 | 15697 | final JMenuItem methodR = new JMenuItem(preSet.getName()); |
314 | 15697 | final int QUICK_TOOLTIP = 1500; |
315 | // JAL-1582 shorten tooltip display time in these menu items as | |
316 | // they can obscure other options | |
317 | 15697 | methodR.addMouseListener(new MouseAdapter() |
318 | { | |
319 | 0 | @Override |
320 | public void mouseEntered(MouseEvent e) | |
321 | { | |
322 | 0 | ToolTipManager.sharedInstance() |
323 | .setDismissDelay(QUICK_TOOLTIP); | |
324 | } | |
325 | ||
326 | 0 | @Override |
327 | public void mouseExited(MouseEvent e) | |
328 | { | |
329 | 0 | ToolTipManager.sharedInstance() |
330 | .setDismissDelay(showToolTipFor); | |
331 | } | |
332 | ||
333 | }); | |
334 | 15697 | String tooltip = JvSwingUtils.wrapTooltip(true, "<strong>" |
335 | 15697 | + (preSet.isModifiable() |
336 | ? MessageManager.getString("label.user_preset") | |
337 | : MessageManager | |
338 | .getString("label.service_preset")) | |
339 | + "</strong><br/>" + preSet.getDescription()); | |
340 | 15697 | methodR.setToolTipText(tooltip); |
341 | 15697 | methodR.addActionListener(new ActionListener() |
342 | { | |
343 | 0 | @Override |
344 | public void actionPerformed(ActionEvent e) | |
345 | { | |
346 | 0 | AlignmentView msa = af.gatherSequencesForAlignment(); |
347 | ||
348 | 0 | if (msa != null) |
349 | { | |
350 | 0 | MsaWSClient msac = new MsaWSClient(service, preSet, |
351 | af.getTitle(), msa, false, true, | |
352 | af.getViewport().getAlignment().getDataset(), af); | |
353 | } | |
354 | ||
355 | } | |
356 | ||
357 | }); | |
358 | 15697 | presetlist.add(methodR); |
359 | } | |
360 | 4695 | msawsmenu.add(presetlist); |
361 | } | |
362 | } | |
363 | 5685 | if (!submitGaps && canSubmitGaps()) |
364 | { | |
365 | 1296 | submitGaps = true; |
366 | 1296 | finished = false; |
367 | } | |
368 | else | |
369 | { | |
370 | 4389 | finished = true; |
371 | } | |
372 | 5685 | } while (!finished); |
373 | } | |
374 | ||
375 | 0 | protected void startJob(final Jws2Instance service, final AlignFrame af, |
376 | final boolean withGaps, AlignmentView msa) | |
377 | { | |
378 | 0 | try |
379 | { | |
380 | 0 | new MsaWSClient(service, null, null, true, af.getTitle(), msa, |
381 | withGaps, true, af.getViewport().getAlignment().getDataset(), | |
382 | af); | |
383 | } catch (Exception e) | |
384 | { | |
385 | 0 | JvOptionPane.showMessageDialog(alignFrame, e.getMessage(), |
386 | MessageManager.getString("label.state_job_error"), | |
387 | JvOptionPane.WARNING_MESSAGE); | |
388 | ||
389 | } | |
390 | } | |
391 | } |