diff --git a/.changes/next-release/bugfix-AWSSDKforJavav2MigrationTool-370c8cd.json b/.changes/next-release/bugfix-AWSSDKforJavav2MigrationTool-370c8cd.json new file mode 100644 index 00000000000..67e88b98231 --- /dev/null +++ b/.changes/next-release/bugfix-AWSSDKforJavav2MigrationTool-370c8cd.json @@ -0,0 +1,6 @@ +{ + "type": "bugfix", + "category": "AWS SDK for Java v2 Migration Tool", + "contributor": "", + "description": "Fix bug for v1 getUserMetaDataOf transform" +} diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3Streaming.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3Streaming.java index 74603ec4313..7b2aca61739 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3Streaming.java +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3Streaming.java @@ -50,6 +50,8 @@ void getObject(String bucket, String key, File file) throws Exception { String etag = /*AWS SDK for Java v2 migration: NOTE: V2's eTag() preserves surrounding quotes in the response, whereas V1's getETag() strips them - https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/migration-s3-client.html#V1s-ObjectMetadata-using-V1s-getETag*/ objectMetadata.eTag().replaceAll("^\"|\"$", ""); + + String value = s3Object.response().metadata().get("key"); } void putObject_bucketKeyContent(String bucket, String key, String content) { diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/S3Streaming.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/S3Streaming.java index 453ffa2e02d..6c43507c1ca 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/S3Streaming.java +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/S3Streaming.java @@ -45,6 +45,8 @@ void getObject(String bucket, String key, File file) throws Exception { ObjectMetadata objectMetadata = s3.getObject(new GetObjectRequest(bucket, key), file); String etag = objectMetadata.getETag(); + + String value = s3Object.getObjectMetadata().getUserMetaDataOf("key"); } void putObject_bucketKeyContent(String bucket, String key, String content) { diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PutObjectRequestToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PutObjectRequestToV2.java index 6bb4141f22f..a1f49fb9790 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PutObjectRequestToV2.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PutObjectRequestToV2.java @@ -420,6 +420,9 @@ private Expression retrieveContentLengthForMetadataIfSet(String metadataName) { } private J.MethodInvocation saveMetadataValueAndRemoveStatement(J.MethodInvocation method) { + if (!(method.getSelect() instanceof J.Identifier)) { + return method; + } J.Identifier metadataPojo = (J.Identifier) method.getSelect(); String variableName = metadataPojo.getSimpleName(); diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/V1GetterToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/V1GetterToV2.java index 78a7297e59e..8333dc85e6d 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/V1GetterToV2.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/V1GetterToV2.java @@ -17,7 +17,9 @@ import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.changeBucketNameToBucket; import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.isS3ETagGetter; +import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.isS3UserMetaDataOfGetter; import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.transformETagGetter; +import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.transformUserMetaDataOfGetter; import static software.amazon.awssdk.v2migration.internal.utils.SdkTypeUtils.isV2ModelClass; import org.openrewrite.ExecutionContext; @@ -69,6 +71,10 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu return transformETagGetter(getCursor(), method); } + if (isS3UserMetaDataOfGetter(methodName, fullyQualified)) { + return transformUserMetaDataOfGetter(getCursor(), method); + } + methodName = changeBucketNameToBucket(methodName); if (NamingUtils.isGetter(methodName)) { diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/S3TransformUtils.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/S3TransformUtils.java index 468fe9882f4..1cd5dc14cbc 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/S3TransformUtils.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/S3TransformUtils.java @@ -315,6 +315,18 @@ public static J.MethodInvocation transformETagGetter(Cursor cursor, J.MethodInvo .withComments(createCommentsWithNewline(comment)); } + public static boolean isS3UserMetaDataOfGetter(String methodName, JavaType.FullyQualified declaringType) { + return "getUserMetaDataOf".equals(methodName) + && declaringType.getFullyQualifiedName().startsWith(V2_S3_MODEL_PKG); + } + + public static J.MethodInvocation transformUserMetaDataOfGetter(Cursor cursor, J.MethodInvocation method) { + String template = "#{any()}.metadata().get(#{any()})"; + return JavaTemplate.builder(template).build() + .apply(cursor, method.getCoordinates().replace(), + method.getSelect(), method.getArguments().get(0)); + } + public static List inputStreamBufferingWarningComment() { String warning = "When using InputStream to upload with S3Client, Content-Length should be specified and used " + "with RequestBody.fromInputStream(). Otherwise, the entire stream will be buffered in memory. If"