X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=jcr%2Forg.argeo.cms.jcr%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjcr%2Facr%2FJcrContentProvider.java;h=235e27d1a922139558d8e8c42da322199340dda5;hb=da9d144b6b241e1526a3bd255dff905a7969a5bc;hp=ef8e375d012731972b4597114aae57d4f5d2dbab;hpb=8282011b0e20e80704b209ad55fa9fb132e16280;p=lgpl%2Fargeo-commons.git 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 ef8e375d0..235e27d1a 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 @@ -1,7 +1,11 @@ package org.argeo.cms.jcr.acr; import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; +import java.util.Objects; import javax.jcr.Repository; import javax.jcr.RepositoryException; @@ -10,20 +14,32 @@ import javax.xml.namespace.NamespaceContext; import org.argeo.api.acr.Content; 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.argeo.cms.jcr.CmsJcrUtils; import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; +/** A JCR workspace accessed as an {@link ContentProvider}. */ public class JcrContentProvider implements ContentProvider, NamespaceContext { private Repository jcrRepository; private Session adminSession; - public void init() { + private String mountPath; + + private Map sessionAdapters = Collections.synchronizedMap(new HashMap<>()); + + public void start(Map properties) { + mountPath = properties.get(CmsContentRepository.ACR_MOUNT_PATH_PROPERTY); + if ("/".equals(mountPath)) + throw new IllegalArgumentException("JCR content provider cannot be root /"); + Objects.requireNonNull(mountPath); adminSession = CmsJcrUtils.openDataAdminSession(jcrRepository, null); } - public void destroy() { + public void stop() { JcrUtils.logoutQuietly(adminSession); } @@ -32,9 +48,40 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { } @Override - public Content get(ProvidedSession session, String mountPath, String relativePath) { - // TODO Auto-generated method stub - return null; + public ProvidedContent get(ProvidedSession contentSession, String relativePath) { + String jcrWorkspace = ContentUtils.getParentPath(mountPath)[1]; + String jcrPath = "/" + relativePath; + return new JcrContent(contentSession, this, jcrWorkspace, jcrPath); + } + + @Override + public boolean exists(ProvidedSession contentSession, String relativePath) { + String jcrWorkspace = ContentUtils.getParentPath(mountPath)[1]; + String jcrPath = "/" + relativePath; + return new JcrContent(contentSession, this, jcrWorkspace, jcrPath).exists(); + } + + public Session getJcrSession(ProvidedSession contentSession, String jcrWorkspace) { + JcrSessionAdapter sessionAdapter = sessionAdapters.get(contentSession); + if (sessionAdapter == null) { + final JcrSessionAdapter newSessionAdapter = new JcrSessionAdapter(jcrRepository, contentSession, + contentSession.getSubject()); + sessionAdapters.put(contentSession, newSessionAdapter); + contentSession.onClose().thenAccept((s) -> newSessionAdapter.close()); + sessionAdapter = newSessionAdapter; + } + + Session jcrSession = sessionAdapter.getSession(jcrWorkspace); + return jcrSession; + } + + public Session getJcrSession(Content content, String jcrWorkspace) { + return getJcrSession(((ProvidedContent) content).getSession(), jcrWorkspace); + } + + @Override + public String getMountPath() { + return mountPath; } /*