2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3 * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
5 * This file is part of Jalview.
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.
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.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
18 package jalview.ws.jws2;
20 import java.io.IOException;
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.Hashtable;
24 import java.util.List;
25 import java.util.StringTokenizer;
27 import org.jmol.util.ArrayUtil;
28 import compbio.metadata.Argument;
29 import compbio.metadata.Option;
30 import compbio.metadata.Parameter;
31 import compbio.metadata.Preset;
32 import compbio.metadata.PresetManager;
33 import compbio.metadata.RunnerConfig;
35 import jalview.ws.jws2.dm.JabaOption;
36 import jalview.ws.jws2.dm.JabaParameter;
37 import jalview.ws.jws2.dm.JabaWsParamSet;
38 import jalview.ws.jws2.jabaws2.Jws2Instance;
39 import jalview.ws.params.ArgumentI;
40 import jalview.ws.params.ParamDatastoreI;
41 import jalview.ws.params.ParamManager;
42 import jalview.ws.params.WsParamSetI;
44 public class JabaParamStore implements ParamDatastoreI
47 Hashtable<String, JabaWsParamSet> editedParams = new Hashtable<String, JabaWsParamSet>();
49 private Jws2Instance service;
51 private RunnerConfig serviceOptions;
53 private Hashtable<String, JabaPreset> servicePresets;
55 public JabaParamStore(Jws2Instance service)
62 public JabaParamStore(Jws2Instance service, ParamManager manager)
64 this.service = service;
65 serviceOptions = service.getRunnerConfig();
66 this.manager = manager;
67 // discover all the user's locally stored presets for this service and
68 // populate the hash table
71 manager.registerParser(service.getUri(), this);
72 WsParamSetI[] prams = manager.getParameterSet(null, service.getUri(),
76 for (WsParamSetI paramset : prams)
78 if (paramset instanceof JabaWsParamSet)
80 editedParams.put(paramset.getName(), (JabaWsParamSet) paramset);
85 .println("Warning: Ignoring parameter set instance of type "
87 + " : Bound but not applicable for service at "
96 public List<WsParamSetI> getPresets()
98 List<WsParamSetI> prefs = new ArrayList();
99 if (servicePresets == null)
101 servicePresets = new Hashtable<String, JabaPreset>();
103 if ((prman = service.getPresets()) != null)
105 List pset = prman.getPresets();
108 for (Object pr : pset)
110 JabaPreset prset = new JabaPreset(service, (Preset) pr);
111 servicePresets.put(prset.getName(), prset);
116 for (JabaPreset pr : servicePresets.values())
120 for (WsParamSetI wspset : editedParams.values())
128 public WsParamSetI getPreset(String name)
130 for (WsParamSetI pr : getPresets())
132 if (pr.getName().equals(name))
140 public static List<ArgumentI> getJwsArgsfromJaba(List jabargs)
142 return getJwsArgsfromJaba(jabargs, true);
145 public static List<ArgumentI> getJwsArgsfromJaba(List jabargs,
148 List<ArgumentI> rgs = new ArrayList<ArgumentI>();
149 List<String> rgnames = new ArrayList<String>();
150 for (Object rg : jabargs)
152 ArgumentI narg = null;
153 String nargstring = null;
154 if (rg instanceof Parameter)
156 narg = new JabaParameter((Parameter) rg);
157 nargstring = narg.getName(); // just sort by name for this
159 else if (rg instanceof Option)
161 narg = new JabaOption((Option) rg);
162 nargstring = (String) ((Option) rg).getOptionNames().get(0);
167 "Implementation Error: Cannot handle Jaba parameter object "
173 rgnames.add(nargstring);
180 ArgumentI[] rgssort = rgs.toArray(new ArgumentI[rgs.size()]);
181 String[] rgssorton = rgnames.toArray(new String[rgs.size()]);
182 jalview.util.QuickSort.sort(rgssorton, rgssort);
185 while (rgssort.length-i>i)
187 tmp1=rgssort[rgssort.length-i-1];
188 rgssort[rgssort.length-i-1] = rgssort[i];
191 return Arrays.asList(rgssort);
194 public static List getJabafromJwsArgs(List<ArgumentI> jwsargs)
196 List rgs = new ArrayList();
197 for (ArgumentI rg : jwsargs)
199 Argument narg = (rg instanceof JabaOption) ? ((JabaOption) rg)
204 "Implementation Error: Cannot handle Jaba parameter object "
216 public List<ArgumentI> getServiceParameters()
218 return getJwsArgsfromJaba(serviceOptions.getArguments());
222 public boolean presetExists(String name)
224 return (editedParams.containsKey(name) || servicePresets
229 public void deletePreset(String name)
231 if (editedParams.containsKey(name))
233 WsParamSetI parameterSet = editedParams.get(name);
234 editedParams.remove(name);
237 manager.deleteParameterSet(parameterSet);
241 if (servicePresets.containsKey(name))
244 "Implementation error: Attempt to delete a service preset!");
249 public void storePreset(String presetName, String text,
250 List<ArgumentI> jobParams)
252 JabaWsParamSet jps = new JabaWsParamSet(presetName, text, jobParams);
253 jps.setApplicableUrls(new String[]
254 { service.getUri() });
255 editedParams.put(jps.getName(), jps);
258 manager.storeParameterSet(jps);
263 public void updatePreset(String oldName, String presetName, String text,
264 List<ArgumentI> jobParams)
266 JabaWsParamSet jps = (JabaWsParamSet) ((oldName != null) ? getPreset(oldName)
267 : getPreset(presetName));
270 throw new Error("Implementation error: Can't locate either oldname ("
271 + oldName + ") or presetName (" + presetName
272 + "in the datastore!");
274 jps.setName(presetName);
275 jps.setDescription(text);
276 jps.setArguments(jobParams);
277 jps.setApplicableUrls(new String[]
278 { service.getUri() });
279 if (oldName != null && !oldName.equals(jps.getName()))
281 editedParams.remove(oldName);
283 editedParams.put(jps.getName(), jps);
287 manager.storeParameterSet(jps);
292 * create a new, empty parameter set for this service
296 WsParamSetI newWsParamSet()
298 return new JabaWsParamSet();
301 private boolean involves(String[] urls)
303 boolean found = false;
304 for (String url : urls)
306 if (service.getServiceTypeURI().equals(url)
307 || service.getUri().equalsIgnoreCase(url))
317 public WsParamSetI parseServiceParameterFile(String name, String descr,
318 String[] urls, String parameterfile) throws IOException
322 throw new IOException(
323 "Implementation error: Cannot find service url in the given url set!");
326 JabaWsParamSet wsp = new JabaWsParamSet();
328 wsp.setDescription(descr);
329 wsp.setApplicableUrls(urls.clone());
331 List<String> lines = new ArrayList<String>();
332 StringTokenizer st = new StringTokenizer(parameterfile, "\n");
333 while (st.hasMoreTokens())
335 lines.add(st.nextToken());
337 wsp.setjabaArguments(ParameterUtils.processParameters(lines,
338 serviceOptions, " "));
343 public String generateServiceParameterFile(WsParamSetI pset)
346 if (!involves(pset.getApplicableUrls()))
348 throw new IOException(
349 "Implementation error: Cannot find service url in the given url set for this service parameter store ("
350 + service.getUri() + ") !");
353 if (!(pset instanceof JabaWsParamSet))
356 "Implementation error: JabaWsParamSets can only be handled by JabaParamStore");
359 StringBuffer rslt = new StringBuffer();
360 for (String ln : ParameterUtils.writeParameterSet(
361 ((JabaWsParamSet) pset).getjabaArguments(), " "))
367 return rslt.toString();