]>
git.argeo.org Git - gpl/argeo-suite.git/blob - knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkFormListServlet.java
1 package org
.argeo
.support
.odk
.servlet
;
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
.apache
.commons
.logging
.Log
;
23 import org
.apache
.commons
.logging
.LogFactory
;
24 import org
.argeo
.api
.NodeConstants
;
25 import org
.argeo
.cms
.servlet
.ServletAuthUtils
;
26 import org
.argeo
.entity
.EntityType
;
27 import org
.argeo
.jcr
.Jcr
;
28 import org
.argeo
.jcr
.JcrxApi
;
29 import org
.argeo
.support
.odk
.OdkForm
;
30 import org
.argeo
.support
.odk
.OrxListName
;
31 import org
.argeo
.support
.odk
.OrxManifestName
;
33 /** Lists available forms. */
34 public class OdkFormListServlet
extends HttpServlet
{
35 private static final long serialVersionUID
= 2706191315048423321L;
36 private final static Log log
= LogFactory
.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
= ServletAuthUtils
.doAs(() -> Jcr
.login(repository
, NodeConstants
.SYS_WORKSPACE
), req
);
58 // session = NodeUtils.openDataAdminSession(repository, NodeConstants.SYS_WORKSPACE);
59 Writer writer
= resp
.getWriter();
60 writer
.append("<?xml version='1.0' encoding='UTF-8' ?>");
61 writer
.append("<xforms xmlns=\"http://openrosa.org/xforms/xformsList\">");
62 boolean oldApproach
= false;
67 if (pathInfo
== null) {
68 // query = session.getWorkspace().getQueryManager()
69 // .createQuery("SELECT * FROM [nt:unstructured]", Query.JCR_SQL2);
70 query
= session
.getWorkspace().getQueryManager()
71 .createQuery("SELECT * FROM [" + OrxListName
.xform
.get() + "]", Query
.JCR_SQL2
);
73 query
= session
.getWorkspace().getQueryManager()
75 "SELECT node FROM [" + OrxListName
.xform
.get()
76 + "] AS node WHERE ISDESCENDANTNODE (node, '" + pathInfo
+ "')",
79 QueryResult queryResult
= query
.execute();
81 NodeIterator nit
= queryResult
.getNodes();
82 // log.debug(session.getUserID());
83 // log.debug(session.getWorkspace().getName());
84 // NodeIterator nit = session.getRootNode().getNodes();
85 // while (nit.hasNext()) {
86 // log.debug(nit.nextNode());
88 while (nit
.hasNext()) {
89 StringBuilder sb
= new StringBuilder();
90 Node node
= nit
.nextNode();
91 if (node
.isNodeType(OrxListName
.xform
.get())) {
93 sb
.append("<formID>" + node
.getProperty(OrxListName
.formID
.get()).getString() + "</formID>");
94 sb
.append("<name>" + Jcr
.getTitle(node
) + "</name>");
95 sb
.append("<version>" + node
.getProperty(OrxListName
.version
.get()).getString() + "</version>");
96 sb
.append("<hash>md5:" + JcrxApi
.getChecksum(node
, JcrxApi
.MD5
) + "</hash>");
97 if (node
.hasProperty(Property
.JCR_DESCRIPTION
))
98 sb
.append("<name>" + node
.getProperty(Property
.JCR_DESCRIPTION
).getString() + "</name>");
99 sb
.append("<downloadUrl>" + protocol
+ "://" + serverName
100 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
) + "/api/odk/form/"
101 + node
.getPath() + "</downloadUrl>");
102 if (node
.hasNode(OrxManifestName
.manifest
.name())) {
103 sb
.append("<manifestUrl>" + protocol
+ "://" + serverName
104 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
)
105 + "/api/odk/formManifest" + node
.getNode(OrxManifestName
.manifest
.name()).getPath()
108 sb
.append("</xform>");
109 } else if (node
.isNodeType(EntityType
.formSet
.get())) {
110 sb
.append("<xforms-group>");
111 sb
.append("<groupId>" + node
.getPath() + "</groupId>");
112 sb
.append("<name>" + node
.getProperty(Property
.JCR_TITLE
).getString() + "</name>");
113 sb
.append("<listUrl>" + protocol
+ "://" + serverName
114 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
) + "/api/odk/formList"
115 + node
.getPath() + "</listUrl>");
116 sb
.append("</xforms-group>");
118 String str
= sb
.toString();
119 if (!str
.equals("")) {
120 if (log
.isDebugEnabled())
125 } catch (RepositoryException e
) {
127 // TODO error message
128 // resp.sendError(500);
135 for (OdkForm form
: odkForms
) {
136 StringBuilder sb
= new StringBuilder();
137 sb
.append("<xform>");
138 sb
.append("<formID>" + form
.getFormId() + "</formID>");
139 sb
.append("<name>" + form
.getName() + "</name>");
140 sb
.append("<version>" + form
.getVersion() + "</version>");
141 sb
.append("<hash>" + form
.getHash(null) + "</hash>");
142 sb
.append("<descriptionText>" + form
.getDescription() + "</descriptionText>");
143 sb
.append("<downloadUrl>" + protocol
+ "://" + serverName
144 + (serverPort
== 80 || serverPort
== 443 ?
"" : ":" + serverPort
) + "/api/odk/form/"
145 + form
.getFileName() + "</downloadUrl>");
146 sb
.append("</xform>");
147 String str
= sb
.toString();
148 if (log
.isDebugEnabled())
153 writer
.append("</xforms>");
156 public void addForm(OdkForm odkForm
) {
157 odkForms
.add(odkForm
);
160 public void removeForm(OdkForm odkForm
) {
161 odkForms
.remove(odkForm
);
164 public void setRepository(Repository repository
) {
165 this.repository
= repository
;