|
1 | 1 | package software.amazon.encryption.s3.internal; |
2 | 2 |
|
| 3 | +import java.time.Instant; |
| 4 | +import java.util.Map; |
| 5 | + |
| 6 | +import org.apache.commons.logging.LogFactory; |
3 | 7 | import software.amazon.awssdk.services.s3.model.ChecksumType; |
| 8 | +import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadResponse; |
4 | 9 | import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest; |
5 | 10 | import software.amazon.awssdk.services.s3.model.PutObjectRequest; |
6 | | -import java.time.Instant; |
7 | | -import java.util.Map; |
| 11 | +import software.amazon.awssdk.services.s3.model.PutObjectResponse; |
8 | 12 |
|
9 | 13 | public class ConvertSDKRequests { |
10 | 14 |
|
11 | | - public static CreateMultipartUploadRequest convert(PutObjectRequest request) { |
| 15 | + public static CreateMultipartUploadRequest convertRequest(PutObjectRequest request) { |
12 | 16 |
|
13 | 17 | final CreateMultipartUploadRequest.Builder output = CreateMultipartUploadRequest.builder(); |
14 | 18 | request |
@@ -140,6 +144,77 @@ public static CreateMultipartUploadRequest convert(PutObjectRequest request) { |
140 | 144 | .build(); |
141 | 145 | } |
142 | 146 |
|
| 147 | + public static PutObjectResponse convertResponse(CompleteMultipartUploadResponse response) { |
| 148 | + final PutObjectResponse.Builder output = PutObjectResponse.builder(); |
| 149 | + response |
| 150 | + .toBuilder() |
| 151 | + .sdkFields() |
| 152 | + .forEach(f -> { |
| 153 | + final Object value = f.getValueOrDefault(response); |
| 154 | + if (value != null) { |
| 155 | + switch (f.memberName()) { |
| 156 | + case "ETag": |
| 157 | + output.eTag((String) value); |
| 158 | + break; |
| 159 | + case "Expiration": |
| 160 | + output.expiration((String) value); |
| 161 | + break; |
| 162 | + case "ChecksumCRC32": |
| 163 | + output.checksumCRC32((String) value); |
| 164 | + break; |
| 165 | + case "ChecksumCRC32C": |
| 166 | + output.checksumCRC32C((String) value); |
| 167 | + break; |
| 168 | + case "ChecksumCRC64NVME": |
| 169 | + output.checksumCRC64NVME((String) value); |
| 170 | + break; |
| 171 | + case "ChecksumSHA1": |
| 172 | + output.checksumSHA1((String) value); |
| 173 | + break; |
| 174 | + case "ChecksumSHA256": |
| 175 | + output.checksumSHA256((String) value); |
| 176 | + break; |
| 177 | + case "ChecksumType": |
| 178 | + output.checksumType((String) value); |
| 179 | + break; |
| 180 | + case "ServerSideEncryption": |
| 181 | + output.serverSideEncryption((String) value); |
| 182 | + break; |
| 183 | + case "VersionId": |
| 184 | + output.versionId((String) value); |
| 185 | + break; |
| 186 | + case "SSEKMSKeyId": |
| 187 | + output.ssekmsKeyId((String) value); |
| 188 | + break; |
| 189 | + case "BucketKeyEnabled": |
| 190 | + output.bucketKeyEnabled((Boolean) value); |
| 191 | + break; |
| 192 | + case "RequestCharged": |
| 193 | + output.requestCharged((String) value); |
| 194 | + break; |
| 195 | + // Ignored fields: Location, Bucket, Key |
| 196 | + case "Location": |
| 197 | + case "Bucket": |
| 198 | + case "Key": |
| 199 | + // These fields exist only in CompleteMultipartUploadResponse, not in PutObjectResponse |
| 200 | + break; |
| 201 | + default: |
| 202 | + // We should NOT throw an exception for unknown fields because |
| 203 | + // once the object is stored, we expect to return a successful response. |
| 204 | + // Emit a log at info level for awareness. |
| 205 | + LogFactory.getLog(ConvertSDKRequests.class).info(f.memberName() + " returned in CompleteMultipartUploadResponse for " |
| 206 | + + response.key() + " is an unknown field." + |
| 207 | + "The S3 Encryption Client does not recognize this option and cannot set it on the CompleteMultipartUploadResponse." + |
| 208 | + "This may be a new S3 feature." + |
| 209 | + "Please report this to the Amazon S3 Encryption Client for Java: " + |
| 210 | + "https://github.com/aws/amazon-s3-encryption-client-java/issues." |
| 211 | + ); |
| 212 | + } |
| 213 | + } |
| 214 | + }); |
| 215 | + return output.build(); |
| 216 | + } |
| 217 | + |
143 | 218 | private static boolean isStringStringMap(Object value) { |
144 | 219 | if (!(value instanceof Map)) { |
145 | 220 | return false; |
|
0 commit comments