1 package org
.argeo
.support
.odk
.servlet
;
3 import java
.io
.ByteArrayOutputStream
;
4 import java
.io
.IOException
;
6 import java
.nio
.charset
.StandardCharsets
;
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
;
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
;
26 /** Describe additional files. */
27 public class OdkManifestServlet
extends HttpServlet
{
28 private static final long serialVersionUID
= 138030510865877478L;
30 private Repository repository
;
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());
38 String pathInfo
= req
.getPathInfo();
39 if (pathInfo
.startsWith("//"))
40 pathInfo
= pathInfo
.substring(1);
42 String serverName
= req
.getServerName();
43 int serverPort
= req
.getServerPort();
44 String protocol
= serverPort
== 443 || req
.isSecure() ?
"https" : "http";
46 Session session
= ServletAuthUtils
.doAs(() -> Jcr
.login(repository
, null), req
);
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>");
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>");
73 writer
.append("<downloadUrl>" + protocol
+ "://" + serverName
74 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
)
75 + "/api/odk/formManifest" + file
.getPath() + "</downloadUrl>");
77 writer
.append("</mediaFile>");
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());
91 throw new IllegalArgumentException("Unsupported node " + node
);
94 throw new IllegalArgumentException("Unsupported node " + node
);
96 } catch (RepositoryException e
) {
97 throw new JcrException(e
);
104 public void setRepository(Repository repository
) {
105 this.repository
= repository
;