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

kwin 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 ae48fc10cb OAK-11450 Correctly detect expanded names using empty 
namespace or internal namespace
ae48fc10cb is described below

commit ae48fc10cbe02aaa4cb9d571bd8ca39daea46fa7
Author: Konrad Windszus <[email protected]>
AuthorDate: Sun Feb 2 11:19:34 2025 +0100

    OAK-11450 Correctly detect expanded names using empty namespace or
    internal namespace
---
 .../oak/namepath/impl/GlobalNameMapper.java        | 25 ++++++++++++++--------
 .../oak/namepath/impl/GlobalNameMapperTest.java    | 12 +++++++++++
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/impl/GlobalNameMapper.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/impl/GlobalNameMapper.java
index d2c54d12c2..507f1ab2cb 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/impl/GlobalNameMapper.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/impl/GlobalNameMapper.java
@@ -16,21 +16,21 @@
  */
 package org.apache.jackrabbit.oak.namepath.impl;
 
-import static 
org.apache.jackrabbit.oak.commons.conditions.Validate.checkArgument;
 import static java.util.Collections.emptyList;
 import static java.util.Collections.emptyMap;
 import static java.util.Objects.requireNonNull;
 import static org.apache.jackrabbit.oak.api.Type.STRINGS;
+import static 
org.apache.jackrabbit.oak.commons.conditions.Validate.checkArgument;
 import static 
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
+import static org.apache.jackrabbit.oak.plugins.name.Namespaces.encodeUri;
+import static org.apache.jackrabbit.oak.plugins.tree.TreeUtil.getString;
+import static org.apache.jackrabbit.oak.plugins.tree.TreeUtil.getStrings;
+import static 
org.apache.jackrabbit.oak.plugins.tree.factories.RootFactory.createReadOnlyRoot;
+import static 
org.apache.jackrabbit.oak.plugins.tree.factories.TreeFactory.createReadOnlyTree;
 import static 
org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants.NAMESPACES_PATH;
 import static 
org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants.REP_NSDATA;
 import static 
org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants.REP_PREFIXES;
 import static 
org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants.REP_URIS;
-import static org.apache.jackrabbit.oak.plugins.name.Namespaces.encodeUri;
-import static 
org.apache.jackrabbit.oak.plugins.tree.factories.RootFactory.createReadOnlyRoot;
-import static 
org.apache.jackrabbit.oak.plugins.tree.factories.TreeFactory.createReadOnlyTree;
-import static org.apache.jackrabbit.oak.plugins.tree.TreeUtil.getString;
-import static org.apache.jackrabbit.oak.plugins.tree.TreeUtil.getStrings;
 
 import java.util.Map;
 import java.util.Map.Entry;
@@ -40,6 +40,7 @@ import javax.jcr.RepositoryException;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.namepath.NameMapper;
+import org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.jetbrains.annotations.NotNull;
@@ -67,10 +68,16 @@ public class GlobalNameMapper implements NameMapper {
     protected static boolean isExpandedName(String name) {
         if (name.startsWith("{")) {
             int brace = name.indexOf('}', 1);
-            return brace != -1 && name.substring(1, brace).indexOf(':') != -1;
-        } else {
-            return false;
+            if (brace != -1) {
+                String namespace = name.substring(1, brace);
+                // 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)
+                if (namespace.isEmpty() || 
namespace.equals(NamespaceConstants.NAMESPACE_REP)|| namespace.indexOf(':') != 
-1) {
+                    return true;
+                }
+            }
         }
+        return false;
     }
 
     private final Root root;
diff --git 
a/oak-core/src/test/java/org/apache/jackrabbit/oak/namepath/impl/GlobalNameMapperTest.java
 
b/oak-core/src/test/java/org/apache/jackrabbit/oak/namepath/impl/GlobalNameMapperTest.java
index d0eade307b..268116cd37 100644
--- 
a/oak-core/src/test/java/org/apache/jackrabbit/oak/namepath/impl/GlobalNameMapperTest.java
+++ 
b/oak-core/src/test/java/org/apache/jackrabbit/oak/namepath/impl/GlobalNameMapperTest.java
@@ -17,7 +17,9 @@
 package org.apache.jackrabbit.oak.namepath.impl;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
@@ -108,4 +110,14 @@ public class GlobalNameMapperTest {
             assertEquals(name, mapper.getJcrName(name));
         }
     }
+
+    @Test
+    public void testIsExpandedName() {
+        assertTrue(GlobalNameMapper.isExpandedName("{}something"));
+        assertTrue(GlobalNameMapper.isExpandedName("{internal}something"));
+        
assertTrue(GlobalNameMapper.isExpandedName("{http://www.jcp.org/jcr/nt/1.0}something";));
+        assertFalse(GlobalNameMapper.isExpandedName("{something not a 
namespace}something"));
+        assertFalse(GlobalNameMapper.isExpandedName("rep:something"));
+        assertFalse(GlobalNameMapper.isExpandedName("something"));
+    }
 }

Reply via email to