You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2017/05/29 10:29:30 UTC

svn commit: r1796611 - in /sling/trunk/bundles/jcr/contentparser/src: main/java/org/apache/sling/jcr/contentparser/impl/ test/java/org/apache/sling/jcr/contentparser/impl/

Author: sseifert
Date: Mon May 29 10:29:30 2017
New Revision: 1796611

URL: http://svn.apache.org/viewvc?rev=1796611&view=rev
Log:
SLING-6915 JCR Content Parser: Tick parsing fails when comment contains tick character

Modified:
    sling/trunk/bundles/jcr/contentparser/src/main/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverter.java
    sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTicksTest.java
    sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverterTest.java

Modified: sling/trunk/bundles/jcr/contentparser/src/main/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverter.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentparser/src/main/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverter.java?rev=1796611&r1=1796610&r2=1796611&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/contentparser/src/main/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverter.java (original)
+++ sling/trunk/bundles/jcr/contentparser/src/main/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverter.java Mon May 29 10:29:30 2017
@@ -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();
     }

Modified: sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTicksTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTicksTest.java?rev=1796611&r1=1796610&r2=1796611&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTicksTest.java (original)
+++ sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonContentParserTicksTest.java Mon May 29 10:29:30 2017
@@ -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
@@ -60,6 +60,16 @@ public class JsonContentParserTicksTest
 
         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 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"));
     }

Modified: sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverterTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverterTest.java?rev=1796611&r1=1796610&r2=1796611&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverterTest.java (original)
+++ sling/trunk/bundles/jcr/contentparser/src/test/java/org/apache/sling/jcr/contentparser/impl/JsonTicksConverterTest.java Mon May 29 10:29:30 2017
@@ -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\":\"'\\\"'\\\"\"}"));
     }