Skip to content

Commit 1ee882c

Browse files
Using jsonp instead of jackson in sniffer (#1118) (#1128)
* wip * wip * wip fixing tests * fix more tests * all tests working * checkstyle Co-authored-by: Laura Trotta <153528055+l-trotta@users.noreply.github.com>
1 parent 2d91ea0 commit 1ee882c

4 files changed

Lines changed: 103 additions & 99 deletions

File tree

rest5-client/build.gradle.kts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,6 @@ signing {
138138
}
139139

140140
dependencies {
141-
val jacksonVersion = "2.18.3"
142-
143141
// Apache 2.0
144142
// https://hc.apache.org/httpcomponents-client-ga/
145143
api("org.apache.httpcomponents.client5","httpclient5","5.4.4")
@@ -151,9 +149,9 @@ dependencies {
151149
testImplementation("org.apache.commons:commons-lang3:3.14.0")
152150
testImplementation("junit:junit:4.13.2")
153151

154-
// Apache 2.0
155-
// https://github.com/FasterXML/jackson
156-
implementation("com.fasterxml.jackson.core", "jackson-core", jacksonVersion)
152+
// EPL-2.0
153+
// https://github.com/eclipse-ee4j/parsson
154+
implementation("org.eclipse.parsson:jakarta.json:1.1.7")
157155

158156
// // Apache-2.0
159157
// testImplementation("commons-io:commons-io:2.17.0")

rest5-client/src/main/java/co/elastic/clients/transport/rest5_client/low_level/sniffer/ElasticsearchNodesSniffer.java

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919

2020
package co.elastic.clients.transport.rest5_client.low_level.sniffer;
2121

22-
import com.fasterxml.jackson.core.JsonFactory;
23-
import com.fasterxml.jackson.core.JsonParser;
24-
import com.fasterxml.jackson.core.JsonToken;
2522

23+
import jakarta.json.Json;
24+
import jakarta.json.stream.JsonParser;
25+
import jakarta.json.stream.JsonParserFactory;
2626
import org.apache.commons.logging.Log;
2727
import org.apache.commons.logging.LogFactory;
2828
import org.apache.hc.core5.http.HttpEntity;
@@ -63,7 +63,7 @@ public final class ElasticsearchNodesSniffer implements NodesSniffer {
6363
private final Rest5Client restClient;
6464
private final Request request;
6565
private final Scheme scheme;
66-
private final JsonFactory jsonFactory = new JsonFactory();
66+
private final JsonParserFactory jsonFactory = Json.createParserFactory(Map.of());
6767

6868
/**
6969
* Creates a new instance of the Elasticsearch sniffer. It will use the provided {@link Rest5Client} to fetch the hosts,
@@ -107,29 +107,28 @@ public List<Node> sniff() throws IOException {
107107
return readHosts(response.getEntity(), scheme, jsonFactory);
108108
}
109109

110-
static List<Node> readHosts(HttpEntity entity, Scheme scheme, JsonFactory jsonFactory) throws IOException {
110+
static List<Node> readHosts(HttpEntity entity, Scheme scheme, JsonParserFactory jsonFactory) throws IOException {
111111
try (InputStream inputStream = entity.getContent()) {
112112
JsonParser parser = jsonFactory.createParser(inputStream);
113-
if (parser.nextToken() != JsonToken.START_OBJECT) {
113+
if (parser.next() != JsonParser.Event.START_OBJECT) {
114114
throw new IOException("expected data to start with an object");
115115
}
116116
List<Node> nodes = new ArrayList<>();
117-
while (parser.nextToken() != JsonToken.END_OBJECT) {
118-
if (parser.getCurrentToken() == JsonToken.START_OBJECT) {
119-
if ("nodes".equals(parser.getCurrentName())) {
120-
while (parser.nextToken() != JsonToken.END_OBJECT) {
121-
JsonToken token = parser.nextToken();
122-
assert token == JsonToken.START_OBJECT;
123-
String nodeId = parser.getCurrentName();
117+
while (parser.next() != JsonParser.Event.END_OBJECT) {
118+
if (parser.currentEvent() == JsonParser.Event.KEY_NAME && "nodes".equals(parser.getString())) {
119+
parser.next(); // from KEY_NAME to START_OBJECT nodes
120+
assert parser.currentEvent() == JsonParser.Event.START_OBJECT;
121+
while (parser.next() != JsonParser.Event.END_OBJECT) {
122+
String nodeId = parser.getString();
124123
Node node = readNode(nodeId, parser, scheme);
125124
if (node != null) {
126125
nodes.add(node);
127126
}
128127
}
129-
} else {
130-
parser.skipChildren();
131128
}
132-
}
129+
else if (parser.currentEvent() == JsonParser.Event.START_OBJECT) {
130+
parser.skipObject();
131+
}
133132
}
134133
return nodes;
135134
}
@@ -157,14 +156,15 @@ private static Node readNode(String nodeId, JsonParser parser, Scheme scheme) th
157156
final Set<String> roles = new TreeSet<>();
158157

159158
String fieldName = null;
160-
while (parser.nextToken() != JsonToken.END_OBJECT) {
161-
if (parser.getCurrentToken() == JsonToken.FIELD_NAME) {
162-
fieldName = parser.getCurrentName();
163-
} else if (parser.getCurrentToken() == JsonToken.START_OBJECT) {
159+
while (parser.next() != JsonParser.Event.END_OBJECT) {
160+
if (parser.currentEvent() == JsonParser.Event.KEY_NAME) {
161+
fieldName = parser.getString();
162+
} else if (parser.currentEvent() == JsonParser.Event.START_OBJECT) {
164163
if ("http".equals(fieldName)) {
165-
while (parser.nextToken() != JsonToken.END_OBJECT) {
166-
if (parser.getCurrentToken() == JsonToken.VALUE_STRING && "publish_address".equals(parser.getCurrentName())) {
167-
String address = parser.getValueAsString();
164+
while (parser.next() != JsonParser.Event.END_OBJECT) {
165+
if (parser.currentEvent() == JsonParser.Event.KEY_NAME && "publish_address".equals(parser.getString())) {
166+
parser.next(); // from KEY_NAME to VALUE_STRING
167+
String address = parser.getString();
168168
String host;
169169
URI publishAddressAsURI;
170170

@@ -178,45 +178,49 @@ private static Node readNode(String nodeId, JsonParser parser, Scheme scheme) th
178178
host = publishAddressAsURI.getHost();
179179
}
180180
publishedHost = new HttpHost(publishAddressAsURI.getScheme(), host, publishAddressAsURI.getPort());
181-
} else if (parser.currentToken() == JsonToken.START_ARRAY && "bound_address".equals(parser.getCurrentName())) {
182-
while (parser.nextToken() != JsonToken.END_ARRAY) {
183-
URI boundAddressAsURI = URI.create(scheme + "://" + parser.getValueAsString());
181+
} else if (parser.currentEvent() == JsonParser.Event.KEY_NAME && "bound_address".equals(parser.getString())) {
182+
parser.next(); // from KEY_NAME to START_ARRAY
183+
assert parser.currentEvent() == JsonParser.Event.START_ARRAY;
184+
while (parser.next() != JsonParser.Event.END_ARRAY) {
185+
URI boundAddressAsURI = URI.create(scheme + "://" + parser.getString());
184186
boundHosts.add(
185187
new HttpHost(boundAddressAsURI.getScheme(), boundAddressAsURI.getHost(), boundAddressAsURI.getPort())
186188
);
187189
}
188-
} else if (parser.getCurrentToken() == JsonToken.START_OBJECT) {
189-
parser.skipChildren();
190+
} else if (parser.currentEvent() == JsonParser.Event.START_OBJECT) {
191+
parser.skipObject();
190192
}
191193
}
192194
} else if ("attributes".equals(fieldName)) {
193-
while (parser.nextToken() != JsonToken.END_OBJECT) {
194-
if (parser.getCurrentToken() == JsonToken.VALUE_STRING) {
195-
String oldValue = protoAttributes.put(parser.getCurrentName(), parser.getValueAsString());
195+
while (parser.next() != JsonParser.Event.END_OBJECT) {
196+
if (parser.currentEvent() == JsonParser.Event.KEY_NAME) {
197+
String key = parser.getString();
198+
parser.next(); // from KEY_NAME to VALUE_STRING
199+
String value = parser.getString();
200+
String oldValue = protoAttributes.put(key, value);
196201
if (oldValue != null) {
197-
throw new IOException("repeated attribute key [" + parser.getCurrentName() + "]");
202+
throw new IOException("repeated attribute key [" + parser.currentEvent().name() + "]");
198203
}
199-
} else {
200-
parser.skipChildren();
201204
}
202205
}
203-
} else {
204-
parser.skipChildren();
205206
}
206-
} else if (parser.currentToken() == JsonToken.START_ARRAY) {
207+
else if (fieldName != null) { // it's an unknown object that needs to be skipped
208+
parser.skipObject();
209+
}
210+
} else if (parser.currentEvent() == JsonParser.Event.START_ARRAY) {
207211
if ("roles".equals(fieldName)) {
208212
sawRoles = true;
209-
while (parser.nextToken() != JsonToken.END_ARRAY) {
210-
roles.add(parser.getText());
213+
while (parser.next() != JsonParser.Event.END_ARRAY) {
214+
roles.add(parser.getString());
211215
}
212216
} else {
213-
parser.skipChildren();
217+
parser.skipArray();
214218
}
215-
} else if (parser.currentToken().isScalarValue()) {
219+
} else if (parser.currentEvent().name().equals(JsonParser.Event.VALUE_STRING.name())) {
216220
if ("version".equals(fieldName)) {
217-
version = parser.getText();
221+
version = parser.getString();
218222
} else if ("name".equals(fieldName)) {
219-
name = parser.getText();
223+
name = parser.getString();
220224
}
221225
}
222226
}

rest5-client/src/test/java/co/elastic/clients/transport/rest5_client/low_level/sniffer/ElasticsearchNodesSnifferParseTests.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import co.elastic.clients.transport.rest5_client.low_level.Node;
2323
import co.elastic.clients.transport.rest5_client.low_level.RestClientTestCase;
24-
import com.fasterxml.jackson.core.JsonFactory;
24+
import jakarta.json.Json;
2525
import org.apache.hc.core5.http.ContentType;
2626
import org.apache.hc.core5.http.HttpEntity;
2727
import org.apache.hc.core5.http.HttpHost;
@@ -56,7 +56,8 @@ private void checkFile(String file, Node... expected) throws IOException {
5656
}
5757
try {
5858
HttpEntity entity = new InputStreamEntity(in, ContentType.APPLICATION_JSON);
59-
List<Node> nodes = ElasticsearchNodesSniffer.readHosts(entity, ElasticsearchNodesSniffer.Scheme.HTTP, new JsonFactory());
59+
List<Node> nodes = ElasticsearchNodesSniffer.readHosts(entity,
60+
ElasticsearchNodesSniffer.Scheme.HTTP, Json.createParserFactory(Map.of()));
6061
/*
6162
* Use these assertions because the error messages are nicer
6263
* than hasItems and we know the results are in order because
@@ -136,7 +137,8 @@ public void testParsingPublishAddressWithPreES7Format() throws IOException {
136137
InputStream in = this.getClass().getResourceAsStream("es6_nodes_publication_address_format.json");
137138

138139
HttpEntity entity = new InputStreamEntity(in, ContentType.APPLICATION_JSON);
139-
List<Node> nodes = ElasticsearchNodesSniffer.readHosts(entity, ElasticsearchNodesSniffer.Scheme.HTTP, new JsonFactory());
140+
List<Node> nodes = ElasticsearchNodesSniffer.readHosts(entity,
141+
ElasticsearchNodesSniffer.Scheme.HTTP, Json.createParserFactory(Map.of()));
140142

141143
assertEquals("127.0.0.1", nodes.get(0).getHost().getHostName());
142144
assertEquals(9200, nodes.get(0).getHost().getPort());
@@ -148,7 +150,8 @@ public void testParsingPublishAddressWithES7Format() throws IOException {
148150
InputStream in = this.getClass().getResourceAsStream("es7_nodes_publication_address_format.json");
149151

150152
HttpEntity entity = new InputStreamEntity(in, ContentType.APPLICATION_JSON);
151-
List<Node> nodes = ElasticsearchNodesSniffer.readHosts(entity, ElasticsearchNodesSniffer.Scheme.HTTP, new JsonFactory());
153+
List<Node> nodes = ElasticsearchNodesSniffer.readHosts(entity,
154+
ElasticsearchNodesSniffer.Scheme.HTTP, Json.createParserFactory(Map.of()));
152155

153156
assertEquals("elastic.test", nodes.get(0).getHost().getHostName());
154157
assertEquals(9200, nodes.get(0).getHost().getPort());

0 commit comments

Comments
 (0)