/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.gui;
import jalview.bin.Cache;
import jalview.bin.Console;
import jalview.io.JalviewFileChooser;
import jalview.io.JalviewFileView;
import jalview.util.MessageManager;
import jalview.ws.params.ParamDatastoreI;
import jalview.ws.params.ParamManager;
import jalview.ws.params.WsParamSetI;
import jalview.xml.binding.jalview.ObjectFactory;
import jalview.xml.binding.jalview.WebServiceParameterSet;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.StringTokenizer;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
/**
* store and retrieve web service parameter sets.
*
* @author JimP
*
*/
public class WsParamSetManager implements ParamManager
{
private static final String WS_PARAM_FILES = "WS_PARAM_FILES";
Hashtable paramparsers = new Hashtable<>();
@Override
public WsParamSetI[] getParameterSet(String name, String serviceUrl,
boolean modifiable, boolean unmodifiable)
{
String files = Cache.getProperty(WS_PARAM_FILES);
if (files == null)
{
return null;
}
StringTokenizer st = new StringTokenizer(files, "|");
String pfile = null;
List params = new ArrayList<>();
while (st.hasMoreTokens())
{
pfile = st.nextToken();
try
{
WsParamSetI[] pset = parseParamFile(pfile);
for (WsParamSetI p : pset)
{
boolean add = false;
if (serviceUrl != null)
{
for (String url : p.getApplicableUrls())
{
if (url.equals(serviceUrl))
{
add = true;
}
}
}
else
{
add = true;
}
add &= (modifiable == p.isModifiable()
|| unmodifiable == !p.isModifiable());
add &= name == null || p.getName().equals(name);
if (add)
{
params.add(p);
}
}
} catch (IOException e)
{
Console.info("Failed to parse parameter file " + pfile
+ " (Check that all JALVIEW_WSPARAMFILES entries are valid!)",
e);
}
}
return params.toArray(new WsParamSetI[0]);
}
private WsParamSetI[] parseParamFile(String filename) throws IOException
{
List psets = new ArrayList<>();
InputStreamReader is = new InputStreamReader(
new FileInputStream(new File(filename)), "UTF-8");
WebServiceParameterSet wspset = null;
try
{
JAXBContext jc = JAXBContext
.newInstance("jalview.xml.binding.jalview");
javax.xml.bind.Unmarshaller um = jc.createUnmarshaller();
XMLStreamReader streamReader = XMLInputFactory.newInstance()
.createXMLStreamReader(is);
JAXBElement jbe = um.unmarshal(streamReader,
WebServiceParameterSet.class);
wspset = jbe.getValue();
} catch (Exception ex)
{
throw new IOException(ex);
}
if (wspset != null && wspset.getParameters().length() > 0)
{
List urls = wspset.getServiceURL();
final String[] urlArray = urls.toArray(new String[urls.size()]);
for (String url : urls)
{
ParamDatastoreI parser = paramparsers.get(url);
if (parser != null)
{
WsParamSetI pset = parser.parseServiceParameterFile(
wspset.getName(), wspset.getDescription(),
urlArray, wspset.getParameters());
if (pset != null)
{
pset.setSourceFile(filename);
psets.add(pset);
break;
}
}
}
}
return psets.toArray(new WsParamSetI[0]);
}
@Override
public void storeParameterSet(WsParamSetI parameterSet)
{
String filename = parameterSet.getSourceFile();
File outfile = null;
try
{
if (filename != null && !((outfile = new File(filename)).canWrite()))
{
Console.warn("Can't write to " + filename
+ " - Prompting for new file to write to.");
filename = null;
}
} catch (Exception e)
{
filename = null;
}
ParamDatastoreI parser = null;
for (String urls : parameterSet.getApplicableUrls())
{
if (parser == null)
{
parser = paramparsers.get(urls);
}
}
if (parser == null)
{
throw new Error(MessageManager.getString(
"error.implementation_error_cannot_find_marshaller_for_param_set"));
}
if (filename == null)
{
// TODO: JAL-3048 webservice - not required for Jalview-JS
JalviewFileChooser chooser = new JalviewFileChooser("wsparams",
"Web Service Parameter File");
chooser.setFileView(new JalviewFileView());
chooser.setDialogTitle(MessageManager
.getString("label.choose_filename_for_param_file"));
chooser.setToolTipText(MessageManager.getString("action.save"));
int value = chooser.showSaveDialog(Desktop.getInstance());
if (value == JalviewFileChooser.APPROVE_OPTION)
{
outfile = chooser.getSelectedFile();
Cache.setProperty("LAST_DIRECTORY", outfile.getParent());
filename = outfile.getAbsolutePath();
if (!filename.endsWith(".wsparams"))
{
filename = filename.concat(".wsparams");
outfile = new File(filename);
}
}
}
if (outfile != null)
{
String paramFiles = Cache.getDefault("WS_PARAM_FILES", filename);
if (paramFiles.indexOf(filename) == -1)
{
if (paramFiles.length() > 0)
{
paramFiles = paramFiles.concat("|");
}
paramFiles = paramFiles.concat(filename);
}
Cache.setProperty(WS_PARAM_FILES, paramFiles);
WebServiceParameterSet paramxml = new WebServiceParameterSet();
paramxml.setName(parameterSet.getName());
paramxml.setDescription(parameterSet.getDescription());
for (String url : parameterSet.getApplicableUrls())
{
paramxml.getServiceURL().add(url);
}
paramxml.setVersion("1.0");
try
{
paramxml.setParameters(
parser.generateServiceParameterFile(parameterSet));
PrintWriter out = new PrintWriter(new OutputStreamWriter(
new FileOutputStream(outfile), "UTF-8"));
JAXBContext jaxbContext = JAXBContext
.newInstance(WebServiceParameterSet.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.marshal(
new ObjectFactory().createWebServiceParameterSet(paramxml),
out);
out.close();
parameterSet.setSourceFile(filename);
} catch (Exception e)
{
Console.error("Couldn't write parameter file to " + outfile, e);
}
}
}
/*
*
* JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
* .getProperty("LAST_DIRECTORY"), new String[] { "jc" }, new String[] {
* "Jalview User Colours" }, "Jalview User Colours"); chooser.setFileView(new
* jalview.io.JalviewFileView());
* chooser.setDialogTitle("Load colour scheme");
* chooser.setToolTipText("Load");
*
* int value = chooser.showOpenDialog(this);
*
* if (value == JalviewFileChooser.APPROVE_OPTION) { File choice =
* chooser.getSelectedFile(); jalview.bin.Cache.setProperty("LAST_DIRECTORY",
* choice.getParent()); String defaultColours = jalview.bin.Cache.getDefault(
* "USER_DEFINED_COLOURS", choice.getPath()); if
* (defaultColours.indexOf(choice.getPath()) == -1) { defaultColours =
* defaultColours.concat("|") .concat(choice.getPath()); } (non-Javadoc)
*
* @see
* jalview.ws.params.ParamManager#deleteParameterSet(jalview.ws.params.WsParamSetI
* )
*/
@Override
public void deleteParameterSet(WsParamSetI parameterSet)
{
String filename = parameterSet.getSourceFile();
if (filename == null || filename.trim().length() < 1)
{
return;
}
String paramFiles = Cache.getDefault(WS_PARAM_FILES, "");
if (paramFiles.indexOf(filename) > -1)
{
String nparamFiles = new String();
StringTokenizer st = new StringTokenizer(paramFiles, "|");
while (st.hasMoreElements())
{
String fl = st.nextToken();
if (!fl.equals(filename))
{
nparamFiles = nparamFiles.concat("|").concat(fl);
}
}
Cache.setProperty(WS_PARAM_FILES, nparamFiles);
}
try
{
File pfile = new File(filename);
if (pfile.exists() && pfile.canWrite())
{
if (JvOptionPane.showConfirmDialog(Desktop.getInstance(),
"Delete the preset's file, too ?", "Delete User Preset ?",
JvOptionPane.OK_CANCEL_OPTION) == JvOptionPane.OK_OPTION)
{
pfile.delete();
}
}
} catch (Exception e)
{
Console.error(
"Exception when trying to delete webservice user preset: ",
e);
}
}
@Override
public void registerParser(String hosturl, ParamDatastoreI paramdataStore)
{
paramparsers.put(hosturl, paramdataStore);
}
}