4 import java.io.IOException;
5 import java.net.MalformedURLException;
6 import java.net.URISyntaxException;
8 import java.security.MessageDigest;
9 import java.security.NoSuchAlgorithmException;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 import javax.xml.bind.DatatypeConverter;
16 import jalview.bin.Console;
17 import jalview.gui.CutAndPasteTransfer;
18 import jalview.gui.Desktop;
20 public class InputAlignmentEndpoint extends AbstractEndpointAsync
22 public InputAlignmentEndpoint(API api)
24 super(api, path, name, parameters, description);
27 protected static final String path = "inputalignment";
29 private static final String name = "Input Alignment";
31 private static final String parameters = "POST <body> | GET ?[data=<data>|file=<fileURI>|url=<URL>]";
33 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";
35 private String fileString;
37 private String urlString;
39 private String method;
45 private boolean isPost;
47 private boolean hasData;
49 private String access = null;
51 private String ref = null;
54 protected void initialise(HttpServletRequest request,
55 HttpServletResponse response)
57 fileString = request.getParameter("file");
58 urlString = request.getParameter("url");
59 method = request.getMethod().toLowerCase();
60 data = request.getParameter("data");
62 isPost = method.equalsIgnoreCase("post");
63 hasData = data != null;
70 body = getRequestBody(request);
71 } catch (IOException e)
73 returnError(request, response, "could not read POST body");
74 Console.debug("Could not read POST body", e);
77 // for ref see md5 later
82 // for ref see md5 later
84 else if (fileString != null)
89 else if (urlString != null)
97 returnError(request, response,
98 "requires POST body or one of parameters 'data', 'file' or 'url'");
102 // final content used in Future
104 if (isPost || hasData)
106 content = isPost ? body : data;
107 objectsPassedToProcessAsync.put("content", content); // needed as "final
108 // String" in process
111 MessageDigest md5 = MessageDigest.getInstance("MD5");
112 md5.update(content.getBytes());
113 byte[] digest = md5.digest();
114 ref = DatatypeConverter.printBase64Binary(digest).toLowerCase();
115 } catch (NoSuchAlgorithmException e)
117 Console.debug("Could not find MD5 algorithm", e);
124 objectsPassedToProcessAsync.put("content", content);
126 setId(request, access + "::" + ref);
129 protected void process(HttpServletRequest request,
130 HttpServletResponse response)
132 processAsync(request, response, null);
135 protected void processAsync(HttpServletRequest request,
136 HttpServletResponse response, final Map<String, Object> finalMap)
138 String content = (String) finalMap.get("content");
139 if (isPost || hasData)
141 // Sequence file contents being posted
142 // use File -> Input Alignment -> from Textbox
143 CutAndPasteTransfer cap = new CutAndPasteTransfer();
144 cap.setText(content);
145 cap.ok_actionPerformed(null);
146 cap.cancel_actionPerformed(null);
148 else if (fileString != null)
150 // Sequence file on filesystem
151 // use File -> Input Alignment -> From File
156 url = new URL(fileString);
157 file = new File(url.toURI());
158 } catch (MalformedURLException | URISyntaxException e)
160 returnError(request, response,
161 "could not resolve file='" + fileString + "'");
162 Console.debug("Could not resolve file '" + fileString + "'", e);
167 returnError(request, response,
168 "file='" + fileString + "' does not exist");
171 Desktop.instance.openFile(file, null, null);
173 else if (urlString != null)
175 boolean success = Desktop.instance.loadUrl(urlString, null);
178 returnError(request, response,
179 "url='" + urlString + "' could not be opened");