Skip to content

Expose endpointOverride through ServiceClientConfiguration #3900

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changes/next-release/feature-AWSSDKforJavav2-f449613.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"category": "AWS SDK for Java v2",
"contributor": "",
"type": "feature",
"description": "Exposes endpointOverride in SdkClient through ServiceClientConfiguration"
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeSpec;
import java.net.URI;
import javax.lang.model.element.Modifier;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
Expand Down Expand Up @@ -120,13 +121,21 @@ private MethodSpec endpointProviderMethod() {
private MethodSpec buildClientMethod() {
return MethodSpec.methodBuilder("buildClient")
.addAnnotation(Override.class)
.addModifiers(Modifier.PROTECTED, Modifier.FINAL)
.addModifiers(Modifier.PROTECTED)
.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"
+ "&& clientConfiguration.option($T.ENDPOINT_OVERRIDDEN)) {"
Copy link
Contributor

@millems millems Apr 10, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Boolean.TRUE.equals(clientConfiguration.option($T.ENDPOINT_OVERRIDDEN))?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated

+ "endpointOverride = clientConfiguration.option($T.ENDPOINT);"
+ "}",
SdkClientOption.class, SdkClientOption.class, SdkClientOption.class)
.addStatement("$T serviceClientConfiguration = $T.builder()"
+ ".overrideConfiguration(overrideConfiguration())"
+ ".region(clientConfiguration.option($T.AWS_REGION)).build()",
+ ".region(clientConfiguration.option($T.AWS_REGION))"
+ ".endpointOverride(endpointOverride)"
+ ".build()",
serviceConfigClassName, serviceConfigClassName, AwsClientOption.class)
.addStatement("return new $T(serviceClientConfiguration, clientConfiguration)", clientClassName)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeSpec;
import java.net.URI;
import javax.lang.model.element.Modifier;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
Expand Down Expand Up @@ -120,13 +121,21 @@ private MethodSpec endpointProviderMethod() {
private MethodSpec buildClientMethod() {
return MethodSpec.methodBuilder("buildClient")
.addAnnotation(Override.class)
.addModifiers(Modifier.PROTECTED, Modifier.FINAL)
.addModifiers(Modifier.PROTECTED)
.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"
+ "&& clientConfiguration.option($T.ENDPOINT_OVERRIDDEN)) {"
+ "endpointOverride = clientConfiguration.option($T.ENDPOINT);"
+ "}",
SdkClientOption.class, SdkClientOption.class, SdkClientOption.class)
.addStatement("$T serviceClientConfiguration = $T.builder()"
+ ".overrideConfiguration(overrideConfiguration())"
+ ".region(clientConfiguration.option($T.AWS_REGION)).build()",
+ ".region(clientConfiguration.option($T.AWS_REGION))"
+ ".endpointOverride(endpointOverride)"
+ ".build()",
serviceConfigClassName, serviceConfigClassName, AwsClientOption.class)
.addStatement("return new $T(serviceClientConfiguration, clientConfiguration)", clientClassName)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.TypeSpec;
import java.net.URI;
import software.amazon.awssdk.annotations.SdkPublicApi;
import software.amazon.awssdk.awscore.AwsServiceClientConfiguration;
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
Expand Down Expand Up @@ -89,12 +90,21 @@ private TypeSpec builderInterfaceSpec() {
.returns(className())
.build())
.addMethod(MethodSpec.methodBuilder("region")
.addAnnotation(Override.class)
.addModifiers(PUBLIC, ABSTRACT)
.addParameter(Region.class, "region")
.returns(className().nestedClass("Builder"))
.addJavadoc("Configure the region")
.build())
.addMethod(MethodSpec.methodBuilder("endpointOverride")
.addAnnotation(Override.class)
.addModifiers(PUBLIC, ABSTRACT)
.addParameter(URI.class, "endpointOverride")
.returns(className().nestedClass("Builder"))
.addJavadoc("Configure the endpointOverride")
.build())
.addMethod(MethodSpec.methodBuilder("overrideConfiguration")
.addAnnotation(Override.class)
.addModifiers(PUBLIC, ABSTRACT)
.addParameter(ClientOverrideConfiguration.class, "clientOverrideConfiguration")
.returns(className().nestedClass("Builder"))
Expand Down Expand Up @@ -132,6 +142,14 @@ private TypeSpec builderImplSpec() {
.addStatement("this.overrideConfiguration = clientOverrideConfiguration")
.addStatement("return this")
.build())
.addMethod(MethodSpec.methodBuilder("endpointOverride")
.addAnnotation(Override.class)
.addModifiers(PUBLIC)
.addParameter(URI.class, "endpointOverride")
.returns(className().nestedClass("Builder"))
.addStatement("this.endpointOverride = endpointOverride")
.addStatement("return this")
.build())
.addMethod(MethodSpec.methodBuilder("build")
.addAnnotation(Override.class)
.addModifiers(PUBLIC)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package software.amazon.awssdk.services.json;

import java.net.URI;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
Expand Down Expand Up @@ -28,12 +29,17 @@ public DefaultJsonAsyncClientBuilder tokenProvider(SdkTokenProvider tokenProvide
}

@Override
protected final JsonAsyncClient buildClient() {
protected JsonAsyncClient buildClient() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why remove final?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

intellij suggested to remove it i wasn't sure, added it back

SdkClientConfiguration clientConfiguration = super.asyncClientConfiguration();
this.validateClientOptions(clientConfiguration);
URI endpointOverride = null;
if (clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN) != null
&& clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN)) {
endpointOverride = clientConfiguration.option(SdkClientOption.ENDPOINT);
}
JsonServiceClientConfiguration serviceClientConfiguration = JsonServiceClientConfiguration.builder()
.overrideConfiguration(overrideConfiguration()).region(clientConfiguration.option(AwsClientOption.AWS_REGION))
.build();
.endpointOverride(endpointOverride).build();
return new DefaultJsonAsyncClient(serviceClientConfiguration, clientConfiguration);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package software.amazon.awssdk.services.json;

import java.net.URI;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
Expand Down Expand Up @@ -28,12 +29,17 @@ public DefaultJsonClientBuilder tokenProvider(SdkTokenProvider tokenProvider) {
}

@Override
protected final JsonClient buildClient() {
protected JsonClient buildClient() {
SdkClientConfiguration clientConfiguration = super.syncClientConfiguration();
this.validateClientOptions(clientConfiguration);
URI endpointOverride = null;
if (clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN) != null
&& clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN)) {
endpointOverride = clientConfiguration.option(SdkClientOption.ENDPOINT);
}
JsonServiceClientConfiguration serviceClientConfiguration = JsonServiceClientConfiguration.builder()
.overrideConfiguration(overrideConfiguration()).region(clientConfiguration.option(AwsClientOption.AWS_REGION))
.build();
.endpointOverride(endpointOverride).build();
return new DefaultJsonClient(serviceClientConfiguration, clientConfiguration);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package software.amazon.awssdk.services.jsonprotocoltests;

import java.net.URI;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.annotations.SdkPublicApi;
import software.amazon.awssdk.awscore.AwsServiceClientConfiguration;
Expand Down Expand Up @@ -30,11 +31,19 @@ public interface Builder extends AwsServiceClientConfiguration.Builder {
/**
* Configure the region
*/
@Override
Builder region(Region region);

/**
* Configure the endpointOverride
*/
@Override
Builder endpointOverride(URI endpointOverride);

/**
* Configure the client override configuration
*/
@Override
Builder overrideConfiguration(ClientOverrideConfiguration clientOverrideConfiguration);
}

Expand All @@ -58,6 +67,12 @@ public Builder overrideConfiguration(ClientOverrideConfiguration clientOverrideC
return this;
}

@Override
public Builder endpointOverride(URI endpointOverride) {
this.endpointOverride = endpointOverride;
return this;
}

@Override
public JsonProtocolTestsServiceClientConfiguration build() {
return new JsonProtocolTestsServiceClientConfiguration(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

package software.amazon.awssdk.awscore;

import java.net.URI;
import java.util.Objects;
import software.amazon.awssdk.annotations.SdkPublicApi;
import software.amazon.awssdk.core.SdkServiceClientConfiguration;
Expand Down Expand Up @@ -81,6 +82,7 @@ public interface Builder extends SdkServiceClientConfiguration.Builder {
protected abstract static class BuilderImpl implements Builder {
protected ClientOverrideConfiguration overrideConfiguration;
protected Region region;
protected URI endpointOverride;

protected BuilderImpl() {
}
Expand All @@ -90,19 +92,6 @@ protected BuilderImpl(AwsServiceClientConfiguration awsServiceClientConfiguratio
this.region = awsServiceClientConfiguration.region();
}


@Override
public Builder overrideConfiguration(ClientOverrideConfiguration clientOverrideConfiguration) {
this.overrideConfiguration = clientOverrideConfiguration;
return this;
}
Comment on lines -93 to -98
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't we have this on the interface?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added in Builder interface


@Override
public Builder region(Region region) {
this.region = region;
return this;
}

@Override
public final ClientOverrideConfiguration overrideConfiguration() {
return overrideConfiguration;
Expand All @@ -112,6 +101,11 @@ public final ClientOverrideConfiguration overrideConfiguration() {
public final Region region() {
return region;
}

@Override
public final URI endpointOverride() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't we have a setter on the interface to override the return type?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added overridden setters for endpointOverride and overrideConfiguration

return endpointOverride;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@

package software.amazon.awssdk.core;

import java.net.URI;
import java.util.Objects;
import java.util.Optional;
import software.amazon.awssdk.annotations.SdkPublicApi;
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;

Expand All @@ -26,9 +28,11 @@
public abstract class SdkServiceClientConfiguration {

private final ClientOverrideConfiguration overrideConfiguration;
private final URI endpointOverride;

protected SdkServiceClientConfiguration(Builder builder) {
this.overrideConfiguration = builder.overrideConfiguration();
this.endpointOverride = builder.endpointOverride();
}

/**
Expand All @@ -40,6 +44,15 @@ public ClientOverrideConfiguration overrideConfiguration() {
return this.overrideConfiguration;
}

/**
*
* @return The configured endpoint override of the SdkClient. If the endpoint was not overridden, an empty Optional will be
* returned
*/
public Optional<URI> endpointOverride() {
return Optional.ofNullable(this.endpointOverride);
}

@Override
public boolean equals(Object o) {
if (this == o) {
Expand Down Expand Up @@ -67,11 +80,21 @@ public interface Builder {
*/
ClientOverrideConfiguration overrideConfiguration();

/**
* Return the endpoint override
*/
URI endpointOverride();

/**
* Configure the client override configuration
*/
Builder overrideConfiguration(ClientOverrideConfiguration clientOverrideConfiguration);

/**
* Configure the endpoint override
*/
Builder endpointOverride(URI endpointOverride);

/**
* Build the service client configuration using the configuration on this builder
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import static org.assertj.core.api.Assertions.assertThat;

import java.net.URI;
import java.time.Duration;
import org.junit.jupiter.api.Test;
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
Expand All @@ -36,6 +37,26 @@ public void syncClient_serviceClientConfiguration_shouldReturnCorrectRegion() {
assertThat(region).isEqualTo(Region.ME_SOUTH_1);
}

@Test
public void syncClientWithEndpointOverride_serviceClientConfiguration_shouldReturnCorrectEndpointOverride() {
URI uri = URI.create("https://www.amazon.com/");
ProtocolRestXmlClient client = ProtocolRestXmlClient.builder()
.endpointOverride(uri)
.build();

URI endpointOverride = client.serviceClientConfiguration().endpointOverride().orElse(null);
assertThat(endpointOverride).isEqualTo(uri);
}

@Test
public void syncClientWithoutEndpointOverride_serviceClientConfiguration_shouldReturnEmptyOptional() {
ProtocolRestXmlClient client = ProtocolRestXmlClient.builder()
.build();

URI endpointOverride = client.serviceClientConfiguration().endpointOverride().orElse(null);
assertThat(endpointOverride).isNull();
}

@Test
public void syncClient_serviceClientConfiguration_shouldReturnCorrectClientOverrideConfigurationFields() {
ClientOverrideConfiguration overrideConfiguration = ClientOverrideConfiguration.builder()
Expand Down Expand Up @@ -80,6 +101,26 @@ public void asyncClient_serviceClientConfiguration_shouldReturnCorrectRegion() {
assertThat(region).isEqualTo(Region.ME_SOUTH_1);
}

@Test
public void asyncClientWithEndpointOverride_serviceClientConfiguration_shouldReturnCorrectEndpointOverride() {
URI uri = URI.create("https://www.amazon.com/");
ProtocolRestXmlAsyncClient client = ProtocolRestXmlAsyncClient.builder()
.endpointOverride(uri)
.build();

URI endpointOverride = client.serviceClientConfiguration().endpointOverride().orElse(null);
assertThat(endpointOverride).isEqualTo(uri);
}

@Test
public void asyncClientWithoutEndpointOverride_serviceClientConfiguration_shouldReturnEmptyOptional() {
ProtocolRestXmlAsyncClient client = ProtocolRestXmlAsyncClient.builder()
.build();

URI endpointOverride = client.serviceClientConfiguration().endpointOverride().orElse(null);
assertThat(endpointOverride).isNull();
}

@Test
public void asyncClient_serviceClientConfiguration_shouldReturnCorrectClientOverrideConfigurationFields() {
ClientOverrideConfiguration overrideConfiguration = ClientOverrideConfiguration.builder()
Expand Down