]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/acr/xml/DomContent.java
Start supporting mounting of XML with FS.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / xml / DomContent.java
index 5cb4583624c59fc41dd17956ab5ec355013a0cdf..9a1a58c55a7ef3162739d8c7fed32bceed5d0e01 100644 (file)
@@ -1,9 +1,12 @@
 package org.argeo.cms.acr.xml;
 
+import java.nio.CharBuffer;
+import java.nio.file.Path;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
 
 import javax.xml.XMLConstants;
 import javax.xml.namespace.NamespaceContext;
@@ -11,9 +14,12 @@ import javax.xml.namespace.QName;
 
 import org.argeo.api.acr.Content;
 import org.argeo.api.acr.ContentName;
+import org.argeo.api.acr.ContentUtils;
+import org.argeo.api.acr.CrName;
 import org.argeo.api.acr.spi.AbstractContent;
 import org.argeo.api.acr.spi.ProvidedContent;
 import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.cms.acr.fs.FsContent;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -43,6 +49,13 @@ public class DomContent extends AbstractContent implements ProvidedContent {
 
        @Override
        public QName getName() {
+               if (element.getParentNode() == null) {// root
+                       String mountPath = provider.getMountPath();
+                       if (mountPath != null) {
+                               Content mountPoint = session.getMountPoint(mountPath);
+                               return mountPoint.getName();
+                       }
+               }
                return toQName(this.element);
        }
 
@@ -55,27 +68,27 @@ public class DomContent extends AbstractContent implements ProvidedContent {
                        if (namespaceURI == null) {
                                return toQName(node, node.getLocalName());
                        } else {
-                               String contextPrefix = session.getPrefix(namespaceURI);
+                               String contextPrefix = provider.getPrefix(namespaceURI);
                                if (contextPrefix == null)
                                        throw new IllegalStateException("Namespace " + namespaceURI + " is unbound");
-                               return toQName(node, namespaceURI, node.getLocalName(), session);
+                               return toQName(node, namespaceURI, node.getLocalName(), provider);
                        }
                } else {
                        String namespaceURI = node.getNamespaceURI();
                        if (namespaceURI == null)
                                namespaceURI = node.getOwnerDocument().lookupNamespaceURI(prefix);
                        if (namespaceURI == null) {
-                               namespaceURI = session.getNamespaceURI(prefix);
+                               namespaceURI = provider.getNamespaceURI(prefix);
                                if (XMLConstants.NULL_NS_URI.equals(namespaceURI))
                                        throw new IllegalStateException("Prefix " + prefix + " is unbound");
                                // TODO bind the prefix in the document?
                        }
-                       return toQName(node, namespaceURI, node.getLocalName(), session);
+                       return toQName(node, namespaceURI, node.getLocalName(), provider);
                }
        }
 
        protected QName toQName(Node source, String namespaceURI, String localName, NamespaceContext namespaceContext) {
-               return new ContentName(namespaceURI, localName, session);
+               return new ContentName(namespaceURI, localName, namespaceContext);
        }
 
        protected QName toQName(Node source, String localName) {
@@ -98,6 +111,7 @@ public class DomContent extends AbstractContent implements ProvidedContent {
                return result;
        }
 
+       @SuppressWarnings("unchecked")
        @Override
        public <A> Optional<A> get(QName key, Class<A> clss) {
                String namespaceUriOrNull = XMLConstants.NULL_NS_URI.equals(key.getNamespaceURI()) ? null
@@ -172,14 +186,19 @@ public class DomContent extends AbstractContent implements ProvidedContent {
 
        @Override
        public Content getParent() {
-               Node parent = element.getParentNode();
-               if (parent == null)
-                       return null;
-               if (parent instanceof Document)
+               Node parentNode = element.getParentNode();
+               if (parentNode == null) {
+                       String mountPath = provider.getMountPath();
+                       if (mountPath == null)
+                               return null;
+                       String[] parent = ContentUtils.getParentPath(mountPath);
+                       return session.get(parent[0]);
+               }
+               if (parentNode instanceof Document)
                        return null;
-               if (!(parent instanceof Element))
+               if (!(parentNode instanceof Element))
                        throw new IllegalStateException("Parent is not an element");
-               return new DomContent(this, (Element) parent);
+               return new DomContent(this, (Element) parentNode);
        }
 
        @Override
@@ -210,6 +229,36 @@ public class DomContent extends AbstractContent implements ProvidedContent {
 
        }
 
+       @Override
+       public <A> A adapt(Class<A> clss) throws IllegalArgumentException {
+               if (CharBuffer.class.isAssignableFrom(clss)) {
+                       String textContent = element.getTextContent();
+                       CharBuffer buf = CharBuffer.wrap(textContent);
+                       return (A) buf;
+               }
+               return super.adapt(clss);
+       }
+
+       public <A> CompletableFuture<A> write(Class<A> clss) {
+               if (String.class.isAssignableFrom(clss)) {
+                       CompletableFuture<String> res = new CompletableFuture<>();
+                       res.thenAccept((s) -> element.setTextContent(s));// .thenRun(() -> provider.persist(session));
+                       return (CompletableFuture<A>) res;
+               }
+               return super.write(clss);
+       }
+
+       /*
+        * MOUNT MANAGEMENT
+        */
+       @Override
+       public ProvidedContent getMountPoint(String relativePath) {
+               // FIXME use qualified names
+               Element childElement = (Element) element.getElementsByTagName(relativePath).item(0);
+               // TODO check that it is a mount
+               return new DomContent(this, childElement);
+       }
+
        public ProvidedSession getSession() {
                return session;
        }