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\":\"'\\\"'\\\"\"}"));
}