From 81c68955fed429123d01e9c4986b0b990e520b23 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 18 Feb 2020 15:12:15 +0100 Subject: [PATCH] DATAMONGO-2476 - Fix Json parsing for unquoted placeholders in arrays. Original pull request: #835. --- .../data/mongodb/util/json/JsonScanner.java | 2 +- .../ParameterBindingJsonReaderUnitTests.java | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/JsonScanner.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/JsonScanner.java index a967cd885..683da2575 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/JsonScanner.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/JsonScanner.java @@ -219,7 +219,7 @@ class JsonScanner { boolean isExpression = false; int parenthesisCount = 0; - while (c == '$' || c == '_' || Character.isLetterOrDigit(c) || c == '#' || c == '{' || c == '[' || c == ']' + while (c == '$' || c == '_' || Character.isLetterOrDigit(c) || c == '#' || c == '{' || c == '[' || (isExpression && isExpressionAllowedChar(c))) { if (charCount == 0 && c == '#') { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java index 876280e27..7754c083b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java @@ -220,6 +220,41 @@ public class ParameterBindingJsonReaderUnitTests { assertThat(target).isEqualTo(new Document("name", "value")); } + @Test // DATAMONGO-2476 + public void bindUnquotedParameterInArray() { + + Document target = parse("{ 'name' : { $in : [?0] } }", "kohlin"); + assertThat(target).isEqualTo(new Document("name", new Document("$in", Collections.singletonList("kohlin")))); + } + + @Test // DATAMONGO-2476 + public void bindMultipleUnquotedParameterInArray() { + + Document target = parse("{ 'name' : { $in : [?0,?1] } }", "dalinar", "kohlin"); + assertThat(target).isEqualTo(new Document("name", new Document("$in",Arrays.asList("dalinar", "kohlin")))); + } + + @Test // DATAMONGO-2476 + public void bindUnquotedParameterInArrayWithSpaces() { + + Document target = parse("{ 'name' : { $in : [ ?0 ] } }", "kohlin"); + assertThat(target).isEqualTo(new Document("name", new Document("$in", Collections.singletonList("kohlin")))); + } + + @Test // DATAMONGO-2476 + public void bindQuotedParameterInArray() { + + Document target = parse("{ 'name' : { $in : ['?0'] } }", "kohlin"); + assertThat(target).isEqualTo(new Document("name", new Document("$in", Collections.singletonList("kohlin")))); + } + + @Test // DATAMONGO-2476 + public void bindQuotedMulitParameterInArray() { + + Document target = parse("{ 'name' : { $in : ['?0,?1'] } }", "dalinar", "kohlin"); + assertThat(target).isEqualTo(new Document("name", new Document("$in", Collections.singletonList("dalinar,kohlin")))); + } + private static Document parse(String json, Object... args) { ParameterBindingJsonReader reader = new ParameterBindingJsonReader(json, args);