package jalview.rest;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.DatatypeConverter;
import jalview.bin.Console;
import jalview.gui.CutAndPasteTransfer;
import jalview.gui.Desktop;
public class InputAlignmentEndpoint extends AbstractEndpointAsync
{
public InputAlignmentEndpoint(API api)
{
super(api, path, name, parameters, description);
}
protected static final String path = "inputalignment";
private static final String name = "Input Alignment";
private static final String parameters = "POST
| GET ?[data=|file=|url=]";
private static final String description = "Input an alignment from POST request body, GET request 'data' parameter, local file in 'file' parameter, url in 'url' parameter";
private String fileString;
private String urlString;
private String method;
private String data;
private String body;
private boolean isPost;
private boolean hasData;
private String access = null;
private String ref = null;
@Override
protected void initialise(HttpServletRequest request,
HttpServletResponse response)
{
fileString = request.getParameter("file");
urlString = request.getParameter("url");
method = request.getMethod().toLowerCase();
data = request.getParameter("data");
body = null;
isPost = method.equalsIgnoreCase("post");
hasData = data != null;
this.saveParameters(request);
if (isPost)
{
access = "post";
try
{
body = RestHandler.getInstance().getRequestBody(request, response);
} catch (IOException e)
{
returnError(request, response, "could not read POST body");
Console.debug("Could not read POST body", e);
return;
}
// for ref see md5 later
}
else if (hasData)
{
access = "data";
// for ref see md5 later
}
else if (fileString != null)
{
access = "file";
ref = fileString;
}
else if (urlString != null)
{
access = "url";
ref = urlString;
}
if (access == null)
{
returnError(request, response,
"requires POST body or one of parameters 'data', 'file' or 'url'");
return;
}
// final content used in Future
String content;
if (isPost || hasData)
{
content = isPost ? body : data;
objectsPassedToProcessAsync.put("content", content); // needed as "final
// String" in process
try
{
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(content.getBytes());
byte[] digest = md5.digest();
ref = DatatypeConverter.printBase64Binary(digest).toLowerCase();
} catch (NoSuchAlgorithmException e)
{
Console.debug("Could not find MD5 algorithm", e);
}
}
else
{
content = null;
}
objectsPassedToProcessAsync.put("content", content);
setId(request, access + "::" + ref);
}
protected void process(HttpServletRequest request,
HttpServletResponse response)
{
processAsync(request, response, null);
}
protected void processAsync(HttpServletRequest request,
HttpServletResponse response, final Map finalMap)
{
String content = (String) finalMap.get("content");
if (isPost || hasData)
{
// Sequence file contents being posted
// use File -> Input Alignment -> from Textbox
CutAndPasteTransfer cap = new CutAndPasteTransfer();
cap.setText(content);
Map options = getOptions(request);
cap.ok_actionPerformed(null, options);
cap.cancel_actionPerformed(null);
}
else if (fileString != null)
{
// Sequence file on filesystem
// use File -> Input Alignment -> From File
URL url = null;
File file = null;
try
{
url = new URL(fileString);
file = new File(url.toURI());
} catch (MalformedURLException | URISyntaxException e)
{
returnError(request, response,
"could not resolve file='" + fileString + "'");
Console.debug("Could not resolve file '" + fileString + "'", e);
return;
}
if (!file.exists())
{
returnError(request, response,
"file='" + fileString + "' does not exist");
return;
}
Desktop.instance.openFile(file, null, null);
}
else if (urlString != null)
{
boolean success = Desktop.instance.loadUrl(urlString, null);
if (!success)
{
returnError(request, response,
"url='" + urlString + "' could not be opened");
return;
}
}
}
}