]> git.argeo.org Git - gpl/argeo-suite.git/blob - knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkFormServlet.java
Use stack layout for tabbed area.
[gpl/argeo-suite.git] / knowledge / org.argeo.support.odk / src / org / argeo / support / odk / servlet / OdkFormServlet.java
1 package org.argeo.support.odk.servlet;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.io.OutputStream;
6 import java.util.Collections;
7 import java.util.HashMap;
8 import java.util.Map;
9
10 import javax.jcr.Repository;
11 import javax.jcr.RepositoryException;
12 import javax.jcr.Session;
13 import javax.servlet.ServletException;
14 import javax.servlet.http.HttpServlet;
15 import javax.servlet.http.HttpServletRequest;
16 import javax.servlet.http.HttpServletResponse;
17
18 import org.apache.commons.io.FilenameUtils;
19 import org.argeo.cms.servlet.ServletAuthUtils;
20 import org.argeo.jcr.Jcr;
21 import org.argeo.support.odk.OdkForm;
22 import org.argeo.support.odk.OdkNames;
23
24 /** Retrieves a single form. */
25 public class OdkFormServlet extends HttpServlet {
26 private static final long serialVersionUID = 7838305967987687370L;
27
28 private Repository repository;
29 private Map<String, OdkForm> odkForms = Collections.synchronizedMap(new HashMap<>());
30
31 @Override
32 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
33 resp.setContentType("text/xml; charset=utf-8");
34
35 Session session = ServletAuthUtils.doAs(() -> Jcr.login(repository, null), req);
36
37 String pathInfo = req.getPathInfo();
38 if (pathInfo.startsWith("//"))
39 pathInfo = pathInfo.substring(1);
40
41 boolean oldApproach = false;
42 try {
43 if (!oldApproach) {
44 session.exportDocumentView(pathInfo + "/" + OdkNames.H_HTML, resp.getOutputStream(), true, false);
45 } else {
46
47 String fileName = FilenameUtils.getName(pathInfo);
48 OdkForm form = odkForms.get(fileName);
49 if (form == null)
50 throw new IllegalArgumentException("No form named " + fileName + " was found");
51
52 byte[] buffer = new byte[1024];
53 try (InputStream in = form.openStream(); OutputStream out = resp.getOutputStream();) {
54 int bytesRead;
55 while ((bytesRead = in.read(buffer)) != -1)
56 out.write(buffer, 0, bytesRead);
57 }
58 }
59 } catch (RepositoryException e) {
60 e.printStackTrace();
61 // TODO error message
62 resp.sendError(500);
63 } finally {
64 Jcr.logout(session);
65 }
66 }
67
68 public void addForm(OdkForm odkForm) {
69 odkForms.put(odkForm.getFileName(), odkForm);
70 }
71
72 public void removeForm(OdkForm odkForm) {
73 odkForms.remove(odkForm.getFileName());
74 }
75
76 public void setRepository(Repository repository) {
77 this.repository = repository;
78 }
79
80 }