CAMEL-11149: SPI - Allow to plugin different headers map implementation

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/28efd0d5
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/28efd0d5
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/28efd0d5

Branch: refs/heads/master
Commit: 28efd0d57e7d9e1b9cbb5d830c9872d537ce905b
Parents: 5b22da6
Author: Claus Ibsen <davscl...@apache.org>
Authored: Wed May 24 17:07:06 2017 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Thu May 25 11:09:52 2017 +0200

----------------------------------------------------------------------
 .../component/file/GenericFileMessage.java      | 20 ++++-
 .../org/apache/camel/impl/DefaultExchange.java  |  1 +
 .../org/apache/camel/impl/DefaultMessage.java   | 28 +++++--
 .../org/apache/camel/impl/MessageSupport.java   | 33 +++++++-
 .../component/file/GenericFileMessageTest.java  | 11 ++-
 .../camel/component/rest/RestProducerTest.java  | 12 ++-
 .../impl/CustomHeadersMapFactoryRouteTest.java  | 83 ++++++++++++++++++++
 .../camel/impl/DefaultMessageHeaderTest.java    | 33 ++++----
 .../apache/camel/impl/MessageSupportTest.java   |  4 +-
 .../BeanProcessorSpecializedMessageTest.java    |  9 ++-
 .../camel/processor/SetBodyProcessorTest.java   |  9 ++-
 .../camel/processor/SplitterPojoTest.java       |  5 +-
 .../org/apache/camel/util/GZIPHelperTest.java   |  3 +-
 .../org/apache/camel/util/IOHelperTest.java     |  3 +-
 .../apache/camel/util/MessageHelperTest.java    |  7 +-
 .../ApiMethodPropertiesHelperTest.java          |  8 +-
 .../xml/AbstractCamelContextFactoryBean.java    |  6 ++
 17 files changed, 229 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/main/java/org/apache/camel/component/file/GenericFileMessage.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileMessage.java
 
b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileMessage.java
index 703c832..71c6d6b 100644
--- 
a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileMessage.java
+++ 
b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileMessage.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.file;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.Message;
 import org.apache.camel.impl.DefaultMessage;
 
@@ -25,13 +26,30 @@ import org.apache.camel.impl.DefaultMessage;
 public class GenericFileMessage<T> extends DefaultMessage {
     private GenericFile<T> file;
 
+    /**
+     * @deprecated use {@link #GenericFileMessage(CamelContext)}
+     */
+    @Deprecated
     public GenericFileMessage() {
     }
 
+    public GenericFileMessage(CamelContext camelContext) {
+        super(camelContext);
+    }
+
+    /**
+     * @deprecated use {@link #GenericFileMessage(CamelContext, GenericFile)}
+     */
+    @Deprecated
     public GenericFileMessage(GenericFile<T> file) {
         this.file = file;
     }
 
+    public GenericFileMessage(CamelContext camelContext, GenericFile<T> file) {
+        super(camelContext);
+        this.file = file;
+    }
+
     @Override
     protected Object createBody() {
         return file != null ? file.getBody() : super.createBody();
@@ -47,7 +65,7 @@ public class GenericFileMessage<T> extends DefaultMessage {
 
     @Override
     public GenericFileMessage<T> newInstance() {
-        return new GenericFileMessage<T>();
+        return new GenericFileMessage<T>(getCamelContext());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java 
b/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
index 0ee5e8f..b8e7a9d 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
@@ -503,6 +503,7 @@ public final class DefaultExchange implements Exchange {
         if (message instanceof MessageSupport) {
             MessageSupport messageSupport = (MessageSupport)message;
             messageSupport.setExchange(this);
+            messageSupport.setCamelContext(getContext());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java 
b/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
index d6f44f4..7adb123 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
@@ -28,7 +28,6 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.spi.HeadersMapFactory;
 import org.apache.camel.util.AttachmentMap;
-import org.apache.camel.util.CaseInsensitiveMap;
 import org.apache.camel.util.EndpointHelper;
 import org.apache.camel.util.ObjectHelper;
 
@@ -50,6 +49,17 @@ public class DefaultMessage extends MessageSupport {
     private Map<String, DataHandler> attachments;
     private Map<String, Attachment> attachmentObjects;
 
+    /**
+     * @deprecated use {@link #DefaultMessage(CamelContext)}
+     */
+    @Deprecated
+    public DefaultMessage() {
+    }
+
+    public DefaultMessage(CamelContext camelContext) {
+        setCamelContext(camelContext);
+    }
+
     public boolean isFault() {
         return fault;
     }
@@ -208,11 +218,13 @@ public class DefaultMessage extends MessageSupport {
     }
 
     public void setHeaders(Map<String, Object> headers) {
-        if 
(getExchange().getContext().getHeadersMapFactory().isInstanceOf(headers)) {
+        ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
+
+        if (getCamelContext().getHeadersMapFactory().isInstanceOf(headers)) {
             this.headers = headers;
         } else {
             // create a new map
-            this.headers = 
getExchange().getContext().getHeadersMapFactory().fromMap(headers);
+            this.headers = 
getCamelContext().getHeadersMapFactory().fromMap(headers);
         }
     }
 
@@ -225,7 +237,11 @@ public class DefaultMessage extends MessageSupport {
     }
 
     public DefaultMessage newInstance() {
-        return new DefaultMessage();
+        ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
+
+        DefaultMessage answer = new DefaultMessage();
+        answer.setCamelContext(getCamelContext());
+        return answer;
     }
 
     /**
@@ -237,7 +253,9 @@ public class DefaultMessage extends MessageSupport {
      *         the underlying inbound transport
      */
     protected Map<String, Object> createHeaders() {
-        Map<String, Object> map = 
getExchange().getContext().getHeadersMapFactory().newMap();
+        ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
+
+        Map<String, Object> map = 
getCamelContext().getHeadersMapFactory().newMap();
         populateInitialHeaders(map);
         return map;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/main/java/org/apache/camel/impl/MessageSupport.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/MessageSupport.java 
b/camel-core/src/main/java/org/apache/camel/impl/MessageSupport.java
index d02fbae..6b7c774 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/MessageSupport.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/MessageSupport.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.impl;
 
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
 import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.Message;
@@ -33,7 +35,8 @@ import org.apache.camel.spi.DataTypeAware;
  *
  * @version 
  */
-public abstract class MessageSupport implements Message, DataTypeAware {
+public abstract class MessageSupport implements Message, CamelContextAware, 
DataTypeAware {
+    private CamelContext camelContext;
     private Exchange exchange;
     private Object body;
     private String messageId;
@@ -150,6 +153,10 @@ public abstract class MessageSupport implements Message, 
DataTypeAware {
 
     public Message copy() {
         Message answer = newInstance();
+        // must copy over CamelContext
+        if (answer instanceof CamelContextAware) {
+            ((CamelContextAware) answer).setCamelContext(getCamelContext());
+        }
         answer.copyFrom(this);
         return answer;
     }
@@ -159,10 +166,16 @@ public abstract class MessageSupport implements Message, 
DataTypeAware {
             // the same instance so do not need to copy
             return;
         }
-        copyFromWithNewBody(that, that.getBody());
+
+        // must copy over CamelContext
+        if (that instanceof CamelContextAware) {
+            setCamelContext(((CamelContextAware) that).getCamelContext());
+        }
         if (that instanceof DataTypeAware) {
             setDataType(((DataTypeAware)that).getDataType());
         }
+
+        copyFromWithNewBody(that, that.getBody());
     }
 
     public void copyFromWithNewBody(Message that, Object newBody) {
@@ -171,6 +184,12 @@ public abstract class MessageSupport implements Message, 
DataTypeAware {
             return;
         }
 
+        // must copy over CamelContext
+        if (that instanceof CamelContextAware) {
+            setCamelContext(((CamelContextAware) that).getCamelContext());
+        }
+        // should likely not set DataType as the new body may be a different 
type than the original body
+
         setMessageId(that.getMessageId());
         setBody(newBody);
         setFault(that.isFault());
@@ -202,7 +221,15 @@ public abstract class MessageSupport implements Message, 
DataTypeAware {
     public void setExchange(Exchange exchange) {
         this.exchange = exchange;
     }
-    
+
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
     public void copyAttachments(Message that) {
         // the attachments may be the same instance if the end user has made 
some mistake
         // and set the OUT message with the same attachment instance of the IN 
message etc

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/component/file/GenericFileMessageTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/file/GenericFileMessageTest.java
 
b/camel-core/src/test/java/org/apache/camel/component/file/GenericFileMessageTest.java
index 6108029..37dcc79 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/file/GenericFileMessageTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/file/GenericFileMessageTest.java
@@ -18,22 +18,25 @@ package org.apache.camel.component.file;
 
 import java.io.File;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.util.FileUtil;
 
 public class GenericFileMessageTest extends ContextTestSupport {
 
+    private CamelContext camelContext = new DefaultCamelContext();
+
     public void testGenericMessageToStringConversion() throws Exception {
-        GenericFileMessage<File> message = new GenericFileMessage<File>(); 
+        GenericFileMessage<File> message = new 
GenericFileMessage<File>(camelContext);
         assertStringContains(message.toString(), 
"org.apache.camel.component.file.GenericFileMessage@");
         
         GenericFile<File> file = new GenericFile<File>(true);
         file.setFileName("target/test.txt");
         file.setFile(new File("target/test.txt"));
-        message = new GenericFileMessage<File>(file); 
+        message = new GenericFileMessage<File>(camelContext, file);
         assertEquals(FileUtil.isWindows() ? "target\\test.txt" : 
"target/test.txt", message.toString());
-        
     }
     
     public void testGenericFileContentType() throws Exception {
@@ -41,7 +44,7 @@ public class GenericFileMessageTest extends 
ContextTestSupport {
         file.setEndpointPath("target");
         file.setFileName("target");
         file.setFile(new File("target/camel-core-test.log"));
-        GenericFileMessage<File> message = new GenericFileMessage<File>(file);
+        GenericFileMessage<File> message = new 
GenericFileMessage<File>(camelContext, file);
         file.populateHeaders(message);
         assertEquals("Get a wrong file content type", "txt", 
message.getHeader(Exchange.FILE_CONTENT_TYPE));
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/component/rest/RestProducerTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/component/rest/RestProducerTest.java
 
b/camel-core/src/test/java/org/apache/camel/component/rest/RestProducerTest.java
index 2ca0981..0145e2b 100644
--- 
a/camel-core/src/test/java/org/apache/camel/component/rest/RestProducerTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/component/rest/RestProducerTest.java
@@ -19,6 +19,8 @@ package org.apache.camel.component.rest;
 import java.io.UnsupportedEncodingException;
 import java.net.URISyntaxException;
 
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.DefaultMessage;
 import org.junit.Test;
 
@@ -27,6 +29,8 @@ import static org.junit.Assert.assertNull;
 
 public class RestProducerTest {
 
+    private CamelContext camelContext = new DefaultCamelContext();
+
     @Test
     public void shouldCreateDefinedQueryParameters() throws 
UnsupportedEncodingException, URISyntaxException {
         assertEquals("param=value", 
RestProducer.createQueryParameters("param=value", null));
@@ -35,7 +39,7 @@ public class RestProducerTest {
     @Test
     public void 
shouldCreateOptionalPlaceholderQueryParametersForPresentValues()
         throws UnsupportedEncodingException, URISyntaxException {
-        final DefaultMessage message = new DefaultMessage();
+        final DefaultMessage message = new DefaultMessage(camelContext);
         message.setHeader("param", "header");
 
         assertEquals("param=header", 
RestProducer.createQueryParameters("param={param?}", message));
@@ -43,7 +47,7 @@ public class RestProducerTest {
 
     @Test
     public void shouldCreatePlaceholderQueryParameters() throws 
UnsupportedEncodingException, URISyntaxException {
-        final DefaultMessage message = new DefaultMessage();
+        final DefaultMessage message = new DefaultMessage(camelContext);
         message.setHeader("param", "header");
 
         assertEquals("param=header", 
RestProducer.createQueryParameters("param={param}", message));
@@ -57,14 +61,14 @@ public class RestProducerTest {
     @Test
     public void 
shouldNotCreateOptionalPlaceholderQueryParametersForMissingValues()
         throws UnsupportedEncodingException, URISyntaxException {
-        final DefaultMessage message = new DefaultMessage();
+        final DefaultMessage message = new DefaultMessage(camelContext);
 
         assertEquals("", RestProducer.createQueryParameters("param={param?}", 
message));
     }
 
     @Test
     public void shouldSupportAllCombinations() throws 
UnsupportedEncodingException, URISyntaxException {
-        final DefaultMessage message = new DefaultMessage();
+        final DefaultMessage message = new DefaultMessage(camelContext);
         message.setHeader("required", "header_required");
         message.setHeader("optional_present", "header_optional_present");
 

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/impl/CustomHeadersMapFactoryRouteTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/impl/CustomHeadersMapFactoryRouteTest.java
 
b/camel-core/src/test/java/org/apache/camel/impl/CustomHeadersMapFactoryRouteTest.java
new file mode 100644
index 0000000..9c2faec
--- /dev/null
+++ 
b/camel-core/src/test/java/org/apache/camel/impl/CustomHeadersMapFactoryRouteTest.java
@@ -0,0 +1,83 @@
+/**
+ * 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.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.spi.HeadersMapFactory;
+
+public class CustomHeadersMapFactoryRouteTest extends ContextTestSupport {
+
+    private HeadersMapFactory custom = new CustomHeadersMapFactory();
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.setHeadersMapFactory(custom);
+        return context;
+    }
+
+    public void testCustomHeaders() throws Exception {
+        getMockEndpoint("mock:result").expectedHeaderReceived("foo", 123);
+        getMockEndpoint("mock:result").expectedHeaderReceived("FOO", 456);
+        getMockEndpoint("mock:result").expectedHeaderReceived("Bar", "yes");
+
+        Map<String, Object> headers = new HashMap<>();
+        headers.put("foo", 123);
+        headers.put("FOO", 456);
+        headers.put("Bar", "yes");
+
+        template.sendBodyAndHeaders("direct:start", "Hello World", headers);
+
+        assertMockEndpointsSatisfied();
+
+        assertSame(custom, context.getHeadersMapFactory());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("mock:result");
+            }
+        };
+    }
+
+    private static class CustomHeadersMapFactory implements HeadersMapFactory {
+
+        @Override
+        public Map<String, Object> newMap() {
+            return new HashMap<>();
+        }
+
+        @Override
+        public Map<String, Object> fromMap(Map<String, Object> map) {
+            return new HashMap<>(map);
+        }
+
+        @Override
+        public boolean isInstanceOf(Map<String, Object> map) {
+            return map instanceof HashMap;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/impl/DefaultMessageHeaderTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/impl/DefaultMessageHeaderTest.java 
b/camel-core/src/test/java/org/apache/camel/impl/DefaultMessageHeaderTest.java
index ff66227..0cc5fb3 100644
--- 
a/camel-core/src/test/java/org/apache/camel/impl/DefaultMessageHeaderTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/impl/DefaultMessageHeaderTest.java
@@ -17,15 +17,18 @@
 package org.apache.camel.impl;
 
 import junit.framework.TestCase;
+import org.apache.camel.CamelContext;
 import org.apache.camel.Message;
 
 /**
  * @version 
  */
 public class DefaultMessageHeaderTest extends TestCase {
+    
+    private CamelContext camelContext = new DefaultCamelContext();
 
     public void testLookupCaseAgnostic() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("foo", "cheese");
@@ -36,7 +39,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testLookupCaseAgnosticAddHeader() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("foo", "cheese");
@@ -55,7 +58,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testLookupCaseAgnosticAddHeader2() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("foo", "cheese");
@@ -74,7 +77,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testLookupCaseAgnosticAddHeaderRemoveHeader() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("foo", "cheese");
@@ -97,7 +100,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testSetWithDifferentCase() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("foo", "cheese");
@@ -109,7 +112,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testRemoveWithDifferentCase() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("foo", "cheese");
@@ -129,7 +132,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testRemoveHeaderWithNullValue() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("tick", null);
@@ -139,7 +142,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testRemoveHeadersWithWildcard() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("tick", "bla");
@@ -156,7 +159,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testRemoveHeadersAllWithWildcard() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("tick", "bla");
@@ -173,7 +176,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testRemoveHeadersWithExclude() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("tick", "bla");
@@ -189,7 +192,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testRemoveHeadersAllWithExclude() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("tick", "bla");
@@ -209,7 +212,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testRemoveHeadersWithWildcardInExclude() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("tick", "bla");
@@ -225,7 +228,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testRemoveHeadersWithNulls() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("tick", "bla");
@@ -244,7 +247,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testRemoveHeadersWithNonExcludeHeaders() {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(camelContext);
         assertNull(msg.getHeader("foo"));
 
         msg.setHeader("tick", "bla");
@@ -257,7 +260,7 @@ public class DefaultMessageHeaderTest extends TestCase {
     }
 
     public void testWithDefaults() {
-        DefaultMessage msg = new DefaultMessage();
+        DefaultMessage msg = new DefaultMessage(camelContext);
         // must have exchange so to leverage the type converters
         msg.setExchange(new DefaultExchange(new DefaultCamelContext()));
 

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/impl/MessageSupportTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/impl/MessageSupportTest.java 
b/camel-core/src/test/java/org/apache/camel/impl/MessageSupportTest.java
index 910f95d..be97658 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/MessageSupportTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/MessageSupportTest.java
@@ -61,7 +61,7 @@ public class MessageSupportTest extends ContextTestSupport {
     }
     
     public void testGetMessageIdWithoutAnExchange() {
-        Message in = new DefaultMessage();
+        Message in = new DefaultMessage(context);
         
         assertNotNull(in.getMessageId());
     }
@@ -73,7 +73,7 @@ public class MessageSupportTest extends ContextTestSupport {
         Map<String, Object> headers = in.getHeaders();
         headers.put("foo", 123);
 
-        Message out = new DefaultMessage();
+        Message out = new DefaultMessage(context);
         out.setBody("Bye World");
         out.setHeaders(headers);
 

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/processor/BeanProcessorSpecializedMessageTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/processor/BeanProcessorSpecializedMessageTest.java
 
b/camel-core/src/test/java/org/apache/camel/processor/BeanProcessorSpecializedMessageTest.java
index 6e86328..93a9f3c 100644
--- 
a/camel-core/src/test/java/org/apache/camel/processor/BeanProcessorSpecializedMessageTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/processor/BeanProcessorSpecializedMessageTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.processor;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.Predicate;
@@ -52,7 +53,7 @@ public class BeanProcessorSpecializedMessageTest extends 
ContextTestSupport {
 
         template.send("direct:start", new Processor() {
             public void process(Exchange exchange) throws Exception {
-                MyMessage my = new MyMessage();
+                MyMessage my = new MyMessage(exchange.getContext());
                 my.setBody("Hello World");
                 my.setHeader("foo", 123);
                 exchange.setIn(my);
@@ -77,9 +78,13 @@ public class BeanProcessorSpecializedMessageTest extends 
ContextTestSupport {
 
     public static class MyMessage extends DefaultMessage {
 
+        public MyMessage(CamelContext camelContext) {
+            super(camelContext);
+        }
+
         @Override
         public MyMessage newInstance() {
-            return new MyMessage();
+            return new MyMessage(getCamelContext());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/processor/SetBodyProcessorTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/processor/SetBodyProcessorTest.java 
b/camel-core/src/test/java/org/apache/camel/processor/SetBodyProcessorTest.java
index 0e311e5..93a7f6a 100644
--- 
a/camel-core/src/test/java/org/apache/camel/processor/SetBodyProcessorTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/processor/SetBodyProcessorTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.processor;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.Predicate;
@@ -52,7 +53,7 @@ public class SetBodyProcessorTest extends ContextTestSupport {
 
         template.send("direct:start", new Processor() {
             public void process(Exchange exchange) throws Exception {
-                MyMessage my = new MyMessage();
+                MyMessage my = new MyMessage(exchange.getContext());
                 my.setBody("World");
                 my.setHeader("foo", 123);
                 exchange.setIn(my);
@@ -89,9 +90,13 @@ public class SetBodyProcessorTest extends ContextTestSupport 
{
 
     private static class MyMessage extends DefaultMessage {
 
+        public MyMessage(CamelContext camelContext) {
+            super(camelContext);
+        }
+
         @Override
         public MyMessage newInstance() {
-            return new MyMessage();
+            return new MyMessage(getCamelContext());
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/processor/SplitterPojoTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/processor/SplitterPojoTest.java 
b/camel-core/src/test/java/org/apache/camel/processor/SplitterPojoTest.java
index 70197df..2733c0e 100644
--- a/camel-core/src/test/java/org/apache/camel/processor/SplitterPojoTest.java
+++ b/camel-core/src/test/java/org/apache/camel/processor/SplitterPojoTest.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.camel.Body;
+import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.Header;
@@ -115,7 +116,7 @@ public class SplitterPojoTest extends ContextTestSupport {
          * @param body the payload of the incoming message
          * @return a list containing each part splitted
          */
-        public List<Message> splitMessage(@Header(value = "user") String 
header, @Body String body) {
+        public List<Message> splitMessage(@Header(value = "user") String 
header, @Body String body, CamelContext camelContext) {
             // we can leverage the Parameter Binding Annotations  
             // http://camel.apache.org/parameter-binding-annotations.html
             // to access the message header and body at same time, 
@@ -125,7 +126,7 @@ public class SplitterPojoTest extends ContextTestSupport {
             List<Message> answer = new ArrayList<Message>();
             String[] parts = header.split(",");
             for (String part : parts) {
-                DefaultMessage message = new DefaultMessage();
+                DefaultMessage message = new DefaultMessage(camelContext);
                 message.setHeader("user", part);
                 message.setBody(body);
                 answer.add(message);

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/util/GZIPHelperTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/util/GZIPHelperTest.java 
b/camel-core/src/test/java/org/apache/camel/util/GZIPHelperTest.java
index f4c90c4..f2894ed 100644
--- a/camel-core/src/test/java/org/apache/camel/util/GZIPHelperTest.java
+++ b/camel-core/src/test/java/org/apache/camel/util/GZIPHelperTest.java
@@ -22,6 +22,7 @@ import java.io.InputStream;
 
 import org.apache.camel.Message;
 import org.apache.camel.converter.IOConverter;
+import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.DefaultMessage;
 import org.junit.Test;
 
@@ -83,7 +84,7 @@ public class GZIPHelperTest {
     }
 
     private Message createMessageWithContentEncodingHeader(String 
contentEncoding) {
-        Message msg = new DefaultMessage();
+        Message msg = new DefaultMessage(new DefaultCamelContext());
         msg.setHeader("Content-Encoding", contentEncoding);
 
         return msg;

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/util/IOHelperTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/util/IOHelperTest.java 
b/camel-core/src/test/java/org/apache/camel/util/IOHelperTest.java
index da2aecf..037c323 100644
--- a/camel-core/src/test/java/org/apache/camel/util/IOHelperTest.java
+++ b/camel-core/src/test/java/org/apache/camel/util/IOHelperTest.java
@@ -28,6 +28,7 @@ import java.io.PrintWriter;
 import junit.framework.TestCase;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.DefaultExchange;
 
 /**
@@ -104,7 +105,7 @@ public class IOHelperTest extends TestCase {
     }
 
     public void testCharsetName() throws Exception {
-        Exchange exchange = new DefaultExchange((CamelContext) null);
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext());
 
         assertNull(IOHelper.getCharsetName(exchange, false));
 

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java 
b/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java
index f85ea83..c0c467c 100644
--- a/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java
+++ b/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java
@@ -39,10 +39,11 @@ import org.apache.camel.impl.DefaultMessage;
 public class MessageHelperTest extends TestCase {
     
     private Message message;
+    private CamelContext camelContext = new DefaultCamelContext();
     
     @Override
     protected void setUp() throws Exception {
-        message = new DefaultMessage();
+        message = new DefaultMessage(camelContext);
     }
 
     /*
@@ -94,7 +95,7 @@ public class MessageHelperTest extends TestCase {
 
     public void testCopyHeaders() throws Exception {
         Message source = message;
-        Message target = new DefaultMessage();
+        Message target = new DefaultMessage(camelContext);
 
         source.setHeader("foo", 123);
         source.setHeader("bar", 456);
@@ -108,7 +109,7 @@ public class MessageHelperTest extends TestCase {
 
     public void testCopyHeadersOverride() throws Exception {
         Message source = message;
-        Message target = new DefaultMessage();
+        Message target = new DefaultMessage(camelContext);
 
         source.setHeader("foo", 123);
         source.setHeader("bar", 456);

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/camel-core/src/test/java/org/apache/camel/util/component/ApiMethodPropertiesHelperTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/util/component/ApiMethodPropertiesHelperTest.java
 
b/camel-core/src/test/java/org/apache/camel/util/component/ApiMethodPropertiesHelperTest.java
index f13f8a5..65cc5ae 100644
--- 
a/camel-core/src/test/java/org/apache/camel/util/component/ApiMethodPropertiesHelperTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/util/component/ApiMethodPropertiesHelperTest.java
@@ -18,7 +18,9 @@ package org.apache.camel.util.component;
 
 import java.util.HashMap;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.DefaultExchange;
 import org.junit.Test;
 import static org.junit.Assert.assertEquals;
@@ -45,8 +47,12 @@ public class ApiMethodPropertiesHelperTest {
 
     @Test
     public void testGetExchangeProperties() throws Exception {
+        final CamelContext camelContext = new DefaultCamelContext();
+        MockEndpoint mock = new MockEndpoint();
+        mock.setCamelContext(camelContext);
+
         final HashMap<String, Object> properties = new HashMap<String, 
Object>();
-        final DefaultExchange exchange = new DefaultExchange(new 
MockEndpoint());
+        final DefaultExchange exchange = new DefaultExchange(mock);
         exchange.getIn().setHeader(PROPERTY_1, VALUE_1);
         exchange.getIn().setHeader(PROPERTY_2, VALUE_2);
         exchange.getIn().setHeader(PROPERTY_3, VALUE_3);

http://git-wip-us.apache.org/repos/asf/camel/blob/28efd0d5/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
----------------------------------------------------------------------
diff --git 
a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
 
b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index f7a8b74..32f53f8 100644
--- 
a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ 
b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -88,6 +88,7 @@ import org.apache.camel.spi.EventFactory;
 import org.apache.camel.spi.EventNotifier;
 import org.apache.camel.spi.ExecutorServiceManager;
 import org.apache.camel.spi.FactoryFinderResolver;
+import org.apache.camel.spi.HeadersMapFactory;
 import org.apache.camel.spi.InflightRepository;
 import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.spi.LifecycleStrategy;
@@ -256,6 +257,11 @@ public abstract class AbstractCamelContextFactoryBean<T 
extends ModelCamelContex
             LOG.info("Using custom RuntimeEndpointRegistry: {}", 
runtimeEndpointRegistry);
             getContext().setRuntimeEndpointRegistry(runtimeEndpointRegistry);
         }
+        HeadersMapFactory headersMapFactory = 
getBeanForType(HeadersMapFactory.class);
+        if (headersMapFactory != null) {
+            LOG.info("Using custom HeadersMapFactory: {}", headersMapFactory);
+            getContext().setHeadersMapFactory(headersMapFactory);
+        }
         // custom type converters defined as <bean>s
         Map<String, TypeConverters> typeConverters = 
getContext().getRegistry().findByTypeWithName(TypeConverters.class);
         if (typeConverters != null && !typeConverters.isEmpty()) {

Reply via email to