This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch CAMEL-21262 in repository https://gitbox.apache.org/repos/asf/camel.git
commit d9147c77cfde37533c6449bfb98eda375b166082 Author: Andrea Cosentino <[email protected]> AuthorDate: Wed Oct 9 15:30:06 2024 +0200 CAMEL-21262 - Camel-AWS2-S3: Explicitly add Producer operations HeadObject and HeadBucket - HeadBucket Signed-off-by: Andrea Cosentino <[email protected]> --- .../camel/component/aws2/s3/AWS2S3Operations.java | 3 +- .../camel/component/aws2/s3/AWS2S3Producer.java | 39 ++++++-------- .../aws2/s3/integration/S3HeadBucketIT.java | 59 ++++++++++++++++++++++ 3 files changed, 77 insertions(+), 24 deletions(-) diff --git a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Operations.java b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Operations.java index 0b723b18958..1dc575c427f 100644 --- a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Operations.java +++ b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Operations.java @@ -25,5 +25,6 @@ public enum AWS2S3Operations { listBuckets, getObject, getObjectRange, - createDownloadLink + createDownloadLink, + headBucket } diff --git a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java index 368875fb0f3..38bfc5bc6b0 100644 --- a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java +++ b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java @@ -49,29 +49,7 @@ import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.core.sync.ResponseTransformer; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.AbortMultipartUploadRequest; -import software.amazon.awssdk.services.s3.model.BucketCannedACL; -import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest; -import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadResponse; -import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload; -import software.amazon.awssdk.services.s3.model.CompletedPart; -import software.amazon.awssdk.services.s3.model.CopyObjectRequest; -import software.amazon.awssdk.services.s3.model.CopyObjectResponse; -import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest; -import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse; -import software.amazon.awssdk.services.s3.model.DeleteBucketRequest; -import software.amazon.awssdk.services.s3.model.DeleteBucketResponse; -import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; -import software.amazon.awssdk.services.s3.model.GetObjectRequest; -import software.amazon.awssdk.services.s3.model.GetObjectResponse; -import software.amazon.awssdk.services.s3.model.ListBucketsResponse; -import software.amazon.awssdk.services.s3.model.ListObjectsRequest; -import software.amazon.awssdk.services.s3.model.ListObjectsResponse; -import software.amazon.awssdk.services.s3.model.ObjectCannedACL; -import software.amazon.awssdk.services.s3.model.PutObjectRequest; -import software.amazon.awssdk.services.s3.model.PutObjectResponse; -import software.amazon.awssdk.services.s3.model.ServerSideEncryption; -import software.amazon.awssdk.services.s3.model.UploadPartRequest; +import software.amazon.awssdk.services.s3.model.*; import software.amazon.awssdk.services.s3.presigner.S3Presigner; import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest; @@ -123,6 +101,9 @@ public class AWS2S3Producer extends DefaultProducer { case createDownloadLink: createDownloadLink(exchange); break; + case headBucket: + headBucket(getEndpoint().getS3Client(), exchange); + break; default: throw new IllegalArgumentException("Unsupported operation"); } @@ -719,6 +700,18 @@ public class AWS2S3Producer extends DefaultProducer { } } + private void headBucket(S3Client s3Client, Exchange exchange) { + String bucketName = exchange.getIn().getHeader(AWS2S3Constants.BUCKET_NAME, String.class); + if (ObjectHelper.isEmpty(bucketName)) { + throw new IllegalArgumentException( + "Head Bucket operation requires to specify a bucket name via Header"); + } + HeadBucketResponse headBucketResponse = s3Client.headBucket(HeadBucketRequest.builder().bucket(bucketName).build()); + + Message message = getMessageForResponse(exchange); + message.setBody(headBucketResponse); + } + private AWS2S3Operations determineOperation(Exchange exchange) { AWS2S3Operations operation = exchange.getIn().getHeader(AWS2S3Constants.S3_OPERATION, AWS2S3Operations.class); if (operation == null) { diff --git a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3HeadBucketIT.java b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3HeadBucketIT.java new file mode 100644 index 00000000000..5c65e517f2b --- /dev/null +++ b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3HeadBucketIT.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.aws2.s3.integration; + +import org.apache.camel.EndpointInject; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.aws2.s3.AWS2S3Constants; +import org.apache.camel.component.aws2.s3.AWS2S3Operations; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.jupiter.api.Test; + +public class S3HeadBucketIT extends Aws2S3Base { + + @EndpointInject + private ProducerTemplate template; + + @EndpointInject("mock:result") + private MockEndpoint result; + + @Test + public void sendInWithUserMetadata() throws InterruptedException { + result.expectedMessageCount(1); + + template.send("direct:headBucket", exchange -> { + exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, AWS2S3Operations.headBucket); + exchange.getIn().setHeader(AWS2S3Constants.BUCKET_NAME, "mycamel"); + }); + + result.assertIsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() { + String awsEndpoint = "aws2-s3://test-ss3-s3"; + + from("direct:headBucket").to(awsEndpoint).log("${body}").to("mock:result"); + + } + }; + } +}
