Author: cbrisson Date: Wed Jun 14 15:43:14 2017 New Revision: 1798711 URL: http://svn.apache.org/viewvc?rev=1798711&view=rev Log: [tools] Wraps json object/array in an hybrid container to avoid exceptions for missing keys
Modified: velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/JsonTool.java velocity/tools/trunk/velocity-tools-generic/src/test/java/org/apache/velocity/tools/generic/JsonToolTests.java Modified: velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/JsonTool.java URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/JsonTool.java?rev=1798711&r1=1798710&r2=1798711&view=diff ============================================================================== --- velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/JsonTool.java (original) +++ velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/JsonTool.java Wed Jun 14 15:43:14 2017 @@ -79,6 +79,172 @@ import org.w3c.dom.Node; @InvalidScope(Scope.SESSION) public class JsonTool extends ImportSupport implements Iterable { + + /** + * Container for *either* an array *or* an object + */ + public static class HybridJsonContainer + { + /** + * JSONObject content + */ + private JSONObject jsonObject = null; + + /** + * JSONArray content + */ + private JSONArray jsonArray = null; + + /** + * wraps the object into an hybrid JSON container if necessary + */ + private static Object wrapIfNeeded(Object obj) + { + if (obj == null) + { + return obj; + } + else if (obj instanceof JSONArray) + { + return new HybridJsonContainer((JSONArray)obj); + } + else if (obj instanceof JSONObject) + { + return new HybridJsonContainer((JSONObject)obj); + } + else + { + return obj; + } + } + + /** + * wraps an object + */ + public HybridJsonContainer(JSONObject object) + { + jsonObject = object; + } + + /** + * wraps an array + */ + public HybridJsonContainer(JSONArray array) + { + jsonArray = array; + } + + public Object get(int index) + { + Object ret = null; + if (jsonArray != null) + { + ret = wrapIfNeeded(jsonArray.opt(index)); + } + else if (jsonObject != null) + { + ret = wrapIfNeeded(jsonObject.opt(String.valueOf(index))); + } + return ret; + } + + /** + * Get a property from root object + * @param key + * @return property value, or null + */ + public Object get(String key) + { + Object ret = null; + if (jsonArray != null) + { + try + { + ret = wrapIfNeeded(jsonArray.get(Integer.parseInt(key))); + } + catch (NumberFormatException nfe) {} + } + else if (jsonObject != null) + { + ret = wrapIfNeeded(jsonObject.opt(key)); + } + return ret; + } + + /** + * Iterate keys of root object. + * @return iterator + */ + public Iterator<String> keys() + { + return jsonObject == null ? null : jsonObject.keys(); + } + + /** + * Get set of root object keys. + * @return + */ + public Set<String> keySet() + { + return jsonObject == null ? null : jsonObject.keySet(); + } + + /** + * Get an iterator. For a root object, returns an iterator over key names. For a root array, returns an iterator + * over contained objects. + * @return iterator + */ + public Iterator iterator() + { + if (jsonObject != null) + { + return jsonObject.keys(); + } + else if (jsonArray != null) + { + return jsonArray.iterator(); + } + return null; + } + + /** + * Get size of root object or array. + * @return size + */ + public int length() + { + return jsonObject == null ? jsonArray == null ? null : jsonArray.length() : jsonObject.length(); + } + + /** + * Get array of root object keys. + * @return array of keys + */ + public JSONArray names() + { + return jsonObject == null ? null : jsonObject.names(); + } + + /** + * Query root object or array using a JSON pointer + * @param jsonPointer + * @return result + */ + public Object query(String jsonPointer) + { + return jsonObject == null ? jsonArray == null ? null : wrapIfNeeded(jsonArray.query(jsonPointer)) : wrapIfNeeded(jsonObject.query(jsonPointer)); + } + + /** + * Convert JSON object or array into string + * @return JSON representation of the root object or array + */ + public String toString() + { + return jsonObject == null ? jsonArray == null ? "null" : jsonArray.toString() : jsonObject.toString(); + } + } + /** * ImportSupport utility which provides underlying i/o */ @@ -94,15 +260,8 @@ public class JsonTool extends ImportSupp importSupport.configure(config); } - /** - * JSONObject content - */ - private JSONObject jsonObject = null; - - /** - * JSONArray content - */ - private JSONArray jsonArray = null; + private HybridJsonContainer root = null; + /** * Looks for the "file" parameter and automatically uses @@ -202,12 +361,10 @@ public class JsonTool extends ImportSupp throw new Exception(msg); } case TYPE_OBJECT: - jsonArray = null; - jsonObject = new JSONObject(new JSONTokener(reader)); + root = new HybridJsonContainer(new JSONObject(new JSONTokener(reader))); break; case TYPE_ARRAY: - jsonObject = null; - jsonArray = new JSONArray(new JSONTokener(reader)); + root = new HybridJsonContainer(new JSONArray(new JSONTokener(reader))); } } catch (Exception e) @@ -309,7 +466,7 @@ public class JsonTool extends ImportSupp */ public Object root() { - return jsonObject != null ? jsonObject : jsonArray ; + return root; } /** @@ -319,7 +476,7 @@ public class JsonTool extends ImportSupp */ public Object get(int index) { - return jsonArray == null ? null : jsonArray.get(index); + return root == null ? null : root.get(index); } /** @@ -329,7 +486,7 @@ public class JsonTool extends ImportSupp */ public Object get(String key) { - return jsonObject == null ? null : jsonObject.get(key); + return root == null ? null : root.get(key); } /** @@ -338,7 +495,7 @@ public class JsonTool extends ImportSupp */ public Iterator<String> keys() { - return jsonObject == null ? null : jsonObject.keys(); + return root == null ? null : root.keys(); } /** @@ -347,7 +504,7 @@ public class JsonTool extends ImportSupp */ public Set<String> keySet() { - return jsonObject == null ? null : jsonObject.keySet(); + return root == null ? null : root.keySet(); } /** @@ -357,15 +514,7 @@ public class JsonTool extends ImportSupp */ public Iterator iterator() { - if (jsonObject != null) - { - return jsonObject.keys(); - } - else if (jsonArray != null) - { - return jsonArray.iterator(); - } - return null; + return root == null ? null : root.iterator(); } /** @@ -374,7 +523,7 @@ public class JsonTool extends ImportSupp */ public int length() { - return jsonObject == null ? jsonArray == null ? null : jsonArray.length() : jsonObject.length(); + return root == null ? null : root.length(); } /** @@ -383,7 +532,7 @@ public class JsonTool extends ImportSupp */ public JSONArray names() { - return jsonObject == null ? null : jsonObject.names(); + return root == null ? null : root.names(); } /** @@ -393,7 +542,7 @@ public class JsonTool extends ImportSupp */ public Object query(String jsonPointer) { - return jsonObject == null ? jsonArray == null ? null : jsonArray.query(jsonPointer) : jsonObject.query(jsonPointer); + return root == null ? null : root.query(jsonPointer); } /** @@ -402,6 +551,6 @@ public class JsonTool extends ImportSupp */ public String toString() { - return jsonObject == null ? jsonArray == null ? "null" : jsonArray.toString() : jsonObject.toString(); + return root == null ? null : root.toString(); } } Modified: velocity/tools/trunk/velocity-tools-generic/src/test/java/org/apache/velocity/tools/generic/JsonToolTests.java URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-generic/src/test/java/org/apache/velocity/tools/generic/JsonToolTests.java?rev=1798711&r1=1798710&r2=1798711&view=diff ============================================================================== --- velocity/tools/trunk/velocity-tools-generic/src/test/java/org/apache/velocity/tools/generic/JsonToolTests.java (original) +++ velocity/tools/trunk/velocity-tools-generic/src/test/java/org/apache/velocity/tools/generic/JsonToolTests.java Wed Jun 14 15:43:14 2017 @@ -44,6 +44,5 @@ public class JsonToolTests JsonTool jsonTool = new JsonTool(); jsonTool.configure(config); assertEquals(jsonTool.get("foo"), "bar"); - assertEquals(jsonTool.get("array").getClass(), JSONArray.class); } }