From 9ea098d74c9d7e84a1fc56a0c26a2cb8a2360da0 Mon Sep 17 00:00:00 2001 From: Kalle Stenflo Date: Fri, 6 Sep 2013 11:51:22 +0200 Subject: [PATCH] Improved Exception handling. --- .../java/com/jayway/jsonpath/JsonPath.java | 6 ++--- .../internal/filter/ArrayIndexFilter.java | 27 +++++++++++++------ .../internal/filter/PathTokenFilter.java | 9 ++++++- .../java/com/jayway/jsonpath/IssuesTest.java | 3 +-- .../com/jayway/jsonpath/JsonPathTest.java | 3 ++- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java b/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java index 7f80941d..d9f81f1b 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java +++ b/json-path/src/main/java/com/jayway/jsonpath/JsonPath.java @@ -255,11 +255,11 @@ public class JsonPath { result = filter.filter(result, configuration, contextFilters, inArrayContext); - /* + if(result == null && !pathToken.isEndToken()){ - throw new PathNotFoundException("Path token: " + pathToken.getFragment() + " not found in json"); + throw new PathNotFoundException("Path token: '" + pathToken.getFragment() + "' not found."); } - */ + if (!inArrayContext) { inArrayContext = filter.isArrayFilter(); 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 af9020d7..e9d8f461 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 @@ -15,6 +15,7 @@ package com.jayway.jsonpath.internal.filter; import com.jayway.jsonpath.Configuration; +import com.jayway.jsonpath.PathNotFoundException; import com.jayway.jsonpath.spi.JsonProvider; import java.util.regex.Pattern; @@ -101,20 +102,30 @@ public class ArrayIndexFilter extends PathTokenFilter { } else { String[] indexArr = COMMA.split(trimmedCondition); - if(obj == null || jsonProvider.length(obj) == 0){ - //throw new PathNotFoundException("Failed to access array index: '" + condition + "' since the array is null or empty"); + //if(obj == null || jsonProvider.length(obj) == 0){ + if(obj == null){ return result; } - if (indexArr.length == 1) { - return jsonProvider.getProperty(obj, indexArr[0]); + try { + if (indexArr.length == 1) { + /* + if(jsonProvider.length(obj) == 0){ + throw new PathNotFoundException("Array index [" + indexArr[0] + "] not found in path"); + } + */ - } else { - for (String idx : indexArr) { - jsonProvider.setProperty(result, jsonProvider.length(result), jsonProvider.getProperty(obj, idx.trim())); + return jsonProvider.getProperty(obj, indexArr[0]); + } else { + for (String idx : indexArr) { + jsonProvider.setProperty(result, jsonProvider.length(result), jsonProvider.getProperty(obj, idx.trim())); + } + return result; } - return result; + } catch (IndexOutOfBoundsException e){ + throw new PathNotFoundException("Array index " + indexArr + " not found in path", e); } + } } diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/PathTokenFilter.java b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/PathTokenFilter.java index 60eb9fbd..105b59d0 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/filter/PathTokenFilter.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/filter/PathTokenFilter.java @@ -58,6 +58,13 @@ public abstract class PathTokenFilter { @Override public String toString() { - return getClass().getSimpleName() + " => " + condition; + + if(isArrayFilter()){ + return getClass().getSimpleName() + " => " + condition; + } else { + return getClass().getSimpleName() + " => '" + condition + "'"; + } + + } } diff --git a/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java b/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java index a01d3b1a..f53f3d09 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/IssuesTest.java @@ -25,8 +25,7 @@ import static org.junit.Assert.assertThat; */ public class IssuesTest { - //@Test(expected = PathNotFoundException.class) - @Test() + @Test(expected = PathNotFoundException.class) public void issue_11() throws Exception { String json = "{ \"foo\" : [] }"; List result = JsonPath.read(json, "$.foo[?(@.rel= 'item')][0].uri"); diff --git a/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java b/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java index 0b3342c0..3ade8992 100644 --- a/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java +++ b/json-path/src/test/java/com/jayway/jsonpath/JsonPathTest.java @@ -308,7 +308,7 @@ public class JsonPathTest { List all = JsonPath.read(DOCUMENT, "$..*"); } - @Test(expected = IndexOutOfBoundsException.class) + @Test(expected = PathNotFoundException.class) public void access_index_out_of_bounds_does_not_throw_exception() throws Exception { Object res = JsonPath.read(DOCUMENT, "$.store.book[100].author"); @@ -317,4 +317,5 @@ public class JsonPathTest { + }