diff --git a/api/management-model/src/test/java/org/apache/polaris/core/admin/model/CatalogSerializationTest.java b/api/management-model/src/test/java/org/apache/polaris/core/admin/model/CatalogSerializationTest.java index 3244f14732..d3ad2b1d74 100644 --- a/api/management-model/src/test/java/org/apache/polaris/core/admin/model/CatalogSerializationTest.java +++ b/api/management-model/src/test/java/org/apache/polaris/core/admin/model/CatalogSerializationTest.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -39,7 +40,7 @@ public class CatalogSerializationTest { @BeforeEach public void setUp() { - mapper = new ObjectMapper(); + mapper = JsonMapper.builder().build(); } @ParameterizedTest(name = "{0}") diff --git a/extensions/auth/opa/impl/src/jsonSchemaGenerator/java/org/apache/polaris/extension/auth/opa/model/OpaSchemaGenerator.java b/extensions/auth/opa/impl/src/jsonSchemaGenerator/java/org/apache/polaris/extension/auth/opa/model/OpaSchemaGenerator.java index be08c234bd..6800619c69 100644 --- a/extensions/auth/opa/impl/src/jsonSchemaGenerator/java/org/apache/polaris/extension/auth/opa/model/OpaSchemaGenerator.java +++ b/extensions/auth/opa/impl/src/jsonSchemaGenerator/java/org/apache/polaris/extension/auth/opa/model/OpaSchemaGenerator.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.module.jsonSchema.JsonSchema; import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator; import java.io.IOException; @@ -44,8 +45,7 @@ public class OpaSchemaGenerator { * @throws IOException if schema generation fails */ public static String generateSchema() throws IOException { - ObjectMapper mapper = new ObjectMapper(); - mapper.enable(SerializationFeature.INDENT_OUTPUT); + ObjectMapper mapper = JsonMapper.builder().enable(SerializationFeature.INDENT_OUTPUT).build(); JsonSchemaGenerator schemaGen = new JsonSchemaGenerator(mapper); JsonSchema schema = schemaGen.generateSchema(OpaAuthorizationInput.class); diff --git a/extensions/auth/opa/impl/src/main/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerFactory.java b/extensions/auth/opa/impl/src/main/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerFactory.java index c3f72b4fad..fd0ab46bc9 100644 --- a/extensions/auth/opa/impl/src/main/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerFactory.java +++ b/extensions/auth/opa/impl/src/main/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerFactory.java @@ -19,6 +19,7 @@ package org.apache.polaris.extension.auth.opa; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import io.smallrye.common.annotation.Identifier; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; @@ -60,7 +61,7 @@ public OpaPolarisAuthorizerFactory( this.opaConfig = opaConfig; this.clock = clock; this.asyncExec = asyncExec; - this.objectMapper = new ObjectMapper(); + this.objectMapper = JsonMapper.builder().build(); } /** diff --git a/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerTest.java b/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerTest.java index 7401004a8a..4336a9628d 100644 --- a/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerTest.java +++ b/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/OpaPolarisAuthorizerTest.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; @@ -75,7 +76,7 @@ void testOpaInputJsonFormat() throws Exception { "http://localhost:" + server.getAddress().getPort() + "/v1/data/polaris/allow"); OpaPolarisAuthorizer authorizer = new OpaPolarisAuthorizer( - policyUri, HttpClients.createDefault(), new ObjectMapper(), null); + policyUri, HttpClients.createDefault(), JsonMapper.builder().build(), null); PolarisPrincipal principal = PolarisPrincipal.of("eve", Map.of("department", "finance"), Set.of("auditor")); @@ -95,7 +96,7 @@ void testOpaInputJsonFormat() throws Exception { secondary)); // Parse and verify JSON structure from captured request - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); JsonNode root = mapper.readTree(capturedRequestBody[0]); assertThat(root.has("input")).as("Root should have 'input' field").isTrue(); var input = root.get("input"); @@ -120,7 +121,7 @@ void testOpaRequestJsonWithHierarchicalResource() throws Exception { "http://localhost:" + server.getAddress().getPort() + "/v1/data/polaris/allow"); OpaPolarisAuthorizer authorizer = new OpaPolarisAuthorizer( - policyUri, HttpClients.createDefault(), new ObjectMapper(), null); + policyUri, HttpClients.createDefault(), JsonMapper.builder().build(), null); // Set up a realistic principal PolarisPrincipal principal = @@ -185,7 +186,7 @@ void testOpaRequestJsonWithHierarchicalResource() throws Exception { null)); // Parse and verify the complete JSON structure - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); JsonNode root = mapper.readTree(capturedRequestBody[0]); // Verify top-level structure @@ -273,7 +274,7 @@ void testOpaRequestJsonWithMultiLevelNamespace() throws Exception { "http://localhost:" + server.getAddress().getPort() + "/v1/data/polaris/allow"); OpaPolarisAuthorizer authorizer = new OpaPolarisAuthorizer( - policyUri, HttpClients.createDefault(), new ObjectMapper(), null); + policyUri, HttpClients.createDefault(), JsonMapper.builder().build(), null); // Set up a realistic principal PolarisPrincipal principal = @@ -350,7 +351,7 @@ void testOpaRequestJsonWithMultiLevelNamespace() throws Exception { null)); // Parse and verify the complete JSON structure - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); JsonNode root = mapper.readTree(capturedRequestBody[0]); // Verify top-level structure @@ -437,7 +438,7 @@ void testAuthorizeOrThrowWithEmptyTargetsAndSecondaries() throws Exception { "http://localhost:" + server.getAddress().getPort() + "/v1/data/polaris/allow"); OpaPolarisAuthorizer authorizer = new OpaPolarisAuthorizer( - policyUri, HttpClients.createDefault(), new ObjectMapper(), null); + policyUri, HttpClients.createDefault(), JsonMapper.builder().build(), null); PolarisPrincipal principal = PolarisPrincipal.of("alice", Map.of(), Set.of("admin")); @@ -483,7 +484,7 @@ public void testCreateWithHttpsAndBearerToken() { URI policyUri = URI.create("http://opa.example.com:8181/v1/data/polaris/allow"); OpaPolarisAuthorizer authorizer = new OpaPolarisAuthorizer( - policyUri, HttpClients.createDefault(), new ObjectMapper(), tokenProvider); + policyUri, HttpClients.createDefault(), JsonMapper.builder().build(), tokenProvider); assertThat(authorizer).isNotNull(); } @@ -499,7 +500,10 @@ public void testBearerTokenIsAddedToHttpRequest() { BearerTokenProvider tokenProvider = new StaticBearerTokenProvider("test-bearer-token"); OpaPolarisAuthorizer authorizer = new OpaPolarisAuthorizer( - policyUri, mock(CloseableHttpClient.class), new ObjectMapper(), tokenProvider) { + policyUri, + mock(CloseableHttpClient.class), + JsonMapper.builder().build(), + tokenProvider) { @Override T httpClientExecute( ClassicHttpRequest request, HttpClientResponseHandler responseHandler) @@ -541,7 +545,10 @@ public void testBearerTokenFromBearerTokenProvider() { // Create authorizer with the token provider instead of static token OpaPolarisAuthorizer authorizer = new OpaPolarisAuthorizer( - policyUri, mock(CloseableHttpClient.class), new ObjectMapper(), tokenProvider) { + policyUri, + mock(CloseableHttpClient.class), + JsonMapper.builder().build(), + tokenProvider) { @Override T httpClientExecute( ClassicHttpRequest request, HttpClientResponseHandler responseHandler) diff --git a/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/token/FileBearerTokenProviderTest.java b/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/token/FileBearerTokenProviderTest.java index 6dc53817a7..62f1fe9bde 100644 --- a/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/token/FileBearerTokenProviderTest.java +++ b/extensions/auth/opa/impl/src/test/java/org/apache/polaris/extension/auth/opa/token/FileBearerTokenProviderTest.java @@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -401,7 +402,7 @@ public void testJwtWithoutExpirationClaim() throws IOException { /** Helper method to create a JWT with a specific expiration time. */ private String createJwtWithExpiration(Instant expiration) { try { - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); // Create header Map header = new HashMap<>(); @@ -438,7 +439,7 @@ private String createJwtWithExpiration(Instant expiration) { /** Helper method to create a JWT without an expiration claim. */ private String createJwtWithoutExpiration() { try { - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); // Create header Map header = new HashMap<>(); diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisClient.java b/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisClient.java index d9b1bfbbb6..2a5c31eeab 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisClient.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisClient.java @@ -25,6 +25,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.json.JsonMapper; import jakarta.ws.rs.client.Client; import java.net.URI; import java.util.Map; @@ -64,7 +65,7 @@ public static PolarisClient polarisClient(PolarisApiEndpoints endpoints) { * ObjectMapper} if the make custom {@link PolarisServerManager#createClient() clients}. */ public static ObjectMapper buildObjectMapper() { - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.setPropertyNamingStrategy(new PropertyNamingStrategies.KebabCaseStrategy()); diff --git a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisManagementServiceIntegrationTest.java b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisManagementServiceIntegrationTest.java index 0bf433d18a..7b7d6febb1 100644 --- a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisManagementServiceIntegrationTest.java +++ b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisManagementServiceIntegrationTest.java @@ -29,6 +29,7 @@ import com.auth0.jwt.algorithms.Algorithm; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.collect.ImmutableMap; import jakarta.ws.rs.client.Entity; @@ -159,7 +160,7 @@ public void testCatalogSerializing() throws IOException { .build()) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); String json = mapper.writeValueAsString(catalog); System.out.println(json); Catalog deserialized = mapper.readValue(json, Catalog.class); @@ -334,7 +335,7 @@ public void testCreateCatalogWithNullBaseLocation() { .setStorageType(StorageConfigInfo.StorageTypeEnum.S3) .setAllowedLocations(List.of("s3://my-old-bucket/path/to/data")) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); JsonNode storageConfig = mapper.valueToTree(awsConfigModel); ObjectNode catalogNode = mapper.createObjectNode(); catalogNode.set("storageConfigInfo", storageConfig); @@ -359,7 +360,7 @@ public void testCreateCatalogWithoutProperties() { .setStorageType(StorageConfigInfo.StorageTypeEnum.S3) .setAllowedLocations(List.of("s3://my-old-bucket/path/to/data")) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); JsonNode storageConfig = mapper.valueToTree(awsConfigModel); ObjectNode catalogNode = mapper.createObjectNode(); catalogNode.set("storageConfigInfo", storageConfig); @@ -513,7 +514,7 @@ public void testCreateCatalogWithoutDefaultLocation() { .setStorageType(StorageConfigInfo.StorageTypeEnum.S3) .setAllowedLocations(List.of("s3://my-old-bucket/path/to/data")) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); JsonNode storageConfig = mapper.valueToTree(awsConfigModel); ObjectNode catalogNode = mapper.createObjectNode(); catalogNode.set("storageConfigInfo", storageConfig); @@ -534,7 +535,7 @@ public void testCreateCatalogWithoutDefaultLocation() { @Test public void serialization() { CatalogProperties properties = new CatalogProperties("s3://my-bucket/path/to/data"); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); CatalogProperties translated = mapper.convertValue(properties, CatalogProperties.class); assertThat(translated.toMap()) .containsEntry("default-base-location", "s3://my-bucket/path/to/data"); diff --git a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclEntryImpl.java b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclEntryImpl.java index 0fec66b362..270409b4a0 100644 --- a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclEntryImpl.java +++ b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclEntryImpl.java @@ -18,7 +18,11 @@ */ package org.apache.polaris.persistence.nosql.authz.impl; +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; +import static com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION; + import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import java.util.stream.Stream; import org.apache.polaris.persistence.nosql.authz.api.AclEntry; import org.apache.polaris.persistence.nosql.authz.api.Privilege; @@ -39,7 +43,12 @@ public class TestAclEntryImpl { @BeforeAll static void setUp() { - mapper = new ObjectMapper().findAndRegisterModules(); + mapper = + JsonMapper.builder() + .findAndAddModules() + .disable(FAIL_ON_UNKNOWN_PROPERTIES) + .enable(DEFAULT_VIEW_INCLUSION) + .build(); privileges = new PrivilegesImpl(Stream.of(new PrivilegesTestProvider()), new PrivilegesTestRepository()); JacksonPrivilegesModule.CDIResolver.setResolver(x -> privileges); diff --git a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclImpl.java b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclImpl.java index 552141279e..adf935652a 100644 --- a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclImpl.java +++ b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestAclImpl.java @@ -19,6 +19,7 @@ package org.apache.polaris.persistence.nosql.authz.impl; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import java.util.stream.Stream; import org.apache.polaris.persistence.nosql.authz.api.Acl; import org.apache.polaris.persistence.nosql.authz.api.Privilege; @@ -41,7 +42,7 @@ public class TestAclImpl { @BeforeAll static void setUp() { - mapper = new ObjectMapper().findAndRegisterModules(); + mapper = JsonMapper.builder().findAndAddModules().build(); privileges = new PrivilegesImpl(Stream.of(new PrivilegesTestProvider()), new PrivilegesTestRepository()); JacksonPrivilegesModule.CDIResolver.setResolver(x -> privileges); diff --git a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestPrivilegeSetImpl.java b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestPrivilegeSetImpl.java index 2832973f39..90f43fe255 100644 --- a/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestPrivilegeSetImpl.java +++ b/persistence/nosql/authz/impl/src/test/java/org/apache/polaris/persistence/nosql/authz/impl/TestPrivilegeSetImpl.java @@ -18,11 +18,14 @@ */ package org.apache.polaris.persistence.nosql.authz.impl; +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; +import static com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION; import static java.util.Collections.singleton; import static org.junit.jupiter.params.provider.Arguments.arguments; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import java.util.ArrayList; import java.util.Set; @@ -54,7 +57,12 @@ static final class StorageView {} @BeforeAll static void setUp() { - mapper = new ObjectMapper().findAndRegisterModules(); + mapper = + JsonMapper.builder() + .findAndAddModules() + .disable(FAIL_ON_UNKNOWN_PROPERTIES) + .enable(DEFAULT_VIEW_INCLUSION) + .build(); privileges = new PrivilegesImpl(Stream.of(new PrivilegesTestProvider()), new PrivilegesTestRepository()); JacksonPrivilegesModule.CDIResolver.setResolver(x -> privileges); diff --git a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/backend/TestPersistId.java b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/backend/TestPersistId.java index 5f1eb2741a..3c73a1dcdb 100644 --- a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/backend/TestPersistId.java +++ b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/backend/TestPersistId.java @@ -22,6 +22,7 @@ import static org.junit.jupiter.params.provider.Arguments.arguments; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.dataformat.smile.databind.SmileMapper; import java.nio.ByteBuffer; import java.util.Arrays; @@ -47,8 +48,8 @@ public class TestPersistId { @BeforeEach protected void setUp() { - mapper = new ObjectMapper(); - smile = new SmileMapper(); + mapper = JsonMapper.builder().build(); + smile = SmileMapper.builder().build(); } @Test diff --git a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestGenericObj.java b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestGenericObj.java index c544edf2b9..90dec495d8 100644 --- a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestGenericObj.java +++ b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestGenericObj.java @@ -18,11 +18,13 @@ */ package org.apache.polaris.persistence.nosql.api.obj; +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; +import static com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION; import static org.apache.polaris.persistence.nosql.api.obj.ObjSerializationHelper.contextualReader; import static org.apache.polaris.persistence.nosql.api.obj.ObjTypes.objTypeById; import static org.junit.jupiter.params.provider.Arguments.arguments; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Stream; @@ -41,7 +43,12 @@ public class TestGenericObj { @ParameterizedTest @MethodSource public void genericObj(ObjType realType, long id, Obj realObj) throws Exception { - var mapper = new ObjectMapper().findAndRegisterModules(); + var mapper = + JsonMapper.builder() + .findAndAddModules() + .disable(FAIL_ON_UNKNOWN_PROPERTIES) + .enable(DEFAULT_VIEW_INCLUSION) + .build(); // Use some view to exclude the type,id,createdAtMicros,versionToken attributes from being // serialized by Jackson. var writerAllAttributes = mapper.writer(); diff --git a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestObjRef.java b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestObjRef.java index bd8390bfde..0a47addc1c 100644 --- a/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestObjRef.java +++ b/persistence/nosql/persistence/api/src/test/java/org/apache/polaris/persistence/nosql/api/obj/TestObjRef.java @@ -23,6 +23,7 @@ import static org.apache.polaris.persistence.nosql.api.obj.ObjRef.objRef; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.dataformat.smile.databind.SmileMapper; import java.nio.ByteBuffer; import java.util.Base64; @@ -46,8 +47,8 @@ public class TestObjRef { @BeforeEach protected void setUp() { - mapper = new ObjectMapper(); - smile = new SmileMapper(); + mapper = JsonMapper.builder().build(); + smile = SmileMapper.builder().build(); } @Test diff --git a/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationReceiver.java b/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationReceiver.java index d106043fc2..6a717111c0 100644 --- a/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationReceiver.java +++ b/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationReceiver.java @@ -22,6 +22,7 @@ import static java.util.Collections.emptyList; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import io.quarkus.vertx.http.ManagementInterface; import io.vertx.ext.web.RoutingContext; import jakarta.enterprise.context.ApplicationScoped; @@ -70,9 +71,10 @@ class CacheInvalidationReceiver { this.validTokens = new HashSet<>(storeConfig.cacheInvalidationValidTokens().orElse(emptyList())); this.objectMapper = - new ObjectMapper() + JsonMapper.builder() // forward compatibility - .disable(FAIL_ON_UNKNOWN_PROPERTIES); + .disable(FAIL_ON_UNKNOWN_PROPERTIES) + .build(); } void registerManagementRoutes(@Observes ManagementInterface mi) { diff --git a/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationSender.java b/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationSender.java index b23731712c..3d10a91b02 100644 --- a/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationSender.java +++ b/persistence/nosql/persistence/cdi/quarkus-distcache/src/main/java/org/apache/polaris/persistence/nosql/quarkus/distcache/CacheInvalidationSender.java @@ -31,6 +31,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.google.common.annotations.VisibleForTesting; import io.quarkus.runtime.Startup; import io.vertx.core.Future; @@ -85,7 +86,7 @@ class CacheInvalidationSender implements DistributedCacheInvalidation.Sender { private final String invalidationUri; private final long requestTimeout; - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = JsonMapper.builder().build(); private final Lock lock = new ReentrantLock(); private final int batchSize; private final BlockingQueue invalidations = new LinkedBlockingQueue<>(); diff --git a/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/PersistenceImplementation.java b/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/PersistenceImplementation.java index eff4a17ef2..9155d9456d 100644 --- a/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/PersistenceImplementation.java +++ b/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/PersistenceImplementation.java @@ -18,6 +18,8 @@ */ package org.apache.polaris.persistence.nosql.impl; +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; +import static com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static java.lang.String.format; @@ -28,7 +30,6 @@ import static org.apache.polaris.persistence.nosql.api.obj.ObjTypes.objTypeById; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream; @@ -77,9 +78,11 @@ */ public final class PersistenceImplementation implements Persistence { private static final ObjectMapper SMILE_MAPPER = - new SmileMapper() - .findAndRegisterModules() - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + SmileMapper.builder() + .findAndAddModules() + .disable(FAIL_ON_UNKNOWN_PROPERTIES) + .enable(DEFAULT_VIEW_INCLUSION) + .build(); private static final ObjectWriter OBJ_WRITER = SMILE_MAPPER.writer().withView(Obj.StorageView.class); diff --git a/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/cache/CaffeineCacheBackend.java b/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/cache/CaffeineCacheBackend.java index b38959b610..992a834221 100644 --- a/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/cache/CaffeineCacheBackend.java +++ b/persistence/nosql/persistence/impl/src/main/java/org/apache/polaris/persistence/nosql/impl/cache/CaffeineCacheBackend.java @@ -18,6 +18,8 @@ */ package org.apache.polaris.persistence.nosql.impl.cache; +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; +import static com.fasterxml.jackson.databind.MapperFeature.DEFAULT_VIEW_INCLUSION; import static com.google.common.base.Preconditions.checkState; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.concurrent.TimeUnit.MICROSECONDS; @@ -39,7 +41,6 @@ import static org.apache.polaris.persistence.varint.VarInt.varIntLen; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.dataformat.smile.databind.SmileMapper; @@ -699,9 +700,11 @@ Reference getReference() { static final int CAFFEINE_OBJ_OVERHEAD = 2 * 32; static final ObjectMapper SMILE_MAPPER = - new SmileMapper() - .findAndRegisterModules() - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + SmileMapper.builder() + .findAndAddModules() + .disable(FAIL_ON_UNKNOWN_PROPERTIES) + .enable(DEFAULT_VIEW_INCLUSION) + .build(); private static final ObjectWriter OBJ_WRITER = SMILE_MAPPER.writer().withView(Object.class); static byte[] serializeObj(Obj obj) { diff --git a/persistence/nosql/persistence/metastore-types/src/main/java/org/apache/polaris/persistence/nosql/coretypes/changes/ChangeSerializer.java b/persistence/nosql/persistence/metastore-types/src/main/java/org/apache/polaris/persistence/nosql/coretypes/changes/ChangeSerializer.java index 3ed209d76e..c7ef86557a 100644 --- a/persistence/nosql/persistence/metastore-types/src/main/java/org/apache/polaris/persistence/nosql/coretypes/changes/ChangeSerializer.java +++ b/persistence/nosql/persistence/metastore-types/src/main/java/org/apache/polaris/persistence/nosql/coretypes/changes/ChangeSerializer.java @@ -47,9 +47,10 @@ */ final class ChangeSerializer implements IndexValueSerializer { static ObjectMapper MAPPER = - new SmileMapper() - .findAndRegisterModules() - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + SmileMapper.builder() + .findAndAddModules() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .build(); @Override public int serializedSize(@Nullable Change value) { diff --git a/persistence/nosql/persistence/metastore-types/src/test/java/org/apache/polaris/persistence/nosql/coretypes/mapping/BaseTestMapping.java b/persistence/nosql/persistence/metastore-types/src/test/java/org/apache/polaris/persistence/nosql/coretypes/mapping/BaseTestMapping.java index 9397e2b68c..bad9e3aff3 100644 --- a/persistence/nosql/persistence/metastore-types/src/test/java/org/apache/polaris/persistence/nosql/coretypes/mapping/BaseTestMapping.java +++ b/persistence/nosql/persistence/metastore-types/src/test/java/org/apache/polaris/persistence/nosql/coretypes/mapping/BaseTestMapping.java @@ -29,6 +29,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import java.io.IOException; import java.time.Instant; import java.util.HashMap; @@ -73,7 +74,7 @@ public abstract class BaseTestMapping { @BeforeAll public static void beforeAll() { - objectMapper = new ObjectMapper().findAndRegisterModules(); + objectMapper = JsonMapper.builder().findAndAddModules().build(); } public BaseMapping mapping; diff --git a/polaris-core/src/main/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpo.java b/polaris-core/src/main/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpo.java index 555a4008d0..85d32de5e2 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpo.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpo.java @@ -26,6 +26,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; import java.net.MalformedURLException; @@ -123,9 +124,13 @@ public AuthenticationParametersDpo getAuthenticationParameters() { private static final ObjectMapper DEFAULT_MAPPER; static { - DEFAULT_MAPPER = new ObjectMapper(); - DEFAULT_MAPPER.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL); - DEFAULT_MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + DEFAULT_MAPPER = + JsonMapper.builder() + .defaultPropertyInclusion( + JsonInclude.Value.construct( + JsonInclude.Include.NON_NULL, JsonInclude.Include.NON_NULL)) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); } public String serialize() { diff --git a/polaris-core/src/main/java/org/apache/polaris/core/entity/PolarisEvent.java b/polaris-core/src/main/java/org/apache/polaris/core/entity/PolarisEvent.java index 424ffa9167..9c5a8d1b7e 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/entity/PolarisEvent.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/entity/PolarisEvent.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import jakarta.annotation.Nullable; import java.util.Map; @@ -31,7 +32,7 @@ public class PolarisEvent { // to serialize/deserialize properties // TODO: Look into using the CDI-managed `ObjectMapper` object - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builder().build(); // catalog id private final String catalogId; diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisObjectMapperUtil.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisObjectMapperUtil.java index f89bee358d..6f805b030e 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisObjectMapperUtil.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisObjectMapperUtil.java @@ -25,6 +25,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import jakarta.annotation.Nullable; import java.io.IOException; import java.util.Map; @@ -42,7 +43,7 @@ public final class PolarisObjectMapperUtil { private static final ObjectMapper MAPPER = configureMapper(); private static ObjectMapper configureMapper() { - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false); RESTSerializers.registerAll(mapper); return mapper; diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/bootstrap/RootCredentialsSet.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/bootstrap/RootCredentialsSet.java index 082d1c2b95..d1a2d8e259 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/bootstrap/RootCredentialsSet.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/bootstrap/RootCredentialsSet.java @@ -25,7 +25,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.base.Strings; @@ -151,9 +151,8 @@ static RootCredentialsSet fromUri(URI uri) { } private static RootCredentialsSet fromInputStream(InputStream in) throws IOException { - YAMLFactory factory = new YAMLFactory(); - ObjectMapper mapper = new ObjectMapper(factory).configure(FAIL_ON_UNKNOWN_PROPERTIES, false); - try (var parser = factory.createParser(in)) { + ObjectMapper mapper = YAMLMapper.builder().configure(FAIL_ON_UNKNOWN_PROPERTIES, false).build(); + try (var parser = mapper.createParser(in)) { var values = mapper.readValues(parser, RootCredentialsSet.class); var builder = ImmutableRootCredentialsSet.builder(); while (values.hasNext()) { diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/pagination/PageTokenUtil.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/pagination/PageTokenUtil.java index 0b62551928..68c389cb99 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/pagination/PageTokenUtil.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/pagination/PageTokenUtil.java @@ -44,7 +44,8 @@ final class PageTokenUtil { - private static final ObjectMapper SMILE_MAPPER = new SmileMapper().findAndRegisterModules(); + private static final ObjectMapper SMILE_MAPPER = + SmileMapper.builder().findAndAddModules().build(); /** Constant for {@link PageToken#readEverything()}. */ static final PageToken READ_EVERYTHING = diff --git a/polaris-core/src/main/java/org/apache/polaris/core/policy/PolarisPolicyMappingRecord.java b/polaris-core/src/main/java/org/apache/polaris/core/policy/PolarisPolicyMappingRecord.java index 2d3ccb5787..e5acfad0c6 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/policy/PolarisPolicyMappingRecord.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/policy/PolarisPolicyMappingRecord.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -30,7 +31,7 @@ public class PolarisPolicyMappingRecord { // to serialize/deserialize properties public static final String EMPTY_MAP_STRING = "{}"; - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builder().build(); // id of the catalog where target entity resides private long targetCatalogId; diff --git a/polaris-core/src/main/java/org/apache/polaris/core/policy/content/PolicyContentUtil.java b/polaris-core/src/main/java/org/apache/polaris/core/policy/content/PolicyContentUtil.java index 2ba025a663..e23f082e20 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/policy/content/PolicyContentUtil.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/policy/content/PolicyContentUtil.java @@ -20,12 +20,13 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; public class PolicyContentUtil { public static final ObjectMapper MAPPER = configureMapper(); private static ObjectMapper configureMapper() { - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); // Fails if a required field (in the constructor) is missing mapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true); // Fails if a required field is present but explicitly null, e.g., {"enable": null} diff --git a/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java b/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java index 8edc8380d5..930da1fb64 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java @@ -26,6 +26,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import jakarta.annotation.Nonnull; import java.util.ArrayList; import java.util.Collections; @@ -87,9 +88,13 @@ public boolean validatePrefix() { private static final ObjectMapper DEFAULT_MAPPER; static { - DEFAULT_MAPPER = new ObjectMapper(); - DEFAULT_MAPPER.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL); - DEFAULT_MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + DEFAULT_MAPPER = + JsonMapper.builder() + .defaultPropertyInclusion( + JsonInclude.Value.construct( + JsonInclude.Include.NON_NULL, JsonInclude.Include.NON_NULL)) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); } public String serialize() { diff --git a/polaris-core/src/main/java/org/apache/polaris/core/storage/gcp/GcpCredentialsStorageIntegration.java b/polaris-core/src/main/java/org/apache/polaris/core/storage/gcp/GcpCredentialsStorageIntegration.java index 427f715c14..b18641f628 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/storage/gcp/GcpCredentialsStorageIntegration.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/storage/gcp/GcpCredentialsStorageIntegration.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.google.api.gax.core.FixedCredentialsProvider; import com.google.auth.http.HttpTransportFactory; import com.google.auth.oauth2.AccessToken; @@ -69,6 +70,8 @@ public class GcpCredentialsStorageIntegration public static final String IMPERSONATION_SCOPE = "https://www.googleapis.com/auth/devstorage.read_write"; + private static final ObjectMapper OBJECT_MAPPER = JsonMapper.builder().build(); + private final GoogleCredentials sourceCredentials; private final HttpTransportFactory transportFactory; @@ -181,7 +184,7 @@ private GoogleCredentials createImpersonatedCredentials( private String convertToString(CredentialAccessBoundary accessBoundary) { try { - return new ObjectMapper().writeValueAsString(accessBoundary); + return OBJECT_MAPPER.writeValueAsString(accessBoundary); } catch (JsonProcessingException e) { LOGGER.warn("Unable to convert access boundary to json", e); return Objects.toString(accessBoundary); diff --git a/polaris-core/src/test/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpoTest.java b/polaris-core/src/test/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpoTest.java index 5d8dbc7d48..1ba01b730e 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpoTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/connection/ConnectionConfigInfoDpoTest.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import java.util.Optional; import org.apache.polaris.core.admin.model.AwsIamServiceIdentityInfo; import org.apache.polaris.core.admin.model.ConnectionConfigInfo; @@ -34,7 +35,7 @@ import org.mockito.Mockito; public class ConnectionConfigInfoDpoTest { - private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final ObjectMapper objectMapper = JsonMapper.builder().build(); static { objectMapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); diff --git a/polaris-core/src/test/java/org/apache/polaris/core/secrets/UserSecretsManagerBaseTest.java b/polaris-core/src/test/java/org/apache/polaris/core/secrets/UserSecretsManagerBaseTest.java index 287a885b40..21949c48e7 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/secrets/UserSecretsManagerBaseTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/secrets/UserSecretsManagerBaseTest.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import org.apache.polaris.core.entity.CatalogEntity; import org.apache.polaris.core.entity.PolarisEntity; import org.assertj.core.api.Assertions; @@ -30,7 +31,7 @@ * implementation-specific unittests. */ public abstract class UserSecretsManagerBaseTest { - private static final ObjectMapper DEFAULT_MAPPER = new ObjectMapper(); + private static final ObjectMapper DEFAULT_MAPPER = JsonMapper.builder().build(); /** * @return a fresh instance of a UserSecretsManager to use in test cases. diff --git a/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisStorageConfigurationInfoTest.java b/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisStorageConfigurationInfoTest.java index 865cff17eb..35d4ed8090 100644 --- a/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisStorageConfigurationInfoTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/service/storage/PolarisStorageConfigurationInfoTest.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import java.util.stream.Stream; import org.apache.polaris.core.storage.FileStorageConfigurationInfo; import org.apache.polaris.core.storage.PolarisStorageConfigurationInfo; @@ -46,7 +47,7 @@ public class PolarisStorageConfigurationInfoTest { @BeforeAll public static void setup() { - mapper = new ObjectMapper(); + mapper = JsonMapper.builder().build(); } @ParameterizedTest diff --git a/polaris-core/src/test/java/org/apache/polaris/service/storage/gcp/GcpCredentialsStorageIntegrationTest.java b/polaris-core/src/test/java/org/apache/polaris/service/storage/gcp/GcpCredentialsStorageIntegrationTest.java index 145b803190..0e83090d9c 100644 --- a/polaris-core/src/test/java/org/apache/polaris/service/storage/gcp/GcpCredentialsStorageIntegrationTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/service/storage/gcp/GcpCredentialsStorageIntegrationTest.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.node.ContainerNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.api.client.http.javanet.NetHttpTransport; @@ -199,7 +200,7 @@ public void testGenerateAccessBoundary() throws IOException { GcpCredentialsStorageIntegration.generateAccessBoundaryRules( true, Set.of("gs://bucket1/path/to/data"), Set.of("gs://bucket1/path/to/data")); assertThat(credentialAccessBoundary).isNotNull(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); JsonNode parsedRules = mapper.convertValue(credentialAccessBoundary, JsonNode.class); JsonNode refRules = readResource(mapper, "gcp-testGenerateAccessBoundary.json"); assertThat(parsedRules) @@ -221,7 +222,7 @@ public void testGenerateAccessBoundaryWithMultipleBuckets() throws IOException { "gs://bucket2/a/super/path/to/data"), Set.of("gs://bucket1/normal/path/to/data")); assertThat(credentialAccessBoundary).isNotNull(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); JsonNode parsedRules = mapper.convertValue(credentialAccessBoundary, JsonNode.class); JsonNode refRules = readResource(mapper, "gcp-testGenerateAccessBoundaryWithMultipleBuckets.json"); @@ -241,7 +242,7 @@ public void testGenerateAccessBoundaryWithoutList() throws IOException { Set.of("gs://bucket1/path/to/data", "gs://bucket1/another/path/to/data"), Set.of("gs://bucket1/path/to/data")); assertThat(credentialAccessBoundary).isNotNull(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); JsonNode parsedRules = mapper.convertValue(credentialAccessBoundary, JsonNode.class); JsonNode refRules = readResource(mapper, "gcp-testGenerateAccessBoundaryWithoutList.json"); assertThat(parsedRules) @@ -260,7 +261,7 @@ public void testGenerateAccessBoundaryWithoutWrites() throws IOException { Set.of("gs://bucket1/normal/path/to/data", "gs://bucket1/awesome/path/to/data"), Set.of()); assertThat(credentialAccessBoundary).isNotNull(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builder().build(); JsonNode parsedRules = mapper.convertValue(credentialAccessBoundary, JsonNode.class); JsonNode refRules = readResource(mapper, "gcp-testGenerateAccessBoundaryWithoutWrites.json"); assertThat(parsedRules) diff --git a/runtime/service/src/main/java/org/apache/polaris/service/config/ProductionReadinessChecks.java b/runtime/service/src/main/java/org/apache/polaris/service/config/ProductionReadinessChecks.java index c1a03a7ab4..f970fe92a8 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/config/ProductionReadinessChecks.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/config/ProductionReadinessChecks.java @@ -20,7 +20,7 @@ import static java.lang.String.format; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.event.Observes; import jakarta.enterprise.event.Startup; @@ -254,7 +254,7 @@ public ProductionReadinessCheck checkInsecureStorageSettings( }); var storageTypes = FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES; - var mapper = new ObjectMapper(); + var mapper = JsonMapper.builder().build(); var defaults = featureConfiguration.parseDefaults(mapper); var realmOverrides = featureConfiguration.parseRealmOverrides(mapper); @SuppressWarnings("unchecked") @@ -329,7 +329,7 @@ public ProductionReadinessCheck checkOverlappingSiblingCheckSettings( public ProductionReadinessCheck checkConnectionCredentialVendors( Instance credentialVendors, FeaturesConfiguration featureConfiguration) { - var mapper = new ObjectMapper(); + var mapper = JsonMapper.builder().build(); var defaults = featureConfiguration.parseDefaults(mapper); var realmOverrides = featureConfiguration.parseRealmOverrides(mapper);