diff --git a/trino-aws-proxy-spi/pom.xml b/trino-aws-proxy-spi/pom.xml index a70a3af7..3e01ff6c 100644 --- a/trino-aws-proxy-spi/pom.xml +++ b/trino-aws-proxy-spi/pom.xml @@ -14,6 +14,11 @@ + + com.fasterxml.jackson.core + jackson-databind + + com.google.guava guava diff --git a/trino-aws-proxy-spi/src/main/java/io/trino/aws/proxy/spi/plugin/TrinoAwsProxyServerBinding.java b/trino-aws-proxy-spi/src/main/java/io/trino/aws/proxy/spi/plugin/TrinoAwsProxyServerBinding.java index f8f8bf1b..8d180231 100644 --- a/trino-aws-proxy-spi/src/main/java/io/trino/aws/proxy/spi/plugin/TrinoAwsProxyServerBinding.java +++ b/trino-aws-proxy-spi/src/main/java/io/trino/aws/proxy/spi/plugin/TrinoAwsProxyServerBinding.java @@ -13,6 +13,7 @@ */ package io.trino.aws.proxy.spi.plugin; +import com.fasterxml.jackson.databind.module.SimpleModule; import com.google.inject.Binder; import com.google.inject.Module; import com.google.inject.Scopes; @@ -27,6 +28,7 @@ import io.trino.aws.proxy.spi.plugin.config.S3SecurityFacadeProviderConfig; import io.trino.aws.proxy.spi.security.S3SecurityFacadeProvider; +import static com.google.inject.multibindings.Multibinder.newSetBinder; import static com.google.inject.multibindings.OptionalBinder.newOptionalBinder; import static io.airlift.configuration.ConditionalModule.conditionalModule; import static io.airlift.configuration.ConfigurationAwareModule.combine; @@ -56,6 +58,8 @@ static void bindIdentityType(Binder binder, Class type) log.info("Using %s identity type", type.getSimpleName()); return type; }); + newSetBinder(binder, com.fasterxml.jackson.databind.Module.class).addBinding() + .toInstance(new SimpleModule().addAbstractTypeMapping(Identity.class, type)); } static Module optionalPluginModule( diff --git a/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/file/FileBasedCredentialsModule.java b/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/file/FileBasedCredentialsModule.java index ad897365..1b9beffb 100644 --- a/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/file/FileBasedCredentialsModule.java +++ b/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/file/FileBasedCredentialsModule.java @@ -15,8 +15,10 @@ import com.google.inject.Binder; import io.airlift.configuration.AbstractConfigurationAwareModule; +import io.trino.aws.proxy.spi.credentials.Credentials; import static io.airlift.configuration.ConfigBinder.configBinder; +import static io.airlift.json.JsonCodecBinder.jsonCodecBinder; import static io.trino.aws.proxy.spi.plugin.TrinoAwsProxyServerBinding.credentialsProviderModule; public class FileBasedCredentialsModule @@ -34,6 +36,7 @@ protected void setup(Binder binder) innerBinder -> { configBinder(innerBinder).bindConfig(FileBasedCredentialsProviderConfig.class); innerBinder.bind(FileBasedCredentialsProvider.class); + jsonCodecBinder(innerBinder).bindListJsonCodec(Credentials.class); })); } } diff --git a/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/file/FileBasedCredentialsProvider.java b/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/file/FileBasedCredentialsProvider.java index 1ceb16e1..44a180da 100644 --- a/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/file/FileBasedCredentialsProvider.java +++ b/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/file/FileBasedCredentialsProvider.java @@ -13,18 +13,14 @@ */ package io.trino.aws.proxy.server.credentials.file; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; +import com.google.common.io.Files; import com.google.inject.Inject; +import io.airlift.json.JsonCodec; import io.trino.aws.proxy.spi.credentials.Credentials; import io.trino.aws.proxy.spi.credentials.CredentialsProvider; -import io.trino.aws.proxy.spi.credentials.Identity; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.io.UncheckedIOException; import java.util.List; import java.util.Map; @@ -40,18 +36,17 @@ public class FileBasedCredentialsProvider private final Map credentialsStore; @Inject - public FileBasedCredentialsProvider(FileBasedCredentialsProviderConfig config, ObjectMapper objectMapper, Class identityClass) + public FileBasedCredentialsProvider(FileBasedCredentialsProviderConfig config, JsonCodec> jsonCodec) { requireNonNull(config, "Config is null"); - objectMapper = objectMapper.registerModule(new SimpleModule().addAbstractTypeMapping(Identity.class, identityClass)); - this.credentialsStore = buildCredentialsMap(config.getCredentialsFile(), objectMapper); + this.credentialsStore = buildCredentialsMap(config.getCredentialsFile(), jsonCodec); } - private Map buildCredentialsMap(File credentialsFile, ObjectMapper objectMapper) + private Map buildCredentialsMap(File credentialsFile, JsonCodec> jsonCodec) { List credentialsList; - try (InputStream inputStream = new FileInputStream(credentialsFile)) { - credentialsList = objectMapper.readValue(inputStream, new TypeReference<>() {}); + try { + credentialsList = jsonCodec.fromJson(Files.toByteArray(credentialsFile)); } catch (IOException e) { throw new UncheckedIOException("Failed to read credentials file", e); diff --git a/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/http/HttpCredentialsModule.java b/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/http/HttpCredentialsModule.java index bd7b749c..2d4a17c9 100644 --- a/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/http/HttpCredentialsModule.java +++ b/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/http/HttpCredentialsModule.java @@ -15,9 +15,11 @@ import com.google.inject.Binder; import io.airlift.configuration.AbstractConfigurationAwareModule; +import io.trino.aws.proxy.spi.credentials.Credentials; import static io.airlift.configuration.ConfigBinder.configBinder; import static io.airlift.http.client.HttpClientBinder.httpClientBinder; +import static io.airlift.json.JsonCodecBinder.jsonCodecBinder; import static io.trino.aws.proxy.spi.plugin.TrinoAwsProxyServerBinding.credentialsProviderModule; public class HttpCredentialsModule @@ -37,6 +39,7 @@ protected void setup(Binder binder) configBinder(innerBinder).bindConfig(HttpCredentialsProviderConfig.class); innerBinder.bind(HttpCredentialsProvider.class); httpClientBinder(innerBinder).bindHttpClient(HTTP_CREDENTIALS_PROVIDER_HTTP_CLIENT_NAME, ForHttpCredentialsProvider.class); + jsonCodecBinder(innerBinder).bindJsonCodec(Credentials.class); })); } } diff --git a/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/http/HttpCredentialsProvider.java b/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/http/HttpCredentialsProvider.java index 3255b9e7..f4f8aa22 100644 --- a/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/http/HttpCredentialsProvider.java +++ b/trino-aws-proxy/src/main/java/io/trino/aws/proxy/server/credentials/http/HttpCredentialsProvider.java @@ -13,18 +13,14 @@ */ package io.trino.aws.proxy.server.credentials.http; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; import com.google.inject.Inject; import io.airlift.http.client.FullJsonResponseHandler.JsonResponse; import io.airlift.http.client.HttpClient; import io.airlift.http.client.HttpStatus; import io.airlift.http.client.Request; import io.airlift.json.JsonCodec; -import io.airlift.json.JsonCodecFactory; import io.trino.aws.proxy.spi.credentials.Credentials; import io.trino.aws.proxy.spi.credentials.CredentialsProvider; -import io.trino.aws.proxy.spi.credentials.Identity; import jakarta.ws.rs.core.UriBuilder; import java.net.URI; @@ -42,13 +38,11 @@ public class HttpCredentialsProvider private final URI httpCredentialsProviderEndpoint; @Inject - public HttpCredentialsProvider(@ForHttpCredentialsProvider HttpClient httpClient, HttpCredentialsProviderConfig config, ObjectMapper objectMapper, Class identityClass) + public HttpCredentialsProvider(@ForHttpCredentialsProvider HttpClient httpClient, HttpCredentialsProviderConfig config, JsonCodec jsonCodec) { - requireNonNull(objectMapper, "objectMapper is null"); this.httpClient = requireNonNull(httpClient, "httpClient is null"); this.httpCredentialsProviderEndpoint = config.getEndpoint(); - ObjectMapper adjustedObjectMapper = objectMapper.registerModule(new SimpleModule().addAbstractTypeMapping(Identity.class, identityClass)); - this.jsonCodec = new JsonCodecFactory(() -> adjustedObjectMapper).jsonCodec(Credentials.class); + this.jsonCodec = jsonCodec; } @Override