From 30b97a74faf0dcbc6d787bb88b524bfc53a7f251 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 18 Oct 2021 10:24:51 +0200 Subject: [PATCH] Export to XML using standard JCR mechanism. --- .../odk/servlet/OdkManifestServlet.java | 103 ++++++------------ 1 file changed, 34 insertions(+), 69 deletions(-) diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java index 54620a3..091f4da 100644 --- a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java +++ b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java @@ -1,5 +1,6 @@ package org.argeo.support.odk.servlet; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.Writer; import java.nio.charset.StandardCharsets; @@ -7,7 +8,6 @@ import java.nio.charset.StandardCharsets; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Property; -import javax.jcr.PropertyIterator; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; @@ -60,27 +60,28 @@ public class OdkManifestServlet extends HttpServlet { if (file.isNodeType(NodeType.NT_ADDRESS)) { Node target = file.getProperty(Property.JCR_ID).getNode(); writer.append(""); -// writer.append(target.getPath().substring(1) + ".xml"); - writer.append(target.getName() + ".xml"); + // Work around bug in ODK Collect not supporting paths + // writer.append(target.getPath().substring(1) + ".xml"); + writer.append(target.getIdentifier() + ".xml"); writer.append(""); - StringBuilder xml = new StringBuilder(); - xml.append(""); - toSimpleXml(target, xml); - String fileCsum = DigestUtils.digest(DigestUtils.MD5, - xml.toString().getBytes(StandardCharsets.UTF_8)); - writer.append(""); - writer.append("md5sum:" + fileCsum); - writer.append(""); - -// try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { -// session.exportDocumentView(target.getPath(), out, true, false); -// String fileCsum = DigestUtils.digest(DigestUtils.MD5, out.toByteArray()); -//// JcrxApi.addChecksum(file, fileCsum); -// writer.append(""); -// writer.append("md5sum:" + fileCsum); -// writer.append(""); -// } +// StringBuilder xml = new StringBuilder(); +// xml.append(""); +// JcrUtils.toSimpleXml(target, xml); +// String fileCsum = DigestUtils.digest(DigestUtils.MD5, +// xml.toString().getBytes(StandardCharsets.UTF_8)); +// writer.append(""); +// writer.append("md5sum:" + fileCsum); +// writer.append(""); + + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + session.exportDocumentView(target.getPath(), out, true, false); + String fileCsum = DigestUtils.digest(DigestUtils.MD5, out.toByteArray()); +// JcrxApi.addChecksum(file, fileCsum); + writer.append(""); + writer.append("md5sum:" + fileCsum); + writer.append(""); + } writer.append("" + protocol + "://" + serverName + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort) + "/api/odk/formManifest" + file.getPath() + ""); @@ -93,18 +94,19 @@ public class OdkManifestServlet extends HttpServlet { } else if (node.isNodeType(OrxManifestName.mediaFile.get())) { if (node.isNodeType(NodeType.NT_ADDRESS)) { Node target = node.getProperty(Property.JCR_ID).getNode(); - StringBuilder xml = new StringBuilder(); - xml.append(""); - toSimpleXml(target, xml); - System.out.println(xml); - resp.getOutputStream().write(xml.toString().getBytes(StandardCharsets.UTF_8)); - resp.flushBuffer(); - -// 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()); -// } + +// StringBuilder xml = new StringBuilder(); +// xml.append(""); +// JcrUtils.toSimpleXml(target, xml); +// System.out.println(xml); +// resp.getOutputStream().write(xml.toString().getBytes(StandardCharsets.UTF_8)); +// resp.flushBuffer(); + + 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); } @@ -119,43 +121,6 @@ public class OdkManifestServlet extends HttpServlet { } - private static void toSimpleXml(Node node, StringBuilder sb) throws RepositoryException { - sb.append('<'); - String nodeName = node.getName(); - int colIndex = nodeName.indexOf(':'); - if (colIndex > 0) { - nodeName = nodeName.substring(colIndex + 1); - } - sb.append(nodeName); - PropertyIterator pit = node.getProperties(); - properties: while (pit.hasNext()) { - Property p = pit.nextProperty(); - if (p.isMultiple()) - continue properties; - String propertyName = p.getName(); - int pcolIndex = propertyName.indexOf(':'); - if (pcolIndex > 0) - continue properties; - sb.append(' '); - sb.append(propertyName); - sb.append('='); - sb.append('\"').append(p.getString()).append('\"'); - } - - if (node.hasNodes()) { - sb.append('>'); - NodeIterator children = node.getNodes(); - while (children.hasNext()) { - toSimpleXml(children.nextNode(), sb); - } - sb.append("'); - } else { - sb.append("/>"); - } - } - public void setRepository(Repository repository) { this.repository = repository; } -- 2.30.2