Skip to content

Commit

Permalink
OAK-11450 Correctly detect expanded names using empty namespace or
Browse files Browse the repository at this point in the history
internal namespace
  • Loading branch information
kwin committed Feb 2, 2025
1 parent ad3254e commit ae48fc1
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -40,6 +40,7 @@
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;
Expand Down Expand Up @@ -67,10 +68,16 @@ protected static boolean isHiddenName(String name) {
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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -108,4 +110,14 @@ public void testPrefixedNames() throws RepositoryException {
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"));
}
}

0 comments on commit ae48fc1

Please sign in to comment.