From 94a080e01d28642c8908977a7591bba61dae8c7a Mon Sep 17 00:00:00 2001 From: Jai2305 Date: Tue, 20 Aug 2024 16:37:46 +0530 Subject: [PATCH] support for withJson-618 Signed-off-by: Jai2305 --- CHANGELOG.md | 1 + .../client/json/PlainDeserializable.java | 54 +++++++++++++++++++ .../client/opensearch/core/ScrollRequest.java | 14 ++--- .../client/opensearch/core/SearchRequest.java | 33 ++++-------- .../core/SearchTemplateRequest.java | 21 +++----- .../indices/CreateIndexRequest.java | 14 ++--- .../indices/PutIndexTemplateRequest.java | 15 +++--- .../json/PlainDeserializableTest.java | 42 +++++++++++++++ 8 files changed, 135 insertions(+), 59 deletions(-) create mode 100644 java-client/src/main/java/org/opensearch/client/json/PlainDeserializable.java create mode 100644 java-client/src/test/java/org/opensearch/client/opensearch/json/PlainDeserializableTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index bbae3767c..0fcfdac35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,7 @@ This section is for maintaining a changelog for all breaking changes for the cli - Added support for the `parent` aggregation type ([#706](https://github.com/opensearch-project/opensearch-java/pull/706)) - Added support for phase_took & search_pipeline request params ([#1036](https://github.com/opensearch-project/opensearch-java/pull/1036)) - Added an interface PlainJsonSerializable with a default method for serialization to Json ([#1064](https://github.com/opensearch-project/opensearch-java/pull/1064)) +- Added an interface PlainDeserializable with withJson method for deserialization ([#1148](https://github.com/opensearch-project/opensearch-java/pull/1148)) ### Dependencies - Bumps `io.github.classgraph:classgraph` from 4.8.173 to 4.8.174 diff --git a/java-client/src/main/java/org/opensearch/client/json/PlainDeserializable.java b/java-client/src/main/java/org/opensearch/client/json/PlainDeserializable.java new file mode 100644 index 000000000..29aff9703 --- /dev/null +++ b/java-client/src/main/java/org/opensearch/client/json/PlainDeserializable.java @@ -0,0 +1,54 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.client.json; + +import jakarta.json.stream.JsonParser; +import java.io.InputStream; +import java.io.Reader; + +/** Base interface to set JSON properties **/ + +public interface PlainDeserializable { + + B get(); + + /** Updates object with newly provided JSON properties + @param parser the JsonParser parser + @param mapper the JsonpMapper mapper used to deserialize values + @return object + **/ + + default B withJson(JsonParser parser, JsonpMapper mapper) { + JsonpDeserializer deserializer = JsonpMapperBase.findDeserializer(this.getClass().getEnclosingClass()); + @SuppressWarnings("unchecked") + ObjectDeserializer objectDeserializer = (ObjectDeserializer) DelegatingDeserializer.unwrap(deserializer); + assert objectDeserializer != null; + return objectDeserializer.deserialize(get(), parser, mapper, parser.next()); + } + + /** Updates object with newly provided JSON properties + @param inputStream the stream to read from + @return this object + * **/ + default B withJson(InputStream inputStream) { + JsonpMapper defaultMapper = JsonpUtils.DEFAULT_JSONP_MAPPER; + return withJson(defaultMapper.jsonProvider().createParser(inputStream), defaultMapper); + } + + /** Updates object with newly provided JSON properties + @param reader the stream to read from + @return this object + * **/ + default B withJson(Reader reader) { + JsonpMapper defaultMapper = JsonpUtils.DEFAULT_JSONP_MAPPER; + JsonParser parser = defaultMapper.jsonProvider().createParser(reader); + return withJson(parser, defaultMapper); + } + +} diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/core/ScrollRequest.java b/java-client/src/main/java/org/opensearch/client/opensearch/core/ScrollRequest.java index af7987589..113bc03c7 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/core/ScrollRequest.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/core/ScrollRequest.java @@ -36,12 +36,7 @@ import java.util.Collections; import java.util.function.Function; import javax.annotation.Nullable; -import org.opensearch.client.json.JsonpDeserializable; -import org.opensearch.client.json.JsonpDeserializer; -import org.opensearch.client.json.JsonpMapper; -import org.opensearch.client.json.ObjectBuilderDeserializer; -import org.opensearch.client.json.ObjectDeserializer; -import org.opensearch.client.json.PlainJsonSerializable; +import org.opensearch.client.json.*; import org.opensearch.client.opensearch._types.ErrorResponse; import org.opensearch.client.opensearch._types.RequestBase; import org.opensearch.client.opensearch._types.Time; @@ -127,7 +122,7 @@ public Builder toBuilder() { * Builder for {@link ScrollRequest}. */ - public static class Builder extends ObjectBuilderBase implements ObjectBuilder { + public static class Builder extends ObjectBuilderBase implements ObjectBuilder, PlainDeserializable { @Nullable private Time scroll; @@ -173,6 +168,11 @@ public ScrollRequest build() { return new ScrollRequest(this); } + + @Override + public Builder get() { + return this; + } } // --------------------------------------------------------------------------------------------- diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchRequest.java b/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchRequest.java index 3b7166c1f..e26239fd1 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchRequest.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchRequest.java @@ -39,34 +39,14 @@ import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.opensearch.client.json.JsonData; -import org.opensearch.client.json.JsonpDeserializable; -import org.opensearch.client.json.JsonpDeserializer; -import org.opensearch.client.json.JsonpMapper; -import org.opensearch.client.json.ObjectBuilderDeserializer; -import org.opensearch.client.json.ObjectDeserializer; -import org.opensearch.client.json.PlainJsonSerializable; -import org.opensearch.client.opensearch._types.ErrorResponse; -import org.opensearch.client.opensearch._types.ExpandWildcard; -import org.opensearch.client.opensearch._types.FieldValue; -import org.opensearch.client.opensearch._types.RequestBase; -import org.opensearch.client.opensearch._types.ScriptField; -import org.opensearch.client.opensearch._types.SearchType; -import org.opensearch.client.opensearch._types.SlicedScroll; -import org.opensearch.client.opensearch._types.SortOptions; -import org.opensearch.client.opensearch._types.Time; +import org.opensearch.client.json.*; +import org.opensearch.client.opensearch._types.*; import org.opensearch.client.opensearch._types.aggregations.Aggregation; import org.opensearch.client.opensearch._types.mapping.RuntimeField; import org.opensearch.client.opensearch._types.query_dsl.FieldAndFormat; import org.opensearch.client.opensearch._types.query_dsl.Operator; import org.opensearch.client.opensearch._types.query_dsl.Query; -import org.opensearch.client.opensearch.core.search.FieldCollapse; -import org.opensearch.client.opensearch.core.search.Highlight; -import org.opensearch.client.opensearch.core.search.Pit; -import org.opensearch.client.opensearch.core.search.Rescore; -import org.opensearch.client.opensearch.core.search.SourceConfig; -import org.opensearch.client.opensearch.core.search.Suggester; -import org.opensearch.client.opensearch.core.search.TrackHits; +import org.opensearch.client.opensearch.core.search.*; import org.opensearch.client.transport.Endpoint; import org.opensearch.client.transport.endpoints.SimpleEndpoint; import org.opensearch.client.util.ApiTypeHelper; @@ -1167,7 +1147,7 @@ public Builder toBuilder() { * Builder for {@link SearchRequest}. */ - public static class Builder extends ObjectBuilderBase implements ObjectBuilder { + public static class Builder extends ObjectBuilderBase implements ObjectBuilder, PlainDeserializable { @Nullable private SourceConfig source; @@ -2267,6 +2247,11 @@ public SearchRequest build() { return new SearchRequest(this); } + + @Override + public Builder get() { + return this; + } } // --------------------------------------------------------------------------------------------- diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchTemplateRequest.java b/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchTemplateRequest.java index a3a828794..b4a712cd2 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchTemplateRequest.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchTemplateRequest.java @@ -39,18 +39,8 @@ import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.opensearch.client.json.JsonData; -import org.opensearch.client.json.JsonpDeserializable; -import org.opensearch.client.json.JsonpDeserializer; -import org.opensearch.client.json.JsonpMapper; -import org.opensearch.client.json.ObjectBuilderDeserializer; -import org.opensearch.client.json.ObjectDeserializer; -import org.opensearch.client.json.PlainJsonSerializable; -import org.opensearch.client.opensearch._types.ErrorResponse; -import org.opensearch.client.opensearch._types.ExpandWildcard; -import org.opensearch.client.opensearch._types.RequestBase; -import org.opensearch.client.opensearch._types.SearchType; -import org.opensearch.client.opensearch._types.Time; +import org.opensearch.client.json.*; +import org.opensearch.client.opensearch._types.*; import org.opensearch.client.transport.Endpoint; import org.opensearch.client.transport.endpoints.SimpleEndpoint; import org.opensearch.client.util.ApiTypeHelper; @@ -386,7 +376,7 @@ public Builder toBuilder() { * Builder for {@link SearchTemplateRequest}. */ - public static class Builder extends ObjectBuilderBase implements ObjectBuilder { + public static class Builder extends ObjectBuilderBase implements ObjectBuilder, PlainDeserializable { @Nullable private Boolean allowNoIndices; @@ -678,6 +668,11 @@ public SearchTemplateRequest build() { return new SearchTemplateRequest(this); } + + @Override + public Builder get() { + return this; + } } // --------------------------------------------------------------------------------------------- diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/indices/CreateIndexRequest.java b/java-client/src/main/java/org/opensearch/client/opensearch/indices/CreateIndexRequest.java index 236d52d70..a8a8eb452 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/indices/CreateIndexRequest.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/indices/CreateIndexRequest.java @@ -37,12 +37,7 @@ import java.util.Map; import java.util.function.Function; import javax.annotation.Nullable; -import org.opensearch.client.json.JsonpDeserializable; -import org.opensearch.client.json.JsonpDeserializer; -import org.opensearch.client.json.JsonpMapper; -import org.opensearch.client.json.ObjectBuilderDeserializer; -import org.opensearch.client.json.ObjectDeserializer; -import org.opensearch.client.json.PlainJsonSerializable; +import org.opensearch.client.json.*; import org.opensearch.client.opensearch._types.ErrorResponse; import org.opensearch.client.opensearch._types.RequestBase; import org.opensearch.client.opensearch._types.Time; @@ -225,7 +220,7 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) { * Builder for {@link CreateIndexRequest}. */ - public static class Builder extends ObjectBuilderBase implements ObjectBuilder { + public static class Builder extends ObjectBuilderBase implements ObjectBuilder, PlainDeserializable { @Nullable private Map aliases; @@ -422,6 +417,11 @@ public CreateIndexRequest build() { return new CreateIndexRequest(this); } + + @Override + public Builder get() { + return this; + } } // --------------------------------------------------------------------------------------------- diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/indices/PutIndexTemplateRequest.java b/java-client/src/main/java/org/opensearch/client/opensearch/indices/PutIndexTemplateRequest.java index b67132db4..f080df19c 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/indices/PutIndexTemplateRequest.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/indices/PutIndexTemplateRequest.java @@ -38,13 +38,7 @@ import java.util.Map; import java.util.function.Function; import javax.annotation.Nullable; -import org.opensearch.client.json.JsonData; -import org.opensearch.client.json.JsonpDeserializable; -import org.opensearch.client.json.JsonpDeserializer; -import org.opensearch.client.json.JsonpMapper; -import org.opensearch.client.json.ObjectBuilderDeserializer; -import org.opensearch.client.json.ObjectDeserializer; -import org.opensearch.client.json.PlainJsonSerializable; +import org.opensearch.client.json.*; import org.opensearch.client.opensearch._types.ErrorResponse; import org.opensearch.client.opensearch._types.RequestBase; import org.opensearch.client.opensearch.indices.put_index_template.IndexTemplateMapping; @@ -234,7 +228,7 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) { * Builder for {@link PutIndexTemplateRequest}. */ - public static class Builder extends ObjectBuilderBase implements ObjectBuilder { + public static class Builder extends ObjectBuilderBase implements ObjectBuilder, PlainDeserializable { @Nullable private Map meta; @@ -385,6 +379,11 @@ public PutIndexTemplateRequest build() { return new PutIndexTemplateRequest(this); } + + @Override + public Builder get() { + return this; + } } // --------------------------------------------------------------------------------------------- diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/json/PlainDeserializableTest.java b/java-client/src/test/java/org/opensearch/client/opensearch/json/PlainDeserializableTest.java new file mode 100644 index 000000000..6234e47e1 --- /dev/null +++ b/java-client/src/test/java/org/opensearch/client/opensearch/json/PlainDeserializableTest.java @@ -0,0 +1,42 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.client.opensearch.json; + +import org.junit.Test; +import org.opensearch.client.opensearch.indices.PutIndexTemplateRequest; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; + +public class PlainDeserializableTest { + + @Test + public void testWithJsonPutIndexTemplateRequest() { + + String stringTemplate = + "{\"name\":\"My index\",\"composed_of\":[\"component1\",\"component2\"],\"index_patterns\":[\"index_pattern1\"]}"; + InputStream inputStream = new ByteArrayInputStream(stringTemplate.getBytes(StandardCharsets.UTF_8)); + + PutIndexTemplateRequest indexTemplateRequest = new PutIndexTemplateRequest.Builder().name("My index 2") + .indexPatterns("index_pattern3") + .withJson(inputStream) + .build(); + + String expectedName = "My index"; // My index 2 will be replaced by My index from inputStream + List expectedIndexPatterns = List.of("index_pattern3", "index_pattern1"); + List expectedComponents = List.of("component1", "component2"); + + assert expectedName.equals(indexTemplateRequest.name()); + assert expectedIndexPatterns.equals(indexTemplateRequest.indexPatterns()); + assert expectedComponents.equals(indexTemplateRequest.composedOf()); + + } +}