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