You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by jo...@apache.org on 2024/10/15 10:28:30 UTC

(jackrabbit-oak) branch trunk updated: OAK-11187 implement JackrabbitNode.getParentOrNull (#1781)

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

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


The following commit(s) were added to refs/heads/trunk by this push:
     new bc58fea9b3 OAK-11187 implement JackrabbitNode.getParentOrNull (#1781)
bc58fea9b3 is described below

commit bc58fea9b36aea8d0579ec561a3bd9469bca3141
Author: Jörg Hoh <jo...@users.noreply.github.com>
AuthorDate: Tue Oct 15 12:28:26 2024 +0200

    OAK-11187 implement JackrabbitNode.getParentOrNull (#1781)
---
 .../org/apache/jackrabbit/api/JackrabbitNode.java     | 16 ++++++++++++++++
 .../java/org/apache/jackrabbit/api/package-info.java  |  2 +-
 .../apache/jackrabbit/oak/jcr/session/NodeImpl.java   | 19 +++++++++++++++++++
 3 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/JackrabbitNode.java b/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/JackrabbitNode.java
index 537dd672e9..c5669fb102 100644
--- a/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/JackrabbitNode.java
+++ b/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/JackrabbitNode.java
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.api;
 
+import javax.jcr.AccessDeniedException;
+import javax.jcr.ItemNotFoundException;
 import javax.jcr.Node;
 import javax.jcr.Property;
 import javax.jcr.RepositoryException;
@@ -87,4 +89,18 @@ public interface JackrabbitNode extends Node {
             return null;
         }
     }
+
+    /**
+     * Same as {@link #getParent()}, but instead of throwing an ItemNotFoundException or AccessDeniedException 
+     * just return {@code null}.
+     * @return the parent node, or {@code null} if there is no parent or the parent node is not accessible.
+     * @throws RepositoryException if an error occurs.
+     */
+    default @Nullable Node getParentOrNull() throws RepositoryException {
+        try {
+            return getParent();
+        } catch (ItemNotFoundException | AccessDeniedException e) {
+            return null;
+        }
+    }
 }
diff --git a/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/package-info.java b/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/package-info.java
index 596e4759a1..9d79c4bf19 100644
--- a/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/package-info.java
+++ b/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/package-info.java
@@ -18,6 +18,6 @@
 /**
  * Jackrabbit extensions for JCR core interfaces
  */
-@org.osgi.annotation.versioning.Version("2.8.1")
+@org.osgi.annotation.versioning.Version("2.9.0")
 package org.apache.jackrabbit.api;
 
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 9265048926..688a798620 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
@@ -1679,6 +1679,25 @@ public class NodeImpl<T extends NodeDelegate> extends ItemImpl<T> implements Jac
         });
     }
 
+    @Override
+    public @Nullable Node getParentOrNull() throws RepositoryException {
+        return sessionDelegate.performNullable(new NodeOperation<Node>(dlg, "getParentOrNull") {
+            @Nullable
+            @Override
+            public Node performNullable() throws RepositoryException {
+                if (node.isRoot()) {
+                    return null;
+                } else {
+                    NodeDelegate parent = node.getParent();
+                    if (parent == null) {
+                        return null;
+                    }
+                    return createNode(parent, sessionContext);
+                }
+            }
+        });
+    }
+
     /**
      * Provide current node path. Should be invoked from within
      * the SessionDelegate#perform and preferred instead of getPath