Skip to content

Commit 6c74e87

Browse files
authored
Add additional S3 non-streaming method transforms (#5886)
* Add additional S3 method transforms * Add response variable in test for getObjectAsString transform
1 parent 2eeda1c commit 6c74e87

File tree

8 files changed

+351
-37
lines changed

8 files changed

+351
-37
lines changed

test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import software.amazon.awssdk.services.s3.S3Client;
1919
import software.amazon.awssdk.services.s3.model.CORSConfiguration;
2020
import software.amazon.awssdk.services.s3.model.CORSRule;
21+
import software.amazon.awssdk.services.s3.model.CopyObjectRequest;
2122
import software.amazon.awssdk.services.s3.model.CreateBucketRequest;
2223
import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;
2324
import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;
@@ -48,11 +49,13 @@
4849
import software.amazon.awssdk.services.s3.model.GetBucketNotificationConfigurationRequest;
4950
import software.amazon.awssdk.services.s3.model.GetBucketPolicyRequest;
5051
import software.amazon.awssdk.services.s3.model.GetBucketReplicationRequest;
52+
import software.amazon.awssdk.services.s3.model.GetBucketRequestPaymentRequest;
5153
import software.amazon.awssdk.services.s3.model.GetBucketTaggingRequest;
5254
import software.amazon.awssdk.services.s3.model.GetBucketVersioningRequest;
5355
import software.amazon.awssdk.services.s3.model.GetBucketWebsiteRequest;
5456
import software.amazon.awssdk.services.s3.model.GetObjectAclRequest;
5557
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
58+
import software.amazon.awssdk.services.s3.model.GetUrlRequest;
5659
import software.amazon.awssdk.services.s3.model.HeadBucketRequest;
5760
import software.amazon.awssdk.services.s3.model.HeadBucketResponse;
5861
import software.amazon.awssdk.services.s3.model.HeadObjectRequest;
@@ -62,7 +65,14 @@
6265
import software.amazon.awssdk.services.s3.model.ListObjectsResponse;
6366
import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;
6467
import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;
68+
import software.amazon.awssdk.services.s3.model.MetadataDirective;
69+
import software.amazon.awssdk.services.s3.model.Payer;
6570
import software.amazon.awssdk.services.s3.model.PutBucketCorsRequest;
71+
import software.amazon.awssdk.services.s3.model.PutBucketPolicyRequest;
72+
import software.amazon.awssdk.services.s3.model.PutBucketRequestPaymentRequest;
73+
import software.amazon.awssdk.services.s3.model.RequestPaymentConfiguration;
74+
import software.amazon.awssdk.services.s3.model.RestoreObjectRequest;
75+
import software.amazon.awssdk.services.s3.model.RestoreRequest;
6676

6777
public class S3 {
6878

@@ -187,6 +197,9 @@ private void singleBucketArgMethods(S3Client s3, String bucket) {
187197
.build());
188198
s3.getBucketWebsite(GetBucketWebsiteRequest.builder().bucket(bucket)
189199
.build());
200+
s3.putBucketRequestPayment(PutBucketRequestPaymentRequest.builder().bucket(bucket).requestPaymentConfiguration(RequestPaymentConfiguration.builder().payer(Payer.BUCKET_OWNER).build()).build());
201+
s3.putBucketRequestPayment(PutBucketRequestPaymentRequest.builder().bucket(bucket).requestPaymentConfiguration(RequestPaymentConfiguration.builder().payer(Payer.REQUESTER).build()).build());
202+
s3.getBucketRequestPayment(GetBucketRequestPaymentRequest.builder().bucket(bucket).build()).payer().toString().equals("Requester");
190203
}
191204

192205
private void bucketKeyArgsMethods(S3Client s3, String bucket, String key) {
@@ -198,6 +211,8 @@ private void bucketKeyArgsMethods(S3Client s3, String bucket, String key) {
198211
.build());
199212
s3.headObject(HeadObjectRequest.builder().bucket(bucket).key(key)
200213
.build());
214+
s3.utilities().getUrl(GetUrlRequest.builder().bucket(bucket).key(key).build());
215+
String objectAsString = s3.getObjectAsBytes(GetObjectRequest.builder().bucket(bucket).key(key).build()).asUtf8String();
201216
}
202217

203218
private void bucketIdArgsMethods(S3Client s3, String bucket, String id) {
@@ -227,4 +242,19 @@ private void bucketPrefixArgsMethods(S3Client s3, String bucket, String prefix)
227242
s3.listObjectVersions(ListObjectVersionsRequest.builder().bucket(bucket).prefix(prefix)
228243
.build());
229244
}
245+
246+
private void variousMethods(S3Client s3) {
247+
s3.deleteObject(DeleteObjectRequest.builder().bucket("bucket").key("key").versionId("versionId")
248+
.build());
249+
s3.copyObject(CopyObjectRequest.builder().sourceBucket("sourceBucket").sourceKey("sourceKey").destinationBucket("destBucket").destinationKey("destKey")
250+
.build());
251+
s3.listObjectVersions(ListObjectVersionsRequest.builder().bucket("bucket").prefix("prefix").keyMarker("keyMarker").versionIdMarker("versionId").delimiter("delimiter").maxKeys(22)
252+
.build());
253+
s3.putBucketPolicy(PutBucketPolicyRequest.builder().bucket("bucket").policy("policyText")
254+
.build());
255+
256+
s3.listBuckets().buckets();
257+
s3.restoreObject(RestoreObjectRequest.builder().bucket("bucket").key("key").restoreRequest(RestoreRequest.builder().days(98).build()).build());
258+
s3.copyObject(CopyObjectRequest.builder().sourceBucket("bucket").sourceKey("key").destinationBucket("bucket").destinationKey("key").metadataDirective(MetadataDirective.REPLACE).websiteRedirectLocation("redirectLocation").build());
259+
}
230260
}

test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/S3.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,18 @@ private void singleBucketArgMethods(AmazonS3 s3, String bucket) {
121121
s3.getBucketReplicationConfiguration(bucket);
122122
s3.getBucketTaggingConfiguration(bucket);
123123
s3.getBucketWebsiteConfiguration(bucket);
124+
s3.disableRequesterPays(bucket);
125+
s3.enableRequesterPays(bucket);
126+
s3.isRequesterPaysEnabled(bucket);
124127
}
125128

126129
private void bucketKeyArgsMethods(AmazonS3 s3, String bucket, String key) {
127130
s3.deleteObject(bucket, key);
128131
s3.getObject(bucket, key);
129132
s3.getObjectAcl(bucket, key);
130133
s3.getObjectMetadata(bucket, key);
134+
s3.getUrl(bucket, key);
135+
String objectAsString = s3.getObjectAsString(bucket, key);
131136
}
132137

133138
private void bucketIdArgsMethods(AmazonS3 s3, String bucket, String id) {
@@ -146,4 +151,15 @@ private void bucketPrefixArgsMethods(AmazonS3 s3, String bucket, String prefix)
146151
s3.listObjectsV2(bucket, prefix);
147152
s3.listVersions(bucket, prefix);
148153
}
154+
155+
private void variousMethods(AmazonS3 s3) {
156+
s3.deleteVersion("bucket", "key", "versionId");
157+
s3.copyObject("sourceBucket", "sourceKey", "destBucket", "destKey");
158+
s3.listVersions("bucket", "prefix", "keyMarker", "versionId", "delimiter", 22);
159+
s3.setBucketPolicy("bucket", "policyText");
160+
161+
s3.listBuckets();
162+
s3.restoreObject("bucket", "key", 98);
163+
s3.setObjectRedirectLocation("bucket", "key", "redirectLocation");
164+
}
149165
}

v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3NonStreamingRequestToV2.java

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@
4343
@SdkInternalApi
4444
public class S3NonStreamingRequestToV2 extends Recipe {
4545

46+
private static final MethodMatcher DELETE_VERSION =
47+
new MethodMatcher("com.amazonaws.services.s3.AmazonS3 deleteVersion(String, String, String)", true);
48+
private static final MethodMatcher COPY_OBJECT =
49+
new MethodMatcher("com.amazonaws.services.s3.AmazonS3 copyObject(String, String, String, String)", true);
50+
private static final MethodMatcher LIST_VERSIONS =
51+
new MethodMatcher("com.amazonaws.services.s3.AmazonS3 "
52+
+ "listVersions(String, String, String, String, String, Integer)", true);
53+
private static final MethodMatcher SET_BUCKET_POLICY =
54+
new MethodMatcher("com.amazonaws.services.s3.AmazonS3 setBucketPolicy(String, String)", true);
55+
4656
private static final Map<MethodMatcher, JavaType.FullyQualified> BUCKET_ARG_METHODS = new HashMap<>();
4757
private static final Map<MethodMatcher, JavaType.FullyQualified> BUCKET_KEY_ARGS_METHODS = new HashMap<>();
4858
private static final Map<MethodMatcher, JavaType.FullyQualified> BUCKET_ID_ARGS_METHODS = new HashMap<>();
@@ -146,74 +156,72 @@ private static final class Visitor extends JavaIsoVisitor<ExecutionContext> {
146156
@Override
147157
public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext executionContext) {
148158

159+
if (DELETE_VERSION.matches(method)) {
160+
method = transformMethod(method, fcqn("deleteObject"), "bucket", "key", "versionId");
161+
return super.visitMethodInvocation(method, executionContext);
162+
}
163+
if (COPY_OBJECT.matches(method)) {
164+
method = transformMethod(method, fcqn("copyObject"),
165+
"sourceBucket", "sourceKey", "destinationBucket", "destinationKey");
166+
return super.visitMethodInvocation(method, executionContext);
167+
}
168+
if (LIST_VERSIONS.matches(method)) {
169+
method = transformMethod(method, fcqn("listVersions"),
170+
"bucket", "prefix", "keyMarker", "versionIdMarker", "delimiter", "maxKeys");
171+
return super.visitMethodInvocation(method, executionContext);
172+
}
173+
if (SET_BUCKET_POLICY.matches(method)) {
174+
method = transformMethod(method, fcqn("putBucketPolicy"), "bucket", "policy");
175+
return super.visitMethodInvocation(method, executionContext);
176+
}
149177
for (Map.Entry<MethodMatcher, JavaType.FullyQualified> entry : BUCKET_ARG_METHODS.entrySet()) {
150178
if (entry.getKey().matches(method)) {
151-
method = transformBucketArgOverload(method, entry.getValue());
179+
method = transformMethod(method, entry.getValue(), "bucket");
152180
return super.visitMethodInvocation(method, executionContext);
153181
}
154182
}
155183
for (Map.Entry<MethodMatcher, JavaType.FullyQualified> entry : BUCKET_KEY_ARGS_METHODS.entrySet()) {
156184
if (entry.getKey().matches(method)) {
157-
method = transformTwoStringArgOverload(method, entry.getValue(), "key");
185+
method = transformMethod(method, entry.getValue(), "bucket", "key");
158186
return super.visitMethodInvocation(method, executionContext);
159187
}
160188
}
161189
for (Map.Entry<MethodMatcher, JavaType.FullyQualified> entry : BUCKET_ID_ARGS_METHODS.entrySet()) {
162190
if (entry.getKey().matches(method)) {
163-
method = transformTwoStringArgOverload(method, entry.getValue(), "id");
191+
method = transformMethod(method, entry.getValue(), "bucket", "id");
164192
return super.visitMethodInvocation(method, executionContext);
165193
}
166194
}
167195
for (Map.Entry<MethodMatcher, JavaType.FullyQualified> entry : BUCKET_PREFIX_ARGS_METHODS.entrySet()) {
168196
if (entry.getKey().matches(method)) {
169-
method = transformTwoStringArgOverload(method, entry.getValue(), "prefix");
197+
method = transformMethod(method, entry.getValue(), "bucket", "prefix");
170198
return super.visitMethodInvocation(method, executionContext);
171199
}
172200
}
173201

174202
return super.visitMethodInvocation(method, executionContext);
175203
}
176204

177-
private J.MethodInvocation transformBucketArgOverload(J.MethodInvocation method, JavaType.FullyQualified fqcn) {
205+
private J.MethodInvocation transformMethod(J.MethodInvocation method, JavaType.FullyQualified fqcn,
206+
String... args) {
178207
JavaType.Method methodType = method.getMethodType();
179208
if (methodType == null) {
180209
return method;
181210
}
182211

183-
Expression bucketExpr = method.getArguments().get(0);
184-
List<Expression> newArgs = new ArrayList<>();
185-
186-
Expression expr = argsToPojo(fqcn, Collections.singletonList("bucket"),
187-
Collections.singletonList(bucketExpr.getType()),
188-
JContainer.build(Collections.singletonList(JRightPadded.build(bucketExpr))));
189-
newArgs.add(expr);
190-
191-
methodType = addParamsToMethod(methodType, newArgs);
192-
193-
return method.withMethodType(methodType).withArguments(newArgs);
194-
}
212+
List<String> names = Arrays.asList(args);
213+
List<JavaType> types = new ArrayList<>();
214+
List<JRightPadded<Expression>> expressions = new ArrayList<>();
195215

196-
private J.MethodInvocation transformTwoStringArgOverload(J.MethodInvocation method, JavaType.FullyQualified fqcn,
197-
String secondArgName) {
198-
JavaType.Method methodType = method.getMethodType();
199-
if (methodType == null) {
200-
return method;
216+
for (int i = 0; i < names.size(); i++) {
217+
Expression expr = method.getArguments().get(i);
218+
types.add(expr.getType());
219+
expressions.add(JRightPadded.build(expr));
201220
}
202221

203-
Expression bucketExpr = method.getArguments().get(0);
204-
Expression stringExpr = method.getArguments().get(1);
205-
List<Expression> newArgs = new ArrayList<>();
206-
207-
List<String> names = Arrays.asList("bucket", secondArgName);
208-
List<JavaType> types = Arrays.asList(bucketExpr.getType(), stringExpr.getType());
209-
JContainer<Expression> args = JContainer.build(Arrays.asList(JRightPadded.build(bucketExpr),
210-
JRightPadded.build(stringExpr)));
211-
212-
Expression expr = argsToPojo(fqcn, names, types, args);
213-
newArgs.add(expr);
214-
222+
Expression newPojo = argsToPojo(fqcn, names, types, JContainer.build(expressions));
223+
List<Expression> newArgs = Collections.singletonList(newPojo);
215224
methodType = addParamsToMethod(methodType, newArgs);
216-
217225
return method.withMethodType(methodType).withArguments(newArgs);
218226
}
219227

0 commit comments

Comments
 (0)