X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2Fxml%2FDomContent.java;h=0686be7cb59b2cf63d034fc8331a1d1884e39f08;hb=59b306feca8c82f1487a98562fc3d6a0db118337;hp=d2b5188f5fd5f88f93599f4876c72b251f7a0423;hpb=55d1a78150b6be0004f6bcb28703bcdd6daf55a1;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 d2b5188f5..0686be7cb 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,28 +1,44 @@
package org.argeo.cms.acr.xml;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
import java.nio.CharBuffer;
-import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ForkJoinPool;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
import org.argeo.api.acr.Content;
import org.argeo.api.acr.ContentName;
+import org.argeo.api.acr.CrAttributeType;
import org.argeo.api.acr.CrName;
import org.argeo.api.acr.spi.ProvidedContent;
import org.argeo.api.acr.spi.ProvidedSession;
import org.argeo.cms.acr.AbstractContent;
import org.argeo.cms.acr.ContentUtils;
import org.w3c.dom.Attr;
+import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
@@ -50,16 +66,24 @@ public class DomContent extends AbstractContent implements ProvidedContent {
@Override
public QName getName() {
- if (element.getParentNode() == null) {// root
+ if (isLocalRoot()) {// root
String mountPath = provider.getMountPath();
if (mountPath != null) {
+ if (Content.ROOT_PATH.equals(mountPath)) {
+ return CrName.root.qName();
+ }
Content mountPoint = getSession().getMountPoint(mountPath);
- return mountPoint.getName();
+ QName mountPointName = mountPoint.getName();
+ return mountPointName;
}
}
return toQName(this.element);
}
+ protected boolean isLocalRoot() {
+ return element.getParentNode() == null || element.getParentNode() instanceof Document;
+ }
+
protected QName toQName(Node node) {
String prefix = node.getPrefix();
if (prefix == null) {
@@ -107,24 +131,25 @@ public class DomContent extends AbstractContent implements ProvidedContent {
for (int i = 0; i < attributes.getLength(); i++) {
Attr attr = (Attr) attributes.item(i);
QName key = toQName(attr);
+ if (key.getNamespaceURI().equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI))
+ continue;// skip prefix mapping
result.add(key);
}
return result;
}
- @SuppressWarnings("unchecked")
+// @SuppressWarnings("unchecked")
@Override
public Optional get(QName key, Class clss) {
String namespaceUriOrNull = XMLConstants.NULL_NS_URI.equals(key.getNamespaceURI()) ? null
: key.getNamespaceURI();
if (element.hasAttributeNS(namespaceUriOrNull, key.getLocalPart())) {
String value = element.getAttributeNS(namespaceUriOrNull, key.getLocalPart());
- if (clss.isAssignableFrom(String.class))
- return Optional.of((A) value);
- else
- return Optional.empty();
+// if (isDefaultAttrTypeRequested(clss))
+// return Optional.of((A) CrAttributeType.parse(value));
+ return CrAttributeType.cast(clss, value);
} else
- return null;
+ return Optional.empty();
}
@Override
@@ -207,15 +232,18 @@ public class DomContent extends AbstractContent implements ProvidedContent {
@Override
public Content getParent() {
Node parentNode = element.getParentNode();
- if (parentNode == null) {
+ if (isLocalRoot()) {
String mountPath = provider.getMountPath();
if (mountPath == null)
return null;
+ if (Content.ROOT_PATH.equals(mountPath)) {
+ return null;
+ }
String[] parent = ContentUtils.getParentPath(mountPath);
+ if (ContentUtils.EMPTY.equals(parent[0]))
+ return null;
return getSession().get(parent[0]);
}
- if (parentNode instanceof Document)
- return null;
if (!(parentNode instanceof Element))
throw new IllegalStateException("Parent is not an element");
return new DomContent(this, (Element) parentNode);
@@ -257,6 +285,9 @@ public class DomContent extends AbstractContent implements ProvidedContent {
String textContent = element.getTextContent();
CharBuffer buf = CharBuffer.wrap(textContent);
return (A) buf;
+ } else if (Source.class.isAssignableFrom(clss)) {
+ DOMSource source = new DOMSource(element);
+ return (A) source;
}
return super.adapt(clss);
}
@@ -270,20 +301,118 @@ public class DomContent extends AbstractContent implements ProvidedContent {
element.setTextContent(s);
});
return (CompletableFuture) res;
+ } else if (Source.class.isAssignableFrom(clss)) {
+ CompletableFuture