44import java .util .Map ;
55
66import org .apache .commons .logging .LogFactory ;
7- import software .amazon .awssdk .services .s3 .model .ChecksumType ;
87import software .amazon .awssdk .services .s3 .model .CompleteMultipartUploadResponse ;
98import software .amazon .awssdk .services .s3 .model .CreateMultipartUploadRequest ;
109import software .amazon .awssdk .services .s3 .model .PutObjectRequest ;
1110import software .amazon .awssdk .services .s3 .model .PutObjectResponse ;
1211
1312public class ConvertSDKRequests {
1413
14+ /**
15+ * Converts a CreateMultipartUploadRequest to a PutObjectRequest. This conversion is necessary when
16+ * Instruction File PutObject is enabled and a multipart upload is performed.The method copies all the
17+ * relevant fields from the CreateMultipartUploadRequest to the PutObjectRequest.
18+ * @param request The CreateMultipartUploadRequest to convert
19+ * @return The converted PutObjectRequest
20+ * @throws IllegalArgumentException if the request contains an invalid field
21+ */
22+ public static PutObjectRequest convertRequest (CreateMultipartUploadRequest request ) {
23+ final PutObjectRequest .Builder output = PutObjectRequest .builder ();
24+ request
25+ .toBuilder ()
26+ .sdkFields ()
27+ .forEach (f -> {
28+ final Object value = f .getValueOrDefault (request );
29+ if (value != null ) {
30+ switch (f .memberName ()) {
31+ case "ACL" :
32+ output .acl ((String ) value );
33+ break ;
34+ case "Bucket" :
35+ output .bucket ((String ) value );
36+ break ;
37+ case "BucketKeyEnabled" :
38+ output .bucketKeyEnabled ((Boolean ) value );
39+ break ;
40+ case "CacheControl" :
41+ output .cacheControl ((String ) value );
42+ break ;
43+ case "ChecksumAlgorithm" :
44+ output .checksumAlgorithm ((String ) value );
45+ break ;
46+ case "ContentDisposition" :
47+ assert value instanceof String ;
48+ output .contentDisposition ((String ) value );
49+ break ;
50+ case "ContentEncoding" :
51+ output .contentEncoding ((String ) value );
52+ break ;
53+ case "ContentLanguage" :
54+ output .contentLanguage ((String ) value );
55+ break ;
56+ case "ContentType" :
57+ output .contentType ((String ) value );
58+ break ;
59+ case "ExpectedBucketOwner" :
60+ output .expectedBucketOwner ((String ) value );
61+ break ;
62+ case "Expires" :
63+ output .expires ((Instant ) value );
64+ break ;
65+ case "GrantFullControl" :
66+ output .grantFullControl ((String ) value );
67+ break ;
68+ case "GrantRead" :
69+ output .grantRead ((String ) value );
70+ break ;
71+ case "GrantReadACP" :
72+ output .grantReadACP ((String ) value );
73+ break ;
74+ case "GrantWriteACP" :
75+ output .grantWriteACP ((String ) value );
76+ break ;
77+ case "Key" :
78+ output .key ((String ) value );
79+ break ;
80+ case "Metadata" :
81+ if (!isStringStringMap (value )) {
82+ throw new IllegalArgumentException ("Metadata must be a Map<String, String>" );
83+ }
84+ @ SuppressWarnings ("unchecked" )
85+ Map <String , String > metadata = (Map <String , String >) value ;
86+ output .metadata (metadata );
87+ break ;
88+ case "ObjectLockLegalHoldStatus" :
89+ output .objectLockLegalHoldStatus ((String ) value );
90+ break ;
91+ case "ObjectLockMode" :
92+ output .objectLockMode ((String ) value );
93+ break ;
94+ case "ObjectLockRetainUntilDate" :
95+ output .objectLockRetainUntilDate ((Instant ) value );
96+ break ;
97+ case "RequestPayer" :
98+ output .requestPayer ((String ) value );
99+ break ;
100+ case "ServerSideEncryption" :
101+ output .serverSideEncryption ((String ) value );
102+ break ;
103+ case "SSECustomerAlgorithm" :
104+ output .sseCustomerAlgorithm ((String ) value );
105+ break ;
106+ case "SSECustomerKey" :
107+ output .sseCustomerKey ((String ) value );
108+ break ;
109+ case "SSECustomerKeyMD5" :
110+ output .sseCustomerKeyMD5 ((String ) value );
111+ break ;
112+ case "SSEKMSEncryptionContext" :
113+ output .ssekmsEncryptionContext ((String ) value );
114+ break ;
115+ case "SSEKMSKeyId" :
116+ output .ssekmsKeyId ((String ) value );
117+ break ;
118+ case "StorageClass" :
119+ output .storageClass ((String ) value );
120+ break ;
121+ case "Tagging" :
122+ output .tagging ((String ) value );
123+ break ;
124+ case "WebsiteRedirectLocation" :
125+ output .websiteRedirectLocation ((String ) value );
126+ break ;
127+ default :
128+ // Rather than silently dropping the value,
129+ // we loudly signal that we don't know how to handle this field.
130+ throw new IllegalArgumentException (
131+ f .memberName () + " is an unknown field. " +
132+ "The S3 Encryption Client does not recognize this option and cannot set it on the PutObjectRequest." +
133+ "This may be a new S3 feature." +
134+ "Please report this to the Amazon S3 Encryption Client for Java: " +
135+ "https://github.com/aws/amazon-s3-encryption-client-java/issues." +
136+ "To work around this issue, you can disable Instruction File on PutObject or disable" +
137+ "multi part upload, or use the Async client, or not set this value on PutObject." +
138+ "You may be able to update this value after the PutObject request completes."
139+ );
140+ }
141+ }
142+ });
143+ return output
144+ // OverrideConfiguration is not as SDKField but still needs to be supported
145+ .overrideConfiguration (request .overrideConfiguration ().orElse (null ))
146+ .build ();
147+ }
148+ /**
149+ * Converts a PutObjectRequest to CreateMultipartUploadRequest.This conversion is necessary to convert an
150+ * original PutObjectRequest into a CreateMultipartUploadRequest to initiate the
151+ * multipart upload while maintaining the original request's configuration.
152+ * @param request The PutObjectRequest to convert
153+ * @return The converted CreateMultipartUploadRequest
154+ * @throws IllegalArgumentException if the request contains an invalid field
155+ */
15156 public static CreateMultipartUploadRequest convertRequest (PutObjectRequest request ) {
16-
17157 final CreateMultipartUploadRequest .Builder output = CreateMultipartUploadRequest .builder ();
18158 request
19159 .toBuilder ()
@@ -37,8 +177,6 @@ public static CreateMultipartUploadRequest convertRequest(PutObjectRequest reque
37177 case "ChecksumAlgorithm" :
38178 output .checksumAlgorithm ((String ) value );
39179 break ;
40- case "ChecksumType" :
41- output .checksumType ((ChecksumType ) value );
42180 case "ContentDisposition" :
43181 assert value instanceof String ;
44182 output .contentDisposition ((String ) value );
@@ -107,6 +245,9 @@ public static CreateMultipartUploadRequest convertRequest(PutObjectRequest reque
107245 case "SSECustomerKey" :
108246 output .sseCustomerKey ((String ) value );
109247 break ;
248+ case "SSECustomerKeyMD5" :
249+ output .sseCustomerKeyMD5 ((String ) value );
250+ break ;
110251 case "SSEKMSEncryptionContext" :
111252 output .ssekmsEncryptionContext ((String ) value );
112253 break ;
@@ -126,7 +267,7 @@ public static CreateMultipartUploadRequest convertRequest(PutObjectRequest reque
126267 // Rather than silently dropping the value,
127268 // we loudly signal that we don't know how to handle this field.
128269 throw new IllegalArgumentException (
129- f .locationName () + " is an unknown field. " +
270+ f .memberName () + " is an unknown field. " +
130271 "The S3 Encryption Client does not recognize this option and cannot set it on the CreateMultipartUploadRequest." +
131272 "This may be a new S3 feature." +
132273 "Please report this to the Amazon S3 Encryption Client for Java: " +
0 commit comments