d03b6ca371a012e732d63b277d5ed061845eb20b
[jalview.git] / src / jalview / gui / WsParamSetManager.java
1 package jalview.gui;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.io.InputStreamReader;
8 import java.io.OutputStreamWriter;
9 import java.io.PrintWriter;
10 import java.util.ArrayList;
11 import java.util.Hashtable;
12 import java.util.List;
13 import java.util.StringTokenizer;
14
15 import javax.swing.JButton;
16 import javax.swing.JOptionPane;
17
18 import jalview.bin.Cache;
19 import jalview.io.JalviewFileChooser;
20 import jalview.ws.jws2.dm.JabaWsParamSet;
21 import jalview.ws.params.ParamDatastoreI;
22 import jalview.ws.params.ParamManager;
23 import jalview.ws.params.WsParamSetI;
24
25 /**
26  * store and retrieve web service parameter sets.
27  * 
28  * @author JimP
29  * 
30  */
31 public class WsParamSetManager implements ParamManager
32 {
33   Hashtable<String, ParamDatastoreI> paramparsers = new Hashtable<String, ParamDatastoreI>();
34
35   @Override
36   public WsParamSetI[] getParameterSet(String name, String serviceUrl,
37           boolean modifiable, boolean unmodifiable)
38   {
39     String files = Cache.getProperty("WS_PARAM_FILES");
40     if (files == null)
41     {
42       return null;
43     }
44     StringTokenizer st = new StringTokenizer(files, "|");
45     String pfile = null;
46     ArrayList<WsParamSetI> params = new ArrayList<WsParamSetI>();
47     while (st.hasMoreTokens())
48     {
49       pfile = st.nextToken();
50       try
51       {
52         WsParamSetI[] pset = parseParamFile(pfile);
53         for (WsParamSetI p : pset)
54         {
55           boolean add = false;
56           if (serviceUrl != null)
57           {
58             for (String url : p.getApplicableUrls())
59             {
60               if (url.equals(serviceUrl))
61               {
62                 add = true;
63               }
64             }
65           }
66           else
67           {
68             add = true;
69           }
70           add &= (modifiable == p.isModifiable() || unmodifiable == !p
71                   .isModifiable());
72           add &= name == null || p.getName().equals(name);
73
74           if (add)
75           {
76
77             params.add(p);
78           }
79
80         }
81       } catch (IOException e)
82       {
83         Cache.log
84                 .info("Failed to parse parameter file "
85                         + pfile
86                         + " (Check that all JALVIEW_WSPARAMFILES entries are valid!)",
87                         e);
88       }
89     }
90     return params.toArray(new WsParamSetI[0]);
91   }
92
93   private WsParamSetI[] parseParamFile(String filename) throws IOException
94   {
95     List<WsParamSetI> psets = new ArrayList<WsParamSetI>();
96     InputStreamReader is = new InputStreamReader(
97             new java.io.FileInputStream(new File(filename)), "UTF-8");
98
99     jalview.schemabinding.version2.WebServiceParameterSet wspset = new jalview.schemabinding.version2.WebServiceParameterSet();
100
101     org.exolab.castor.xml.Unmarshaller unmar = new org.exolab.castor.xml.Unmarshaller(
102             wspset);
103     unmar.setWhitespacePreserve(true);
104     try
105     {
106       wspset = (jalview.schemabinding.version2.WebServiceParameterSet) unmar
107               .unmarshal(is);
108     } catch (Exception ex)
109     {
110       throw new IOException(ex);
111     }
112     if (wspset != null && wspset.getParameters().length() > 0)
113     {
114       for (String url : wspset.getServiceURL())
115       {
116         ParamDatastoreI parser = paramparsers.get(url);
117         if (parser != null)
118         {
119           WsParamSetI pset = parser.parseServiceParameterFile(
120                   wspset.getName(), wspset.getDescription(),
121                   wspset.getServiceURL(), wspset.getParameters());
122           if (pset != null)
123           {
124             pset.setSourceFile(filename);
125             psets.add(pset);
126             break;
127           }
128         }
129       }
130     }
131
132     return psets.toArray(new WsParamSetI[0]);
133   }
134
135   @Override
136   public void storeParameterSet(WsParamSetI parameterSet)
137   {
138     String filename = parameterSet.getSourceFile();
139     File outfile = null;
140     try
141     {
142       if (filename != null && !((outfile = new File(filename)).canWrite()))
143       {
144         Cache.log.info("Can't write to " + filename
145                 + " - Prompting for new file to write to.");
146         filename = null;
147       }
148     } catch (Exception e)
149     {
150       filename = null;
151     }
152
153     ParamDatastoreI parser = null;
154     for (String urls : parameterSet.getApplicableUrls())
155     {
156       if (parser == null)
157       {
158         parser = paramparsers.get(urls);
159       }
160     }
161     if (parser == null)
162     {
163       throw new Error(
164               "Implementation error: Can't find a marshaller for the parameter set");
165     }
166     if (filename == null)
167     {
168       JalviewFileChooser chooser = new JalviewFileChooser(
169               jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
170               { "wsparams" }, new String[]
171               { "Web Service Parameter File" },
172               "Web Service Parameter File");
173       chooser.setFileView(new jalview.io.JalviewFileView());
174       chooser.setDialogTitle("Choose a filename for this parameter file");
175       chooser.setToolTipText("Save");
176       int value = chooser.showSaveDialog(Desktop.instance);
177       if (value == JalviewFileChooser.APPROVE_OPTION)
178       {
179         outfile = chooser.getSelectedFile();
180         jalview.bin.Cache
181                 .setProperty("LAST_DIRECTORY", outfile.getParent());
182         filename = outfile.getAbsolutePath();
183         if (!filename.endsWith(".wsparams"))
184         {
185           filename = filename.concat(".wsparams");
186           outfile = new File(filename);
187         }
188       }
189     }
190     if (outfile != null)
191     {
192       String paramFiles = jalview.bin.Cache.getDefault("WS_PARAM_FILES",
193               filename);
194       if (paramFiles.indexOf(filename) == -1)
195       {
196         if (paramFiles.length() > 0)
197         {
198           paramFiles = paramFiles.concat("|");
199         }
200         paramFiles = paramFiles.concat(filename);
201       }
202       jalview.bin.Cache.setProperty("WS_PARAM_FILES", paramFiles);
203
204       jalview.schemabinding.version2.WebServiceParameterSet paramxml = new jalview.schemabinding.version2.WebServiceParameterSet();
205
206       paramxml.setName(parameterSet.getName());
207       paramxml.setDescription(parameterSet.getDescription());
208       paramxml.setServiceURL(parameterSet.getApplicableUrls().clone());
209       paramxml.setVersion("1.0");
210       try
211       {
212         paramxml.setParameters(parser
213                 .generateServiceParameterFile(parameterSet));
214         PrintWriter out = new PrintWriter(new OutputStreamWriter(
215                 new FileOutputStream(outfile), "UTF-8"));
216         paramxml.marshal(out);
217         out.close();
218         parameterSet.setSourceFile(filename);
219       } catch (Exception e)
220       {
221         Cache.log.error("Couldn't write parameter file to " + outfile, e);
222       }
223     }
224   }
225
226   /*
227    * 
228    * JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
229    * .getProperty("LAST_DIRECTORY"), new String[] { "jc" }, new String[] {
230    * "Jalview User Colours" }, "Jalview User Colours"); chooser.setFileView(new
231    * jalview.io.JalviewFileView());
232    * chooser.setDialogTitle("Load colour scheme");
233    * chooser.setToolTipText("Load");
234    * 
235    * int value = chooser.showOpenDialog(this);
236    * 
237    * if (value == JalviewFileChooser.APPROVE_OPTION) { File choice =
238    * chooser.getSelectedFile(); jalview.bin.Cache.setProperty("LAST_DIRECTORY",
239    * choice.getParent()); String defaultColours = jalview.bin.Cache.getDefault(
240    * "USER_DEFINED_COLOURS", choice.getPath()); if
241    * (defaultColours.indexOf(choice.getPath()) == -1) { defaultColours =
242    * defaultColours.concat("|") .concat(choice.getPath()); } (non-Javadoc)
243    * 
244    * @see
245    * jalview.ws.params.ParamManager#deleteParameterSet(jalview.ws.params.WsParamSetI
246    * )
247    */
248   @Override
249   public void deleteParameterSet(WsParamSetI parameterSet)
250   {
251     String filename = parameterSet.getSourceFile();
252     if (filename == null || filename.trim().length() < 1)
253     {
254       return;
255     }
256     String paramFiles = jalview.bin.Cache.getDefault("WS_PARAM_FILES", "");
257     if (paramFiles.indexOf(filename) > -1)
258     {
259       String nparamFiles = new String();
260       StringTokenizer st = new StringTokenizer(paramFiles, "|");
261       while (st.hasMoreElements())
262       {
263         String fl = st.nextToken();
264         if (!fl.equals(filename))
265         {
266           nparamFiles = nparamFiles.concat("|").concat(fl);
267         }
268       }
269       jalview.bin.Cache.setProperty("WS_PARAM_FILES", nparamFiles);
270     }
271
272     try
273     {
274       File pfile = new File(filename);
275       if (pfile.exists() && pfile.canWrite())
276       {
277         if (JOptionPane.showConfirmDialog(Desktop.instance,
278                 "Delete the preset's file, too ?", "Delete User Preset ?",
279                 JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION)
280         {
281           pfile.delete();
282         }
283       }
284     } catch (Exception e)
285     {
286       Cache.log
287               .error("Exception when trying to delete webservice user preset: ",
288                       e);
289     }
290   }
291
292   @Override
293   public void registerParser(String hosturl, ParamDatastoreI paramdataStore)
294   {
295     paramparsers.put(hosturl, paramdataStore);
296   }
297
298 }