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; if (isPost) { access = "post"; try { body = RestHandler.getInstance().getRequestBody(request, response); Console.debug("BODY='" + body + "'"); } 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); cap.ok_actionPerformed(null); 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; } } } }