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 javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.bind.DatatypeConverter; import jalview.bin.Cache; import jalview.gui.CutAndPasteTransfer; import jalview.gui.Desktop; public class OpenSequenceEndpoint extends EndpointAsync { protected String name = "opensequence"; private String fileString; private String urlString; private String method; private String dataString; private String body; private String content; private boolean post; private boolean data; String access = null; String ref = null; @Override protected void initialise(HttpServletRequest request, HttpServletResponse response) { fileString = request.getParameter("file"); urlString = request.getParameter("url"); method = request.getMethod().toLowerCase(); dataString = request.getParameter("data"); body = null; post = method.equalsIgnoreCase("post"); data = dataString != null; if (post) { access = "post"; try { body = getRequestBody(request); } catch (IOException e) { returnError(request, response, "could not read POST body"); Cache.debug(e); return; } // for ref see md5 later } else if (data) { 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 final String content; if (post || data) { content = post ? body : dataString; try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(content.getBytes()); byte[] digest = md5.digest(); ref = DatatypeConverter.printBase64Binary(digest).toLowerCase(); } catch (NoSuchAlgorithmException e) { Cache.debug(e); } } else { content = null; } setId(request, access + "::" + ref); } protected void process(HttpServletRequest request, HttpServletResponse response) { if (post || data) { // 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 + "'"); Cache.debug(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; } } } }