X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2Fxml%2FDomContent.java;h=9a1a58c55a7ef3162739d8c7fed32bceed5d0e01;hb=e3db2eba9a7f8380a6f76d7b0e6cd4825e91893e;hp=9e370db0c07ebfd552186300c59b677ff87952c3;hpb=ceb6d574e9ea49fcac490d0923d23f259f271f8d;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/acr/xml/DomContent.java b/org.argeo.cms/src/org/argeo/cms/acr/xml/DomContent.java index 9e370db0c..9a1a58c55 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/xml/DomContent.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/xml/DomContent.java @@ -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); } @@ -173,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 @@ -211,6 +229,36 @@ public class DomContent extends AbstractContent implements ProvidedContent { } + @Override + public A adapt(Class 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 CompletableFuture write(Class clss) { + if (String.class.isAssignableFrom(clss)) { + CompletableFuture res = new CompletableFuture<>(); + res.thenAccept((s) -> element.setTextContent(s));// .thenRun(() -> provider.persist(session)); + return (CompletableFuture) 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; }