You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2025/07/02 09:02:33 UTC

(jackrabbit) branch trunk updated: JCR-5137: Update JCR commons to implement current jackrabbit-api (#231)

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

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


The following commit(s) were added to refs/heads/trunk by this push:
     new 16504b3fd JCR-5137: Update JCR commons to implement current jackrabbit-api (#231)
16504b3fd is described below

commit 16504b3fd27902bc799998862de79641e0a3088d
Author: Julian Reschke <re...@apache.org>
AuthorDate: Wed Jul 2 11:02:29 2025 +0200

    JCR-5137: Update JCR commons to implement current jackrabbit-api (#231)
---
 .../org/apache/jackrabbit/core/SessionImpl.java    | 37 +++++++++++++
 .../jackrabbit/api/JackrabbitSessionTest.java      | 61 ++++++++++++++++++++--
 .../core/security/user/UserImporterTest.java       | 10 ++++
 jackrabbit-parent/pom.xml                          |  4 +-
 4 files changed, 106 insertions(+), 6 deletions(-)

diff --git a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
index 7a6dfd59a..d413a245c 100644
--- a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
+++ b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
@@ -738,6 +738,43 @@ public class SessionImpl extends AbstractSession
         }
     }
 
+    private static boolean isValidNamespaceName(String namespace) {
+        // the empty namespace and "internal" are valid as well, otherwise it always contains a colon (as it is a URI)
+        // compare with RFC 3986, Section 3 (https://datatracker.ietf.org/doc/html/rfc3986#section-3)
+        return namespace.isEmpty() || namespace.equals(Name.NS_REP_URI) || namespace.contains(":");
+    }
+
+    @Override
+    public String getExpandedName(Item item) throws RepositoryException {
+        String name = item.getName();
+        int pos = name.indexOf(":");
+        if (pos > 0) {
+            String prefix = name.substring(0, pos);
+            String uri = getNamespaceURI(prefix);
+            if (!isValidNamespaceName(uri)) {
+                throw new NamespaceException("Cannot determine expanded name for '" + name +
+                    "' as registered namespace name '" + uri + "' is invalid");
+            }
+            return "{" + uri + "}" + name.substring(pos + 1);
+        }
+        else {
+            return "{}" + name;
+        }
+    }
+
+    @Override
+    public String getExpandedPath(Item item) throws RepositoryException {
+        StringBuilder result = new StringBuilder();
+        String name;
+        do {
+            result.insert(0, "/" + getExpandedName(item));
+            item = item.getParent();
+            name = item.getName();
+            // walk up to the root
+        } while (!name.isEmpty());
+        return result.toString();
+    }
+
     //--------------------------------------------------------------< Session >
     /**
      * {@inheritDoc}
diff --git a/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/JackrabbitSessionTest.java b/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/JackrabbitSessionTest.java
index f1a36298b..55366a700 100644
--- a/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/JackrabbitSessionTest.java
+++ b/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/JackrabbitSessionTest.java
@@ -18,16 +18,21 @@ package org.apache.jackrabbit.api;
 
 import org.apache.jackrabbit.test.AbstractJCRTest;
 import org.apache.jackrabbit.test.NotExecutableException;
-import org.junit.Ignore;
 
 import javax.jcr.GuestCredentials;
 import javax.jcr.Item;
+import javax.jcr.NamespaceException;
 import javax.jcr.Node;
 import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 
+import java.util.UUID;
+
 import static org.mockito.Mockito.mock;
 
+// Borrowed from org.apache.jackrabbit.oak.jcr.session.JackrabbitSessionTest.
+// Please keep in sync.
+
 public class JackrabbitSessionTest extends AbstractJCRTest {
 
     private JackrabbitSession s;
@@ -58,7 +63,7 @@ public class JackrabbitSessionTest extends AbstractJCRTest {
     }
 
     // @Ignore("Jackrabbit does not check cross-Session request")
-    public void ignoreTestGetParentOrNullSessionMismatch() throws Exception {
+    public void ignoreGetParentOrNullSessionMismatch() throws Exception {
         JackrabbitSession guest = (JackrabbitSession) getHelper().getRepository().login(new GuestCredentials());
         try {
             guest.getParentOrNull(s.getNode(testRoot));
@@ -70,8 +75,8 @@ public class JackrabbitSessionTest extends AbstractJCRTest {
         }
     }
 
-    // @Ignore("Jackrabbit does not verify that the Item was obtained from Jackrabbit")
-    public void ignoreTestGetParentOrNullImplMismatch() {
+    // @Ignore("Jackrabbit does not check cross-Session request")
+    public void ignoreGetParentOrNullImplMismatch() {
         try {
             Item item = mock(Item.class);
             s.getParentOrNull(item);
@@ -80,4 +85,52 @@ public class JackrabbitSessionTest extends AbstractJCRTest {
             // success
         }
     }
+
+    public void testGetExpandedName() throws RepositoryException {
+        // empty namespace uri
+        assertEquals("{}testroot", s.getExpandedName(testRootNode));
+        Node n = testRootNode.addNode("test:bar");
+        assertEquals("{http://www.apache.org/jackrabbit/test}bar", s.getExpandedName(n));
+        // now remap namespace uri - should not affect expanded name
+        assertEquals("prefix 'test' has unexpected mapping",
+                "http://www.apache.org/jackrabbit/test", s.getNamespaceURI("test"));
+        s.setNamespacePrefix("test", "urn:foo");
+        assertEquals("{http://www.apache.org/jackrabbit/test}bar", s.getExpandedName(n));
+        // use special namespace uri
+        n = testRootNode.addNode("rep:bar");
+        assertEquals("{internal}bar", s.getExpandedName(n));
+    }
+
+    public void testGetExpandedNameBrokenNamespace() throws RepositoryException {
+        String uuid = UUID.randomUUID().toString();
+        String randomNamespacePrefix = "prefix-" + uuid;
+        // below is not a valid namespace a.k.a. namespace URI
+        String randomNamespaceName = "name-" + uuid;
+
+        // register broken namespace prefix/name mapping
+        s.getWorkspace().getNamespaceRegistry().registerNamespace(randomNamespacePrefix, randomNamespaceName);
+
+        try {
+            Node n = testRootNode.addNode(randomNamespacePrefix + ":qux");
+
+            // there is no expanded name, thus we expect an exception here
+            String result = s.getExpandedName(n);
+            fail("there is no expanded name in this case, so we expect the call to fail, however we get: " + result);
+        } catch (NamespaceException ex) {
+            // expected
+        }
+        //finally {
+        // not supported in Jackrabbit
+        // s.getWorkspace().getNamespaceRegistry().unregisterNamespace(randomNamespacePrefix);
+        // }
+    }
+
+    public void testGetExpandedPath() throws RepositoryException {
+        assertEquals("/{}testroot", s.getExpandedPath(testRootNode));
+        Node n = testRootNode.addNode("test:bar").addNode("rep:bar");
+        assertEquals("/{}testroot/{http://www.apache.org/jackrabbit/test}bar/{internal}bar", s.getExpandedPath(n));
+        // now remap namespace uri - should not affect expanded name
+        s.setNamespacePrefix("test", "urn:foo");
+        assertEquals("/{}testroot/{http://www.apache.org/jackrabbit/test}bar/{internal}bar", s.getExpandedPath(n));
+    }
 }
\ No newline at end of file
diff --git a/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserImporterTest.java b/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserImporterTest.java
index fc395505c..fa3db3d46 100644
--- a/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserImporterTest.java
+++ b/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserImporterTest.java
@@ -1671,6 +1671,16 @@ public class UserImporterTest extends AbstractJCRTest {
             return null;
         }
 
+        @Override
+        public String getExpandedName(Item item) throws UnsupportedRepositoryOperationException {
+            throw new UnsupportedRepositoryOperationException("see JCR-5137");
+        }
+
+        @Override
+        public String getExpandedPath(Item item) throws UnsupportedRepositoryOperationException {
+            throw new UnsupportedRepositoryOperationException("see JCR-5137");
+        }
+
         public Repository getRepository() {
             return null;
         }
diff --git a/jackrabbit-parent/pom.xml b/jackrabbit-parent/pom.xml
index 69806585d..e5f1c0cb1 100644
--- a/jackrabbit-parent/pom.xml
+++ b/jackrabbit-parent/pom.xml
@@ -54,8 +54,8 @@
     <test.opts.memory>-Xmx256m</test.opts.memory>
     <test.opts.modules />
     <test.opts>${test.opts.modules} ${test.opts.coverage} ${test.opts.memory} -enableassertions</test.opts>
-    <!-- OAK version used in componenents that *implement* oak-jackrabbit-api -->
-    <oak-jackrabbit-api.version.implemented>1.76.0</oak-jackrabbit-api.version.implemented>
+    <!-- OAK version used in components that *implement* oak-jackrabbit-api -->
+    <oak-jackrabbit-api.version.implemented>1.80</oak-jackrabbit-api.version.implemented>
     <!-- OAK version used in componenents that *use* oak-jackrabbit-api -->
     <oak-jackrabbit-api.version.used>1.22.22</oak-jackrabbit-api.version.used>
     <jetty.version>9.4.56.v20240826</jetty.version>