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(

Reply via email to