JAL-1620 version bump and release notes
[jalview.git] / src / jalview / ws / jws2 / JabaParamStore.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1)
3  * Copyright (C) 2014 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.io.IOException;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.Hashtable;
27 import java.util.List;
28 import java.util.StringTokenizer;
29
30 import org.jmol.util.ArrayUtil;
31 import compbio.metadata.Argument;
32 import compbio.metadata.Option;
33 import compbio.metadata.Parameter;
34 import compbio.metadata.Preset;
35 import compbio.metadata.PresetManager;
36 import compbio.metadata.RunnerConfig;
37
38 import jalview.util.MessageManager;
39 import jalview.ws.jws2.dm.JabaOption;
40 import jalview.ws.jws2.dm.JabaParameter;
41 import jalview.ws.jws2.dm.JabaWsParamSet;
42 import jalview.ws.jws2.jabaws2.Jws2Instance;
43 import jalview.ws.params.ArgumentI;
44 import jalview.ws.params.ParamDatastoreI;
45 import jalview.ws.params.ParamManager;
46 import jalview.ws.params.WsParamSetI;
47
48 public class JabaParamStore implements ParamDatastoreI
49 {
50
51   Hashtable<String, JabaWsParamSet> editedParams = new Hashtable<String, JabaWsParamSet>();
52
53   private Jws2Instance service;
54
55   private RunnerConfig serviceOptions;
56
57   private Hashtable<String, JabaPreset> servicePresets;
58
59   public JabaParamStore(Jws2Instance service)
60   {
61     this(service, null);
62   }
63
64   ParamManager manager;
65
66   public JabaParamStore(Jws2Instance service, ParamManager manager)
67   {
68     this.service = service;
69     serviceOptions = service.getRunnerConfig();
70     this.manager = manager;
71     // discover all the user's locally stored presets for this service and
72     // populate the hash table
73     if (manager != null)
74     {
75       manager.registerParser(service.getUri(), this);
76       WsParamSetI[] prams = manager.getParameterSet(null, service.getUri(),
77               true, false);
78       if (prams != null)
79       {
80         for (WsParamSetI paramset : prams)
81         {
82           if (paramset instanceof JabaWsParamSet)
83           {
84             editedParams.put(paramset.getName(), (JabaWsParamSet) paramset);
85           }
86           else
87           {
88             System.err
89                     .println("Warning: Ignoring parameter set instance of type "
90                             + paramset.getClass()
91                             + " : Bound but not applicable for service at "
92                             + service.getUri());
93           }
94         }
95       }
96     }
97   }
98
99   @Override
100   public List<WsParamSetI> getPresets()
101   {
102     List<WsParamSetI> prefs = new ArrayList();
103     if (servicePresets == null)
104     {
105       servicePresets = new Hashtable<String, JabaPreset>();
106       PresetManager prman;
107       if ((prman = service.getPresets()) != null)
108       {
109         List pset = prman.getPresets();
110         if (pset != null)
111         {
112           for (Object pr : pset)
113           {
114             JabaPreset prset = new JabaPreset(service, (Preset) pr);
115             servicePresets.put(prset.getName(), prset);
116           }
117         }
118       }
119     }
120     for (JabaPreset pr : servicePresets.values())
121     {
122       prefs.add(pr);
123     }
124     for (WsParamSetI wspset : editedParams.values())
125     {
126       prefs.add(wspset);
127     }
128     return prefs;
129   }
130
131   @Override
132   public WsParamSetI getPreset(String name)
133   {
134     for (WsParamSetI pr : getPresets())
135     {
136       if (pr.getName().equals(name))
137       {
138         return pr;
139       }
140     }
141     return null;
142   }
143
144   public static List<ArgumentI> getJwsArgsfromJaba(List jabargs)
145   {
146     return getJwsArgsfromJaba(jabargs, true);
147   }
148
149   public static List<ArgumentI> getJwsArgsfromJaba(List jabargs,
150           boolean sortByOpt)
151   {
152     List<ArgumentI> rgs = new ArrayList<ArgumentI>();
153     List<String> rgnames = new ArrayList<String>();
154     for (Object rg : jabargs)
155     {
156       ArgumentI narg = null;
157       String nargstring = null;
158       if (rg instanceof Parameter)
159       {
160         narg = new JabaParameter((Parameter) rg);
161         nargstring = narg.getName(); // just sort by name for this
162       }
163       else if (rg instanceof Option)
164       {
165         narg = new JabaOption((Option) rg);
166         nargstring = (String) ((Option) rg).getOptionNames().get(0);
167       }
168       if (narg == null)
169       {
170         throw new Error(MessageManager.formatMessage("error.implementation_error_cannot_handle_jaba_param", new String[]{rg.getClass().toString()}));
171       }
172       else
173       {
174         rgs.add(narg);
175         rgnames.add(nargstring);
176       }
177     }
178     if (!sortByOpt)
179     {
180       return rgs;
181     }
182     ArgumentI[] rgssort = rgs.toArray(new ArgumentI[rgs.size()]);
183     String[] rgssorton = rgnames.toArray(new String[rgs.size()]);
184     jalview.util.QuickSort.sort(rgssorton, rgssort);
185     ArgumentI tmp1;
186     int i = 0;
187     while (rgssort.length - i > i)
188     {
189       tmp1 = rgssort[rgssort.length - i - 1];
190       rgssort[rgssort.length - i - 1] = rgssort[i];
191       rgssort[i++] = tmp1;
192     }
193     return Arrays.asList(rgssort);
194   }
195
196   public static List getJabafromJwsArgs(List<ArgumentI> jwsargs)
197   {
198     List rgs = new ArrayList();
199     for (ArgumentI rg : jwsargs)
200     {
201       Argument narg = (rg instanceof JabaOption) ? ((JabaOption) rg)
202               .getOption() : null;
203       if (narg == null)
204       {
205           throw new Error(MessageManager.formatMessage("error.implementation_error_cannot_handle_jaba_param", new String[]{rg.getClass().toString()}));
206       }
207       else
208       {
209         rgs.add(narg);
210       }
211     }
212     return rgs;
213   }
214
215   @Override
216   public List<ArgumentI> getServiceParameters()
217   {
218     return getJwsArgsfromJaba(serviceOptions.getArguments());
219   }
220
221   @Override
222   public boolean presetExists(String name)
223   {
224     return (editedParams.containsKey(name) || servicePresets
225             .containsKey(name));
226   }
227
228   @Override
229   public void deletePreset(String name)
230   {
231     if (editedParams.containsKey(name))
232     {
233       WsParamSetI parameterSet = editedParams.get(name);
234       editedParams.remove(name);
235       if (manager != null)
236       {
237         manager.deleteParameterSet(parameterSet);
238       }
239       return;
240     }
241     if (servicePresets.containsKey(name))
242     {
243       throw new Error(MessageManager.getString("error.implementation_error_attempt_to_delete_service_preset"));
244     }
245   }
246
247   @Override
248   public void storePreset(String presetName, String text,
249           List<ArgumentI> jobParams)
250   {
251     JabaWsParamSet jps = new JabaWsParamSet(presetName, text, jobParams);
252     jps.setApplicableUrls(new String[]
253     { service.getUri() });
254     editedParams.put(jps.getName(), jps);
255     if (manager != null)
256     {
257       manager.storeParameterSet(jps);
258     }
259   }
260
261   @Override
262   public void updatePreset(String oldName, String presetName, String text,
263           List<ArgumentI> jobParams)
264   {
265     JabaWsParamSet jps = (JabaWsParamSet) ((oldName != null) ? getPreset(oldName)
266             : getPreset(presetName));
267     if (jps == null)
268     {
269       throw new Error(MessageManager.formatMessage("error.implementation_error_cannot_locate_oldname_presetname", new String[]{oldName,presetName}));
270     }
271     jps.setName(presetName);
272     jps.setDescription(text);
273     jps.setArguments(jobParams);
274     jps.setApplicableUrls(new String[]
275     { service.getUri() });
276     if (oldName != null && !oldName.equals(jps.getName()))
277     {
278       editedParams.remove(oldName);
279     }
280     editedParams.put(jps.getName(), jps);
281
282     if (manager != null)
283     {
284       manager.storeParameterSet(jps);
285     }
286   }
287
288   /**
289    * create a new, empty parameter set for this service
290    * 
291    * @return
292    */
293   WsParamSetI newWsParamSet()
294   {
295     return new JabaWsParamSet();
296   };
297
298   private boolean involves(String[] urls)
299   {
300     boolean found = false;
301     for (String url : urls)
302     {
303       if (service.getServiceTypeURI().equals(url)
304               || service.getUri().equalsIgnoreCase(url))
305       {
306         found = true;
307         break;
308       }
309     }
310     return found;
311   }
312
313   @Override
314   public WsParamSetI parseServiceParameterFile(String name, String descr,
315           String[] urls, String parameterfile) throws IOException
316   {
317     if (!involves(urls))
318     {
319       throw new IOException(MessageManager.getString("error.implementation_error_cannot_find_service_url_in_given_set"));
320
321     }
322     JabaWsParamSet wsp = new JabaWsParamSet();
323     wsp.setName(name);
324     wsp.setDescription(descr);
325     wsp.setApplicableUrls(urls.clone());
326
327     List<String> lines = new ArrayList<String>();
328     StringTokenizer st = new StringTokenizer(parameterfile, "\n");
329     while (st.hasMoreTokens())
330     {
331       lines.add(st.nextToken());
332     }
333     wsp.setjabaArguments(ParameterUtils.processParameters(lines,
334             serviceOptions, " "));
335     return wsp;
336   }
337
338   @Override
339   public String generateServiceParameterFile(WsParamSetI pset)
340           throws IOException
341   {
342     if (!involves(pset.getApplicableUrls()))
343     {
344       throw new IOException(MessageManager.formatMessage("error.implementation_error_cannot_find_service_url_in_given_set_param_store", new String[]{service.getUri()}));
345     }
346     if (!(pset instanceof JabaWsParamSet))
347     {
348       throw new Error(MessageManager.getString("error.implementation_error_jabaws_param_set_only_handled_by"));
349     }
350
351     StringBuffer rslt = new StringBuffer();
352     for (String ln : ParameterUtils.writeParameterSet(
353             ((JabaWsParamSet) pset).getjabaArguments(), " "))
354     {
355       rslt.append(ln);
356       rslt.append("\n");
357     }
358     ;
359     return rslt.toString();
360   }
361
362 }