1717
1818import com .squareup .javapoet .ClassName ;
1919import com .squareup .javapoet .CodeBlock ;
20+ import com .squareup .javapoet .MethodSpec ;
2021import com .squareup .javapoet .ParameterizedTypeName ;
2122import com .squareup .javapoet .TypeName ;
2223import com .squareup .javapoet .WildcardTypeName ;
2324import java .net .URI ;
2425import java .util .ArrayList ;
2526import java .util .Arrays ;
27+ import java .util .Collections ;
28+ import java .util .HashMap ;
2629import java .util .List ;
30+ import java .util .Map ;
31+ import javax .lang .model .element .Modifier ;
2732import software .amazon .awssdk .awscore .AwsServiceClientConfiguration ;
2833import software .amazon .awssdk .awscore .client .config .AwsClientOption ;
2934import software .amazon .awssdk .codegen .model .intermediate .IntermediateModel ;
3439import software .amazon .awssdk .core .client .config .SdkClientConfiguration ;
3540import software .amazon .awssdk .core .client .config .SdkClientOption ;
3641import software .amazon .awssdk .endpoints .EndpointProvider ;
42+ import software .amazon .awssdk .http .auth .spi .scheme .AuthScheme ;
3743import software .amazon .awssdk .http .auth .spi .scheme .AuthSchemeProvider ;
3844import software .amazon .awssdk .identity .spi .AwsCredentialsIdentity ;
3945import 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 );
0 commit comments