Skip to content

Commit fd2f046

Browse files
authored
Attach crossRegionAccessEnabled as CustomClientParams to a client Builder, also mention of Composers are renamed as decorators (#4151)
* Attach crossRegionAccessEnabled as CustomClientParams to a client Builder, also mention of Composers are renamed as decorators * Removed from S3Configurations * Move the optional parameter in getter
1 parent 6c63aa9 commit fd2f046

File tree

28 files changed

+436
-293
lines changed

28 files changed

+436
-293
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.util.HashMap;
2020
import java.util.List;
2121
import java.util.Map;
22-
import software.amazon.awssdk.awscore.internal.client.ClientComposer;
22+
import software.amazon.awssdk.codegen.model.service.ClientContextParam;
2323
import software.amazon.awssdk.core.retry.RetryMode;
2424
import software.amazon.awssdk.core.traits.PayloadTrait;
2525
import software.amazon.awssdk.utils.AttributeMap;
@@ -216,16 +216,16 @@ public class CustomizationConfig {
216216
/**
217217
* Fully qualified name of a class that given the default sync client instance can return the final client instance,
218218
* for instance by decorating the client with specific-purpose implementations of the client interface.
219-
* The class should implement the {@link ClientComposer} interface. See S3 customization.config for an example.
219+
* See S3 customization.config for an example.
220220
*/
221-
private String syncClientComposer;
221+
private String syncClientDecorator;
222222

223223
/**
224224
* Fully qualified name of a class that given the default async client instance can return the final client instance,
225225
* for instance by decorating the client with specific-purpose implementations of the client interface.
226-
* The class should implement the {@link ClientComposer} interface. See S3 customization.config for an example.
226+
* See S3 customization.config for an example.
227227
*/
228-
private String asyncClientComposer;
228+
private String asyncClientDecorator;
229229

230230
/**
231231
* Whether to skip generating endpoint tests from endpoint-tests.json
@@ -251,6 +251,11 @@ public class CustomizationConfig {
251251
*/
252252
private boolean requiredTraitValidationEnabled = false;
253253

254+
/**
255+
* Customization to attach map of Custom client param configs that can be set on a client builder.
256+
*/
257+
private Map<String, ClientContextParam> customClientContextParams;
258+
254259
private CustomizationConfig() {
255260
}
256261

@@ -581,20 +586,20 @@ public void setDelegateAsyncClientClass(boolean delegateAsyncClientClass) {
581586
this.delegateAsyncClientClass = delegateAsyncClientClass;
582587
}
583588

584-
public String getSyncClientComposer() {
585-
return syncClientComposer;
589+
public String getSyncClientDecorator() {
590+
return syncClientDecorator;
586591
}
587592

588-
public void setSyncClientComposer(String syncClientComposer) {
589-
this.syncClientComposer = syncClientComposer;
593+
public void setSyncClientDecorator(String syncClientDecorator) {
594+
this.syncClientDecorator = syncClientDecorator;
590595
}
591596

592-
public String getAsyncClientComposer() {
593-
return asyncClientComposer;
597+
public String getAsyncClientDecorator() {
598+
return asyncClientDecorator;
594599
}
595600

596-
public void setAsyncClientComposer(String asyncClientComposer) {
597-
this.asyncClientComposer = asyncClientComposer;
601+
public void setAsyncClientDecorator(String asyncClientDecorator) {
602+
this.asyncClientDecorator = asyncClientDecorator;
598603
}
599604

600605
public boolean isDelegateSyncClientClass() {
@@ -652,4 +657,12 @@ public boolean isRequiredTraitValidationEnabled() {
652657
public void setRequiredTraitValidationEnabled(boolean requiredTraitValidationEnabled) {
653658
this.requiredTraitValidationEnabled = requiredTraitValidationEnabled;
654659
}
660+
661+
public Map<String, ClientContextParam> getCustomClientContextParams() {
662+
return customClientContextParams;
663+
}
664+
665+
public void setCustomClientContextParams(Map<String, ClientContextParam> customClientContextParams) {
666+
this.customClientContextParams = customClientContextParams;
667+
}
655668
}

codegen/src/main/java/software/amazon/awssdk/codegen/model/intermediate/IntermediateModel.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -235,17 +235,17 @@ public String getSdkResponseBaseClassName() {
235235
}
236236
}
237237

238-
public Optional<String> syncClientComposerClassName() {
239-
if (customizationConfig.getSyncClientComposer() != null) {
240-
return Optional.of(customizationConfig.getSyncClientComposer());
238+
public Optional<String> syncClientDecoratorClassName() {
239+
if (customizationConfig.getSyncClientDecorator() != null) {
240+
return Optional.of(customizationConfig.getSyncClientDecorator());
241241
}
242242
return Optional.empty();
243243
}
244244

245-
public Optional<String> asyncClientComposerClassName() {
246-
String asyncClientComposer = customizationConfig.getAsyncClientComposer();
247-
if (customizationConfig.getAsyncClientComposer() != null) {
248-
return Optional.of(asyncClientComposer);
245+
public Optional<String> asyncClientDecoratorClassName() {
246+
String asyncClientDecorator = customizationConfig.getAsyncClientDecorator();
247+
if (customizationConfig.getAsyncClientDecorator() != null) {
248+
return Optional.of(asyncClientDecorator);
249249
}
250250
return Optional.empty();
251251
}

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import software.amazon.awssdk.annotations.SdkInternalApi;
2929
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
3030
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
31-
import software.amazon.awssdk.awscore.internal.client.ClientComposer;
3231
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
3332
import software.amazon.awssdk.codegen.poet.ClassSpec;
3433
import software.amazon.awssdk.codegen.poet.PoetExtension;
@@ -148,11 +147,9 @@ private MethodSpec buildClientMethod() {
148147

149148
builder.addStatement("$1T client = new $2T(serviceClientConfiguration, clientConfiguration)",
150149
clientInterfaceName, clientClassName);
151-
if (model.asyncClientComposerClassName().isPresent()) {
152-
builder.addStatement("$1T composer = new $2T()",
153-
ClientComposer.class,
154-
PoetUtils.classNameFromFqcn(model.asyncClientComposerClassName().get()));
155-
builder.addStatement("return ($T) composer.compose(client, clientConfiguration)", clientInterfaceName);
150+
if (model.asyncClientDecoratorClassName().isPresent()) {
151+
builder.addStatement("return new $T().decorate(client, clientConfiguration, clientContextParams.copy().build())",
152+
PoetUtils.classNameFromFqcn(model.asyncClientDecoratorClassName().get()));
156153
} else {
157154
builder.addStatement("return client");
158155
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,12 @@ public TypeSpec poetSpec() {
117117
});
118118
}
119119

120+
if (hasSdkClientContextParams()) {
121+
model.getCustomizationConfig().getCustomClientContextParams().forEach((n, m) -> {
122+
builder.addMethod(clientContextParamSetter(n, m));
123+
});
124+
}
125+
120126
if (model.getCustomizationConfig().getServiceConfig().getClassName() != null) {
121127
builder.addMethod(setServiceConfigurationMethod())
122128
.addMethod(beanStyleSetServiceConfigurationMethod());
@@ -609,6 +615,12 @@ private boolean hasClientContextParams() {
609615
return clientContextParams != null && !clientContextParams.isEmpty();
610616
}
611617

618+
private boolean hasSdkClientContextParams() {
619+
return model.getCustomizationConfig() != null
620+
&& model.getCustomizationConfig().getCustomClientContextParams() != null
621+
&& !model.getCustomizationConfig().getCustomClientContextParams().isEmpty();
622+
}
623+
612624
private MethodSpec validateClientOptionsMethod() {
613625
MethodSpec.Builder builder = MethodSpec.methodBuilder("validateClientOptions")
614626
.addModifiers(PROTECTED, Modifier.STATIC)

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ public TypeSpec poetSpec() {
8080
});
8181
}
8282

83+
if (hasSdkClientContextParams()) {
84+
model.getCustomizationConfig().getCustomClientContextParams().forEach((n, m) -> {
85+
builder.addMethod(clientContextParamSetter(n, m));
86+
});
87+
}
88+
8389
if (generateTokenProviderMethod()) {
8490
builder.addMethod(tokenProviderMethod());
8591
}
@@ -193,4 +199,10 @@ public ClassName className() {
193199
private boolean hasClientContextParams() {
194200
return model.getClientContextParams() != null && !model.getClientContextParams().isEmpty();
195201
}
202+
203+
private boolean hasSdkClientContextParams() {
204+
return model.getCustomizationConfig() != null
205+
&& model.getCustomizationConfig().getCustomClientContextParams() != null
206+
&& !model.getCustomizationConfig().getCustomClientContextParams().isEmpty();
207+
}
196208
}

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import software.amazon.awssdk.annotations.SdkInternalApi;
2929
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
3030
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
31-
import software.amazon.awssdk.awscore.internal.client.ClientComposer;
3231
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
3332
import software.amazon.awssdk.codegen.poet.ClassSpec;
3433
import software.amazon.awssdk.codegen.poet.PoetExtension;
@@ -141,16 +140,13 @@ private MethodSpec buildClientMethod() {
141140
.addStatement("$T serviceClientConfiguration = initializeServiceClientConfig"
142141
+ "(clientConfiguration)",
143142
serviceConfigClassName);
144-
145143
addQueryProtocolInterceptors(builder);
146144

147145
builder.addStatement("$1T client = new $2T(serviceClientConfiguration, clientConfiguration)",
148146
clientInterfaceName, clientClassName);
149-
if (model.syncClientComposerClassName().isPresent()) {
150-
builder.addStatement("$1T composer = new $2T()",
151-
ClientComposer.class,
152-
PoetUtils.classNameFromFqcn(model.syncClientComposerClassName().get()));
153-
builder.addStatement("return ($T) composer.compose(client, clientConfiguration)", clientInterfaceName);
147+
if (model.syncClientDecoratorClassName().isPresent()) {
148+
builder.addStatement("return new $T().decorate(client, clientConfiguration, clientContextParams.copy().build())",
149+
PoetUtils.classNameFromFqcn(model.syncClientDecoratorClassName().get()));
154150
} else {
155151
builder.addStatement("return client");
156152
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/rules/ClientContextParamsClassSpec.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ public TypeSpec poetSpec() {
5454
b.addField(paramDeclaration(n, m));
5555
});
5656

57+
if (model.getCustomizationConfig() != null && model.getCustomizationConfig().getCustomClientContextParams() != null) {
58+
model.getCustomizationConfig().getCustomClientContextParams().forEach((n, m) -> {
59+
b.addField(paramDeclaration(n, m));
60+
});
61+
}
62+
5763
return b.build();
5864
}
5965

codegen/src/test/java/software/amazon/awssdk/codegen/poet/builder/BuilderClassTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,17 @@ public void syncComposedClientBuilderClass() throws Exception {
8383
validateComposedClientGeneration(SyncClientBuilderClass::new, "test-composed-sync-client-builder-class.java");
8484
}
8585

86+
@Test
87+
public void syncComposedDefaultClientBuilderClass() throws Exception {
88+
validateComposedClientGeneration(BaseClientBuilderClass::new, "test-composed-sync-default-client-builder.java");
89+
}
90+
91+
@Test
92+
public void syncHasCrossRegionAccessEnabledPropertyBuilderClass() throws Exception {
93+
validateComposedClientGeneration(BaseClientBuilderInterface::new, "test-customcontextparams-sync-client-builder-class.java");
94+
}
95+
96+
8697
@Test
8798
public void asyncClientBuilderInterface() throws Exception {
8899
validateGeneration(AsyncClientBuilderInterface::new, "test-async-client-builder-interface.java");

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
import software.amazon.awssdk.annotations.SdkInternalApi;
66
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
77
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
8-
import software.amazon.awssdk.awscore.internal.client.ClientComposer;
98
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
109
import software.amazon.awssdk.core.client.config.SdkClientOption;
1110
import software.amazon.awssdk.endpoints.EndpointProvider;
12-
import software.amazon.awssdk.services.builder.AsyncClientComposer;
11+
import software.amazon.awssdk.services.builder.AsyncClientDecorator;
1312
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
1413

1514
/**
@@ -37,8 +36,7 @@ protected final JsonAsyncClient buildClient() {
3736
this.validateClientOptions(clientConfiguration);
3837
JsonServiceClientConfiguration serviceClientConfiguration = initializeServiceClientConfig(clientConfiguration);
3938
JsonAsyncClient client = new DefaultJsonAsyncClient(serviceClientConfiguration, clientConfiguration);
40-
ClientComposer composer = new AsyncClientComposer();
41-
return (JsonAsyncClient) composer.compose(client, clientConfiguration);
39+
return new AsyncClientDecorator().decorate(client, clientConfiguration, clientContextParams.copy().build());
4240
}
4341

4442
private JsonServiceClientConfiguration initializeServiceClientConfig(SdkClientConfiguration clientConfig) {

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
import software.amazon.awssdk.annotations.SdkInternalApi;
66
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
77
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
8-
import software.amazon.awssdk.awscore.internal.client.ClientComposer;
98
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
109
import software.amazon.awssdk.core.client.config.SdkClientOption;
1110
import software.amazon.awssdk.endpoints.EndpointProvider;
12-
import software.amazon.awssdk.services.builder.SyncClientComposer;
11+
import software.amazon.awssdk.services.builder.SyncClientDecorator;
1312
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
1413

1514
/**
@@ -37,8 +36,7 @@ protected final JsonClient buildClient() {
3736
this.validateClientOptions(clientConfiguration);
3837
JsonServiceClientConfiguration serviceClientConfiguration = initializeServiceClientConfig(clientConfiguration);
3938
JsonClient client = new DefaultJsonClient(serviceClientConfiguration, clientConfiguration);
40-
ClientComposer composer = new SyncClientComposer();
41-
return (JsonClient) composer.compose(client, clientConfiguration);
39+
return new SyncClientDecorator().decorate(client, clientConfiguration, clientContextParams.copy().build());
4240
}
4341

4442
private JsonServiceClientConfiguration initializeServiceClientConfig(SdkClientConfiguration clientConfig) {

0 commit comments

Comments
 (0)