Make external instance checksum coherent with the new approach.
[gpl/argeo-suite.git] / knowledge / org.argeo.support.odk / src / org / argeo / support / odk / servlet / OdkManifestServlet.java
index 88b9c69efdb41f74e0fda931fc4fd13e7ad52be4..207189c4cd071d53c260fe4f50413ac3649a56aa 100644 (file)
@@ -1,6 +1,5 @@
 package org.argeo.support.odk.servlet;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.Writer;
 import java.nio.charset.StandardCharsets;
@@ -8,6 +7,7 @@ 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;
@@ -62,14 +62,24 @@ public class OdkManifestServlet extends HttpServlet {
                                                        writer.append("<filename>");
                                                        writer.append(target.getPath().substring(1) + ".xml");
                                                        writer.append("</filename>");
-                                                       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("<hash>");
-                                                               writer.append("md5sum:" + fileCsum);
-                                                               writer.append("</hash>");
-                                                       }
+
+                                                       StringBuilder xml = new StringBuilder();
+                                                       xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+                                                       toSimpleXml(target, xml);
+                                                       String fileCsum = DigestUtils.digest(DigestUtils.MD5,
+                                                                       xml.toString().getBytes(StandardCharsets.UTF_8));
+                                                       writer.append("<hash>");
+                                                       writer.append("md5sum:" + fileCsum);
+                                                       writer.append("</hash>");
+
+//                                                     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("<hash>");
+//                                                             writer.append("md5sum:" + fileCsum);
+//                                                             writer.append("</hash>");
+//                                                     }
                                                        writer.append("<downloadUrl>" + protocol + "://" + serverName
                                                                        + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort)
                                                                        + "/api/odk/formManifest" + file.getPath() + "</downloadUrl>");
@@ -82,11 +92,18 @@ 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();
-                                       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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+                                       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);
                                }
@@ -101,6 +118,43 @@ 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("</");
+                       sb.append(nodeName);
+                       sb.append('>');
+               } else {
+                       sb.append("/>");
+               }
+       }
+
        public void setRepository(Repository repository) {
                this.repository = repository;
        }