Skip to content

Commit 672d973

Browse files
authored
S3 PutObject String overload (#5429)
* S3 PutObject String overload * Add comment
1 parent 5503299 commit 672d973

File tree

4 files changed

+129
-5
lines changed

4 files changed

+129
-5
lines changed

test/v2-migration-tests/src/test/resources/maven/after/src/main/java/foo/bar/Application.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,11 @@ private static PutObjectResponse uploadFile(S3Client s3, String bucket, String k
100100

101101
return result;
102102
}
103+
104+
private static PutObjectResponse uploadString(S3Client s3, String bucket, String key, String content) {
105+
PutObjectResponse result = s3.putObject(PutObjectRequest.builder().bucket(bucket).key(key)
106+
.build(), RequestBody.fromString(content));
107+
108+
return result;
109+
}
103110
}

test/v2-migration-tests/src/test/resources/maven/before/src/main/java/foo/bar/Application.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,10 @@ private static PutObjectResult uploadFile(AmazonS3 s3, String bucket, String key
9494

9595
return result;
9696
}
97+
98+
private static PutObjectResult uploadString(AmazonS3 s3, String bucket, String key, String content) {
99+
PutObjectResult result = s3.putObject(bucket, key, content);
100+
101+
return result;
102+
}
97103
}

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

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,13 @@
3939

4040
@SdkInternalApi
4141
public class S3StreamingRequestToV2 extends Recipe {
42-
private static final MethodMatcher PUT_OBJECT =
42+
private static final MethodMatcher PUT_OBJECT_FILE =
4343
new MethodMatcher("com.amazonaws.services.s3.AmazonS3 "
44-
+ "putObject(java.lang.String, java.lang.String, java.io.File)",
45-
true);
44+
+ "putObject(java.lang.String, java.lang.String, java.io.File)", true);
45+
private static final MethodMatcher PUT_OBJECT_STRING =
46+
new MethodMatcher("com.amazonaws.services.s3.AmazonS3 "
47+
+ "putObject(java.lang.String, java.lang.String, java.lang.String)", true);
48+
4649
private static final JavaType.FullyQualified V1_PUT_OBJECT_REQUEST =
4750
TypeUtils.asFullyQualified(JavaType.buildType("com.amazonaws.services.s3.model.PutObjectRequest"));
4851
private static final JavaType.FullyQualified REQUEST_BODY =
@@ -66,12 +69,79 @@ public TreeVisitor<?, ExecutionContext> getVisitor() {
6669
private static final class Visitor extends JavaIsoVisitor<ExecutionContext> {
6770
@Override
6871
public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext executionContext) {
69-
if (PUT_OBJECT.matches(method, false)) {
72+
if (PUT_OBJECT_FILE.matches(method, false)) {
7073
method = transformPutFileOverload(method);
7174
}
75+
if (PUT_OBJECT_STRING.matches(method, false)) {
76+
method = transformPutStringOverload(method);
77+
}
7278
return super.visitMethodInvocation(method, executionContext);
7379
}
7480

81+
private J.MethodInvocation transformPutStringOverload(J.MethodInvocation method) {
82+
JavaType.Method methodType = method.getMethodType();
83+
if (methodType == null) {
84+
return method;
85+
}
86+
87+
List<Expression> originalArgs = method.getArguments();
88+
89+
Expression bucketExpr = originalArgs.get(0);
90+
Expression keyExpr = originalArgs.get(1);
91+
Expression stringExpr = originalArgs.get(2);
92+
93+
List<Expression> newArgs = new ArrayList<>();
94+
Expression getObjectExpr = bucketAndKeyToPutObject(bucketExpr, keyExpr);
95+
newArgs.add(getObjectExpr);
96+
97+
// This is to maintain the formatting/spacing of original code, getPrefix() retrieves the leading whitespace
98+
Space stringArgPrefix = stringExpr.getPrefix();
99+
stringExpr = stringToRequestBody(stringExpr.withPrefix(Space.EMPTY)).withPrefix(stringArgPrefix);
100+
newArgs.add(stringExpr);
101+
102+
List<String> paramNames = Arrays.asList("request", "stringContent");
103+
List<JavaType> paramTypes = newArgs.stream()
104+
.map(Expression::getType)
105+
.collect(Collectors.toList());
106+
107+
108+
methodType = methodType.withParameterTypes(paramTypes)
109+
.withParameterNames(paramNames);
110+
111+
return method.withMethodType(methodType).withArguments(newArgs);
112+
}
113+
114+
private J.MethodInvocation stringToRequestBody(Expression fileExpr) {
115+
maybeAddImport(REQUEST_BODY);
116+
117+
J.Identifier requestBodyId = IdentifierUtils.makeId(REQUEST_BODY.getClassName(), REQUEST_BODY);
118+
119+
JavaType.Method fromStringType = new JavaType.Method(
120+
null,
121+
0L,
122+
REQUEST_BODY,
123+
"fromString",
124+
REQUEST_BODY,
125+
Collections.singletonList("stringContent"),
126+
Collections.singletonList(JavaType.buildType("java.lang.String")),
127+
null,
128+
null
129+
);
130+
131+
J.Identifier fromFileId = IdentifierUtils.makeId("fromString", fromStringType);
132+
133+
return new J.MethodInvocation(
134+
Tree.randomId(),
135+
Space.EMPTY,
136+
Markers.EMPTY,
137+
JRightPadded.build(requestBodyId),
138+
null,
139+
fromFileId,
140+
JContainer.build(Collections.singletonList(JRightPadded.build(fileExpr))),
141+
fromStringType
142+
);
143+
}
144+
75145
private J.MethodInvocation transformPutFileOverload(J.MethodInvocation method) {
76146
JavaType.Method methodType = method.getMethodType();
77147
if (methodType == null) {

v2-migration/src/test/java/software/amazon/awssdk/v2migration/S3StreamingRequestToV2Test.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public void defaults(RecipeSpec spec) {
3838

3939
@Test
4040
@EnabledOnJre({JRE.JAVA_8})
41-
public void testS3PutObjectOverrideRewrite() {
41+
public void testS3PutObjectOverrideRewrite_file() {
4242
rewriteRun(
4343
java(
4444
"import com.amazonaws.services.s3.AmazonS3Client;\n"
@@ -78,4 +78,45 @@ public void testS3PutObjectOverrideRewrite() {
7878
)
7979
);
8080
}
81+
82+
@Test
83+
@EnabledOnJre({JRE.JAVA_8})
84+
public void testS3PutObjectOverrideRewrite_string() {
85+
rewriteRun(
86+
java(
87+
"import com.amazonaws.services.s3.AmazonS3Client;\n"
88+
+ "\n"
89+
+ "import java.io.File;\n"
90+
+ "\n"
91+
+ "public class S3PutObjectExample {\n"
92+
+ " private static final String BUCKET = \"my-bucket\";\n"
93+
+ " private static final String KEY = \"key\";\n"
94+
+ " private static final String CONTENT = \"payload\";\n"
95+
+ "\n"
96+
+ " public static void main(String[] args) {\n"
97+
+ " AmazonS3Client s3 = null;\n"
98+
+ "\n"
99+
+ " s3.putObject(BUCKET, KEY, CONTENT);\n"
100+
+ " }\n"
101+
+ "}\n",
102+
"import com.amazonaws.services.s3.AmazonS3Client;\n"
103+
+ "import com.amazonaws.services.s3.model.PutObjectRequest;\n"
104+
+ "import software.amazon.awssdk.core.sync.RequestBody;\n"
105+
+ "\n"
106+
+ "import java.io.File;\n"
107+
+ "\n"
108+
+ "public class S3PutObjectExample {\n"
109+
+ " private static final String BUCKET = \"my-bucket\";\n"
110+
+ " private static final String KEY = \"key\";\n"
111+
+ " private static final String CONTENT = \"payload\";\n"
112+
+ "\n"
113+
+ " public static void main(String[] args) {\n"
114+
+ " AmazonS3Client s3 = null;\n"
115+
+ "\n"
116+
+ " s3.putObject(new PutObjectRequest(BUCKET, KEY), RequestBody.fromString(CONTENT));\n"
117+
+ " }\n"
118+
+ "}"
119+
)
120+
);
121+
}
81122
}

0 commit comments

Comments
 (0)