JAL-2668 fix broken factory method for colour scheme
[jalview.git] / src / jalview / gui / WsParamSetManager.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ 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
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.gui;
22
23 import jalview.bin.Cache;
24 import jalview.io.JalviewFileChooser;
25 import jalview.io.JalviewFileView;
26 import jalview.util.MessageManager;
27 import jalview.ws.params.ParamDatastoreI;
28 import jalview.ws.params.ParamManager;
29 import jalview.ws.params.WsParamSetI;
30
31 import java.io.File;
32 import java.io.FileOutputStream;
33 import java.io.IOException;
34 import java.io.InputStreamReader;
35 import java.io.OutputStreamWriter;
36 import java.io.PrintWriter;
37 import java.util.ArrayList;
38 import java.util.Hashtable;
39 import java.util.List;
40 import java.util.StringTokenizer;
41
42 /**
43  * store and retrieve web service parameter sets.
44  * 
45  * @author JimP
46  * 
47  */
48 public class WsParamSetManager implements ParamManager
49 {
50   Hashtable<String, ParamDatastoreI> paramparsers = new Hashtable<String, ParamDatastoreI>();
51
52   @Override
53   public WsParamSetI[] getParameterSet(String name, String serviceUrl,
54           boolean modifiable, boolean unmodifiable)
55   {
56     String files = Cache.getProperty("WS_PARAM_FILES");
57     if (files == null)
58     {
59       return null;
60     }
61     StringTokenizer st = new StringTokenizer(files, "|");
62     String pfile = null;
63     ArrayList<WsParamSetI> params = new ArrayList<WsParamSetI>();
64     while (st.hasMoreTokens())
65     {
66       pfile = st.nextToken();
67       try
68       {
69         WsParamSetI[] pset = parseParamFile(pfile);
70         for (WsParamSetI p : pset)
71         {
72           boolean add = false;
73           if (serviceUrl != null)
74           {
75             for (String url : p.getApplicableUrls())
76             {
77               if (url.equals(serviceUrl))
78               {
79                 add = true;
80               }
81             }
82           }
83           else
84           {
85             add = true;
86           }
87           add &= (modifiable == p.isModifiable()
88                   || unmodifiable == !p.isModifiable());
89           add &= name == null || p.getName().equals(name);
90
91           if (add)
92           {
93
94             params.add(p);
95           }
96
97         }
98       } catch (IOException e)
99       {
100         Cache.log.info("Failed to parse parameter file " + 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.warn("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(MessageManager.getString(
179               "error.implementation_error_cannot_find_marshaller_for_param_set"));
180     }
181     if (filename == null)
182     {
183       JalviewFileChooser chooser = new JalviewFileChooser("wsparams",
184               "Web Service Parameter File");
185       chooser.setFileView(new JalviewFileView());
186       chooser.setDialogTitle(MessageManager
187               .getString("label.choose_filename_for_param_file"));
188       chooser.setToolTipText(MessageManager.getString("action.save"));
189       int value = chooser.showSaveDialog(Desktop.instance);
190       if (value == JalviewFileChooser.APPROVE_OPTION)
191       {
192         outfile = chooser.getSelectedFile();
193         jalview.bin.Cache.setProperty("LAST_DIRECTORY",
194                 outfile.getParent());
195         filename = outfile.getAbsolutePath();
196         if (!filename.endsWith(".wsparams"))
197         {
198           filename = filename.concat(".wsparams");
199           outfile = new File(filename);
200         }
201       }
202     }
203     if (outfile != null)
204     {
205       String paramFiles = jalview.bin.Cache.getDefault("WS_PARAM_FILES",
206               filename);
207       if (paramFiles.indexOf(filename) == -1)
208       {
209         if (paramFiles.length() > 0)
210         {
211           paramFiles = paramFiles.concat("|");
212         }
213         paramFiles = paramFiles.concat(filename);
214       }
215       jalview.bin.Cache.setProperty("WS_PARAM_FILES", paramFiles);
216
217       jalview.schemabinding.version2.WebServiceParameterSet paramxml = new jalview.schemabinding.version2.WebServiceParameterSet();
218
219       paramxml.setName(parameterSet.getName());
220       paramxml.setDescription(parameterSet.getDescription());
221       paramxml.setServiceURL(parameterSet.getApplicableUrls().clone());
222       paramxml.setVersion("1.0");
223       try
224       {
225         paramxml.setParameters(
226                 parser.generateServiceParameterFile(parameterSet));
227         PrintWriter out = new PrintWriter(new OutputStreamWriter(
228                 new FileOutputStream(outfile), "UTF-8"));
229         paramxml.marshal(out);
230         out.close();
231         parameterSet.setSourceFile(filename);
232       } catch (Exception e)
233       {
234         Cache.log.error("Couldn't write parameter file to " + outfile, e);
235       }
236     }
237   }
238
239   /*
240    * 
241    * JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
242    * .getProperty("LAST_DIRECTORY"), new String[] { "jc" }, new String[] {
243    * "Jalview User Colours" }, "Jalview User Colours"); chooser.setFileView(new
244    * jalview.io.JalviewFileView());
245    * chooser.setDialogTitle("Load colour scheme");
246    * chooser.setToolTipText("Load");
247    * 
248    * int value = chooser.showOpenDialog(this);
249    * 
250    * if (value == JalviewFileChooser.APPROVE_OPTION) { File choice =
251    * chooser.getSelectedFile(); jalview.bin.Cache.setProperty("LAST_DIRECTORY",
252    * choice.getParent()); String defaultColours = jalview.bin.Cache.getDefault(
253    * "USER_DEFINED_COLOURS", choice.getPath()); if
254    * (defaultColours.indexOf(choice.getPath()) == -1) { defaultColours =
255    * defaultColours.concat("|") .concat(choice.getPath()); } (non-Javadoc)
256    * 
257    * @see
258    * jalview.ws.params.ParamManager#deleteParameterSet(jalview.ws.params.WsParamSetI
259    * )
260    */
261   @Override
262   public void deleteParameterSet(WsParamSetI parameterSet)
263   {
264     String filename = parameterSet.getSourceFile();
265     if (filename == null || filename.trim().length() < 1)
266     {
267       return;
268     }
269     String paramFiles = jalview.bin.Cache.getDefault("WS_PARAM_FILES", "");
270     if (paramFiles.indexOf(filename) > -1)
271     {
272       String nparamFiles = new String();
273       StringTokenizer st = new StringTokenizer(paramFiles, "|");
274       while (st.hasMoreElements())
275       {
276         String fl = st.nextToken();
277         if (!fl.equals(filename))
278         {
279           nparamFiles = nparamFiles.concat("|").concat(fl);
280         }
281       }
282       jalview.bin.Cache.setProperty("WS_PARAM_FILES", nparamFiles);
283     }
284
285     try
286     {
287       File pfile = new File(filename);
288       if (pfile.exists() && pfile.canWrite())
289       {
290         if (JvOptionPane.showConfirmDialog(Desktop.instance,
291                 "Delete the preset's file, too ?", "Delete User Preset ?",
292                 JvOptionPane.OK_CANCEL_OPTION) == JvOptionPane.OK_OPTION)
293         {
294           pfile.delete();
295         }
296       }
297     } catch (Exception e)
298     {
299       Cache.log.error(
300               "Exception when trying to delete webservice user preset: ",
301               e);
302     }
303   }
304
305   @Override
306   public void registerParser(String hosturl, ParamDatastoreI paramdataStore)
307   {
308     paramparsers.put(hosturl, paramdataStore);
309   }
310
311 }