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

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


The following commit(s) were added to refs/heads/main by this push:
     new e17f4a74de7d CAMEL-23686: Avoid creating empty headers map on read 
access
e17f4a74de7d is described below

commit e17f4a74de7d607cf957f8161a049c650aa4a548
Author: Guillaume Nodet <[email protected]>
AuthorDate: Fri Jun 5 18:16:59 2026 +0200

    CAMEL-23686: Avoid creating empty headers map on read access
    
    getHeader(), removeHeader(), and removeHeaders() were forcing creation
    of a CaseInsensitiveMap (allocating 4 arrays) just to return null when
    no headers had been set. Now short-circuits when headers is null and
    isPopulateHeadersSupported() is false (DefaultMessage). JMS-style
    messages with lazy header population are preserved.
    
    Co-authored-by: Claude Opus 4.6 <[email protected]>
---
 .../org/apache/camel/support/DefaultMessage.java   | 81 ++++++----------------
 1 file changed, 22 insertions(+), 59 deletions(-)

diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java 
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java
index b7396c7964d3..9199539b7cf4 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java
@@ -64,70 +64,37 @@ public class DefaultMessage extends MessageSupport {
     @Override
     public Object getHeader(String name) {
         if (headers == null) {
-            // force creating headers (supports lazy population in subclasses 
like JmsMessage)
+            if (!isPopulateHeadersSupported()) {
+                return null;
+            }
             headers = createHeaders();
         }
-
-        if (!headers.isEmpty()) {
-            return headers.get(name);
-        } else {
-            return null;
-        }
+        return headers.get(name);
     }
 
     @Override
     public Object getHeader(String name, Object defaultValue) {
-        Object answer = null;
-
-        if (headers == null) {
-            // force creating headers
-            headers = createHeaders();
-        }
-
-        if (!headers.isEmpty()) {
-            answer = headers.get(name);
-        }
+        Object answer = getHeader(name);
         return answer != null ? answer : defaultValue;
     }
 
     @Override
     public Object getHeader(String name, Supplier<Object> 
defaultValueSupplier) {
-        Object answer = null;
-
-        if (headers == null) {
-            // force creating headers
-            headers = createHeaders();
-        }
-
-        if (!headers.isEmpty()) {
-            answer = headers.get(name);
-        }
+        Object answer = getHeader(name);
         return answer != null ? answer : defaultValueSupplier.get();
     }
 
     @Override
     @SuppressWarnings("unchecked")
     public <T> T getHeader(String name, Class<T> type) {
-        Object value = null;
-
-        if (headers == null) {
-            // force creating headers
-            headers = createHeaders();
-        }
-
-        if (!headers.isEmpty()) {
-            value = headers.get(name);
-        }
+        Object value = getHeader(name);
         if (value == null) {
-            // lets avoid NullPointerException when converting to boolean for 
null values
             if (boolean.class == type) {
                 return (T) Boolean.FALSE;
             }
             return null;
         }
 
-        // eager same instance type test to avoid the overhead of invoking the 
type converter
-        // if already same type
         if (type.isInstance(value)) {
             return (T) value;
         }
@@ -143,29 +110,17 @@ public class DefaultMessage extends MessageSupport {
     @Override
     @SuppressWarnings("unchecked")
     public <T> T getHeader(String name, Object defaultValue, Class<T> type) {
-        Object value = null;
-
-        if (headers == null) {
-            // force creating headers
-            headers = createHeaders();
-        }
-
-        if (!headers.isEmpty()) {
-            value = headers.get(name);
-        }
+        Object value = getHeader(name);
         if (value == null) {
             value = defaultValue;
         }
         if (value == null) {
-            // lets avoid NullPointerException when converting to boolean for 
null values
             if (boolean.class == type) {
                 return (T) Boolean.FALSE;
             }
             return null;
         }
 
-        // eager same instance type test to avoid the overhead of invoking the 
type converter
-        // if already same type
         if (type.isInstance(value)) {
             return (T) value;
         }
@@ -211,11 +166,13 @@ public class DefaultMessage extends MessageSupport {
 
     @Override
     public Object removeHeader(String name) {
-        Map<String, Object> h = getHeaders();
-        if (h.isEmpty()) {
-            return null;
+        if (headers == null) {
+            if (!isPopulateHeadersSupported()) {
+                return null;
+            }
+            headers = createHeaders();
         }
-        return h.remove(name);
+        return headers.remove(name);
     }
 
     @Override
@@ -225,10 +182,16 @@ public class DefaultMessage extends MessageSupport {
 
     @Override
     public boolean removeHeaders(String pattern, String... excludePatterns) {
-        Map<String, Object> h = getHeaders();
-        if (h.isEmpty()) {
+        if (headers == null) {
+            if (!isPopulateHeadersSupported()) {
+                return false;
+            }
+            headers = createHeaders();
+        }
+        if (headers.isEmpty()) {
             return false;
         }
+        Map<String, Object> h = headers;
 
         // special optimized
         if (excludePatterns == null && "*".equals(pattern)) {

Reply via email to