From dfa639815e84bfb5e7da82d46193be630092565c Mon Sep 17 00:00:00 2001 From: Todd Hill <110035210+tkhill-AWS@users.noreply.github.com> Date: Wed, 4 Jan 2023 16:03:54 -0500 Subject: [PATCH] add/update examples for GA release of TransferManager (#4089) * Add/update examples for GA release of TransferManager * add sso support to the pom. Used testwatcher extension instead of @afterall anno. * clean up pom.xml file. remove jars. * update pom to use sdk v2.19.1 with corrected bom Co-authored-by: Steven Meyer <108885656+meyertst-aws@users.noreply.github.com> --- .doc_gen/metadata/s3_metadata.yaml | 86 +++++++++++-- javav2/example_code/s3/README.md | 120 +++++++++--------- javav2/example_code/s3/checkstyle.xml | 25 ++++ javav2/example_code/s3/pom.xml | 61 ++++++++- .../example/s3/CheckingObjectIntegrity.java | 4 +- .../java/com/example/s3/S3BucketDeletion.java | 8 +- .../main/java/com/example/s3/S3Scenario.java | 2 +- .../s3/transfermanager/DownloadFile.java | 90 +++++++++++++ .../transfermanager/DownloadToDirectory.java | 112 ++++++++++++++++ .../s3/transfermanager/FileUpDownOps.java | 81 ------------ .../example/s3/transfermanager/GetObject.java | 67 ---------- .../s3/transfermanager/ObjectCopy.java | 87 +++++++++++++ .../s3/transfermanager/S3ClientFactory.java | 63 +++++++++ .../s3/transfermanager/UploadADirectory.java | 83 ++++++++++++ .../s3/transfermanager/UploadFile.java | 77 +++++++++++ .../s3/transfermanager/UploadObject.java | 69 ---------- .../resources/downloadDirectory/dummy.txt | 0 .../s3/src/main/resources/image.png | Bin 0 -> 150565 bytes .../s3/src/main/resources/log4j2.xml | 19 +++ .../main/resources/uploadDirectory/file1.txt | 1 + .../main/resources/uploadDirectory/file2.txt | 1 + .../main/resources/uploadDirectory/file3.txt | 1 + .../s3/src/test/java/S3TestWatcher.java | 20 +++ .../s3/src/test/java/TransferManagerTest.java | 70 ++++++++++ 24 files changed, 854 insertions(+), 293 deletions(-) create mode 100644 javav2/example_code/s3/checkstyle.xml create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/DownloadFile.java create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/DownloadToDirectory.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/FileUpDownOps.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/GetObject.java create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/ObjectCopy.java create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/S3ClientFactory.java create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadADirectory.java create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadFile.java delete mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadObject.java create mode 100644 javav2/example_code/s3/src/main/resources/downloadDirectory/dummy.txt create mode 100644 javav2/example_code/s3/src/main/resources/image.png create mode 100644 javav2/example_code/s3/src/main/resources/log4j2.xml create mode 100644 javav2/example_code/s3/src/main/resources/uploadDirectory/file1.txt create mode 100644 javav2/example_code/s3/src/main/resources/uploadDirectory/file2.txt create mode 100644 javav2/example_code/s3/src/main/resources/uploadDirectory/file3.txt create mode 100644 javav2/example_code/s3/src/test/java/S3TestWatcher.java create mode 100644 javav2/example_code/s3/src/test/java/TransferManagerTest.java diff --git a/.doc_gen/metadata/s3_metadata.yaml b/.doc_gen/metadata/s3_metadata.yaml index 17ce4741912..826fbda6989 100644 --- a/.doc_gen/metadata/s3_metadata.yaml +++ b/.doc_gen/metadata/s3_metadata.yaml @@ -189,9 +189,17 @@ s3_CopyObject: github: javav2/example_code/s3 sdkguide: excerpts: - - description: + - description: Copy an object using an S3Client. snippet_tags: - s3.java2.copy_object.main + - description: >- + Use an S3TransferManager + to copy an object from one bucket to another. + View the complete file + and test. + snippet_tags: + - s3.tm.java2.objectcopy.import + - s3.tm.java2.objectcopy.main JavaScript: versions: - sdk_version: 3 @@ -736,16 +744,24 @@ s3_GetObject: github: javav2/example_code/s3 sdkguide: excerpts: - - description: Read data as a byte array. + - description: Read data as a byte array using an S3Client. snippet_tags: - s3.java2.getobjectdata.main - - description: Read tags that belong to an object. + - description: >- + Use an S3TransferManager + to download an object in an S3 bucket to a local file. + View the complete file + and test. + snippet_tags: + - s3.tm.java2.downloadfile.import + - s3.tm.java2.downloadfile.main + - description: Read tags that belong to an object using an S3Client. snippet_tags: - s3.java2.getobjecttags.main - - description: Get a URL for an object. + - description: Get a URL for an object using an S3Client. snippet_tags: - s3.java2.getobjecturl.main - - description: Get an object by using the S3Presigner client object. + - description: Get an object by using the S3Presigner client object using an S3Client. snippet_tags: - presigned.java2.getobjectpresigned.main PHP: @@ -1202,16 +1218,24 @@ s3_PutObject: github: javav2/example_code/s3 sdkguide: excerpts: - - description: Upload an object to a bucket. + - description: Upload a file to a bucket using an S3Client. snippet_tags: - s3.java2.s3_object_upload.main - - description: Upload an object to a bucket and set tags. + - description: >- + Use an S3TransferManager + to upload a file to a bucket. + View the complete file + and test. + snippet_tags: + - s3.tm.java2.uploadfile.import + - s3.tm.java2.uploadfile.main + - description: Upload an object to a bucket and set tags using an S3Client. snippet_tags: - s3.java2.s3_object_manage_tags.main - - description: Upload an object to a bucket and set metadata. + - description: Upload an object to a bucket and set metadata using an S3Client. snippet_tags: - s3.java2.s3_object_upload.metadata.main - - description: Upload an object to a bucket and set an object retention value. + - description: Upload an object to a bucket and set an object retention value using an S3Client. snippet_tags: - s3.java2.retention_object.main PHP: @@ -1989,6 +2013,50 @@ s3_TransferAcceleration: - S3.dotnetv3.TransferAccelerationExample services: s3: {PutBucketAccelerateConfiguration} +s3_DownloadBucketToDirectory: + title: Download all objects in an &S3long; (&S3;) bucket to a local directory + title_abbrev: Download objects to a local directory + synopsis: download all objects in an &S3long; (&S3;) bucket to a local directory. + category: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: >- + Use an S3TransferManager + to download all S3 objects in the same S3 bucket. + View the complete file + and test. + snippet_tags: + - s3.tm.java2.downloadtodirectory.import + - s3.tm.java2.downloadtodirectory.main + services: + s3: {DownloadDirectory} +s3_UploadDirectoryToBucket: + title: Recursively upload a local directory to an &S3long; (&S3;) bucket + title_abbrev: Upload directory to a bucket + synopsis: upload a local directory recursively to an &S3long; (&S3;) bucket. + category: + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/s3 + sdkguide: + excerpts: + - description: >- + Use an S3TransferManager + to upload a local directory. + View the complete file + and test. + snippet_tags: + - s3.tm.java2.uploadadirectory.import + - s3.tm.java2.uploadadirectory.main + services: + s3: {UploadDirectory} s3_Scenario_UsingLargeFiles: title: Upload or download large files to and from &S3; using an &AWS; SDK title_abbrev: Upload or download large files diff --git a/javav2/example_code/s3/README.md b/javav2/example_code/s3/README.md index 89e856fe152..b5a35487645 100644 --- a/javav2/example_code/s3/README.md +++ b/javav2/example_code/s3/README.md @@ -17,72 +17,74 @@ Amazon S3 is cloud object storage with industry-leading scalability, data availa ### Single action -You will find these examples that use the **S3Client** object: - -- [Aborting a multipart upload to an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/AbortMultipartUpload.java) (AbortMultipartUpload command) -- [Copying an object from one Amazon S3 bucket to another Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/CopyObject.java) (CopyObject command) -- [Creating and deleting an access point for an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/CreateAccessPoint.java) (CreateAccessPoint command) -- [Creating an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/CreateBucket.java) (CreateBucket command) -- [Creating an Amazon Amazon S3 batch job](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/CreateJob.java) (CreateJob command) -- [Deleting a policy from an Amazon Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/DeleteBucketPolicy.java) (DeleteBucketPolicy command) -- [Deleting multiple objects from an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/DeleteMultiObjects.java) (DeleteObjects command) -- [Deleting the website configuration for an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/DeleteWebsiteConfiguration.java) (DeleteBucketWebsite command) -- [Using the S3Presigner client to create a presigned URL and upload an object to an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GeneratePresignedUrlAndUploadObject.java) (PresignPutObject command) -- [Using the S3Presigner client to create a presigned URL and upload an object that contains metadata to an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GeneratePresignedUrlMetadata.java) (PresignPutObject command) -- [Using the S3Presigner client to create a presigned URL and upload a PNG image file to an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GeneratePresignedUrlUploadImage.java) (PresignPutObject command) -- [Getting the access control list (ACL) for an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetAcl.java) (GetObjectAcl command) -- [Getting the bucket policy for an existing Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetBucketPolicy.java) (GetBucketPolicy command) -- [Getting the content type of an object in an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectContentType.java) (HeadObject command) -- [Reading data from an Amazon S3 object](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectData.java) (GetObjectAsBytes command) -- [Getting an object located in an Amazon S3 bucket by using the S3Presigner client object](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectPresignedUrl.java) (PresignGetObject command) -- [Getting an object located in an Amazon S3 bucket by using the S3Presigner client object](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectPresignedUrl.java) (PresignGetObject command) -- [Reading tags that belong to an object located in an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectTags.java) (GetObjectTagging command) -- [Getting an URL for an object located in an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectUrl.java) (GetUrl command) -- [Using the AWS Key Management Service to encrypt data prior to placing the data into an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/KMSEncryptionExample.java) (Encrypt command) -- [Adding, updating, and deleting a Lifecycle configuration](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/LifecycleConfiguration.java) (PutBucketLifecycleConfiguration command) -- [Retrieving a list of in-progress multipart uploads.](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/ListMultipartUploads.java) (ListMultipartUploads command) -- [Getting a list of objects located in a given Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/ListObjects.java) (ListObjects command) -- [Setting tags for an object in an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/ManagingObjectTags.java) (putObject command) -- [Getting a presigned object using a Java Swing app.](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/PresignedSwing.java) (using Swing command) -- [Setting the logging parameters for an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/PutBucketLogging.java) (PutObject command) -- [Uploading an object to an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/PutObject.java) (PutObject commands) -- [Uploading an object with metadata to an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/PutObjectMetadata.java) (PutObject command) -- [Uploading an object with retention configuration to an Amazon S3 object](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/PutObjectRetention.java) (PutObjectRetention command) -- [Restoring an archived copy of an object back into an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/RestoreObject.java) (RestoreObject command) -- [Deleting an empty Amazon Simple Storage Service (Amazon S3) bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketDeletion.java) (DeleteBucket command) -- [Creating, listing and deleting an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketOps.java) (various commands) -- [Managing cross-origin resource sharing (CORS) for an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3Cors.java) (PutBucketCors command) -- [Getting log information](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3Log.java) (ListBuckets command) -- [Setting a new access control list (ACL) for an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/SetAcl.java) (PutBucketAcl command) -- [Adding a bucket policy to an existing Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/SetBucketPolicy.java) (PutBucketPolicy command) -- [Setting the website configuration for an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/SetWebsiteConfiguration.java) (PutBucketWebsite command) -- [Creating a S3ControlClient object using a virtual private cloud (VPC) URL](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/VPCCreateJob.java) (createJob command) -- [Setting up a S3Client object using a virtual private cloud (VPC) URL](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/VPCS3Example.java) (EndpointOverride command) - - - -You will find these examples that use the **S3AsyncClient** object: - -- [Creating an Amazon S3 object using the Async client](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/async/CreateBucketAsync.java) (CreateBucket command) -- [Reading data from an Amazon S3 object using the Async client](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/async/GetObjectDataAsync.java) (GetObject command) -- [Using the asynchronous client to place an object into an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/async/S3AsyncOps.java) (PutObject command) - -You will find these examples that use the **S3TransferManager** object: - -- [Downloading an object from an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/GetObject.java) (DownloadFile command) -- [Uploading an object to an Amazon S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadObject.java) (UploadFile command) +You will find these examples that use the **S3Client** class: + +- [Abort a multipart upload to an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/AbortMultipartUpload.java) (AbortMultipartUpload command) +- [Copy an object from one S3 bucket to another S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/CopyObject.java) (CopyObject command) +- [Create and delete an access point for an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/CreateAccessPoint.java) (CreateAccessPoint command) +- [Create an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/CreateBucket.java) (CreateBucket command) +- [Create an Amazon S3 batch job](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/CreateJob.java) (CreateJob command) +- [Delete a policy from an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/DeleteBucketPolicy.java) (DeleteBucketPolicy command) +- [Delete multiple objects from an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/DeleteMultiObjects.java) (DeleteObjects command) +- [Delete the website configuration for an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/DeleteWebsiteConfiguration.java) (DeleteBucketWebsite command) +- [Use the S3Presigner client to create a presigned URL and upload an object to an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GeneratePresignedUrlAndUploadObject.java) (PresignPutObject command) +- [Use the S3Presigner client to create a presigned URL and upload an object that contains metadata to an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GeneratePresignedUrlMetadata.java) (PresignPutObject command) +- [Use the S3Presigner client to create a presigned URL and upload a PNG image file to an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GeneratePresignedUrlUploadImage.java) (PresignPutObject command) +- [Get the access control list (ACL) for an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetAcl.java) (GetObjectAcl command) +- [Get the bucket policy for an existing S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetBucketPolicy.java) (GetBucketPolicy command) +- [Get the content type of an object in an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectContentType.java) (HeadObject command) +- [Read data from an S3 object](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectData.java) (GetObjectAsBytes command) +- [Get an object located in an S3 bucket by using the S3Presigner client object](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectPresignedUrl.java) (PresignGetObject command) +- [Read tags that belong to an object located in an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectTags.java) (GetObjectTagging command) +- [Get an URL for an object located in an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/GetObjectUrl.java) (GetUrl command) +- [Use the AWS Key Management Service to encrypt data prior to placing the data into an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/KMSEncryptionExample.java) (Encrypt command) +- [Add, update, and delete a Lifecycle configuration](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/LifecycleConfiguration.java) (PutBucketLifecycleConfiguration command) +- [Retrieve a list of in-progress multipart uploads.](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/ListMultipartUploads.java) (ListMultipartUploads command) +- [Get a list of objects located in a given S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/ListObjects.java) (ListObjects command) +- [Set tags for an object in an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/ManagingObjectTags.java) (putObject command) +- [Get a presigned object using a Java Swing app.](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/PresignedSwing.java) (using Swing command) +- [Set the logging parameters for an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/PutBucketLogging.java) (PutObject command) +- [Upload an object to an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/PutObject.java) (PutObject commands) +- [Upload an object with metadata to an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/PutObjectMetadata.java) (PutObject command) +- [Upload an object with retention configuration to an S3 object](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/PutObjectRetention.java) (PutObjectRetention command) +- [Restore an archived copy of an object back into an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/RestoreObject.java) (RestoreObject command) +- [Delete an empty S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketDeletion.java) (DeleteBucket command) +- [Create, list and delete an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketOps.java) (various commands) +- [Manage cross-origin resource sharing (CORS) for an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3Cors.java) (PutBucketCors command) +- [Get log information](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3Log.java) (ListBuckets command) +- [Set a new access control list (ACL) for an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/SetAcl.java) (PutBucketAcl command) +- [Add a bucket policy to an existing S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/SetBucketPolicy.java) (PutBucketPolicy command) +- [Set the website configuration for an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/SetWebsiteConfiguration.java) (PutBucketWebsite command) +- [Create an S3ControlClient object using a virtual private cloud (VPC) URL](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/VPCCreateJob.java) (createJob command) +- [Set up an S3Client object using a virtual private cloud (VPC) URL](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/VPCS3Example.java) (EndpointOverride command) + + + +You will find these examples that use the **S3AsyncClient** class: + +- [Create an Amazon S3 object using the Async client](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/async/CreateBucketAsync.java) (CreateBucket command) +- [Read data from an Amazon S3 object using the Async client](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/async/GetObjectDataAsync.java) (GetObject command) +- [Use the asynchronous client to place an object into an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/async/S3AsyncOps.java) (PutObject command) + +You will find these examples that use the **S3TransferManager** class: + +- [Download a file from an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/FileDownload.java) (DownloadFile command) +- [Download all objects in an S3 bucket to a local directory](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/DownloadToDirectory.java) (DownloadDirectory command) +- [Copy an object to another S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/ObjectCopy.java) (CopyRequest command) +- [Upload a file to an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/FileUpload.java) (UploadFile command) +- [Upload a local directory to an S3 bucket](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/DirectoryUpload.java) (UploadDirectory command) ### Scenario -- [Performing various Amazon S3 operations](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3Scenario.java) (multiple commands) +- [Perform various Amazon S3 operations](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3Scenario.java) (multiple commands) ### Cross-service -- [Building a Spring Boot web application that Streams Amazon S3 content over HTTP](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/usecases/create_spring_stream_app) -- [Detect PPE in images with Amazon Rekognition using an AWS SDK](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/usecases/creating_lambda_ppe) -- [Creating a dynamic web application that analyzes photos using the AWS SDK for Java](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/usecases/creating_photo_analyzer_app) +- [Build a Spring Boot web application that streams Amazon S3 content over HTTP](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/usecases/create_spring_stream_app) +- [Detect PPE in images with Amazon Rekognition](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/usecases/creating_lambda_ppe) +- [Create a dynamic web application that analyzes photos using the AWS SDK for Java](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/usecases/creating_photo_analyzer_app) ## Running the examples To run these examples, you can setup your development environment to use Apache Maven or Gradle to configure and build AWS SDK for Java projects. For more information, @@ -121,7 +123,7 @@ Define these values to successfully run the JUnit tests: - **encryptObjectName** - The name of the object to encrypt required for the **KMSEncryptionExample** test. - **encryptObjectPath** - The path to a TXT file to encrypt and place into a Amazon S3 bucket. This value is required for the **KMSEncryptionExample** test. - **encryptOutPath** - The path where a text file is written to after it's decrypted. This value is required for the **KMSEncryptionExample** test. -- **keyId** - The id of the AWS KMS key to use to encrpt/decrypt the data. You can obtain the key ID value from the AWS Management Console. This value is required for the **KMSEncryptionExample** test. +- **keyId** - The id of the AWS KMS key to use to encrypt/decrypt the data. You can obtain the key ID value from the AWS Management Console. This value is required for the **KMSEncryptionExample** test. ### Sample policy text diff --git a/javav2/example_code/s3/checkstyle.xml b/javav2/example_code/s3/checkstyle.xml new file mode 100644 index 00000000000..8e0601fd3d4 --- /dev/null +++ b/javav2/example_code/s3/checkstyle.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javav2/example_code/s3/pom.xml b/javav2/example_code/s3/pom.xml index d9fd210ceb8..f3b5fa8c06d 100644 --- a/javav2/example_code/s3/pom.xml +++ b/javav2/example_code/s3/pom.xml @@ -6,6 +6,9 @@ 1.0-SNAPSHOT 1.8 + 2.19.1 + 0.20.4 + UTF-8 @@ -23,6 +26,26 @@ maven-surefire-plugin 2.22.1 + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.2.0 + + ${project.basedir}/checkstyle.xml + true + true + false + + + + validate + validate + + check + + + + @@ -30,7 +53,14 @@ software.amazon.awssdk bom - 2.17.230 + ${aws.sdk.version} + pom + import + + + org.apache.logging.log4j + log4j-bom + 2.19.0 pom import @@ -72,7 +102,6 @@ software.amazon.awssdk s3-transfer-manager - 2.17.103-PREVIEW software.amazon.awssdk @@ -82,10 +111,36 @@ software.amazon.awssdk s3control + + org.apache.logging.log4j + log4j-core + org.apache.logging.log4j log4j-api - 2.17.2 + + + org.apache.logging.log4j + log4j-slf4j2-impl + + + + + org.apache.logging.log4j + log4j-1.2-api + + + software.amazon.awssdk.crt + aws-crt + ${aws.crt.version} + + + software.amazon.awssdk + sso + + + software.amazon.awssdk + ssooidc \ No newline at end of file diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/CheckingObjectIntegrity.java b/javav2/example_code/s3/src/main/java/com/example/s3/CheckingObjectIntegrity.java index fb126513569..10090093447 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/CheckingObjectIntegrity.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/CheckingObjectIntegrity.java @@ -12,9 +12,7 @@ package com.example.s3; // snippet-start:[s3.java2.s3_object_check_integrity.import] -import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; -import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; -import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; + import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.regions.Region; diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketDeletion.java b/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketDeletion.java index 3a2da521a76..a86e0ec1ee0 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketDeletion.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketDeletion.java @@ -10,10 +10,16 @@ // snippet-start:[s3.java2.bucket_deletion.import] // snippet-start:[s3.java2.s3_bucket_ops.delete_bucket.import] + import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.*; +import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; +import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; +import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; +import software.amazon.awssdk.services.s3.model.ListObjectsV2Response; +import software.amazon.awssdk.services.s3.model.S3Exception; +import software.amazon.awssdk.services.s3.model.S3Object; // snippet-end:[s3.java2.s3_bucket_ops.delete_bucket.import] // snippet-end:[s3.java2.bucket_deletion.import] // snippet-start:[s3.java2.bucket_deletion.main] diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/S3Scenario.java b/javav2/example_code/s3/src/main/java/com/example/s3/S3Scenario.java index 29a1a1e0fac..a30df8ccb65 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/S3Scenario.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/S3Scenario.java @@ -92,7 +92,7 @@ public static void main(String[] args) throws IOException { String bucketName = args[0]; String key = args[1]; String objectPath = args[2]; - String savePath = args[3]; + String savePath = args[3]; String toBucket = args[4] ; ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(); diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/DownloadFile.java b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/DownloadFile.java new file mode 100644 index 00000000000..cc37a7a4468 --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/DownloadFile.java @@ -0,0 +1,90 @@ +//snippet-sourcedescription:[DownloadFile.java demonstrates how to download a file using the Amazon Simple Storage Service (Amazon S3) TransferManager.] +//snippet-keyword:[AWS SDK for Java v2] +//snippet-service:[Amazon S3] + +/* + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + SPDX-License-Identifier: Apache-2.0 +*/ +package com.example.s3.transfermanager; + +// snippet-start:[s3.tm.java2.downloadfile.import] +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.transfer.s3.S3TransferManager; +import software.amazon.awssdk.transfer.s3.model.CompletedFileDownload; +import software.amazon.awssdk.transfer.s3.model.DownloadFileRequest; +import software.amazon.awssdk.transfer.s3.model.FileDownload; +import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; + +import java.io.IOException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.UUID; +// snippet-end:[s3.tm.java2.downloadfile.import] + +/** + * Before running this Java V2 code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html + */ + +public class DownloadFile { + private static final Logger logger = LoggerFactory.getLogger(UploadFile.class); + public final String bucketName = "x-" + UUID.randomUUID(); + public final String key = UUID.randomUUID().toString(); + public String downloadedFileWithPath; + private final String downloadedFileName = "downloaded.png"; + + public DownloadFile() { + setUp(); + } + + public static void main(String[] args) { + DownloadFile download = new DownloadFile(); + download.downloadFile(S3ClientFactory.transferManager, download.bucketName, download.key, download.downloadedFileWithPath); + download.cleanUp(); + } + + // snippet-start:[s3.tm.java2.downloadfile.main] + public Long downloadFile(S3TransferManager transferManager, String bucketName, + String key, String downloadedFileWithPath) { + DownloadFileRequest downloadFileRequest = + DownloadFileRequest.builder() + .getObjectRequest(b -> b.bucket(bucketName).key(key)) + .addTransferListener(LoggingTransferListener.create()) + .destination(Paths.get(downloadedFileWithPath)) + .build(); + + FileDownload downloadFile = transferManager.downloadFile(downloadFileRequest); + + CompletedFileDownload downloadResult = downloadFile.completionFuture().join(); + logger.info("Content length [{}]", downloadResult.response().contentLength()); + return downloadResult.response().contentLength(); + } + // snippet-end:[s3.tm.java2.downloadfile.main] + + private void setUp(){ + S3ClientFactory.s3Client.createBucket(b -> b.bucket(bucketName)); + S3ClientFactory.s3Client.putObject(builder -> builder + .bucket(bucketName) + .key(key), RequestBody.fromString("Hello World")); + URL resource = DownloadFile.class.getClassLoader().getResource("."); + downloadedFileWithPath = resource.getFile() + downloadedFileName; + } + + public void cleanUp(){ + S3ClientFactory.s3Client.deleteObject(b -> b.bucket(bucketName).key(key)); + S3ClientFactory.s3Client.deleteBucket(b -> b.bucket(bucketName)); + URL url = DownloadFile.class.getClassLoader().getResource(downloadedFileName); + try { + Files.delete(Paths.get(url.getPath())); + } catch (IOException e) { + logger.error(e.getMessage()); + } + } +} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/DownloadToDirectory.java b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/DownloadToDirectory.java new file mode 100644 index 00000000000..c2c4c74c4e5 --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/DownloadToDirectory.java @@ -0,0 +1,112 @@ +//snippet-sourcedescription:[DownloadToDirectory.java demonstrates how to copy all objects in an Amazon Simple Storage Service (Amazon S3) bucket to a local directory using the Amazon S3 TransferManager.] +//snippet-keyword:[AWS SDK for Java v2] +//snippet-service:[Amazon S3] + +/* + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + SPDX-License-Identifier: Apache-2.0 +*/ +package com.example.s3.transfermanager; + +// snippet-start:[s3.tm.java2.downloadtodirectory.import] +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.services.s3.model.ObjectIdentifier; +import software.amazon.awssdk.transfer.s3.S3TransferManager; +import software.amazon.awssdk.transfer.s3.model.CompletedDirectoryDownload; +import software.amazon.awssdk.transfer.s3.model.DirectoryDownload; +import software.amazon.awssdk.transfer.s3.model.DownloadDirectoryRequest; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +// snippet-end:[s3.tm.java2.downloadtodirectory.import] + +/** + * Before running this Java V2 code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html + */ + +public class DownloadToDirectory { + private static final Logger logger = LoggerFactory.getLogger(DownloadToDirectory.class); + public final String bucketName = "x-" + UUID.randomUUID(); + public String destinationPath; + private final Set downloadedFileNameSet = new HashSet<>(); + private final String destinationDirName = "downloadDirectory"; + + public DownloadToDirectory() { + setUp(); + } + + public static void main(String[] args) { + DownloadToDirectory download = new DownloadToDirectory(); + Integer numFilesFailedToDownload = download.downloadObjectsToDirectory(S3ClientFactory.transferManager, download.destinationPath, download.bucketName); + logger.info("Number of files that failed to download [{}].", numFilesFailedToDownload); + download.cleanUp(); + } + + // snippet-start:[s3.tm.java2.downloadtodirectory.main] + public Integer downloadObjectsToDirectory(S3TransferManager transferManager, + String destinationPath, String bucketName) { + DirectoryDownload directoryDownload = + transferManager.downloadDirectory(DownloadDirectoryRequest.builder() + .destination(Paths.get(destinationPath)) + .bucket(bucketName) + .build()); + CompletedDirectoryDownload completedDirectoryDownload = directoryDownload.completionFuture().join(); + + completedDirectoryDownload.failedTransfers().forEach(fail -> + logger.warn("Object [{}] failed to transfer", fail.toString())); + return completedDirectoryDownload.failedTransfers().size(); + } + // snippet-end:[s3.tm.java2.downloadtodirectory.main] + + private void setUp() { + S3ClientFactory.s3Client.createBucket(b -> b.bucket(bucketName)); + + RequestBody requestBody = RequestBody.fromString("Hello World."); + java.util.stream.IntStream.rangeClosed(1, 3).forEach(i -> { + String fileName = "downloadedFile" + i + ".txt"; + downloadedFileNameSet.add(fileName); + S3ClientFactory.s3Client.putObject(b -> b + .bucket(bucketName) + .key(fileName), + requestBody); + } + ); + destinationPath = DownloadToDirectory.class.getClassLoader().getResource(destinationDirName).getPath(); + } + + + public void cleanUp() { + // Delete items uploaded to bucket for download. + Set items = downloadedFileNameSet + .stream() + .map(name -> ObjectIdentifier.builder().key(name).build()) + .collect(Collectors.toSet()); + + S3ClientFactory.s3Client.deleteObjects(b -> b + .bucket(bucketName) + .delete(b1 -> b1.objects(items))); + // Delete bucket. + S3ClientFactory.s3Client.deleteBucket(b -> b.bucket(bucketName)); + + // Delete files downloaded. + downloadedFileNameSet.stream().forEach(fileName -> { + try { + Files.delete(Paths.get(destinationPath + "/" + fileName)); + } catch (IOException e) { + logger.error("Exception deleting file [{}]", fileName); + throw new RuntimeException(e); + } + }); + } +} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/FileUpDownOps.java b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/FileUpDownOps.java deleted file mode 100644 index 51e81ef17e7..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/FileUpDownOps.java +++ /dev/null @@ -1,81 +0,0 @@ -//snippet-sourcedescription:[FileUpDownOps.java demonstrates how to upload and download an object to an Amazon Simple Storage Service (Amazon S3) bucket.] -//snippet-keyword:[AWS SDK for Java v2] -//snippet-service:[Amazon S3] -/* - Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - SPDX-License-Identifier: Apache-2.0 -*/ -package com.example.s3.transfermanager; - -// snippet-start:[s3.tm.java2.file_up_down_ops.import] -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.transfer.s3.CompletedFileDownload; -import software.amazon.awssdk.transfer.s3.CompletedFileUpload; -import software.amazon.awssdk.transfer.s3.FileDownload; -import software.amazon.awssdk.transfer.s3.FileUpload; -import software.amazon.awssdk.transfer.s3.S3ClientConfiguration; -import software.amazon.awssdk.transfer.s3.S3TransferManager; - -import java.nio.file.Paths; - -import static software.amazon.awssdk.transfer.s3.SizeConstant.MB; -// snippet-end:[s3.tm.java2.file_up_down_ops.import] - -public class FileUpDownOps { - - private String bucketName; - private String key; - private String filePath; - private String downloadedFileName; - - public FileUpDownOps(String bucketName, String key, String filePath, String downloadedFileName) { - this.bucketName = bucketName; - this.key = key; - this.filePath = filePath; - this.downloadedFileName = downloadedFileName; - } - - public String fileUploadDownload() { - -// snippet-start:[s3.tm.java2.file_up_down_ops.createclients] - S3ClientConfiguration s3ClientConfiguration = - S3ClientConfiguration.builder() - .region(Region.US_EAST_1) - .minimumPartSizeInBytes(10 * MB) - .targetThroughputInGbps(20.0) - .build(); - - S3TransferManager s3TransferManager = S3TransferManager.builder() - .s3ClientConfiguration(s3ClientConfiguration) - .build(); -// snippet-end:[s3.tm.java2.file_up_down_ops.createclients] - -// snippet-start:[s3.tm.java2.file_up_down_ops.fileupload] - FileUpload fileUpload = s3TransferManager.uploadFile(uploadFileRequestBuilder -> - uploadFileRequestBuilder - .putObjectRequest( - putObjectRequestBuilder -> putObjectRequestBuilder.bucket(bucketName).key(key)) - .source(Paths.get(filePath))); -// snippet-end:[s3.tm.java2.file_up_down_ops.fileupload] - -// snippet-start:[s3.tm.java2.file_up_down_ops.fileuploadresult] - CompletedFileUpload uploadResult = fileUpload.completionFuture().join(); - System.out.println("Etag: " + uploadResult.response().eTag()); -// snippet-end:[s3.tm.java2.file_up_down_ops.fileuploadresult] - -// snippet-start:[s3.tm.java2.file_up_down_ops.filedownload] - FileDownload downloadFile = s3TransferManager.downloadFile( - downloadFileRequestBuilder -> downloadFileRequestBuilder - .getObjectRequest(getObjectRequestBuilder -> - getObjectRequestBuilder.bucket(bucketName).key(key)) - .destination(Paths.get(downloadedFileName))); -// snippet-end:[s3.tm.java2.file_up_down_ops.filedownload] - -// snippet-start:[s3.tm.java2.file_up_down_ops.filedownloadresult] - CompletedFileDownload downloadResult = downloadFile.completionFuture().join(); - System.out.println("Content length: " + downloadResult.response().contentLength()); -// snippet-end:[s3.tm.java2.file_up_down_ops.filedownloadresult] - - return uploadResult.response().eTag() + "|" + downloadResult.response().contentType(); - } -} \ No newline at end of file diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/GetObject.java b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/GetObject.java deleted file mode 100644 index 31b4c1a6214..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/GetObject.java +++ /dev/null @@ -1,67 +0,0 @@ -//snippet-sourcedescription:[GetObject.java demonstrates how to download an object from an Amazon Simple Storage Service (Amazon S3) bucket.] -//snippet-keyword:[AWS SDK for Java v2] -//snippet-service:[Amazon S3] - -/* - Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - SPDX-License-Identifier: Apache-2.0 -*/ -package com.example.transfermanager; - -import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.transfer.s3.FileDownload; -import software.amazon.awssdk.transfer.s3.S3TransferManager; -import java.nio.file.Paths; - -/** - * Before running this Java V2 code example, set up your development environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ - -public class GetObject { - - public static void main(String[] args) { - - final String usage = "\n" + - "Usage:\n" + - " \n\n" + - "Where:\n" + - " bucketName - The Amazon S3 bucket to upload an object into.\n" + - " objectKey - The object to download (for example, book.pdf).\n" + - " objectPath - The path where the file is written (for example, C:/AWS/book2.pdf). \n\n" ; - - if (args.length != 3) { - System.out.println(usage); - System.exit(1); - } - - long mb = 1024; - String bucketName = args[0]; - String objectKey = args[1]; - String objectPath = args[2]; - - ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(); - Region region = Region.US_EAST_1; - S3TransferManager transferManager = S3TransferManager.builder() - .s3ClientConfiguration(cfg ->cfg.region(region) - .credentialsProvider(credentialsProvider) - .targetThroughputInGbps(20.0) - .minimumPartSizeInBytes(10 * mb)) - .build(); - - downloadObjectTM(transferManager, bucketName, objectKey, objectPath); - System.out.println("Object was successfully downloaded using the Transfer Manager."); - transferManager.close(); - } - - public static void downloadObjectTM(S3TransferManager transferManager, String bucketName, String objectKey, String objectPath) { - FileDownload download = - transferManager.downloadFile(d -> d.getObjectRequest(g -> g.bucket(bucketName).key(objectKey)) - .destination(Paths.get(objectPath))); - download.completionFuture().join(); - } -} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/ObjectCopy.java b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/ObjectCopy.java new file mode 100644 index 00000000000..5b3b22e7a85 --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/ObjectCopy.java @@ -0,0 +1,87 @@ +//snippet-sourcedescription:[ObjectCopy.java demonstrates how to copy an object between Amazon Simple Storage Service (Amazon S3) buckets using the Amazon S3 TransferManager.] +//snippet-keyword:[AWS SDK for Java v2] +//snippet-service:[Amazon S3] + +/* + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + SPDX-License-Identifier: Apache-2.0 +*/ +package com.example.s3.transfermanager; + +// snippet-start:[s3.tm.java2.objectcopy.import] +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.services.s3.model.CopyObjectRequest; +import software.amazon.awssdk.transfer.s3.S3TransferManager; +import software.amazon.awssdk.transfer.s3.model.CompletedCopy; +import software.amazon.awssdk.transfer.s3.model.Copy; +import software.amazon.awssdk.transfer.s3.model.CopyRequest; + +import java.util.UUID; +// snippet-end:[s3.tm.java2.objectcopy.import] + +/** + * Before running this Java V2 code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html + */ + +public class ObjectCopy { + private static final Logger logger = LoggerFactory.getLogger(ObjectCopy.class); + public final String bucketName = "x-" + UUID.randomUUID(); + public final String key = UUID.randomUUID().toString(); + public final String destinationBucket = "y-" + UUID.randomUUID(); + public final String destinationKey = UUID.randomUUID().toString(); + + public ObjectCopy() { + setUp(); + } + + public static void main(String[] args) { + ObjectCopy copy = new ObjectCopy(); + + String etag = copy.copyObject(S3ClientFactory.transferManager,copy.bucketName, + copy.key, copy.destinationBucket, copy.destinationKey); + logger.info("etag [{}]", etag); + copy.cleanUp(); + } + + // snippet-start:[s3.tm.java2.objectcopy.main] + public String copyObject(S3TransferManager transferManager, String bucketName, + String key, String destinationBucket, String destinationKey){ + CopyObjectRequest copyObjectRequest = CopyObjectRequest.builder() + .sourceBucket(bucketName) + .sourceKey(key) + .destinationBucket(destinationBucket) + .destinationKey(destinationKey) + .build(); + + CopyRequest copyRequest = CopyRequest.builder() + .copyObjectRequest(copyObjectRequest) + .build(); + + Copy copy = transferManager.copy(copyRequest); + + CompletedCopy completedCopy = copy.completionFuture().join(); + return completedCopy.response().copyObjectResult().eTag(); + } + // snippet-end:[s3.tm.java2.objectcopy.main] + + private void setUp() { + S3ClientFactory.s3Client.createBucket(b -> b.bucket(bucketName)); + S3ClientFactory.s3Client.putObject(builder -> builder + .bucket(bucketName) + .key(key), RequestBody.fromString("Hello World")); + S3ClientFactory.s3Client.createBucket(b -> b.bucket(destinationBucket)); + } + + public void cleanUp(){ + S3ClientFactory.s3Client.deleteObject(b -> b.bucket(bucketName).key(key)); + S3ClientFactory.s3Client.deleteBucket(b -> b.bucket(bucketName)); + S3ClientFactory.s3Client.deleteObject(b -> b.bucket(destinationBucket).key(destinationKey)); + S3ClientFactory.s3Client.deleteBucket(b -> b.bucket(destinationBucket)); + } +} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/S3ClientFactory.java b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/S3ClientFactory.java new file mode 100644 index 00000000000..cd84cf7894d --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/S3ClientFactory.java @@ -0,0 +1,63 @@ +//snippet-sourcedescription:[S3ClientFactory.java demonstrates how to create instances of the Amazon Simple Storage Service (Amazon S3) TransferManager.] +//snippet-keyword:[AWS SDK for Java v2] +//snippet-service:[Amazon S3] + +/* + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + SPDX-License-Identifier: Apache-2.0 +*/ +package com.example.s3.transfermanager; + +import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.transfer.s3.S3TransferManager; + +import static software.amazon.awssdk.transfer.s3.SizeConstant.MB; + +/** + * Before running this Java V2 code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html + */ + +public class S3ClientFactory { + public static final S3TransferManager transferManager = createCustonTm(); + public static final S3TransferManager transferManagerWithDefaults = createDefaultTm(); + public static final S3Client s3Client; + + private static S3TransferManager createCustonTm(){ + // snippet-start:[s3.tm.java2.s3clientfactory.create_custom_tm] + S3AsyncClient s3AsyncClient = + S3AsyncClient.crtBuilder() + .credentialsProvider(DefaultCredentialsProvider.create()) + .region(Region.US_EAST_1) + .targetThroughputInGbps(20.0) + .minimumPartSizeInBytes(8 * MB) + .build(); + + S3TransferManager transferManager = + S3TransferManager.builder() + .s3Client(s3AsyncClient) + .build(); + // snippet-end:[s3.tm.java2.s3clientfactory.create_custom_tm] + return transferManager; + } + + private static S3TransferManager createDefaultTm(){ + // snippet-start:[s3.tm.java2.s3clientfactory.create_default_tm] + S3TransferManager transferManager = S3TransferManager.create(); + // snippet-end:[s3.tm.java2.s3clientfactory.create_default_tm] + return transferManager; + } + + static { + s3Client = S3Client.builder() + .credentialsProvider(DefaultCredentialsProvider.create()) + .region(Region.US_EAST_1) + .build(); + } +} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadADirectory.java b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadADirectory.java new file mode 100644 index 00000000000..1a6d3508ecb --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadADirectory.java @@ -0,0 +1,83 @@ +//snippet-sourcedescription:[UploadADirectory.java demonstrates how to recursively copy a local directory to an Amazon Simple Storage Service (Amazon S3) bucket the Amazon S3 TransferManager.] +//snippet-keyword:[AWS SDK for Java v2] +//snippet-service:[Amazon S3] + +/* + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + SPDX-License-Identifier: Apache-2.0 +*/ +package com.example.s3.transfermanager; + +// snippet-start:[s3.tm.java2.uploadadirectory.import] +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.services.s3.model.ObjectIdentifier; +import software.amazon.awssdk.transfer.s3.S3TransferManager; +import software.amazon.awssdk.transfer.s3.model.CompletedDirectoryUpload; +import software.amazon.awssdk.transfer.s3.model.DirectoryUpload; +import software.amazon.awssdk.transfer.s3.model.UploadDirectoryRequest; + +import java.net.URL; +import java.nio.file.Paths; +import java.util.UUID; +// snippet-end:[s3.tm.java2.uploadadirectory.import] + +/** + * Before running this Java V2 code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html + */ + +public class UploadADirectory { + private static final Logger logger = LoggerFactory.getLogger(UploadADirectory.class); + public final String bucketName = "x-" + UUID.randomUUID(); + public String sourceDirectory; + + public UploadADirectory() { + setUp(); + } + + public static void main(String[] args) { + UploadADirectory upload = new UploadADirectory(); + + Integer numFailedUploads = upload.uploadDirectory(S3ClientFactory.transferManager, upload.sourceDirectory, upload.bucketName); + logger.info("Number of failed transfers [{}].", numFailedUploads); + upload.cleanUp(); + } + + // snippet-start:[s3.tm.java2.uploadadirectory.main] + public Integer uploadDirectory(S3TransferManager transferManager, + String sourceDirectory, String bucketName){ + DirectoryUpload directoryUpload = + transferManager.uploadDirectory(UploadDirectoryRequest.builder() + .source(Paths.get(sourceDirectory)) + .bucket(bucketName) + .build()); + + CompletedDirectoryUpload completedDirectoryUpload = directoryUpload.completionFuture().join(); + completedDirectoryUpload.failedTransfers().forEach(fail -> + logger.warn("Object [{}] failed to transfer", fail.toString())); + return completedDirectoryUpload.failedTransfers().size(); + } + // snippet-end:[s3.tm.java2.uploadadirectory.main] + + private void setUp(){ + S3ClientFactory.s3Client.createBucket(b -> b.bucket(bucketName)); + URL dirResource = UploadADirectory.class.getClassLoader().getResource("uploadDirectory"); + sourceDirectory = dirResource.getPath(); + } + + public void cleanUp(){ + S3ClientFactory.s3Client.deleteObjects(b -> b + .bucket(bucketName) + .delete(b1 -> b1 + .objects( + ObjectIdentifier.builder().key("file1.txt").build(), + ObjectIdentifier.builder().key("file2.txt").build(), + ObjectIdentifier.builder().key("file3.txt").build() + ))); + S3ClientFactory.s3Client.deleteBucket(b -> b.bucket(bucketName)); + } +} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadFile.java b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadFile.java new file mode 100644 index 00000000000..e7a9a3fb08a --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadFile.java @@ -0,0 +1,77 @@ +//snippet-sourcedescription:[UploadFile.java demonstrates how to upload a file using the Amazon Simple Storage Service (Amazon S3) TransferManager.] +//snippet-keyword:[AWS SDK for Java v2] +//snippet-service:[Amazon S3] + +/* + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + SPDX-License-Identifier: Apache-2.0 +*/ +package com.example.s3.transfermanager; + +// snippet-start:[s3.tm.java2.uploadfile.import] +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.awssdk.transfer.s3.S3TransferManager; +import software.amazon.awssdk.transfer.s3.model.CompletedFileUpload; +import software.amazon.awssdk.transfer.s3.model.FileUpload; +import software.amazon.awssdk.transfer.s3.model.UploadFileRequest; +import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; + +import java.net.URL; +import java.nio.file.Paths; +import java.util.UUID; +// snippet-end:[s3.tm.java2.uploadfile.import] + +/** + * Before running this Java V2 code example, set up your development environment, including your credentials. + * + * For more information, see the following documentation topic: + * + * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html + */ + +public class UploadFile { + private static final Logger logger = LoggerFactory.getLogger(UploadFile.class); + public final String bucketName = "x-" + UUID.randomUUID(); + public final String key = UUID.randomUUID().toString(); + public String filePath; + + public UploadFile() { + this.setUp(); + } + + public static void main(String[] args) { + UploadFile upload = new UploadFile(); + upload.uploadFile(S3ClientFactory.transferManager, upload.bucketName, upload.key, upload.filePath); + upload.cleanUp(); + } + + // snippet-start:[s3.tm.java2.uploadfile.main] + public String uploadFile(S3TransferManager transferManager, String bucketName, + String key, String filePath) { + UploadFileRequest uploadFileRequest = + UploadFileRequest.builder() + .putObjectRequest(b -> b.bucket(bucketName).key(key)) + .addTransferListener(LoggingTransferListener.create()) + .source(Paths.get(filePath)) + .build(); + + FileUpload fileUpload = transferManager.uploadFile(uploadFileRequest); + + CompletedFileUpload uploadResult = fileUpload.completionFuture().join(); + return uploadResult.response().eTag(); + } + // snippet-end:[s3.tm.java2.uploadfile.main] + + private void setUp(){ + S3ClientFactory.s3Client.createBucket(b -> b.bucket(bucketName)); + // get the file system path to the provided file to upload + URL resource = UploadFile.class.getClassLoader().getResource("image.png"); + filePath = resource.getPath(); + } + + public void cleanUp(){ + S3ClientFactory.s3Client.deleteObject(b -> b.bucket(bucketName).key(key)); + S3ClientFactory.s3Client.deleteBucket(b -> b.bucket(bucketName)); + } +} diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadObject.java b/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadObject.java deleted file mode 100644 index f2700771d4e..00000000000 --- a/javav2/example_code/s3/src/main/java/com/example/s3/transfermanager/UploadObject.java +++ /dev/null @@ -1,69 +0,0 @@ -//snippet-sourcedescription:[UploadObject.java demonstrates how to upload an object to an Amazon Simple Storage Service (Amazon S3) bucket.] -//snippet-keyword:[AWS SDK for Java v2] -//snippet-service:[Amazon S3] - -/* - Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - SPDX-License-Identifier: Apache-2.0 -*/ -package com.example.transfermanager; - -import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.transfer.s3.FileUpload; -import software.amazon.awssdk.transfer.s3.S3TransferManager; -import java.nio.file.Paths; - -/** - * Before running this Java V2 code example, set up your development environment, including your credentials. - * - * For more information, see the following documentation topic: - * - * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html - */ -public class UploadObject { - - public static void main(String[] args) { - - final String usage = "\n" + - "Usage:\n" + - " \n\n" + - "Where:\n" + - " bucketName - The Amazon S3 bucket to upload an object into.\n" + - " objectKey - The object to upload (for example, book.pdf).\n" + - " objectPath - The path where the file is located (for example, C:/AWS/book2.pdf). \n\n" ; - - if (args.length != 3) { - System.out.println(usage); - System.exit(1); - } - - long mb = 1024; - String bucketName = args[0]; - String objectKey = args[1]; - String objectPath = args[2]; - - - System.out.println("Putting an object into bucket "+bucketName +" using the S3TransferManager"); - ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(); - Region region = Region.US_EAST_1; - S3TransferManager transferManager = S3TransferManager.builder() - .s3ClientConfiguration(cfg ->cfg.region(region) - .credentialsProvider(credentialsProvider) - .targetThroughputInGbps(20.0) - .minimumPartSizeInBytes(10 * mb)) - .build(); - - uploadObjectTM(transferManager, bucketName, objectKey, objectPath); - System.out.println("Object was successfully uploaded using the Transfer Manager."); - transferManager.close(); - } - - public static void uploadObjectTM( S3TransferManager transferManager, String bucketName, String objectKey, String objectPath) { - - FileUpload upload = - transferManager.uploadFile(u -> u.source(Paths.get(objectPath)) - .putObjectRequest(p -> p.bucket(bucketName).key(objectKey))); - upload.completionFuture().join(); - } -} diff --git a/javav2/example_code/s3/src/main/resources/downloadDirectory/dummy.txt b/javav2/example_code/s3/src/main/resources/downloadDirectory/dummy.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/javav2/example_code/s3/src/main/resources/image.png b/javav2/example_code/s3/src/main/resources/image.png new file mode 100644 index 0000000000000000000000000000000000000000..647caf71e5b286541bf97bca7d90dc1a3b8bdce5 GIT binary patch literal 150565 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 ja_*CiCPd(hW_0loP8y+8IY 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%0A92k(D7z_sqs)sFI#Zp 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 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javav2/example_code/s3/src/main/resources/uploadDirectory/file1.txt b/javav2/example_code/s3/src/main/resources/uploadDirectory/file1.txt new file mode 100644 index 00000000000..e2129701f1a --- /dev/null +++ b/javav2/example_code/s3/src/main/resources/uploadDirectory/file1.txt @@ -0,0 +1 @@ +file1 diff --git a/javav2/example_code/s3/src/main/resources/uploadDirectory/file2.txt b/javav2/example_code/s3/src/main/resources/uploadDirectory/file2.txt new file mode 100644 index 00000000000..6c493ff740f --- /dev/null +++ b/javav2/example_code/s3/src/main/resources/uploadDirectory/file2.txt @@ -0,0 +1 @@ +file2 diff --git a/javav2/example_code/s3/src/main/resources/uploadDirectory/file3.txt b/javav2/example_code/s3/src/main/resources/uploadDirectory/file3.txt new file mode 100644 index 00000000000..7c8ac2f8d82 --- /dev/null +++ b/javav2/example_code/s3/src/main/resources/uploadDirectory/file3.txt @@ -0,0 +1 @@ +file3 diff --git a/javav2/example_code/s3/src/test/java/S3TestWatcher.java b/javav2/example_code/s3/src/test/java/S3TestWatcher.java new file mode 100644 index 00000000000..161d8f85c20 --- /dev/null +++ b/javav2/example_code/s3/src/test/java/S3TestWatcher.java @@ -0,0 +1,20 @@ +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestWatcher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class S3TestWatcher implements TestWatcher { + + private static final Logger logger = LoggerFactory.getLogger(S3TestWatcher.class); + + @Override + public void testSuccessful(ExtensionContext context) { + logger.info("Test Successful for test {}: ", context.getDisplayName()); + } + @Override + public void testFailed(ExtensionContext context, Throwable cause) { + logger.info("Test Failed for {}: ", context.getDisplayName()); + logger.error(cause.getMessage()); + } + +} diff --git a/javav2/example_code/s3/src/test/java/TransferManagerTest.java b/javav2/example_code/s3/src/test/java/TransferManagerTest.java new file mode 100644 index 00000000000..63bdeea9e27 --- /dev/null +++ b/javav2/example_code/s3/src/test/java/TransferManagerTest.java @@ -0,0 +1,70 @@ +import com.example.s3.transfermanager.DownloadFile; +import com.example.s3.transfermanager.DownloadToDirectory; +import com.example.s3.transfermanager.ObjectCopy; +import com.example.s3.transfermanager.S3ClientFactory; +import com.example.s3.transfermanager.UploadADirectory; +import com.example.s3.transfermanager.UploadFile; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.ExtendWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@TestInstance(TestInstance.Lifecycle.PER_METHOD) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@ExtendWith(S3TestWatcher.class) +class TransferManagerTest { + + private static final Logger logger = LoggerFactory.getLogger(TransferManagerTest.class); + + @Test + @Order(1) + public void uploadSingleFileWorks(){ + UploadFile upload = new UploadFile(); + String etag = upload.uploadFile(S3ClientFactory.transferManager, upload.bucketName, + upload.key, upload.filePath); + Assertions.assertNotNull(etag); + upload.cleanUp(); + } + + @Test + @Order(2) + public void downloadSingleFileWorks(){ + DownloadFile download = new DownloadFile(); + Long fileLength = download.downloadFile(S3ClientFactory.transferManager, download.bucketName, download.key, download.downloadedFileWithPath); + Assertions.assertNotEquals(0L, fileLength); + download.cleanUp(); + } + + @Test + @Order(3) + public void copyObjectWorks(){ + ObjectCopy copy = new ObjectCopy(); + String etag = copy.copyObject(S3ClientFactory.transferManager, copy.bucketName, copy.key, copy.destinationBucket, copy.destinationKey); + Assertions.assertNotNull(etag); + copy.cleanUp(); + } + + @Test + @Order(4) + public void directoryUploadWorks(){ + UploadADirectory upload = new UploadADirectory(); + Integer numFailedUploads = upload.uploadDirectory(S3ClientFactory.transferManager, upload.sourceDirectory, upload.bucketName); + Assertions.assertNotNull(numFailedUploads, "Bucket download failed to complete."); + upload.cleanUp(); + + } + + @Test + @Order(5) + public void directoryDownloadWorks(){ + DownloadToDirectory download = new DownloadToDirectory(); + Integer numFilesFailedToDownload = download.downloadObjectsToDirectory(S3ClientFactory.transferManager, download.destinationPath, download.bucketName); + Assertions.assertNotNull(numFilesFailedToDownload, "Bucket download failed to complete."); + download.cleanUp(); + } +} \ No newline at end of file