Skip to content

Commit c456c5b

Browse files
authored
Configure authSchemeProvider in service client builder (#4032)
* Generate authSchemeProvider setter in service client builder * Configure client with default AuthSchemeProvider
1 parent 39a22b2 commit c456c5b

File tree

11 files changed

+119
-3
lines changed

11 files changed

+119
-3
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/poet/auth/scheme/AuthSchemeSpecUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323
import software.amazon.awssdk.codegen.utils.AuthUtils;
2424
import software.amazon.awssdk.http.auth.spi.HttpAuthOption;
2525

26-
final class AuthSchemeSpecUtils {
26+
public final class AuthSchemeSpecUtils {
2727
private final IntermediateModel intermediateModel;
2828

29-
AuthSchemeSpecUtils(IntermediateModel intermediateModel) {
29+
public AuthSchemeSpecUtils(IntermediateModel intermediateModel) {
3030
this.intermediateModel = intermediateModel;
3131
}
3232

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import software.amazon.awssdk.codegen.model.service.ClientContextParam;
4848
import software.amazon.awssdk.codegen.poet.ClassSpec;
4949
import software.amazon.awssdk.codegen.poet.PoetUtils;
50+
import software.amazon.awssdk.codegen.poet.auth.scheme.AuthSchemeSpecUtils;
5051
import software.amazon.awssdk.codegen.poet.rules.EndpointRulesSpecUtils;
5152
import software.amazon.awssdk.codegen.utils.AuthUtils;
5253
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
@@ -73,13 +74,15 @@ public class BaseClientBuilderClass implements ClassSpec {
7374
private final ClassName builderClassName;
7475
private final String basePackage;
7576
private final EndpointRulesSpecUtils endpointRulesSpecUtils;
77+
private final AuthSchemeSpecUtils authSchemeSpecUtils;
7678

7779
public BaseClientBuilderClass(IntermediateModel model) {
7880
this.model = model;
7981
this.basePackage = model.getMetadata().getFullClientPackageName();
8082
this.builderInterfaceName = ClassName.get(basePackage, model.getMetadata().getBaseBuilderInterface());
8183
this.builderClassName = ClassName.get(basePackage, model.getMetadata().getBaseBuilder());
8284
this.endpointRulesSpecUtils = new EndpointRulesSpecUtils(model);
85+
this.authSchemeSpecUtils = new AuthSchemeSpecUtils(model);
8386
}
8487

8588
@Override
@@ -115,6 +118,9 @@ public TypeSpec poetSpec() {
115118
builder.addMethod(signingNameMethod());
116119
builder.addMethod(defaultEndpointProviderMethod());
117120

121+
builder.addMethod(authSchemeProviderMethod());
122+
builder.addMethod(defaultAuthSchemeProviderMethod());
123+
118124
if (hasClientContextParams()) {
119125
model.getClientContextParams().forEach((n, m) -> {
120126
builder.addMethod(clientContextParamSetter(n, m));
@@ -192,7 +198,7 @@ private MethodSpec mergeServiceDefaultsMethod() {
192198
.addCode("return config.merge(c -> c");
193199

194200
builder.addCode(".option($T.ENDPOINT_PROVIDER, defaultEndpointProvider())", SdkClientOption.class);
195-
201+
builder.addCode(".option($T.AUTH_SCHEME_PROVIDER, defaultAuthSchemeProvider())", SdkClientOption.class);
196202

197203
if (defaultAwsAuthSignerMethod().isPresent()) {
198204
builder.addCode(".option($T.SIGNER, defaultSigner())\n", SdkAdvancedClientOption.class);
@@ -580,6 +586,25 @@ private MethodSpec defaultEndpointProviderMethod() {
580586
.build();
581587
}
582588

589+
private MethodSpec authSchemeProviderMethod() {
590+
return MethodSpec.methodBuilder("authSchemeProvider")
591+
.addModifiers(Modifier.PUBLIC)
592+
.returns(TypeVariableName.get("B"))
593+
.addParameter(authSchemeSpecUtils.providerInterfaceName(), "authSchemeProvider")
594+
.addStatement("clientConfiguration.option($T.AUTH_SCHEME_PROVIDER, authSchemeProvider)",
595+
SdkClientOption.class)
596+
.addStatement("return thisBuilder()")
597+
.build();
598+
}
599+
600+
private MethodSpec defaultAuthSchemeProviderMethod() {
601+
return MethodSpec.methodBuilder("defaultAuthSchemeProvider")
602+
.addModifiers(PRIVATE)
603+
.returns(authSchemeSpecUtils.providerInterfaceName())
604+
.addStatement("return $T.defaultProvider()", authSchemeSpecUtils.providerInterfaceName())
605+
.build();
606+
}
607+
583608
private MethodSpec clientContextParamSetter(String name, ClientContextParam param) {
584609
String setterName = endpointRulesSpecUtils.paramMethodName(name);
585610
String keyName = model.getNamingStrategy().getEnumValueName(name);

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import software.amazon.awssdk.codegen.model.service.ClientContextParam;
3535
import software.amazon.awssdk.codegen.poet.ClassSpec;
3636
import software.amazon.awssdk.codegen.poet.PoetUtils;
37+
import software.amazon.awssdk.codegen.poet.auth.scheme.AuthSchemeSpecUtils;
3738
import software.amazon.awssdk.codegen.poet.rules.EndpointRulesSpecUtils;
3839
import software.amazon.awssdk.codegen.utils.AuthUtils;
3940
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
@@ -49,12 +50,14 @@ public class BaseClientBuilderInterface implements ClassSpec {
4950
private final String basePackage;
5051
private final ClassName builderInterfaceName;
5152
private final EndpointRulesSpecUtils endpointRulesSpecUtils;
53+
private final AuthSchemeSpecUtils authSchemeSpecUtils;
5254

5355
public BaseClientBuilderInterface(IntermediateModel model) {
5456
this.model = model;
5557
this.basePackage = model.getMetadata().getFullClientPackageName();
5658
this.builderInterfaceName = ClassName.get(basePackage, model.getMetadata().getBaseBuilderInterface());
5759
this.endpointRulesSpecUtils = new EndpointRulesSpecUtils(model);
60+
this.authSchemeSpecUtils = new AuthSchemeSpecUtils(model);
5861
}
5962

6063
@Override
@@ -79,6 +82,7 @@ public TypeSpec poetSpec() {
7982
}
8083

8184
builder.addMethod(endpointProviderMethod());
85+
builder.addMethod(authSchemeProviderMethod());
8286

8387
if (hasClientContextParams()) {
8488
model.getClientContextParams().forEach((n, m) -> {
@@ -155,6 +159,19 @@ private MethodSpec endpointProviderMethod() {
155159
.build();
156160
}
157161

162+
private MethodSpec authSchemeProviderMethod() {
163+
return MethodSpec.methodBuilder("authSchemeProvider")
164+
.addModifiers(Modifier.PUBLIC, Modifier.DEFAULT)
165+
.addParameter(authSchemeSpecUtils.providerInterfaceName(), "authSchemeProvider")
166+
.addJavadoc("Set the {@link $T} implementation that will be used by the client to resolve the "
167+
+ "auth scheme for each request. This is optional; if none is provided a "
168+
+ "default implementation will be used the SDK.",
169+
authSchemeSpecUtils.providerInterfaceName())
170+
.returns(TypeVariableName.get("B"))
171+
.addStatement("throw new $T()", UnsupportedOperationException.class)
172+
.build();
173+
}
174+
158175
private MethodSpec clientContextParamSetter(String name, ClientContextParam param) {
159176
String setterName = Utils.unCapitalize(CodegenNamingUtils.pascalCase(name));
160177
TypeName type = endpointRulesSpecUtils.toJavaType(param.getType());

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import software.amazon.awssdk.core.signer.Signer;
1717
import software.amazon.awssdk.identity.spi.IdentityProvider;
1818
import software.amazon.awssdk.identity.spi.TokenIdentity;
19+
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
1920
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
2021
import software.amazon.awssdk.services.json.endpoints.internal.JsonEndpointAuthSchemeInterceptor;
2122
import software.amazon.awssdk.services.json.endpoints.internal.JsonRequestSetEndpointInterceptor;
@@ -42,6 +43,7 @@ protected final String serviceName() {
4243
@Override
4344
protected final SdkClientConfiguration mergeServiceDefaults(SdkClientConfiguration config) {
4445
return config.merge(c -> c.option(SdkClientOption.ENDPOINT_PROVIDER, defaultEndpointProvider())
46+
.option(SdkClientOption.AUTH_SCHEME_PROVIDER, defaultAuthSchemeProvider())
4547
.option(SdkClientOption.CRC32_FROM_COMPRESSED_DATA_ENABLED, false)
4648
.option(AwsClientOption.TOKEN_IDENTITY_PROVIDER, defaultTokenProvider())
4749
.option(SdkAdvancedClientOption.TOKEN_SIGNER, defaultTokenSigner()));
@@ -72,6 +74,15 @@ private JsonEndpointProvider defaultEndpointProvider() {
7274
return JsonEndpointProvider.defaultProvider();
7375
}
7476

77+
public B authSchemeProvider(JsonAuthSchemeProvider authSchemeProvider) {
78+
clientConfiguration.option(SdkClientOption.AUTH_SCHEME_PROVIDER, authSchemeProvider);
79+
return thisBuilder();
80+
}
81+
82+
private JsonAuthSchemeProvider defaultAuthSchemeProvider() {
83+
return JsonAuthSchemeProvider.defaultProvider();
84+
}
85+
7586
private IdentityProvider<? extends TokenIdentity> defaultTokenProvider() {
7687
return DefaultAwsTokenProvider.create();
7788
}

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/builder/test-bearer-auth-client-builder-interface.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
66
import software.amazon.awssdk.identity.spi.IdentityProvider;
77
import software.amazon.awssdk.identity.spi.TokenIdentity;
8+
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
89
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
910

1011
/**
@@ -21,6 +22,14 @@ default B endpointProvider(JsonEndpointProvider endpointProvider) {
2122
throw new UnsupportedOperationException();
2223
}
2324

25+
/**
26+
* Set the {@link JsonAuthSchemeProvider} implementation that will be used by the client to resolve the auth scheme for
27+
* each request. This is optional; if none is provided a default implementation will be used the SDK.
28+
*/
29+
default B authSchemeProvider(JsonAuthSchemeProvider authSchemeProvider) {
30+
throw new UnsupportedOperationException();
31+
}
32+
2433
/**
2534
* Set the token provider to use for bearer token authorization. This is optional, if none is provided, the SDK will
2635
* use {@link software.amazon.awssdk.auth.token.credentials.aws.DefaultAwsTokenProvider}.

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import software.amazon.awssdk.core.signer.Signer;
2020
import software.amazon.awssdk.identity.spi.IdentityProvider;
2121
import software.amazon.awssdk.identity.spi.TokenIdentity;
22+
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
2223
import software.amazon.awssdk.services.json.endpoints.JsonClientContextParams;
2324
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
2425
import software.amazon.awssdk.services.json.endpoints.internal.JsonEndpointAuthSchemeInterceptor;
@@ -47,6 +48,7 @@ protected final String serviceName() {
4748
@Override
4849
protected final SdkClientConfiguration mergeServiceDefaults(SdkClientConfiguration config) {
4950
return config.merge(c -> c.option(SdkClientOption.ENDPOINT_PROVIDER, defaultEndpointProvider())
51+
.option(SdkClientOption.AUTH_SCHEME_PROVIDER, defaultAuthSchemeProvider())
5052
.option(SdkAdvancedClientOption.SIGNER, defaultSigner())
5153
.option(SdkClientOption.CRC32_FROM_COMPRESSED_DATA_ENABLED, false)
5254
.option(SdkClientOption.SERVICE_CONFIGURATION, ServiceConfiguration.builder().build())
@@ -143,6 +145,15 @@ private JsonEndpointProvider defaultEndpointProvider() {
143145
return JsonEndpointProvider.defaultProvider();
144146
}
145147

148+
public B authSchemeProvider(JsonAuthSchemeProvider authSchemeProvider) {
149+
clientConfiguration.option(SdkClientOption.AUTH_SCHEME_PROVIDER, authSchemeProvider);
150+
return thisBuilder();
151+
}
152+
153+
private JsonAuthSchemeProvider defaultAuthSchemeProvider() {
154+
return JsonAuthSchemeProvider.defaultProvider();
155+
}
156+
146157
public B serviceConfiguration(ServiceConfiguration serviceConfiguration) {
147158
clientConfiguration.option(SdkClientOption.SERVICE_CONFIGURATION, serviceConfiguration);
148159
return thisBuilder();

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
77
import software.amazon.awssdk.identity.spi.IdentityProvider;
88
import software.amazon.awssdk.identity.spi.TokenIdentity;
9+
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
910
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
1011

1112
/**
@@ -28,6 +29,14 @@ default B endpointProvider(JsonEndpointProvider endpointProvider) {
2829
throw new UnsupportedOperationException();
2930
}
3031

32+
/**
33+
* Set the {@link JsonAuthSchemeProvider} implementation that will be used by the client to resolve the auth scheme for
34+
* each request. This is optional; if none is provided a default implementation will be used the SDK.
35+
*/
36+
default B authSchemeProvider(JsonAuthSchemeProvider authSchemeProvider) {
37+
throw new UnsupportedOperationException();
38+
}
39+
3140
/**
3241
* Set the token provider to use for bearer token authorization. This is optional, if none is provided, the SDK will
3342
* use {@link software.amazon.awssdk.auth.token.credentials.aws.DefaultAwsTokenProvider}.

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
1414
import software.amazon.awssdk.core.retry.RetryMode;
1515
import software.amazon.awssdk.core.signer.Signer;
16+
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
1617
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
1718
import software.amazon.awssdk.services.json.endpoints.internal.JsonEndpointAuthSchemeInterceptor;
1819
import software.amazon.awssdk.services.json.endpoints.internal.JsonRequestSetEndpointInterceptor;
@@ -39,6 +40,7 @@ protected final String serviceName() {
3940
@Override
4041
protected final SdkClientConfiguration mergeServiceDefaults(SdkClientConfiguration config) {
4142
return config.merge(c -> c.option(SdkClientOption.ENDPOINT_PROVIDER, defaultEndpointProvider())
43+
.option(SdkClientOption.AUTH_SCHEME_PROVIDER, defaultAuthSchemeProvider())
4244
.option(SdkAdvancedClientOption.SIGNER, defaultSigner())
4345
.option(SdkClientOption.CRC32_FROM_COMPRESSED_DATA_ENABLED, false));
4446
}
@@ -80,6 +82,15 @@ private JsonEndpointProvider defaultEndpointProvider() {
8082
return JsonEndpointProvider.defaultProvider();
8183
}
8284

85+
public B authSchemeProvider(JsonAuthSchemeProvider authSchemeProvider) {
86+
clientConfiguration.option(SdkClientOption.AUTH_SCHEME_PROVIDER, authSchemeProvider);
87+
return thisBuilder();
88+
}
89+
90+
private JsonAuthSchemeProvider defaultAuthSchemeProvider() {
91+
return JsonAuthSchemeProvider.defaultProvider();
92+
}
93+
8394
protected static void validateClientOptions(SdkClientConfiguration c) {
8495
Validate.notNull(c.option(SdkAdvancedClientOption.SIGNER),
8596
"The 'overrideConfiguration.advancedOption[SIGNER]' must be configured in the client builder.");

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import software.amazon.awssdk.identity.spi.IdentityProvider;
2020
import software.amazon.awssdk.identity.spi.TokenIdentity;
2121
import software.amazon.awssdk.protocols.query.interceptor.QueryParametersToBodyInterceptor;
22+
import software.amazon.awssdk.services.query.auth.scheme.QueryAuthSchemeProvider;
2223
import software.amazon.awssdk.services.query.endpoints.QueryClientContextParams;
2324
import software.amazon.awssdk.services.query.endpoints.QueryEndpointProvider;
2425
import software.amazon.awssdk.services.query.endpoints.internal.QueryEndpointAuthSchemeInterceptor;
@@ -46,6 +47,7 @@ protected final String serviceName() {
4647
@Override
4748
protected final SdkClientConfiguration mergeServiceDefaults(SdkClientConfiguration config) {
4849
return config.merge(c -> c.option(SdkClientOption.ENDPOINT_PROVIDER, defaultEndpointProvider())
50+
.option(SdkClientOption.AUTH_SCHEME_PROVIDER, defaultAuthSchemeProvider())
4951
.option(SdkAdvancedClientOption.SIGNER, defaultSigner())
5052
.option(SdkClientOption.CRC32_FROM_COMPRESSED_DATA_ENABLED, false)
5153
.option(AwsClientOption.TOKEN_IDENTITY_PROVIDER, defaultTokenProvider())
@@ -84,6 +86,15 @@ private QueryEndpointProvider defaultEndpointProvider() {
8486
return QueryEndpointProvider.defaultProvider();
8587
}
8688

89+
public B authSchemeProvider(QueryAuthSchemeProvider authSchemeProvider) {
90+
clientConfiguration.option(SdkClientOption.AUTH_SCHEME_PROVIDER, authSchemeProvider);
91+
return thisBuilder();
92+
}
93+
94+
private QueryAuthSchemeProvider defaultAuthSchemeProvider() {
95+
return QueryAuthSchemeProvider.defaultProvider();
96+
}
97+
8798
public B booleanContextParam(Boolean booleanContextParam) {
8899
clientContextParams.put(QueryClientContextParams.BOOLEAN_CONTEXT_PARAM, booleanContextParam);
89100
return thisBuilder();

core/sdk-core/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@
5151
<artifactId>endpoints-spi</artifactId>
5252
<version>${awsjavasdk.version}</version>
5353
</dependency>
54+
<dependency>
55+
<groupId>software.amazon.awssdk</groupId>
56+
<artifactId>http-auth-spi</artifactId>
57+
<version>${awsjavasdk.version}</version>
58+
</dependency>
5459
<dependency>
5560
<groupId>software.amazon.awssdk</groupId>
5661
<artifactId>utils</artifactId>

core/sdk-core/src/main/java/software/amazon/awssdk/core/client/config/SdkClientOption.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import software.amazon.awssdk.endpoints.EndpointProvider;
3232
import software.amazon.awssdk.http.SdkHttpClient;
3333
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
34+
import software.amazon.awssdk.http.auth.spi.AuthSchemeProvider;
3435
import software.amazon.awssdk.metrics.MetricPublisher;
3536
import software.amazon.awssdk.profiles.ProfileFile;
3637
import software.amazon.awssdk.utils.AttributeMap;
@@ -184,6 +185,12 @@ public final class SdkClientOption<T> extends ClientOption<T> {
184185
*/
185186
public static final SdkClientOption<EndpointProvider> ENDPOINT_PROVIDER = new SdkClientOption<>(EndpointProvider.class);
186187

188+
/**
189+
* The {@link AuthSchemeProvider} configured on the client.
190+
*/
191+
public static final SdkClientOption<AuthSchemeProvider> AUTH_SCHEME_PROVIDER =
192+
new SdkClientOption<>(AuthSchemeProvider.class);
193+
187194
/**
188195
* The container for any client contexts parameters set on the client.
189196
*/

0 commit comments

Comments
 (0)