1 package org
.argeo
.support
.odk
.servlet
;
3 import java
.io
.IOException
;
5 import java
.time
.ZoneId
;
6 import java
.time
.ZoneOffset
;
7 import java
.time
.format
.DateTimeFormatter
;
8 import java
.util
.Collections
;
9 import java
.util
.HashSet
;
12 import javax
.jcr
.Node
;
13 import javax
.jcr
.NodeIterator
;
14 import javax
.jcr
.Property
;
15 import javax
.jcr
.Repository
;
16 import javax
.jcr
.RepositoryException
;
17 import javax
.jcr
.Session
;
18 import javax
.jcr
.query
.Query
;
19 import javax
.jcr
.query
.QueryResult
;
20 import javax
.servlet
.ServletException
;
21 import javax
.servlet
.http
.HttpServlet
;
22 import javax
.servlet
.http
.HttpServletRequest
;
23 import javax
.servlet
.http
.HttpServletResponse
;
25 import org
.apache
.commons
.logging
.Log
;
26 import org
.apache
.commons
.logging
.LogFactory
;
27 import org
.argeo
.api
.NodeConstants
;
28 import org
.argeo
.cms
.servlet
.ServletAuthUtils
;
29 import org
.argeo
.entity
.EntityType
;
30 import org
.argeo
.jcr
.Jcr
;
31 import org
.argeo
.jcr
.JcrUtils
;
32 import org
.argeo
.jcr
.JcrxApi
;
33 import org
.argeo
.support
.odk
.OdkForm
;
34 import org
.argeo
.support
.odk
.OdkNames
;
35 import org
.argeo
.support
.odk
.OrxListType
;
37 /** Lists available forms. */
38 public class OdkFormListServlet
extends HttpServlet
{
39 private static final long serialVersionUID
= 2706191315048423321L;
40 private final static Log log
= LogFactory
.getLog(OdkFormListServlet
.class);
42 private Set
<OdkForm
> odkForms
= Collections
.synchronizedSet(new HashSet
<>());
44 private DateTimeFormatter versionFormatter
= DateTimeFormatter
.ofPattern("YYYY-MM-dd-HHmm")
45 .withZone(ZoneId
.from(ZoneOffset
.UTC
));
47 private Repository repository
;
50 protected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{
51 resp
.setContentType("text/xml; charset=utf-8");
52 resp
.setHeader("X-OpenRosa-Version", "1.0");
53 resp
.setDateHeader("Date", System
.currentTimeMillis());
55 String serverName
= req
.getServerName();
56 int serverPort
= req
.getServerPort();
57 String protocol
= serverPort
== 443 || req
.isSecure() ?
"https" : "http";
59 String pathInfo
= req
.getPathInfo();
61 Session session
= ServletAuthUtils
.doAs(() -> Jcr
.login(repository
, NodeConstants
.SYS_WORKSPACE
), req
);
62 // session = NodeUtils.openDataAdminSession(repository, NodeConstants.SYS_WORKSPACE);
63 Writer writer
= resp
.getWriter();
64 writer
.append("<?xml version='1.0' encoding='UTF-8' ?>");
65 writer
.append("<xforms xmlns=\"http://openrosa.org/xforms/xformsList\">");
66 boolean oldApproach
= false;
71 if (pathInfo
== null) {
72 // query = session.getWorkspace().getQueryManager()
73 // .createQuery("SELECT * FROM [nt:unstructured]", Query.JCR_SQL2);
74 query
= session
.getWorkspace().getQueryManager()
75 .createQuery("SELECT * FROM [" + OrxListType
.xform
.get() + "]", Query
.JCR_SQL2
);
77 query
= session
.getWorkspace().getQueryManager()
79 "SELECT node FROM [" + OrxListType
.xform
.get()
80 + "] AS node WHERE ISDESCENDANTNODE (node, '" + pathInfo
+ "')",
83 QueryResult queryResult
= query
.execute();
85 NodeIterator nit
= queryResult
.getNodes();
86 // log.debug(session.getUserID());
87 // log.debug(session.getWorkspace().getName());
88 // NodeIterator nit = session.getRootNode().getNodes();
89 // while (nit.hasNext()) {
90 // log.debug(nit.nextNode());
92 while (nit
.hasNext()) {
93 StringBuilder sb
= new StringBuilder();
94 Node node
= nit
.nextNode();
95 if (node
.isNodeType(OrxListType
.xform
.get())) {
98 + node
.getNode(OdkNames
.H_HTML
+ "/h:head/xforms:model/xforms:instance/xforms:data")
99 .getProperty("id").getString()
101 sb
.append("<name>" + Jcr
.getTitle(node
) + "</name>");
102 sb
.append("<version>" + versionFormatter
.format(JcrUtils
.getModified(node
)) + "</version>");
103 // sb.append("<version>" + versionFormatter.format(JcrUtils.getModified(node)) + "</version>");
104 sb
.append("<hash>md5:" + JcrxApi
.getChecksum(node
, JcrxApi
.MD5
) + "</hash>");
105 if (node
.hasProperty(Property
.JCR_DESCRIPTION
))
106 sb
.append("<name>" + node
.getProperty(Property
.JCR_DESCRIPTION
).getString() + "</name>");
107 sb
.append("<downloadUrl>" + protocol
+ "://" + serverName
108 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
) + "/api/odk/form/"
109 + node
.getPath() + "</downloadUrl>");
110 sb
.append("</xform>");
111 } else if (node
.isNodeType(EntityType
.formSet
.get())) {
112 sb
.append("<xforms-group>");
113 sb
.append("<groupId>" + node
.getPath() + "</groupId>");
114 sb
.append("<name>" + node
.getProperty(Property
.JCR_TITLE
).getString() + "</name>");
115 sb
.append("<listUrl>" + protocol
+ "://" + serverName
116 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
) + "/api/odk/formList"
117 + node
.getPath() + "</listUrl>");
118 sb
.append("</xforms-group>");
120 String str
= sb
.toString();
121 if (!str
.equals("")) {
122 if (log
.isDebugEnabled())
127 } catch (RepositoryException e
) {
129 // TODO error message
130 // resp.sendError(500);
137 for (OdkForm form
: odkForms
) {
138 StringBuilder sb
= new StringBuilder();
139 sb
.append("<xform>");
140 sb
.append("<formID>" + form
.getFormId() + "</formID>");
141 sb
.append("<name>" + form
.getName() + "</name>");
142 sb
.append("<version>" + form
.getVersion() + "</version>");
143 sb
.append("<hash>" + form
.getHash(null) + "</hash>");
144 sb
.append("<descriptionText>" + form
.getDescription() + "</descriptionText>");
145 sb
.append("<downloadUrl>" + protocol
+ "://" + serverName
146 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
) + "/api/odk/form/"
147 + form
.getFileName() + "</downloadUrl>");
148 sb
.append("</xform>");
149 String str
= sb
.toString();
150 if (log
.isDebugEnabled())
155 writer
.append("</xforms>");
158 public void addForm(OdkForm odkForm
) {
159 odkForms
.add(odkForm
);
162 public void removeForm(OdkForm odkForm
) {
163 odkForms
.remove(odkForm
);
166 public void setRepository(Repository repository
) {
167 this.repository
= repository
;