From 8eadef8ee38c12c8598f9f3e77a451a0506a4d80 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Mon, 14 Apr 2025 17:25:45 +1200 Subject: [PATCH 1/4] Fix direct serialization of primitive types in `DEFAULT_JSONP_MAPPER` Signed-off-by: Thomas Farr --- .../opensearch/client/json/JsonpUtils.java | 30 ++++++++++++++++--- .../opensearch/core/IndexRequestTest.java | 6 ++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java b/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java index 8cf51df787..c0d126d0df 100644 --- a/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java +++ b/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java @@ -43,6 +43,8 @@ import jakarta.json.stream.JsonParser.Event; import jakarta.json.stream.JsonParsingException; import java.io.StringReader; +import java.math.BigDecimal; +import java.math.BigInteger; import java.util.AbstractMap; import java.util.Map; import java.util.stream.Collectors; @@ -78,11 +80,31 @@ public JsonProvider jsonProvider() { public void serialize(T value, JsonGenerator generator) { if (value instanceof JsonpSerializable) { ((JsonpSerializable) value).serialize(generator, this); - return; + } else if (value instanceof JsonValue) { + generator.write((JsonValue) value); + } else if (value instanceof String) { + generator.write((String) value); + } else if (value instanceof BigDecimal) { + generator.write((BigDecimal) value); + } else if (value instanceof BigInteger) { + generator.write((BigInteger) value); + } else if (value instanceof Short) { + generator.write((Short) value); + } else if (value instanceof Integer) { + generator.write((Integer) value); + } else if (value instanceof Long) { + generator.write((Long) value); + } else if (value instanceof Float) { + generator.write((Float) value); + } else if (value instanceof Double) { + generator.write((Double) value); + } else if (value instanceof Boolean) { + generator.write((Boolean) value); + } else { + throw new JsonException( + "Cannot find a serializer for type " + value.getClass().getName() + ". Consider using a full-featured JsonpMapper." + ); } - throw new JsonException( - "Cannot find a serializer for type " + value.getClass().getName() + ". Consider using a full-featured JsonpMapper." - ); } @Override diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/core/IndexRequestTest.java b/java-client/src/test/java/org/opensearch/client/opensearch/core/IndexRequestTest.java index c506d6f39d..78daf8bcee 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/core/IndexRequestTest.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/core/IndexRequestTest.java @@ -28,4 +28,10 @@ static class MyDoc { this.key = key; } } + + @Test + public void indexRequestToJson() { + IndexRequest indexRequest = IndexRequest.of(i -> i.index("index").document("document")); + assertNotNull(indexRequest.toJsonString()); + } } From 947c579386fc5549b3e66aaba6d56fcd505a2df1 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Mon, 14 Apr 2025 17:28:50 +1200 Subject: [PATCH 2/4] Fix changelog Signed-off-by: Thomas Farr --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0ccac007b..03393385ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ### Removed ### Fixed +- Fixed direct serialization of primitive types in `DEFAULT_JSONP_MAPPER` as used by `toJsonString()` ([#1524](https://github.com/opensearch-project/opensearch-java/pull/1524)) ### Security From 6d43be5cd58cfd992eb181b6a4e1e5b4b8fc2a33 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Thu, 22 May 2025 10:59:53 +1200 Subject: [PATCH 3/4] Better test example and confirm test failure Signed-off-by: Thomas Farr --- .../opensearch/client/json/JsonpUtils.java | 42 +++++++++---------- .../aggregations/ExtendedBoundsTest.java | 21 ++++++++++ .../opensearch/core/IndexRequestTest.java | 6 --- 3 files changed, 41 insertions(+), 28 deletions(-) create mode 100644 java-client/src/test/java/org/opensearch/client/opensearch/_types/aggregations/ExtendedBoundsTest.java diff --git a/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java b/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java index c0d126d0df..9c689fd135 100644 --- a/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java +++ b/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java @@ -43,8 +43,6 @@ import jakarta.json.stream.JsonParser.Event; import jakarta.json.stream.JsonParsingException; import java.io.StringReader; -import java.math.BigDecimal; -import java.math.BigInteger; import java.util.AbstractMap; import java.util.Map; import java.util.stream.Collectors; @@ -80,26 +78,26 @@ public JsonProvider jsonProvider() { public void serialize(T value, JsonGenerator generator) { if (value instanceof JsonpSerializable) { ((JsonpSerializable) value).serialize(generator, this); - } else if (value instanceof JsonValue) { - generator.write((JsonValue) value); - } else if (value instanceof String) { - generator.write((String) value); - } else if (value instanceof BigDecimal) { - generator.write((BigDecimal) value); - } else if (value instanceof BigInteger) { - generator.write((BigInteger) value); - } else if (value instanceof Short) { - generator.write((Short) value); - } else if (value instanceof Integer) { - generator.write((Integer) value); - } else if (value instanceof Long) { - generator.write((Long) value); - } else if (value instanceof Float) { - generator.write((Float) value); - } else if (value instanceof Double) { - generator.write((Double) value); - } else if (value instanceof Boolean) { - generator.write((Boolean) value); + // } else if (value instanceof JsonValue) { + // generator.write((JsonValue) value); + // } else if (value instanceof String) { + // generator.write((String) value); + // } else if (value instanceof BigDecimal) { + // generator.write((BigDecimal) value); + // } else if (value instanceof BigInteger) { + // generator.write((BigInteger) value); + // } else if (value instanceof Short) { + // generator.write((Short) value); + // } else if (value instanceof Integer) { + // generator.write((Integer) value); + // } else if (value instanceof Long) { + // generator.write((Long) value); + // } else if (value instanceof Float) { + // generator.write((Float) value); + // } else if (value instanceof Double) { + // generator.write((Double) value); + // } else if (value instanceof Boolean) { + // generator.write((Boolean) value); } else { throw new JsonException( "Cannot find a serializer for type " + value.getClass().getName() + ". Consider using a full-featured JsonpMapper." diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/_types/aggregations/ExtendedBoundsTest.java b/java-client/src/test/java/org/opensearch/client/opensearch/_types/aggregations/ExtendedBoundsTest.java new file mode 100644 index 0000000000..62d5b4b3ab --- /dev/null +++ b/java-client/src/test/java/org/opensearch/client/opensearch/_types/aggregations/ExtendedBoundsTest.java @@ -0,0 +1,21 @@ +/* + * 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._types.aggregations; + +import org.junit.Test; +import org.opensearch.client.opensearch.model.ModelTestCase; + +public class ExtendedBoundsTest extends ModelTestCase { + @Test + public void testToJsonString() { + ExtendedBounds bounds = ExtendedBounds.of(eb -> eb.min(0.0).max(4096.0)); + + assertEquals("{\"max\":4096.0,\"min\":0.0}", bounds.toJsonString()); + } +} diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/core/IndexRequestTest.java b/java-client/src/test/java/org/opensearch/client/opensearch/core/IndexRequestTest.java index 78daf8bcee..c506d6f39d 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/core/IndexRequestTest.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/core/IndexRequestTest.java @@ -28,10 +28,4 @@ static class MyDoc { this.key = key; } } - - @Test - public void indexRequestToJson() { - IndexRequest indexRequest = IndexRequest.of(i -> i.index("index").document("document")); - assertNotNull(indexRequest.toJsonString()); - } } From cd655d22675863730cab34343876af762de0b1c5 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Thu, 22 May 2025 11:36:25 +1200 Subject: [PATCH 4/4] Re-add fix Signed-off-by: Thomas Farr --- .../opensearch/client/json/JsonpUtils.java | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java b/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java index 9c689fd135..c0d126d0df 100644 --- a/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java +++ b/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java @@ -43,6 +43,8 @@ import jakarta.json.stream.JsonParser.Event; import jakarta.json.stream.JsonParsingException; import java.io.StringReader; +import java.math.BigDecimal; +import java.math.BigInteger; import java.util.AbstractMap; import java.util.Map; import java.util.stream.Collectors; @@ -78,26 +80,26 @@ public JsonProvider jsonProvider() { public void serialize(T value, JsonGenerator generator) { if (value instanceof JsonpSerializable) { ((JsonpSerializable) value).serialize(generator, this); - // } else if (value instanceof JsonValue) { - // generator.write((JsonValue) value); - // } else if (value instanceof String) { - // generator.write((String) value); - // } else if (value instanceof BigDecimal) { - // generator.write((BigDecimal) value); - // } else if (value instanceof BigInteger) { - // generator.write((BigInteger) value); - // } else if (value instanceof Short) { - // generator.write((Short) value); - // } else if (value instanceof Integer) { - // generator.write((Integer) value); - // } else if (value instanceof Long) { - // generator.write((Long) value); - // } else if (value instanceof Float) { - // generator.write((Float) value); - // } else if (value instanceof Double) { - // generator.write((Double) value); - // } else if (value instanceof Boolean) { - // generator.write((Boolean) value); + } else if (value instanceof JsonValue) { + generator.write((JsonValue) value); + } else if (value instanceof String) { + generator.write((String) value); + } else if (value instanceof BigDecimal) { + generator.write((BigDecimal) value); + } else if (value instanceof BigInteger) { + generator.write((BigInteger) value); + } else if (value instanceof Short) { + generator.write((Short) value); + } else if (value instanceof Integer) { + generator.write((Integer) value); + } else if (value instanceof Long) { + generator.write((Long) value); + } else if (value instanceof Float) { + generator.write((Float) value); + } else if (value instanceof Double) { + generator.write((Double) value); + } else if (value instanceof Boolean) { + generator.write((Boolean) value); } else { throw new JsonException( "Cannot find a serializer for type " + value.getClass().getName() + ". Consider using a full-featured JsonpMapper."