Skip to content

Commit d58f79b

Browse files
authored
Expose endpointOverride through ServiceClientConfiguration (#3900)
* Expose endpointOverride through ServiceClientConfiguration * Refactoring * Add endpointOverride to equals and hashcode * Fix build errors * Refactoring
1 parent 299cbb0 commit d58f79b

File tree

10 files changed

+156
-19
lines changed

10 files changed

+156
-19
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"category": "AWS SDK for Java v2",
3+
"contributor": "",
4+
"type": "feature",
5+
"description": "Exposes endpointOverride in SdkClient through ServiceClientConfiguration"
6+
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/AsyncClientBuilderClass.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.squareup.javapoet.MethodSpec;
2020
import com.squareup.javapoet.ParameterizedTypeName;
2121
import com.squareup.javapoet.TypeSpec;
22+
import java.net.URI;
2223
import javax.lang.model.element.Modifier;
2324
import software.amazon.awssdk.annotations.SdkInternalApi;
2425
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
@@ -124,9 +125,17 @@ private MethodSpec buildClientMethod() {
124125
.returns(clientInterfaceName)
125126
.addStatement("$T clientConfiguration = super.asyncClientConfiguration()", SdkClientConfiguration.class)
126127
.addStatement("this.validateClientOptions(clientConfiguration)")
128+
.addStatement("$T endpointOverride = null", URI.class)
129+
.addCode("if (clientConfiguration.option($T.ENDPOINT_OVERRIDDEN) != null"
130+
+ "&& $T.TRUE.equals(clientConfiguration.option($T.ENDPOINT_OVERRIDDEN))) {"
131+
+ "endpointOverride = clientConfiguration.option($T.ENDPOINT);"
132+
+ "}",
133+
SdkClientOption.class, Boolean.class, SdkClientOption.class, SdkClientOption.class)
127134
.addStatement("$T serviceClientConfiguration = $T.builder()"
128135
+ ".overrideConfiguration(overrideConfiguration())"
129-
+ ".region(clientConfiguration.option($T.AWS_REGION)).build()",
136+
+ ".region(clientConfiguration.option($T.AWS_REGION))"
137+
+ ".endpointOverride(endpointOverride)"
138+
+ ".build()",
130139
serviceConfigClassName, serviceConfigClassName, AwsClientOption.class)
131140
.addStatement("return new $T(serviceClientConfiguration, clientConfiguration)", clientClassName)
132141
.build();

codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/SyncClientBuilderClass.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.squareup.javapoet.MethodSpec;
2020
import com.squareup.javapoet.ParameterizedTypeName;
2121
import com.squareup.javapoet.TypeSpec;
22+
import java.net.URI;
2223
import javax.lang.model.element.Modifier;
2324
import software.amazon.awssdk.annotations.SdkInternalApi;
2425
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
@@ -124,9 +125,17 @@ private MethodSpec buildClientMethod() {
124125
.returns(clientInterfaceName)
125126
.addStatement("$T clientConfiguration = super.syncClientConfiguration()", SdkClientConfiguration.class)
126127
.addStatement("this.validateClientOptions(clientConfiguration)")
128+
.addStatement("$T endpointOverride = null", URI.class)
129+
.addCode("if (clientConfiguration.option($T.ENDPOINT_OVERRIDDEN) != null"
130+
+ "&& $T.TRUE.equals(clientConfiguration.option($T.ENDPOINT_OVERRIDDEN))) {"
131+
+ "endpointOverride = clientConfiguration.option($T.ENDPOINT);"
132+
+ "}",
133+
SdkClientOption.class, Boolean.class, SdkClientOption.class, SdkClientOption.class)
127134
.addStatement("$T serviceClientConfiguration = $T.builder()"
128135
+ ".overrideConfiguration(overrideConfiguration())"
129-
+ ".region(clientConfiguration.option($T.AWS_REGION)).build()",
136+
+ ".region(clientConfiguration.option($T.AWS_REGION))"
137+
+ ".endpointOverride(endpointOverride)"
138+
+ ".build()",
130139
serviceConfigClassName, serviceConfigClassName, AwsClientOption.class)
131140
.addStatement("return new $T(serviceClientConfiguration, clientConfiguration)", clientClassName)
132141
.build();

codegen/src/main/java/software/amazon/awssdk/codegen/poet/model/ServiceClientConfigurationClass.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.squareup.javapoet.ClassName;
2525
import com.squareup.javapoet.MethodSpec;
2626
import com.squareup.javapoet.TypeSpec;
27+
import java.net.URI;
2728
import software.amazon.awssdk.annotations.SdkPublicApi;
2829
import software.amazon.awssdk.awscore.AwsServiceClientConfiguration;
2930
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
@@ -89,12 +90,21 @@ private TypeSpec builderInterfaceSpec() {
8990
.returns(className())
9091
.build())
9192
.addMethod(MethodSpec.methodBuilder("region")
93+
.addAnnotation(Override.class)
9294
.addModifiers(PUBLIC, ABSTRACT)
9395
.addParameter(Region.class, "region")
9496
.returns(className().nestedClass("Builder"))
9597
.addJavadoc("Configure the region")
9698
.build())
99+
.addMethod(MethodSpec.methodBuilder("endpointOverride")
100+
.addAnnotation(Override.class)
101+
.addModifiers(PUBLIC, ABSTRACT)
102+
.addParameter(URI.class, "endpointOverride")
103+
.returns(className().nestedClass("Builder"))
104+
.addJavadoc("Configure the endpointOverride")
105+
.build())
97106
.addMethod(MethodSpec.methodBuilder("overrideConfiguration")
107+
.addAnnotation(Override.class)
98108
.addModifiers(PUBLIC, ABSTRACT)
99109
.addParameter(ClientOverrideConfiguration.class, "clientOverrideConfiguration")
100110
.returns(className().nestedClass("Builder"))
@@ -132,6 +142,14 @@ private TypeSpec builderImplSpec() {
132142
.addStatement("this.overrideConfiguration = clientOverrideConfiguration")
133143
.addStatement("return this")
134144
.build())
145+
.addMethod(MethodSpec.methodBuilder("endpointOverride")
146+
.addAnnotation(Override.class)
147+
.addModifiers(PUBLIC)
148+
.addParameter(URI.class, "endpointOverride")
149+
.returns(className().nestedClass("Builder"))
150+
.addStatement("this.endpointOverride = endpointOverride")
151+
.addStatement("return this")
152+
.build())
135153
.addMethod(MethodSpec.methodBuilder("build")
136154
.addAnnotation(Override.class)
137155
.addModifiers(PUBLIC)

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-async-client-builder-class.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package software.amazon.awssdk.services.json;
22

3+
import java.net.URI;
34
import software.amazon.awssdk.annotations.Generated;
45
import software.amazon.awssdk.annotations.SdkInternalApi;
56
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
@@ -31,9 +32,14 @@ public DefaultJsonAsyncClientBuilder tokenProvider(SdkTokenProvider tokenProvide
3132
protected final JsonAsyncClient buildClient() {
3233
SdkClientConfiguration clientConfiguration = super.asyncClientConfiguration();
3334
this.validateClientOptions(clientConfiguration);
35+
URI endpointOverride = null;
36+
if (clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN) != null
37+
&& Boolean.TRUE.equals(clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN))) {
38+
endpointOverride = clientConfiguration.option(SdkClientOption.ENDPOINT);
39+
}
3440
JsonServiceClientConfiguration serviceClientConfiguration = JsonServiceClientConfiguration.builder()
3541
.overrideConfiguration(overrideConfiguration()).region(clientConfiguration.option(AwsClientOption.AWS_REGION))
36-
.build();
42+
.endpointOverride(endpointOverride).build();
3743
return new DefaultJsonAsyncClient(serviceClientConfiguration, clientConfiguration);
3844
}
3945
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-sync-client-builder-class.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package software.amazon.awssdk.services.json;
22

3+
import java.net.URI;
34
import software.amazon.awssdk.annotations.Generated;
45
import software.amazon.awssdk.annotations.SdkInternalApi;
56
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
@@ -31,9 +32,14 @@ public DefaultJsonClientBuilder tokenProvider(SdkTokenProvider tokenProvider) {
3132
protected final JsonClient buildClient() {
3233
SdkClientConfiguration clientConfiguration = super.syncClientConfiguration();
3334
this.validateClientOptions(clientConfiguration);
35+
URI endpointOverride = null;
36+
if (clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN) != null
37+
&& Boolean.TRUE.equals(clientConfiguration.option(SdkClientOption.ENDPOINT_OVERRIDDEN))) {
38+
endpointOverride = clientConfiguration.option(SdkClientOption.ENDPOINT);
39+
}
3440
JsonServiceClientConfiguration serviceClientConfiguration = JsonServiceClientConfiguration.builder()
3541
.overrideConfiguration(overrideConfiguration()).region(clientConfiguration.option(AwsClientOption.AWS_REGION))
36-
.build();
42+
.endpointOverride(endpointOverride).build();
3743
return new DefaultJsonClient(serviceClientConfiguration, clientConfiguration);
3844
}
3945
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/model/serviceclientconfiguration.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package software.amazon.awssdk.services.jsonprotocoltests;
22

3+
import java.net.URI;
34
import software.amazon.awssdk.annotations.Generated;
45
import software.amazon.awssdk.annotations.SdkPublicApi;
56
import software.amazon.awssdk.awscore.AwsServiceClientConfiguration;
@@ -30,11 +31,19 @@ public interface Builder extends AwsServiceClientConfiguration.Builder {
3031
/**
3132
* Configure the region
3233
*/
34+
@Override
3335
Builder region(Region region);
3436

37+
/**
38+
* Configure the endpointOverride
39+
*/
40+
@Override
41+
Builder endpointOverride(URI endpointOverride);
42+
3543
/**
3644
* Configure the client override configuration
3745
*/
46+
@Override
3847
Builder overrideConfiguration(ClientOverrideConfiguration clientOverrideConfiguration);
3948
}
4049

@@ -58,6 +67,12 @@ public Builder overrideConfiguration(ClientOverrideConfiguration clientOverrideC
5867
return this;
5968
}
6069

70+
@Override
71+
public Builder endpointOverride(URI endpointOverride) {
72+
this.endpointOverride = endpointOverride;
73+
return this;
74+
}
75+
6176
@Override
6277
public JsonProtocolTestsServiceClientConfiguration build() {
6378
return new JsonProtocolTestsServiceClientConfiguration(this);

core/aws-core/src/main/java/software/amazon/awssdk/awscore/AwsServiceClientConfiguration.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
package software.amazon.awssdk.awscore;
1717

18+
import java.net.URI;
1819
import java.util.Objects;
1920
import software.amazon.awssdk.annotations.SdkPublicApi;
2021
import software.amazon.awssdk.core.SdkServiceClientConfiguration;
@@ -74,33 +75,28 @@ public interface Builder extends SdkServiceClientConfiguration.Builder {
7475
*/
7576
Builder region(Region region);
7677

78+
@Override
79+
Builder overrideConfiguration(ClientOverrideConfiguration clientOverrideConfiguration);
80+
81+
@Override
82+
Builder endpointOverride(URI endpointOverride);
83+
7784
@Override
7885
AwsServiceClientConfiguration build();
7986
}
8087

8188
protected abstract static class BuilderImpl implements Builder {
8289
protected ClientOverrideConfiguration overrideConfiguration;
8390
protected Region region;
91+
protected URI endpointOverride;
8492

8593
protected BuilderImpl() {
8694
}
8795

8896
protected BuilderImpl(AwsServiceClientConfiguration awsServiceClientConfiguration) {
8997
this.overrideConfiguration = awsServiceClientConfiguration.overrideConfiguration();
9098
this.region = awsServiceClientConfiguration.region();
91-
}
92-
93-
94-
@Override
95-
public Builder overrideConfiguration(ClientOverrideConfiguration clientOverrideConfiguration) {
96-
this.overrideConfiguration = clientOverrideConfiguration;
97-
return this;
98-
}
99-
100-
@Override
101-
public Builder region(Region region) {
102-
this.region = region;
103-
return this;
99+
this.endpointOverride = awsServiceClientConfiguration.endpointOverride().orElse(null);
104100
}
105101

106102
@Override
@@ -112,6 +108,11 @@ public final ClientOverrideConfiguration overrideConfiguration() {
112108
public final Region region() {
113109
return region;
114110
}
111+
112+
@Override
113+
public final URI endpointOverride() {
114+
return endpointOverride;
115+
}
115116
}
116117

117118
}

core/sdk-core/src/main/java/software/amazon/awssdk/core/SdkServiceClientConfiguration.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515

1616
package software.amazon.awssdk.core;
1717

18+
import java.net.URI;
1819
import java.util.Objects;
20+
import java.util.Optional;
1921
import software.amazon.awssdk.annotations.SdkPublicApi;
2022
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
2123

@@ -26,9 +28,11 @@
2628
public abstract class SdkServiceClientConfiguration {
2729

2830
private final ClientOverrideConfiguration overrideConfiguration;
31+
private final URI endpointOverride;
2932

3033
protected SdkServiceClientConfiguration(Builder builder) {
3134
this.overrideConfiguration = builder.overrideConfiguration();
35+
this.endpointOverride = builder.endpointOverride();
3236
}
3337

3438
/**
@@ -40,6 +44,15 @@ public ClientOverrideConfiguration overrideConfiguration() {
4044
return this.overrideConfiguration;
4145
}
4246

47+
/**
48+
*
49+
* @return The configured endpoint override of the SdkClient. If the endpoint was not overridden, an empty Optional will be
50+
* returned
51+
*/
52+
public Optional<URI> endpointOverride() {
53+
return Optional.ofNullable(this.endpointOverride);
54+
}
55+
4356
@Override
4457
public boolean equals(Object o) {
4558
if (this == o) {
@@ -50,12 +63,15 @@ public boolean equals(Object o) {
5063
}
5164

5265
SdkServiceClientConfiguration serviceClientConfiguration = (SdkServiceClientConfiguration) o;
53-
return Objects.equals(overrideConfiguration, serviceClientConfiguration.overrideConfiguration());
66+
return Objects.equals(overrideConfiguration, serviceClientConfiguration.overrideConfiguration())
67+
&& Objects.equals(endpointOverride, serviceClientConfiguration.endpointOverride().orElse(null));
5468
}
5569

5670
@Override
5771
public int hashCode() {
58-
return overrideConfiguration != null ? overrideConfiguration.hashCode() : 0;
72+
int result = overrideConfiguration != null ? overrideConfiguration.hashCode() : 0;
73+
result = 31 * result + (endpointOverride != null ? endpointOverride.hashCode() : 0);
74+
return result;
5975
}
6076

6177
/**
@@ -67,11 +83,21 @@ public interface Builder {
6783
*/
6884
ClientOverrideConfiguration overrideConfiguration();
6985

86+
/**
87+
* Return the endpoint override
88+
*/
89+
URI endpointOverride();
90+
7091
/**
7192
* Configure the client override configuration
7293
*/
7394
Builder overrideConfiguration(ClientOverrideConfiguration clientOverrideConfiguration);
7495

96+
/**
97+
* Configure the endpoint override
98+
*/
99+
Builder endpointOverride(URI endpointOverride);
100+
75101
/**
76102
* Build the service client configuration using the configuration on this builder
77103
*/

test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/serviceclientconfiguration/ServiceClientConfigurationTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

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

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

40+
@Test
41+
public void syncClientWithEndpointOverride_serviceClientConfiguration_shouldReturnCorrectEndpointOverride() {
42+
URI uri = URI.create("https://www.amazon.com/");
43+
ProtocolRestXmlClient client = ProtocolRestXmlClient.builder()
44+
.endpointOverride(uri)
45+
.build();
46+
47+
URI endpointOverride = client.serviceClientConfiguration().endpointOverride().orElse(null);
48+
assertThat(endpointOverride).isEqualTo(uri);
49+
}
50+
51+
@Test
52+
public void syncClientWithoutEndpointOverride_serviceClientConfiguration_shouldReturnEmptyOptional() {
53+
ProtocolRestXmlClient client = ProtocolRestXmlClient.builder()
54+
.build();
55+
56+
URI endpointOverride = client.serviceClientConfiguration().endpointOverride().orElse(null);
57+
assertThat(endpointOverride).isNull();
58+
}
59+
3960
@Test
4061
public void syncClient_serviceClientConfiguration_shouldReturnCorrectClientOverrideConfigurationFields() {
4162
ClientOverrideConfiguration overrideConfiguration = ClientOverrideConfiguration.builder()
@@ -80,6 +101,26 @@ public void asyncClient_serviceClientConfiguration_shouldReturnCorrectRegion() {
80101
assertThat(region).isEqualTo(Region.ME_SOUTH_1);
81102
}
82103

104+
@Test
105+
public void asyncClientWithEndpointOverride_serviceClientConfiguration_shouldReturnCorrectEndpointOverride() {
106+
URI uri = URI.create("https://www.amazon.com/");
107+
ProtocolRestXmlAsyncClient client = ProtocolRestXmlAsyncClient.builder()
108+
.endpointOverride(uri)
109+
.build();
110+
111+
URI endpointOverride = client.serviceClientConfiguration().endpointOverride().orElse(null);
112+
assertThat(endpointOverride).isEqualTo(uri);
113+
}
114+
115+
@Test
116+
public void asyncClientWithoutEndpointOverride_serviceClientConfiguration_shouldReturnEmptyOptional() {
117+
ProtocolRestXmlAsyncClient client = ProtocolRestXmlAsyncClient.builder()
118+
.build();
119+
120+
URI endpointOverride = client.serviceClientConfiguration().endpointOverride().orElse(null);
121+
assertThat(endpointOverride).isNull();
122+
}
123+
83124
@Test
84125
public void asyncClient_serviceClientConfiguration_shouldReturnCorrectClientOverrideConfigurationFields() {
85126
ClientOverrideConfiguration overrideConfiguration = ClientOverrideConfiguration.builder()

0 commit comments

Comments
 (0)