]> git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkFormListServlet.java
Fix ODK servlets
[gpl/argeo-suite.git] / org.argeo.app.servlet.odk / src / org / argeo / app / servlet / odk / OdkFormListServlet.java
1 package org.argeo.app.servlet.odk;
2
3 import java.io.IOException;
4 import java.io.Writer;
5 import java.util.Collections;
6 import java.util.HashSet;
7 import java.util.Set;
8
9 import javax.jcr.Node;
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;
21
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;
32
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);
37
38 private Set<OdkForm> odkForms = Collections.synchronizedSet(new HashSet<>());
39
40 // private DateTimeFormatter versionFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd-HHmm")
41 // .withZone(ZoneId.from(ZoneOffset.UTC));
42
43 private Repository repository;
44
45 @Override
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());
50
51 String serverName = req.getServerName();
52 int serverPort = req.getServerPort();
53 String protocol = serverPort == 443 || req.isSecure() ? "https" : "http";
54
55 String pathInfo = req.getPathInfo();
56
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;
64 if (!oldApproach) {
65 try {
66
67 Query query;
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);
73 } else {
74 query = session.getWorkspace().getQueryManager()
75 .createQuery(
76 "SELECT node FROM [" + OrxListName.xform.get()
77 + "] AS node WHERE ISDESCENDANTNODE (node, '" + pathInfo + "')",
78 Query.JCR_SQL2);
79 }
80 QueryResult queryResult = query.execute();
81
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());
88 // }
89 while (nit.hasNext()) {
90 StringBuilder sb = new StringBuilder();
91 Node node = nit.nextNode();
92 if (node.isNodeType(OrxListName.xform.get())) {
93 sb.append("<xform>");
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()
107 + "</manifestUrl>");
108 }
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>");
118 }
119 String str = sb.toString();
120 if (!str.equals("")) {
121 if (log.isDebugEnabled())
122 log.debug(str);
123 writer.append(str);
124 }
125 }
126 } catch (RepositoryException e) {
127 e.printStackTrace();
128 // TODO error message
129 // resp.sendError(500);
130 resp.sendError(503);
131 } finally {
132 Jcr.logout(session);
133 }
134
135 } else {
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())
150 log.debug(str);
151 writer.append(str);
152 }
153 }
154 writer.append("</xforms>");
155 }
156
157 public void addForm(OdkForm odkForm) {
158 odkForms.add(odkForm);
159 }
160
161 public void removeForm(OdkForm odkForm) {
162 odkForms.remove(odkForm);
163 }
164
165 public void setRepository(Repository repository) {
166 this.repository = repository;
167 }
168
169 }