X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.app.servlet.odk%2Fsrc%2Forg%2Fargeo%2Fapp%2Fservlet%2Fodk%2FOdkManifestServlet.java;h=e5e2de6ebce277a157341a023da1472a8b675695;hb=616a062e9d061ce91589556624ed622298a21ac7;hp=9d1812cabfb6b8f13cdf316206b8c29ec45542bd;hpb=4ddac76750a05a23a179b54f8f3fc785b1411f23;p=gpl%2Fargeo-suite.git
diff --git a/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkManifestServlet.java b/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkManifestServlet.java
index 9d1812c..e5e2de6 100644
--- a/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkManifestServlet.java
+++ b/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkManifestServlet.java
@@ -29,14 +29,18 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.output.NullOutputStream;
-import org.argeo.app.api.EntityMimeType;
+import org.argeo.api.app.EntityMimeType;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.app.WGS84PosName;
+import org.argeo.app.geo.GeoShapeUtils;
import org.argeo.app.odk.OrxManifestName;
import org.argeo.cms.auth.RemoteAuthUtils;
import org.argeo.cms.servlet.ServletHttpRequest;
+import org.argeo.cms.servlet.ServletUtils;
+import org.argeo.cms.util.CsvWriter;
+import org.argeo.cms.util.DigestUtils;
import org.argeo.jcr.Jcr;
import org.argeo.jcr.JcrException;
-import org.argeo.util.CsvWriter;
-import org.argeo.util.DigestUtils;
/** Describe additional files. */
public class OdkManifestServlet extends HttpServlet {
@@ -53,9 +57,9 @@ public class OdkManifestServlet extends HttpServlet {
if (pathInfo.startsWith("//"))
pathInfo = pathInfo.substring(1);
- String serverName = req.getServerName();
- int serverPort = req.getServerPort();
- String protocol = serverPort == 443 || req.isSecure() ? "https" : "http";
+ // we force HTTPS since ODK Collect will fail anyhow when sending http
+ // cf. https://forum.getodk.org/t/authentication-for-non-https-schems/32967/4
+ StringBuilder baseServer = ServletUtils.getRequestUrlBase(req, true);
Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, null), new ServletHttpRequest(req));
@@ -91,24 +95,15 @@ public class OdkManifestServlet extends HttpServlet {
MessageDigest messageDigest = MessageDigest.getInstance(DigestUtils.MD5);
// TODO cache a temp file ?
- try (DigestOutputStream out = new DigestOutputStream(new NullOutputStream(),
+ try (DigestOutputStream out = new DigestOutputStream(NullOutputStream.NULL_OUTPUT_STREAM,
messageDigest)) {
writeMediaFile(out, target, mimeType, charset);
writer.append("");
writer.append("md5sum:" + DigestUtils.toHexString(out.getMessageDigest().digest()));
writer.append("");
}
-
-// try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
-// session.exportDocumentView(target.getPath(), out, true, false);
-// String fileCsum = DigestUtils.digest(DigestUtils.MD5, out.toByteArray());
-// writer.append("");
-// writer.append("md5sum:" + fileCsum);
-// writer.append("");
-// }
- writer.append("" + protocol + "://" + serverName
- + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort)
- + "/api/odk/formManifest" + file.getPath() + "");
+ writer.append("" + baseServer + "/api/odk/formManifest" + file.getPath()
+ + "");
}
writer.append("");
}
@@ -123,11 +118,6 @@ public class OdkManifestServlet extends HttpServlet {
Node target = node.getProperty(Property.JCR_ID).getNode();
writeMediaFile(resp.getOutputStream(), target, mimeType, charset);
-// try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
-// session.exportDocumentView(target.getPath(), out, true, false);
-// System.out.println(new String(out.toByteArray(), StandardCharsets.UTF_8));
-// resp.getOutputStream().write(out.toByteArray());
-// }
} else {
throw new IllegalArgumentException("Unsupported node " + node);
}
@@ -149,7 +139,14 @@ public class OdkManifestServlet extends HttpServlet {
if (target.isNodeType(NodeType.NT_QUERY)) {
Query query = target.getSession().getWorkspace().getQueryManager().getQuery(target);
QueryResult queryResult = query.execute();
- String[] columnNames = queryResult.getColumnNames();
+ List columnNames = new ArrayList<>();
+ for (String c : queryResult.getColumnNames()) {
+ columnNames.add(c);
+ }
+ // TODO make it more configurable
+ columnNames.add("display");
+ columnNames.add("geometry");
+
if (EntityMimeType.XML.equals(mimeType)) {
} else if (EntityMimeType.CSV.equals(mimeType)) {
CsvWriter csvWriter = new CsvWriter(out, charset);
@@ -163,12 +160,24 @@ public class OdkManifestServlet extends HttpServlet {
for (Value value : values) {
lst.add(value.getString());
}
+ // display
+ lst.add(row.getValue("name").getString() + " (" + row.getValue("label").getString() + ")");
+ Node field = row.getNode("geopoint");
+ if (field != null && field.isNodeType(EntityType.geopoint.get())) {
+ double lat = field.getProperty(WGS84PosName.lat.get()).getDouble();
+ double lon = field.getProperty(WGS84PosName.lon.get()).getDouble();
+ double alt = field.hasProperty(WGS84PosName.alt.get())
+ ? field.getProperty(WGS84PosName.alt.get()).getDouble()
+ : Double.NaN;
+ String geoshape = GeoShapeUtils.geoPointToGeoShape(lon, lat, alt);
+ lst.add(geoshape);
+ }
csvWriter.writeLine(lst);
}
} else {
// corner case of an empty initial database
List lst = new ArrayList<>();
- for (int i = 0; i < columnNames.length; i++)
+ for (int i = 0; i < columnNames.size(); i++)
lst.add("-");
csvWriter.writeLine(lst);
}