This is an automated email from the ASF dual-hosted git repository.

joerghoh pushed a commit to branch OAK-11827-NodeImpl-isNodeType
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 4c28fdd596799364ad9cd6306522ef242f8ead8f
Author: Joerg Hoh <[email protected]>
AuthorDate: Wed Jul 30 14:25:39 2025 +0200

    OAK-11827 check the permission of the mixin tree only once
---
 .../java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java     | 9 +++++++--
 .../org/apache/jackrabbit/oak/jcr/session/SessionContext.java    | 9 +++++++++
 .../java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java  | 2 ++
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git 
a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java 
b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
index 54e8533f3d..9ec8debc21 100644
--- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
+++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
@@ -128,6 +128,8 @@ public class NodeImpl<T extends NodeDelegate> extends 
ItemImpl<T> implements Jac
      */
     private static final Logger LOG = LoggerFactory.getLogger(NodeImpl.class);
 
+    private static final String CACHE_KEY_MIXIN_TPYES_READABLE = 
NodeImpl.class.getName() + ".MIXIN_TYPES_READABLE";
+
     private final int logWarnStringSizeThreshold;
 
     @Nullable
@@ -1342,8 +1344,11 @@ public class NodeImpl<T extends NodeDelegate> extends 
ItemImpl<T> implements Jac
     }
 
     private boolean canReadMixinTypes(@NotNull Tree tree) {
-        return sessionContext.getAccessManager().hasPermissions(
-                tree, EMPTY_MIXIN_TYPES, Permissions.READ_PROPERTY);
+        // cache this information per SessionContext, as it is valid 
independent of the node
+        // it is invoked on
+        return (Boolean) 
sessionContext.getCache().computeIfAbsent(CACHE_KEY_MIXIN_TPYES_READABLE,
+                s -> { return sessionContext.getAccessManager().hasPermissions(
+                        tree, EMPTY_MIXIN_TYPES, Permissions.READ_PROPERTY);});
     }
 
     private EffectiveNodeType getEffectiveNodeType() throws 
RepositoryException {
diff --git 
a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
 
b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
index ebc3781783..5ebcd91e6a 100644
--- 
a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
+++ 
b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
@@ -20,6 +20,7 @@ import static java.util.Objects.requireNonNull;
 import static 
org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory.DEFAULT_BLOB_ACCESS_PROVIDER;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -117,6 +118,8 @@ public class SessionContext implements NamePathMapper {
     
     private final SessionQuerySettings sessionQuerySettings;
 
+    private final Map<String,Object> cacheMap;
+
     public SessionContext(
              @NotNull Repository repository, @NotNull StatisticManager 
statisticManager,
              @NotNull SecurityProvider securityProvider, @NotNull Whiteboard 
whiteboard,
@@ -152,6 +155,7 @@ public class SessionContext implements NamePathMapper {
         this.valueFactory = new ValueFactoryImpl(
                 delegate.getRoot(), namePathMapper, this.blobAccessProvider);
         this.sessionQuerySettings = sessionQuerySettings;
+        this.cacheMap = new HashMap<>();
     }
 
     public final Map<String, Object> getAttributes() {
@@ -426,6 +430,11 @@ public class SessionContext implements NamePathMapper {
         return securityProvider;
     }
 
+    @NotNull
+    public Map<String,Object> getCache() {
+        return this.cacheMap;
+    }
+
     //-----------------------------------------------------------< internal 
>---
 
     void dispose() {
diff --git 
a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java 
b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
index 2eadf539aa..ed774e2ca1 100644
--- 
a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
+++ 
b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
@@ -481,6 +481,8 @@ public class SessionImpl implements JackrabbitSession {
                 return true;
             }
         });
+        // clear the cache
+        sessionContext.getCache().clear();
     }
 
     @Override

Reply via email to