X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2Fxml%2FDomContentProvider.java;h=d569350975ff1c5fa8597ebe6962f8bbdf95e13a;hb=117eaabc86f6c09eff9a4b971ac137d51f45e953;hp=54013e2ad1301deb66235671fcce278e6be64b58;hpb=da9d144b6b241e1526a3bd255dff905a7969a5bc;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/acr/xml/DomContentProvider.java b/org.argeo.cms/src/org/argeo/cms/acr/xml/DomContentProvider.java index 54013e2ad..d56935097 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/xml/DomContentProvider.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/xml/DomContentProvider.java @@ -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,11 +16,13 @@ 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; 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; @@ -31,12 +34,17 @@ public class DomContentProvider implements ContentProvider, NamespaceContext { // TODO centralise in some executor? private final ThreadLocal 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<>() { @@ -50,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)) @@ -69,7 +67,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); } @@ -78,8 +77,8 @@ public class DomContentProvider implements ContentProvider, NamespaceContext { if (relativePath.startsWith("/")) throw new IllegalArgumentException("Relative path cannot start with /"); String xPathExpression = '/' + relativePath; - if ("/".equals(mountPath)) - xPathExpression = "/cr:root" + xPathExpression; + if (ContentUtils.SLASH_STRING.equals(mountPath)) // repository root + xPathExpression = "/" + CrName.root.qName() + xPathExpression; try { NodeList nodes = (NodeList) xPath.get().evaluate(xPathExpression, document, XPathConstants.NODESET); return nodes; @@ -144,4 +143,8 @@ public class DomContentProvider implements ContentProvider, NamespaceContext { return Collections.unmodifiableList(res).iterator(); } + TransformerFactory getTransformerFactory() { + return transformerFactory; + } + }