This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-4.8.x in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.8.x by this push: new bb02b8190a6 CAMEL-21608: (aws2-ses) Support message tags (#16778) bb02b8190a6 is described below commit bb02b8190a60ccd0844cd4d1719c0bf4329b0616 Author: Dylan Piergies <dylan.pierg...@gmail.com> AuthorDate: Sat Jan 11 07:35:16 2025 +0000 CAMEL-21608: (aws2-ses) Support message tags (#16778) Enhance to add support for message tags to the aws2-ses component. Tags are useful for providing user-defined metadata that will appear in email tracking events related to the sent email. --- .../apache/camel/catalog/components/aws2-ses.json | 5 ++-- .../apache/camel/component/aws2/ses/aws2-ses.json | 5 ++-- .../camel/component/aws2/ses/Ses2Constants.java | 3 +++ .../camel/component/aws2/ses/Ses2Producer.java | 19 ++++++++++++++- .../camel/component/aws2/ses/SesComponentTest.java | 27 ++++++++++++++++++++-- .../endpoint/dsl/Ses2EndpointBuilderFactory.java | 14 +++++++++++ 6 files changed, 66 insertions(+), 7 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ses.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ses.json index dc369519d59..9777b29a8bc 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ses.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-ses.json @@ -60,8 +60,9 @@ "CamelAwsSesTo": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "List of comma separated destination email address.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#TO" }, "CamelAwsSesCc": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "List of comma separated destination carbon copy (cc) email address.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#CC" }, "CamelAwsSesBcc": { "index": 7, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "List of comma separated destination blind carbon copy (bcc) email address.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#BCC" }, - "CamelAwsSesHtmlEmail": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The flag to show if email content is HTML.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#HTML_EMAIL" }, - "CamelAwsSesConfigurationSet": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "TThe configuration set to send.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#CONFIGURATION_SET" } + "CamelAwsSesTags": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A collection of name\/value pairs to apply when sending the email. Tags are user-defined properties that are included in published email sending events.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#TAGS" }, + "CamelAwsSesHtmlEmail": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The flag to show if email content is HTML.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#HTML_EMAIL" }, + "CamelAwsSesConfigurationSet": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "TThe configuration set to send.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#CONFIGURATION_SET" } }, "properties": { "from": { "index": 0, "kind": "path", "displayName": "From", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "The sender's email address." }, diff --git a/components/camel-aws/camel-aws2-ses/src/generated/resources/META-INF/org/apache/camel/component/aws2/ses/aws2-ses.json b/components/camel-aws/camel-aws2-ses/src/generated/resources/META-INF/org/apache/camel/component/aws2/ses/aws2-ses.json index dc369519d59..9777b29a8bc 100644 --- a/components/camel-aws/camel-aws2-ses/src/generated/resources/META-INF/org/apache/camel/component/aws2/ses/aws2-ses.json +++ b/components/camel-aws/camel-aws2-ses/src/generated/resources/META-INF/org/apache/camel/component/aws2/ses/aws2-ses.json @@ -60,8 +60,9 @@ "CamelAwsSesTo": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "List of comma separated destination email address.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#TO" }, "CamelAwsSesCc": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "List of comma separated destination carbon copy (cc) email address.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#CC" }, "CamelAwsSesBcc": { "index": 7, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "List of comma separated destination blind carbon copy (bcc) email address.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#BCC" }, - "CamelAwsSesHtmlEmail": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The flag to show if email content is HTML.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#HTML_EMAIL" }, - "CamelAwsSesConfigurationSet": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "TThe configuration set to send.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#CONFIGURATION_SET" } + "CamelAwsSesTags": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A collection of name\/value pairs to apply when sending the email. Tags are user-defined properties that are included in published email sending events.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#TAGS" }, + "CamelAwsSesHtmlEmail": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The flag to show if email content is HTML.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#HTML_EMAIL" }, + "CamelAwsSesConfigurationSet": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "TThe configuration set to send.", "constantName": "org.apache.camel.component.aws2.ses.Ses2Constants#CONFIGURATION_SET" } }, "properties": { "from": { "index": 0, "kind": "path", "displayName": "From", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "The sender's email address." }, diff --git a/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java b/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java index 43b333cc88f..5709e358539 100644 --- a/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java +++ b/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java @@ -40,6 +40,9 @@ public interface Ses2Constants { String CC = "CamelAwsSesCc"; @Metadata(description = "List of comma separated destination blind carbon copy (bcc) email address.", javaType = "String") String BCC = "CamelAwsSesBcc"; + @Metadata(description = "A collection of name/value pairs to apply when sending the email. Tags are user-defined properties that are included in published email sending events.", + javaType = "Map<String, String>") + String TAGS = "CamelAwsSesTags"; @Metadata(description = "The flag to show if email content is HTML.", javaType = "Boolean") String HTML_EMAIL = "CamelAwsSesHtmlEmail"; @Metadata(description = "TThe configuration set to send.", javaType = "String") diff --git a/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java b/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java index 0fb3aa01196..e43d0e3430d 100644 --- a/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java +++ b/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java @@ -22,6 +22,7 @@ import java.nio.ByteBuffer; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.stream.Stream; import org.apache.camel.Endpoint; @@ -39,6 +40,7 @@ import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.services.ses.model.Body; import software.amazon.awssdk.services.ses.model.Content; import software.amazon.awssdk.services.ses.model.Destination; +import software.amazon.awssdk.services.ses.model.MessageTag; import software.amazon.awssdk.services.ses.model.SendEmailRequest; import software.amazon.awssdk.services.ses.model.SendEmailResponse; import software.amazon.awssdk.services.ses.model.SendRawEmailRequest; @@ -86,6 +88,7 @@ public class Ses2Producer extends DefaultProducer { request.returnPath(determineReturnPath(exchange)); request.replyToAddresses(determineReplyToAddresses(exchange)); request.message(createMessage(exchange)); + request.tags(determineTags(exchange)); request.configurationSetName(determineConfigurationSet(exchange)); return request.build(); } @@ -95,6 +98,7 @@ public class Ses2Producer extends DefaultProducer { request.source(determineFrom(exchange)); request.destinations(determineRawTo(exchange)); request.rawMessage(createRawMessage(exchange)); + request.tags(determineTags(exchange)); request.configurationSetName(determineConfigurationSet(exchange)); return request.build(); } @@ -129,7 +133,6 @@ public class Ses2Producer extends DefaultProducer { return message.build(); } - @SuppressWarnings("unchecked") private Collection<String> determineReplyToAddresses(Exchange exchange) { String replyToAddresses = exchange.getIn().getHeader(Ses2Constants.REPLY_TO_ADDRESSES, String.class); if (replyToAddresses == null) { @@ -217,6 +220,20 @@ public class Ses2Producer extends DefaultProducer { return subject; } + @SuppressWarnings("unchecked") + private List<MessageTag> determineTags(Exchange exchange) { + Map<String, String> tagMap = exchange.getIn().getHeader(Ses2Constants.TAGS, Map.class); + if (tagMap == null || tagMap.isEmpty()) { + return null; + } + return tagMap.entrySet().stream() + .map(entry -> MessageTag.builder() + .name(entry.getKey()) + .value(entry.getValue()) + .build()) + .toList(); + } + private String determineConfigurationSet(Exchange exchange) { String configuration = exchange.getIn().getHeader(Ses2Constants.CONFIGURATION_SET, String.class); if (configuration == null) { diff --git a/components/camel-aws/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java b/components/camel-aws/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java index edb1515d93e..936963872e9 100644 --- a/components/camel-aws/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java +++ b/components/camel-aws/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java @@ -16,7 +16,9 @@ */ package org.apache.camel.component.aws2.ses; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.camel.BindToRegistry; import org.apache.camel.Exchange; @@ -24,10 +26,10 @@ import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; +import software.amazon.awssdk.services.ses.model.MessageTag; import software.amazon.awssdk.services.ses.model.SendEmailRequest; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; public class SesComponentTest extends CamelTestSupport { @@ -55,6 +57,8 @@ public class SesComponentTest extends CamelTestSupport { assertTrue(sendEmailRequest.replyToAddresses().contains("reply...@example.com")); assertTrue(sendEmailRequest.replyToAddresses().contains("reply...@example.com")); assertEquals("Subject", getSubject(sendEmailRequest)); + assertFalse(sendEmailRequest.hasTags()); + assertEquals(0, sendEmailRequest.tags().size()); assertEquals("This is my message text.", getBody(sendEmailRequest)); } @@ -81,6 +85,7 @@ public class SesComponentTest extends CamelTestSupport { exchange.getIn().setHeader(Ses2Constants.REPLY_TO_ADDRESSES, "anotherreply...@example.com, anotherreply...@example.com"); exchange.getIn().setHeader(Ses2Constants.SUBJECT, "anotherSubject"); + exchange.getIn().setHeader(Ses2Constants.TAGS, Map.of("tagName", "tagValue")); } }); @@ -97,6 +102,24 @@ public class SesComponentTest extends CamelTestSupport { assertTrue(sendEmailRequest.replyToAddresses().contains("anotherreply...@example.com")); assertEquals("anotherSubject", getSubject(sendEmailRequest)); assertEquals("This is my message text.", getBody(sendEmailRequest)); + assertTrue(sendEmailRequest.hasTags()); + assertEquals(List.of(MessageTag.builder().name("tagName").value("tagValue").build()), sendEmailRequest.tags()); + } + + @Test + public void sendMessageWithEmptyMessageTagsHeader() { + Exchange exchange = template.send("direct:start", new Processor() { + public void process(Exchange exchange) { + exchange.getIn().setBody("This is my message text."); + exchange.getIn().setHeader(Ses2Constants.TAGS, new HashMap<String, String>()); + } + }); + + assertEquals("1", exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID)); + + SendEmailRequest sendEmailRequest = sesClient.getSendEmailRequest(); + assertFalse(sendEmailRequest.hasTags()); + assertEquals(0, sendEmailRequest.tags().size()); } @Override diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Ses2EndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Ses2EndpointBuilderFactory.java index 0d57740c129..1f6433d73f7 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Ses2EndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Ses2EndpointBuilderFactory.java @@ -732,6 +732,20 @@ public interface Ses2EndpointBuilderFactory { public String awsSesBcc() { return "CamelAwsSesBcc"; } + /** + * A collection of name/value pairs to apply when sending the email. + * Tags are user-defined properties that are included in published email + * sending events. + * + * The option is a: {@code Map<String, String>} type. + * + * Group: producer + * + * @return the name of the header {@code AwsSesTags}. + */ + public String awsSesTags() { + return "CamelAwsSesTags"; + } /** * The flag to show if email content is HTML. *