From d601bd949ce99d2b29e7e6cbfd2842a231458ee1 Mon Sep 17 00:00:00 2001 From: Andriy Redko Date: Wed, 19 Aug 2026 08:51:21 -0400 Subject: [PATCH] Migrate to Jackson 3.x APIs Signed-off-by: Andriy Redko --- core/build.gradle | 6 +-- .../jsonUDF/JsonAppendFunctionImpl.java | 6 +-- .../jsonUDF/JsonDeleteFunctionImpl.java | 4 +- .../jsonUDF/JsonExtendFunctionImpl.java | 6 +-- .../jsonUDF/JsonExtractAllFunctionImpl.java | 19 +++++----- .../function/jsonUDF/JsonSetFunctionImpl.java | 2 +- .../function/jsonUDF/JsonUtils.java | 4 +- .../org/opensearch/sql/utils/JsonUtils.java | 14 +++---- .../opensearch/sql/utils/YamlFormatter.java | 37 ++++++++++--------- .../expression/json/JsonFunctionsTest.java | 2 +- .../opensearch/sql/utils/YamlFormatter.java | 31 +++++++++------- ...enSearchDataSourceMetadataStorageTest.java | 36 ++++++++---------- .../client/PrometheusClientImpl.java | 6 +-- ...WriteDirectQueryResourcesResponseTest.java | 2 +- .../prometheus/model/MetricMetadataTest.java | 2 +- .../ExecuteDirectQueryActionResponse.java | 16 +++++--- .../RestDirectQueryManagementActionTest.java | 2 +- .../calcite/remote/CalcitePPLExplainIT.java | 2 +- .../opensearch/sql/ppl/IncludeMetadataIT.java | 2 +- .../org/opensearch/sql/util/MatcherUtils.java | 2 +- .../sql/legacy/cursor/DefaultCursor.java | 8 ++-- opensearch/build.gradle | 6 +-- .../opensearch/data/utils/ObjectContent.java | 2 +- .../data/utils/OpenSearchJsonContent.java | 12 +++--- .../value/OpenSearchExprValueFactory.java | 13 ++++--- .../executor/OpenSearchExecutionEngine.java | 2 +- .../storage/serde/RelJsonSerializer.java | 16 ++++---- .../storage/serde/SerializationWrapper.java | 10 ++--- .../data/utils/OpenSearchJsonContentTest.java | 13 ++++--- .../value/OpenSearchExprValueFactoryTest.java | 8 ++-- .../AggregationQueryBuilderTest.java | 2 +- .../dsl/MetricAggregationBuilderTest.java | 2 +- plugin/build.gradle | 4 +- .../sql/ppl/utils/MakeResultsDataParser.java | 7 ++-- prometheus/build.gradle | 6 +-- protocol/build.gradle | 8 ++-- 36 files changed, 165 insertions(+), 155 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index f4ccaa0d6e1..66fa897d3a3 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -53,10 +53,10 @@ dependencies { api group: 'org.apache.commons', name: 'commons-text', version: "${commons_text_version}" api group: 'com.facebook.presto', name: 'presto-matching', version: '0.240' api group: 'org.apache.commons', name: 'commons-math3', version: '3.6.1' - api "com.fasterxml.jackson.core:jackson-core:${versions.jackson}" - api "com.fasterxml.jackson.core:jackson-databind:${versions.jackson_databind}" + api "tools.jackson.core:jackson-core:${versions.jackson3}" + api "tools.jackson.core:jackson-databind:${versions.jackson3_databind}" api "com.fasterxml.jackson.core:jackson-annotations:${versions.jackson_annotations}" - api "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${versions.jackson}" + api "tools.jackson.dataformat:jackson-dataformat-yaml:${versions.jackson3}" api group: 'com.google.code.gson', name: 'gson', version: '2.8.9' api group: 'com.tdunning', name: 't-digest', version: '3.3' api "net.minidev:json-smart:${versions.json_smart}" diff --git a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonAppendFunctionImpl.java b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonAppendFunctionImpl.java index dd76a002e06..937795277fd 100644 --- a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonAppendFunctionImpl.java +++ b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonAppendFunctionImpl.java @@ -8,8 +8,6 @@ import static org.opensearch.sql.calcite.utils.PPLReturnTypes.STRING_FORCE_NULLABLE; import static org.opensearch.sql.expression.function.jsonUDF.JsonUtils.*; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -25,6 +23,8 @@ import org.apache.calcite.sql.type.SqlReturnTypeInference; import org.opensearch.sql.expression.function.ImplementorUDF; import org.opensearch.sql.expression.function.UDFOperandMetadata; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; public class JsonAppendFunctionImpl extends ImplementorUDF { public JsonAppendFunctionImpl() { @@ -53,7 +53,7 @@ public Expression implement( } } - public static Object eval(Object... args) throws JsonProcessingException { + public static Object eval(Object... args) throws JacksonException { String jsonStr = (String) args[0]; List keys = Arrays.asList(args).subList(1, args.length); if (keys.size() % 2 != 0) { diff --git a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonDeleteFunctionImpl.java b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonDeleteFunctionImpl.java index b3a884a4f17..05fc38f9fd7 100644 --- a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonDeleteFunctionImpl.java +++ b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonDeleteFunctionImpl.java @@ -9,7 +9,6 @@ import static org.opensearch.sql.calcite.utils.PPLReturnTypes.STRING_FORCE_NULLABLE; import static org.opensearch.sql.expression.function.jsonUDF.JsonUtils.*; -import com.fasterxml.jackson.core.JsonProcessingException; import java.util.Arrays; import java.util.List; import org.apache.calcite.adapter.enumerable.NotNullImplementor; @@ -23,6 +22,7 @@ import org.apache.calcite.sql.type.SqlReturnTypeInference; import org.opensearch.sql.expression.function.ImplementorUDF; import org.opensearch.sql.expression.function.UDFOperandMetadata; +import tools.jackson.core.JacksonException; public class JsonDeleteFunctionImpl extends ImplementorUDF { public JsonDeleteFunctionImpl() { @@ -51,7 +51,7 @@ public Expression implement( } } - public static Object eval(Object... args) throws JsonProcessingException { + public static Object eval(Object... args) throws JacksonException { List jsonPaths = Arrays.asList(args).subList(1, args.length); String[] pathSpecs = jsonPaths.stream() diff --git a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonExtendFunctionImpl.java b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonExtendFunctionImpl.java index dd91f1d95bd..62924d4e9e7 100644 --- a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonExtendFunctionImpl.java +++ b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonExtendFunctionImpl.java @@ -8,8 +8,6 @@ import static org.opensearch.sql.calcite.utils.PPLReturnTypes.STRING_FORCE_NULLABLE; import static org.opensearch.sql.expression.function.jsonUDF.JsonUtils.*; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -25,6 +23,8 @@ import org.apache.calcite.sql.type.SqlReturnTypeInference; import org.opensearch.sql.expression.function.ImplementorUDF; import org.opensearch.sql.expression.function.UDFOperandMetadata; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; public class JsonExtendFunctionImpl extends ImplementorUDF { public JsonExtendFunctionImpl() { @@ -53,7 +53,7 @@ public Expression implement( } } - public static Object eval(Object... args) throws JsonProcessingException { + public static Object eval(Object... args) throws JacksonException { String jsonStr = (String) args[0]; List keys = Arrays.asList(args).subList(1, args.length); if (keys.size() % 2 != 0) { diff --git a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonExtractAllFunctionImpl.java b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonExtractAllFunctionImpl.java index 8168700b6da..babe9ecf233 100644 --- a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonExtractAllFunctionImpl.java +++ b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonExtractAllFunctionImpl.java @@ -8,10 +8,6 @@ import static java.util.stream.Collectors.toMap; import static org.opensearch.sql.calcite.utils.OpenSearchTypeFactory.TYPE_FACTORY; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; -import java.io.IOException; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; @@ -33,6 +29,11 @@ import org.apache.calcite.sql.type.SqlTypeName; import org.opensearch.sql.expression.function.ImplementorUDF; import org.opensearch.sql.expression.function.UDFOperandMetadata; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.core.JsonToken; +import tools.jackson.core.ObjectReadContext; +import tools.jackson.core.json.JsonFactory; /** * UDF which extract all the fields from JSON to a MAP. Items are collected from input JSON and @@ -106,7 +107,7 @@ private static Map parseJson(String jsonStr) { Map resultMap = new HashMap<>(); Stack pathStack = new Stack<>(); - try (JsonParser parser = JSON_FACTORY.createParser(jsonStr)) { + try (JsonParser parser = JSON_FACTORY.createParser(ObjectReadContext.empty(), jsonStr)) { JsonToken token; while ((token = parser.nextToken()) != null) { @@ -131,7 +132,7 @@ private static Map parseJson(String jsonStr) { } break; - case FIELD_NAME: + case PROPERTY_NAME: String fieldName = parser.currentName(); pathStack.push(fieldName); break; @@ -158,7 +159,7 @@ private static Map parseJson(String jsonStr) { break; } } - } catch (IOException e) { + } catch (JacksonException e) { // ignore exception, and current result will be returned } return resultMap; @@ -188,7 +189,7 @@ private static boolean isInArray(List path) { return path.size() >= 1 && path.getLast().equals(ARRAY_SUFFIX); } - private static Object extractValue(JsonParser parser, JsonToken token) throws IOException { + private static Object extractValue(JsonParser parser, JsonToken token) throws JacksonException { switch (token) { case VALUE_STRING: return parser.getValueAsString(); @@ -207,7 +208,7 @@ private static Object extractValue(JsonParser parser, JsonToken token) throws IO } } - private static Object getIntValue(JsonParser parser) throws IOException { + private static Object getIntValue(JsonParser parser) throws JacksonException { if (parser.getNumberType() == JsonParser.NumberType.INT) { return parser.getIntValue(); } else if (parser.getNumberType() == JsonParser.NumberType.LONG) { diff --git a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonSetFunctionImpl.java b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonSetFunctionImpl.java index 27346b478e4..01f847f383b 100644 --- a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonSetFunctionImpl.java +++ b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonSetFunctionImpl.java @@ -8,7 +8,6 @@ import static org.opensearch.sql.calcite.utils.PPLReturnTypes.STRING_FORCE_NULLABLE; import static org.opensearch.sql.expression.function.jsonUDF.JsonUtils.*; -import com.fasterxml.jackson.databind.JsonNode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -24,6 +23,7 @@ import org.apache.calcite.sql.type.SqlReturnTypeInference; import org.opensearch.sql.expression.function.ImplementorUDF; import org.opensearch.sql.expression.function.UDFOperandMetadata; +import tools.jackson.databind.JsonNode; public class JsonSetFunctionImpl extends ImplementorUDF { public JsonSetFunctionImpl() { diff --git a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonUtils.java b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonUtils.java index 16727295fea..7fd20976ddd 100644 --- a/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonUtils.java +++ b/core/src/main/java/org/opensearch/sql/expression/function/jsonUDF/JsonUtils.java @@ -5,11 +5,11 @@ package org.opensearch.sql.expression.function.jsonUDF; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import java.util.ArrayList; import java.util.List; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; public class JsonUtils { static ObjectMapper objectMapper = new ObjectMapper(); diff --git a/core/src/main/java/org/opensearch/sql/utils/JsonUtils.java b/core/src/main/java/org/opensearch/sql/utils/JsonUtils.java index f38fe597891..f023e2b8c3d 100644 --- a/core/src/main/java/org/opensearch/sql/utils/JsonUtils.java +++ b/core/src/main/java/org/opensearch/sql/utils/JsonUtils.java @@ -9,9 +9,6 @@ import static org.opensearch.sql.data.model.ExprValueUtils.LITERAL_NULL; import static org.opensearch.sql.data.model.ExprValueUtils.LITERAL_TRUE; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -27,6 +24,9 @@ import org.opensearch.sql.data.model.ExprValue; import org.opensearch.sql.data.model.ExprValueUtils; import org.opensearch.sql.exception.SemanticCheckException; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; @UtilityClass public class JsonUtils { @@ -46,7 +46,7 @@ public static ExprValue isValidJson(ExprValue jsonExprValue) { try { objectMapper.readTree(jsonExprValue.stringValue()); return LITERAL_TRUE; - } catch (JsonProcessingException e) { + } catch (JacksonException e) { return LITERAL_FALSE; } } @@ -71,7 +71,7 @@ public static ExprValue castJson(ExprValue json) { JsonNode jsonNode; try { jsonNode = objectMapper.readTree(json.stringValue()); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { final String errorFormat = "JSON string '%s' is not valid. Error details: %s"; throw new SemanticCheckException(String.format(errorFormat, json, e.getMessage()), e); } @@ -90,13 +90,13 @@ private static ExprValue processJsonNode(JsonNode jsonNode) { return new ExprCollectionValue(elements); case OBJECT: Map values = new LinkedHashMap<>(); - for (var iter = jsonNode.fields(); iter.hasNext(); ) { + for (var iter = jsonNode.properties().iterator(); iter.hasNext(); ) { Map.Entry entry = iter.next(); values.put(entry.getKey(), processJsonNode(entry.getValue())); } return ExprTupleValue.fromExprValueMap(values); case STRING: - return new ExprStringValue(jsonNode.asText()); + return new ExprStringValue(jsonNode.asString()); case NUMBER: if (jsonNode.isFloatingPointNumber()) { return new ExprDoubleValue(jsonNode.asDouble()); diff --git a/core/src/main/java/org/opensearch/sql/utils/YamlFormatter.java b/core/src/main/java/org/opensearch/sql/utils/YamlFormatter.java index c50d04f8217..dd1375b2e2e 100644 --- a/core/src/main/java/org/opensearch/sql/utils/YamlFormatter.java +++ b/core/src/main/java/org/opensearch/sql/utils/YamlFormatter.java @@ -6,11 +6,12 @@ package org.opensearch.sql.utils; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.dataformat.yaml.YAMLFactory; +import tools.jackson.dataformat.yaml.YAMLFactoryBuilder; +import tools.jackson.dataformat.yaml.YAMLMapper; +import tools.jackson.dataformat.yaml.YAMLWriteFeature; /** * YAML formatter utility class. Attributes are sorted alphabetically for consistent output. Check @@ -21,18 +22,20 @@ public class YamlFormatter { private static final ObjectMapper YAML_MAPPER; static { - YAMLFactory yamlFactory = new YAMLFactory(); - yamlFactory.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER); - yamlFactory.enable(YAMLGenerator.Feature.USE_PLATFORM_LINE_BREAKS); - yamlFactory.enable(YAMLGenerator.Feature.LITERAL_BLOCK_STYLE); - yamlFactory.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES); // Enable smart quoting - yamlFactory.enable( - YAMLGenerator.Feature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS); // Quote numeric strings - yamlFactory.enable(YAMLGenerator.Feature.INDENT_ARRAYS_WITH_INDICATOR); - YAML_MAPPER = new ObjectMapper(yamlFactory); + final YAMLFactoryBuilder builder = new YAMLFactoryBuilder(new YAMLFactory()); + builder.disable(YAMLWriteFeature.WRITE_DOC_START_MARKER); + builder.enable(YAMLWriteFeature.LITERAL_BLOCK_STYLE); + builder.enable(YAMLWriteFeature.MINIMIZE_QUOTES); // Enable smart quoting + builder.enable(YAMLWriteFeature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS); // Quote numeric strings + builder.enable(YAMLWriteFeature.INDENT_ARRAYS_WITH_INDICATOR); - YAML_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL); - YAML_MAPPER.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); + YAML_MAPPER = + YAMLMapper.builder(builder.build()) + .changeDefaultPropertyInclusion( + incl -> incl.withValueInclusion(JsonInclude.Include.NON_NULL)) + .changeDefaultPropertyInclusion( + incl -> incl.withContentInclusion(JsonInclude.Include.NON_NULL)) + .build(); } /** @@ -44,7 +47,7 @@ public class YamlFormatter { public static String formatToYaml(Object object) { try { return YAML_MAPPER.writeValueAsString(object); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException("Failed to format object to YAML", e); } } diff --git a/core/src/test/java/org/opensearch/sql/expression/json/JsonFunctionsTest.java b/core/src/test/java/org/opensearch/sql/expression/json/JsonFunctionsTest.java index 5916205e0f4..c5fac49cb4d 100644 --- a/core/src/test/java/org/opensearch/sql/expression/json/JsonFunctionsTest.java +++ b/core/src/test/java/org/opensearch/sql/expression/json/JsonFunctionsTest.java @@ -9,7 +9,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.opensearch.sql.expression.function.jsonUDF.JsonUtils.*; -import com.fasterxml.jackson.databind.JsonNode; import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -22,6 +21,7 @@ import org.opensearch.sql.expression.function.jsonUDF.JsonDeleteFunctionImpl; import org.opensearch.sql.expression.function.jsonUDF.JsonSetFunctionImpl; import org.opensearch.sql.expression.function.jsonUDF.JsonUtils; +import tools.jackson.databind.JsonNode; @ExtendWith(MockitoExtension.class) public class JsonFunctionsTest { diff --git a/core/src/test/java/org/opensearch/sql/utils/YamlFormatter.java b/core/src/test/java/org/opensearch/sql/utils/YamlFormatter.java index 7dc939e7e5a..348c4560c53 100644 --- a/core/src/test/java/org/opensearch/sql/utils/YamlFormatter.java +++ b/core/src/test/java/org/opensearch/sql/utils/YamlFormatter.java @@ -5,11 +5,13 @@ package org.opensearch.sql.utils; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.dataformat.yaml.YAMLFactory; +import tools.jackson.dataformat.yaml.YAMLFactoryBuilder; +import tools.jackson.dataformat.yaml.YAMLMapper; +import tools.jackson.dataformat.yaml.YAMLWriteFeature; /** * YAML formatter utility class. Attributes are sorted alphabetically for consistent output. Check @@ -20,15 +22,16 @@ public class YamlFormatter { private static final ObjectMapper YAML_MAPPER = initObjectMapper(); private static ObjectMapper initObjectMapper() { - YAMLFactory yamlFactory = new YAMLFactory(); - yamlFactory.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER); - yamlFactory.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES); // Enable smart quoting - yamlFactory.enable( - YAMLGenerator.Feature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS); // Quote numeric strings - yamlFactory.enable(YAMLGenerator.Feature.INDENT_ARRAYS_WITH_INDICATOR); + final YAMLFactoryBuilder builder = new YAMLFactoryBuilder(new YAMLFactory()); + builder.disable(YAMLWriteFeature.WRITE_DOC_START_MARKER); + builder.enable(YAMLWriteFeature.MINIMIZE_QUOTES); // Enable smart quoting + builder.enable(YAMLWriteFeature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS); // Quote numeric strings + builder.enable(YAMLWriteFeature.INDENT_ARRAYS_WITH_INDICATOR); - ObjectMapper mapper = new ObjectMapper(yamlFactory); - mapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS); + ObjectMapper mapper = + YAMLMapper.builder(builder.build()) + .enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS) + .build(); return mapper; } @@ -36,7 +39,7 @@ private static ObjectMapper initObjectMapper() { public static String formatToYaml(Object object) { try { return YAML_MAPPER.writer().withDefaultPrettyPrinter().writeValueAsString(object); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException("Failed to format object to YAML", e); } } diff --git a/datasources/src/test/java/org/opensearch/sql/datasources/storage/OpenSearchDataSourceMetadataStorageTest.java b/datasources/src/test/java/org/opensearch/sql/datasources/storage/OpenSearchDataSourceMetadataStorageTest.java index a1c2425c66a..ce2a6b7f4de 100644 --- a/datasources/src/test/java/org/opensearch/sql/datasources/storage/OpenSearchDataSourceMetadataStorageTest.java +++ b/datasources/src/test/java/org/opensearch/sql/datasources/storage/OpenSearchDataSourceMetadataStorageTest.java @@ -8,12 +8,13 @@ import static org.opensearch.sql.datasource.model.DataSourceStatus.ACTIVE; import static org.opensearch.sql.datasources.storage.OpenSearchDataSourceMetadataStorage.DATASOURCE_INDEX_NAME; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import tools.jackson.core.JsonGenerator; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.module.SimpleModule; +import tools.jackson.databind.ser.std.StdSerializer; import java.io.IOException; import java.util.Collections; import java.util.HashMap; @@ -701,7 +702,7 @@ public void testWhenDataSourcesAreDisabled() { .hasIndex(DATASOURCE_INDEX_NAME); } - private String getBasicDataSourceMetadataString() throws JsonProcessingException { + private String getBasicDataSourceMetadataString() throws JacksonException { Map properties = new HashMap<>(); properties.put("prometheus.auth.type", "basicauth"); properties.put("prometheus.auth.username", "username"); @@ -721,7 +722,7 @@ private String getOldDataSourceMetadataStringWithOutStatusEnum() { return "{\"name\":\"testDS\",\"description\":\"\",\"connector\":\"PROMETHEUS\",\"allowedRoles\":[\"prometheus_access\"],\"properties\":{\"prometheus.auth.password\":\"password\",\"prometheus.auth.username\":\"username\",\"prometheus.auth.uri\":\"https://localhost:9090\",\"prometheus.auth.type\":\"basicauth\"},\"resultIndex\":\"query_execution_result_testds\"}"; } - private String getAWSSigv4DataSourceMetadataString() throws JsonProcessingException { + private String getAWSSigv4DataSourceMetadataString() throws JacksonException { Map properties = new HashMap<>(); properties.put("prometheus.auth.type", "awssigv4"); properties.put("prometheus.auth.secret_key", "secret_key"); @@ -738,7 +739,7 @@ private String getAWSSigv4DataSourceMetadataString() throws JsonProcessingExcept } private String getDataSourceMetadataStringWithBasicAuthentication() - throws JsonProcessingException { + throws JacksonException { Map properties = new HashMap<>(); properties.put("prometheus.auth.uri", "https://localhost:9090"); properties.put("prometheus.auth.type", "basicauth"); @@ -754,7 +755,7 @@ private String getDataSourceMetadataStringWithBasicAuthentication() return serialize(dataSourceMetadata); } - private String getDataSourceMetadataStringWithNoAuthentication() throws JsonProcessingException { + private String getDataSourceMetadataStringWithNoAuthentication() throws JacksonException { Map properties = new HashMap<>(); properties.put("prometheus.auth.uri", "https://localhost:9090"); DataSourceMetadata dataSourceMetadata = @@ -781,29 +782,22 @@ private DataSourceMetadata getDataSourceMetadata() { .build(); } - private String serialize(DataSourceMetadata dataSourceMetadata) throws JsonProcessingException { + private String serialize(DataSourceMetadata dataSourceMetadata) throws JacksonException { return getObjectMapper().writeValueAsString(dataSourceMetadata); } private ObjectMapper getObjectMapper() { - ObjectMapper mapper = new ObjectMapper(); - addSerializerForDataSourceType(mapper); - return mapper; - } - - /** It is needed to serialize DataSourceType as string. */ - private void addSerializerForDataSourceType(ObjectMapper mapper) { SimpleModule module = new SimpleModule(); module.addSerializer(DataSourceType.class, getDataSourceTypeSerializer()); - mapper.registerModule(module); + return JsonMapper.builder().addModule(module).build(); } private StdSerializer getDataSourceTypeSerializer() { return new StdSerializer<>(DataSourceType.class) { @Override public void serialize( - DataSourceType dsType, JsonGenerator jsonGen, SerializerProvider provider) - throws IOException { + DataSourceType dsType, JsonGenerator jsonGen, SerializationContext ctxt) + throws JacksonException { jsonGen.writeString(dsType.name()); } }; diff --git a/direct-query-core/src/main/java/org/opensearch/sql/prometheus/client/PrometheusClientImpl.java b/direct-query-core/src/main/java/org/opensearch/sql/prometheus/client/PrometheusClientImpl.java index d5dffa02391..c6d78f14fbe 100644 --- a/direct-query-core/src/main/java/org/opensearch/sql/prometheus/client/PrometheusClientImpl.java +++ b/direct-query-core/src/main/java/org/opensearch/sql/prometheus/client/PrometheusClientImpl.java @@ -5,9 +5,9 @@ package org.opensearch.sql.prometheus.client; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.dataformat.yaml.YAMLFactory; import java.io.IOException; import java.net.URI; import java.net.URLEncoder; diff --git a/direct-query-core/src/test/java/org/opensearch/sql/directquery/rest/model/WriteDirectQueryResourcesResponseTest.java b/direct-query-core/src/test/java/org/opensearch/sql/directquery/rest/model/WriteDirectQueryResourcesResponseTest.java index fa78bcda69c..e442be1827f 100644 --- a/direct-query-core/src/test/java/org/opensearch/sql/directquery/rest/model/WriteDirectQueryResourcesResponseTest.java +++ b/direct-query-core/src/test/java/org/opensearch/sql/directquery/rest/model/WriteDirectQueryResourcesResponseTest.java @@ -11,7 +11,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import java.util.Arrays; import java.util.HashMap; import java.util.List; diff --git a/direct-query-core/src/test/java/org/opensearch/sql/prometheus/model/MetricMetadataTest.java b/direct-query-core/src/test/java/org/opensearch/sql/prometheus/model/MetricMetadataTest.java index d409b4e23d7..dabf46e3ce8 100644 --- a/direct-query-core/src/test/java/org/opensearch/sql/prometheus/model/MetricMetadataTest.java +++ b/direct-query-core/src/test/java/org/opensearch/sql/prometheus/model/MetricMetadataTest.java @@ -10,7 +10,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; public class MetricMetadataTest { diff --git a/direct-query/src/main/java/org/opensearch/sql/directquery/transport/model/ExecuteDirectQueryActionResponse.java b/direct-query/src/main/java/org/opensearch/sql/directquery/transport/model/ExecuteDirectQueryActionResponse.java index 0b573e162fc..183064cad84 100644 --- a/direct-query/src/main/java/org/opensearch/sql/directquery/transport/model/ExecuteDirectQueryActionResponse.java +++ b/direct-query/src/main/java/org/opensearch/sql/directquery/transport/model/ExecuteDirectQueryActionResponse.java @@ -5,8 +5,11 @@ package org.opensearch.sql.directquery.transport.model; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; + import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -24,8 +27,9 @@ @RequiredArgsConstructor public class ExecuteDirectQueryActionResponse extends ActionResponse { - private static final ObjectMapper OBJECT_MAPPER = - new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + private static final ObjectMapper OBJECT_MAPPER = JsonMapper.builder() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .build(); @Getter private final String queryId; @Getter private final Map results; @@ -68,7 +72,7 @@ public ExecuteDirectQueryActionResponse(StreamInput in) throws IOException { case "prometheus": try { result = OBJECT_MAPPER.readValue(resultJson, PrometheusResult.class); - } catch (IOException e) { + } catch (JacksonException e) { throw new RuntimeException("Failed to deserialize Prometheus result", e); } break; @@ -107,7 +111,7 @@ public void writeTo(StreamOutput streamOutput) throws IOException { final String serializedResult; try { serializedResult = OBJECT_MAPPER.writeValueAsString(result); - } catch (IOException e) { + } catch (JacksonException e) { throw new RuntimeException("Failed to serialize result", e); } streamOutput.writeString(serializedResult); diff --git a/direct-query/src/test/java/org/opensearch/sql/directquery/rest/RestDirectQueryManagementActionTest.java b/direct-query/src/test/java/org/opensearch/sql/directquery/rest/RestDirectQueryManagementActionTest.java index 3e35e0206b8..dfff9c75686 100644 --- a/direct-query/src/test/java/org/opensearch/sql/directquery/rest/RestDirectQueryManagementActionTest.java +++ b/direct-query/src/test/java/org/opensearch/sql/directquery/rest/RestDirectQueryManagementActionTest.java @@ -12,7 +12,7 @@ import static org.mockito.Mockito.when; import static org.mockito.Mockito.withSettings; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.JsonObject; import java.util.HashMap; diff --git a/integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalcitePPLExplainIT.java b/integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalcitePPLExplainIT.java index 78ff6fc0401..ad60088c4ba 100644 --- a/integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalcitePPLExplainIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalcitePPLExplainIT.java @@ -7,7 +7,6 @@ import static org.opensearch.sql.util.MatcherUtils.assertJsonEquals; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import org.junit.jupiter.api.Test; import org.opensearch.client.Request; @@ -15,6 +14,7 @@ import org.opensearch.sql.ppl.PPLIntegTestCase; import org.opensearch.sql.ppl.PPLIntegTestCase.GlobalPushdownConfig; import org.opensearch.sql.protocol.response.format.Format; +import tools.jackson.databind.ObjectMapper; public class CalcitePPLExplainIT extends PPLIntegTestCase { diff --git a/integ-test/src/test/java/org/opensearch/sql/ppl/IncludeMetadataIT.java b/integ-test/src/test/java/org/opensearch/sql/ppl/IncludeMetadataIT.java index b690763e378..a27e27b95df 100644 --- a/integ-test/src/test/java/org/opensearch/sql/ppl/IncludeMetadataIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/ppl/IncludeMetadataIT.java @@ -15,7 +15,6 @@ import static org.opensearch.sql.util.MatcherUtils.verifyColumn; import static org.opensearch.sql.util.MatcherUtils.verifySchema; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -28,6 +27,7 @@ import org.opensearch.client.RequestOptions; import org.opensearch.client.Response; import org.opensearch.sql.legacy.TestUtils; +import tools.jackson.databind.ObjectMapper; public class IncludeMetadataIT extends PPLIntegTestCase { diff --git a/integ-test/src/test/java/org/opensearch/sql/util/MatcherUtils.java b/integ-test/src/test/java/org/opensearch/sql/util/MatcherUtils.java index 4fb8bd28129..057a812b9dc 100644 --- a/integ-test/src/test/java/org/opensearch/sql/util/MatcherUtils.java +++ b/integ-test/src/test/java/org/opensearch/sql/util/MatcherUtils.java @@ -18,7 +18,6 @@ import static org.hamcrest.Matchers.hasItems; import static org.junit.Assert.assertEquals; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Strings; import com.google.gson.JsonParser; import java.math.BigDecimal; @@ -42,6 +41,7 @@ import org.opensearch.search.SearchHits; import org.opensearch.sql.legacy.TestUtils; import org.opensearch.sql.utils.YamlFormatter; +import tools.jackson.databind.ObjectMapper; public class MatcherUtils { diff --git a/legacy/src/main/java/org/opensearch/sql/legacy/cursor/DefaultCursor.java b/legacy/src/main/java/org/opensearch/sql/legacy/cursor/DefaultCursor.java index 859e2bae31c..7f9e2a885bd 100644 --- a/legacy/src/main/java/org/opensearch/sql/legacy/cursor/DefaultCursor.java +++ b/legacy/src/main/java/org/opensearch/sql/legacy/cursor/DefaultCursor.java @@ -7,8 +7,6 @@ import static org.opensearch.core.xcontent.DeprecationHandler.IGNORE_DEPRECATIONS; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Strings; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -36,6 +34,8 @@ import org.opensearch.search.SearchModule; import org.opensearch.search.builder.SearchSourceBuilder; import org.opensearch.sql.legacy.executor.format.Schema; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; /** * Minimum metdata that will be serialized for generating cursorId for
@@ -141,7 +141,7 @@ public String generateCursorId() { String sortFieldValue; try { sortFieldValue = objectMapper.writeValueAsString(sortFields); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException("Failed to serialize sort fields to JSON string.", e); } json.put(SORT_FIELDS, sortFieldValue); @@ -223,7 +223,7 @@ private static void populateCursorForPit(JSONObject json, DefaultCursor cursor) private static Object[] getSortFieldsFromJson(JSONObject json) { try { return objectMapper.readValue(json.getString(SORT_FIELDS), Object[].class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException("Failed to parse sort fields from JSON string.", e); } } diff --git a/opensearch/build.gradle b/opensearch/build.gradle index 03d16cad083..9eb3e07d122 100644 --- a/opensearch/build.gradle +++ b/opensearch/build.gradle @@ -35,9 +35,9 @@ dependencies { api project(':ppl-rest-spi') api group: 'org.opensearch', name: 'opensearch', version: "${opensearch_version}" implementation "io.github.resilience4j:resilience4j-retry:${resilience4j_version}" - implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: "${versions.jackson}" - implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${versions.jackson_databind}" - implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-cbor', version: "${versions.jackson}" + implementation group: 'tools.jackson.core', name: 'jackson-core', version: "${versions.jackson3}" + implementation group: 'tools.jackson.core', name: 'jackson-databind', version: "${versions.jackson3_databind}" + implementation group: 'tools.jackson.dataformat', name: 'jackson-dataformat-cbor', version: "${versions.jackson3}" implementation group: 'org.json', name: 'json', version:'20231013' compileOnly group: 'org.opensearch.client', name: 'opensearch-rest-high-level-client', version: "${opensearch_version}" implementation group: 'org.opensearch', name:'opensearch-ml-client', version: "${opensearch_build}" diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/ObjectContent.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/ObjectContent.java index b409640c993..6818e75ec07 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/ObjectContent.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/ObjectContent.java @@ -5,7 +5,6 @@ package org.opensearch.sql.opensearch.data.utils; -import com.fasterxml.jackson.databind.node.ArrayNode; import java.util.AbstractMap; import java.util.Iterator; import java.util.List; @@ -13,6 +12,7 @@ import java.util.function.Function; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.tuple.Pair; +import tools.jackson.databind.node.ArrayNode; /** The Implementation of Content to represent {@link Object}. */ @RequiredArgsConstructor diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/OpenSearchJsonContent.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/OpenSearchJsonContent.java index 93c2c6b1584..587e133a10f 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/OpenSearchJsonContent.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/OpenSearchJsonContent.java @@ -5,7 +5,6 @@ package org.opensearch.sql.opensearch.data.utils; -import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Iterators; import java.io.IOException; import java.util.Iterator; @@ -23,6 +22,7 @@ import org.opensearch.core.xcontent.DeprecationHandler; import org.opensearch.core.xcontent.NamedXContentRegistry; import org.opensearch.core.xcontent.XContentParser; +import tools.jackson.databind.JsonNode; /** The Implementation of Content to represent {@link JsonNode}. */ @RequiredArgsConstructor @@ -62,7 +62,7 @@ public Double doubleValue() { @Override public String stringValue() { - return value().asText(); + return value().asString(); } @Override @@ -75,14 +75,14 @@ public Iterator> map() { LinkedHashMap map = new LinkedHashMap<>(); final JsonNode mapValue = value(); mapValue - .fieldNames() - .forEachRemaining(field -> map.put(field, new OpenSearchJsonContent(mapValue.get(field)))); + .propertyNames() + .forEach(field -> map.put(field, new OpenSearchJsonContent(mapValue.get(field)))); return map.entrySet().iterator(); } @Override public Iterator array() { - return Iterators.transform(value.elements(), OpenSearchJsonContent::new); + return Iterators.transform(value.values().iterator(), OpenSearchJsonContent::new); } @Override @@ -127,7 +127,7 @@ public boolean isDouble() { @Override public boolean isString() { - return value().isTextual(); + return value().isString(); } @Override diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprValueFactory.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprValueFactory.java index b4fa498e2ac..8d3381a1eaf 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprValueFactory.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprValueFactory.java @@ -20,9 +20,6 @@ import static org.opensearch.sql.utils.DateTimeFormatters.STRICT_HOUR_MINUTE_SECOND_FORMATTER; import static org.opensearch.sql.utils.DateTimeFormatters.STRICT_YEAR_MONTH_DAY_FORMATTER; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.collect.ImmutableMap; import java.time.Instant; import java.time.LocalDate; @@ -69,6 +66,11 @@ import org.opensearch.sql.opensearch.data.utils.ObjectContent; import org.opensearch.sql.opensearch.data.utils.OpenSearchJsonContent; import org.opensearch.sql.opensearch.response.agg.OpenSearchAggregationResponseParser; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; /** Construct ExprValue from OpenSearch response. */ public class OpenSearchExprValueFactory { @@ -100,7 +102,8 @@ public void extendTypeMapping(Map typeMapping) { private static final String TOP_PATH = ""; - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private static final ObjectMapper OBJECT_MAPPER = + JsonMapper.builder().disable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS).build(); private static final Map> typeActionMap = new ImmutableMap.Builder>() @@ -171,7 +174,7 @@ public ExprValue construct(String jsonString, boolean supportArrays) { TOP_PATH, Optional.of(STRUCT), fieldTypeTolerance || supportArrays); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new IllegalStateException(String.format("invalid json: %s.", jsonString), e); } } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngine.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngine.java index 483f2684d61..eeb8d34bab0 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngine.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngine.java @@ -5,7 +5,6 @@ package org.opensearch.sql.opensearch.executor; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Suppliers; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -75,6 +74,7 @@ import org.opensearch.sql.protocol.response.format.Format; import org.opensearch.sql.storage.TableScanOperator; import org.opensearch.transport.client.node.NodeClient; +import tools.jackson.databind.ObjectMapper; /** OpenSearch execution engine implementation. */ public class OpenSearchExecutionEngine implements ExecutionEngine { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serde/RelJsonSerializer.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serde/RelJsonSerializer.java index b81c9684e43..e787114868a 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serde/RelJsonSerializer.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serde/RelJsonSerializer.java @@ -5,9 +5,6 @@ package org.opensearch.sql.opensearch.storage.serde; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; @@ -30,6 +27,10 @@ import org.opensearch.sql.expression.function.PPLBuiltinOperators; import org.opensearch.sql.opensearch.executor.OpenSearchExecutionEngine.OperatorTable; import org.opensearch.sql.utils.DeserializationFilterUtil; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; /** * A serializer that (de-)serializes Calcite RexNode, RelDataType and OpenSearch field mapping. @@ -43,15 +44,14 @@ public class RelJsonSerializer { private final RelOptCluster cluster; - private static final ObjectMapper mapper = new ObjectMapper(); + private static final ObjectMapper mapper = + JsonMapper.builder() + .configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true) + .build(); private static final TypeReference> TYPE_REF = new TypeReference<>() {}; private static volatile SqlOperatorTable pplSqlOperatorTable; - static { - mapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true); - } - public RelJsonSerializer(RelOptCluster cluster) { this.cluster = cluster; } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serde/SerializationWrapper.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serde/SerializationWrapper.java index 6a75cee0188..be6018e126a 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serde/SerializationWrapper.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serde/SerializationWrapper.java @@ -5,13 +5,13 @@ package org.opensearch.sql.opensearch.storage.serde; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.opensearch.sql.opensearch.storage.script.CompoundedScriptEngine.ScriptEngineType; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; /** Serialization wrapper that wraps the script language type with encoded script by JSON. */ public class SerializationWrapper { @@ -30,7 +30,7 @@ public class SerializationWrapper { public static String wrapWithLangType(ScriptEngineType langType, String script) { try { return mapper.writeValueAsString(new LangScriptWrapper(langType, script)); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException("Failed to wrap script with langType: " + langType, e); } } @@ -48,7 +48,7 @@ public static LangScriptWrapper unwrapLangType(String wrapped) { throw new IllegalArgumentException("Missing required fields in language script wrapper."); } return unwrapped; - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException("Failed to unwrap script with langType.", e); } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/utils/OpenSearchJsonContentTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/utils/OpenSearchJsonContentTest.java index c2cf0328bdd..d1b8291f423 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/utils/OpenSearchJsonContentTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/utils/OpenSearchJsonContentTest.java @@ -10,19 +10,20 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.JsonNode; -import java.io.IOException; import org.junit.jupiter.api.Test; import org.opensearch.OpenSearchParseException; +import tools.jackson.core.JsonParser; +import tools.jackson.core.ObjectReadContext; +import tools.jackson.core.exc.StreamReadException; +import tools.jackson.databind.JsonNode; public class OpenSearchJsonContentTest { @Test - public void testGetValueWithIOException() throws IOException { + public void testGetValueWithIOException() { JsonNode jsonNode = mock(JsonNode.class); JsonParser jsonParser = mock(JsonParser.class); - when(jsonNode.traverse()).thenReturn(jsonParser); - when(jsonParser.nextToken()).thenThrow(new IOException()); + when(jsonNode.traverse(ObjectReadContext.empty())).thenReturn(jsonParser); + when(jsonParser.nextToken()).thenThrow(new StreamReadException("Simulated")); OpenSearchJsonContent content = new OpenSearchJsonContent(jsonNode); OpenSearchParseException exception = assertThrows(OpenSearchParseException.class, content::geoValue); diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprValueFactoryTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprValueFactoryTest.java index 7c27c995e4c..d05d17128bb 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprValueFactoryTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprValueFactoryTest.java @@ -35,8 +35,6 @@ import static org.opensearch.sql.data.type.ExprCoreType.TIME; import static org.opensearch.sql.data.type.ExprCoreType.TIMESTAMP; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableMap; import java.time.Instant; import java.time.LocalDate; @@ -62,6 +60,8 @@ import org.opensearch.sql.opensearch.data.type.OpenSearchTextType; import org.opensearch.sql.opensearch.data.utils.OpenSearchJsonContent; import org.opensearch.sql.opensearch.data.value.OpenSearchExprValueFactory.JsonPath; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; class OpenSearchExprValueFactoryTest { @@ -137,7 +137,7 @@ public void constructNullValue() { } @Test - public void iterateArrayValue() throws JsonProcessingException { + public void iterateArrayValue() throws JacksonException { ObjectMapper mapper = new ObjectMapper(); var arrayIt = new OpenSearchJsonContent(mapper.readTree("[\"zz\",\"bb\"]")).array(); assertAll( @@ -147,7 +147,7 @@ public void iterateArrayValue() throws JsonProcessingException { } @Test - public void iterateArrayValueWithOneElement() throws JsonProcessingException { + public void iterateArrayValueWithOneElement() throws JacksonException { ObjectMapper mapper = new ObjectMapper(); var arrayIt = new OpenSearchJsonContent(mapper.readTree("[\"zz\"]")).array(); assertAll( diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilderTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilderTest.java index 721b0b66a4c..cfe305c6aa7 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilderTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilderTest.java @@ -27,7 +27,6 @@ import static org.opensearch.sql.opensearch.utils.Utils.group; import static org.opensearch.sql.opensearch.utils.Utils.sort; -import com.fasterxml.jackson.databind.ObjectMapper; import java.util.AbstractMap; import java.util.Arrays; import java.util.Collections; @@ -55,6 +54,7 @@ import org.opensearch.sql.opensearch.data.type.OpenSearchDateType; import org.opensearch.sql.opensearch.data.type.OpenSearchTextType; import org.opensearch.sql.opensearch.storage.serde.ExpressionSerializer; +import tools.jackson.databind.ObjectMapper; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @ExtendWith(MockitoExtension.class) diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilderTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilderTest.java index 88b837d562d..b510f794abf 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilderTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilderTest.java @@ -21,7 +21,6 @@ import static org.opensearch.sql.expression.aggregation.VarianceAggregator.variancePopulation; import static org.opensearch.sql.expression.aggregation.VarianceAggregator.varianceSample; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableList; import java.util.Arrays; import java.util.Collections; @@ -45,6 +44,7 @@ import org.opensearch.sql.expression.aggregation.TakeAggregator; import org.opensearch.sql.expression.function.FunctionName; import org.opensearch.sql.opensearch.storage.serde.ExpressionSerializer; +import tools.jackson.databind.ObjectMapper; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @ExtendWith(MockitoExtension.class) diff --git a/plugin/build.gradle b/plugin/build.gradle index fbd2cd1a331..d0a6114332d 100644 --- a/plugin/build.gradle +++ b/plugin/build.gradle @@ -155,8 +155,8 @@ spotless { dependencies { compileOnly "org.opensearch:opensearch-job-scheduler-spi:${opensearch_build}" - api "com.fasterxml.jackson.core:jackson-core:${versions.jackson}" - api "com.fasterxml.jackson.core:jackson-databind:${versions.jackson_databind}" + api "tools.jackson.core:jackson-core:${versions.jackson3}" + api "tools.jackson.core:jackson-databind:${versions.jackson3_databind}" api "com.fasterxml.jackson.core:jackson-annotations:${versions.jackson_annotations}" api project(":ppl") diff --git a/ppl/src/main/java/org/opensearch/sql/ppl/utils/MakeResultsDataParser.java b/ppl/src/main/java/org/opensearch/sql/ppl/utils/MakeResultsDataParser.java index 225f3d0280f..acae170d4a2 100644 --- a/ppl/src/main/java/org/opensearch/sql/ppl/utils/MakeResultsDataParser.java +++ b/ppl/src/main/java/org/opensearch/sql/ppl/utils/MakeResultsDataParser.java @@ -5,8 +5,6 @@ package org.opensearch.sql.ppl.utils; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; @@ -20,6 +18,8 @@ import org.opensearch.sql.ast.tree.Values; import org.opensearch.sql.common.antlr.SyntaxCheckException; import org.opensearch.sql.data.type.ExprCoreType; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; /** * Parses the inline {@code makeresults format=csv|json data="..."} literal into a shared {@link @@ -129,7 +129,8 @@ private static Values parseJson(String data) { throw new SyntaxCheckException("makeresults JSON data must be an array of objects"); } Map row = new LinkedHashMap<>(); - for (Iterator> it = node.fields(); it.hasNext(); ) { + for (Iterator> it = node.properties().iterator(); + it.hasNext(); ) { Map.Entry f = it.next(); String name = f.getKey(); JsonNode v = f.getValue(); diff --git a/prometheus/build.gradle b/prometheus/build.gradle index f4be59d2a8f..40a5082e98f 100644 --- a/prometheus/build.gradle +++ b/prometheus/build.gradle @@ -22,9 +22,9 @@ dependencies { implementation group: 'org.opensearch', name: 'opensearch', version: "${opensearch_version}" implementation "io.github.resilience4j:resilience4j-retry:${resilience4j_version}" - implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: "${versions.jackson}" - implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${versions.jackson_databind}" - implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-cbor', version: "${versions.jackson}" + implementation group: 'tools.jackson.core', name: 'jackson-core', version: "${versions.jackson3}" + implementation group: 'tools.jackson.core', name: 'jackson-databind', version: "${versions.jackson3_databind}" + implementation group: 'tools.jackson.dataformat', name: 'jackson-dataformat-cbor', version: "${versions.jackson3}" implementation group: 'org.json', name: 'json', version: '20231013' testImplementation('org.junit.jupiter:junit-jupiter:5.9.3') diff --git a/protocol/build.gradle b/protocol/build.gradle index e6385ab69c2..10d04a4cff9 100644 --- a/protocol/build.gradle +++ b/protocol/build.gradle @@ -31,9 +31,9 @@ plugins { dependencies { implementation group: 'com.google.guava', name: 'guava', version: "${guava_version}" - implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: "${versions.jackson}" - implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${versions.jackson_databind}" - implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-cbor', version: "${versions.jackson}" + implementation group: 'tools.jackson.core', name: 'jackson-core', version: "${versions.jackson3}" + implementation group: 'tools.jackson.core', name: 'jackson-databind', version: "${versions.jackson3_databind}" + implementation group: 'tools.jackson.dataformat', name: 'jackson-dataformat-cbor', version: "${versions.jackson3}" implementation 'com.google.code.gson:gson:2.8.9' implementation project(':core') implementation project(':opensearch') @@ -46,7 +46,7 @@ dependencies { } configurations.all { - resolutionStrategy.force "com.fasterxml.jackson.core:jackson-databind:${versions.jackson_databind}" + resolutionStrategy.force "tools.jackson.core:jackson-databind:${versions.jackson3_databind}" } test {