diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterCompiler.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterCompiler.java index 819dbe12..4dd670a2 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterCompiler.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/FilterCompiler.java @@ -85,6 +85,9 @@ public class FilterCompiler { filter.incrementPosition(1); ExpressionNode expressionNode = expStack.pop(); if(!opsStack.isEmpty()){ + if(expStack.isEmpty()){ + throw new InvalidPathException("Expected expression on right hand side of operator"); + } ExpressionNode right = expStack.pop(); expressionNode = ExpressionNode.createExpressionNode(expressionNode, opsStack.pop(), right); while(!opsStack.isEmpty()){ @@ -110,7 +113,7 @@ public class FilterCompiler { throw new InvalidPathException("Failed to parse filter " + filter.toString()); } } - if(unbalancedBrackets > 0){ + if(unbalancedBrackets != 0){ throw new InvalidPathException("Failed to parse filter. Brackets are not balanced. " + filter.toString()); } diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/RelationalOperator.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/RelationalOperator.java index d3ebbc36..c5051344 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/RelationalOperator.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/RelationalOperator.java @@ -33,7 +33,7 @@ public enum RelationalOperator { return operator; } } - throw new InvalidPathException("Operator not supported " + operatorString); + throw new InvalidPathException("Operator " + operatorString + " not supported "); } @Override diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java index ddbb3796..7e53868c 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ValueNode.java @@ -239,9 +239,6 @@ public abstract class ValueNode { this.compiledPattern = pattern; } - public String getPattern() { - return "/" + pattern + "/"; - } public Pattern getCompiledPattern() { return compiledPattern; @@ -262,7 +259,15 @@ public abstract class ValueNode { @Override public String toString() { - return pattern; + + String flags = ""; + if((compiledPattern.flags() & Pattern.CASE_INSENSITIVE) == Pattern.CASE_INSENSITIVE){ + flags = "i"; + } + + + + return "/" + pattern + "/" + flags; } @Override diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/function/numeric/AbstractAggregation.java b/json-path/src/main/java/com/jayway/jsonpath/internal/function/numeric/AbstractAggregation.java index e23d945f..e6e409f2 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/function/numeric/AbstractAggregation.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/function/numeric/AbstractAggregation.java @@ -35,11 +35,6 @@ public abstract class AbstractAggregation implements Function { Iterable objects = ctx.configuration().jsonProvider().toIterable(model); for (Object obj : objects) { -// Object unwraped = ctx.configuration().jsonProvider().unwrap(obj); -// if (unwraped instanceof Number) { -// Number value = (Number) unwraped; -// next(value); -// } if (obj instanceof Number) { Number value = (Number) obj; next(value); diff --git a/json-path/src/test/java/com/jayway/jsonpath/FilterCompilerTest.java b/json-path/src/test/java/com/jayway/jsonpath/FilterCompilerTest.java index b95dea9d..06925af0 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/FilterCompilerTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/FilterCompilerTest.java @@ -9,7 +9,7 @@ public class FilterCompilerTest { @Test - public void filter_compiler_test() { + public void valid_filters_compile() { assertThat(compile("[?(@)]").toString()).isEqualTo("[?(@)]"); assertThat(compile("[?(@)]").toString()).isEqualTo("[?(@)]"); assertThat(compile("[?(@.firstname)]").toString()).isEqualTo("[?(@['firstname'])]"); @@ -40,5 +40,28 @@ public class FilterCompilerTest { assertThat(compile("[?(@.message.%min()==10)]").toString()).isEqualTo("[?(@['message'].%min() == 10)]"); assertThat(compile("[?(10 == @.message.%min())]").toString()).isEqualTo("[?(10 == @['message'].%min())]"); assertThat(compile("[?(((@)))]").toString()).isEqualTo("[?(@)]"); + assertThat(compile("[?(@.name =~ /.*?/i)]").toString()).isEqualTo("[?(@['name'] =~ /.*?/i)]"); + assertThat(compile("[?(@.name =~ /.*?/)]").toString()).isEqualTo("[?(@['name'] =~ /.*?/)]"); + + } + + + @Test + public void invalid_filters_does_not_compile() { + assertInvalidPathException("[?(@))]"); + assertInvalidPathException("[?(@ FOO 1)]"); + assertInvalidPathException("[?(@ || )]"); + assertInvalidPathException("[?(@ == 'foo )]"); + assertInvalidPathException("[?(@ == 1' )]"); + } + + + private void assertInvalidPathException(String filter){ + try { + compile(filter); + throw new AssertionError("Expected " + filter + " to throw InvalidPathException"); + } catch (InvalidPathException e){ + e.printStackTrace(); + } } }