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;
65 this.saveParameters(request);
72 body = RestHandler.getInstance().getRequestBody(request, response);
73 } catch (IOException e)
75 returnError(request, response, "could not read POST body");
76 Console.debug("Could not read POST body", e);
79 // for ref see md5 later
84 // for ref see md5 later
86 else if (fileString != null)
91 else if (urlString != null)
99 returnError(request, response,
100 "requires POST body or one of parameters 'data', 'file' or 'url'");
104 // final content used in Future
106 if (isPost || hasData)
108 content = isPost ? body : data;
109 objectsPassedToProcessAsync.put("content", content); // needed as "final
110 // String" in process
113 MessageDigest md5 = MessageDigest.getInstance("MD5");
114 md5.update(content.getBytes());
115 byte[] digest = md5.digest();
116 ref = DatatypeConverter.printBase64Binary(digest).toLowerCase();
117 } catch (NoSuchAlgorithmException e)
119 Console.debug("Could not find MD5 algorithm", e);
126 objectsPassedToProcessAsync.put("content", content);
128 setId(request, access + "::" + ref);
131 protected void process(HttpServletRequest request,
132 HttpServletResponse response)
134 processAsync(request, response, null);
137 protected void processAsync(HttpServletRequest request,
138 HttpServletResponse response, final Map<String, Object> finalMap)
140 String content = (String) finalMap.get("content");
141 if (isPost || hasData)
143 // Sequence file contents being posted
144 // use File -> Input Alignment -> from Textbox
145 CutAndPasteTransfer cap = new CutAndPasteTransfer();
146 cap.setText(content);
148 Map<String, String> options = getOptions(request);
150 cap.ok_actionPerformed(null, options);
151 cap.cancel_actionPerformed(null);
153 else if (fileString != null)
155 // Sequence file on filesystem
156 // use File -> Input Alignment -> From File
161 url = new URL(fileString);
162 file = new File(url.toURI());
163 } catch (MalformedURLException | URISyntaxException e)
165 returnError(request, response,
166 "could not resolve file='" + fileString + "'");
167 Console.debug("Could not resolve file '" + fileString + "'", e);
172 returnError(request, response,
173 "file='" + fileString + "' does not exist");
176 Desktop.instance.openFile(file, null, null);
178 else if (urlString != null)
180 boolean success = Desktop.instance.loadUrl(urlString, null);
183 returnError(request, response,
184 "url='" + urlString + "' could not be opened");