]> git.argeo.org Git - gpl/argeo-suite.git/blob - knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java
Use stack layout for tabbed area.
[gpl/argeo-suite.git] / knowledge / org.argeo.support.odk / src / org / argeo / support / odk / servlet / OdkManifestServlet.java
1 package org.argeo.support.odk.servlet;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.IOException;
5 import java.io.Writer;
6 import java.nio.charset.StandardCharsets;
7
8 import javax.jcr.Node;
9 import javax.jcr.NodeIterator;
10 import javax.jcr.Property;
11 import javax.jcr.Repository;
12 import javax.jcr.RepositoryException;
13 import javax.jcr.Session;
14 import javax.jcr.nodetype.NodeType;
15 import javax.servlet.ServletException;
16 import javax.servlet.http.HttpServlet;
17 import javax.servlet.http.HttpServletRequest;
18 import javax.servlet.http.HttpServletResponse;
19
20 import org.argeo.cms.servlet.ServletAuthUtils;
21 import org.argeo.jcr.Jcr;
22 import org.argeo.jcr.JcrException;
23 import org.argeo.support.odk.OrxManifestName;
24 import org.argeo.util.DigestUtils;
25
26 /** Describe additional files. */
27 public class OdkManifestServlet extends HttpServlet {
28 private static final long serialVersionUID = 138030510865877478L;
29
30 private Repository repository;
31
32 @Override
33 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
34 resp.setContentType("text/xml; charset=utf-8");
35 resp.setHeader("X-OpenRosa-Version", "1.0");
36 resp.setDateHeader("Date", System.currentTimeMillis());
37
38 String pathInfo = req.getPathInfo();
39 if (pathInfo.startsWith("//"))
40 pathInfo = pathInfo.substring(1);
41
42 String serverName = req.getServerName();
43 int serverPort = req.getServerPort();
44 String protocol = serverPort == 443 || req.isSecure() ? "https" : "http";
45
46 Session session = ServletAuthUtils.doAs(() -> Jcr.login(repository, null), req);
47
48 try {
49 Node node = session.getNode(pathInfo);
50 if (node.isNodeType(OrxManifestName.manifest.get())) {
51 Writer writer = resp.getWriter();
52 writer.append("<?xml version='1.0' encoding='UTF-8' ?>");
53 writer.append("<manifest xmlns=\"http://openrosa.org/xforms/xformsManifest\">");
54 NodeIterator nit = node.getNodes();
55 while (nit.hasNext()) {
56 Node file = nit.nextNode();
57 if (file.isNodeType(OrxManifestName.mediaFile.get())) {
58 writer.append("<mediaFile>");
59
60 if (file.isNodeType(NodeType.NT_ADDRESS)) {
61 Node target = file.getProperty(Property.JCR_ID).getNode();
62 writer.append("<filename>");
63 writer.append(target.getPath().substring(1) + ".xml");
64 writer.append("</filename>");
65 try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
66 session.exportDocumentView(target.getPath(), out, true, false);
67 String fileCsum = DigestUtils.digest(DigestUtils.MD5, out.toByteArray());
68 // JcrxApi.addChecksum(file, fileCsum);
69 writer.append("<hash>");
70 writer.append("md5sum:" + fileCsum);
71 writer.append("</hash>");
72 }
73 writer.append("<downloadUrl>" + protocol + "://" + serverName
74 + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort)
75 + "/api/odk/formManifest" + file.getPath() + "</downloadUrl>");
76 }
77 writer.append("</mediaFile>");
78 }
79 }
80
81 writer.append("</manifest>");
82 } else if (node.isNodeType(OrxManifestName.mediaFile.get())) {
83 if (node.isNodeType(NodeType.NT_ADDRESS)) {
84 Node target = node.getProperty(Property.JCR_ID).getNode();
85 try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
86 session.exportDocumentView(target.getPath(), out, true, false);
87 System.out.println(new String(out.toByteArray(), StandardCharsets.UTF_8));
88 resp.getOutputStream().write(out.toByteArray());
89 }
90 } else {
91 throw new IllegalArgumentException("Unsupported node " + node);
92 }
93 } else {
94 throw new IllegalArgumentException("Unsupported node " + node);
95 }
96 } catch (RepositoryException e) {
97 throw new JcrException(e);
98 } finally {
99 Jcr.logout(session);
100 }
101
102 }
103
104 public void setRepository(Repository repository) {
105 this.repository = repository;
106 }
107
108 }