in codegen/src/main/java/software/amazon/awssdk/codegen/poet/builder/BaseClientBuilderClass.java [207:305]
private MethodSpec finalizeServiceConfigurationMethod() {
String requestHandlerDirectory = Utils.packageToDirectory(model.getMetadata().getFullClientPackageName());
String requestHandlerPath = String.format("%s/execution.interceptors", requestHandlerDirectory);
MethodSpec.Builder builder = MethodSpec.methodBuilder("finalizeServiceConfiguration")
.addAnnotation(Override.class)
.addModifiers(PROTECTED, FINAL)
.returns(SdkClientConfiguration.class)
.addParameter(SdkClientConfiguration.class, "config");
// Initialize configuration values
builder.addCode("$1T interceptorFactory = new $1T();\n", ClasspathInterceptorChainFactory.class)
.addCode("$T<$T> interceptors = interceptorFactory.getInterceptors($S);\n",
List.class, ExecutionInterceptor.class, requestHandlerPath)
.addCode("interceptors = $T.mergeLists(interceptors, config.option($T.EXECUTION_INTERCEPTORS));\n",
CollectionUtils.class, SdkClientOption.class);
if (model.getMetadata().isQueryProtocol()) {
TypeName listType = ParameterizedTypeName.get(List.class, ExecutionInterceptor.class);
builder.addStatement("$T protocolInterceptors = $T.singletonList(new $T())",
listType,
Collections.class,
QueryParametersToBodyInterceptor.class);
builder.addStatement("interceptors = $T.mergeLists(interceptors, protocolInterceptors)",
CollectionUtils.class);
}
if (model.getEndpointOperation().isPresent()) {
builder.beginControlFlow("if (!endpointDiscoveryEnabled)")
.addStatement("$1T chain = new $1T(config)", DefaultEndpointDiscoveryProviderChain.class)
.addStatement("endpointDiscoveryEnabled = chain.resolveEndpointDiscovery()")
.endControlFlow();
}
String clientConfigClassName = model.getCustomizationConfig().getServiceConfig().getClassName();
if (StringUtils.isNotBlank(clientConfigClassName)) {
ClassName clientConfigClass = ClassName.bestGuess(clientConfigClassName);
builder.addCode("$1T.Builder c = (($1T) config.option($2T.SERVICE_CONFIGURATION)).toBuilder();" +
"c.profileFile(c.profileFile() != null ? c.profileFile() : config.option($2T.PROFILE_FILE));" +
"c.profileName(c.profileName() != null ? c.profileName() : config.option($2T.PROFILE_NAME));",
clientConfigClass, SdkClientOption.class);
if (model.getCustomizationConfig().getServiceConfig().hasDualstackProperty()) {
builder.addCode("if (c.dualstackEnabled() != null) {")
.addCode(" $T.validState(config.option($T.DUALSTACK_ENDPOINT_ENABLED) == null, \"Dualstack has been "
+ "configured on both $L and the client/global level. Please limit dualstack configuration to "
+ "one location.\");",
Validate.class, AwsClientOption.class, clientConfigClassName)
.addCode("} else {")
.addCode(" c.dualstackEnabled(config.option($T.DUALSTACK_ENDPOINT_ENABLED));", AwsClientOption.class)
.addCode("}");
}
if (model.getCustomizationConfig().getServiceConfig().hasFipsProperty()) {
builder.addCode("if (c.fipsModeEnabled() != null) {")
.addCode(" $T.validState(config.option($T.FIPS_ENDPOINT_ENABLED) == null, \"Fips has been "
+ "configured on both $L and the client/global level. Please limit fips configuration to "
+ "one location.\");",
Validate.class, AwsClientOption.class, clientConfigClassName)
.addCode("} else {")
.addCode(" c.fipsModeEnabled(config.option($T.FIPS_ENDPOINT_ENABLED));", AwsClientOption.class)
.addCode("}");
}
}
// Update configuration
builder.addCode("return config.toBuilder()\n");
if (model.getCustomizationConfig().getServiceConfig().hasDualstackProperty()) {
builder.addCode(".option($T.DUALSTACK_ENDPOINT_ENABLED, c.dualstackEnabled())", AwsClientOption.class);
}
if (model.getCustomizationConfig().getServiceConfig().hasFipsProperty()) {
builder.addCode(".option($T.FIPS_ENDPOINT_ENABLED, c.fipsModeEnabled())", AwsClientOption.class);
}
if (model.getEndpointOperation().isPresent()) {
builder.addCode(".option($T.ENDPOINT_DISCOVERY_ENABLED, endpointDiscoveryEnabled)\n",
SdkClientOption.class);
}
builder.addCode(".option($1T.EXECUTION_INTERCEPTORS, interceptors)", SdkClientOption.class);
if (StringUtils.isNotBlank(model.getCustomizationConfig().getCustomRetryPolicy())) {
builder.addCode(".option($1T.RETRY_POLICY, $2T.resolveRetryPolicy(config))",
SdkClientOption.class,
PoetUtils.classNameFromFqcn(model.getCustomizationConfig().getCustomRetryPolicy()));
}
if (StringUtils.isNotBlank(clientConfigClassName)) {
builder.addCode(".option($T.SERVICE_CONFIGURATION, c.build())", SdkClientOption.class);
}
builder.addCode(".build();");
return builder.build();
}