Skip to content

Commit 06fdecf

Browse files
authored
Add AuthScheme to the SerivceClientConfiguration (#4549)
1 parent f36f672 commit 06fdecf

File tree

6 files changed

+233
-4
lines changed

6 files changed

+233
-4
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ private void addLocalFieldForBuilderIfNeeded(Field field, TypeSpec.Builder build
165165
}
166166

167167
private MethodSpec setterForField(Field field) {
168+
MethodSpec fieldBuilderSetter = field.builderSetterImpl();
169+
if (fieldBuilderSetter != null) {
170+
return fieldBuilderSetter.toBuilder().returns(builderInterface).build();
171+
}
168172
MethodSpec.Builder builder = baseSetterForField(field);
169173
if (field.isLocalField()) {
170174
builder.addAnnotation(Override.class);
@@ -199,6 +203,12 @@ private MethodSpec getterForBuilderField(Field field) {
199203

200204

201205
private MethodSpec getterForField(Field field, String fieldName, boolean forDataGetter) {
206+
MethodSpec fieldBuilderGetter = field.builderGetterImpl();
207+
if (fieldBuilderGetter != null) {
208+
return fieldBuilderGetter.toBuilder()
209+
.returns(field.type())
210+
.build();
211+
}
202212
MethodSpec.Builder builder = baseGetterForField(field);
203213
if (!forDataGetter && field.isLocalField()) {
204214
builder.addAnnotation(Override.class);

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,12 @@ private void addLocalFieldForDataIfNeeded(Field field, TypeSpec.Builder builder)
122122
}
123123

124124
private MethodSpec.Builder baseSetterForField(Field field) {
125+
MethodSpec fieldBuilderSetter = field.builderSetter();
126+
if (fieldBuilderSetter != null) {
127+
return fieldBuilderSetter.toBuilder()
128+
.returns(className().nestedClass("Builder"));
129+
}
130+
125131
MethodSpec.Builder builder = MethodSpec.methodBuilder(field.name())
126132
.addModifiers(PUBLIC)
127133
.addParameter(field.type(), field.name())
@@ -138,6 +144,13 @@ private MethodSpec getterForDataField(Field field) {
138144
}
139145

140146
private MethodSpec getterForField(Field field, String fieldName, boolean forDataGetter) {
147+
MethodSpec fieldBuilderGetter = field.builderGetterImpl();
148+
if (fieldBuilderGetter != null) {
149+
return fieldBuilderGetter.toBuilder()
150+
.returns(field.type())
151+
.build();
152+
}
153+
141154
MethodSpec.Builder builder = baseGetterForField(field);
142155
if (!forDataGetter && field.isLocalField()) {
143156
builder.addAnnotation(Override.class);

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

Lines changed: 116 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,18 @@
1717

1818
import com.squareup.javapoet.ClassName;
1919
import com.squareup.javapoet.CodeBlock;
20+
import com.squareup.javapoet.MethodSpec;
2021
import com.squareup.javapoet.ParameterizedTypeName;
2122
import com.squareup.javapoet.TypeName;
2223
import com.squareup.javapoet.WildcardTypeName;
2324
import java.net.URI;
2425
import java.util.ArrayList;
2526
import java.util.Arrays;
27+
import java.util.Collections;
28+
import java.util.HashMap;
2629
import java.util.List;
30+
import java.util.Map;
31+
import javax.lang.model.element.Modifier;
2732
import software.amazon.awssdk.awscore.AwsServiceClientConfiguration;
2833
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
2934
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
@@ -34,6 +39,7 @@
3439
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
3540
import software.amazon.awssdk.core.client.config.SdkClientOption;
3641
import software.amazon.awssdk.endpoints.EndpointProvider;
42+
import software.amazon.awssdk.http.auth.spi.scheme.AuthScheme;
3743
import software.amazon.awssdk.http.auth.spi.scheme.AuthSchemeProvider;
3844
import software.amazon.awssdk.identity.spi.AwsCredentialsIdentity;
3945
import software.amazon.awssdk.identity.spi.IdentityProvider;
@@ -132,7 +138,8 @@ private static List<Field> baseServiceClientConfigurationFields() {
132138
.optionClass(AwsClientOption.class)
133139
.optionValue(AwsClientOption.AWS_REGION)
134140
.build(),
135-
credentialsProviderField()
141+
credentialsProviderField(),
142+
authSchemesField()
136143
);
137144
}
138145

@@ -215,6 +222,78 @@ SdkClientOption.class, fieldName(SdkClientOption.IDENTITY_PROVIDERS, SdkClientOp
215222
return builder.build();
216223
}
217224

225+
226+
private static Field authSchemesField() {
227+
TypeName authSchemeGenericType = ParameterizedTypeName.get(ClassName.get(AuthScheme.class),
228+
WildcardTypeName.subtypeOf(Object.class));
229+
TypeName authSchemesType = ParameterizedTypeName.get(ClassName.get(Map.class), ClassName.get(String.class),
230+
authSchemeGenericType);
231+
Field.Builder builder = Field.builder("authSchemes",
232+
authSchemesType)
233+
.doc("auth schemes")
234+
.definingClass(SdkServiceClientConfiguration.class);
235+
236+
builder.constructFromConfiguration(
237+
CodeBlock.builder()
238+
.addStatement("$T authSchemes = internalBuilder.option($T.$L)",
239+
authSchemesType, SdkClientOption.class,
240+
fieldName(SdkClientOption.AUTH_SCHEMES, SdkClientOption.class))
241+
.beginControlFlow("if (authSchemes != null)")
242+
.addStatement("authSchemes = new $T<>(authSchemes)", HashMap.class)
243+
.endControlFlow()
244+
.addStatement("this.authSchemes = authSchemes")
245+
.build()
246+
);
247+
248+
builder.copyToConfiguration(
249+
CodeBlock.builder()
250+
.beginControlFlow("if (authSchemes != null &&"
251+
+ " !authSchemes.equals(internalBuilder.option($T.$L)))",
252+
SdkClientOption.class, fieldName(SdkClientOption.AUTH_SCHEMES,
253+
SdkClientOption.class))
254+
.addStatement("internalBuilder.option($T.$L, authSchemes())",
255+
SdkClientOption.class, fieldName(SdkClientOption.AUTH_SCHEMES,
256+
SdkClientOption.class))
257+
.endControlFlow()
258+
.build()
259+
);
260+
261+
builder.builderSetterImpl(
262+
MethodSpec.methodBuilder("putAuthScheme")
263+
.addModifiers(Modifier.PUBLIC)
264+
.addAnnotation(Override.class)
265+
.addParameter(authSchemeGenericType, "authScheme")
266+
.beginControlFlow("if (authSchemes == null)")
267+
.addStatement("authSchemes = new $T<>()", HashMap.class)
268+
.endControlFlow()
269+
.addStatement("authSchemes.put(authScheme.schemeId(), authScheme)")
270+
.addStatement("return this")
271+
.build()
272+
);
273+
274+
builder.builderSetter(
275+
MethodSpec.methodBuilder("putAuthScheme")
276+
.addModifiers(Modifier.PUBLIC)
277+
.addAnnotation(Override.class)
278+
.addParameter(authSchemeGenericType, "authScheme")
279+
.build()
280+
);
281+
282+
builder.builderGetterImpl(
283+
MethodSpec.methodBuilder("authSchemes")
284+
.addModifiers(Modifier.PUBLIC)
285+
.addAnnotation(Override.class)
286+
.returns(authSchemesType)
287+
.beginControlFlow("if (authSchemes == null)")
288+
.addStatement("return $T.emptyMap()", Collections.class)
289+
.endControlFlow()
290+
.addStatement("return $T.unmodifiableMap(new $T<>(authSchemes))", Collections.class, HashMap.class)
291+
.build()
292+
);
293+
294+
return builder.build();
295+
}
296+
218297
static class Field {
219298
private final String name;
220299
private final TypeName type;
@@ -225,6 +304,9 @@ static class Field {
225304
private final TypeName baseType;
226305
private final CodeBlock constructFromConfiguration;
227306
private final CodeBlock copyToConfiguration;
307+
private final MethodSpec builderSetterImpl;
308+
private final MethodSpec builderSetter;
309+
private final MethodSpec builderGetterImpl;
228310

229311
Field(Field.Builder builder) {
230312
this.name = Validate.paramNotNull(builder.name, "name");
@@ -236,6 +318,9 @@ static class Field {
236318
this.baseType = builder.baseType;
237319
this.constructFromConfiguration = builder.constructFromConfiguration;
238320
this.copyToConfiguration = builder.copyToConfiguration;
321+
this.builderSetterImpl = builder.builderSetterImpl;
322+
this.builderSetter = builder.builderSetter;
323+
this.builderGetterImpl = builder.builderGetterImpl;
239324
}
240325

241326
public boolean isLocalField() {
@@ -278,6 +363,18 @@ public CodeBlock copyToConfiguration() {
278363
return copyToConfiguration;
279364
}
280365

366+
public MethodSpec builderSetterImpl() {
367+
return builderSetterImpl;
368+
}
369+
370+
public MethodSpec builderSetter() {
371+
return builderSetter;
372+
}
373+
374+
public MethodSpec builderGetterImpl() {
375+
return builderGetterImpl;
376+
}
377+
281378
public static Field.Builder builder() {
282379
return new Field.Builder();
283380
}
@@ -305,7 +402,9 @@ static class Builder {
305402
private TypeName baseType;
306403
private CodeBlock constructFromConfiguration;
307404
private CodeBlock copyToConfiguration;
308-
405+
private MethodSpec builderSetterImpl;
406+
private MethodSpec builderSetter;
407+
private MethodSpec builderGetterImpl;
309408

310409
public Field.Builder name(String name) {
311410
this.name = name;
@@ -357,6 +456,21 @@ public Field.Builder copyToConfiguration(CodeBlock copyToConfiguration) {
357456
return this;
358457
}
359458

459+
public Field.Builder builderSetterImpl(MethodSpec builderSetter) {
460+
this.builderSetterImpl = builderSetter;
461+
return this;
462+
}
463+
464+
public Field.Builder builderSetter(MethodSpec builderSetter) {
465+
this.builderSetter = builderSetter;
466+
return this;
467+
}
468+
469+
public Field.Builder builderGetterImpl(MethodSpec builderGetterImpl) {
470+
this.builderGetterImpl = builderGetterImpl;
471+
return this;
472+
}
473+
360474
public Field build() {
361475
if (value != null && optionClass != null) {
362476
optionName = fieldName(value, optionClass);

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package software.amazon.awssdk.services.jsonprotocoltests.internal;
22

33
import java.net.URI;
4+
import java.util.Collections;
5+
import java.util.HashMap;
6+
import java.util.Map;
47
import software.amazon.awssdk.annotations.Generated;
58
import software.amazon.awssdk.annotations.SdkInternalApi;
69
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
710
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
811
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
912
import software.amazon.awssdk.core.client.config.SdkClientOption;
1013
import software.amazon.awssdk.endpoints.EndpointProvider;
14+
import software.amazon.awssdk.http.auth.spi.scheme.AuthScheme;
1115
import software.amazon.awssdk.http.auth.spi.scheme.AuthSchemeProvider;
1216
import software.amazon.awssdk.identity.spi.AwsCredentialsIdentity;
1317
import software.amazon.awssdk.identity.spi.IdentityProvider;
@@ -41,6 +45,8 @@ public static class BuilderImpl implements BuilderInternal {
4145

4246
private IdentityProvider<? extends AwsCredentialsIdentity> credentialsProvider;
4347

48+
private Map<String, AuthScheme<?>> authSchemes;
49+
4450
private BuilderImpl() {
4551
this.internalBuilder = SdkClientConfiguration.builder();
4652
}
@@ -53,6 +59,11 @@ private BuilderImpl(SdkClientConfiguration.Builder internalBuilder) {
5359
this.endpointOverride = internalBuilder.option(SdkClientOption.ENDPOINT);
5460
}
5561
this.credentialsProvider = internalBuilder.option(AwsClientOption.CREDENTIALS_IDENTITY_PROVIDER);
62+
Map<String, AuthScheme<?>> authSchemes = internalBuilder.option(SdkClientOption.AUTH_SCHEMES);
63+
if (authSchemes != null) {
64+
authSchemes = new HashMap<>(authSchemes);
65+
}
66+
this.authSchemes = authSchemes;
5667
}
5768

5869
/**
@@ -142,6 +153,23 @@ public IdentityProvider<? extends AwsCredentialsIdentity> credentialsProvider()
142153
return credentialsProvider;
143154
}
144155

156+
@Override
157+
public JsonProtocolTestsServiceClientConfiguration.Builder putAuthScheme(AuthScheme<?> authScheme) {
158+
if (authSchemes == null) {
159+
authSchemes = new HashMap<>();
160+
}
161+
authSchemes.put(authScheme.schemeId(), authScheme);
162+
return this;
163+
}
164+
165+
@Override
166+
public Map<String, AuthScheme<?>> authSchemes() {
167+
if (authSchemes == null) {
168+
return Collections.emptyMap();
169+
}
170+
return Collections.unmodifiableMap(new HashMap<>(authSchemes));
171+
}
172+
145173
/**
146174
* Sets the value for auth scheme provider
147175
*/
@@ -190,6 +218,9 @@ public SdkClientConfiguration buildSdkClientConfiguration() {
190218
}
191219
internalBuilder.option(SdkClientOption.IDENTITY_PROVIDERS, identityProviders);
192220
}
221+
if (authSchemes != null && !authSchemes.equals(internalBuilder.option(SdkClientOption.AUTH_SCHEMES))) {
222+
internalBuilder.option(SdkClientOption.AUTH_SCHEMES, authSchemes());
223+
}
193224
return internalBuilder.build();
194225
}
195226
}

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

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

33
import java.net.URI;
4+
import java.util.Map;
45
import software.amazon.awssdk.annotations.Generated;
56
import software.amazon.awssdk.annotations.SdkPublicApi;
67
import software.amazon.awssdk.awscore.AwsServiceClientConfiguration;
78
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
89
import software.amazon.awssdk.endpoints.EndpointProvider;
10+
import software.amazon.awssdk.http.auth.spi.scheme.AuthScheme;
911
import software.amazon.awssdk.identity.spi.AwsCredentialsIdentity;
1012
import software.amazon.awssdk.identity.spi.IdentityProvider;
1113
import software.amazon.awssdk.regions.Region;
@@ -100,6 +102,15 @@ public interface Builder extends AwsServiceClientConfiguration.Builder {
100102
@Override
101103
IdentityProvider<? extends AwsCredentialsIdentity> credentialsProvider();
102104

105+
@Override
106+
Builder putAuthScheme(AuthScheme<?> authScheme);
107+
108+
/**
109+
* Gets the value for auth schemes
110+
*/
111+
@Override
112+
Map<String, AuthScheme<?>> authSchemes();
113+
103114
/**
104115
* Sets the value for auth scheme provider
105116
*/

0 commit comments

Comments
 (0)