X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2Fxml%2FDomContent.java;h=ac863403deed8138a298cb25a0efd5ce098c7d0a;hb=a8e6930465a0cdeece0a80dacc03a0518dc14dff;hp=b4931220b2b8077979ab172f0ee5de53915fba6f;hpb=eb4cc3db3bf141c229f0f7ff929daff108bee6d2;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 b4931220b..ac863403d 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 @@ -25,6 +25,7 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; +/** Content persisted as a DOM element. */ public class DomContent extends AbstractContent implements ProvidedContent { private final ProvidedSession session; @@ -128,12 +129,31 @@ public class DomContent extends AbstractContent implements ProvidedContent { Object previous = get(key); String namespaceUriOrNull = XMLConstants.NULL_NS_URI.equals(key.getNamespaceURI()) ? null : key.getNamespaceURI(); + String prefixToUse = registerPrefixIfNeeded(key); element.setAttributeNS(namespaceUriOrNull, - namespaceUriOrNull == null ? key.getLocalPart() : key.getPrefix() + ":" + key.getLocalPart(), + namespaceUriOrNull == null ? key.getLocalPart() : prefixToUse + ":" + key.getLocalPart(), value.toString()); return previous; } + protected String registerPrefixIfNeeded(QName name) { + String namespaceUriOrNull = XMLConstants.NULL_NS_URI.equals(name.getNamespaceURI()) ? null + : name.getNamespaceURI(); + String prefixToUse; + if (namespaceUriOrNull != null) { + String registeredPrefix = provider.getPrefix(namespaceUriOrNull); + if (registeredPrefix != null) { + prefixToUse = registeredPrefix; + } else { + provider.registerPrefix(name.getPrefix(), namespaceUriOrNull); + prefixToUse = name.getPrefix(); + } + } else { + prefixToUse = null; + } + return prefixToUse; + } + @Override public boolean hasText() { // return element instanceof Text; @@ -204,8 +224,9 @@ public class DomContent extends AbstractContent implements ProvidedContent { Document document = this.element.getOwnerDocument(); String namespaceUriOrNull = XMLConstants.NULL_NS_URI.equals(name.getNamespaceURI()) ? null : name.getNamespaceURI(); + String prefixToUse = registerPrefixIfNeeded(name); Element child = document.createElementNS(namespaceUriOrNull, - namespaceUriOrNull == null ? name.getLocalPart() : name.getPrefix() + ":" + name.getLocalPart()); + namespaceUriOrNull == null ? name.getLocalPart() : prefixToUse + ":" + name.getLocalPart()); element.appendChild(child); return new DomContent(this, child); } @@ -226,6 +247,7 @@ public class DomContent extends AbstractContent implements ProvidedContent { } + @SuppressWarnings("unchecked") @Override public A adapt(Class clss) throws IllegalArgumentException { if (CharBuffer.class.isAssignableFrom(clss)) { @@ -236,6 +258,7 @@ public class DomContent extends AbstractContent implements ProvidedContent { return super.adapt(clss); } + @SuppressWarnings("unchecked") public CompletableFuture write(Class clss) { if (String.class.isAssignableFrom(clss)) { CompletableFuture res = new CompletableFuture<>();