From 4826f14b9084ad2b03375bec545fdcae1944dbdc Mon Sep 17 00:00:00 2001 From: Mathieu Date: Mon, 14 Nov 2022 07:29:01 +0100 Subject: [PATCH] Introduce do as admin --- .../argeo/cms/jcr/acr/JcrContentProvider.java | 20 ++++++++++++++++--- .../src/org/argeo/jcr/JcrUtils.java | 4 ++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java index eaa27b7..38bcd56 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Objects; +import java.util.function.Function; import javax.jcr.Repository; import javax.jcr.RepositoryException; @@ -89,11 +90,24 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { return mountPath; } + public synchronized T doInAdminSession(Function toDo) { + try { + return toDo.apply(adminSession); + } finally { + try { + if (adminSession.hasPendingChanges()) + adminSession.save(); + } catch (RepositoryException e) { + throw new JcrException("Cannot save admin session", e); + } + } + } + /* * NAMESPACE CONTEXT */ @Override - public String getNamespaceURI(String prefix) { + public synchronized String getNamespaceURI(String prefix) { try { return adminSession.getNamespaceURI(prefix); } catch (RepositoryException e) { @@ -102,7 +116,7 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { } @Override - public String getPrefix(String namespaceURI) { + public synchronized String getPrefix(String namespaceURI) { try { return adminSession.getNamespacePrefix(namespaceURI); } catch (RepositoryException e) { @@ -111,7 +125,7 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { } @Override - public Iterator getPrefixes(String namespaceURI) { + public synchronized Iterator getPrefixes(String namespaceURI) { try { return Arrays.asList(adminSession.getNamespacePrefix(namespaceURI)).iterator(); } catch (RepositoryException e) { diff --git a/org.argeo.cms.jcr/src/org/argeo/jcr/JcrUtils.java b/org.argeo.cms.jcr/src/org/argeo/jcr/JcrUtils.java index 1f1fa11..7f157cd 100644 --- a/org.argeo.cms.jcr/src/org/argeo/jcr/JcrUtils.java +++ b/org.argeo.cms.jcr/src/org/argeo/jcr/JcrUtils.java @@ -1151,7 +1151,7 @@ public class JcrUtils { // } catch (InterruptedException e1) { // // ignore // } - + workspaceSession = repository.login(credentials, workspaceName); } return workspaceSession; @@ -1382,7 +1382,7 @@ public class JcrUtils { /** * Convenience method for adding a single privilege to a principal (user or - * role), typically jcr:all + * role), typically jcr:all. Session is saved. */ public synchronized static void addPrivilege(Session session, String path, String principal, String privilege) throws RepositoryException { -- 2.39.2