4
4
import java .util .Map ;
5
5
6
6
import org .apache .commons .logging .LogFactory ;
7
- import software .amazon .awssdk .services .s3 .model .ChecksumType ;
8
7
import software .amazon .awssdk .services .s3 .model .CompleteMultipartUploadResponse ;
9
8
import software .amazon .awssdk .services .s3 .model .CreateMultipartUploadRequest ;
10
9
import software .amazon .awssdk .services .s3 .model .PutObjectRequest ;
11
10
import software .amazon .awssdk .services .s3 .model .PutObjectResponse ;
12
11
13
12
public class ConvertSDKRequests {
14
13
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
+ */
15
156
public static CreateMultipartUploadRequest convertRequest (PutObjectRequest request ) {
16
-
17
157
final CreateMultipartUploadRequest .Builder output = CreateMultipartUploadRequest .builder ();
18
158
request
19
159
.toBuilder ()
@@ -37,8 +177,6 @@ public static CreateMultipartUploadRequest convertRequest(PutObjectRequest reque
37
177
case "ChecksumAlgorithm" :
38
178
output .checksumAlgorithm ((String ) value );
39
179
break ;
40
- case "ChecksumType" :
41
- output .checksumType ((ChecksumType ) value );
42
180
case "ContentDisposition" :
43
181
assert value instanceof String ;
44
182
output .contentDisposition ((String ) value );
@@ -107,6 +245,9 @@ public static CreateMultipartUploadRequest convertRequest(PutObjectRequest reque
107
245
case "SSECustomerKey" :
108
246
output .sseCustomerKey ((String ) value );
109
247
break ;
248
+ case "SSECustomerKeyMD5" :
249
+ output .sseCustomerKeyMD5 ((String ) value );
250
+ break ;
110
251
case "SSEKMSEncryptionContext" :
111
252
output .ssekmsEncryptionContext ((String ) value );
112
253
break ;
@@ -126,7 +267,7 @@ public static CreateMultipartUploadRequest convertRequest(PutObjectRequest reque
126
267
// Rather than silently dropping the value,
127
268
// we loudly signal that we don't know how to handle this field.
128
269
throw new IllegalArgumentException (
129
- f .locationName () + " is an unknown field. " +
270
+ f .memberName () + " is an unknown field. " +
130
271
"The S3 Encryption Client does not recognize this option and cannot set it on the CreateMultipartUploadRequest." +
131
272
"This may be a new S3 feature." +
132
273
"Please report this to the Amazon S3 Encryption Client for Java: " +
0 commit comments