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>.