Make DOM ACR more robust when used as repository root.
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 17 Jun 2023 05:50:28 +0000 (07:50 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 17 Jun 2023 05:50:28 +0000 (07:50 +0200)
org.argeo.cms/src/org/argeo/cms/acr/xml/DomContent.java
org.argeo.cms/src/org/argeo/cms/acr/xml/DomContentProvider.java

index a4c14186ac17d299b0673e1b67ee0857db166c13..1520bc2cf7cf48b49b40caf88d92dbcbb6e4becd 100644 (file)
@@ -1,7 +1,5 @@
 package org.argeo.cms.acr.xml;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.Closeable;
 import java.io.IOException;
 import java.io.InputStream;
@@ -25,7 +23,6 @@ import javax.xml.transform.Result;
 import javax.xml.transform.Source;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
@@ -389,7 +386,9 @@ public class DomContent extends AbstractContent implements ProvidedContent {
                List<QName> res = new ArrayList<>();
                if (isLocalRoot()) {
                        String mountPath = provider.getMountPath();
-                       if (mountPath != null) {
+                       if (ContentUtils.SLASH_STRING.equals(mountPath)) {// repository root
+                               res.add(CrName.root.qName());
+                       } else {
                                Content mountPoint = getSession().getMountPoint(mountPath);
                                res.addAll(mountPoint.getContentClasses());
                        }
@@ -403,7 +402,9 @@ public class DomContent extends AbstractContent implements ProvidedContent {
        public void addContentClasses(QName... contentClass) {
                if (isLocalRoot()) {
                        String mountPath = provider.getMountPath();
-                       if (mountPath != null) {
+                       if (ContentUtils.SLASH_STRING.equals(mountPath)) {// repository root
+                               throw new IllegalArgumentException("Cannot add content classes to repository root");
+                       } else {
                                Content mountPoint = getSession().getMountPoint(mountPath);
                                mountPoint.addContentClasses(contentClass);
                        }
index 66ff878d5c6a9a644445a97bafa64869e19e2cfd..d569350975ff1c5fa8597ebe6962f8bbdf95e13a 100644 (file)
@@ -22,6 +22,7 @@ import org.argeo.api.acr.spi.ContentProvider;
 import org.argeo.api.acr.spi.ProvidedContent;
 import org.argeo.api.acr.spi.ProvidedSession;
 import org.argeo.cms.acr.CmsContentRepository;
+import org.argeo.cms.acr.ContentUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
@@ -57,16 +58,6 @@ public class DomContentProvider implements ContentProvider, NamespaceContext {
                };
        }
 
-//     @Override
-//     public Content get() {
-//             return new DomContent(this, document.getDocumentElement());
-//     }
-
-//     public Element createElement(String name) {
-//             return document.createElementNS(null, name);
-//
-//     }
-
        @Override
        public ProvidedContent get(ProvidedSession session, String relativePath) {
                if ("".equals(relativePath))
@@ -86,7 +77,7 @@ public class DomContentProvider implements ContentProvider, NamespaceContext {
                if (relativePath.startsWith("/"))
                        throw new IllegalArgumentException("Relative path cannot start with /");
                String xPathExpression = '/' + relativePath;
-               if ("/".equals(mountPath))
+               if (ContentUtils.SLASH_STRING.equals(mountPath)) // repository root
                        xPathExpression = "/" + CrName.root.qName() + xPathExpression;
                try {
                        NodeList nodes = (NodeList) xPath.get().evaluate(xPathExpression, document, XPathConstants.NODESET);