838ea606ceacc59e8571d23c1b7627ecba727f65
[jalview.git] / src / jalview / ws / jws2 / SequenceAnnotationWSClient.java
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 jalview.api.AlignCalcWorkerI;
24 import jalview.gui.AlignFrame;
25 import jalview.gui.Desktop;
26 import jalview.gui.JvSwingUtils;
27 import jalview.util.MessageManager;
28 import jalview.ws.api.ServiceWithParameters;
29 import jalview.ws.params.AutoCalcSetting;
30 import jalview.ws.params.WsParamSetI;
31 import jalview.ws.uimodel.AlignAnalysisUIText;
32
33 import java.awt.event.ActionEvent;
34 import java.awt.event.ActionListener;
35 import java.util.List;
36
37 import javax.swing.JMenu;
38 import javax.swing.JMenuItem;
39
40 /**
41  * @author jprocter
42  * 
43  */
44 public class SequenceAnnotationWSClient extends Jws2Client
45 {
46   /**
47    * initialise a client so its attachWSMenuEntry method can be called.
48    */
49   public SequenceAnnotationWSClient()
50   {
51     // TODO Auto-generated constructor stub
52   }
53
54   public SequenceAnnotationWSClient(final ServiceWithParameters sh,
55           AlignFrame alignFrame, WsParamSetI preset, boolean editParams)
56   {
57     super(alignFrame, preset, null);
58     initSequenceAnnotationWSClient(sh, alignFrame, preset, editParams);
59   }
60
61   // dan think. Do I need to change this method to run RNAalifold through the
62   // GUI
63
64   private void initSequenceAnnotationWSClient(final ServiceWithParameters sh,
65       AlignFrame alignFrame, final WsParamSetI preset, boolean editParams)
66   {
67     // dan changed! dan test. comment out if conditional
68     // if (alignFrame.getViewport().getAlignment().isNucleotide())
69     // {
70     // JvOptionPane.showMessageDialog(Desktop.desktop, sh.serviceType
71     // + " can only be used\nfor amino acid alignments.",
72     // "Wrong type of sequences!", JvOptionPane.WARNING_MESSAGE);
73     // return;
74     //
75     // }
76     AlignAnalysisUIText aaui = sh.getAlignAnalysisUI();
77     if (aaui != null)
78     {
79       Class clientClass = aaui.getClient();
80
81       // Build an AACon style client - take alignment, return annotation for
82       // columns
83
84       List<AlignCalcWorkerI> clnts = alignFrame.getViewport()
85           .getCalcManager()
86           .getWorkersOfClass(SeqAnnotationServiceCalcWorker.class);
87
88       SeqAnnotationServiceCalcWorker tmpworker = null;
89       if (clnts != null)
90       {
91         for (AlignCalcWorkerI _worker : clnts)
92         {
93           tmpworker = (SeqAnnotationServiceCalcWorker) _worker;
94           if (tmpworker.hasService()
95               && tmpworker.getService().getClass().equals(clientClass))
96           {
97             break;
98           }
99           tmpworker = null;
100         }
101       }
102       final var worker = tmpworker;
103       if (worker == null)
104       {
105         processParams(sh, editParams).thenAccept((startJob) -> {
106           if (startJob)
107           {
108             final SeqAnnotationServiceCalcWorker worker_;
109             try
110             {
111               worker_ = new SeqAnnotationServiceCalcWorker(sh, alignFrame, this.preset,
112                   paramset);
113             } catch (Exception x)
114             {
115               x.printStackTrace();
116               throw new Error(
117                   MessageManager.getString("error.implementation_error"),
118                   x);
119             }
120             alignFrame.getViewport().getCalcManager().registerWorker(worker_);
121                 // also starts the worker
122             startSeqAnnotationWorker(sh, alignFrame, preset, editParams);
123           }
124         });
125       }
126       else
127       {
128         WsParamSetI preset_;
129         if (editParams)
130         {
131           paramset = worker.getArguments();
132           preset_ = worker.getPreset();
133         }
134         else
135         {
136           preset_ = preset;
137         }
138         processParams(sh, editParams, true).thenAccept((startJob) -> {
139           if (startJob)
140           {
141             // reinstate worker if it was blacklisted (might have happened due
142             // to
143             // invalid parameters)
144             alignFrame.getViewport().getCalcManager().enableWorker(worker);
145             worker.updateParameters(this.preset, paramset);
146             startSeqAnnotationWorker(sh, alignFrame, preset_, editParams);
147           }
148         });
149
150         if (!processParams(sh, editParams, true).toCompletableFuture().join())
151         {
152           return;
153         }
154       }
155     }
156     else
157     {
158       startSeqAnnotationWorker(sh, alignFrame, preset, editParams);
159     }
160   }
161
162   private void startSeqAnnotationWorker(ServiceWithParameters sh,
163       AlignFrame alignFrame, WsParamSetI preset, boolean editParams)
164   {
165     if (!sh.isInteractiveUpdate())
166     {
167       // build IUPred style client. take sequences, returns annotation per
168       // sequence.
169       processParams(sh, editParams).thenAccept((startJob) -> {
170         if (startJob)
171         {
172           alignFrame.getViewport().getCalcManager().startWorker(
173               new SeqAnnotationServiceCalcWorker(sh, alignFrame, preset, paramset));
174         }
175       });
176     }
177   }
178
179   public SequenceAnnotationWSClient(AutoCalcSetting fave,
180           AlignFrame alignFrame, boolean b)
181   {
182     super(alignFrame, fave.getPreset(), fave.getArgumentSet());
183     initSequenceAnnotationWSClient(fave.getService(), alignFrame,
184             fave.getPreset(), b);
185   }
186
187   /*
188    * (non-Javadoc)
189    * 
190    * @see jalview.ws.jws2.Jws2Client#attachWSMenuEntry(javax.swing.JMenu,
191    * jalview.ws.jws2.jabaws2.Jws2Instance, jalview.gui.AlignFrame)
192    */
193   @Override
194   public void attachWSMenuEntry(JMenu wsmenu,
195           final ServiceWithParameters service,
196           final AlignFrame alignFrame)
197   {
198     if (Jws2ClientFactory.registerAAConWSInstance(wsmenu,
199             service, alignFrame))
200     {
201       // Alignment dependent analysis calculation WS gui
202       return;
203     }
204     boolean hasparams = service.hasParameters();
205     String calcName = service.getName();
206     if (calcName.endsWith("WS"))
207     {
208       // Remove "WS" suffix
209       calcName = calcName.substring(0, calcName.length() - 2);
210     }
211
212     JMenuItem annotservice = new JMenuItem(MessageManager.formatMessage(
213             "label.calcname_with_default_settings", new String[]
214             { calcName }));
215     annotservice.addActionListener(new ActionListener()
216     {
217
218       @Override
219       public void actionPerformed(ActionEvent e)
220       {
221         new SequenceAnnotationWSClient(service, alignFrame,
222                 null, false);
223       }
224     });
225     wsmenu.add(annotservice);
226     if (hasparams)
227     {
228       // only add these menu options if the service has user-modifiable
229       // arguments
230       annotservice = new JMenuItem(
231               MessageManager.getString("label.edit_settings_and_run"));
232       annotservice.setToolTipText(MessageManager.getString(
233               "label.view_and_change_parameters_before_running_calculation"));
234
235       annotservice.addActionListener(new ActionListener()
236       {
237         @Override
238         public void actionPerformed(ActionEvent e)
239         {
240           new SequenceAnnotationWSClient(service, alignFrame,
241                   null, true);
242         }
243       });
244       wsmenu.add(annotservice);
245       List<WsParamSetI> presets = service.getParamStore().getPresets();
246       if (presets != null && presets.size() > 0)
247       {
248         JMenu presetlist = new JMenu(MessageManager
249                 .formatMessage("label.run_with_preset", new String[]
250                 { calcName }));
251
252         for (final WsParamSetI preset : presets)
253         {
254           final JMenuItem methodR = new JMenuItem(preset.getName());
255           methodR.setToolTipText(JvSwingUtils.wrapTooltip(true, "<strong>"
256                   + (preset.isModifiable()
257                           ? MessageManager.getString("label.user_preset")
258                           : MessageManager
259                                   .getString("label.service_preset"))
260                   + "</strong><br/>" + preset.getDescription()));
261           methodR.addActionListener(new ActionListener()
262           {
263             @Override
264             public void actionPerformed(ActionEvent e)
265             {
266               new SequenceAnnotationWSClient(service,
267                       alignFrame, preset,
268                       false);
269             }
270
271           });
272           presetlist.add(methodR);
273         }
274         wsmenu.add(presetlist);
275       }
276
277     }
278     else
279     {
280       annotservice = new JMenuItem(
281               MessageManager.getString("label.view_documentation"));
282       if (service != null && service.hasDocumentationUrl())
283       {
284         annotservice.addActionListener(new ActionListener()
285         {
286
287           @Override
288           public void actionPerformed(ActionEvent arg0)
289           {
290             Desktop.getInstance().showUrl(service.getDocumentationUrl());
291           }
292         });
293         annotservice.setToolTipText(
294                 JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage(
295                         "label.view_service_doc_url", new String[]
296                         { service.getDocumentationUrl(),
297                             service.getDocumentationUrl() })));
298         wsmenu.add(annotservice);
299       }
300     }
301   }
302 }