diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/AsyncClientBuilderClass.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/AsyncClientBuilderClass.java index bd0e6023d53e..f8731d7dad07 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/AsyncClientBuilderClass.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/AsyncClientBuilderClass.java @@ -18,12 +18,8 @@ import com.squareup.javapoet.ClassName; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.ParameterizedTypeName; -import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import javax.lang.model.element.Modifier; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider; @@ -36,9 +32,6 @@ import software.amazon.awssdk.codegen.utils.AuthUtils; import software.amazon.awssdk.core.client.config.SdkClientConfiguration; import software.amazon.awssdk.core.client.config.SdkClientOption; -import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; -import software.amazon.awssdk.protocols.query.interceptor.QueryParametersToBodyInterceptor; -import software.amazon.awssdk.utils.CollectionUtils; public class AsyncClientBuilderClass implements ClassSpec { private final IntermediateModel model; @@ -126,53 +119,26 @@ private MethodSpec endpointProviderMethod() { } private MethodSpec buildClientMethod() { - MethodSpec.Builder b = MethodSpec.methodBuilder("buildClient") - .addAnnotation(Override.class) - .addModifiers(Modifier.PROTECTED, Modifier.FINAL) - .returns(clientInterfaceName) - .addStatement("$T clientConfiguration = super.asyncClientConfiguration()", - SdkClientConfiguration.class); - - addQueryProtocolInterceptors(b); - - return b.addStatement("this.validateClientOptions(clientConfiguration)") - .addStatement("$T endpointOverride = null", URI.class) - .addCode("if (clientConfiguration.option($T.ENDPOINT_OVERRIDDEN) != null" - + "&& $T.TRUE.equals(clientConfiguration.option($T.ENDPOINT_OVERRIDDEN))) {" - + "endpointOverride = clientConfiguration.option($T.ENDPOINT);" - + "}", - SdkClientOption.class, Boolean.class, SdkClientOption.class, SdkClientOption.class) - .addStatement("$T serviceClientConfiguration = $T.builder()" - + ".overrideConfiguration(overrideConfiguration())" - + ".region(clientConfiguration.option($T.AWS_REGION))" - + ".endpointOverride(endpointOverride)" - + ".build()", - serviceConfigClassName, serviceConfigClassName, AwsClientOption.class) - .addStatement("return new $T(serviceClientConfiguration, clientConfiguration)", clientClassName) - .build(); - } - - private MethodSpec.Builder addQueryProtocolInterceptors(MethodSpec.Builder b) { - if (!model.getMetadata().isQueryProtocol()) { - return b; - } - - TypeName listType = ParameterizedTypeName.get(List.class, ExecutionInterceptor.class); - - b.addStatement("$T interceptors = clientConfiguration.option($T.EXECUTION_INTERCEPTORS)", - listType, SdkClientOption.class) - .addStatement("$T queryParamsToBodyInterceptor = $T.singletonList(new $T())", - listType, Collections.class, QueryParametersToBodyInterceptor.class) - .addStatement("$T customizationInterceptors = new $T<>()", listType, ArrayList.class); - - List customInterceptors = model.getCustomizationConfig().getInterceptors(); - customInterceptors.forEach(i -> b.addStatement("customizationInterceptors.add(new $T())", ClassName.bestGuess(i))); - - b.addStatement("interceptors = $T.mergeLists(queryParamsToBodyInterceptor, interceptors)", CollectionUtils.class) - .addStatement("interceptors = $T.mergeLists(customizationInterceptors, interceptors)", CollectionUtils.class); - - return b.addStatement("clientConfiguration = clientConfiguration.toBuilder().option($T.EXECUTION_INTERCEPTORS, " - + "interceptors).build()", SdkClientOption.class); + return MethodSpec.methodBuilder("buildClient") + .addAnnotation(Override.class) + .addModifiers(Modifier.PROTECTED, Modifier.FINAL) + .returns(clientInterfaceName) + .addStatement("$T clientConfiguration = super.asyncClientConfiguration()", SdkClientConfiguration.class) + .addStatement("this.validateClientOptions(clientConfiguration)") + .addStatement("$T endpointOverride = null", URI.class) + .addCode("if (clientConfiguration.option($T.ENDPOINT_OVERRIDDEN) != null" + + "&& $T.TRUE.equals(clientConfiguration.option($T.ENDPOINT_OVERRIDDEN))) {" + + "endpointOverride = clientConfiguration.option($T.ENDPOINT);" + + "}", + SdkClientOption.class, Boolean.class, SdkClientOption.class, SdkClientOption.class) + .addStatement("$T serviceClientConfiguration = $T.builder()" + + ".overrideConfiguration(overrideConfiguration())" + + ".region(clientConfiguration.option($T.AWS_REGION))" + + ".endpointOverride(endpointOverride)" + + ".build()", + serviceConfigClassName, serviceConfigClassName, AwsClientOption.class) + .addStatement("return new $T(serviceClientConfiguration, clientConfiguration)", clientClassName) + .build(); } private MethodSpec bearerTokenProviderMethod() { diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClass.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClass.java index 72d534d5ab99..1be4d730040e 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClass.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClass.java @@ -28,6 +28,7 @@ import com.squareup.javapoet.TypeSpec; import com.squareup.javapoet.TypeVariableName; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; @@ -58,6 +59,7 @@ import software.amazon.awssdk.core.signer.Signer; import software.amazon.awssdk.http.Protocol; import software.amazon.awssdk.http.SdkHttpConfigurationOption; +import software.amazon.awssdk.protocols.query.interceptor.QueryParametersToBodyInterceptor; import software.amazon.awssdk.utils.AttributeMap; import software.amazon.awssdk.utils.CollectionUtils; import software.amazon.awssdk.utils.StringUtils; @@ -260,10 +262,8 @@ private MethodSpec finalizeServiceConfigurationMethod() { builtInInterceptors.add(endpointRulesSpecUtils.authSchemesInterceptorName()); builtInInterceptors.add(endpointRulesSpecUtils.requestModifierInterceptorName()); - if (!model.getMetadata().isQueryProtocol()) { - for (String interceptor : model.getCustomizationConfig().getInterceptors()) { - builtInInterceptors.add(ClassName.bestGuess(interceptor)); - } + for (String interceptor : model.getCustomizationConfig().getInterceptors()) { + builtInInterceptors.add(ClassName.bestGuess(interceptor)); } for (ClassName interceptor : builtInInterceptors) { @@ -288,6 +288,16 @@ private MethodSpec finalizeServiceConfigurationMethod() { builder.addCode("interceptors = $T.mergeLists(interceptors, config.option($T.EXECUTION_INTERCEPTORS));\n", CollectionUtils.class, SdkClientOption.class); + if (model.getMetadata().isQueryProtocol()) { + TypeName listType = ParameterizedTypeName.get(List.class, ExecutionInterceptor.class); + builder.addStatement("$T protocolInterceptors = $T.singletonList(new $T())", + listType, + Collections.class, + QueryParametersToBodyInterceptor.class); + builder.addStatement("interceptors = $T.mergeLists(interceptors, protocolInterceptors)", + CollectionUtils.class); + } + if (model.getEndpointOperation().isPresent()) { builder.beginControlFlow("if (!endpointDiscoveryEnabled)") .addStatement("$1T chain = new $1T(config)", DefaultEndpointDiscoveryProviderChain.class) diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/SyncClientBuilderClass.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/SyncClientBuilderClass.java index 8b330e76ce1b..036589de04e8 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/SyncClientBuilderClass.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/SyncClientBuilderClass.java @@ -18,12 +18,8 @@ import com.squareup.javapoet.ClassName; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.ParameterizedTypeName; -import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import javax.lang.model.element.Modifier; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider; @@ -36,9 +32,6 @@ import software.amazon.awssdk.codegen.utils.AuthUtils; import software.amazon.awssdk.core.client.config.SdkClientConfiguration; import software.amazon.awssdk.core.client.config.SdkClientOption; -import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; -import software.amazon.awssdk.protocols.query.interceptor.QueryParametersToBodyInterceptor; -import software.amazon.awssdk.utils.CollectionUtils; public class SyncClientBuilderClass implements ClassSpec { private final IntermediateModel model; @@ -126,53 +119,26 @@ private MethodSpec endpointProviderMethod() { private MethodSpec buildClientMethod() { - MethodSpec.Builder b = MethodSpec.methodBuilder("buildClient") - .addAnnotation(Override.class) - .addModifiers(Modifier.PROTECTED, Modifier.FINAL) - .returns(clientInterfaceName) - .addStatement("$T clientConfiguration = super.syncClientConfiguration()", - SdkClientConfiguration.class); - - addQueryProtocolInterceptors(b); - - return b.addStatement("this.validateClientOptions(clientConfiguration)") - .addStatement("$T endpointOverride = null", URI.class) - .addCode("if (clientConfiguration.option($T.ENDPOINT_OVERRIDDEN) != null" - + "&& $T.TRUE.equals(clientConfiguration.option($T.ENDPOINT_OVERRIDDEN))) {" - + "endpointOverride = clientConfiguration.option($T.ENDPOINT);" - + "}", - SdkClientOption.class, Boolean.class, SdkClientOption.class, SdkClientOption.class) - .addStatement("$T serviceClientConfiguration = $T.builder()" - + ".overrideConfiguration(overrideConfiguration())" - + ".region(clientConfiguration.option($T.AWS_REGION))" - + ".endpointOverride(endpointOverride)" - + ".build()", - serviceConfigClassName, serviceConfigClassName, AwsClientOption.class) - .addStatement("return new $T(serviceClientConfiguration, clientConfiguration)", clientClassName) - .build(); - } - - private MethodSpec.Builder addQueryProtocolInterceptors(MethodSpec.Builder b) { - if (!model.getMetadata().isQueryProtocol()) { - return b; - } - - TypeName listType = ParameterizedTypeName.get(List.class, ExecutionInterceptor.class); - - b.addStatement("$T interceptors = clientConfiguration.option($T.EXECUTION_INTERCEPTORS)", - listType, SdkClientOption.class) - .addStatement("$T queryParamsToBodyInterceptor = $T.singletonList(new $T())", - listType, Collections.class, QueryParametersToBodyInterceptor.class) - .addStatement("$T customizationInterceptors = new $T<>()", listType, ArrayList.class); - - List customInterceptors = model.getCustomizationConfig().getInterceptors(); - customInterceptors.forEach(i -> b.addStatement("customizationInterceptors.add(new $T())", ClassName.bestGuess(i))); - - b.addStatement("interceptors = $T.mergeLists(queryParamsToBodyInterceptor, interceptors)", CollectionUtils.class) - .addStatement("interceptors = $T.mergeLists(customizationInterceptors, interceptors)", CollectionUtils.class); - - return b.addStatement("clientConfiguration = clientConfiguration.toBuilder().option($T.EXECUTION_INTERCEPTORS, " - + "interceptors).build()", SdkClientOption.class); + return MethodSpec.methodBuilder("buildClient") + .addAnnotation(Override.class) + .addModifiers(Modifier.PROTECTED, Modifier.FINAL) + .returns(clientInterfaceName) + .addStatement("$T clientConfiguration = super.syncClientConfiguration()", SdkClientConfiguration.class) + .addStatement("this.validateClientOptions(clientConfiguration)") + .addStatement("$T endpointOverride = null", URI.class) + .addCode("if (clientConfiguration.option($T.ENDPOINT_OVERRIDDEN) != null" + + "&& $T.TRUE.equals(clientConfiguration.option($T.ENDPOINT_OVERRIDDEN))) {" + + "endpointOverride = clientConfiguration.option($T.ENDPOINT);" + + "}", + SdkClientOption.class, Boolean.class, SdkClientOption.class, SdkClientOption.class) + .addStatement("$T serviceClientConfiguration = $T.builder()" + + ".overrideConfiguration(overrideConfiguration())" + + ".region(clientConfiguration.option($T.AWS_REGION))" + + ".endpointOverride(endpointOverride)" + + ".build()", + serviceConfigClassName, serviceConfigClassName, AwsClientOption.class) + .addStatement("return new $T(serviceClientConfiguration, clientConfiguration)", clientClassName) + .build(); } private MethodSpec tokenProviderMethodImpl() { diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/internal/QueryProtocolCustomTestInterceptor.java b/codegen/src/test/java/software/amazon/awssdk/codegen/internal/QueryProtocolCustomTestInterceptor.java deleted file mode 100644 index 6bd5206d9b11..000000000000 --- a/codegen/src/test/java/software/amazon/awssdk/codegen/internal/QueryProtocolCustomTestInterceptor.java +++ /dev/null @@ -1,12 +0,0 @@ -package software.amazon.awssdk.codegen.internal; - -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.codegen.poet.builder.BuilderClassTest; - -/** - * Empty no-op test interceptor for query protocols to view generated code in test-query-sync-client-builder-class.java and - * test-query-async-client-builder-class.java and validate in {@link BuilderClassTest}. - */ -@SdkInternalApi -public class QueryProtocolCustomTestInterceptor { -} diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/builder/BuilderClassTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/builder/BuilderClassTest.java index 3edafd55dab3..b111e47bf3c0 100644 --- a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/builder/BuilderClassTest.java +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/builder/BuilderClassTest.java @@ -58,16 +58,6 @@ public void baseQueryClientBuilderClass() throws Exception { validateQueryGeneration(BaseClientBuilderClass::new, "test-query-client-builder-class.java"); } - @Test - public void syncQueryClientBuilderClass() throws Exception { - validateQueryGeneration(SyncClientBuilderClass::new, "test-query-sync-client-builder-class.java"); - } - - @Test - public void asyncQueryClientBuilderClass() throws Exception { - validateQueryGeneration(AsyncClientBuilderClass::new, "test-query-async-client-builder-class.java"); - } - @Test public void syncClientBuilderInterface() throws Exception { validateGeneration(SyncClientBuilderInterface::new, "test-sync-client-builder-interface.java"); diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-query-async-client-builder-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-query-async-client-builder-class.java deleted file mode 100644 index f71429db299c..000000000000 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-query-async-client-builder-class.java +++ /dev/null @@ -1,61 +0,0 @@ -package software.amazon.awssdk.services.query; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import software.amazon.awssdk.annotations.Generated; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider; -import software.amazon.awssdk.awscore.client.config.AwsClientOption; -import software.amazon.awssdk.codegen.internal.QueryProtocolCustomTestInterceptor; -import software.amazon.awssdk.core.client.config.SdkClientConfiguration; -import software.amazon.awssdk.core.client.config.SdkClientOption; -import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; -import software.amazon.awssdk.protocols.query.interceptor.QueryParametersToBodyInterceptor; -import software.amazon.awssdk.services.query.endpoints.QueryEndpointProvider; -import software.amazon.awssdk.utils.CollectionUtils; - -/** - * Internal implementation of {@link QueryAsyncClientBuilder}. - */ -@Generated("software.amazon.awssdk:codegen") -@SdkInternalApi -final class DefaultQueryAsyncClientBuilder extends DefaultQueryBaseClientBuilder - implements QueryAsyncClientBuilder { - @Override - public DefaultQueryAsyncClientBuilder endpointProvider(QueryEndpointProvider endpointProvider) { - clientConfiguration.option(SdkClientOption.ENDPOINT_PROVIDER, endpointProvider); - return this; - } - - @Override - public DefaultQueryAsyncClientBuilder tokenProvider(SdkTokenProvider tokenProvider) { - clientConfiguration.option(AwsClientOption.TOKEN_PROVIDER, tokenProvider); - return this; - } - - @Override - protected final QueryAsyncClient buildClient() { - SdkClientConfiguration clientConfiguration = super.asyncClientConfiguration(); - List interceptors = clientConfiguration.option(SdkClientOption.EXECUTION_INTERCEPTORS); - List queryParamsToBodyInterceptor = Collections - .singletonList(new QueryParametersToBodyInterceptor()); - List customizationInterceptors = new ArrayList<>(); - customizationInterceptors.add(new QueryProtocolCustomTestInterceptor()); - interceptors = CollectionUtils.mergeLists(queryParamsToBodyInterceptor, interceptors); - interceptors = CollectionUtils.mergeLists(customizationInterceptors, interceptors); - clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.EXECUTION_INTERCEPTORS, interceptors) - .build(); - this.validateClientOptions(clientConfiguration); - URI endpointOverride = null; - if (clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN) != null - && Boolean.TRUE.equals(clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN))) { - endpointOverride = clientConfiguration.option(SdkClientOption.ENDPOINT); - } - QueryServiceClientConfiguration serviceClientConfiguration = QueryServiceClientConfiguration.builder() - .overrideConfiguration(overrideConfiguration()).region(clientConfiguration.option(AwsClientOption.AWS_REGION)) - .endpointOverride(endpointOverride).build(); - return new DefaultQueryAsyncClient(serviceClientConfiguration, clientConfiguration); - } -} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-query-client-builder-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-query-client-builder-class.java index e1b5cf7bf055..141b27f6cfe0 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-query-client-builder-class.java +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-query-client-builder-class.java @@ -1,6 +1,7 @@ package software.amazon.awssdk.services.query; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import software.amazon.awssdk.annotations.Generated; import software.amazon.awssdk.annotations.SdkInternalApi; @@ -16,6 +17,7 @@ import software.amazon.awssdk.core.interceptor.ClasspathInterceptorChainFactory; import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; import software.amazon.awssdk.core.signer.Signer; +import software.amazon.awssdk.protocols.query.interceptor.QueryParametersToBodyInterceptor; import software.amazon.awssdk.services.query.endpoints.QueryClientContextParams; import software.amazon.awssdk.services.query.endpoints.QueryEndpointProvider; import software.amazon.awssdk.services.query.endpoints.internal.QueryEndpointAuthSchemeInterceptor; @@ -62,6 +64,8 @@ protected final SdkClientConfiguration finalizeServiceConfiguration(SdkClientCon interceptors = CollectionUtils.mergeLists(endpointInterceptors, interceptors); interceptors = CollectionUtils.mergeLists(interceptors, additionalInterceptors); interceptors = CollectionUtils.mergeLists(interceptors, config.option(SdkClientOption.EXECUTION_INTERCEPTORS)); + List protocolInterceptors = Collections.singletonList(new QueryParametersToBodyInterceptor()); + interceptors = CollectionUtils.mergeLists(interceptors, protocolInterceptors); return config.toBuilder().option(SdkClientOption.EXECUTION_INTERCEPTORS, interceptors) .option(SdkClientOption.CLIENT_CONTEXT_PARAMS, clientContextParams.build()).build(); } diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-query-sync-client-builder-class.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-query-sync-client-builder-class.java deleted file mode 100644 index 56b94d1d3189..000000000000 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-query-sync-client-builder-class.java +++ /dev/null @@ -1,61 +0,0 @@ -package software.amazon.awssdk.services.query; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import software.amazon.awssdk.annotations.Generated; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider; -import software.amazon.awssdk.awscore.client.config.AwsClientOption; -import software.amazon.awssdk.codegen.internal.QueryProtocolCustomTestInterceptor; -import software.amazon.awssdk.core.client.config.SdkClientConfiguration; -import software.amazon.awssdk.core.client.config.SdkClientOption; -import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; -import software.amazon.awssdk.protocols.query.interceptor.QueryParametersToBodyInterceptor; -import software.amazon.awssdk.services.query.endpoints.QueryEndpointProvider; -import software.amazon.awssdk.utils.CollectionUtils; - -/** - * Internal implementation of {@link QueryClientBuilder}. - */ -@Generated("software.amazon.awssdk:codegen") -@SdkInternalApi -final class DefaultQueryClientBuilder extends DefaultQueryBaseClientBuilder implements - QueryClientBuilder { - @Override - public DefaultQueryClientBuilder endpointProvider(QueryEndpointProvider endpointProvider) { - clientConfiguration.option(SdkClientOption.ENDPOINT_PROVIDER, endpointProvider); - return this; - } - - @Override - public DefaultQueryClientBuilder tokenProvider(SdkTokenProvider tokenProvider) { - clientConfiguration.option(AwsClientOption.TOKEN_PROVIDER, tokenProvider); - return this; - } - - @Override - protected final QueryClient buildClient() { - SdkClientConfiguration clientConfiguration = super.syncClientConfiguration(); - List interceptors = clientConfiguration.option(SdkClientOption.EXECUTION_INTERCEPTORS); - List queryParamsToBodyInterceptor = Collections - .singletonList(new QueryParametersToBodyInterceptor()); - List customizationInterceptors = new ArrayList<>(); - customizationInterceptors.add(new QueryProtocolCustomTestInterceptor()); - interceptors = CollectionUtils.mergeLists(queryParamsToBodyInterceptor, interceptors); - interceptors = CollectionUtils.mergeLists(customizationInterceptors, interceptors); - clientConfiguration = clientConfiguration.toBuilder().option(SdkClientOption.EXECUTION_INTERCEPTORS, interceptors) - .build(); - this.validateClientOptions(clientConfiguration); - URI endpointOverride = null; - if (clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN) != null - && Boolean.TRUE.equals(clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN))) { - endpointOverride = clientConfiguration.option(SdkClientOption.ENDPOINT); - } - QueryServiceClientConfiguration serviceClientConfiguration = QueryServiceClientConfiguration.builder() - .overrideConfiguration(overrideConfiguration()).region(clientConfiguration.option(AwsClientOption.AWS_REGION)) - .endpointOverride(endpointOverride).build(); - return new DefaultQueryClient(serviceClientConfiguration, clientConfiguration); - } -} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/query/customization.config b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/query/customization.config index 18824fa00a30..c95b6d2e5f63 100644 --- a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/query/customization.config +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/client/c2j/query/customization.config @@ -2,10 +2,7 @@ "authPolicyActions" : { "skip" : true }, - "skipEndpointTests": { + "skipEndpointTests": { "test case 4": "Does not work" - }, - "interceptors": [ - "software.amazon.awssdk.codegen.internal.QueryProtocolCustomTestInterceptor" - ] + } } \ No newline at end of file diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/protocolquery/MoveQueryParamsToBodyTest.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/protocolquery/MoveQueryParamsToBodyTest.java new file mode 100644 index 000000000000..7f2b32fa668c --- /dev/null +++ b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/protocolquery/MoveQueryParamsToBodyTest.java @@ -0,0 +1,102 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.services.protocolquery; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.util.Optional; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.core.interceptor.Context; +import software.amazon.awssdk.core.interceptor.ExecutionAttributes; +import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; +import software.amazon.awssdk.http.ContentStreamProvider; +import software.amazon.awssdk.http.ExecutableHttpRequest; +import software.amazon.awssdk.http.HttpExecuteRequest; +import software.amazon.awssdk.http.SdkHttpClient; +import software.amazon.awssdk.http.SdkHttpRequest; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.utils.IoUtils; + +public class MoveQueryParamsToBodyTest { + private static final AwsCredentialsProvider CREDENTIALS = StaticCredentialsProvider.create(AwsBasicCredentials.create("akid", "skid")); + + private SdkHttpClient mockHttpClient; + + private ProtocolQueryClient client; + + @BeforeEach + public void setup() throws IOException { + mockHttpClient = mock(SdkHttpClient.class); + ExecutableHttpRequest mockRequest = mock(ExecutableHttpRequest.class); + when(mockRequest.call()).thenThrow(new IOException("IO error!")); + when(mockHttpClient.prepareRequest(any())).thenReturn(mockRequest); + } + + @AfterEach + public void teardown() { + if (client != null) { + client.close(); + } + client = null; + } + + @Test + public void customInterceptor_additionalQueryParamsAdded_paramsAlsoMovedToBody() throws IOException { + client = ProtocolQueryClient.builder() + .overrideConfiguration(o -> o.addExecutionInterceptor(new AdditionalQueryParamInterceptor())) + .region(Region.US_WEST_2) + .credentialsProvider(CREDENTIALS) + .httpClient(mockHttpClient) + .build(); + + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(HttpExecuteRequest.class); + + assertThatThrownBy(() -> client.membersInQueryParams(r -> r.stringQueryParam("hello"))) + .isInstanceOf(SdkClientException.class) + .hasMessageContaining("IO"); + + verify(mockHttpClient, atLeast(1)).prepareRequest(requestCaptor.capture()); + + ContentStreamProvider requestContent = requestCaptor.getValue().contentStreamProvider().get(); + + String contentString = IoUtils.toUtf8String(requestContent.newStream()); + + assertThat(contentString).contains("CustomParamName=CustomParamValue"); + } + + private static class AdditionalQueryParamInterceptor implements ExecutionInterceptor { + @Override + public SdkHttpRequest modifyHttpRequest(Context.ModifyHttpRequest context, ExecutionAttributes executionAttributes) { + return context.httpRequest().toBuilder() + .putRawQueryParameter("CustomParamName", "CustomParamValue") + .build(); + } + } +}