1 package jalview.ws2.params;
3 import java.io.ByteArrayOutputStream;
4 import java.io.IOException;
5 import java.io.StringReader;
7 import java.util.ArrayList;
8 import java.util.Collections;
11 import javax.xml.bind.JAXBContext;
12 import javax.xml.bind.JAXBException;
13 import javax.xml.bind.Marshaller;
14 import javax.xml.bind.Unmarshaller;
16 import jalview.bin.Cache;
17 import jalview.util.MessageManager;
18 import jalview.ws.params.ArgumentI;
19 import jalview.ws.params.ParamDatastoreI;
20 import jalview.ws.params.ParamManager;
21 import jalview.ws.params.WsParamSetI;
24 * A web client agnostic parameters datastore that provides view of the
25 * parameters and delegates parameters storage to {@link ParamManager}
26 * if given. Parameter datastore maintains the applicable service url
27 * the list of service parameters and both presets and user defined
30 public class SimpleParamDatastore implements ParamDatastoreI
32 protected URL serviceUrl;
33 protected List<ArgumentI> parameters;
34 protected List<SimpleParamSet> servicePresets;
35 protected List<SimpleParamSet> userPresets = new ArrayList<>();
36 protected ParamManager manager;
39 * Create new parameter datastore bound to the specified url with
40 * given service parameters and presets. Additionally, a parameters
41 * manager may be provided that will be used to load and store
42 * user parameter sets.
44 * @param serviceUrl applicable url
45 * @param parameters service parameters
46 * @param presets unmodifiable service presets
47 * @param manager parameter manager used to load and store user presets
49 public SimpleParamDatastore(URL serviceUrl, List<ArgumentI> parameters,
50 List<? extends WsParamSetI> presets, ParamManager manager)
52 this.serviceUrl = serviceUrl;
53 this.parameters = Collections.unmodifiableList(new ArrayList<>(parameters));
54 this.servicePresets = new ArrayList<>(presets.size());
55 for (var preset : presets)
57 if (preset instanceof SimpleParamSet)
58 servicePresets.add((SimpleParamSet) preset);
60 servicePresets.add(new SimpleParamSet(preset));
62 this.servicePresets = Collections.unmodifiableList(this.servicePresets);
63 this.manager = manager;
65 _initManager(manager);
68 private void _initManager(ParamManager manager)
70 manager.registerParser(serviceUrl.toString(), this);
71 WsParamSetI[] paramSets = manager.getParameterSet(null, serviceUrl.toString(),
73 if (paramSets != null)
75 for (WsParamSetI paramSet : paramSets)
77 // TODO: handle mismatch between preset and current parameters
78 if (paramSet instanceof SimpleParamSet)
79 userPresets.add((SimpleParamSet) paramSet);
82 userPresets.add(new SimpleParamSet(paramSet));
83 Cache.log.warn(String.format(
84 "Parameter set instance type %s is not applicable to service"
85 + "at %s.", paramSet.getClass(), serviceUrl));
92 public List<WsParamSetI> getPresets()
94 List<WsParamSetI> presets = new ArrayList<>();
95 presets.addAll(servicePresets);
96 presets.addAll(userPresets);
101 public SimpleParamSet getPreset(String name)
103 SimpleParamSet preset = null;
104 preset = getUserPreset(name);
107 preset = getServicePreset(name);
113 public SimpleParamSet getUserPreset(String name)
115 for (SimpleParamSet preset : userPresets)
117 if (name.equals(preset.getName()))
123 public SimpleParamSet getServicePreset(String name)
125 for (SimpleParamSet preset : servicePresets)
127 if (name.equals(preset.getName()))
134 public List<ArgumentI> getServiceParameters()
140 public boolean presetExists(String name)
142 return getPreset(name) != null;
146 public void deletePreset(String name)
148 var userPreset = getUserPreset(name);
149 if (userPreset != null)
151 userPresets.remove(userPreset);
154 manager.deleteParameterSet(userPreset);
157 else if (getServicePreset(name) != null)
159 throw new RuntimeException(MessageManager.getString(
160 "error.implementation_error_attempt_to_delete_service_preset"));
164 Cache.log.warn("Implementation error: no preset to delete");
169 public void storePreset(String presetName, String text, List<ArgumentI> jobParams)
171 var builder = SimpleParamSet.newBuilder();
172 builder.name(presetName);
173 builder.description(text);
174 builder.arguments(jobParams);
175 builder.url(serviceUrl.toString());
176 builder.modifiable(true);
177 var preset = builder.build();
178 userPresets.add(preset);
180 manager.storeParameterSet(preset);
184 public void updatePreset(String oldName, String newName, String text, List<ArgumentI> jobParams)
186 var preset = getPreset(oldName != null ? oldName : newName);
188 throw new RuntimeException(MessageManager.formatMessage(
189 "error.implementation_error_cannot_locate_oldname_presetname",
191 preset.setName(newName);
192 preset.setDescription(text);
193 preset.setArguments(jobParams);
194 preset.setApplicableUrls(new String[] { serviceUrl.toString() });
196 manager.storeParameterSet(preset);
200 public WsParamSetI parseServiceParameterFile(String name, String description,
201 String[] serviceURL, String parameters)
204 var builder = SimpleParamSet.newBuilder();
206 builder.description(description);
207 builder.urls(serviceURL);
208 builder.modifiable(true);
209 Unmarshaller unmarshaller;
212 var ctx = JAXBContext.newInstance(ArgumentBeanList.class);
213 unmarshaller = ctx.createUnmarshaller();
214 } catch (JAXBException e)
216 throw new RuntimeException(e);
218 ArgumentBeanList argList;
221 argList = (ArgumentBeanList) unmarshaller.unmarshal(new StringReader(parameters));
222 } catch (JAXBException | ClassCastException e)
224 throw new IOException("Unable to load parameters from file", e);
226 builder.arguments(argList.arguments);
227 return builder.build();
231 public String generateServiceParameterFile(WsParamSetI pset) throws IOException
233 Marshaller marshaller;
236 var ctx = JAXBContext.newInstance(ArgumentBeanList.class);
237 marshaller = ctx.createMarshaller();
238 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
239 marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
240 } catch (JAXBException e)
242 throw new RuntimeException(e);
244 ArgumentBeanList argList = ArgumentBeanList.fromList(pset.getArguments());
245 var out = new ByteArrayOutputStream();
248 marshaller.marshal(argList, out);
249 } catch (JAXBException e)
251 throw new IOException("Unable to generate parameters file", e);
253 return out.toString();