distinguish between userdefined parameter set job and preset job
[jalview.git] / src / jalview / ws / jws2 / MsaWSClient.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)
3  * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
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 of the License, or (at your option) any later version.
10  * 
11  * Jalview is distributed in the hope that it will be useful, but 
12  * WITHOUT ANY WARRANTY; without even the implied warranty 
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14  * PURPOSE.  See the GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 package jalview.ws.jws2;
19
20 import java.awt.event.ActionEvent;
21 import java.awt.event.ActionListener;
22 import java.util.List;
23
24 import javax.swing.*;
25
26 import jalview.datamodel.*;
27 import jalview.gui.*;
28 import compbio.data.msa.MsaWS;
29 import compbio.metadata.Argument;
30 import compbio.metadata.Preset;
31 import compbio.metadata.PresetManager;
32 import jalview.ws.jws2.Jws2Discoverer.Jws2Instance;
33
34 /**
35  * DOCUMENT ME!
36  * 
37  * @author $author$
38  * @version $Revision$
39  */
40 public class MsaWSClient extends Jws2Client
41 {
42   /**
43    * server is a WSDL2Java generated stub for an archetypal MsaWSI service.
44    */
45   MsaWS server;
46
47   AlignFrame alignFrame;
48
49   private Preset preset;
50
51   private List<Argument> paramset;
52
53   public MsaWSClient(Jws2Discoverer.Jws2Instance sh, String altitle,
54           jalview.datamodel.AlignmentView msa, boolean submitGaps,
55           boolean preserveOrder, Alignment seqdataset,
56           AlignFrame _alignFrame)
57   {
58     this(sh, null, null, false, altitle, msa, submitGaps, preserveOrder,
59             seqdataset, _alignFrame);
60     // TODO Auto-generated constructor stub
61   }
62
63   public MsaWSClient(Jws2Discoverer.Jws2Instance sh, Preset preset,
64           String altitle, jalview.datamodel.AlignmentView msa,
65           boolean submitGaps, boolean preserveOrder, Alignment seqdataset,
66           AlignFrame _alignFrame)
67   {
68     this(sh, preset, null, false, altitle, msa, submitGaps, preserveOrder,
69             seqdataset, _alignFrame);
70     // TODO Auto-generated constructor stub
71   }
72
73   /**
74    * Creates a new MsaWSClient object that uses a service given by an externally
75    * retrieved ServiceHandle
76    * 
77    * @param sh
78    *          service handle of type AbstractName(MsaWS)
79    * @param altitle
80    *          DOCUMENT ME!
81    * @param msa
82    *          DOCUMENT ME!
83    * @param submitGaps
84    *          DOCUMENT ME!
85    * @param preserveOrder
86    *          DOCUMENT ME!
87    */
88
89   public MsaWSClient(Jws2Discoverer.Jws2Instance sh, Preset preset,
90           List<Argument> arguments, boolean editParams, String altitle,
91           jalview.datamodel.AlignmentView msa, boolean submitGaps,
92           boolean preserveOrder, Alignment seqdataset,
93           AlignFrame _alignFrame)
94   {
95     super();
96     alignFrame = _alignFrame;
97     if (!(sh.service instanceof MsaWS))
98     {
99       // redundant at mo - but may change
100       JOptionPane
101               .showMessageDialog(
102                       Desktop.desktop,
103                       "The Service called \n"
104                               + sh.serviceType
105                               + "\nis not a \nMultiple Sequence Alignment Service !",
106                       "Internal Jalview Error", JOptionPane.WARNING_MESSAGE);
107
108       return;
109     }
110     server = sh.service;
111     this.preset = preset;
112     this.paramset = arguments;
113     if (editParams)
114     {
115       WsJobParameters jobParams = new WsJobParameters(sh, preset);
116       if (!jobParams.showRunDialog())
117       {
118         return;
119       }
120       if ((this.preset = jobParams.getPreset())==null)
121       {
122         paramset = jobParams.getJobParams();
123       } else {
124         paramset = null; // no user supplied parameters.
125       }
126     }
127
128     if ((wsInfo = setWebService(sh, false)) == null)
129     {
130       JOptionPane.showMessageDialog(Desktop.desktop,
131               "The Multiple Sequence Alignment Service named "
132                       + sh.serviceType + " is unknown",
133               "Internal Jalview Error", JOptionPane.WARNING_MESSAGE);
134
135       return;
136     }
137     startMsaWSClient(altitle, msa, submitGaps, preserveOrder, seqdataset);
138
139   }
140
141   public MsaWSClient()
142   {
143     super();
144     // add a class reference to the list
145   }
146
147   private void startMsaWSClient(String altitle, AlignmentView msa,
148           boolean submitGaps, boolean preserveOrder, Alignment seqdataset)
149   {
150     // if (!locateWebService())
151     // {
152     // return;
153     // }
154
155     wsInfo.setProgressText(((submitGaps) ? "Re-alignment" : "Alignment")
156             + " of " + altitle + "\nJob details\n");
157     String jobtitle = WebServiceName.toLowerCase();
158     if (jobtitle.endsWith("alignment"))
159     {
160       if (submitGaps
161               && (!jobtitle.endsWith("realignment") || jobtitle
162                       .indexOf("profile") == -1))
163       {
164         int pos = jobtitle.indexOf("alignment");
165         jobtitle = WebServiceName.substring(0, pos) + "re-alignment of "
166                 + altitle;
167       }
168       else
169       {
170         jobtitle = WebServiceName + " of " + altitle;
171       }
172     }
173     else
174     {
175       jobtitle = WebServiceName + (submitGaps ? " re" : " ")
176               + "alignment of " + altitle;
177     }
178
179     MsaWSThread msathread = new MsaWSThread(server, preset, paramset,
180             WsURL, wsInfo, alignFrame, WebServiceName, jobtitle, msa,
181             submitGaps, preserveOrder, seqdataset);
182     wsInfo.setthisService(msathread);
183     msathread.start();
184   }
185
186   protected String getServiceActionKey()
187   {
188     return "MsaWS";
189   }
190
191   protected String getServiceActionDescription()
192   {
193     return "Multiple Sequence Alignment";
194   }
195
196   /**
197    * look at ourselves and work out if we are a service that can take a profile
198    * and align to it
199    * 
200    * @return true if we can send gapped sequences to the alignment service
201    */
202   private boolean canSubmitGaps()
203   {
204     // TODO: query service or extract service handle props to check if we can
205     // realign
206     return (WebServiceName.indexOf("lustal") > -1); // cheat!
207   }
208
209   public void attachWSMenuEntry(JMenu rmsawsmenu,
210           final Jws2Instance service, final AlignFrame alignFrame)
211   {
212     setWebService(service, true); // headless
213     boolean finished = true, submitGaps = false;
214     JMenu msawsmenu = rmsawsmenu;
215     String svcname = WebServiceName;
216     if (svcname.endsWith("WS"))
217     {
218       svcname = svcname.substring(0,svcname.length()-2);
219     }
220     String calcName = svcname + " ";
221     if (canSubmitGaps())
222     {
223       msawsmenu = new JMenu(svcname);
224       rmsawsmenu.add(msawsmenu);
225       calcName = "";
226     }
227
228     do
229     {
230       if (submitGaps == true)
231       {
232         msawsmenu = new JMenu("profile " + svcname);
233         rmsawsmenu.add(msawsmenu);
234       }
235       final boolean withGaps = submitGaps;
236       JMenuItem method = new JMenuItem(calcName + "Defaults");
237       method.setToolTipText("Align with default settings");
238
239       method.addActionListener(new ActionListener()
240       {
241         public void actionPerformed(ActionEvent e)
242         {
243           AlignmentView msa = alignFrame.gatherSequencesForAlignment();
244           new MsaWSClient(service, alignFrame.getTitle(), msa, withGaps,
245                   true, alignFrame.getViewport().getAlignment()
246                           .getDataset(), alignFrame);
247
248         }
249       });
250       msawsmenu.add(method);
251       method = new JMenuItem(calcName + "Edit and run ...");
252       method.setToolTipText("View and change the parameters before alignment.");
253
254       method.addActionListener(new ActionListener()
255       {
256         public void actionPerformed(ActionEvent e)
257         {
258           AlignmentView msa = alignFrame.gatherSequencesForAlignment();
259           new MsaWSClient(service, null, null, true, alignFrame.getTitle(),
260                   msa, withGaps, true, alignFrame.getViewport()
261                           .getAlignment().getDataset(), alignFrame);
262
263         }
264       });
265       msawsmenu.add(method);
266       PresetManager presets = service.getPresets();
267       if (presets != null && presets.getPresets().size() > 0)
268       {
269         JMenu presetlist = new JMenu(calcName + "Presets");
270
271         for (final Preset preset : (List<Preset>) presets.getPresets())
272         {
273           final JMenuItem methodR = new JMenuItem(preset.getName());
274           methodR.setToolTipText("<html><p>"+preset.getDescription()+"</p></html>");
275           methodR.addActionListener(new ActionListener()
276           {
277             public void actionPerformed(ActionEvent e)
278             {
279               AlignmentView msa = alignFrame.gatherSequencesForAlignment();
280               new MsaWSClient(service, preset, alignFrame.getTitle(), msa,
281                       false, true, alignFrame.getViewport().getAlignment()
282                               .getDataset(), alignFrame);
283
284             }
285
286           });
287           presetlist.add(methodR);
288         }
289         msawsmenu.add(presetlist);
290       }
291       if (!submitGaps && canSubmitGaps())
292       {
293         submitGaps = true;
294         finished = false;
295       }
296       else
297       {
298         finished = true;
299       }
300     } while (!finished);
301   }
302 }