abstracted GUI to use jalview.ws.params objects (JAL-591, JAL-633)
[jalview.git] / src / jalview / ws / jws2 / JabaParamStore.java
1 package jalview.ws.jws2;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.Reader;
6 import java.io.Writer;
7 import java.util.ArrayList;
8 import java.util.Hashtable;
9 import java.util.List;
10
11 import compbio.metadata.Argument;
12 import compbio.metadata.Option;
13 import compbio.metadata.Parameter;
14 import compbio.metadata.Preset;
15 import compbio.metadata.PresetManager;
16 import compbio.metadata.RunnerConfig;
17
18 import jalview.ws.jws2.Jws2Discoverer.Jws2Instance;
19 import jalview.ws.jws2.dm.JabaOption;
20 import jalview.ws.jws2.dm.JabaParameter;
21 import jalview.ws.jws2.dm.JabaWsParamSet;
22 import jalview.ws.params.ArgumentI;
23 import jalview.ws.params.ParamDatastoreI;
24 import jalview.ws.params.WsParamSetI;
25
26 public class JabaParamStore implements ParamDatastoreI
27 {
28
29   Hashtable<String, JabaWsParamSet> editedParams = new Hashtable<String, JabaWsParamSet>();
30
31   private Jws2Instance service;
32
33   private RunnerConfig serviceOptions;
34
35   private Hashtable<String, JabaPreset> servicePresets;
36
37   public JabaParamStore(Jws2Instance service)
38   {
39     this.service = service;
40     serviceOptions = service.getRunnerConfig();
41     // TODO: discover all the user's locally sored presets for this service and populate the hash table
42     // TODO: for JAL-632
43   }
44
45   /**
46    * store the given parameters in the user parameter set database.
47    * 
48    * @param storeSetName
49    *          - lastParmSet
50    * @param descr
51    *          - setDescr.getText()
52    * @param jobParams
53    *          - getJobParams()
54    */
55   private void _storeUserPreset(String storeSetName, String descr,
56           List<Argument> jobParams)
57   {
58     // this is a simple hash store.
59     editedParams.put(storeSetName, new JabaWsParamSet(storeSetName, descr,
60             JabaParamStore.getJwsArgsfromJaba(jobParams)));
61     // writeParam("Saving " + storeSetName + ": ", jobParams);
62   }
63
64   private void writeParam(String nm, List<Argument> params)
65   {
66     for (Argument p : params)
67     {
68       System.out.println(nm + ":" + System.identityHashCode(p) + " Name: "
69               + p.getName() + " Value: " + p.getDefaultValue());
70     }
71   }
72
73   private JabaWsParamSet _getUserPreset(String setName)
74   {
75     JabaWsParamSet pset = editedParams.get(setName);
76     return pset;
77   }
78
79   /**
80    * remove the given user preset from the preset stash
81    * 
82    * @param setName
83    */
84   private void _deleteUserPreset(String setName)
85   {
86     editedParams.remove(setName);
87   }
88
89   @Override
90   public List<WsParamSetI> getPresets()
91   {
92     List<WsParamSetI> prefs = new ArrayList();
93     if (servicePresets == null)
94     {
95       servicePresets = new Hashtable<String, JabaPreset>();
96       PresetManager prman;
97       if ((prman = service.getPresets()) != null)
98       {
99         List pset = prman.getPresets();
100         if (pset != null)
101         {
102           for (Object pr : pset)
103           {
104             JabaPreset prset = new JabaPreset(service, (Preset) pr);
105             servicePresets.put(prset.getName(), prset);
106           }
107         }
108       }
109     }
110     for (JabaPreset pr : servicePresets.values())
111     {
112       prefs.add(pr);
113     }
114     for (WsParamSetI wspset : editedParams.values())
115     {
116       prefs.add(wspset);
117     }
118     return prefs;
119   }
120
121   @Override
122   public WsParamSetI getPreset(String name)
123   {
124     for (WsParamSetI pr : getPresets())
125     {
126       if (pr.getName().equals(name))
127       {
128         return pr;
129       }
130     }
131     return null;
132   }
133
134   public static List<ArgumentI> getJwsArgsfromJaba(List jabargs)
135   {
136     List<ArgumentI> rgs = new ArrayList<ArgumentI>();
137     for (Object rg : jabargs)
138     {
139       ArgumentI narg = (rg instanceof Parameter) ? new JabaParameter(
140               (Parameter) rg) : (rg instanceof Option) ? new JabaOption(
141               (Option) rg) : null;
142       if (narg == null)
143       {
144         throw new Error(
145                 "Implementation Error: Cannot handle Jaba parameter object "
146                         + rg.getClass());
147       }
148       else
149       {
150         rgs.add(narg);
151       }
152     }
153     return rgs;
154   }
155
156   public static List getJabafromJwsArgs(List<ArgumentI> jwsargs)
157   {
158     List rgs = new ArrayList();
159     for (ArgumentI rg : jwsargs)
160     {
161       Argument narg = (rg instanceof JabaOption) ? ((JabaOption) rg)
162               .getOption() : null;
163       if (narg == null)
164       {
165         throw new Error(
166                 "Implementation Error: Cannot handle Jaba parameter object "
167                         + rg.getClass());
168       }
169       else
170       {
171         rgs.add(narg);
172       }
173     }
174     return rgs;
175   }
176
177   @Override
178   public List<ArgumentI> getServiceParameters()
179   {
180     return getJwsArgsfromJaba(serviceOptions.getArguments());
181   }
182
183   @Override
184   public boolean presetExists(String name)
185   {
186     return (editedParams.containsKey(name) || servicePresets
187             .containsKey(name));
188   }
189
190   @Override
191   public void deletePreset(String name)
192   {
193     if (editedParams.containsKey(name))
194     {
195       editedParams.remove(name);
196       return;
197     }
198     if (servicePresets.containsKey(name))
199     {
200       throw new Error(
201               "Implementation error: Attempt to delete a service preset!");
202     }
203   }
204
205
206   @Override
207   public void storePreset(String presetName, String text,
208           List<ArgumentI> jobParams)
209   {
210     JabaWsParamSet jps = new JabaWsParamSet(presetName, text, jobParams);
211     editedParams.put(jps.getName(), jps);
212   }
213
214   @Override
215   public boolean readParamSet(WsParamSetI wsp,
216           Reader reader) throws IOException
217   {
218     if (!(wsp instanceof JabaWsParamSet))
219     {
220       throw new Error("Implementation error: JabaWsParamSets can only be handled by JabaParamStore");
221     }
222     List<String> lines=new ArrayList<String>();
223     String line;
224     BufferedReader br = new BufferedReader(reader);
225     while ((line=br.readLine())!=null)
226     {
227       lines.add(line);
228     }
229     ((JabaWsParamSet) wsp).setjabaArguments(ParameterUtils.processParameters(lines, serviceOptions, " "));
230     return true;
231   }
232
233   @Override
234   public boolean writeParamSet(WsParamSetI wsp,
235           Writer writer) throws IOException
236   {
237             if (!(wsp instanceof JabaWsParamSet))
238             {
239               throw new Error("Implementation error: JabaWsParamSets can only be handled by JabaParamStore");
240             }
241             writer.write(ParameterUtils.writeParameterSet(((JabaWsParamSet)wsp).getjabaArguments(), " ")
242                     .toString());
243             return true;
244   }
245
246 }