Skip to content

Add ClientOverrideConfiguration getter to SdkClientBuilder. (#3023) #3024

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changes/next-release/feature-AWSSDKforJavav2-21e4b73.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": "feature",
"category": "AWS SDK for Java v2",
"contributor": "smswz",
"description": "Add `ClientOverrideConfiguration` getter to `SdkClientBuilder`. Allows for changing multiple overrides on a client through the client builder alone."
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,13 @@ default B overrideConfiguration(Consumer<ClientOverrideConfiguration.Builder> ov
return overrideConfiguration(ClientOverrideConfiguration.builder().applyMutation(overrideConfiguration).build());
}

/**
* Retrieve the current override configuration. This allows further overrides across calls. Can be modified by first
* converting to a builder with {@link ClientOverrideConfiguration#toBuilder()}.
* @return The existing override configuration for the builder.
*/
ClientOverrideConfiguration overrideConfiguration();

/**
* Configure the endpoint with which the SDK should communicate.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ public abstract class SdkDefaultClientBuilder<B extends SdkClientBuilder<B, C>,
private final SdkHttpClient.Builder defaultHttpClientBuilder;
private final SdkAsyncHttpClient.Builder defaultAsyncHttpClientBuilder;

private ClientOverrideConfiguration clientOverrideConfiguration;

private SdkHttpClient.Builder httpClientBuilder;
private SdkAsyncHttpClient.Builder asyncHttpClientBuilder;

Expand Down Expand Up @@ -150,6 +152,7 @@ public final C build() {
/**
* Return a client configuration object, populated with the following chain of priorities.
* <ol>
* <li>Client Configuration Overrides</li>
* <li>Customer Configuration</li>
* <li>Service-Specific Defaults</li>
* <li>Global Defaults</li>
Expand All @@ -158,6 +161,9 @@ public final C build() {
protected final SdkClientConfiguration syncClientConfiguration() {
SdkClientConfiguration configuration = clientConfiguration.build();

// Apply overrides
configuration = setOverrides(configuration);

// Apply defaults
configuration = mergeChildDefaults(configuration);
configuration = mergeGlobalDefaults(configuration);
Expand All @@ -173,6 +179,7 @@ protected final SdkClientConfiguration syncClientConfiguration() {
/**
* Return a client configuration object, populated with the following chain of priorities.
* <ol>
* <li>Client Configuration Overrides</li>
* <li>Customer Configuration</li>
* <li>Implementation/Service-Specific Configuration</li>
* <li>Global Default Configuration</li>
Expand All @@ -181,6 +188,9 @@ protected final SdkClientConfiguration syncClientConfiguration() {
protected final SdkClientConfiguration asyncClientConfiguration() {
SdkClientConfiguration configuration = clientConfiguration.build();

// Apply overrides
configuration = setOverrides(configuration);

// Apply defaults
configuration = mergeChildDefaults(configuration);
configuration = mergeGlobalDefaults(configuration);
Expand All @@ -193,6 +203,39 @@ protected final SdkClientConfiguration asyncClientConfiguration() {
return configuration;
}

private SdkClientConfiguration setOverrides(SdkClientConfiguration configuration) {
if (clientOverrideConfiguration == null) {
return configuration;
}

SdkClientConfiguration.Builder builder = configuration.toBuilder();

builder.option(EXECUTION_INTERCEPTORS, clientOverrideConfiguration.executionInterceptors());
builder.option(RETRY_POLICY, clientOverrideConfiguration.retryPolicy().orElse(null));
builder.option(ADDITIONAL_HTTP_HEADERS, clientOverrideConfiguration.headers());
builder.option(SIGNER, clientOverrideConfiguration.advancedOption(SIGNER).orElse(null));
builder.option(USER_AGENT_SUFFIX, clientOverrideConfiguration.advancedOption(USER_AGENT_SUFFIX).orElse(null));
builder.option(USER_AGENT_PREFIX, clientOverrideConfiguration.advancedOption(USER_AGENT_PREFIX).orElse(null));
builder.option(API_CALL_TIMEOUT, clientOverrideConfiguration.apiCallTimeout().orElse(null));
builder.option(API_CALL_ATTEMPT_TIMEOUT, clientOverrideConfiguration.apiCallAttemptTimeout().orElse(null));
builder.option(DISABLE_HOST_PREFIX_INJECTION,
clientOverrideConfiguration.advancedOption(DISABLE_HOST_PREFIX_INJECTION).orElse(null));
builder.option(PROFILE_FILE, clientOverrideConfiguration.defaultProfileFile().orElse(null));
builder.option(PROFILE_NAME, clientOverrideConfiguration.defaultProfileName().orElse(null));
builder.option(METRIC_PUBLISHERS, clientOverrideConfiguration.metricPublishers());
builder.option(EXECUTION_ATTRIBUTES, clientOverrideConfiguration.executionAttributes());

clientOverrideConfiguration.advancedOption(ENDPOINT_OVERRIDDEN_OVERRIDE).ifPresent(value -> {
builder.option(ENDPOINT_OVERRIDDEN, value);
});

clientOverrideConfiguration.advancedOption(SIGNER).ifPresent(s -> {
builder.option(SIGNER_OVERRIDDEN, true);
});

return builder.build();
}

/**
* Optionally overridden by child implementations to apply implementation-specific default configuration.
* (eg. AWS's default credentials providers)
Expand Down Expand Up @@ -399,31 +442,24 @@ public final void setAsyncConfiguration(ClientAsyncConfiguration asyncConfigurat

@Override
public final B overrideConfiguration(ClientOverrideConfiguration overrideConfig) {
clientConfiguration.option(EXECUTION_INTERCEPTORS, overrideConfig.executionInterceptors());
clientConfiguration.option(RETRY_POLICY, overrideConfig.retryPolicy().orElse(null));
clientConfiguration.option(ADDITIONAL_HTTP_HEADERS, overrideConfig.headers());
clientConfiguration.option(SIGNER, overrideConfig.advancedOption(SIGNER).orElse(null));
clientConfiguration.option(USER_AGENT_SUFFIX, overrideConfig.advancedOption(USER_AGENT_SUFFIX).orElse(null));
clientConfiguration.option(USER_AGENT_PREFIX, overrideConfig.advancedOption(USER_AGENT_PREFIX).orElse(null));
clientConfiguration.option(API_CALL_TIMEOUT, overrideConfig.apiCallTimeout().orElse(null));
clientConfiguration.option(API_CALL_ATTEMPT_TIMEOUT, overrideConfig.apiCallAttemptTimeout().orElse(null));
clientConfiguration.option(DISABLE_HOST_PREFIX_INJECTION,
overrideConfig.advancedOption(DISABLE_HOST_PREFIX_INJECTION).orElse(null));
clientConfiguration.option(PROFILE_FILE, overrideConfig.defaultProfileFile().orElse(null));
clientConfiguration.option(PROFILE_NAME, overrideConfig.defaultProfileName().orElse(null));
clientConfiguration.option(METRIC_PUBLISHERS, overrideConfig.metricPublishers());
clientConfiguration.option(EXECUTION_ATTRIBUTES, overrideConfig.executionAttributes());
overrideConfig.advancedOption(ENDPOINT_OVERRIDDEN_OVERRIDE).ifPresent(value -> {
clientConfiguration.option(ENDPOINT_OVERRIDDEN, value);
});
overrideConfig.advancedOption(SIGNER).ifPresent(s -> clientConfiguration.option(SIGNER_OVERRIDDEN, true));
clientOverrideConfiguration = overrideConfig;

return thisBuilder();
}

public final void setOverrideConfiguration(ClientOverrideConfiguration overrideConfiguration) {
overrideConfiguration(overrideConfiguration);
}

@Override
public final ClientOverrideConfiguration overrideConfiguration() {
if (clientOverrideConfiguration == null) {
return ClientOverrideConfiguration.builder().build();
}

return clientOverrideConfiguration;
}

public final B httpClient(SdkHttpClient httpClient) {
clientConfiguration.option(SdkClientOption.SYNC_HTTP_CLIENT, httpClient);
return thisBuilder();
Expand Down
Loading