JAL-3851 re-engineering endpoints as separate classes
[jalview.git] / src / jalview / rest / OpenSequenceEndpoint.java
1 package jalview.rest;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.net.MalformedURLException;
6 import java.net.URISyntaxException;
7 import java.net.URL;
8 import java.security.MessageDigest;
9 import java.security.NoSuchAlgorithmException;
10
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 import javax.xml.bind.DatatypeConverter;
14
15 import jalview.bin.Cache;
16 import jalview.gui.CutAndPasteTransfer;
17 import jalview.gui.Desktop;
18
19 public class OpenSequenceEndpoint extends EndpointAsync
20 {
21   protected String name = "opensequence";
22
23   private String fileString;
24
25   private String urlString;
26
27   private String method;
28
29   private String dataString;
30
31   private String body;
32
33   private String content;
34
35   private boolean post;
36
37   private boolean data;
38
39   String access = null;
40
41   String ref = null;
42
43   @Override
44   protected void initialise(HttpServletRequest request,
45           HttpServletResponse response)
46   {
47     fileString = request.getParameter("file");
48     urlString = request.getParameter("url");
49     method = request.getMethod().toLowerCase();
50     dataString = request.getParameter("data");
51     body = null;
52     post = method.equalsIgnoreCase("post");
53     data = dataString != null;
54
55     if (post)
56     {
57       access = "post";
58       try
59       {
60         body = getRequestBody(request);
61       } catch (IOException e)
62       {
63         returnError(request, response, "could not read POST body");
64         Cache.debug(e);
65         return;
66       }
67       // for ref see md5 later
68     }
69     else if (data)
70     {
71       access = "data";
72       // for ref see md5 later
73     }
74     else if (fileString != null)
75     {
76       access = "file";
77       ref = fileString;
78     }
79     else if (urlString != null)
80     {
81       access = "url";
82       ref = urlString;
83     }
84
85     if (access == null)
86     {
87       returnError(request, response,
88               "requires POST body or one of parameters 'data', 'file' or 'url'");
89       return;
90     }
91
92     // final content used in Future
93     final String content;
94     if (post || data)
95     {
96       content = post ? body : dataString;
97       try
98       {
99         MessageDigest md5 = MessageDigest.getInstance("MD5");
100         md5.update(content.getBytes());
101         byte[] digest = md5.digest();
102         ref = DatatypeConverter.printBase64Binary(digest).toLowerCase();
103       } catch (NoSuchAlgorithmException e)
104       {
105         Cache.debug(e);
106       }
107     }
108     else
109     {
110       content = null;
111     }
112
113     setId(request, access + "::" + ref);
114   }
115
116   protected void process(HttpServletRequest request,
117           HttpServletResponse response)
118   {
119     if (post || data)
120     {
121       // Sequence file contents being posted
122       // use File -> Input Alignment -> from Textbox
123       CutAndPasteTransfer cap = new CutAndPasteTransfer();
124       cap.setText(content);
125       cap.ok_actionPerformed(null);
126       cap.cancel_actionPerformed(null);
127     }
128     else if (fileString != null)
129     {
130       // Sequence file on filesystem
131       // use File -> Input Alignment -> From File
132       URL url = null;
133       File file = null;
134       try
135       {
136         url = new URL(fileString);
137         file = new File(url.toURI());
138       } catch (MalformedURLException | URISyntaxException e)
139       {
140         returnError(request, response,
141                 "could not resolve file='" + fileString + "'");
142         Cache.debug(e);
143         return;
144       }
145       if (!file.exists())
146       {
147         returnError(request, response,
148                 "file='" + fileString + "' does not exist");
149         return;
150       }
151       Desktop.instance.openFile(file, null, null);
152     }
153     else if (urlString != null)
154     {
155       boolean success = Desktop.instance.loadUrl(urlString, null);
156       if (!success)
157       {
158         returnError(request, response,
159                 "url='" + urlString + "' could not be opened");
160         return;
161       }
162     }
163   }
164 }