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 = RestHandler.getInstance().getRequestBody(request, response);
71 Console.debug("BODY='" + body + "'");
72 } catch (IOException e)
74 returnError(request, response, "could not read POST body");
75 Console.debug("Could not read POST body", e);
78 // for ref see md5 later
83 // for ref see md5 later
85 else if (fileString != null)
90 else if (urlString != null)
98 returnError(request, response,
99 "requires POST body or one of parameters 'data', 'file' or 'url'");
103 // final content used in Future
105 if (isPost || hasData)
107 content = isPost ? body : data;
108 objectsPassedToProcessAsync.put("content", content); // needed as "final
109 // String" in process
112 MessageDigest md5 = MessageDigest.getInstance("MD5");
113 md5.update(content.getBytes());
114 byte[] digest = md5.digest();
115 ref = DatatypeConverter.printBase64Binary(digest).toLowerCase();
116 } catch (NoSuchAlgorithmException e)
118 Console.debug("Could not find MD5 algorithm", e);
125 objectsPassedToProcessAsync.put("content", content);
127 setId(request, access + "::" + ref);
130 protected void process(HttpServletRequest request,
131 HttpServletResponse response)
133 processAsync(request, response, null);
136 protected void processAsync(HttpServletRequest request,
137 HttpServletResponse response, final Map<String, Object> finalMap)
139 String content = (String) finalMap.get("content");
140 if (isPost || hasData)
142 // Sequence file contents being posted
143 // use File -> Input Alignment -> from Textbox
144 CutAndPasteTransfer cap = new CutAndPasteTransfer();
145 cap.setText(content);
146 cap.ok_actionPerformed(null);
147 cap.cancel_actionPerformed(null);
149 else if (fileString != null)
151 // Sequence file on filesystem
152 // use File -> Input Alignment -> From File
157 url = new URL(fileString);
158 file = new File(url.toURI());
159 } catch (MalformedURLException | URISyntaxException e)
161 returnError(request, response,
162 "could not resolve file='" + fileString + "'");
163 Console.debug("Could not resolve file '" + fileString + "'", e);
168 returnError(request, response,
169 "file='" + fileString + "' does not exist");
172 Desktop.instance.openFile(file, null, null);
174 else if (urlString != null)
176 boolean success = Desktop.instance.loadUrl(urlString, null);
179 returnError(request, response,
180 "url='" + urlString + "' could not be opened");