You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by js...@apache.org on 2007/03/20 17:13:55 UTC

svn commit: r520457 - in /activemq/camel/trunk: camel-core/src/main/java/org/apache/camel/ camel-core/src/main/java/org/apache/camel/builder/ camel-core/src/main/java/org/apache/camel/impl/ camel-core/src/main/java/org/apache/camel/pojo/ camel-core/src...

Author: jstrachan
Date: Tue Mar 20 09:13:51 2007
New Revision: 520457

URL: http://svn.apache.org/viewvc?view=rev&rev=520457
Log:
added a Message and Headers interface to the Exchange making it easy to process messages in a generic way, in addition to using a custom Exchange type to access the underlying transport information

Added:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Headers.java   (with props)
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultHeaders.java   (with props)
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java   (with props)
    activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsMessage.java   (with props)
    activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsHeaders.java   (with props)
    activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsMessage.java   (with props)
Removed:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Expressions.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Message.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/pojo/PojoEndpoint.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/pojo/PojoExchange.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RecipientList.java
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/RouteBuilderTest.java
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/queue/QueueRouteTest.java
    activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsExchange.java
    activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsExchange.java
    activemq/camel/trunk/camel-jms/src/test/java/org/apache/camel/jms/JmsRouteTest.java

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java Tue Mar 20 09:13:51 2007
@@ -19,14 +19,11 @@
 import java.util.Map;
 
 /**
- * Represents the base interface of an exchange
+ * Represents the base exchange interface providing access to the request, response and fault {@link Message} instances.
  *
  * @version $Revision$
- * @param <M> message or payload type
- * @param <R> message or payload type for a response (for request/response exchange)
- * @param <F> fault type
  */
-public interface Exchange<M,R,F> {
+public interface Exchange  {
     
     /**
      * Returns the exchange id
@@ -41,60 +38,45 @@
     void setExchangeId(String id);
 
     /**
-     * Accesses a specific header
-     * @param name 
-     * @return object header associated with the name
+     * Returns the exchange headers
      */
-    Object getHeader(String name);
+    Headers getHeaders();
 
     /**
-     * Sets a header on the exchange
-     * @param name of the header 
-     * @param value to associate with the name
-     */
-    void setHeader(String name, Object value);
-
-    /**
-     * Returns all of the headers associated with the request
-     * @return all the headers in a Map
-     */
-    Map<String,Object> getHeaders();
-
-    /**
-     * Returns the request message
+     * Returns the inbound request message
      * @return the message
      */
-    M getRequest();
+    Message getIn();
 
     /**
-     * Returns the response message
+     * Returns the aresponse message
      * @return the response
      */
-    R getResponse();
+    Message getOut();
 
     /**
      * Returns the fault message
      * @return the fault
      */
-    F getFault();
+    Message getFault();
 
     /**
      * Returns the exception associated with this exchange
      * @return the exception (or null if no faults)
      */
-    Exception getException();
+    Throwable getException();
 
     /**
      * Sets the exception associated with this exchange
-     * @param e 
+     * @param e
      */
-    void setException(Exception e);
+    void setException(Throwable e);
 
     /**
      * Returns the container so that a processor can resolve endpoints from URIs
      *
      * @return the container which owns this exchange
      */
-    CamelContext<Exchange> getContainer();
+    CamelContext<Exchange> getContext();
 
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Expressions.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Expressions.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Expressions.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Expressions.java Tue Mar 20 09:13:51 2007
@@ -30,7 +30,12 @@
     public static <E extends Exchange> Expression<E> headerExpression(final String headerName) {
         return new Expression<E>() {
             public Object evaluate(E exchange) {
-                return exchange.getHeader(headerName);
+                Object header = exchange.getIn().getHeaders().getHeader(headerName);
+                if (header == null) {
+                    // lets try the exchange header
+                    header = exchange.getHeaders().getHeader(headerName);
+                }
+                return header;
             }
 
             @Override

Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Headers.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Headers.java?view=auto&rev=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Headers.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Headers.java Tue Mar 20 09:13:51 2007
@@ -0,0 +1,51 @@
+/**
+ *
+ * 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;
+
+import java.util.Map;
+
+/**
+ * Represents the available headers on a message or message exchange.
+ *
+ * @version $Revision$
+ */
+public interface Headers {
+    
+    /**
+     * Accesses a specific header
+     *
+     * @param name
+     * @return object header associated with the name
+     */
+    Object getHeader(String name);
+
+    /**
+     * Sets a header on the exchange
+     *
+     * @param name  of the header
+     * @param value to associate with the name
+     */
+    void setHeader(String name, Object value);
+
+    /**
+     * Returns all of the headers associated with the request
+     *
+     * @return all the headers in a Map
+     */
+    Map<String, Object> getHeaders();
+}

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Headers.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Headers.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Headers.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Message.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Message.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Message.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Message.java Tue Mar 20 09:13:51 2007
@@ -27,6 +27,11 @@
 public interface Message {
 
     /**
+     * Access the headers on the message
+     */
+    public Headers getHeaders();
+
+    /**
      * Returns the body of the message as a POJO
      *
      * @returns the body of the message
@@ -51,26 +56,4 @@
      */
     public <T> void setBody(Object body, Class<T> type);
 
-    /**
-     * Accesses a specific header
-     *
-     * @param name
-     * @return object header associated with the name
-     */
-    Object getHeader(String name);
-
-    /**
-     * Sets a header on the exchange
-     *
-     * @param name  of the header
-     * @param value to associate with the name
-     */
-    void setHeader(String name, Object value);
-
-    /**
-     * Returns all of the headers associated with the request
-     *
-     * @return all the headers in a Map
-     */
-    Map<String, Object> getHeaders();
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java Tue Mar 20 09:13:51 2007
@@ -72,20 +72,6 @@
         return answer;
     }
 
-    // Helper methods
-    //-----------------------------------------------------------------------
-    public Predicate<E> headerEquals(final String header, final Object value) {
-        return new Predicate<E>() {
-            public boolean evaluate(E exchange) {
-                return ObjectHelper.equals(value, exchange.getHeader(header));
-            }
-
-            @Override
-            public String toString() {
-                return "header[" + header + "] == " + value;
-            }
-        };
-    }
 
     // Properties
     //-----------------------------------------------------------------------

Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultHeaders.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultHeaders.java?view=auto&rev=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultHeaders.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultHeaders.java Tue Mar 20 09:13:51 2007
@@ -0,0 +1,56 @@
+/**
+ *
+ * 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 org.apache.camel.Exchange;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Headers;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * A default implementation of {@link Headers}
+ *
+ * @version $Revision$
+ */
+public class DefaultHeaders implements Headers {
+    private Map<String, Object> headers;
+
+    public Object getHeader(String name) {
+        if (headers != null) {
+            return headers.get(name);
+        }
+        return null;
+    }
+
+    public void setHeader(String name, Object value) {
+        getHeaders().put(name, value);
+    }
+
+    public Map<String, Object> getHeaders() {
+        if (headers == null) {
+            headers = new HashMap<String, Object>();
+        }
+        return headers;
+    }
+
+    public void setHeaders(Map<String, Object> headers) {
+        this.headers = headers;
+    }
+}

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultHeaders.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultHeaders.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultHeaders.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java?view=auto&rev=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java Tue Mar 20 09:13:51 2007
@@ -0,0 +1,61 @@
+/**
+ *
+ * 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 org.apache.camel.Message;
+import org.apache.camel.Headers;
+
+/**
+ * @version $Revision$
+ */
+public class DefaultMessage implements Message {
+    private Headers headers;
+    private Object body;
+
+    public Object getBody() {
+        return body;
+    }
+
+    public void setBody(Object body) {
+        this.body = body;
+    }
+
+    @SuppressWarnings({"unchecked"})
+    public <T> T getBody(Class<T> type) {
+        return (T) getBody();
+    }
+
+    public <T> void setBody(Object body, Class<T> type) {
+        setBody(body);
+    }
+
+    public Headers getHeaders() {
+        if (headers == null) {
+            headers = createHeaders();
+        }
+        return headers;
+    }
+
+    public void setHeaders(Headers headers) {
+        this.headers = headers;
+    }
+
+    protected Headers createHeaders() {
+        return new DefaultHeaders();
+    }
+}

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/pojo/PojoEndpoint.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/pojo/PojoEndpoint.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/pojo/PojoEndpoint.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/pojo/PojoEndpoint.java Tue Mar 20 09:13:51 2007
@@ -45,12 +45,12 @@
 	 *  This causes us to invoke the endpoint Pojo using reflection.
 	 */
     public void onExchange(PojoExchange exchange) {
-        PojoInvocation invocation = exchange.getRequest();
+        PojoInvocation invocation = exchange.getInvocation();
         try {
 			Object response = invocation.getMethod().invoke(pojo, invocation.getArgs());
-			exchange.setResponse(response);
+			exchange.getOut().setBody(response);
 		} catch (InvocationTargetException e) {
-			exchange.setFault(e.getCause());
+			exchange.setException(e.getCause());
 		} catch ( RuntimeException e ) {
 			throw e;
 		} catch ( Throwable e ) {
@@ -88,13 +88,13 @@
 				if( !activated.get() ) {
 					PojoInvocation invocation = new PojoInvocation(proxy, method, args);
 					PojoExchange exchange = createExchange();
-					exchange.setRequest(invocation);
+					exchange.setInvocation(invocation);
 					endpoint.getInboundProcessor().onExchange(exchange);
-					Throwable fault = exchange.getFault();
+					Throwable fault = exchange.getException();
 					if ( fault != null ) {
 						throw new InvocationTargetException(fault);
 					}
-					return exchange.getResponse();
+					return exchange.getOut();
 				}
 				throw new IllegalStateException("The endpoint is not active: "+getEndpointUri());
 			}

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/pojo/PojoExchange.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/pojo/PojoExchange.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/pojo/PojoExchange.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/pojo/PojoExchange.java Tue Mar 20 09:13:51 2007
@@ -22,9 +22,18 @@
 /**
  * @version $Revision: 519901 $
  */
-public class PojoExchange extends DefaultExchange<PojoInvocation, Object, Throwable> {
+public class PojoExchange extends DefaultExchange {
+    private PojoInvocation invocation;
 
     public PojoExchange(CamelContext container) {
         super(container);
+    }
+
+    public PojoInvocation getInvocation() {
+        return getIn().getBody(PojoInvocation.class);
+    }
+
+    public void setInvocation(PojoInvocation invocation) {
+        getIn().setBody(invocation);
     }
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RecipientList.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RecipientList.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RecipientList.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RecipientList.java Tue Mar 20 09:13:51 2007
@@ -64,7 +64,7 @@
         }
         else {
             String uri = recipient.toString();
-            endpoint = exchange.getContainer().endpoint(uri);
+            endpoint = (Endpoint<E>) exchange.getContext().endpoint(uri);
             if (endpoint == null) {
                 throw new NoSuchEndpointException(uri);
             }

Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/RouteBuilderTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/RouteBuilderTest.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/RouteBuilderTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/RouteBuilderTest.java Tue Mar 20 09:13:51 2007
@@ -79,7 +79,7 @@
 		// START SNIPPET: e2
         RouteBuilder<Exchange> builder = new RouteBuilder<Exchange>() {
             public void configure() {
-                from("queue:a").filter(headerEquals("foo", "bar")).to("queue:b");
+                from("queue:a").filter(header("foo").isEqualTo("bar")).to("queue:b");
             }
         };
         // END SNIPPET: e2
@@ -112,8 +112,8 @@
         RouteBuilder<Exchange> builder = new RouteBuilder<Exchange>() {
             public void configure() {
                 from("queue:a").choice()
-                        .when(headerEquals("foo", "bar")).to("queue:b")
-                        .when(headerEquals("foo", "cheese")).to("queue:c")
+                        .when(header("foo").isEqualTo("bar")).to("queue:b")
+                        .when(header("foo").isEqualTo("cheese")).to("queue:c")
                         .otherwise().to("queue:d");
             }
         };
@@ -188,7 +188,7 @@
 		// START SNIPPET: e5
         RouteBuilder<Exchange> builder = new RouteBuilder<Exchange>() {
             public void configure() {
-                from("queue:a").filter(headerEquals("foo", "bar")).process(myProcessor);
+                from("queue:a").filter(header("foo").isEqualTo("bar")).process(myProcessor);
             }
         };
         // END SNIPPET: e5

Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/queue/QueueRouteTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/queue/QueueRouteTest.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/queue/QueueRouteTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/queue/QueueRouteTest.java Tue Mar 20 09:13:51 2007
@@ -25,19 +25,14 @@
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Processor;
+import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.impl.DefaultExchange;
 
 /**
  * @version $Revision: 520220 $
  */
 public class QueueRouteTest extends TestCase {
-	
-	static class StringExchange extends DefaultExchange<String, String, String> {
-        public StringExchange(CamelContext container) {
-            super(container);
-        }
-    }
+
 	
     public void testJmsRoute() throws Exception {
         final CountDownLatch latch = new CountDownLatch(1);
@@ -48,9 +43,9 @@
         container.routes(new RouteBuilder() {
             public void configure() {
                 from("queue:test.a").to("queue:test.b");
-                from("queue:test.b").process(new Processor<StringExchange>() {
-                    public void onExchange(StringExchange exchange) {
-                        System.out.println("Received exchange: " + exchange.getRequest());
+                from("queue:test.b").process(new Processor<Exchange>() {
+                    public void onExchange(Exchange e) {
+                        System.out.println("Received exchange: " + e.getIn());
                         latch.countDown();
                     }
                 });
@@ -61,9 +56,9 @@
         container.activateEndpoints();
         
         // now lets fire in a message
-        Endpoint<StringExchange> endpoint = container.endpoint("queue:test.a");
-        StringExchange exchange = new StringExchange(container);
-        exchange.setHeader("cheese", 123);
+        Endpoint<Exchange> endpoint = container.endpoint("queue:test.a");
+        Exchange exchange = endpoint.createExchange();
+        exchange.getIn().getHeaders().setHeader("cheese", 123);
         endpoint.onExchange(exchange);
 
         // now lets sleep for a while

Modified: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsExchange.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsExchange.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsExchange.java (original)
+++ activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsExchange.java Tue Mar 20 09:13:51 2007
@@ -18,7 +18,7 @@
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.InvalidHeaderTypeException;
-import org.apache.camel.impl.ExchangeSupport;
+import org.apache.camel.impl.DefaultExchange;
 
 import javax.jms.JMSException;
 import javax.jms.Message;
@@ -30,8 +30,7 @@
 /**
  * @version $Revision$
  */
-public class DefaultJmsExchange extends ExchangeSupport<Message, Message, Message> implements JmsExchange {
-    private Map<String, Object> lazyHeaders;
+public class DefaultJmsExchange extends DefaultExchange implements JmsExchange {
 
     public DefaultJmsExchange(CamelContext container) {
         super(container);
@@ -39,86 +38,41 @@
 
     public DefaultJmsExchange(CamelContext container, Message message) {
         super(container);
-        setRequest(message);
-    }
-
-    public Object getHeader(String name) {
-        Message request = getRequest();
-        if (request != null) {
-            try {
-                Object value = request.getObjectProperty(name);
-                try {
-                    return value;
-                }
-                catch (ClassCastException e) {
-                    throw new InvalidHeaderTypeException(e.getMessage(), value);
-                }
-            }
-            catch (JMSException e) {
-                throw new MessagePropertyAcessException(name, e);
-            }
-        }
-        return null;
-    }
-
-    public void setHeader(String name, Object value) {
-        Message request = getRequest();
-        if (request != null) {
-            try {
-                request.setObjectProperty(name, value);
-            }
-            catch (JMSException e) {
-                throw new MessagePropertyAcessException(name, e);
-            }
-        }
-        else {
-            if (lazyHeaders == null) {
-                lazyHeaders = new HashMap<String, Object>();
-            }
-            lazyHeaders.put(name, value);
-        }
-    }
-
-    public Map<String, Object> getHeaders() {
-        Message request = getRequest();
-        if (request != null) {
-            Map<String, Object> answer = new HashMap<String, Object>();
-            Enumeration names;
-            try {
-                names = request.getPropertyNames();
-            }
-            catch (JMSException e) {
-                throw new MessagePropertyNamesAcessException(e);
-            }
-            while (names.hasMoreElements()) {
-                String name = names.nextElement().toString();
-                try {
-                    Object value = request.getObjectProperty(name);
-                    answer.put(name, value);
-                }
-                catch (JMSException e) {
-                    throw new MessagePropertyAcessException(name, e);
-                }
-            }
-            return answer;
-        }
-        else {
-            return lazyHeaders;
-        }
+        setIn(new DefaultJmsMessage(message));
     }
 
     public Message createMessage(Session session) throws JMSException {
-        Message request = getRequest();
+        Message request = getInMessage();
         if (request == null) {
             request = session.createMessage();
 
+            /** TODO
             if (lazyHeaders != null) {
                 // lets add any lazy headers
                 for (Map.Entry<String, Object> entry : lazyHeaders.entrySet()) {
                     request.setObjectProperty(entry.getKey(), entry.getValue());
                 }
             }
+             */
         }
         return request;
+    }
+
+    public Message getInMessage() {
+        JmsMessage jmsMessage = (JmsMessage) getIn();
+        if (jmsMessage != null) {
+            return jmsMessage.getJmsMessage();
+        }
+        return null;
+    }
+
+    @Override
+    protected org.apache.camel.Message createInMessage() {
+        return new DefaultJmsMessage();
+    }
+
+    @Override
+    protected org.apache.camel.Message createOutMessage() {
+        return new DefaultJmsMessage();
     }
 }

Added: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsMessage.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsMessage.java?view=auto&rev=520457
==============================================================================
--- activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsMessage.java (added)
+++ activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsMessage.java Tue Mar 20 09:13:51 2007
@@ -0,0 +1,52 @@
+/**
+ *
+ * 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.jms;
+
+import org.apache.camel.impl.DefaultMessage;
+import org.apache.camel.Headers;
+
+import javax.jms.Message;
+
+/**
+ * @version $Revision$
+ */
+public class DefaultJmsMessage extends DefaultMessage implements JmsMessage {
+    private Message jmsMessage;
+
+    public DefaultJmsMessage() {
+    }
+
+    public DefaultJmsMessage(Message jmsMessage) {
+        this.jmsMessage = jmsMessage;
+    }
+
+    public Message getJmsMessage() {
+        return jmsMessage;
+    }
+
+    public void setJmsMessage(Message jmsMessage) {
+        this.jmsMessage = jmsMessage;
+    }
+
+    @Override
+    protected Headers createHeaders() {
+        return new JmsHeaders(this);
+    }
+
+
+}

Propchange: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsMessage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsMessage.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/DefaultJmsMessage.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsExchange.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsExchange.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsExchange.java (original)
+++ activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsExchange.java Tue Mar 20 09:13:51 2007
@@ -25,7 +25,7 @@
 /**
  * @version $Revision$
  */
-public interface JmsExchange extends Exchange<Message,Message,Message> {
+public interface JmsExchange extends Exchange {
 
     /**
      * Creates the JMS message for this exchange so that it can be sent to

Added: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsHeaders.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsHeaders.java?view=auto&rev=520457
==============================================================================
--- activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsHeaders.java (added)
+++ activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsHeaders.java Tue Mar 20 09:13:51 2007
@@ -0,0 +1,104 @@
+/**
+ *
+ * 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.jms;
+
+import org.apache.camel.Headers;
+import org.apache.camel.InvalidHeaderTypeException;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @version $Revision$
+ */
+public class JmsHeaders implements Headers {
+    private final DefaultJmsMessage message;
+    private Map<String, Object> lazyHeaders;
+
+    public JmsHeaders(DefaultJmsMessage message) {
+        this.message = message;
+    }
+
+    public Object getHeader(String name) {
+        Message request = message.getJmsMessage();
+        if (request != null) {
+            try {
+                Object value = request.getObjectProperty(name);
+                try {
+                    return value;
+                }
+                catch (ClassCastException e) {
+                    throw new InvalidHeaderTypeException(e.getMessage(), value);
+                }
+            }
+            catch (JMSException e) {
+                throw new MessagePropertyAcessException(name, e);
+            }
+        }
+        return null;
+    }
+
+    public void setHeader(String name, Object value) {
+        Message request = message.getJmsMessage();
+        if (request != null) {
+            try {
+                request.setObjectProperty(name, value);
+            }
+            catch (JMSException e) {
+                throw new MessagePropertyAcessException(name, e);
+            }
+        }
+        else {
+            if (lazyHeaders == null) {
+                lazyHeaders = new HashMap<String, Object>();
+            }
+            lazyHeaders.put(name, value);
+        }
+    }
+
+    public Map<String, Object> getHeaders() {
+        Message request = message.getJmsMessage();
+        if (request != null) {
+            Map<String, Object> answer = new HashMap<String, Object>();
+            Enumeration names;
+            try {
+                names = request.getPropertyNames();
+            }
+            catch (JMSException e) {
+                throw new MessagePropertyNamesAcessException(e);
+            }
+            while (names.hasMoreElements()) {
+                String name = names.nextElement().toString();
+                try {
+                    Object value = request.getObjectProperty(name);
+                    answer.put(name, value);
+                }
+                catch (JMSException e) {
+                    throw new MessagePropertyAcessException(name, e);
+                }
+            }
+            return answer;
+        }
+        else {
+            return lazyHeaders;
+        }
+    }
+}

Propchange: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsHeaders.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsHeaders.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsHeaders.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsMessage.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsMessage.java?view=auto&rev=520457
==============================================================================
--- activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsMessage.java (added)
+++ activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsMessage.java Tue Mar 20 09:13:51 2007
@@ -0,0 +1,33 @@
+/**
+ *
+ * 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.jms;
+
+import org.apache.camel.Message;
+
+/**
+ * @version $Revision$
+ */
+public interface JmsMessage extends Message {
+
+    /**
+     * Accesses the underlying JMS message
+     */
+    public javax.jms.Message getJmsMessage();
+
+    void setJmsMessage(javax.jms.Message jmsMessage);
+}

Propchange: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsMessage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsMessage.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/jms/JmsMessage.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: activemq/camel/trunk/camel-jms/src/test/java/org/apache/camel/jms/JmsRouteTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jms/src/test/java/org/apache/camel/jms/JmsRouteTest.java?view=diff&rev=520457&r1=520456&r2=520457
==============================================================================
--- activemq/camel/trunk/camel-jms/src/test/java/org/apache/camel/jms/JmsRouteTest.java (original)
+++ activemq/camel/trunk/camel-jms/src/test/java/org/apache/camel/jms/JmsRouteTest.java Tue Mar 20 09:13:51 2007
@@ -48,7 +48,7 @@
                 from("jms:activemq:test.a").to("jms:activemq:test.b");
                 from("jms:activemq:test.b").process(new Processor<JmsExchange>() {
                     public void onExchange(JmsExchange exchange) {
-                        System.out.println("Received exchange: " + exchange.getRequest());
+                        System.out.println("Received exchange: " + exchange.getIn());
                         latch.countDown();
                     }
                 });
@@ -62,7 +62,7 @@
         Endpoint<JmsExchange> endpoint = container.endpoint("jms:activemq:test.a");
         JmsExchange exchange2 = endpoint.createExchange();
         //exchange2.setInBody("Hello there!")
-        exchange2.setHeader("cheese", 123);
+        exchange2.getIn().getHeaders().setHeader("cheese", 123);
         endpoint.onExchange(exchange2);
 
         // now lets sleep for a while