X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2Fxml%2FDomContentProvider.java;h=66ff878d5c6a9a644445a97bafa64869e19e2cfd;hb=1d6840195189cbdbf632ca2800b6179d3b6349df;hp=80523cb6c89898259252b06266dc1876918c641a;hpb=cc1dd97ebcc32e1bd754073ad23def182f460452;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 80523cb6c..66ff878d5 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,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; + 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<>() { @@ -61,27 +68,41 @@ public class DomContentProvider implements ContentProvider, NamespaceContext { // } @Override - public ProvidedContent get(ProvidedSession session, String mountPath, String relativePath) { + public ProvidedContent get(ProvidedSession session, String relativePath) { if ("".equals(relativePath)) return new DomContent(session, this, document.getDocumentElement()); + + NodeList nodes = findContent(relativePath); + if (nodes.getLength() > 1) + throw new IllegalArgumentException("Multiple content found for " + relativePath + " under " + mountPath); + if (nodes.getLength() == 0) + 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); + } + + protected NodeList findContent(String relativePath) { if (relativePath.startsWith("/")) 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); - 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"); - Element element = (Element) nodes.item(0); - return new DomContent(session, this, element); + return nodes; } catch (XPathExpressionException e) { throw new IllegalArgumentException("XPath expression " + xPathExpression + " cannot be evaluated", e); } + + } + + @Override + public boolean exists(ProvidedSession session, String relativePath) { + if ("".equals(relativePath)) + return true; + NodeList nodes = findContent(relativePath); + return nodes.getLength() != 0; } public void persist(ProvidedSession session) { @@ -101,6 +122,10 @@ public class DomContentProvider implements ContentProvider, NamespaceContext { return mountPath; } + public void registerPrefix(String prefix, String namespace) { + DomUtils.addNamespace(document.getDocumentElement(), prefix, namespace); + } + /* * NAMESPACE CONTEXT */ @@ -127,4 +152,8 @@ public class DomContentProvider implements ContentProvider, NamespaceContext { return Collections.unmodifiableList(res).iterator(); } + TransformerFactory getTransformerFactory() { + return transformerFactory; + } + }