]>
git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkFormListServlet.java
1 package org
.argeo
.app
.servlet
.odk
;
3 import java
.io
.IOException
;
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
;
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
;
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);
35 private Repository repository
;
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());
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);
47 String pathInfo
= req
.getPathInfo();
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\">");
57 if (pathInfo
== null) {
58 query
= session
.getWorkspace().getQueryManager()
59 .createQuery("SELECT * FROM [" + OrxListName
.xform
.get() + "]", Query
.JCR_SQL2
);
61 query
= session
.getWorkspace().getQueryManager()
63 "SELECT node FROM [" + OrxListName
.xform
.get()
64 + "] AS node WHERE ISDESCENDANTNODE (node, '" + pathInfo
+ "')",
67 QueryResult queryResult
= query
.execute();
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())) {
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>");
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>");
94 String str
= sb
.toString();
95 if (!str
.equals("")) {
96 if (log
.isTraceEnabled())
101 } catch (RepositoryException e
) {
103 // TODO error message
104 // resp.sendError(500);
109 writer
.append("</xforms>");
112 public void setRepository(Repository repository
) {
113 this.repository
= repository
;