1515
1616package software .amazon .awssdk .awscore .client .builder ;
1717
18- import static software .amazon .awssdk .core .client .config .SdkClientOption .DEFAULTS_MODE ;
18+ import static software .amazon .awssdk .awscore .client .config .AwsClientOption .DEFAULTS_MODE ;
1919
2020import java .net .URI ;
2121import java .util .Arrays ;
2727import software .amazon .awssdk .auth .credentials .DefaultCredentialsProvider ;
2828import software .amazon .awssdk .awscore .client .config .AwsAdvancedClientOption ;
2929import software .amazon .awssdk .awscore .client .config .AwsClientOption ;
30+ import software .amazon .awssdk .awscore .defaultsmode .DefaultsMode ;
3031import software .amazon .awssdk .awscore .endpoint .DefaultServiceEndpointBuilder ;
3132import software .amazon .awssdk .awscore .eventstream .EventStreamInitialRequestInterceptor ;
3233import software .amazon .awssdk .awscore .interceptor .HelpfulUnknownHostExceptionInterceptor ;
3334import software .amazon .awssdk .awscore .internal .defaultsmode .AutoDefaultsModeDiscovery ;
35+ import software .amazon .awssdk .awscore .internal .defaultsmode .DefaultsModeConfiguration ;
36+ import software .amazon .awssdk .awscore .internal .defaultsmode .DefaultsModeResolver ;
3437import software .amazon .awssdk .awscore .retry .AwsRetryPolicy ;
3538import software .amazon .awssdk .core .client .builder .SdkDefaultClientBuilder ;
3639import software .amazon .awssdk .core .client .config .SdkAdvancedClientOption ;
3740import software .amazon .awssdk .core .client .config .SdkClientConfiguration ;
3841import software .amazon .awssdk .core .client .config .SdkClientOption ;
3942import software .amazon .awssdk .core .interceptor .ExecutionInterceptor ;
40- import software .amazon .awssdk .core .internal .defaultsmode .DefaultsModeResolver ;
4143import software .amazon .awssdk .core .retry .RetryMode ;
4244import software .amazon .awssdk .core .retry .RetryPolicy ;
43- import software .amazon .awssdk .defaultsmode .DefaultsMode ;
4445import software .amazon .awssdk .http .SdkHttpClient ;
4546import software .amazon .awssdk .http .async .SdkAsyncHttpClient ;
46- import software .amazon .awssdk .internal .defaultsmode .DefaultsModeConfiguration ;
4747import software .amazon .awssdk .profiles .ProfileFile ;
4848import software .amazon .awssdk .regions .Region ;
4949import software .amazon .awssdk .regions .ServiceMetadata ;
@@ -125,7 +125,7 @@ protected final AttributeMap childHttpConfig() {
125125 @ Override
126126 protected final AttributeMap childHttpConfig (SdkClientConfiguration configuration ) {
127127 AttributeMap attributeMap = serviceHttpConfig ();
128- return attributeMap . merge ( httpConfigFromDefaultsMode ( configuration ) );
128+ return mergeSmartHttpDefaults ( configuration , attributeMap );
129129 }
130130
131131 /**
@@ -160,6 +160,13 @@ protected SdkClientConfiguration mergeInternalDefaults(SdkClientConfiguration co
160160 return configuration ;
161161 }
162162
163+ /**
164+ * Return a client configuration object, populated with the following chain of priorities.
165+ * <ol>
166+ * <li>Defaults vended from {@link DefaultsMode} </li>
167+ * <li>AWS Global Defaults</li>
168+ * </ol>
169+ */
163170 @ Override
164171 protected final SdkClientConfiguration finalizeChildConfiguration (SdkClientConfiguration configuration ) {
165172 configuration = finalizeServiceConfiguration (configuration );
@@ -168,9 +175,7 @@ protected final SdkClientConfiguration finalizeChildConfiguration(SdkClientConfi
168175 .option (AwsClientOption .AWS_REGION , resolveRegion (configuration ))
169176 .build ();
170177
171- configuration = configuration .toBuilder ()
172- .option (SdkClientOption .DEFAULTS_MODE , resolveDefaultsMode (configuration ))
173- .build ();
178+ configuration = mergeSmartDefaults (configuration );
174179
175180 return configuration .toBuilder ()
176181 .option (AwsClientOption .CREDENTIALS_PROVIDER , resolveCredentials (configuration ))
@@ -181,6 +186,16 @@ protected final SdkClientConfiguration finalizeChildConfiguration(SdkClientConfi
181186 .build ();
182187 }
183188
189+ private SdkClientConfiguration mergeSmartDefaults (SdkClientConfiguration configuration ) {
190+ DefaultsMode defaultsMode = resolveDefaultsMode (configuration );
191+ RetryMode retryMode = DefaultsModeConfiguration .defaultConfig (defaultsMode ).get (SdkClientOption .DEFAULT_RETRY_MODE );
192+
193+ return configuration .toBuilder ()
194+ .option (DEFAULTS_MODE , defaultsMode )
195+ .build ()
196+ .merge (c -> c .option (SdkClientOption .DEFAULT_RETRY_MODE , retryMode ));
197+ }
198+
184199 /**
185200 * Optionally overridden by child classes to derive service-specific configuration from the default-applied configuration.
186201 */
@@ -189,11 +204,11 @@ protected SdkClientConfiguration finalizeServiceConfiguration(SdkClientConfigura
189204 }
190205
191206 /**
192- * Return the defaults specified for each {@link DefaultsMode}
207+ * Merged the HTTP defaults specified for each {@link DefaultsMode}
193208 */
194- private AttributeMap httpConfigFromDefaultsMode (SdkClientConfiguration sdkClientConfiguration ) {
195- DefaultsMode defaultsMode = sdkClientConfiguration .option (DEFAULTS_MODE );
196- return DefaultsModeConfiguration .defaultHttpConfig (defaultsMode );
209+ private AttributeMap mergeSmartHttpDefaults (SdkClientConfiguration configuration , AttributeMap attributeMap ) {
210+ DefaultsMode defaultsMode = configuration .option (DEFAULTS_MODE );
211+ return attributeMap . merge ( DefaultsModeConfiguration .defaultHttpConfig (defaultsMode ) );
197212 }
198213
199214 /**
@@ -248,12 +263,13 @@ private Region regionFromDefaultProvider(SdkClientConfiguration config) {
248263 }
249264
250265 private DefaultsMode resolveDefaultsMode (SdkClientConfiguration config ) {
251- DefaultsMode defaultsMode = config .option (DEFAULTS_MODE ) != null ?
252- config .option (DEFAULTS_MODE ) :
253- DefaultsModeResolver .create ()
254- .profileFile (() -> config .option (SdkClientOption .PROFILE_FILE ))
255- .profileName (config .option (SdkClientOption .PROFILE_NAME ))
256- .resolve ();
266+ DefaultsMode defaultsMode =
267+ config .option (AwsClientOption .DEFAULTS_MODE ) != null ?
268+ config .option (AwsClientOption .DEFAULTS_MODE ) :
269+ DefaultsModeResolver .create ()
270+ .profileFile (() -> config .option (SdkClientOption .PROFILE_FILE ))
271+ .profileName (config .option (SdkClientOption .PROFILE_NAME ))
272+ .resolve ();
257273
258274 if (defaultsMode == DefaultsMode .AUTO ) {
259275 defaultsMode = autoDefaultsModeDiscovery .discover (config .option (AwsClientOption .AWS_REGION ));
@@ -291,18 +307,11 @@ private RetryPolicy resolveAwsRetryPolicy(SdkClientConfiguration config) {
291307 RetryMode retryMode = RetryMode .resolver ()
292308 .profileFile (() -> config .option (SdkClientOption .PROFILE_FILE ))
293309 .profileName (config .option (SdkClientOption .PROFILE_NAME ))
294- .defaultRetryMode (resolveDefaultRetryMode ( config ))
310+ .defaultRetryMode (config . option ( SdkClientOption . DEFAULT_RETRY_MODE ))
295311 .resolve ();
296312 return AwsRetryPolicy .forRetryMode (retryMode );
297313 }
298314
299- private RetryMode resolveDefaultRetryMode (SdkClientConfiguration config ) {
300- DefaultsMode defaultsMode = config .option (DEFAULTS_MODE );
301- RetryMode retryMode = config .option (SdkClientOption .DEFAULT_RETRY_MODE );
302- return retryMode != null ? retryMode :
303- DefaultsModeConfiguration .defaultConfig (defaultsMode ).get (SdkClientOption .DEFAULT_RETRY_MODE );
304- }
305-
306315 @ Override
307316 public final BuilderT region (Region region ) {
308317 clientConfiguration .option (AwsClientOption .AWS_REGION , region );
@@ -333,4 +342,14 @@ private List<ExecutionInterceptor> awsInterceptors() {
333342 return Arrays .asList (new HelpfulUnknownHostExceptionInterceptor (),
334343 new EventStreamInitialRequestInterceptor ());
335344 }
345+
346+ @ Override
347+ public final BuilderT defaultsMode (DefaultsMode defaultsMode ) {
348+ clientConfiguration .option (DEFAULTS_MODE , defaultsMode );
349+ return thisBuilder ();
350+ }
351+
352+ public final void setDefaultsMode (DefaultsMode defaultsMode ) {
353+ defaultsMode (defaultsMode );
354+ }
336355}
0 commit comments