You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2022/10/05 16:14:48 UTC

[camel-kamelets] branch main updated: Add a bean to duplicate headers and better understanding the source of an exchange

This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-kamelets.git


The following commit(s) were added to refs/heads/main by this push:
     new f346401d Add a bean to duplicate headers and better understanding the source of an exchange
f346401d is described below

commit f346401de1d3e4bef0cacad49f1ed500090ae246
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Oct 5 18:13:52 2022 +0200

    Add a bean to duplicate headers and better understanding the source of an exchange
---
 .../utils/headers/DuplicateNamingHeaders.java      | 100 +++++++++++++--------
 .../kamelets/utils/headers/RenameHeadersTest.java  |  22 ++++-
 2 files changed, 86 insertions(+), 36 deletions(-)

diff --git a/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/headers/DuplicateNamingHeaders.java b/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/headers/DuplicateNamingHeaders.java
index 1994bbda..eb5e391f 100644
--- a/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/headers/DuplicateNamingHeaders.java
+++ b/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/headers/DuplicateNamingHeaders.java
@@ -16,10 +16,11 @@
  */
 package org.apache.camel.kamelets.utils.headers;
 
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.InvalidPayloadException;
@@ -27,44 +28,66 @@ import org.apache.camel.Processor;
 
 public class DuplicateNamingHeaders implements Processor {
 
-    String prefix;
-    String renamingPrefix;
+	String prefix;
+	String renamingPrefix;
+	String selectedHeaders;
+	String mode = "all";
 
-    /**
-     * Default constructor.
-     */
-    public DuplicateNamingHeaders() {
-    }
+	/**
+	 * Default constructor.
+	 */
+	public DuplicateNamingHeaders() {
+	}
 
-    /**
-     * Constructor using fields.
-     * @param prefix a prefix to find all the headers to rename.
-     * @param renamingPrefix the renaming prefix to use on all the matching headers
-     */
-    public DuplicateNamingHeaders(String prefix, String renamingPrefix) {
-        this.prefix = prefix;
-        this.renamingPrefix = renamingPrefix;
-    }
+	/**
+	 * Constructor using fields.
+	 * 
+	 * @param prefix         a prefix to find all the headers to rename.
+	 * @param renamingPrefix the renaming prefix to use on all the matching headers
+	 */
+	public DuplicateNamingHeaders(String prefix, String renamingPrefix, String selectedHeaders, String mode) {
+		this.prefix = prefix;
+		this.renamingPrefix = renamingPrefix;
+		this.selectedHeaders = selectedHeaders;
+		this.mode = mode;
+	}
 
-    public void process(Exchange ex) throws InvalidPayloadException {
-        Map<String, Object> originalHeaders = ex.getMessage().getHeaders();
-        Map<String, Object> newHeaders = new HashMap<>();
-        for (Map.Entry<String, Object> entry : originalHeaders.entrySet()) {
+	public void process(Exchange ex) throws InvalidPayloadException {
+		Map<String, Object> originalHeaders = ex.getMessage().getHeaders();
+		Map<String, Object> newHeaders = new HashMap<>();
+		for (Map.Entry<String, Object> entry : originalHeaders.entrySet()) {
 			String key = entry.getKey();
 			Object val = entry.getValue();
-			if (key.startsWith(prefix)) {
-				String newKey = key.replaceFirst(prefix,renamingPrefix);
-				String subKey = newKey.substring(renamingPrefix.length());
-				String suffix = subKey.replaceAll(
-		                String.format("%s|%s|%s", "(?<=[A-Z])(?=[A-Z][a-z])",
-		                        "(?<=[^A-Z])(?=[A-Z])",
-		                        "(?<=[A-Za-z])(?=[^A-Za-z])"), ".").toLowerCase();
-				newHeaders.put(renamingPrefix+suffix, val);
-			} 
-		}
-        originalHeaders.putAll(newHeaders);
-        ex.getMessage().setHeaders(originalHeaders);
-    }
+			if (prefix != null && mode.equalsIgnoreCase("all")) {
+				if (key.startsWith(prefix)) {
+					String newKey = key.replaceFirst(prefix, renamingPrefix);
+					String subKey = newKey.substring(renamingPrefix.length());
+					String suffix = subKey.replaceAll(String.format("%s|%s|%s", "(?<=[A-Z])(?=[A-Z][a-z])",
+							"(?<=[^A-Z])(?=[A-Z])", "(?<=[A-Za-z])(?=[^A-Za-z])"), ".").toLowerCase();
+					newHeaders.put(renamingPrefix + suffix, val);
+				}
+			} else {
+					if (selectedHeaders != null && mode.equalsIgnoreCase("filtering")) {
+						List<String> headerList = Arrays.asList(selectedHeaders.split(","));
+						for (Iterator iterator = headerList.iterator(); iterator.hasNext();) {
+							String header = (String) iterator.next();
+							if (key.equalsIgnoreCase(header)) {
+								String newKey = key.replaceFirst(prefix, renamingPrefix);
+								String subKey = newKey.substring(renamingPrefix.length());
+								String suffix = subKey
+										.replaceAll(String.format("%s|%s|%s", "(?<=[A-Z])(?=[A-Z][a-z])",
+												"(?<=[^A-Z])(?=[A-Z])", "(?<=[A-Za-z])(?=[^A-Za-z])"), ".")
+										.toLowerCase();
+								newHeaders.put(renamingPrefix + suffix, val);
+							}
+						}
+
+					}
+				}
+			}
+		originalHeaders.putAll(newHeaders);
+		ex.getMessage().setHeaders(originalHeaders);
+	}
 
 	public void setPrefix(String prefix) {
 		this.prefix = prefix;
@@ -74,5 +97,12 @@ public class DuplicateNamingHeaders implements Processor {
 		this.renamingPrefix = renamingPrefix;
 	}
 
+	public void setSelectedHeaders(String selectedHeaders) {
+		this.selectedHeaders = selectedHeaders;
+	}
+
+	public void setMode(String mode) {
+		this.mode = mode;
+	}	
 
 }
diff --git a/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/headers/RenameHeadersTest.java b/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/headers/RenameHeadersTest.java
index 0fc2341c..f2510f34 100644
--- a/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/headers/RenameHeadersTest.java
+++ b/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/headers/RenameHeadersTest.java
@@ -38,7 +38,7 @@ class RenameHeadersTest {
     }
     
     @Test
-    void shouldRenameHeaders() throws Exception {
+    void shouldDuplicateHeaders() throws Exception {
         Exchange exchange = new DefaultExchange(camelContext);
 
         exchange.getMessage().setHeader("CamelAwsS3Key", "test.txt");
@@ -54,5 +54,25 @@ class RenameHeadersTest {
         Assertions.assertTrue(exchange.getMessage().getHeaders().containsKey("aws.s3.bucket.name"));
         Assertions.assertTrue(exchange.getMessage().getHeaders().containsKey("my-header"));
     }
+    
+    @Test
+    void shouldDuplicateSelectedHeaders() throws Exception {
+        Exchange exchange = new DefaultExchange(camelContext);
+
+        exchange.getMessage().setHeader("CamelAwsS3Key", "test.txt");
+        exchange.getMessage().setHeader("CamelAwsS3BucketName", "kamelets-demo");
+        exchange.getMessage().setHeader("my-header", "header");
+
+        processor = new DuplicateNamingHeaders();
+        processor.setPrefix("CamelAwsS3");
+        processor.setRenamingPrefix("aws.s3.");
+        processor.setMode("filtering");
+        processor.setSelectedHeaders("CamelAwsS3Key,CamelAwsS3BucketName");
+        processor.process(exchange);
+
+        Assertions.assertTrue(exchange.getMessage().getHeaders().containsKey("aws.s3.key"));
+        Assertions.assertTrue(exchange.getMessage().getHeaders().containsKey("aws.s3.bucket.name"));
+        Assertions.assertTrue(exchange.getMessage().getHeaders().containsKey("my-header"));
+    }
 
 }