Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,25 @@

package foo.bar;

import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.awscore.AwsRequestOverrideConfiguration;
import software.amazon.awssdk.core.async.AsyncRequestBody;
import software.amazon.awssdk.services.s3.S3AsyncClient;
import software.amazon.awssdk.services.s3.model.CopyObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.transfer.s3.S3TransferManager;
import software.amazon.awssdk.transfer.s3.model.Copy;
import software.amazon.awssdk.transfer.s3.model.CopyRequest;
import software.amazon.awssdk.transfer.s3.model.DirectoryDownload;
import software.amazon.awssdk.transfer.s3.model.DownloadDirectoryRequest;
import software.amazon.awssdk.transfer.s3.model.DownloadFileRequest;
import software.amazon.awssdk.transfer.s3.model.FileDownload;
import software.amazon.awssdk.transfer.s3.model.FileUpload;
import software.amazon.awssdk.transfer.s3.model.ResumableFileDownload;
import software.amazon.awssdk.transfer.s3.model.ResumableFileUpload;
import software.amazon.awssdk.transfer.s3.model.UploadFileRequest;
import software.amazon.awssdk.transfer.s3.model.UploadRequest;

Expand All @@ -35,11 +44,13 @@ public class TransferManagerS3 {

File file = new File("path/to/file.txt");

void tmConstructor() {
void tmConstructor(AwsCredentials credentials, AwsCredentialsProvider credentialsProvider) {
S3TransferManager tm = S3TransferManager.builder()
.build();
S3TransferManager tmBuilderDefault = S3TransferManager.create();
S3TransferManager tmBuilderWithS3 = S3TransferManager.builder().build();
S3TransferManager tmConstructorWithCred = S3TransferManager.builder().s3Client(S3AsyncClient.builder().credentialsProvider(StaticCredentialsProvider.create(credentials)).build()).build();
S3TransferManager tmConstructorWithCredProvider = S3TransferManager.builder().s3Client(S3AsyncClient.builder().credentialsProvider(credentialsProvider).build()).build();
}

void download(S3TransferManager tm, String bucket, String key) {
Expand Down Expand Up @@ -76,4 +87,14 @@ void copy(S3TransferManager tm, String sourceBucket, String sourceKey, String de
.build();
Copy copy2 = tm.copy(CopyRequest.builder().copyObjectRequest(copyRequest).build());
}

void downloadDirectory(S3TransferManager tm, File destination) {
DirectoryDownload fileDownload = tm.downloadDirectory(DownloadDirectoryRequest.builder().bucket("bucket").listObjectsV2RequestTransformer(builder -> builder.prefix("key")).destination(destination.toPath()).build());
tm.close();
}

void resume(S3TransferManager tm, ResumableFileDownload persistableDownload, ResumableFileUpload persistableUpload) {
FileDownload download = tm.resumeDownloadFile(persistableDownload);
FileUpload upload = tm.resumeUploadFile(persistableUpload);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,31 @@

package foo.bar;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.s3.model.CopyObjectRequest;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.transfer.Copy;
import com.amazonaws.services.s3.transfer.Download;
import com.amazonaws.services.s3.transfer.MultipleFileDownload;
import com.amazonaws.services.s3.transfer.PersistableDownload;
import com.amazonaws.services.s3.transfer.PersistableUpload;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerBuilder;
import com.amazonaws.services.s3.transfer.Upload;
import java.io.File;

public class TransferManagerS3 {

File file = new File("path/to/file.txt");

void tmConstructor() {
void tmConstructor(AWSCredentials credentials, AWSCredentialsProvider credentialsProvider) {
TransferManager tm = new TransferManager();
TransferManager tmBuilderDefault = TransferManagerBuilder.defaultTransferManager();
TransferManager tmBuilderWithS3 = TransferManagerBuilder.standard().build();
TransferManager tmConstructorWithCred = new TransferManager(credentials);
TransferManager tmConstructorWithCredProvider = new TransferManager(credentialsProvider);
}

void download(TransferManager tm, String bucket, String key) {
Expand Down Expand Up @@ -64,4 +72,14 @@ void copy(TransferManager tm, String sourceBucket, String sourceKey, String dest
CopyObjectRequest copyRequest = new CopyObjectRequest(sourceBucket, sourceKey, destinationBucket, destinationKey);
Copy copy2 = tm.copy(copyRequest);
}

void downloadDirectory(TransferManager tm, File destination) {
MultipleFileDownload fileDownload = tm.downloadDirectory("bucket", "key", destination);
tm.shutdownNow();
}

void resume(TransferManager tm, PersistableDownload persistableDownload, PersistableUpload persistableUpload) {
Download download = tm.resumeDownload(persistableDownload);
Upload upload = tm.resumeUpload(persistableUpload);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,20 @@
package software.amazon.awssdk.v2migration;

import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.V2_S3_MODEL_PKG;
import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.V2_TM_CLIENT;
import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.V2_TM_MODEL_PKG;
import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.v2TmMethodMatcher;

import java.util.regex.Pattern;
import org.openrewrite.ExecutionContext;
import org.openrewrite.Recipe;
import org.openrewrite.TreeVisitor;
import org.openrewrite.java.AddImport;
import org.openrewrite.java.JavaIsoVisitor;
import org.openrewrite.java.JavaTemplate;
import org.openrewrite.java.JavaVisitor;
import org.openrewrite.java.MethodMatcher;
import org.openrewrite.java.tree.J;
import org.openrewrite.java.tree.JavaType;
import software.amazon.awssdk.annotations.SdkInternalApi;

@SdkInternalApi
Expand All @@ -47,6 +50,19 @@ public class TransferManagerMethodsToV2 extends Recipe {
private static final MethodMatcher COPY_BUCKET_KEY =
v2TmMethodMatcher("copy(String, String, String, String");

private static final MethodMatcher DOWNLOAD_DIR = v2TmMethodMatcher("downloadDirectory(String, String, java.io.File)");

private static final MethodMatcher RESUME_DOWNLOAD = v2TmMethodMatcher("resumeDownload(..)");
private static final MethodMatcher RESUME_UPLOAD = v2TmMethodMatcher("resumeUpload(..)");
private static final MethodMatcher SHUT_DOWN_NOW = v2TmMethodMatcher("shutdownNow()");



private static final Pattern S3_TM_CREDENTIAL = Pattern.compile(V2_TM_CLIENT);
private static final Pattern V2_AWSCREDENTAIL = Pattern.compile("software.amazon.awssdk.auth.credentials.AwsCredentials");
private static final Pattern V2_CREDENTIAL_PROVIDER = Pattern.compile("software.amazon.awssdk.auth.credentials"
+ ".AwsCredentialsProvider");

@Override
public String getDisplayName() {
return "Transfer Manager Methods to V2";
Expand All @@ -62,10 +78,10 @@ public TreeVisitor<?, ExecutionContext> getVisitor() {
return new Visitor();
}

private static final class Visitor extends JavaIsoVisitor<ExecutionContext> {
private static final class Visitor extends JavaVisitor<ExecutionContext> {

@Override
public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext executionContext) {
public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext executionContext) {

if (DOWNLOAD_BUCKET_KEY_FILE.matches(method, false)) {
method = transformDownloadWithBucketKeyFile(method);
Expand Down Expand Up @@ -95,10 +111,100 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu
method = transformUploadWithBucketKeyFile(method);
return super.visitMethodInvocation(method, executionContext);
}
if (DOWNLOAD_DIR.matches(method, false)) {
method = transformDownloadDirectory(method);
return super.visitMethodInvocation(method, executionContext);
}
if (RESUME_DOWNLOAD.matches(method, false)) {
method = transformResumeDownload(method);
return super.visitMethodInvocation(method, executionContext);
}
if (RESUME_UPLOAD.matches(method, false)) {
method = transformResumeUpload(method);
return super.visitMethodInvocation(method, executionContext);
}
if (SHUT_DOWN_NOW.matches(method, false)) {
method = transformShutDownNow(method);
return super.visitMethodInvocation(method, executionContext);
}

return super.visitMethodInvocation(method, executionContext);
}

@Override
public J visitNewClass(J.NewClass newClass, ExecutionContext executionContext) {
JavaType type = newClass.getType();
if (!(type instanceof JavaType.FullyQualified)) {
return newClass;
}
if (type.isAssignableFrom(S3_TM_CREDENTIAL) &&
newClass.getArguments().size() == 1 &&
newClass.getArguments().get(0).getType() != null) {
if (newClass.getArguments().get(0).getType().isAssignableFrom(V2_AWSCREDENTAIL)) {
addS3AsyncClientImport();
addStaticCredentialsProviderImport();

return JavaTemplate
.builder("S3TransferManager.builder()" +
".s3Client(S3AsyncClient.builder()" +
".credentialsProvider(StaticCredentialsProvider.create(#{any()}))" +
".build())" +
".build()")
.build()
.apply(getCursor(), newClass.getCoordinates().replace(), newClass.getArguments().get(0));
}
if (newClass.getArguments().get(0).getType().isAssignableFrom(V2_CREDENTIAL_PROVIDER)) {
addS3AsyncClientImport();

return JavaTemplate
.builder("S3TransferManager.builder()" +
".s3Client(S3AsyncClient.builder()" +
".credentialsProvider(#{any()})" +
".build())" +
".build()")
.build()
.apply(getCursor(), newClass.getCoordinates().replace(), newClass.getArguments().get(0));

}
}

return super.visitNewClass(newClass, executionContext);
}

private J.MethodInvocation transformResumeDownload(J.MethodInvocation method) {
String v2Method = "#{any()}.resumeDownloadFile(#{any()})";

method = JavaTemplate.builder(v2Method).build()
.apply(getCursor(), method.getCoordinates().replace(), method.getSelect(),
method.getArguments().get(0));
return method;
}

private J.MethodInvocation transformResumeUpload(J.MethodInvocation method) {
String v2Method = "#{any()}.resumeUploadFile(#{any()})";

method = JavaTemplate.builder(v2Method).build()
.apply(getCursor(), method.getCoordinates().replace(), method.getSelect(),
method.getArguments().get(0));
return method;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For these name change only transforms, should we just use ChangeMethodName yaml recipe like https://github.com/aws/aws-sdk-java-v2/blob/master/v2-migration/src/main/resources/META-INF/rewrite/change-s3-methods.yml ?



private J.MethodInvocation transformDownloadDirectory(J.MethodInvocation method) {
String v2Method = "#{any()}.downloadDirectory(DownloadDirectoryRequest.builder()"
+ ".bucket(#{any()}).listObjectsV2RequestTransformer(builder -> builder.prefix(#{any()}))"
+ ".destination(#{any()}.toPath()).build())";

method = JavaTemplate.builder(v2Method).build()
.apply(getCursor(), method.getCoordinates().replace(), method.getSelect(),
method.getArguments().get(0), method.getArguments().get(1),
method.getArguments().get(2));

addTmImport("DirectoryDownload");
addTmImport("DownloadDirectoryRequest");
return method;
}

private J.MethodInvocation transformUploadWithBucketKeyFile(J.MethodInvocation method) {
String v2Method = "#{any()}.uploadFile(UploadFileRequest.builder()"
+ ".putObjectRequest(PutObjectRequest.builder().bucket(#{any()}).key(#{any()}).build())"
Expand Down Expand Up @@ -203,6 +309,13 @@ private J.MethodInvocation transformDownloadWithBucketKeyFileTimeout(J.MethodInv
return method;
}

private J.MethodInvocation transformShutDownNow(J.MethodInvocation method) {
String v2Method = "#{any()}.close()";
method = JavaTemplate.builder(v2Method).build()
.apply(getCursor(), method.getCoordinates().replace(), method.getSelect());
return method;
}

private void addTmImport(String pojoName) {
String fqcn = V2_TM_MODEL_PKG + pojoName;
doAfterVisit(new AddImport<>(fqcn, null, false));
Expand All @@ -220,5 +333,13 @@ private void addDurationImport() {
private void addRequestOverrideConfigImport() {
doAfterVisit(new AddImport<>("software.amazon.awssdk.awscore.AwsRequestOverrideConfiguration", null, false));
}

private void addS3AsyncClientImport() {
doAfterVisit(new AddImport<>("software.amazon.awssdk.services.s3.S3AsyncClient", null, false));
}

private void addStaticCredentialsProviderImport() {
doAfterVisit(new AddImport<>("software.amazon.awssdk.auth.credentials.StaticCredentialsProvider", null, false));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ name: software.amazon.awssdk.v2migration.ChangeTransferManagerTypes
displayName: Change SDK TransferManager types from v1 to v2
description: Change SDK TransferManager types from v1 to v2.
recipeList:
- software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType:
methodPattern: com.amazonaws.services.s3.transfer.TransferManager resumeDownload(..)
newReturnType: software.amazon.awssdk.transfer.s3.model.FileDownload
- software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType:
methodPattern: com.amazonaws.services.s3.transfer.TransferManager resumeUpload(..)
newReturnType: software.amazon.awssdk.transfer.s3.model.FileUpload
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: com.amazonaws.services.s3.transfer.TransferManager
newFullyQualifiedTypeName: software.amazon.awssdk.transfer.s3.S3TransferManager
Expand Down
Loading