]>
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
.jcr
.Jcr
;
27 import org
.argeo
.jcr
.JcrxApi
;
29 /** Lists available forms. */
30 public class OdkFormListServlet
extends HttpServlet
{
31 private static final long serialVersionUID
= 2706191315048423321L;
32 private final static CmsLog log
= CmsLog
.getLog(OdkFormListServlet
.class);
34 private Repository repository
;
37 protected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{
38 resp
.setContentType("text/xml; charset=utf-8");
39 resp
.setHeader("X-OpenRosa-Version", "1.0");
40 resp
.setDateHeader("Date", System
.currentTimeMillis());
42 String serverName
= req
.getServerName();
43 int serverPort
= req
.getServerPort();
44 String protocol
= serverPort
== 443 || req
.isSecure() ?
"https" : "http";
46 String pathInfo
= req
.getPathInfo();
48 Session session
= RemoteAuthUtils
.doAs(() -> Jcr
.login(repository
, CmsConstants
.SYS_WORKSPACE
),
49 new ServletHttpRequest(req
));
50 Writer writer
= resp
.getWriter();
51 writer
.append("<?xml version='1.0' encoding='UTF-8' ?>");
52 writer
.append("<xforms xmlns=\"http://openrosa.org/xforms/xformsList\">");
56 if (pathInfo
== null) {
57 query
= session
.getWorkspace().getQueryManager()
58 .createQuery("SELECT * FROM [" + OrxListName
.xform
.get() + "]", Query
.JCR_SQL2
);
60 query
= session
.getWorkspace().getQueryManager()
62 "SELECT node FROM [" + OrxListName
.xform
.get()
63 + "] AS node WHERE ISDESCENDANTNODE (node, '" + pathInfo
+ "')",
66 QueryResult queryResult
= query
.execute();
68 NodeIterator nit
= queryResult
.getNodes();
69 while (nit
.hasNext()) {
70 StringBuilder sb
= new StringBuilder();
71 Node node
= nit
.nextNode();
72 if (node
.isNodeType(OrxListName
.xform
.get())) {
74 sb
.append("<formID>" + node
.getProperty(OrxListName
.formID
.get()).getString() + "</formID>");
75 sb
.append("<name>" + Jcr
.getTitle(node
) + "</name>");
76 sb
.append("<version>" + node
.getProperty(OrxListName
.version
.get()).getString() + "</version>");
77 sb
.append("<hash>md5:" + JcrxApi
.getChecksum(node
, JcrxApi
.MD5
) + "</hash>");
78 if (node
.hasProperty(Property
.JCR_DESCRIPTION
))
79 sb
.append("<name>" + node
.getProperty(Property
.JCR_DESCRIPTION
).getString() + "</name>");
80 sb
.append("<downloadUrl>" + protocol
+ "://" + serverName
81 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
) + "/api/odk/form"
82 + node
.getPath() + "</downloadUrl>");
83 if (node
.hasNode(OrxManifestName
.manifest
.name())) {
84 sb
.append("<manifestUrl>" + protocol
+ "://" + serverName
85 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
)
86 + "/api/odk/formManifest" + node
.getNode(OrxManifestName
.manifest
.name()).getPath()
89 sb
.append("</xform>");
90 } else if (node
.isNodeType(EntityType
.formSet
.get())) {
91 sb
.append("<xforms-group>");
92 sb
.append("<groupId>" + node
.getPath() + "</groupId>");
93 sb
.append("<name>" + node
.getProperty(Property
.JCR_TITLE
).getString() + "</name>");
94 sb
.append("<listUrl>" + protocol
+ "://" + serverName
95 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
) + "/api/odk/formList"
96 + node
.getPath() + "</listUrl>");
97 sb
.append("</xforms-group>");
99 String str
= sb
.toString();
100 if (!str
.equals("")) {
101 if (log
.isDebugEnabled())
106 } catch (RepositoryException e
) {
108 // TODO error message
109 // resp.sendError(500);
114 writer
.append("</xforms>");
117 public void setRepository(Repository repository
) {
118 this.repository
= repository
;