Refactor WebDav implementation
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / xml / DomContentProvider.java
index 54013e2ad1301deb66235671fcce278e6be64b58..66ff878d5c6a9a644445a97bafa64869e19e2cfd 100644 (file)
@@ -8,6 +8,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import javax.xml.namespace.NamespaceContext;
+import javax.xml.transform.TransformerFactory;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
@@ -15,6 +16,7 @@ import javax.xml.xpath.XPathFactory;
 
 import org.argeo.api.acr.Content;
 import org.argeo.api.acr.ContentNotFoundException;
+import org.argeo.api.acr.CrName;
 import org.argeo.api.acr.NamespaceUtils;
 import org.argeo.api.acr.spi.ContentProvider;
 import org.argeo.api.acr.spi.ProvidedContent;
@@ -31,12 +33,17 @@ public class DomContentProvider implements ContentProvider, NamespaceContext {
        // TODO centralise in some executor?
        private final ThreadLocal<XPath> xPath;
 
+       private TransformerFactory transformerFactory;
+
        private String mountPath;
 
        public DomContentProvider(String mountPath, Document document) {
                this.mountPath = mountPath;
                this.document = document;
                this.document.normalizeDocument();
+
+               transformerFactory = TransformerFactory.newInstance();
+
                XPathFactory xPathFactory = XPathFactory.newInstance();
                xPath = new ThreadLocal<>() {
 
@@ -69,7 +76,8 @@ public class DomContentProvider implements ContentProvider, NamespaceContext {
                if (nodes.getLength() > 1)
                        throw new IllegalArgumentException("Multiple content found for " + relativePath + " under " + mountPath);
                if (nodes.getLength() == 0)
-                       throw new ContentNotFoundException("Path " + relativePath + " under " + mountPath + " was not found");
+                       throw new ContentNotFoundException(session, mountPath + "/" + relativePath,
+                                       "Path " + relativePath + " under " + mountPath + " was not found");
                Element element = (Element) nodes.item(0);
                return new DomContent(session, this, element);
        }
@@ -79,7 +87,7 @@ public class DomContentProvider implements ContentProvider, NamespaceContext {
                        throw new IllegalArgumentException("Relative path cannot start with /");
                String xPathExpression = '/' + relativePath;
                if ("/".equals(mountPath))
-                       xPathExpression = "/cr:root" + xPathExpression;
+                       xPathExpression = "/" + CrName.root.qName() + xPathExpression;
                try {
                        NodeList nodes = (NodeList) xPath.get().evaluate(xPathExpression, document, XPathConstants.NODESET);
                        return nodes;
@@ -144,4 +152,8 @@ public class DomContentProvider implements ContentProvider, NamespaceContext {
                return Collections.unmodifiableList(res).iterator();
        }
 
+       TransformerFactory getTransformerFactory() {
+               return transformerFactory;
+       }
+
 }