From 2cb9b474db7af6d7157d15b459468f7dedc4dc8b Mon Sep 17 00:00:00 2001 From: Jochen Berger Date: Thu, 18 Feb 2016 11:48:03 +0100 Subject: [PATCH 1/4] add test for #173 --- .../com/jayway/jsonpath/PathCompilerTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/json-path/src/test/java/com/jayway/jsonpath/PathCompilerTest.java b/json-path/src/test/java/com/jayway/jsonpath/PathCompilerTest.java index 7708bc07f..60a5ba833 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/PathCompilerTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/PathCompilerTest.java @@ -251,4 +251,19 @@ public void issue_predicate_can_have_square_bracket_in_prop() { assertThat(result).containsExactly("] it"); } + + @Test(expected = InvalidPathException.class) + public void array_indexes_must_be_separated_by_commas() { + compile("$[0, 1, 2 4]"); + } + + @Test(expected = InvalidPathException.class) + public void trailing_comma_after_list_is_not_accepted() { + compile("$['1','2',]"); + } + + @Test(expected = InvalidPathException.class) + public void accept_only_a_single_comma_between_indexes() { + compile("$['1', ,'3']"); + } } From 4bfa932cdffbc6b28ab2152ef5bd39bee40833ee Mon Sep 17 00:00:00 2001 From: Jochen Berger Date: Thu, 18 Feb 2016 12:34:35 +0100 Subject: [PATCH 2/4] fail when there are spaces inside array indexes --- .../jsonpath/internal/path/ArrayIndexOperation.java | 9 ++++++--- .../com/jayway/jsonpath/internal/path/PathCompiler.java | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/path/ArrayIndexOperation.java b/json-path/src/main/java/com/jayway/jsonpath/internal/path/ArrayIndexOperation.java index 0fd833a05..8fde93a9a 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/path/ArrayIndexOperation.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/path/ArrayIndexOperation.java @@ -6,11 +6,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.regex.Pattern; import static java.lang.Character.isDigit; public class ArrayIndexOperation { + private final static Pattern COMMA = Pattern.compile("\\s*,\\s*"); + private final List indexes; private ArrayIndexOperation(List indexes) { @@ -39,13 +42,13 @@ public static ArrayIndexOperation parse(String operation) { //check valid chars for (int i = 0; i < operation.length(); i++) { char c = operation.charAt(i); - if (!isDigit(c) && c != ',') { + if (!isDigit(c) && c != ',' && c != ' ') { throw new InvalidPathException("Failed to parse ArrayIndexOperation: " + operation); } } - String[] tokens = operation.split(","); + String[] tokens = COMMA.split(operation, -1); - List tempIndexes = new ArrayList(); + List tempIndexes = new ArrayList(tokens.length); for (String token : tokens) { tempIndexes.add(parseInteger(token)); } diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java b/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java index b8039b9f1..bb860afe7 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java @@ -512,7 +512,7 @@ private boolean readArrayToken(PathTokenAppender appender) { return false; } - String expression = path.subSequence(expressionBeginIndex, expressionEndIndex).toString().replace(" ", ""); + String expression = path.subSequence(expressionBeginIndex, expressionEndIndex).toString().trim(); if ("*".equals(expression)) { return false; @@ -521,7 +521,7 @@ private boolean readArrayToken(PathTokenAppender appender) { //check valid chars for (int i = 0; i < expression.length(); i++) { char c = expression.charAt(i); - if (!isDigit(c) && c != COMMA && c != MINUS && c != SPLIT) { + if (!isDigit(c) && c != COMMA && c != MINUS && c != SPLIT && c != SPACE) { return false; } } From f3ac1a0d152f6ae5b4bc6e701b870fcd4c91eaf1 Mon Sep 17 00:00:00 2001 From: Jochen Berger Date: Thu, 18 Feb 2016 13:06:37 +0100 Subject: [PATCH 3/4] fail when there are multiple commas between subscriptions --- .../com/jayway/jsonpath/internal/path/PathCompiler.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java b/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java index bb860afe7..9e2db4bb6 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java @@ -560,6 +560,7 @@ private boolean readBracketPropertyToken(PathTokenAppender appender) { int endPosition = 0; boolean inProperty = false; boolean inEscape = false; + boolean lastSignificantWasComma = false; while (path.inBounds(readPosition)) { char c = path.charAt(readPosition); @@ -579,7 +580,13 @@ private boolean readBracketPropertyToken(PathTokenAppender appender) { } else { startPosition = readPosition + 1; inProperty = true; + lastSignificantWasComma = false; } + } else if (c == COMMA){ + if (lastSignificantWasComma){ + fail("Found empty property at index "+readPosition); + } + lastSignificantWasComma = true; } readPosition++; } From 7115c6155f8ef315ddad8cee51493a28f9d349a1 Mon Sep 17 00:00:00 2001 From: Jochen Berger Date: Thu, 18 Feb 2016 13:15:56 +0100 Subject: [PATCH 4/4] fix detection of trailing comma --- .../java/com/jayway/jsonpath/internal/path/PathCompiler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java b/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java index 9e2db4bb6..4d003dc7f 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/path/PathCompiler.java @@ -570,6 +570,9 @@ private boolean readBracketPropertyToken(PathTokenAppender appender) { } else if('\\' == c){ inEscape = true; } else if (c == CLOSE_SQUARE_BRACKET && !inProperty) { + if (lastSignificantWasComma){ + fail("Found empty property at index "+readPosition); + } break; } else if (c == potentialStringDelimiter) { if (inProperty && !inEscape) {