Skip to content
This repository was archived by the owner on Oct 31, 2024. It is now read-only.

Commit f97047b

Browse files
authored
Merge pull request #78 from jeromevdl/feat/jackson-jr-implementation
Feat: jackson jr implementation
2 parents 2e4af85 + 451db7e commit f97047b

File tree

4 files changed

+298
-0
lines changed

4 files changed

+298
-0
lines changed

jmespath-jackson-jr/pom.xml

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<artifactId>jmespath-jackson-jr</artifactId>
8+
<name>JMESPath Jackson jr</name>
9+
<description>A JMESPath implementation for Java</description>
10+
11+
<parent>
12+
<groupId>io.burt</groupId>
13+
<artifactId>jmespath</artifactId>
14+
<version>0.5.2-SNAPSHOT</version>
15+
</parent>
16+
17+
<dependencies>
18+
<dependency>
19+
<groupId>${project.groupId}</groupId>
20+
<artifactId>jmespath-core</artifactId>
21+
<version>${project.parent.version}</version>
22+
</dependency>
23+
<dependency>
24+
<groupId>${project.groupId}</groupId>
25+
<artifactId>jmespath-core</artifactId>
26+
<version>${project.parent.version}</version>
27+
<type>test-jar</type>
28+
<scope>test</scope>
29+
</dependency>
30+
<dependency>
31+
<groupId>com.fasterxml.jackson.jr</groupId>
32+
<artifactId>jackson-jr-objects</artifactId>
33+
<version>2.14.2</version>
34+
</dependency>
35+
<dependency>
36+
<groupId>com.fasterxml.jackson.jr</groupId>
37+
<artifactId>jackson-jr-stree</artifactId>
38+
<version>2.14.2</version>
39+
</dependency>
40+
</dependencies>
41+
42+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
package io.burt.jmespath.jacksonjr;
2+
3+
import com.fasterxml.jackson.core.JsonToken;
4+
import com.fasterxml.jackson.jr.ob.JSON;
5+
import com.fasterxml.jackson.jr.stree.JacksonJrsTreeCodec;
6+
import com.fasterxml.jackson.jr.stree.JrsArray;
7+
import com.fasterxml.jackson.jr.stree.JrsBoolean;
8+
import com.fasterxml.jackson.jr.stree.JrsNull;
9+
import com.fasterxml.jackson.jr.stree.JrsNumber;
10+
import com.fasterxml.jackson.jr.stree.JrsObject;
11+
import com.fasterxml.jackson.jr.stree.JrsString;
12+
import com.fasterxml.jackson.jr.stree.JrsValue;
13+
import io.burt.jmespath.BaseRuntime;
14+
import io.burt.jmespath.JmesPathType;
15+
import io.burt.jmespath.RuntimeConfiguration;
16+
import java.io.IOException;
17+
import java.io.UncheckedIOException;
18+
import java.util.AbstractList;
19+
import java.util.ArrayList;
20+
import java.util.Collection;
21+
import java.util.Collections;
22+
import java.util.HashMap;
23+
import java.util.Iterator;
24+
import java.util.List;
25+
import java.util.Map;
26+
27+
public class JacksonJrRuntime extends BaseRuntime<JrsValue> {
28+
private final JSON json;
29+
30+
public JacksonJrRuntime() {
31+
this(RuntimeConfiguration.defaultConfiguration());
32+
}
33+
34+
public JacksonJrRuntime(RuntimeConfiguration configuration) {
35+
this(configuration, JSON.builder()
36+
.treeCodec(new JacksonJrsTreeCodec())
37+
.build());
38+
}
39+
40+
public JacksonJrRuntime(RuntimeConfiguration configuration, JSON json) {
41+
super(configuration);
42+
this.json = json;
43+
}
44+
45+
@Override
46+
public JrsValue parseString(String str) {
47+
try {
48+
return json.treeFrom(str);
49+
} catch (IOException e) {
50+
throw new IllegalStateException(e);
51+
}
52+
}
53+
54+
private static class JrsArrayListWrapper extends AbstractList<JrsValue> {
55+
private final JrsArray array;
56+
57+
JrsArrayListWrapper(JrsArray array) {
58+
this.array = array;
59+
}
60+
61+
@Override
62+
public JrsValue get(int index) {
63+
return array.get(index);
64+
}
65+
66+
@Override
67+
public int size() {
68+
return array.size();
69+
}
70+
}
71+
72+
@Override
73+
public List<JrsValue> toList(JrsValue value) {
74+
if (value == null) {
75+
return Collections.emptyList();
76+
} else if (value.isArray()) {
77+
return new JrsArrayListWrapper((JrsArray) value);
78+
} else if (value.isObject()) {
79+
JrsObject object = (JrsObject) value;
80+
List<JrsValue> list = new ArrayList<>(object.size());
81+
Iterator<Map.Entry<String, JrsValue>> iterator = object.fields();
82+
83+
while (iterator.hasNext()) {
84+
Map.Entry<String, JrsValue> entry = iterator.next();
85+
list.add(entry.getValue());
86+
}
87+
return list;
88+
} else {
89+
return Collections.emptyList();
90+
}
91+
}
92+
93+
@Override
94+
public String toString(JrsValue value) {
95+
if (JsonToken.VALUE_STRING.equals(value.asToken())) {
96+
return value.asText();
97+
} else {
98+
try {
99+
return json.asString(value);
100+
} catch (IOException e) {
101+
throw new UncheckedIOException(e);
102+
}
103+
}
104+
}
105+
106+
@Override
107+
public Number toNumber(JrsValue value) {
108+
if (value.isValueNode() && value.isNumber()) {
109+
JrsNumber number = (JrsNumber) value;
110+
return number.getValue();
111+
} else {
112+
return null;
113+
}
114+
}
115+
116+
@Override
117+
public boolean isTruthy(JrsValue value) {
118+
if (value.isContainerNode()) {
119+
return value.size() > 0;
120+
} else if (value.isValueNode()) {
121+
switch (value.asToken()) {
122+
case VALUE_STRING:
123+
return !value.asText().isEmpty();
124+
case VALUE_FALSE:
125+
case VALUE_NULL:
126+
return false;
127+
default:
128+
return true;
129+
}
130+
} else {
131+
return !value.isMissingNode();
132+
}
133+
}
134+
135+
@Override
136+
public JmesPathType typeOf(JrsValue value) {
137+
switch (value.asToken()) {
138+
case START_ARRAY:
139+
return JmesPathType.ARRAY;
140+
case VALUE_EMBEDDED_OBJECT:
141+
case START_OBJECT:
142+
return JmesPathType.OBJECT;
143+
case VALUE_STRING:
144+
return JmesPathType.STRING;
145+
case VALUE_NUMBER_INT:
146+
case VALUE_NUMBER_FLOAT:
147+
return JmesPathType.NUMBER;
148+
case VALUE_TRUE:
149+
case VALUE_FALSE:
150+
return JmesPathType.BOOLEAN;
151+
case VALUE_NULL:
152+
return JmesPathType.NULL;
153+
case NOT_AVAILABLE:
154+
default:
155+
throw new IllegalStateException(String.format("Unknown node type encountered: %s", value.asToken()));
156+
}
157+
}
158+
159+
@Override
160+
public JrsValue getProperty(JrsValue value, JrsValue name) {
161+
if (JsonToken.VALUE_NULL.equals(value.asToken())) {
162+
return JrsNull.instance();
163+
} else {
164+
JrsValue node = value.get(name.asText());
165+
return node != null ? node : createNull();
166+
}
167+
}
168+
169+
@Override
170+
public Collection<JrsValue> getPropertyNames(JrsValue value) {
171+
if (value.isObject()) {
172+
List<JrsValue> names = new ArrayList<>(value.size());
173+
Iterator<String> fieldNames = value.fieldNames();
174+
while (fieldNames.hasNext()) {
175+
names.add(createString(fieldNames.next()));
176+
}
177+
return names;
178+
} else {
179+
return Collections.emptyList();
180+
}
181+
}
182+
183+
@Override
184+
public JrsValue createNull() {
185+
return JrsNull.instance();
186+
}
187+
188+
@Override
189+
public JrsValue createArray(Collection<JrsValue> elements) {
190+
List<JrsValue> values = new ArrayList<>();
191+
for (JrsValue node: elements) {
192+
if (node == null) {
193+
values.add(JrsNull.instance());
194+
} else {
195+
values.add(node);
196+
}
197+
}
198+
return new JrsArray(values);
199+
200+
}
201+
202+
@Override
203+
public JrsValue createString(String str) {
204+
return new JrsString(str);
205+
}
206+
207+
@Override
208+
public JrsValue createBoolean(boolean b) {
209+
return b ? JrsBoolean.TRUE : JrsBoolean.FALSE;
210+
}
211+
212+
@Override
213+
public JrsValue createObject(Map<JrsValue, JrsValue> obj) {
214+
Map<String, JrsValue> values = new HashMap<>();
215+
for (Map.Entry<JrsValue, JrsValue> entry : obj.entrySet()) {
216+
values.put(entry.getKey().asText(), entry.getValue());
217+
}
218+
return new JrsObject(values);
219+
}
220+
221+
@Override
222+
public JrsValue createNumber(double n) {
223+
return new JrsNumber(n);
224+
}
225+
226+
@Override
227+
public JrsValue createNumber(long n) {
228+
return new JrsNumber(n);
229+
}
230+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.burt.jmespath.jacksonjr;
2+
3+
import com.fasterxml.jackson.jr.stree.JrsValue;
4+
import io.burt.jmespath.Adapter;
5+
import io.burt.jmespath.JmesPathComplianceTest;
6+
7+
public class JacksonJrComplianceTest extends JmesPathComplianceTest<JrsValue> {
8+
private Adapter<JrsValue> runtime = new JacksonJrRuntime();
9+
10+
@Override
11+
protected Adapter<JrsValue> runtime() { return runtime; }
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.burt.jmespath.jacksonjr;
2+
3+
4+
import com.fasterxml.jackson.jr.stree.JrsValue;
5+
import io.burt.jmespath.Adapter;
6+
import io.burt.jmespath.JmesPathRuntimeTest;
7+
import io.burt.jmespath.RuntimeConfiguration;
8+
9+
public class JacksonJrTest extends JmesPathRuntimeTest<JrsValue> {
10+
@Override
11+
protected Adapter<JrsValue> createRuntime(RuntimeConfiguration configuration) {
12+
return new JacksonJrRuntime(configuration);
13+
}
14+
}

0 commit comments

Comments
 (0)