Skip to content

Commit 53e2ffe

Browse files
authored
Accept and use the new TokenIdentity interfaces (#3895)
* Accept and use the new TokenIdentity interfaces * Move TokenUtils to internal sub-package
1 parent 9e12b56 commit 53e2ffe

File tree

22 files changed

+448
-84
lines changed

22 files changed

+448
-84
lines changed

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
import com.squareup.javapoet.MethodSpec;
2020
import com.squareup.javapoet.ParameterizedTypeName;
2121
import com.squareup.javapoet.TypeSpec;
22+
import com.squareup.javapoet.WildcardTypeName;
2223
import java.net.URI;
2324
import javax.lang.model.element.Modifier;
2425
import software.amazon.awssdk.annotations.SdkInternalApi;
25-
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
2626
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
2727
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
2828
import software.amazon.awssdk.codegen.poet.ClassSpec;
@@ -32,6 +32,8 @@
3232
import software.amazon.awssdk.codegen.utils.AuthUtils;
3333
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
3434
import software.amazon.awssdk.core.client.config.SdkClientOption;
35+
import software.amazon.awssdk.identity.spi.IdentityProvider;
36+
import software.amazon.awssdk.identity.spi.TokenIdentity;
3537

3638
public class AsyncClientBuilderClass implements ClassSpec {
3739
private final IntermediateModel model;
@@ -76,7 +78,7 @@ public TypeSpec poetSpec() {
7678
builder.addMethod(endpointProviderMethod());
7779

7880
if (AuthUtils.usesBearerAuth(model)) {
79-
builder.addMethod(bearerTokenProviderMethod());
81+
builder.addMethod(tokenProviderMethod());
8082
}
8183

8284
return builder.addMethod(buildClientMethod()).build();
@@ -141,12 +143,14 @@ private MethodSpec buildClientMethod() {
141143
.build();
142144
}
143145

144-
private MethodSpec bearerTokenProviderMethod() {
146+
private MethodSpec tokenProviderMethod() {
147+
ParameterizedTypeName tokenProviderTypeName = ParameterizedTypeName.get(ClassName.get(IdentityProvider.class),
148+
WildcardTypeName.subtypeOf(TokenIdentity.class));
145149
return MethodSpec.methodBuilder("tokenProvider").addModifiers(Modifier.PUBLIC)
146150
.addAnnotation(Override.class)
147-
.addParameter(SdkTokenProvider.class, "tokenProvider")
151+
.addParameter(tokenProviderTypeName, "tokenProvider")
148152
.returns(builderClassName)
149-
.addStatement("clientConfiguration.option($T.TOKEN_PROVIDER, tokenProvider)",
153+
.addStatement("clientConfiguration.option($T.TOKEN_IDENTITY_PROVIDER, tokenProvider)",
150154
AwsClientOption.class)
151155
.addStatement("return this")
152156
.build();

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.squareup.javapoet.TypeName;
2828
import com.squareup.javapoet.TypeSpec;
2929
import com.squareup.javapoet.TypeVariableName;
30+
import com.squareup.javapoet.WildcardTypeName;
3031
import java.util.ArrayList;
3132
import java.util.Collections;
3233
import java.util.List;
@@ -35,7 +36,6 @@
3536
import javax.lang.model.element.Modifier;
3637
import software.amazon.awssdk.annotations.SdkInternalApi;
3738
import software.amazon.awssdk.auth.signer.Aws4Signer;
38-
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
3939
import software.amazon.awssdk.auth.token.credentials.aws.DefaultAwsTokenProvider;
4040
import software.amazon.awssdk.auth.token.signer.aws.BearerTokenSigner;
4141
import software.amazon.awssdk.awscore.client.builder.AwsDefaultClientBuilder;
@@ -59,6 +59,8 @@
5959
import software.amazon.awssdk.core.signer.Signer;
6060
import software.amazon.awssdk.http.Protocol;
6161
import software.amazon.awssdk.http.SdkHttpConfigurationOption;
62+
import software.amazon.awssdk.identity.spi.IdentityProvider;
63+
import software.amazon.awssdk.identity.spi.TokenIdentity;
6264
import software.amazon.awssdk.protocols.query.interceptor.QueryParametersToBodyInterceptor;
6365
import software.amazon.awssdk.utils.AttributeMap;
6466
import software.amazon.awssdk.utils.CollectionUtils;
@@ -205,7 +207,7 @@ private MethodSpec mergeServiceDefaultsMethod() {
205207
}
206208

207209
if (AuthUtils.usesBearerAuth(model)) {
208-
builder.addCode(".option($T.TOKEN_PROVIDER, defaultTokenProvider())\n", AwsClientOption.class);
210+
builder.addCode(".option($T.TOKEN_IDENTITY_PROVIDER, defaultTokenProvider())\n", AwsClientOption.class);
209211
builder.addCode(".option($T.TOKEN_SIGNER, defaultTokenSigner())", SdkAdvancedClientOption.class);
210212
}
211213

@@ -595,7 +597,8 @@ private MethodSpec clientContextParamSetter(String name, ClientContextParam para
595597

596598
private MethodSpec defaultBearerTokenProviderMethod() {
597599
return MethodSpec.methodBuilder("defaultTokenProvider")
598-
.returns(SdkTokenProvider.class)
600+
.returns(ParameterizedTypeName.get(ClassName.get(IdentityProvider.class),
601+
WildcardTypeName.subtypeOf(TokenIdentity.class)))
599602
.addModifiers(PRIVATE)
600603
.addStatement("return $T.create()", DefaultAwsTokenProvider.class)
601604
.build();
@@ -638,11 +641,10 @@ private MethodSpec validateClientOptionsMethod() {
638641
SdkAdvancedClientOption.class,
639642
"The 'overrideConfiguration.advancedOption[TOKEN_SIGNER]' "
640643
+ "must be configured in the client builder.");
641-
builder.addStatement("$T.notNull(c.option($T.TOKEN_PROVIDER), $S)",
644+
builder.addStatement("$T.notNull(c.option($T.TOKEN_IDENTITY_PROVIDER), $S)",
642645
Validate.class,
643646
AwsClientOption.class,
644-
"The 'overrideConfiguration.advancedOption[TOKEN_PROVIDER]' "
645-
+ "must be configured in the client builder.");
647+
"The 'tokenProvider' must be configured in the client builder.");
646648
}
647649

648650
return builder.build();

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

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.squareup.javapoet.TypeName;
2323
import com.squareup.javapoet.TypeSpec;
2424
import com.squareup.javapoet.TypeVariableName;
25+
import com.squareup.javapoet.WildcardTypeName;
2526
import java.util.function.Consumer;
2627
import javax.lang.model.element.Modifier;
2728
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
@@ -36,9 +37,14 @@
3637
import software.amazon.awssdk.codegen.poet.rules.EndpointRulesSpecUtils;
3738
import software.amazon.awssdk.codegen.utils.AuthUtils;
3839
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
40+
import software.amazon.awssdk.identity.spi.IdentityProvider;
41+
import software.amazon.awssdk.identity.spi.TokenIdentity;
3942
import software.amazon.awssdk.utils.internal.CodegenNamingUtils;
4043

4144
public class BaseClientBuilderInterface implements ClassSpec {
45+
private static final ParameterizedTypeName TOKEN_IDENTITY_PROVIDER_TYPE_NAME =
46+
ParameterizedTypeName.get(ClassName.get(IdentityProvider.class), WildcardTypeName.subtypeOf(TokenIdentity.class));
47+
4248
private final IntermediateModel model;
4349
private final String basePackage;
4450
private final ClassName builderInterfaceName;
@@ -82,6 +88,7 @@ public TypeSpec poetSpec() {
8288

8389
if (generateTokenProviderMethod()) {
8490
builder.addMethod(tokenProviderMethod());
91+
builder.addMethod(tokenIdentityProviderMethod());
8592
}
8693

8794
return builder.build();
@@ -168,7 +175,7 @@ private boolean generateTokenProviderMethod() {
168175

169176
private MethodSpec tokenProviderMethod() {
170177
return MethodSpec.methodBuilder("tokenProvider")
171-
.addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
178+
.addModifiers(Modifier.PUBLIC, Modifier.DEFAULT)
172179
.returns(TypeVariableName.get("B"))
173180
.addParameter(SdkTokenProvider.class, "tokenProvider")
174181
.addJavadoc("Set the token provider to use for bearer token authorization. This is optional, if none "
@@ -182,6 +189,27 @@ private MethodSpec tokenProviderMethod() {
182189
DefaultAwsTokenProvider.class,
183190
SdkAdvancedClientOption.class,
184191
BearerTokenSigner.class)
192+
.addStatement("return tokenProvider(($T) tokenProvider)", TOKEN_IDENTITY_PROVIDER_TYPE_NAME)
193+
.build();
194+
}
195+
196+
private MethodSpec tokenIdentityProviderMethod() {
197+
return MethodSpec.methodBuilder("tokenProvider")
198+
.addModifiers(Modifier.PUBLIC, Modifier.DEFAULT)
199+
.returns(TypeVariableName.get("B"))
200+
.addParameter(TOKEN_IDENTITY_PROVIDER_TYPE_NAME, "tokenProvider")
201+
.addJavadoc("Set the token provider to use for bearer token authorization. This is optional, if none "
202+
+ "is provided, the SDK will use {@link $T}.\n"
203+
+ "<p>\n"
204+
+ "If the service, or any of its operations require Bearer Token Authorization, then the "
205+
+ "SDK will default to this token provider to retrieve the token to use for authorization.\n"
206+
+ "<p>\n"
207+
+ "This provider works in conjunction with the {@code $T.TOKEN_SIGNER} set on the client. "
208+
+ "By default it is {@link $T}.",
209+
DefaultAwsTokenProvider.class,
210+
SdkAdvancedClientOption.class,
211+
BearerTokenSigner.class)
212+
.addStatement("throw new $T()", UnsupportedOperationException.class)
185213
.build();
186214
}
187215

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
import com.squareup.javapoet.MethodSpec;
2020
import com.squareup.javapoet.ParameterizedTypeName;
2121
import com.squareup.javapoet.TypeSpec;
22+
import com.squareup.javapoet.WildcardTypeName;
2223
import java.net.URI;
2324
import javax.lang.model.element.Modifier;
2425
import software.amazon.awssdk.annotations.SdkInternalApi;
25-
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
2626
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
2727
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
2828
import software.amazon.awssdk.codegen.poet.ClassSpec;
@@ -32,6 +32,8 @@
3232
import software.amazon.awssdk.codegen.utils.AuthUtils;
3333
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
3434
import software.amazon.awssdk.core.client.config.SdkClientOption;
35+
import software.amazon.awssdk.identity.spi.IdentityProvider;
36+
import software.amazon.awssdk.identity.spi.TokenIdentity;
3537

3638
public class SyncClientBuilderClass implements ClassSpec {
3739
private final IntermediateModel model;
@@ -142,11 +144,13 @@ private MethodSpec buildClientMethod() {
142144
}
143145

144146
private MethodSpec tokenProviderMethodImpl() {
147+
ParameterizedTypeName tokenProviderTypeName = ParameterizedTypeName.get(ClassName.get(IdentityProvider.class),
148+
WildcardTypeName.subtypeOf(TokenIdentity.class));
145149
return MethodSpec.methodBuilder("tokenProvider").addModifiers(Modifier.PUBLIC)
146150
.addAnnotation(Override.class)
147-
.addParameter(SdkTokenProvider.class, "tokenProvider")
151+
.addParameter(tokenProviderTypeName, "tokenProvider")
148152
.returns(builderClassName)
149-
.addStatement("clientConfiguration.option($T.TOKEN_PROVIDER, tokenProvider)",
153+
.addStatement("clientConfiguration.option($T.TOKEN_IDENTITY_PROVIDER, tokenProvider)",
150154
AwsClientOption.class)
151155
.addStatement("return this")
152156
.build();

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
import java.net.URI;
44
import software.amazon.awssdk.annotations.Generated;
55
import software.amazon.awssdk.annotations.SdkInternalApi;
6-
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
76
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
87
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
98
import software.amazon.awssdk.core.client.config.SdkClientOption;
9+
import software.amazon.awssdk.identity.spi.IdentityProvider;
10+
import software.amazon.awssdk.identity.spi.TokenIdentity;
1011
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
1112

1213
/**
@@ -23,8 +24,8 @@ public DefaultJsonAsyncClientBuilder endpointProvider(JsonEndpointProvider endpo
2324
}
2425

2526
@Override
26-
public DefaultJsonAsyncClientBuilder tokenProvider(SdkTokenProvider tokenProvider) {
27-
clientConfiguration.option(AwsClientOption.TOKEN_PROVIDER, tokenProvider);
27+
public DefaultJsonAsyncClientBuilder tokenProvider(IdentityProvider<? extends TokenIdentity> tokenProvider) {
28+
clientConfiguration.option(AwsClientOption.TOKEN_IDENTITY_PROVIDER, tokenProvider);
2829
return this;
2930
}
3031

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.util.List;
55
import software.amazon.awssdk.annotations.Generated;
66
import software.amazon.awssdk.annotations.SdkInternalApi;
7-
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
87
import software.amazon.awssdk.auth.token.credentials.aws.DefaultAwsTokenProvider;
98
import software.amazon.awssdk.auth.token.signer.aws.BearerTokenSigner;
109
import software.amazon.awssdk.awscore.client.builder.AwsDefaultClientBuilder;
@@ -15,6 +14,8 @@
1514
import software.amazon.awssdk.core.interceptor.ClasspathInterceptorChainFactory;
1615
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
1716
import software.amazon.awssdk.core.signer.Signer;
17+
import software.amazon.awssdk.identity.spi.IdentityProvider;
18+
import software.amazon.awssdk.identity.spi.TokenIdentity;
1819
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
1920
import software.amazon.awssdk.services.json.endpoints.internal.JsonEndpointAuthSchemeInterceptor;
2021
import software.amazon.awssdk.services.json.endpoints.internal.JsonRequestSetEndpointInterceptor;
@@ -42,7 +43,7 @@ protected final String serviceName() {
4243
protected final SdkClientConfiguration mergeServiceDefaults(SdkClientConfiguration config) {
4344
return config.merge(c -> c.option(SdkClientOption.ENDPOINT_PROVIDER, defaultEndpointProvider())
4445
.option(SdkClientOption.CRC32_FROM_COMPRESSED_DATA_ENABLED, false)
45-
.option(AwsClientOption.TOKEN_PROVIDER, defaultTokenProvider())
46+
.option(AwsClientOption.TOKEN_IDENTITY_PROVIDER, defaultTokenProvider())
4647
.option(SdkAdvancedClientOption.TOKEN_SIGNER, defaultTokenSigner()));
4748
}
4849

@@ -71,7 +72,7 @@ private JsonEndpointProvider defaultEndpointProvider() {
7172
return JsonEndpointProvider.defaultProvider();
7273
}
7374

74-
private SdkTokenProvider defaultTokenProvider() {
75+
private IdentityProvider<? extends TokenIdentity> defaultTokenProvider() {
7576
return DefaultAwsTokenProvider.create();
7677
}
7778

@@ -82,7 +83,7 @@ private Signer defaultTokenSigner() {
8283
protected static void validateClientOptions(SdkClientConfiguration c) {
8384
Validate.notNull(c.option(SdkAdvancedClientOption.TOKEN_SIGNER),
8485
"The 'overrideConfiguration.advancedOption[TOKEN_SIGNER]' must be configured in the client builder.");
85-
Validate.notNull(c.option(AwsClientOption.TOKEN_PROVIDER),
86-
"The 'overrideConfiguration.advancedOption[TOKEN_PROVIDER]' must be configured in the client builder.");
86+
Validate.notNull(c.option(AwsClientOption.TOKEN_IDENTITY_PROVIDER),
87+
"The 'tokenProvider' must be configured in the client builder.");
8788
}
8889
}

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import software.amazon.awssdk.annotations.Generated;
44
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider;
55
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
6+
import software.amazon.awssdk.identity.spi.IdentityProvider;
7+
import software.amazon.awssdk.identity.spi.TokenIdentity;
68
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
79

810
/**
@@ -30,5 +32,22 @@ default B endpointProvider(JsonEndpointProvider endpointProvider) {
3032
* {@code software.amazon.awssdk.core.client.config.SdkAdvancedClientOption.TOKEN_SIGNER} set on the client. By
3133
* default it is {@link software.amazon.awssdk.auth.token.signer.aws.BearerTokenSigner}.
3234
*/
33-
B tokenProvider(SdkTokenProvider tokenProvider);
35+
default B tokenProvider(SdkTokenProvider tokenProvider) {
36+
return tokenProvider((IdentityProvider<? extends TokenIdentity>) tokenProvider);
37+
}
38+
39+
/**
40+
* Set the token provider to use for bearer token authorization. This is optional, if none is provided, the SDK will
41+
* use {@link software.amazon.awssdk.auth.token.credentials.aws.DefaultAwsTokenProvider}.
42+
* <p>
43+
* If the service, or any of its operations require Bearer Token Authorization, then the SDK will default to this
44+
* token provider to retrieve the token to use for authorization.
45+
* <p>
46+
* This provider works in conjunction with the
47+
* {@code software.amazon.awssdk.core.client.config.SdkAdvancedClientOption.TOKEN_SIGNER} set on the client. By
48+
* default it is {@link software.amazon.awssdk.auth.token.signer.aws.BearerTokenSigner}.
49+
*/
50+
default B tokenProvider(IdentityProvider<? extends TokenIdentity> tokenProvider) {
51+
throw new UnsupportedOperationException();
52+
}
3453
}

0 commit comments

Comments
 (0)