Skip to content

Commit 788ab54

Browse files
committed
Add support for variants, refactorings to improve DX
- Add runtime support for variants (wrapping key decoding, property lookahead) - Simplify transport API and remove dependency on LLRC for request options - Add JsonpDeserializable annotation - Lenient parsing of strings, numbers and arrays - Add tests
1 parent 4b661e0 commit 788ab54

File tree

2,183 files changed

+64675
-29364
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,183 files changed

+64675
-29364
lines changed

java-client/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ dependencies {
135135
compileOnly("com.fasterxml.jackson.core", "jackson-databind", jacksonVersion)
136136
testImplementation("com.fasterxml.jackson.core", "jackson-core", jacksonVersion)
137137
testImplementation("com.fasterxml.jackson.core", "jackson-databind", jacksonVersion)
138+
testImplementation("io.github.classgraph:classgraph:4.8.116")
138139

139140
// EPL-2.0 OR BSD-3-Clause
140141
// https://eclipse-ee4j.github.io/yasson/

java-client/src/main/java/co/elastic/clients/base/AdditionalProperties.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,20 @@
2020
package co.elastic.clients.base;
2121

2222
import co.elastic.clients.json.DelegatingDeserializer;
23-
import co.elastic.clients.json.ObjectDeserializer;
23+
import co.elastic.clients.json.JsonpDeserializer;
2424
import co.elastic.clients.json.JsonpMapper;
25+
import co.elastic.clients.json.JsonpSerializable;
2526
import co.elastic.clients.json.JsonpSerializer;
2627
import co.elastic.clients.json.JsonpUtils;
27-
import co.elastic.clients.json.JsonpDeserializer;
28-
import co.elastic.clients.json.ToJsonp;
28+
import co.elastic.clients.json.ObjectDeserializer;
29+
import jakarta.json.stream.JsonGenerator;
2930

3031
import javax.annotation.Nullable;
31-
import jakarta.json.stream.JsonGenerator;
3232
import java.util.Collections;
3333
import java.util.HashMap;
3434
import java.util.Map;
3535

36-
public abstract class AdditionalProperties<TKey, TValue> implements ToJsonp {
36+
public abstract class AdditionalProperties<TKey, TValue> implements JsonpSerializable {
3737
private final Map<String, TValue> value;
3838

3939
@Nullable
@@ -62,7 +62,7 @@ public Map<String, TValue> value() {
6262
/**
6363
* Serialize this value to JSON.
6464
*/
65-
public void toJsonp(JsonGenerator generator, JsonpMapper mapper) {
65+
public void serialize(JsonGenerator generator, JsonpMapper mapper) {
6666
generator.writeStartObject();
6767
this.toJsonpInternal(generator, mapper);
6868
generator.writeEnd();

java-client/src/main/java/co/elastic/clients/base/ApiClient.java

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,33 +20,27 @@
2020
package co.elastic.clients.base;
2121

2222
import co.elastic.clients.json.JsonpDeserializer;
23-
import org.elasticsearch.client.RequestOptions;
23+
import co.elastic.clients.json.JsonpMapperBase;
2424

25-
import javax.annotation.Nullable;
26-
27-
public abstract class ApiClient<Self extends ApiClient<Self>> {
25+
public abstract class ApiClient {
2826

2927
protected final Transport transport;
3028

31-
@Nullable
32-
protected final RequestOptions requestOptions;
33-
34-
protected ApiClient(Transport transport, @Nullable RequestOptions requestOptions) {
29+
protected ApiClient(Transport transport) {
3530
this.transport = transport;
36-
this.requestOptions = requestOptions;
3731
}
3832

39-
/**
40-
* Creates a new client with some request options
41-
*/
42-
public abstract Self withRequestOptions(@Nullable RequestOptions requestOptions);
33+
protected <T> JsonpDeserializer<T> getDeserializer(Class<T> clazz) {
34+
// Try the built-in deserializers first to avoid repeated lookups in the Jsonp mapper for client-defined classes
35+
JsonpDeserializer<T> result = JsonpMapperBase.findDeserializer(clazz);
36+
if (result != null) {
37+
return result;
38+
}
4339

44-
@Nullable
45-
public final RequestOptions requestOptions() {
46-
return this.requestOptions;
40+
return JsonpDeserializer.of(clazz);
4741
}
4842

49-
protected <T> JsonpDeserializer<T> getDeserializer(Class<T> clazz) {
50-
return transport.jsonpMapper().getDeserializer(clazz);
43+
public Transport _transport() {
44+
return this.transport;
5145
}
5246
}

java-client/src/main/java/co/elastic/clients/base/ElasticsearchError.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919

2020
package co.elastic.clients.base;
2121

22-
import co.elastic.clients.json.ObjectDeserializer;
2322
import co.elastic.clients.json.JsonpDeserializer;
23+
import co.elastic.clients.json.ObjectDeserializer;
2424

2525
public class ElasticsearchError {
2626

java-client/src/main/java/co/elastic/clients/base/RestClientTransport.java

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
1919

2020
package co.elastic.clients.base;
2121

22-
import co.elastic.clients.json.JsonpMapper;
2322
import co.elastic.clients.json.JsonpDeserializer;
24-
import co.elastic.clients.json.ToJsonp;
23+
import co.elastic.clients.json.JsonpMapper;
24+
import co.elastic.clients.json.JsonpSerializable;
25+
import jakarta.json.stream.JsonGenerator;
26+
import jakarta.json.stream.JsonParser;
2527
import org.apache.http.entity.ByteArrayEntity;
2628
import org.apache.http.entity.ContentType;
2729
import org.elasticsearch.client.Cancellable;
@@ -30,23 +32,50 @@
3032
import org.elasticsearch.client.ResponseListener;
3133
import org.elasticsearch.client.RestClient;
3234

33-
import jakarta.json.stream.JsonGenerator;
34-
import jakarta.json.stream.JsonParser;
35+
import javax.annotation.Nullable;
3536
import java.io.ByteArrayInputStream;
3637
import java.io.ByteArrayOutputStream;
3738
import java.io.IOException;
3839
import java.io.InputStream;
3940
import java.util.Map;
4041
import java.util.concurrent.CompletableFuture;
42+
import java.util.function.Function;
4143

4244
public class RestClientTransport implements Transport {
4345

4446
private final RestClient restClient;
4547
private final JsonpMapper mapper;
48+
private RequestOptions requestOptions;
4649

47-
public RestClientTransport(RestClient restClient, JsonpMapper mapper) {
50+
public RestClientTransport(RestClient restClient, JsonpMapper mapper, @Nullable RequestOptions options) {
4851
this.restClient = restClient;
4952
this.mapper = mapper;
53+
this.requestOptions = options;
54+
}
55+
56+
public RestClientTransport(RestClient restClient, JsonpMapper mapper) {
57+
this(restClient, mapper, null);
58+
}
59+
60+
/**
61+
* Creates a new {@link #RestClientTransport} with specific request options.
62+
*/
63+
public RestClientTransport withRequestOptions(@Nullable RequestOptions options) {
64+
return new RestClientTransport(this.restClient, this.mapper, options);
65+
}
66+
67+
/**
68+
* Creates a new {@link #RestClientTransport} with specific request options, inheriting existing options.
69+
*
70+
* @param fn a function taking an options builder initialized with the current request options, or initialized
71+
* with default values.
72+
*/
73+
public RestClientTransport withRequestOptions(Function<RequestOptions.Builder, RequestOptions.Builder> fn) {
74+
RequestOptions.Builder builder = requestOptions == null ?
75+
RequestOptions.DEFAULT.toBuilder() :
76+
requestOptions.toBuilder();
77+
78+
return withRequestOptions(fn.apply(builder).build());
5079
}
5180

5281
@Override
@@ -56,21 +85,19 @@ public JsonpMapper jsonpMapper() {
5685

5786
public <RequestT, ResponseT, ErrorT> ResponseT performRequest(
5887
RequestT request,
59-
Endpoint<RequestT, ResponseT, ErrorT> endpoint,
60-
RequestOptions options
88+
Endpoint<RequestT, ResponseT, ErrorT> endpoint
6189
) throws IOException {
6290

63-
org.elasticsearch.client.Request clientReq = prepareLowLevelRequest(request, endpoint, options);
91+
org.elasticsearch.client.Request clientReq = prepareLowLevelRequest(request, endpoint);
6492
org.elasticsearch.client.Response clientResp = restClient.performRequest(clientReq);
6593
return getHighLevelResponse(clientResp, endpoint);
6694
}
6795

6896
public <RequestT, ResponseT, ErrorT> CompletableFuture<ResponseT> performRequestAsync(
6997
RequestT request,
70-
Endpoint<RequestT, ResponseT, ErrorT> endpoint,
71-
RequestOptions options
98+
Endpoint<RequestT, ResponseT, ErrorT> endpoint
7299
) {
73-
org.elasticsearch.client.Request clientReq = prepareLowLevelRequest(request, endpoint, options);
100+
org.elasticsearch.client.Request clientReq = prepareLowLevelRequest(request, endpoint);
74101

75102
RequestFuture<ResponseT> future = new RequestFuture<>();
76103

@@ -109,24 +136,22 @@ public boolean cancel(boolean mayInterruptIfRunning) {
109136

110137
private <RequestT> org.elasticsearch.client.Request prepareLowLevelRequest(
111138
RequestT request,
112-
Endpoint<RequestT, ?, ?> endpoint,
113-
RequestOptions options
114-
) {
139+
Endpoint<RequestT, ?, ?> endpoint) {
115140
String method = endpoint.method(request);
116141
String path = endpoint.requestUrl(request);
117142
Map<String, String> params = endpoint.queryParameters(request);
118143

119144
org.elasticsearch.client.Request clientReq = new org.elasticsearch.client.Request(method, path);
120145
clientReq.addParameters(params);
121-
if (options != null) {
122-
clientReq.setOptions(options);
146+
if (requestOptions != null) {
147+
clientReq.setOptions(requestOptions);
123148
}
124149

125150
if (endpoint.hasRequestBody()) {
126-
// Request has a body and must implement ToJsonp
151+
// Request has a body and must implement JsonpSerializable
127152
ByteArrayOutputStream baos = new ByteArrayOutputStream();
128-
JsonGenerator generator = mapper.jsonpProvider().createGenerator(baos);
129-
((ToJsonp) request).toJsonp(generator, mapper);
153+
JsonGenerator generator = mapper.jsonProvider().createGenerator(baos);
154+
((JsonpSerializable) request).serialize(generator, mapper);
130155
generator.close();
131156

132157
clientReq.setEntity(new ByteArrayEntity(baos.toByteArray(), ContentType.APPLICATION_JSON));
@@ -150,7 +175,7 @@ private <ResponseT, ErrorT> ResponseT getHighLevelResponse(
150175
// Expecting a body
151176
ByteArrayOutputStream baos = new ByteArrayOutputStream();
152177
clientResp.getEntity().writeTo(baos);
153-
JsonParser parser = mapper.jsonpProvider().createParser(new ByteArrayInputStream(baos.toByteArray()));
178+
JsonParser parser = mapper.jsonProvider().createParser(new ByteArrayInputStream(baos.toByteArray()));
154179
error = errorParser.deserialize(parser, mapper);
155180
}
156181

@@ -171,7 +196,7 @@ private <ResponseT, ErrorT> ResponseT getHighLevelResponse(
171196
if (responseParser != null) {
172197
// Expecting a body
173198
InputStream content = clientResp.getEntity().getContent();
174-
JsonParser parser = mapper.jsonpProvider().createParser(content);
199+
JsonParser parser = mapper.jsonProvider().createParser(content);
175200
response = responseParser.deserialize(parser, mapper);
176201
}
177202
return response;

java-client/src/main/java/co/elastic/clients/base/Transport.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
package co.elastic.clients.base;
2121

2222
import co.elastic.clients.json.JsonpMapper;
23-
import org.elasticsearch.client.RequestOptions;
2423

2524
import java.io.IOException;
2625
import java.util.concurrent.CompletableFuture;
@@ -32,14 +31,12 @@ public interface Transport {
3231

3332
<RequestT, ResponseT, ErrorT> ResponseT performRequest(
3433
RequestT request,
35-
Endpoint<RequestT, ResponseT, ErrorT> endpoint,
36-
RequestOptions options
34+
Endpoint<RequestT, ResponseT, ErrorT> endpoint
3735
) throws IOException;
3836

3937
<RequestT, ResponseT, ErrorT> CompletableFuture<ResponseT> performRequestAsync(
4038
RequestT request,
41-
Endpoint<RequestT, ResponseT, ErrorT> endpoint,
42-
RequestOptions options
39+
Endpoint<RequestT, ResponseT, ErrorT> endpoint
4340
);
4441

4542
JsonpMapper jsonpMapper();

0 commit comments

Comments
 (0)