Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.squareup.javapoet.TypeSpec;
import com.squareup.javapoet.TypeVariableName;
import com.squareup.javapoet.WildcardTypeName;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
Expand All @@ -49,6 +50,7 @@
import software.amazon.awssdk.codegen.internal.Utils;
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
import software.amazon.awssdk.codegen.model.intermediate.OperationModel;
import software.amazon.awssdk.codegen.model.rules.endpoints.BuiltInParameter;
import software.amazon.awssdk.codegen.model.service.ClientContextParam;
import software.amazon.awssdk.codegen.poet.ClassSpec;
import software.amazon.awssdk.codegen.poet.PoetExtension;
Expand Down Expand Up @@ -86,7 +88,6 @@
import software.amazon.awssdk.identity.spi.IdentityProviders;
import software.amazon.awssdk.identity.spi.TokenIdentity;
import software.amazon.awssdk.protocols.json.internal.unmarshall.SdkClientJsonProtocolAdvancedOption;
import software.amazon.awssdk.regions.ServiceMetadataAdvancedOption;
import software.amazon.awssdk.utils.AttributeMap;
import software.amazon.awssdk.utils.CollectionUtils;
import software.amazon.awssdk.utils.StringUtils;
Expand Down Expand Up @@ -514,21 +515,57 @@ private MethodSpec finalizeServiceConfigurationMethod() {
String serviceNameForSystemProperty = model.getNamingStrategy().getServiceNameForSystemProperties();
String serviceNameForProfileFile = model.getNamingStrategy().getServiceNameForProfileFile();

builder.addCode("builder.lazyOptionIfAbsent($T.CLIENT_ENDPOINT_PROVIDER, c ->", SdkClientOption.class)
.addCode(" $T.builder()", AwsClientEndpointProvider.class)
.addCode(" .serviceEndpointOverrideEnvironmentVariable($S)", "AWS_ENDPOINT_URL_" + serviceNameForEnvVar)
.addCode(" .serviceEndpointOverrideSystemProperty($S)", "aws.endpointUrl" + serviceNameForSystemProperty)
.addCode(" .serviceProfileProperty($S)", serviceNameForProfileFile)
.addCode(" .serviceEndpointPrefix(serviceEndpointPrefix())")
.addCode(" .defaultProtocol($S)", "https")
.addCode(" .region(c.get($T.AWS_REGION))", AwsClientOption.class)
.addCode(" .profileFile(c.get($T.PROFILE_FILE_SUPPLIER))", SdkClientOption.class)
.addCode(" .profileName(c.get($T.PROFILE_NAME))", SdkClientOption.class)
.addCode(" .putAdvancedOption($T.DEFAULT_S3_US_EAST_1_REGIONAL_ENDPOINT,", ServiceMetadataAdvancedOption.class)
.addCode(" c.get($T.DEFAULT_S3_US_EAST_1_REGIONAL_ENDPOINT))", ServiceMetadataAdvancedOption.class)
.addCode(" .dualstackEnabled(c.get($T.DUALSTACK_ENDPOINT_ENABLED))", AwsClientOption.class)
.addCode(" .fipsEnabled(c.get($T.FIPS_ENDPOINT_ENABLED))", AwsClientOption.class)
.addCode(" .build());");
builder.addCode("builder.lazyOptionIfAbsent($T.CLIENT_ENDPOINT_PROVIDER, c -> {\n", SdkClientOption.class)
.addCode(" $T<$T> overrideEndpoint = $T.builder()\n",
Optional.class, URI.class,
AwsClientEndpointProvider.class)
.addCode(" .serviceEndpointOverrideEnvironmentVariable($S)\n", "AWS_ENDPOINT_URL_" + serviceNameForEnvVar)
.addCode(" .serviceEndpointOverrideSystemProperty($S)\n", "aws.endpointUrl" + serviceNameForSystemProperty)
.addCode(" .serviceProfileProperty($S)\n", serviceNameForProfileFile)
.addCode(" .profileFile(c.get($T.PROFILE_FILE_SUPPLIER))\n", SdkClientOption.class)
.addCode(" .profileName(c.get($T.PROFILE_NAME))\n", SdkClientOption.class)
.addCode(" .resolveFromOverrides();\n")
.addCode(" if (overrideEndpoint.isPresent()) {\n")
.addCode(" return $T.create(overrideEndpoint.get(), true);\n",
ClassName.get("software.amazon.awssdk.core", "ClientEndpointProvider"))
.addCode(" }\n")
.addCode(" $T clientEndpointUri = null;\n", URI.class)
.addCode(" $T region = c.get($T.AWS_REGION);\n",
ClassName.get("software.amazon.awssdk.regions", "Region"),
AwsClientOption.class)
.addCode(" try {\n")
.addCode(" $T endpointParams = $T.builder()\n",
endpointRulesSpecUtils.parametersClassName(), endpointRulesSpecUtils.parametersClassName())
.addCode(" .region(region)\n");

if (hasBuiltIn(BuiltInParameter.AWS_USE_DUAL_STACK)) {
builder.addCode(" .useDualStack(c.get($T.DUALSTACK_ENDPOINT_ENABLED))\n", AwsClientOption.class);
}
if (hasBuiltIn(BuiltInParameter.AWS_USE_FIPS)) {
builder.addCode(" .useFips(c.get($T.FIPS_ENDPOINT_ENABLED))\n", AwsClientOption.class);
}

builder.addCode(" .build();\n")
.addCode(" $T endpoint = $T.joinLikeSync(defaultEndpointProvider().resolveEndpoint(endpointParams));\n",
ClassName.get("software.amazon.awssdk.endpoints", "Endpoint"),
ClassName.get("software.amazon.awssdk.utils", "CompletableFutureUtils"))
.addCode(" clientEndpointUri = endpoint.url();\n")
.addCode(" } catch (Exception e) {\n")
.addCode(" // Endpoint resolution failed. This is expected for services with required parameters\n")
.addCode(" // beyond region, dualstack, and FIPS. Use a placeholder that will be replaced at request time.\n")
.addCode(" return $T.create($T.create($S), false);\n",
ClassName.get("software.amazon.awssdk.core", "ClientEndpointProvider"),
URI.class, "https://localhost")
.addCode(" }\n")
.addCode(" if (clientEndpointUri.getHost() == null) {\n")
.addCode(" throw $T.create(\"Configured region (\" + region\n",
ClassName.get("software.amazon.awssdk.core.exception", "SdkClientException"))
.addCode(" + \") resulted in an invalid URI: \" + clientEndpointUri\n")
.addCode(" + \". This is usually caused by an invalid region configuration.\");\n")
.addCode(" }\n")
.addCode(" return $T.create(clientEndpointUri, false);\n",
ClassName.get("software.amazon.awssdk.core", "ClientEndpointProvider"))
.addCode("});\n");

if (model.getMetadata().isJsonProtocol()) {
builder.addStatement("builder.option($1T.ENABLE_FAST_UNMARSHALLER, true)",
Expand Down Expand Up @@ -1051,6 +1088,11 @@ private boolean hasClientContextParams() {
return clientContextParams != null && !clientContextParams.isEmpty();
}

private boolean hasBuiltIn(BuiltInParameter builtIn) {
return model.getEndpointRuleSetModel().getParameters().values().stream()
.anyMatch(p -> builtIn.equals(p.getBuiltInEnum()));
}

private boolean hasSdkClientContextParams() {
return model.getCustomizationConfig() != null
&& model.getCustomizationConfig().getCustomClientContextParams() != null
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package software.amazon.awssdk.services.json;

import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.annotations.SdkInternalApi;
Expand All @@ -15,29 +17,34 @@
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
import software.amazon.awssdk.awscore.endpoint.AwsClientEndpointProvider;
import software.amazon.awssdk.awscore.retry.AwsRetryStrategy;
import software.amazon.awssdk.core.ClientEndpointProvider;
import software.amazon.awssdk.core.SdkPlugin;
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
import software.amazon.awssdk.core.client.config.SdkClientOption;
import software.amazon.awssdk.core.exception.SdkClientException;
import software.amazon.awssdk.core.interceptor.ClasspathInterceptorChainFactory;
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
import software.amazon.awssdk.core.retry.RetryMode;
import software.amazon.awssdk.endpoints.Endpoint;
import software.amazon.awssdk.http.auth.scheme.BearerAuthScheme;
import software.amazon.awssdk.http.auth.scheme.NoAuthAuthScheme;
import software.amazon.awssdk.http.auth.spi.scheme.AuthScheme;
import software.amazon.awssdk.identity.spi.IdentityProvider;
import software.amazon.awssdk.identity.spi.IdentityProviders;
import software.amazon.awssdk.identity.spi.TokenIdentity;
import software.amazon.awssdk.protocols.json.internal.unmarshall.SdkClientJsonProtocolAdvancedOption;
import software.amazon.awssdk.regions.ServiceMetadataAdvancedOption;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.retries.api.RetryStrategy;
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
import software.amazon.awssdk.services.json.auth.scheme.internal.JsonAuthSchemeInterceptor;
import software.amazon.awssdk.services.json.endpoints.JsonEndpointParams;
import software.amazon.awssdk.services.json.endpoints.JsonEndpointProvider;
import software.amazon.awssdk.services.json.endpoints.internal.JsonRequestSetEndpointInterceptor;
import software.amazon.awssdk.services.json.endpoints.internal.JsonResolveEndpointInterceptor;
import software.amazon.awssdk.services.json.internal.JsonServiceClientConfigurationBuilder;
import software.amazon.awssdk.utils.CollectionUtils;
import software.amazon.awssdk.utils.CompletableFutureUtils;
import software.amazon.awssdk.utils.Validate;

/**
Expand Down Expand Up @@ -96,20 +103,33 @@ protected final SdkClientConfiguration finalizeServiceConfiguration(SdkClientCon
builder.option(SdkClientOption.EXECUTION_INTERCEPTORS, interceptors);
builder.lazyOptionIfAbsent(
SdkClientOption.CLIENT_ENDPOINT_PROVIDER,
c -> AwsClientEndpointProvider
.builder()
.serviceEndpointOverrideEnvironmentVariable("AWS_ENDPOINT_URL_JSON_SERVICE")
.serviceEndpointOverrideSystemProperty("aws.endpointUrlJson")
.serviceProfileProperty("json_service")
.serviceEndpointPrefix(serviceEndpointPrefix())
.defaultProtocol("https")
.region(c.get(AwsClientOption.AWS_REGION))
.profileFile(c.get(SdkClientOption.PROFILE_FILE_SUPPLIER))
.profileName(c.get(SdkClientOption.PROFILE_NAME))
.putAdvancedOption(ServiceMetadataAdvancedOption.DEFAULT_S3_US_EAST_1_REGIONAL_ENDPOINT,
c.get(ServiceMetadataAdvancedOption.DEFAULT_S3_US_EAST_1_REGIONAL_ENDPOINT))
.dualstackEnabled(c.get(AwsClientOption.DUALSTACK_ENDPOINT_ENABLED))
.fipsEnabled(c.get(AwsClientOption.FIPS_ENDPOINT_ENABLED)).build());
c -> {
Optional<URI> overrideEndpoint = AwsClientEndpointProvider.builder()
.serviceEndpointOverrideEnvironmentVariable("AWS_ENDPOINT_URL_JSON_SERVICE")
.serviceEndpointOverrideSystemProperty("aws.endpointUrlJson").serviceProfileProperty("json_service")
.profileFile(c.get(SdkClientOption.PROFILE_FILE_SUPPLIER))
.profileName(c.get(SdkClientOption.PROFILE_NAME)).resolveFromOverrides();
if (overrideEndpoint.isPresent()) {
return ClientEndpointProvider.create(overrideEndpoint.get(), true);
}
URI clientEndpointUri = null;
Region region = c.get(AwsClientOption.AWS_REGION);
try {
JsonEndpointParams endpointParams = JsonEndpointParams.builder().region(region).build();
Endpoint endpoint = CompletableFutureUtils.joinLikeSync(defaultEndpointProvider().resolveEndpoint(
endpointParams));
clientEndpointUri = endpoint.url();
} catch (Exception e) {
// Endpoint resolution failed. This is expected for services with required parameters
// beyond region, dualstack, and FIPS. Use a placeholder that will be replaced at request time.
return ClientEndpointProvider.create(URI.create("https://localhost"), false);
}
if (clientEndpointUri.getHost() == null) {
throw SdkClientException.create("Configured region (" + region + ") resulted in an invalid URI: "
+ clientEndpointUri + ". This is usually caused by an invalid region configuration.");
}
return ClientEndpointProvider.create(clientEndpointUri, false);
});
builder.option(SdkClientJsonProtocolAdvancedOption.ENABLE_FAST_UNMARSHALLER, true);
return builder.build();
}
Expand Down
Loading
Loading