Generate simple XML for external form instances.
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 13 Oct 2021 09:35:19 +0000 (11:35 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 13 Oct 2021 09:35:19 +0000 (11:35 +0200)
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java

index 88b9c69efdb41f74e0fda931fc4fd13e7ad52be4..385024c487ffe294f9ea3f0cf236fcbbea4ccc6d 100644 (file)
@@ -8,6 +8,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;
@@ -82,11 +83,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 +109,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;
        }