]> git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkFormListServlet.java
Prepare next development cycle
[gpl/argeo-suite.git] / org.argeo.app.servlet.odk / src / org / argeo / app / servlet / odk / OdkFormListServlet.java
1 package org.argeo.app.servlet.odk;
2
3 import java.io.IOException;
4 import java.io.Writer;
5
6 import javax.jcr.Node;
7 import javax.jcr.NodeIterator;
8 import javax.jcr.Property;
9 import javax.jcr.Repository;
10 import javax.jcr.RepositoryException;
11 import javax.jcr.Session;
12 import javax.jcr.query.Query;
13 import javax.jcr.query.QueryResult;
14 import javax.servlet.ServletException;
15 import javax.servlet.http.HttpServlet;
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpServletResponse;
18
19 import org.argeo.api.cms.CmsConstants;
20 import org.argeo.api.cms.CmsLog;
21 import org.argeo.app.api.EntityType;
22 import org.argeo.app.odk.OrxListName;
23 import org.argeo.app.odk.OrxManifestName;
24 import org.argeo.cms.auth.RemoteAuthUtils;
25 import org.argeo.cms.servlet.ServletHttpRequest;
26 import org.argeo.cms.servlet.ServletUtils;
27 import org.argeo.jcr.Jcr;
28 import org.argeo.jcr.JcrxApi;
29
30 /** Lists available forms. */
31 public class OdkFormListServlet extends HttpServlet {
32 private static final long serialVersionUID = 2706191315048423321L;
33 private final static CmsLog log = CmsLog.getLog(OdkFormListServlet.class);
34
35 private Repository repository;
36
37 @Override
38 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
39 resp.setContentType("text/xml; charset=utf-8");
40 resp.setHeader("X-OpenRosa-Version", "1.0");
41 resp.setDateHeader("Date", System.currentTimeMillis());
42
43 // we force HTTPS since ODK Collect will fail anyhow when sending http
44 // cf. https://forum.getodk.org/t/authentication-for-non-https-schems/32967/4
45 StringBuilder baseServer = ServletUtils.getRequestUrlBase(req, true);
46
47 String pathInfo = req.getPathInfo();
48
49 Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, CmsConstants.SYS_WORKSPACE),
50 new ServletHttpRequest(req));
51 Writer writer = resp.getWriter();
52 writer.append("<?xml version='1.0' encoding='UTF-8' ?>");
53 writer.append("<xforms xmlns=\"http://openrosa.org/xforms/xformsList\">");
54 try {
55
56 Query query;
57 if (pathInfo == null) {
58 query = session.getWorkspace().getQueryManager()
59 .createQuery("SELECT * FROM [" + OrxListName.xform.get() + "]", Query.JCR_SQL2);
60 } else {
61 query = session.getWorkspace().getQueryManager()
62 .createQuery(
63 "SELECT node FROM [" + OrxListName.xform.get()
64 + "] AS node WHERE ISDESCENDANTNODE (node, '" + pathInfo + "')",
65 Query.JCR_SQL2);
66 }
67 QueryResult queryResult = query.execute();
68
69 NodeIterator nit = queryResult.getNodes();
70 while (nit.hasNext()) {
71 StringBuilder sb = new StringBuilder();
72 Node node = nit.nextNode();
73 if (node.isNodeType(OrxListName.xform.get())) {
74 sb.append("<xform>");
75 sb.append("<formID>" + node.getProperty(OrxListName.formID.get()).getString() + "</formID>");
76 sb.append("<name>" + Jcr.getTitle(node) + "</name>");
77 sb.append("<version>" + node.getProperty(OrxListName.version.get()).getString() + "</version>");
78 sb.append("<hash>md5:" + JcrxApi.getChecksum(node, JcrxApi.MD5) + "</hash>");
79 if (node.hasProperty(Property.JCR_DESCRIPTION))
80 sb.append("<name>" + node.getProperty(Property.JCR_DESCRIPTION).getString() + "</name>");
81 sb.append("<downloadUrl>" + baseServer + "/api/odk/form" + node.getPath() + "</downloadUrl>");
82 if (node.hasNode(OrxManifestName.manifest.name())) {
83 sb.append("<manifestUrl>" + baseServer + "/api/odk/formManifest"
84 + node.getNode(OrxManifestName.manifest.name()).getPath() + "</manifestUrl>");
85 }
86 sb.append("</xform>");
87 } else if (node.isNodeType(EntityType.formSet.get())) {
88 sb.append("<xforms-group>");
89 sb.append("<groupId>" + node.getPath() + "</groupId>");
90 sb.append("<name>" + node.getProperty(Property.JCR_TITLE).getString() + "</name>");
91 sb.append("<listUrl>" + baseServer + "/api/odk/formList" + node.getPath() + "</listUrl>");
92 sb.append("</xforms-group>");
93 }
94 String str = sb.toString();
95 if (!str.equals("")) {
96 if (log.isDebugEnabled())
97 log.debug(str);
98 writer.append(str);
99 }
100 }
101 } catch (RepositoryException e) {
102 e.printStackTrace();
103 // TODO error message
104 // resp.sendError(500);
105 resp.sendError(503);
106 } finally {
107 Jcr.logout(session);
108 }
109 writer.append("</xforms>");
110 }
111
112 public void setRepository(Repository repository) {
113 this.repository = repository;
114 }
115
116 }