From 7272760f24fd308c4abb40031ebba63089c9772b Mon Sep 17 00:00:00 2001 From: paulogaspar7 Date: Thu, 12 Sep 2019 17:22:27 +0100 Subject: [PATCH 1/3] Add support for Jakarta JSON-P. --- jmespath-jakarta-jsonp/pom.xml | 35 +++ .../jmespath/jakarta/jsonp/JsonpRuntime.java | 216 ++++++++++++++++++ .../jakarta/jsonp/JsonpComplianceTest.java | 13 ++ .../jmespath/jakarta/jsonp/JsonpTest.java | 12 + pom.xml | 2 + 5 files changed, 278 insertions(+) create mode 100644 jmespath-jakarta-jsonp/pom.xml create mode 100644 jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java create mode 100644 jmespath-jakarta-jsonp/src/test/java/io/burt/jmespath/jakarta/jsonp/JsonpComplianceTest.java create mode 100644 jmespath-jakarta-jsonp/src/test/java/io/burt/jmespath/jakarta/jsonp/JsonpTest.java diff --git a/jmespath-jakarta-jsonp/pom.xml b/jmespath-jakarta-jsonp/pom.xml new file mode 100644 index 0000000..33226c4 --- /dev/null +++ b/jmespath-jakarta-jsonp/pom.xml @@ -0,0 +1,35 @@ + + + + 4.0.0 + + jmespath-jakarta-jsonp + JMESPath Jakarta JSON-P + A JMESPath implementation for Java + + + io.burt + jmespath + 0.4.1-SNAPSHOT + + + + + ${project.groupId} + jmespath-core + ${project.parent.version} + + + ${project.groupId} + jmespath-core + ${project.parent.version} + test-jar + test + + + org.glassfish + jakarta.json + ${jakarta.jsonp.version} + + + diff --git a/jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java b/jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java new file mode 100644 index 0000000..e660736 --- /dev/null +++ b/jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java @@ -0,0 +1,216 @@ +package io.burt.jmespath.jakarta.jsonp; + +import java.io.StringReader; +import java.util.*; + +import io.burt.jmespath.BaseRuntime; +import io.burt.jmespath.JmesPathType; +import io.burt.jmespath.RuntimeConfiguration; + +import javax.json.*; +import javax.json.JsonValue.ValueType; + +import static javax.json.JsonValue.ValueType.ARRAY; +import static javax.json.JsonValue.ValueType.NUMBER; +import static javax.json.JsonValue.ValueType.OBJECT; +import static javax.json.JsonValue.ValueType.STRING; + +public class JsonpRuntime extends BaseRuntime { + private final JsonReaderFactory jsonReaderFactory; + + public JsonpRuntime() { + this(RuntimeConfiguration.defaultConfiguration()); + } + + public JsonpRuntime(RuntimeConfiguration configuration) { + this(configuration, Json.createReaderFactory(null)); + } + + public JsonpRuntime(RuntimeConfiguration configuration, JsonReaderFactory jsonReaderFactory) { + super(configuration); + this.jsonReaderFactory = jsonReaderFactory; + } + + @Override + public JsonValue parseString(String string) { + return jsonReaderFactory.createReader(new StringReader(string)).readValue(); + } + + private static class JsonArrayListWrapper extends AbstractList { + private final JsonArray array; + + JsonArrayListWrapper(JsonArray array) { + this.array = array; + } + + @Override + public JsonValue get(int index) { + return array.get(index); + } + + @Override + public int size() { + return array.size(); + } + } + + @Override + public List toList(JsonValue value) { + ValueType valueType = value.getValueType(); + if (valueType == ARRAY) { + return new JsonArrayListWrapper((JsonArray) value); + } else if (valueType == OBJECT) { + JsonObject obj = (JsonObject)value; + if (!obj.isEmpty()) { + List elements = new ArrayList<>(obj.size()); + for (JsonValue v : obj.values()) { + elements.add(useJsonNull(v)); + } + return elements; + } + } + return Collections.emptyList(); + } + + @Override + public String toString(JsonValue str) { + if (str.getValueType() == STRING) { + return ((JsonString)str).getString(); + } else { + return str.toString(); + } + } + + @Override + public Number toNumber(JsonValue n) { + return (n.getValueType() == NUMBER) ? ((JsonNumber)n).numberValue() : null; + } + + @Override + public boolean isTruthy(JsonValue value) { + switch (value.getValueType()) { + case FALSE: + case NULL: + return false; + case NUMBER: + case TRUE: + return true; + case ARRAY: + return ((JsonArray)value).size() > 0; + case OBJECT: + return ((JsonObject)value).size() > 0; + case STRING: + return ((JsonString)value).getString().length() > 0; + default: + throw new IllegalStateException(String.format("Unknown node type encountered: %s", value.getValueType())); + } + } + + @Override + public JmesPathType typeOf(JsonValue value) { + switch (value.getValueType()) { + case ARRAY: + return JmesPathType.ARRAY; + case OBJECT: + return JmesPathType.OBJECT; + case STRING: + return JmesPathType.STRING; + case FALSE: + case TRUE: + return JmesPathType.BOOLEAN; + case NULL: + return JmesPathType.NULL; + case NUMBER: + return JmesPathType.NUMBER; + default: + throw new IllegalStateException(String.format("Unknown node type encountered: %s", value.getValueType())); + } + } + + @Override + public JsonValue getProperty(JsonValue value, JsonValue name) { + if (value.getValueType() == OBJECT) { + return nodeOrNullNode(((JsonObject)value).get(textOnStringOrNull(name))); + } else { + return JsonValue.NULL; + } + } + + @Override + public Collection getPropertyNames(JsonValue value) { + if (value.getValueType() == OBJECT) { + Set nameSet = ((JsonObject)value).keySet(); + List names = new ArrayList<>(nameSet.size()); + for(String n : nameSet) { + names.add(createString(n)); + } + return names; + } else { + return Collections.emptyList(); + } + } + + @Override + public JsonValue createNull() { + return nodeOrNullNode(null); + } + + @Override + public JsonValue createArray(Collection elements) { + JsonArrayBuilder builder = Json.createArrayBuilder(); + for(JsonValue element : elements) { + builder.add(useJsonNull(element)); + } + return builder.build(); + } + + @Override + public JsonValue createString(String str) { + return useJsonNull(Json.createValue(str)); + } + + @Override + public JsonValue createBoolean(boolean b) { + return b ? JsonValue.TRUE : JsonValue.FALSE; + } + + @Override + public JsonValue createObject(Map obj) { + JsonObjectBuilder builder = Json.createObjectBuilder(); + for (Map.Entry entry : obj.entrySet()) { + String key = textOnStringOrNull(entry.getKey()); + if (key != null) { + builder.add(key, useJsonNull(entry.getValue())); + } + } + return builder.build(); + } + + @Override + public JsonValue createNumber(double n) { + return Json.createValue(n); + } + + @Override + public JsonValue createNumber(long n) { + return Json.createValue(n); + } + + private JsonValue useJsonNull(JsonValue value) { return (value == null) ? JsonValue.NULL : value; } + + private JsonValue nodeOrNullNode(JsonValue node) { + if (node == null) { + return JsonValue.NULL; + } else { + return node; + } + } + + private String textOnStringOrNull(JsonValue value) { + if (value.getValueType() == STRING) { + return ((JsonString)value).getString(); + } else { + return null; + } + } +} diff --git a/jmespath-jakarta-jsonp/src/test/java/io/burt/jmespath/jakarta/jsonp/JsonpComplianceTest.java b/jmespath-jakarta-jsonp/src/test/java/io/burt/jmespath/jakarta/jsonp/JsonpComplianceTest.java new file mode 100644 index 0000000..88dd53d --- /dev/null +++ b/jmespath-jakarta-jsonp/src/test/java/io/burt/jmespath/jakarta/jsonp/JsonpComplianceTest.java @@ -0,0 +1,13 @@ +package io.burt.jmespath.jakarta.jsonp; + +import io.burt.jmespath.JmesPathComplianceTest; +import io.burt.jmespath.Adapter; + +import javax.json.JsonValue; + +public class JsonpComplianceTest extends JmesPathComplianceTest { + private Adapter runtime = new JsonpRuntime(); + + @Override + protected Adapter runtime() { return runtime; } +} diff --git a/jmespath-jakarta-jsonp/src/test/java/io/burt/jmespath/jakarta/jsonp/JsonpTest.java b/jmespath-jakarta-jsonp/src/test/java/io/burt/jmespath/jakarta/jsonp/JsonpTest.java new file mode 100644 index 0000000..987e1f7 --- /dev/null +++ b/jmespath-jakarta-jsonp/src/test/java/io/burt/jmespath/jakarta/jsonp/JsonpTest.java @@ -0,0 +1,12 @@ +package io.burt.jmespath.jakarta.jsonp; + +import io.burt.jmespath.Adapter; +import io.burt.jmespath.JmesPathRuntimeTest; +import io.burt.jmespath.RuntimeConfiguration; + +import javax.json.JsonValue; + +public class JsonpTest extends JmesPathRuntimeTest { + @Override + protected Adapter createRuntime(RuntimeConfiguration configuration) { return new JsonpRuntime(configuration); } +} diff --git a/pom.xml b/pom.xml index 1f1452d..05da4b1 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ 4.12 1.3 2.9.9 + 1.1.6 2.8.5 4.7.2 3.7.1 @@ -56,6 +57,7 @@ jmespath-core jmespath-jackson + jmespath-jakarta-jsonp jmespath-gson jmespath-vertx From 8c0e904bd3499449b01cc9407e0e73c0f9e54970 Mon Sep 17 00:00:00 2001 From: paulogaspar7 Date: Thu, 12 Sep 2019 17:29:47 +0100 Subject: [PATCH 2/3] Single class imports. --- .../jmespath/jakarta/jsonp/JsonpRuntime.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java b/jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java index e660736..0faaa77 100644 --- a/jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java +++ b/jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java @@ -1,13 +1,27 @@ package io.burt.jmespath.jakarta.jsonp; import java.io.StringReader; -import java.util.*; +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; import io.burt.jmespath.BaseRuntime; import io.burt.jmespath.JmesPathType; import io.burt.jmespath.RuntimeConfiguration; -import javax.json.*; +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonArrayBuilder; +import javax.json.JsonNumber; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; +import javax.json.JsonReaderFactory; +import javax.json.JsonString; +import javax.json.JsonValue; import javax.json.JsonValue.ValueType; import static javax.json.JsonValue.ValueType.ARRAY; From 752ecdbf1d3fafb5ce8c317a7fb1ab7726216197 Mon Sep 17 00:00:00 2001 From: paulogaspar7 Date: Tue, 17 Sep 2019 15:57:12 +0100 Subject: [PATCH 3/3] Code cleanup according to merge request comments. --- .../jmespath/jakarta/jsonp/JsonpRuntime.java | 36 +++++++------------ 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java b/jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java index 0faaa77..2daf601 100644 --- a/jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java +++ b/jmespath-jakarta-jsonp/src/main/java/io/burt/jmespath/jakarta/jsonp/JsonpRuntime.java @@ -74,11 +74,11 @@ public List toList(JsonValue value) { if (valueType == ARRAY) { return new JsonArrayListWrapper((JsonArray) value); } else if (valueType == OBJECT) { - JsonObject obj = (JsonObject)value; + JsonObject obj = (JsonObject) value; if (!obj.isEmpty()) { List elements = new ArrayList<>(obj.size()); for (JsonValue v : obj.values()) { - elements.add(useJsonNull(v)); + elements.add(nodeOrNullNode(v)); } return elements; } @@ -89,7 +89,7 @@ public List toList(JsonValue value) { @Override public String toString(JsonValue str) { if (str.getValueType() == STRING) { - return ((JsonString)str).getString(); + return ((JsonString) str).getString(); } else { return str.toString(); } @@ -97,7 +97,7 @@ public String toString(JsonValue str) { @Override public Number toNumber(JsonValue n) { - return (n.getValueType() == NUMBER) ? ((JsonNumber)n).numberValue() : null; + return (n.getValueType() == NUMBER) ? ((JsonNumber) n).numberValue() : null; } @Override @@ -110,11 +110,11 @@ public boolean isTruthy(JsonValue value) { case TRUE: return true; case ARRAY: - return ((JsonArray)value).size() > 0; + return ((JsonArray) value).size() > 0; case OBJECT: - return ((JsonObject)value).size() > 0; + return ((JsonObject) value).size() > 0; case STRING: - return ((JsonString)value).getString().length() > 0; + return ((JsonString) value).getString().length() > 0; default: throw new IllegalStateException(String.format("Unknown node type encountered: %s", value.getValueType())); } @@ -144,7 +144,7 @@ public JmesPathType typeOf(JsonValue value) { @Override public JsonValue getProperty(JsonValue value, JsonValue name) { if (value.getValueType() == OBJECT) { - return nodeOrNullNode(((JsonObject)value).get(textOnStringOrNull(name))); + return nodeOrNullNode(((JsonObject) value).get(toString(name))); } else { return JsonValue.NULL; } @@ -153,7 +153,7 @@ public JsonValue getProperty(JsonValue value, JsonValue name) { @Override public Collection getPropertyNames(JsonValue value) { if (value.getValueType() == OBJECT) { - Set nameSet = ((JsonObject)value).keySet(); + Set nameSet = ((JsonObject) value).keySet(); List names = new ArrayList<>(nameSet.size()); for(String n : nameSet) { names.add(createString(n)); @@ -173,14 +173,14 @@ public JsonValue createNull() { public JsonValue createArray(Collection elements) { JsonArrayBuilder builder = Json.createArrayBuilder(); for(JsonValue element : elements) { - builder.add(useJsonNull(element)); + builder.add(nodeOrNullNode(element)); } return builder.build(); } @Override public JsonValue createString(String str) { - return useJsonNull(Json.createValue(str)); + return nodeOrNullNode(Json.createValue(str)); } @Override @@ -192,9 +192,9 @@ public JsonValue createBoolean(boolean b) { public JsonValue createObject(Map obj) { JsonObjectBuilder builder = Json.createObjectBuilder(); for (Map.Entry entry : obj.entrySet()) { - String key = textOnStringOrNull(entry.getKey()); + String key = toString(entry.getKey()); if (key != null) { - builder.add(key, useJsonNull(entry.getValue())); + builder.add(key, nodeOrNullNode(entry.getValue())); } } return builder.build(); @@ -210,8 +210,6 @@ public JsonValue createNumber(long n) { return Json.createValue(n); } - private JsonValue useJsonNull(JsonValue value) { return (value == null) ? JsonValue.NULL : value; } - private JsonValue nodeOrNullNode(JsonValue node) { if (node == null) { return JsonValue.NULL; @@ -219,12 +217,4 @@ private JsonValue nodeOrNullNode(JsonValue node) { return node; } } - - private String textOnStringOrNull(JsonValue value) { - if (value.getValueType() == STRING) { - return ((JsonString)value).getString(); - } else { - return null; - } - } }