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