X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;ds=inline;f=jcr%2Forg.argeo.cms.jcr%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjcr%2Facr%2FJcrContentProvider.java;h=7f471c9b0d656a694482076df38872fb95de098d;hb=7e464c3cedfa41ece64811fb55ddc9ce740a1050;hp=fc4a61bf9e61a72c316f5b5f5f8bf50a291932fb;hpb=c615307d7b87bcb260d8a9f402c6e0a880862f38;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 fc4a61bf9..7f471c9b0 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 @@ -5,34 +5,44 @@ import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.Objects; -import javax.jcr.Node; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.xml.namespace.NamespaceContext; import org.argeo.api.acr.Content; -import org.argeo.api.acr.ContentUtils; 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.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 { + public final static String ACR_MOUNT_PATH_PROPERTY = "acr.mount.path"; + private Repository jcrRepository; private Session adminSession; + private String mountPath; + private Map sessionAdapters = Collections.synchronizedMap(new HashMap<>()); - public void start() { + public void start(Map properties) { + mountPath = properties.get(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 stop() { - JcrUtils.logoutQuietly(adminSession); + if (adminSession.isLive()) + JcrUtils.logoutQuietly(adminSession); } public void setJcrRepository(Repository jcrRepository) { @@ -40,26 +50,40 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { } @Override - public Content get(ProvidedSession contentSession, String mountPath, String relativePath) { - String workspace = ContentUtils.getParentPath(mountPath)[1]; + 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, + 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(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; + } + + public Session getJcrSession(Content content, String jcrWorkspace) { + return getJcrSession(((ProvidedContent) content).getSession(), jcrWorkspace); + } + + @Override + public String getMountPath() { + return mountPath; } /*