Skip to content

Add LegacyMd5Plugin for MD5 checksum calculations in S3 operations requiring checksums #6055

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 12 commits into from
Apr 28, 2025
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
@@ -0,0 +1,6 @@
{
"type": "feature",
"category": "Amazon Simple Storage Service",
"contributor": "",
"description": "Added LegacyMd5Plugin to perform MD5 checksums for operations that require checksum"
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@

package software.amazon.awssdk.codegen.poet.model;

import static software.amazon.awssdk.codegen.poet.client.traits.HttpChecksumTrait.hasRequestAlgorithmMember;
import static software.amazon.awssdk.codegen.poet.client.traits.HttpChecksumTrait.hasResponseAlgorithms;

import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.MethodSpec;
Expand All @@ -34,6 +37,8 @@
import software.amazon.awssdk.codegen.poet.auth.scheme.AuthSchemeSpecUtils;
import software.amazon.awssdk.codegen.poet.rules.EndpointRulesSpecUtils;
import software.amazon.awssdk.core.ClientEndpointProvider;
import software.amazon.awssdk.core.checksums.RequestChecksumCalculation;
import software.amazon.awssdk.core.checksums.ResponseChecksumValidation;
import software.amazon.awssdk.core.client.config.ClientOption;
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
Expand Down Expand Up @@ -100,6 +105,7 @@ private List<Field> fields(IntermediateModel model) {
authSchemeProviderField()
));
fields.addAll(addCustomClientParams(model));
fields.addAll(addCustomClientConfigParams(model));
return fields;
}

Expand Down Expand Up @@ -553,4 +559,51 @@ private static String fieldName(Object fieldObject) {
fieldObject,
fieldObject.getClass().getName()));
}

private List<Field> addCustomClientConfigParams(IntermediateModel model) {
List<Field> customClientParamFields = new ArrayList<>();

if (hasRequestAlgorithmMember(model) && hasResponseAlgorithms(model)) {
customClientParamFields.add(
createChecksumConfigField(
"responseChecksumValidation",
ResponseChecksumValidation.class,
"client behavior for response checksum validation",
SdkClientOption.class,
"RESPONSE_CHECKSUM_VALIDATION"
)
);
customClientParamFields.add(
createChecksumConfigField(
"requestChecksumCalculation",
RequestChecksumCalculation.class,
"client behavior for request checksum calculation",
SdkClientOption.class,
"REQUEST_CHECKSUM_CALCULATION"
)
);
}
return customClientParamFields;
}

private Field createChecksumConfigField(String fieldName, Class<?> fieldType, String docString,
Class<?> optionClass, String optionName) {
return fieldBuilder(fieldName, fieldType)
.doc(docString)
.isInherited(false)
.localSetter(basicLocalSetterCode(fieldName))
.localGetter(basicLocalGetterCode(fieldName))
.configSetter(
CodeBlock.builder()
.addStatement("config.option($1T.$2L, $3L)", optionClass, optionName, fieldName)
.addStatement("return this")
.build()
)
.configGetter(
CodeBlock.builder()
.addStatement("return config.option($1T.$2L)", optionClass, optionName)
.build()
)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

package software.amazon.awssdk.codegen.poet.model;

import static software.amazon.awssdk.codegen.poet.ClientTestModels.restJsonServiceModels;
import static software.amazon.awssdk.codegen.poet.PoetMatchers.generatesTo;

import java.io.File;
Expand Down Expand Up @@ -52,4 +53,10 @@ public void testGeneration() {
ServiceClientConfigurationBuilderClass spec = new ServiceClientConfigurationBuilderClass(intermediateModel);
MatcherAssert.assertThat(spec, generatesTo("serviceclientconfiguration-builder.java"));
}

@Test
public void testGenerationWithChecksumCalulationEnabled() {
ServiceClientConfigurationBuilderClass spec = new ServiceClientConfigurationBuilderClass(restJsonServiceModels());
MatcherAssert.assertThat(spec, generatesTo("serviceclientconfiguration-withchecksum-builder.java"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
package software.amazon.awssdk.services.json.internal;

import java.net.URI;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import software.amazon.awssdk.annotations.Generated;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
import software.amazon.awssdk.core.ClientEndpointProvider;
import software.amazon.awssdk.core.checksums.RequestChecksumCalculation;
import software.amazon.awssdk.core.checksums.ResponseChecksumValidation;
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.endpoints.EndpointProvider;
import software.amazon.awssdk.http.auth.spi.scheme.AuthScheme;
import software.amazon.awssdk.http.auth.spi.scheme.AuthSchemeProvider;
import software.amazon.awssdk.identity.spi.AwsCredentialsIdentity;
import software.amazon.awssdk.identity.spi.IdentityProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.json.JsonServiceClientConfiguration;
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
import software.amazon.awssdk.utils.Validate;

@Generated("software.amazon.awssdk:codegen")
@SdkInternalApi
public class JsonServiceClientConfigurationBuilder implements JsonServiceClientConfiguration.Builder {
private final SdkClientConfiguration.Builder config;

public JsonServiceClientConfigurationBuilder() {
this(SdkClientConfiguration.builder());
}

public JsonServiceClientConfigurationBuilder(SdkClientConfiguration.Builder config) {
this.config = config;
}

/**
* Sets the value for client override configuration
*/
@Override
public JsonServiceClientConfiguration.Builder overrideConfiguration(ClientOverrideConfiguration overrideConfiguration) {
config.putAll(overrideConfiguration);
return this;
}

/**
* Gets the value for client override configuration
*/
@Override
public ClientOverrideConfiguration overrideConfiguration() {
return config.asOverrideConfigurationBuilder().build();
}

/**
* Sets the value for endpoint override
*/
@Override
public JsonServiceClientConfiguration.Builder endpointOverride(URI endpointOverride) {
if (endpointOverride != null) {
config.option(SdkClientOption.CLIENT_ENDPOINT_PROVIDER, ClientEndpointProvider.forEndpointOverride(endpointOverride));
} else {
config.option(SdkClientOption.CLIENT_ENDPOINT_PROVIDER, null);
}
return this;
}

/**
* Gets the value for endpoint override
*/
@Override
public URI endpointOverride() {
ClientEndpointProvider clientEndpoint = config.option(SdkClientOption.CLIENT_ENDPOINT_PROVIDER);
if (clientEndpoint != null && clientEndpoint.isEndpointOverridden()) {
return clientEndpoint.clientEndpoint();
}
return null;
}

/**
* Sets the value for endpoint provider
*/
@Override
public JsonServiceClientConfiguration.Builder endpointProvider(EndpointProvider endpointProvider) {
config.option(SdkClientOption.ENDPOINT_PROVIDER, endpointProvider);
return this;
}

/**
* Gets the value for endpoint provider
*/
@Override
public EndpointProvider endpointProvider() {
return config.option(SdkClientOption.ENDPOINT_PROVIDER);
}

/**
* Sets the value for AWS region
*/
@Override
public JsonServiceClientConfiguration.Builder region(Region region) {
config.option(AwsClientOption.AWS_REGION, region);
return this;
}

/**
* Gets the value for AWS region
*/
@Override
public Region region() {
return config.option(AwsClientOption.AWS_REGION);
}

/**
* Sets the value for credentials provider
*/
@Override
public JsonServiceClientConfiguration.Builder credentialsProvider(
IdentityProvider<? extends AwsCredentialsIdentity> credentialsProvider) {
config.option(AwsClientOption.CREDENTIALS_IDENTITY_PROVIDER, credentialsProvider);
return this;
}

/**
* Gets the value for credentials provider
*/
@Override
public IdentityProvider<? extends AwsCredentialsIdentity> credentialsProvider() {
return config.option(AwsClientOption.CREDENTIALS_IDENTITY_PROVIDER);
}

@Override
public JsonServiceClientConfiguration.Builder putAuthScheme(AuthScheme<?> authScheme) {
config.computeOptionIfAbsent(SdkClientOption.AUTH_SCHEMES, HashMap::new).put(authScheme.schemeId(), authScheme);
return this;
}

/**
* Gets the value for auth schemes
*/
@Override
public Map<String, AuthScheme<?>> authSchemes() {
Map<String, AuthScheme<?>> authSchemes = config.option(SdkClientOption.AUTH_SCHEMES);
return Collections.unmodifiableMap(authSchemes == null ? Collections.emptyMap() : authSchemes);
}

/**
* Sets the value for auth scheme provider
*/
@Override
public JsonServiceClientConfiguration.Builder authSchemeProvider(JsonAuthSchemeProvider authSchemeProvider) {
config.option(SdkClientOption.AUTH_SCHEME_PROVIDER, authSchemeProvider);
return this;
}

/**
* Gets the value for auth scheme provider
*/
@Override
public JsonAuthSchemeProvider authSchemeProvider() {
AuthSchemeProvider result = config.option(SdkClientOption.AUTH_SCHEME_PROVIDER);
if (result == null) {
return null;
}
return Validate.isInstanceOf(JsonAuthSchemeProvider.class, result, "Expected an instance of "
+ JsonAuthSchemeProvider.class.getSimpleName());
}

/**
* Sets the value for client behavior for response checksum validation
*/
@Override
public JsonServiceClientConfiguration.Builder responseChecksumValidation(ResponseChecksumValidation responseChecksumValidation) {
config.option(SdkClientOption.RESPONSE_CHECKSUM_VALIDATION, responseChecksumValidation);
return this;
}

/**
* Gets the value for client behavior for response checksum validation
*/
@Override
public ResponseChecksumValidation responseChecksumValidation() {
return config.option(SdkClientOption.RESPONSE_CHECKSUM_VALIDATION);
}

/**
* Sets the value for client behavior for request checksum calculation
*/
@Override
public JsonServiceClientConfiguration.Builder requestChecksumCalculation(RequestChecksumCalculation requestChecksumCalculation) {
config.option(SdkClientOption.REQUEST_CHECKSUM_CALCULATION, requestChecksumCalculation);
return this;
}

/**
* Gets the value for client behavior for request checksum calculation
*/
@Override
public RequestChecksumCalculation requestChecksumCalculation() {
return config.option(SdkClientOption.REQUEST_CHECKSUM_CALCULATION);
}

@Override
public JsonServiceClientConfiguration build() {
return new JsonServiceClientConfiguration(this);
}
}
Loading
Loading