X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=blobdiff_plain;f=knowledge%2Forg.argeo.support.odk%2Fsrc%2Forg%2Fargeo%2Fsupport%2Fodk%2Fservlet%2FOdkManifestServlet.java;fp=knowledge%2Forg.argeo.support.odk%2Fsrc%2Forg%2Fargeo%2Fsupport%2Fodk%2Fservlet%2FOdkManifestServlet.java;h=88b9c69efdb41f74e0fda931fc4fd13e7ad52be4;hp=0000000000000000000000000000000000000000;hb=384e41caf78222c53e5cf365bb93310e5b28462b;hpb=65030067b0125a4399f58b897b78debded2984d3 diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java new file mode 100644 index 0000000..88b9c69 --- /dev/null +++ b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java @@ -0,0 +1,108 @@ +package org.argeo.support.odk.servlet; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.Writer; +import java.nio.charset.StandardCharsets; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Property; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.argeo.cms.servlet.ServletAuthUtils; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrException; +import org.argeo.support.odk.OrxManifestName; +import org.argeo.util.DigestUtils; + +/** Describe additional files. */ +public class OdkManifestServlet extends HttpServlet { + private static final long serialVersionUID = 138030510865877478L; + + private Repository repository; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.setContentType("text/xml; charset=utf-8"); + resp.setHeader("X-OpenRosa-Version", "1.0"); + resp.setDateHeader("Date", System.currentTimeMillis()); + + String pathInfo = req.getPathInfo(); + if (pathInfo.startsWith("//")) + pathInfo = pathInfo.substring(1); + + String serverName = req.getServerName(); + int serverPort = req.getServerPort(); + String protocol = serverPort == 443 || req.isSecure() ? "https" : "http"; + + Session session = ServletAuthUtils.doAs(() -> Jcr.login(repository, null), req); + + try { + Node node = session.getNode(pathInfo); + if (node.isNodeType(OrxManifestName.manifest.get())) { + Writer writer = resp.getWriter(); + writer.append(""); + writer.append(""); + NodeIterator nit = node.getNodes(); + while (nit.hasNext()) { + Node file = nit.nextNode(); + if (file.isNodeType(OrxManifestName.mediaFile.get())) { + writer.append(""); + + if (file.isNodeType(NodeType.NT_ADDRESS)) { + Node target = file.getProperty(Property.JCR_ID).getNode(); + writer.append(""); + writer.append(target.getPath().substring(1) + ".xml"); + writer.append(""); + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + session.exportDocumentView(target.getPath(), out, true, false); + String fileCsum = DigestUtils.digest(DigestUtils.MD5, out.toByteArray()); +// JcrxApi.addChecksum(file, fileCsum); + writer.append(""); + writer.append("md5sum:" + fileCsum); + writer.append(""); + } + writer.append("" + protocol + "://" + serverName + + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort) + + "/api/odk/formManifest" + file.getPath() + ""); + } + writer.append(""); + } + } + + writer.append(""); + } else if (node.isNodeType(OrxManifestName.mediaFile.get())) { + if (node.isNodeType(NodeType.NT_ADDRESS)) { + Node target = node.getProperty(Property.JCR_ID).getNode(); + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + session.exportDocumentView(target.getPath(), out, true, false); + System.out.println(new String(out.toByteArray(), StandardCharsets.UTF_8)); + resp.getOutputStream().write(out.toByteArray()); + } + } else { + throw new IllegalArgumentException("Unsupported node " + node); + } + } else { + throw new IllegalArgumentException("Unsupported node " + node); + } + } catch (RepositoryException e) { + throw new JcrException(e); + } finally { + Jcr.logout(session); + } + + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + +}