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.
          * 

Reply via email to