From: Mathieu Baudier Date: Mon, 16 May 2022 08:11:11 +0000 (+0200) Subject: Make JCR content independent of a given node. X-Git-Tag: v2.3.10~231 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=284e5f62177da9640a16435107925d68f0611dcb;p=lgpl%2Fargeo-commons.git Make JCR content independent of a given node. --- diff --git a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java index 94fe7cf58..2008fabe4 100644 --- a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java +++ b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java @@ -27,40 +27,45 @@ import org.argeo.jcr.JcrException; /** A JCR {@link Node} accessed as {@link Content}. */ public class JcrContent extends AbstractContent { - private Node jcrNode; +// private Node jcrNode; private JcrContentProvider provider; private ProvidedSession session; - protected JcrContent(ProvidedSession session, JcrContentProvider provider, Node node) { + private String jcrWorkspace; + private String jcrPath; + + protected JcrContent(ProvidedSession session, JcrContentProvider provider, String jcrWorkspace, String jcrPath) { this.session = session; this.provider = provider; - this.jcrNode = node; + this.jcrWorkspace = jcrWorkspace; + this.jcrPath = jcrPath; } @Override public QName getName() { - String name = Jcr.getName(jcrNode); + String name = Jcr.getName(getJcrNode()); if (name.equals("")) {// root - name = Jcr.getWorkspaceName(jcrNode); + name = Jcr.getWorkspaceName(getJcrNode()); } return NamespaceUtils.parsePrefixedName(provider, name); } + @SuppressWarnings("unchecked") @Override public Optional get(QName key, Class clss) { if (isDefaultAttrTypeRequested(clss)) { - return Optional.of((A) get(jcrNode, key.toString())); + return Optional.of((A) get(getJcrNode(), key.toString())); } - return Optional.of((A) Jcr.get(jcrNode, key.toString())); + return Optional.of((A) Jcr.get(getJcrNode(), key.toString())); } @Override public Iterator iterator() { try { - return new JcrContentIterator(jcrNode.getNodes()); + return new JcrContentIterator(getJcrNode().getNodes()); } catch (RepositoryException e) { - throw new JcrException("Cannot list children of " + jcrNode, e); + throw new JcrException("Cannot list children of " + getJcrNode(), e); } } @@ -68,7 +73,7 @@ public class JcrContent extends AbstractContent { protected Iterable keys() { try { Set keys = new HashSet<>(); - properties: for (PropertyIterator propertyIterator = jcrNode.getProperties(); propertyIterator.hasNext();) { + for (PropertyIterator propertyIterator = getJcrNode().getProperties(); propertyIterator.hasNext();) { Property property = propertyIterator.nextProperty(); // TODO convert standard names // TODO skip technical properties @@ -77,25 +82,17 @@ public class JcrContent extends AbstractContent { } return keys; } catch (RepositoryException e) { - throw new JcrException("Cannot list properties of " + jcrNode, e); + throw new JcrException("Cannot list properties of " + getJcrNode(), e); } - -// return new Iterable() { -// -// @Override -// public Iterator iterator() { -// try { -// PropertyIterator propertyIterator = jcrNode.getProperties(); -// return new JcrKeyIterator(provider, propertyIterator); -// } catch (RepositoryException e) { -// throw new JcrException("Cannot retrive properties from " + jcrNode, e); -// } -// } -// }; } public Node getJcrNode() { - return jcrNode; + try { + // TODO caching? + return provider.getJcrSession(session, jcrWorkspace).getNode(jcrPath); + } catch (RepositoryException e) { + throw new JcrException("Cannot retrieve " + jcrPath + " from workspace " + jcrWorkspace, e); + } } /** Cast to a standard Java object. */ @@ -154,7 +151,7 @@ public class JcrContent extends AbstractContent { @Override public Content next() { - current = new JcrContent(session, provider, nodeIterator.nextNode()); + current = new JcrContent(session, provider, jcrWorkspace, Jcr.getPath(nodeIterator.nextNode())); return current; } @@ -169,7 +166,7 @@ public class JcrContent extends AbstractContent { @Override public Content getParent() { - return new JcrContent(session, provider, Jcr.getParent(getJcrNode())); + return new JcrContent(session, provider, jcrWorkspace, Jcr.getParentPath(getJcrNode())); } @Override @@ -209,31 +206,37 @@ public class JcrContent extends AbstractContent { } - class JcrKeyIterator implements Iterator { - private final JcrContentProvider contentSession; - private final PropertyIterator propertyIterator; - - protected JcrKeyIterator(JcrContentProvider contentSession, PropertyIterator propertyIterator) { - this.contentSession = contentSession; - this.propertyIterator = propertyIterator; - } - - @Override - public boolean hasNext() { - return propertyIterator.hasNext(); - } - - @Override - public QName next() { - Property property = null; - try { - property = propertyIterator.nextProperty(); - // TODO map standard property names - return NamespaceUtils.parsePrefixedName(provider, property.getName()); - } catch (RepositoryException e) { - throw new JcrException("Cannot retrieve property " + property, null); - } - } + /* + * ADAPTERS + */ + public A adapt(Class clss) { + return super.adapt(clss); } + +// class JcrKeyIterator implements Iterator { +// private final PropertyIterator propertyIterator; +// +// protected JcrKeyIterator(PropertyIterator propertyIterator) { +// this.propertyIterator = propertyIterator; +// } +// +// @Override +// public boolean hasNext() { +// return propertyIterator.hasNext(); +// } +// +// @Override +// public QName next() { +// Property property = null; +// try { +// property = propertyIterator.nextProperty(); +// // TODO map standard property names +// return NamespaceUtils.parsePrefixedName(provider, property.getName()); +// } catch (RepositoryException e) { +// throw new JcrException("Cannot retrieve property " + property, null); +// } +// } +// +// } } diff --git a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java index fc4a61bf9..a7005ce23 100644 --- a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java +++ b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java @@ -6,7 +6,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import javax.jcr.Node; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; @@ -41,7 +40,12 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { @Override public Content get(ProvidedSession contentSession, String mountPath, String relativePath) { - String workspace = ContentUtils.getParentPath(mountPath)[1]; + String jcrWorkspace = ContentUtils.getParentPath(mountPath)[1]; + String jcrPath = "/" + relativePath; + return new JcrContent(contentSession, this, jcrWorkspace, jcrPath); + } + + public Session getJcrSession(ProvidedSession contentSession, String jcrWorkspace) { JcrSessionAdapter sessionAdapter = sessionAdapters.get(contentSession); if (sessionAdapter == null) { final JcrSessionAdapter newSessionAdapter = new JcrSessionAdapter(jcrRepository, @@ -51,15 +55,8 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { sessionAdapter = newSessionAdapter; } - Session jcrSession = sessionAdapter.getSession(workspace); - String jcrPath = "/" + relativePath; - try { - Node node = jcrSession.getNode(jcrPath); - return new JcrContent(contentSession, this, node); - } catch (RepositoryException e) { - throw new JcrException("Cannot get JCR content '" + jcrPath + ", mounted from '" + mountPath - + "' with JCR session " + jcrSession, e); - } + Session jcrSession = sessionAdapter.getSession(jcrWorkspace); + return jcrSession; } /* diff --git a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrSessionAdapter.java b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrSessionAdapter.java index 10b243bcb..896f30a9e 100644 --- a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrSessionAdapter.java +++ b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrSessionAdapter.java @@ -3,9 +3,7 @@ package org.argeo.cms.jcr.acr; import java.security.PrivilegedAction; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; import javax.jcr.Repository; import javax.jcr.RepositoryException;