From a2cb5d55f5d0e44d18fd1a2f5256111ad9fa0015 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 12 Aug 2022 09:36:29 +0200 Subject: [PATCH] Admin session to the proper content provider workspace --- .../src/org/argeo/cms/jcr/CmsJcrUtils.java | 7 ++++--- .../src/org/argeo/cms/jcr/acr/JcrContentProvider.java | 7 +++++-- org.argeo.api.cms/src/org/argeo/api/cms/CmsAuth.java | 4 ++++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/CmsJcrUtils.java b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/CmsJcrUtils.java index 4a28dca77..3849c5b97 100644 --- a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/CmsJcrUtils.java +++ b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/CmsJcrUtils.java @@ -20,6 +20,7 @@ import javax.security.auth.login.LoginException; import org.argeo.api.cms.CmsAuth; import org.argeo.api.cms.CmsConstants; +import org.argeo.jcr.JcrUtils; /** Utilities related to Argeo model in JCR */ public class CmsJcrUtils { @@ -245,7 +246,7 @@ public class CmsJcrUtils { public static Session openDataAdminSession(Repository repository, String workspaceName) { LoginContext loginContext; try { - loginContext = new LoginContext(CmsAuth.LOGIN_CONTEXT_DATA_ADMIN); + loginContext = CmsAuth.DATA_ADMIN.newLoginContext(); loginContext.login(); } catch (LoginException e1) { throw new RuntimeException("Could not login as data admin", e1); @@ -260,8 +261,8 @@ public class CmsJcrUtils { @Override public Session run() { try { - return repository.login(workspaceName); - } catch (NoSuchWorkspaceException e) { + return JcrUtils.loginOrCreateWorkspace(repository, workspaceName); + } catch (NoSuchWorkspaceException e) {// should not happen throw new IllegalArgumentException("No workspace " + workspaceName + " available", e); } catch (RepositoryException e) { throw new RuntimeException("Cannot open data admin session", e); 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 08f0ee12f..eaa27b7fc 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 @@ -30,6 +30,9 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { private String mountPath; + // cache + private String jcrWorkspace; + private Map sessionAdapters = Collections.synchronizedMap(new HashMap<>()); public void start(Map properties) { @@ -37,7 +40,8 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { if ("/".equals(mountPath)) throw new IllegalArgumentException("JCR content provider cannot be root /"); Objects.requireNonNull(mountPath); - adminSession = CmsJcrUtils.openDataAdminSession(jcrRepository, null); + jcrWorkspace = ContentUtils.getParentPath(mountPath)[1]; + adminSession = CmsJcrUtils.openDataAdminSession(jcrRepository, jcrWorkspace); } public void stop() { @@ -51,7 +55,6 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { @Override public ProvidedContent get(ProvidedSession contentSession, String relativePath) { - String jcrWorkspace = ContentUtils.getParentPath(mountPath)[1]; String jcrPath = "/" + relativePath; return new JcrContent(contentSession, this, jcrWorkspace, jcrPath); } diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/CmsAuth.java b/org.argeo.api.cms/src/org/argeo/api/cms/CmsAuth.java index 6ecfeba11..31ec8be50 100644 --- a/org.argeo.api.cms/src/org/argeo/api/cms/CmsAuth.java +++ b/org.argeo.api.cms/src/org/argeo/api/cms/CmsAuth.java @@ -30,6 +30,10 @@ public enum CmsAuth { return new LoginContext(getLoginContextName(), subject); } + public LoginContext newLoginContext() throws LoginException { + return new LoginContext(getLoginContextName()); + } + /* * LOGIN CONTEXTS */ -- 2.30.2