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>