]>
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
;
5 import java
.util
.Collections
;
6 import java
.util
.HashSet
;
10 import javax
.jcr
.NodeIterator
;
11 import javax
.jcr
.Property
;
12 import javax
.jcr
.Repository
;
13 import javax
.jcr
.RepositoryException
;
14 import javax
.jcr
.Session
;
15 import javax
.jcr
.query
.Query
;
16 import javax
.jcr
.query
.QueryResult
;
17 import javax
.servlet
.ServletException
;
18 import javax
.servlet
.http
.HttpServlet
;
19 import javax
.servlet
.http
.HttpServletRequest
;
20 import javax
.servlet
.http
.HttpServletResponse
;
22 import org
.argeo
.api
.cms
.CmsConstants
;
23 import org
.argeo
.api
.cms
.CmsLog
;
24 import org
.argeo
.app
.api
.EntityType
;
25 import org
.argeo
.app
.odk
.OdkForm
;
26 import org
.argeo
.app
.odk
.OrxListName
;
27 import org
.argeo
.app
.odk
.OrxManifestName
;
28 import org
.argeo
.cms
.auth
.RemoteAuthUtils
;
29 import org
.argeo
.cms
.servlet
.ServletHttpRequest
;
30 import org
.argeo
.jcr
.Jcr
;
31 import org
.argeo
.jcr
.JcrxApi
;
33 /** Lists available forms. */
34 public class OdkFormListServlet
extends HttpServlet
{
35 private static final long serialVersionUID
= 2706191315048423321L;
36 private final static CmsLog log
= CmsLog
.getLog(OdkFormListServlet
.class);
38 private Set
<OdkForm
> odkForms
= Collections
.synchronizedSet(new HashSet
<>());
40 // private DateTimeFormatter versionFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd-HHmm")
41 // .withZone(ZoneId.from(ZoneOffset.UTC));
43 private Repository repository
;
46 protected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{
47 resp
.setContentType("text/xml; charset=utf-8");
48 resp
.setHeader("X-OpenRosa-Version", "1.0");
49 resp
.setDateHeader("Date", System
.currentTimeMillis());
51 String serverName
= req
.getServerName();
52 int serverPort
= req
.getServerPort();
53 String protocol
= serverPort
== 443 || req
.isSecure() ?
"https" : "http";
55 String pathInfo
= req
.getPathInfo();
57 Session session
= RemoteAuthUtils
.doAs(() -> Jcr
.login(repository
, CmsConstants
.SYS_WORKSPACE
),
58 new ServletHttpRequest(req
));
59 // session = NodeUtils.openDataAdminSession(repository, NodeConstants.SYS_WORKSPACE);
60 Writer writer
= resp
.getWriter();
61 writer
.append("<?xml version='1.0' encoding='UTF-8' ?>");
62 writer
.append("<xforms xmlns=\"http://openrosa.org/xforms/xformsList\">");
63 boolean oldApproach
= false;
68 if (pathInfo
== null) {
69 // query = session.getWorkspace().getQueryManager()
70 // .createQuery("SELECT * FROM [nt:unstructured]", Query.JCR_SQL2);
71 query
= session
.getWorkspace().getQueryManager()
72 .createQuery("SELECT * FROM [" + OrxListName
.xform
.get() + "]", Query
.JCR_SQL2
);
74 query
= session
.getWorkspace().getQueryManager()
76 "SELECT node FROM [" + OrxListName
.xform
.get()
77 + "] AS node WHERE ISDESCENDANTNODE (node, '" + pathInfo
+ "')",
80 QueryResult queryResult
= query
.execute();
82 NodeIterator nit
= queryResult
.getNodes();
83 // log.debug(session.getUserID());
84 // log.debug(session.getWorkspace().getName());
85 // NodeIterator nit = session.getRootNode().getNodes();
86 // while (nit.hasNext()) {
87 // log.debug(nit.nextNode());
89 while (nit
.hasNext()) {
90 StringBuilder sb
= new StringBuilder();
91 Node node
= nit
.nextNode();
92 if (node
.isNodeType(OrxListName
.xform
.get())) {
94 sb
.append("<formID>" + node
.getProperty(OrxListName
.formID
.get()).getString() + "</formID>");
95 sb
.append("<name>" + Jcr
.getTitle(node
) + "</name>");
96 sb
.append("<version>" + node
.getProperty(OrxListName
.version
.get()).getString() + "</version>");
97 sb
.append("<hash>md5:" + JcrxApi
.getChecksum(node
, JcrxApi
.MD5
) + "</hash>");
98 if (node
.hasProperty(Property
.JCR_DESCRIPTION
))
99 sb
.append("<name>" + node
.getProperty(Property
.JCR_DESCRIPTION
).getString() + "</name>");
100 sb
.append("<downloadUrl>" + protocol
+ "://" + serverName
101 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
) + "/api/odk/form"
102 + node
.getPath() + "</downloadUrl>");
103 if (node
.hasNode(OrxManifestName
.manifest
.name())) {
104 sb
.append("<manifestUrl>" + protocol
+ "://" + serverName
105 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
)
106 + "/api/odk/formManifest" + node
.getNode(OrxManifestName
.manifest
.name()).getPath()
109 sb
.append("</xform>");
110 } else if (node
.isNodeType(EntityType
.formSet
.get())) {
111 sb
.append("<xforms-group>");
112 sb
.append("<groupId>" + node
.getPath() + "</groupId>");
113 sb
.append("<name>" + node
.getProperty(Property
.JCR_TITLE
).getString() + "</name>");
114 sb
.append("<listUrl>" + protocol
+ "://" + serverName
115 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
) + "/api/odk/formList"
116 + node
.getPath() + "</listUrl>");
117 sb
.append("</xforms-group>");
119 String str
= sb
.toString();
120 if (!str
.equals("")) {
121 if (log
.isDebugEnabled())
126 } catch (RepositoryException e
) {
128 // TODO error message
129 // resp.sendError(500);
136 for (OdkForm form
: odkForms
) {
137 StringBuilder sb
= new StringBuilder();
138 sb
.append("<xform>");
139 sb
.append("<formID>" + form
.getFormId() + "</formID>");
140 sb
.append("<name>" + form
.getName() + "</name>");
141 sb
.append("<version>" + form
.getVersion() + "</version>");
142 sb
.append("<hash>" + form
.getHash(null) + "</hash>");
143 sb
.append("<descriptionText>" + form
.getDescription() + "</descriptionText>");
144 sb
.append("<downloadUrl>" + protocol
+ "://" + serverName
145 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
) + "/api/odk/form/"
146 + form
.getFileName() + "</downloadUrl>");
147 sb
.append("</xform>");
148 String str
= sb
.toString();
149 if (log
.isDebugEnabled())
154 writer
.append("</xforms>");
157 public void addForm(OdkForm odkForm
) {
158 odkForms
.add(odkForm
);
161 public void removeForm(OdkForm odkForm
) {
162 odkForms
.remove(odkForm
);
165 public void setRepository(Repository repository
) {
166 this.repository
= repository
;