This is an automated email from the ASF dual-hosted git repository.
baedke pushed a commit to branch issue/oak-10624
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
The following commit(s) were added to refs/heads/issue/oak-10624 by this push:
new 45e16e074a OAK-10624: o.a.j.o.namepath.JcrPathParser does not accept
some valid local names containing "{" or "}".
45e16e074a is described below
commit 45e16e074a1443c10eadd6b8d01eac9f2b8b8c6f
Author: Manfred Baedke <[email protected]>
AuthorDate: Wed Jan 24 14:31:59 2024 +0100
OAK-10624: o.a.j.o.namepath.JcrPathParser does not accept some valid local
names containing "{" or "}".
Fixed.
---
.../jackrabbit/oak/namepath/JcrPathParser.java | 22 ++++++++++++++++++----
.../jackrabbit/oak/namepath/PathParserTest.java | 1 -
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git
a/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/namepath/JcrPathParser.java
b/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/namepath/JcrPathParser.java
index 0309d931a6..120527554b 100644
---
a/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/namepath/JcrPathParser.java
+++
b/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/namepath/JcrPathParser.java
@@ -228,8 +228,8 @@ public final class JcrPathParser {
if (state == STATE_PREFIX_START && lastPos == pos-1) {
// '{' marks the start of a uri enclosed in an
expanded name
// instead of the usual namespace prefix, if it is
- // located at the beginning of a new segment.
- state = STATE_URI;
+ // located at the beginning of a new segment and a '}'
will follow.
+ state = jcrPath.indexOf('}', pos) == -1 ? STATE_NAME :
STATE_URI;
} else if (state == STATE_NAME_START || state == STATE_DOT
|| state == STATE_DOTDOT) {
// otherwise it's part of the local name
state = STATE_NAME;
@@ -239,6 +239,13 @@ public final class JcrPathParser {
case '}':
if (state == STATE_URI) {
state = STATE_URI_END;
+ } else if (state == STATE_PREFIX_START || state ==
STATE_DOT || state == STATE_DOTDOT) {
+ state = STATE_PREFIX;
+ } else if (state == STATE_NAME_START) {
+ state = STATE_NAME;
+ } else if (state == STATE_INDEX_END) {
+ pathAwareListener.error("'" + c + "' not valid after
index. '/' expected.");
+ return false;
}
break;
@@ -251,9 +258,16 @@ public final class JcrPathParser {
state = STATE_INDEX;
name = jcrPath.substring(lastPos, pos - 1);
lastPos = pos;
- break;
}
- // intentionally no break, so we get the default treatment
for all other states
+ else if (state == STATE_PREFIX_START || state == STATE_DOT
|| state == STATE_DOTDOT) {
+ state = STATE_PREFIX;
+ } else if (state == STATE_NAME_START) {
+ state = STATE_NAME;
+ } else if (state == STATE_INDEX_END) {
+ pathAwareListener.error("'" + c + "' not valid after
index. '/' expected.");
+ return false;
+ }
+ break;
default:
if (state == STATE_PREFIX_START || state == STATE_DOT ||
state == STATE_DOTDOT) {
diff --git
a/oak-core-spi/src/test/java/org/apache/jackrabbit/oak/namepath/PathParserTest.java
b/oak-core-spi/src/test/java/org/apache/jackrabbit/oak/namepath/PathParserTest.java
index 4bbe7f7077..81dc854a57 100755
---
a/oak-core-spi/src/test/java/org/apache/jackrabbit/oak/namepath/PathParserTest.java
+++
b/oak-core-spi/src/test/java/org/apache/jackrabbit/oak/namepath/PathParserTest.java
@@ -354,7 +354,6 @@ public class PathParserTest {
}
@Test
- @Ignore //OAK-10624
public void testCurlyBracketsInNames() throws RepositoryException {
String path = "{a";
TestListener listener = new TestListener(