From f6e0ccbca440f55ca9732bfa5962cceaba82f5c7 Mon Sep 17 00:00:00 2001 From: Jochen Berger Date: Tue, 18 Jun 2013 12:01:05 +0200 Subject: [PATCH] fix a NullPointerException that occurred when creating array filters on non-existent properties --- .../internal/filter/ArrayEvalFilter.java | 3 ++ .../internal/filter/ArrayIndexFilter.java | 3 ++ .../internal/filter/ArrayQueryFilter.java | 4 ++- .../jayway/jsonpath/JsonPathFilterTest.java | 30 +++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayEvalFilter.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayEvalFilter.java index 0393b0b5..d7145f4c 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayEvalFilter.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayEvalFilter.java @@ -37,6 +37,9 @@ public class ArrayEvalFilter extends PathTokenFilter { @Override public Object filter(Object obj, JsonProvider jsonProvider) { //[?(@.isbn == 10)] + if (obj == null){ + return null; + } List src = jsonProvider.toList(obj); List result = jsonProvider.createList(); diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayIndexFilter.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayIndexFilter.java index c7ccc070..f64091ea 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayIndexFilter.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayIndexFilter.java @@ -32,6 +32,9 @@ public class ArrayIndexFilter extends PathTokenFilter { @Override public Object filter(Object obj,JsonProvider jsonProvider) { + if(obj == null){ + return null; + } List src = jsonProvider.toList(obj); List result = jsonProvider.createList(); diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayQueryFilter.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayQueryFilter.java index 80892f78..8b4ffad6 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayQueryFilter.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/ArrayQueryFilter.java @@ -31,7 +31,9 @@ public class ArrayQueryFilter extends PathTokenFilter { @Override public Object filter(Object obj, JsonProvider jsonProvider, LinkedList filters, boolean inArrayContext) { - + if (obj == null){ + return null; + } Filter filter = filters.poll(); return filter.doFilter((List)obj); diff --git a/json-path/src/test/java/com/jayway/jsonpath/JsonPathFilterTest.java b/json-path/src/test/java/com/jayway/jsonpath/JsonPathFilterTest.java index 04e22ec6..8867cd65 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/JsonPathFilterTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/JsonPathFilterTest.java @@ -2,6 +2,10 @@ package com.jayway.jsonpath; import org.junit.Test; +import com.jayway.jsonpath.internal.filter.FilterFactory; +import com.jayway.jsonpath.internal.filter.PathTokenFilter; +import com.jayway.jsonpath.spi.impl.JsonSmartJsonProvider; + import java.util.HashMap; import java.util.List; import java.util.Map; @@ -129,4 +133,30 @@ public class JsonPathFilterTest { assertEquals(1, res.get(0).intValue()); } + @Test + public void array_query_filter_on_non_existent_property_returns_null(){ + final PathTokenFilter hugePage = FilterFactory.createFilter("[?(@.wordCount >= 10000)]"); + Filter filter = new Filter.FilterAdapter() { + @Override + public boolean accept(Object obj) { + return hugePage.filter(obj, new JsonSmartJsonProvider()) != null; + } + }; + + assertEquals(null, JsonPath.read(DOCUMENT, "$.store.book.page[?]", filter)); + } + + @Test + public void array_eval_filter_on_non_existent_property_returns_null(){ + final JsonPath hugePage = JsonPath.compile("$.store.book.page[?(@.wordCount >= 10000)]"); + assertEquals(null, hugePage.read(DOCUMENT)); + } + + @Test + public void array_index_filter_on_non_existent_property_returns_null(){ + final JsonPath hugePage = JsonPath.compile("$.store.book.page[12]"); + assertEquals(null, hugePage.read(DOCUMENT)); + } + + }