You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/10/20 14:41:21 UTC

[sling-org-apache-sling-jcr-contentparser] 22/38: SLING-6915 JCR Content Parser: Tick parsing fails when comment contains tick character

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

rombert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-contentparser.git

commit 977e6ca5752589f28728011dc54e60423e653da0
Author: Stefan Seifert <ss...@apache.org>
AuthorDate: Mon May 29 10:29:30 2017 +0000

    SLING-6915 JCR Content Parser: Tick parsing fails when comment contains tick character
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1796611 13f79535-47bb-0310-9956-ffa450edef68
---
 .../jcr/contentparser/impl/JsonTicksConverter.java | 23 +++++++++++++++++-----
 .../impl/JsonContentParserTicksTest.java           | 12 ++++++++++-
 .../contentparser/impl/JsonTicksConverterTest.java | 11 +++++++++++
 3 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/src/main/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverter.java b/src/main/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverter.java
index 9996082..3d2cf9d 100644
--- a/src/main/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverter.java
+++ b/src/main/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverter.java
@@ -41,6 +41,8 @@ public final class JsonTicksConverter {
         boolean quoted = false;
         boolean tickQuoted = false;
         boolean escaped = false;
+        boolean comment = false;
+        char lastChar = ' ';
         for (int i = 0; i < len; i++) {
             char in = input.charAt(i);
             if (quoted || tickQuoted) {
@@ -71,18 +73,29 @@ public final class JsonTicksConverter {
                 }
             }
             else {
-                if (in == '\'') {
-                    in = '"';
-                    tickQuoted = true;
+                if (comment) {
+                    if (lastChar == '*' && in == '/') {
+                        comment = false;
+                    }
                 }
-                else if (in == '"') {
-                    quoted = true;
+                else {
+                    if (lastChar == '/' && in == '*') {
+                        comment = true;
+                    }
+                    else if (in == '\'') {
+                        in = '"';
+                        tickQuoted = true;
+                    }
+                    else if (in == '"') {
+                        quoted = true;
+                    }
                 }
             }
             if (in == '\\') {
                 continue;
             }
             output.append(in);
+            lastChar = in;
         }
         return output.toString();
     }
diff --git a/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTicksTest.java b/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTicksTest.java
index 1ba5e62..cd61506 100644
--- a/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTicksTest.java
+++ b/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTicksTest.java
@@ -41,7 +41,7 @@ public class JsonContentParserTicksTest {
     @Before
     public void setUp() {
         underTest = ContentParserFactory.create(ContentType.JSON,
-                new ParserOptions().jsonParserFeatures(JsonParserFeature.QUOTE_TICK));
+                new ParserOptions().jsonParserFeatures(JsonParserFeature.QUOTE_TICK, JsonParserFeature.COMMENTS));
     }
 
     @Test
@@ -65,6 +65,16 @@ public class JsonContentParserTicksTest {
     }
 
     @Test
+    public void testJsonWithTicksMixedWithComment() throws Exception {
+        ContentElement content = parse(underTest, "{/*a'b\"c*/\"prop1\":'value1','prop2':123,'obj':{'prop3':\"value2\"}}");
+
+        Map<String, Object> props = content.getProperties();
+        assertEquals("value1", props.get("prop1"));
+        assertEquals(123L, props.get("prop2"));
+        assertEquals("value2", content.getChild("obj").getProperties().get("prop3"));
+    }
+
+    @Test
     public void testTicksDoubleQuotesInDoubleQuotes() throws Exception {
         ContentElement content = parse(underTest, "{\"prop1\":\"'\\\"\'\\\"\"}");
 
diff --git a/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverterTest.java b/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverterTest.java
index 836d1a8..dfec3a0 100644
--- a/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverterTest.java
+++ b/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverterTest.java
@@ -43,6 +43,17 @@ public class JsonTicksConverterTest {
     }
 
     @Test
+    public void testTickToQuoteMixedWithComment() {
+        assertEquals("{ /* abc */ \"p\":\"v\"}", tickToDoubleQuote("{ /* abc */ 'p':\"v\"}"));
+        assertEquals("{ /* ab'c */ \"p\":\"v\"}", tickToDoubleQuote("{ /* ab'c */ 'p':\"v\"}"));
+        assertEquals("{ /* ab'c' */ \"p\":\"v\"}", tickToDoubleQuote("{ /* ab'c' */ 'p':\"v\"}"));
+        assertEquals("{ /* ab\"c */ \"p\":\"v\"}", tickToDoubleQuote("{ /* ab\"c */ 'p':\"v\"}"));
+        assertEquals("{ /* ab\"c\" */ \"p\":\"v\"}", tickToDoubleQuote("{ /* ab\"c\" */ 'p':\"v\"}"));
+        assertEquals("{ /* ab'c\" */ \"p\":\"v\"}", tickToDoubleQuote("{ /* ab'c\" */ 'p':\"v\"}"));
+        assertEquals("{/*ab'c\"*/\"p\":\"v\"/*ab'c\"*/}", tickToDoubleQuote("{/*ab'c\"*/'p':\"v\"/*ab'c\"*/}"));
+    }
+    
+    @Test
     public void testTicksDoubleQuotesInDoubleQuotes() {
         assertEquals("{\"p\":\"'\\\"'\\\"\"}", tickToDoubleQuote("{\"p\":\"'\\\"'\\\"\"}"));
     }

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.