]> git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkFormListServlet.java
Introduce open user menu icon
[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
6 import javax.jcr.Node;
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;
18
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;
28
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);
33
34 private Repository repository;
35
36 @Override
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());
41
42 String serverName = req.getServerName();
43 int serverPort = req.getServerPort();
44 String protocol = serverPort == 443 || req.isSecure() ? "https" : "http";
45
46 String pathInfo = req.getPathInfo();
47
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\">");
53 try {
54
55 Query query;
56 if (pathInfo == null) {
57 query = session.getWorkspace().getQueryManager()
58 .createQuery("SELECT * FROM [" + OrxListName.xform.get() + "]", Query.JCR_SQL2);
59 } else {
60 query = session.getWorkspace().getQueryManager()
61 .createQuery(
62 "SELECT node FROM [" + OrxListName.xform.get()
63 + "] AS node WHERE ISDESCENDANTNODE (node, '" + pathInfo + "')",
64 Query.JCR_SQL2);
65 }
66 QueryResult queryResult = query.execute();
67
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())) {
73 sb.append("<xform>");
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()
87 + "</manifestUrl>");
88 }
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>");
98 }
99 String str = sb.toString();
100 if (!str.equals("")) {
101 if (log.isDebugEnabled())
102 log.debug(str);
103 writer.append(str);
104 }
105 }
106 } catch (RepositoryException e) {
107 e.printStackTrace();
108 // TODO error message
109 // resp.sendError(500);
110 resp.sendError(503);
111 } finally {
112 Jcr.logout(session);
113 }
114 writer.append("</xforms>");
115 }
116
117 public void setRepository(Repository repository) {
118 this.repository = repository;
119 }
120
121 }