You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by wt...@apache.org on 2009/08/06 01:11:04 UTC

svn commit: r801457 - in /camel/trunk/components/camel-cxf/src: main/java/org/apache/camel/component/cxf/ main/java/org/apache/camel/component/cxf/converter/ main/java/org/apache/camel/component/cxf/jaxrs/ test/java/org/apache/camel/component/cxf/jaxrs...

Author: wtam
Date: Wed Aug  5 23:11:04 2009
New Revision: 801457

URL: http://svn.apache.org/viewvc?rev=801457&view=rev
Log:
[CAMEL-1737] support Http centric client API in camel-cxfrs producer 

Added:
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsHeaderFilterStrategy.java   (with props)
    camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest.java   (with props)
    camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest-context.xml   (with props)
Modified:
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfComponent.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConstants.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsBinding.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsComponent.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumer.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java
    camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java
    camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRouterTest.java

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfComponent.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfComponent.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfComponent.java Wed Aug  5 23:11:04 2009
@@ -61,7 +61,6 @@
                     CxfEndpointBean.class);
 
             result = new CxfSpringEndpoint(this, bean);
-            setEndpointHeaderFilterStrategy(result);
            
             // Apply Spring bean properties (including # notation referenced bean).  Note that the
             // Spring bean properties values can be overridden by property defined in URI query.
@@ -78,6 +77,7 @@
             result = new CxfEndpoint(remaining, this);
         }
         
+        setEndpointHeaderFilterStrategy(result);
         return result;
     }
         

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConstants.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConstants.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConstants.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConstants.java Wed Aug  5 23:11:04 2009
@@ -45,7 +45,6 @@
     String CAMEL_CXF_RS_USING_HTTP_API = "CamelCxfRsUsingHttpAPI";
     String CAMEL_CXF_RS_VAR_VALUES = "CamelCxfRsVarValues";
     String CAMEL_CXF_RS_RESPONSE_CLASS = "CamelCxfRsResponseClass";
-    String CAMEL_CXF_RS_METHOD = "CamelCxfRsMethod";
     String CAMEL_CXF_RS_OPERATION_RESOURCE_INFO_STACK = "CamelCxfRsOperationResourceInfoStack";
 }
 

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java Wed Aug  5 23:11:04 2009
@@ -17,10 +17,12 @@
 package org.apache.camel.component.cxf.converter;
 
 import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import javax.ws.rs.core.Response;
 import javax.xml.soap.SOAPMessage;
 
 import org.apache.camel.Converter;
@@ -119,6 +121,30 @@
     public static DataFormat toDataFormat(final String name) {
         return DataFormat.valueOf(name.toUpperCase());
     }
+    
+    @Converter
+    public static InputStream toInputStream(Response response, Exchange exchange) {
+        
+        Object obj = response.getEntity();
+        
+        if (obj == null) {
+            return null;
+        }
+        
+        if (obj instanceof InputStream) {
+            // short circuit the lookup
+            return (InputStream)obj;
+        }
+        
+        TypeConverterRegistry registry = exchange.getContext().getTypeConverterRegistry();
+        TypeConverter tc = registry.lookup(InputStream.class, obj.getClass());
+        
+        if (tc != null) {
+            return tc.convertTo(InputStream.class, exchange, obj);
+        }
+        
+        return null;
+    }
 
     /**
      * Use a fallback type converter so we can convert the embedded list element 

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsBinding.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsBinding.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsBinding.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsBinding.java Wed Aug  5 23:11:04 2009
@@ -20,8 +20,14 @@
 import java.lang.reflect.Method;
 import java.util.Map;
 
+import javax.ws.rs.core.MultivaluedMap;
 import org.apache.cxf.message.Exchange;
 
+/**
+ * Interface to bind between Camel and CXF exchange for RESTful resources.
+ *
+ * @version $Revision$
+ */
 public interface CxfRsBinding {
     
     /**
@@ -47,5 +53,53 @@
      */
     Object populateCxfRsResponseFromExchange(org.apache.camel.Exchange camelExchange,
                                Exchange cxfExchange) throws Exception;
+    
+    /**
+     * Bind the camel in message body to a request body that gets passed
+     * to CXF RS {@link org.apache.cxf.jaxrs.client.WebClient} APIs.
+     * 
+     * @param camelMessage the source message
+     * @param camelExchange the Camel exchange
+     * @return the request object to be passed to invoke a WebClient
+     * @throws Exception
+     */
+    Object bindCamelMessageBodyToRequestBody(org.apache.camel.Message camelMessage,
+                                             org.apache.camel.Exchange camelExchange) 
+        throws Exception;
+    
+    /**
+     * Bind the camel headers to request headers that gets passed to CXF RS
+     * {@link org.apache.cxf.jaxrs.client.WebClient} APIs.
+     * 
+     * @param camelHeaders the source headers
+     * @param camelExchange the Camel exchange
+     * @param headers to be passed to WebClient
+     * @throws Exception
+     */
+    MultivaluedMap<String, String> bindCamelHeadersToRequestHeaders(Map<String, Object> camelHeaders,
+                                                                    org.apache.camel.Exchange camelExchange) 
+       throws Exception;
+                                                         
+    
+    /**
+     * Bind the HTTP response body to camel out body
+     * @param response
+     * @param exchange
+     * @return the object to be set in the Camel out message body
+     */
+    Object bindResponseToCamelBody(Object response, org.apache.camel.Exchange camelExchange)
+        throws Exception;
+    
+    /**
+     * Bind the response headers to camel out headers.
+     * 
+     * @param response
+     * @param exchange
+     * @return headers to be set in the Camel out message
+     * @throws Exception
+     */
+    Map<String, Object> bindResponseHeadersToCamelHeaders(Object response, 
+                                                          org.apache.camel.Exchange exchange)
+        throws Exception;
 
 }

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsComponent.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsComponent.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsComponent.java Wed Aug  5 23:11:04 2009
@@ -23,9 +23,6 @@
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.component.cxf.CxfConstants;
-import org.apache.camel.component.cxf.CxfEndpoint;
-import org.apache.camel.component.cxf.CxfSpringEndpoint;
-import org.apache.camel.component.cxf.spring.CxfEndpointBean;
 import org.apache.camel.impl.HeaderFilterStrategyComponent;
 import org.apache.camel.util.CamelContextHelper;
 import org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean;
@@ -42,6 +39,7 @@
         super(context);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception {
         CxfRsEndpoint answer = null;
@@ -56,7 +54,6 @@
                 AbstractJAXRSFactoryBean.class);
 
             answer = new CxfRsSpringEndpoint(this.getCamelContext(), bean);
-            setEndpointHeaderFilterStrategy(answer);
            
             // Apply Spring bean properties (including # notation referenced bean).  Note that the
             // Spring bean properties values can be overridden by property defined in URI query.
@@ -73,6 +70,7 @@
             answer = new CxfRsEndpoint(remaining, this);
         }
         
+        setEndpointHeaderFilterStrategy(answer);
         return answer;
     }
 

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumer.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumer.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumer.java Wed Aug  5 23:11:04 2009
@@ -17,13 +17,9 @@
 
 package org.apache.camel.component.cxf.jaxrs;
 
-import org.apache.camel.Endpoint;
 import org.apache.camel.Processor;
 import org.apache.camel.impl.DefaultConsumer;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.cxf.endpoint.Server;
-import org.apache.cxf.frontend.ServerFactoryBean;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 
 /**
@@ -33,7 +29,6 @@
  * It is also responsible for converting and sending back responses to CXF client. 
  */
 public class CxfRsConsumer extends DefaultConsumer {
-    private static final Log LOG = LogFactory.getLog(CxfRsConsumer.class);
     private Server server;
 
     public CxfRsConsumer(CxfRsEndpoint endpoint, Processor processor) {

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java Wed Aug  5 23:11:04 2009
@@ -19,6 +19,7 @@
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Component;
@@ -30,6 +31,9 @@
 import org.apache.camel.impl.DefaultEndpoint;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.camel.spi.HeaderFilterStrategyAware;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
 
@@ -37,9 +41,13 @@
  * 
  */
 public class CxfRsEndpoint extends DefaultEndpoint implements HeaderFilterStrategyAware {
-    private List<Class> resourceClasses;    
+    private static final Log LOG = LogFactory.getLog(CxfRsEndpoint.class);
+
+    private List<Class<?>> resourceClasses;    
     private HeaderFilterStrategy headerFilterStrategy;
     private CxfRsBinding binding;
+
+    private AtomicBoolean bindingInitialized = new AtomicBoolean(false);
     
     public CxfRsEndpoint(String endpointUri, CamelContext camelContext) {
        super(endpointUri, camelContext);
@@ -49,12 +57,22 @@
         super(endpointUri, component);
     }
     
-    public HeaderFilterStrategy getHeaderFilterStrategy() {        
+    public HeaderFilterStrategy getHeaderFilterStrategy() {    
+        if (headerFilterStrategy == null) {
+            headerFilterStrategy = new CxfRsHeaderFilterStrategy();
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Create default header filter strategy " + headerFilterStrategy);
+            }
+        }
         return headerFilterStrategy;
     }
 
     public void setHeaderFilterStrategy(HeaderFilterStrategy strategy) {
         headerFilterStrategy = strategy;
+        if (binding instanceof HeaderFilterStrategyAware) {
+            ((HeaderFilterStrategyAware)binding)
+                .setHeaderFilterStrategy(headerFilterStrategy);
+        }
     }
 
     public Consumer createConsumer(Processor processor) throws Exception {        
@@ -71,19 +89,29 @@
     
     public void setBinding(CxfRsBinding binding) {
         this.binding = binding;
+        bindingInitialized.set(false);
+
     }
     
     public CxfRsBinding getBinding() {
         if (binding == null) {
             binding = new DefaultCxfRsBinding();
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Create default CXF Binding " + binding);
+            }
         } 
+        
+        if (!bindingInitialized.getAndSet(true) && binding instanceof HeaderFilterStrategyAware) {
+            ((HeaderFilterStrategyAware)binding).setHeaderFilterStrategy(getHeaderFilterStrategy());
+        }
+        
         return binding;
     }
     
     protected void setupJAXRSServerFactoryBean(JAXRSServerFactoryBean sfb) {        
         // address
         sfb.setAddress(getEndpointUri());
-        sfb.setResourceClasses(getResourceClasses());
+        sfb.setResourceClasses(CastUtils.cast(getResourceClasses(), Class.class));
         sfb.setStart(false);
     }
     
@@ -107,15 +135,15 @@
         return answer;
     }
        
-    public List<Class> getResourceClasses() {
+    public List<Class<?>> getResourceClasses() {
         return resourceClasses;
     }
 
-    public void setResourceClasses(List<Class> classes) {
+    public void setResourceClasses(List<Class<?>> classes) {
         resourceClasses = classes;
     }
 
-    public void setResourceClasses(Class... classes) {
+    public void setResourceClasses(Class<?>... classes) {
         setResourceClasses(Arrays.asList(classes));
     }
 

Added: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsHeaderFilterStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsHeaderFilterStrategy.java?rev=801457&view=auto
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsHeaderFilterStrategy.java (added)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsHeaderFilterStrategy.java Wed Aug  5 23:11:04 2009
@@ -0,0 +1,42 @@
+/**
+ * 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.component.cxf.jaxrs;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.cxf.CxfConstants;
+import org.apache.camel.impl.DefaultHeaderFilterStrategy;
+
+/**
+ *
+ * @version $Revision$
+ */
+public class CxfRsHeaderFilterStrategy extends DefaultHeaderFilterStrategy {
+    public CxfRsHeaderFilterStrategy() {
+        initialize();  
+    }
+
+    protected void initialize() {
+        getOutFilter().add(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS);
+        getOutFilter().add(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API);
+        getOutFilter().add(CxfConstants.CAMEL_CXF_RS_OPERATION_RESOURCE_INFO_STACK);
+        getOutFilter().add(CxfConstants.CAMEL_CXF_RS_VAR_VALUES);
+        getOutFilter().add(CxfConstants.OPERATION_NAME);
+        getOutFilter().add(Exchange.HTTP_METHOD);
+        getOutFilter().add(Exchange.HTTP_PATH);
+    }
+
+}

Propchange: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsHeaderFilterStrategy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsHeaderFilterStrategy.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java Wed Aug  5 23:11:04 2009
@@ -17,8 +17,6 @@
 package org.apache.camel.component.cxf.jaxrs;
 
 import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.logging.Level;
 
 import javax.ws.rs.WebApplicationException;
 

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java Wed Aug  5 23:11:04 2009
@@ -17,7 +17,6 @@
 
 package org.apache.camel.component.cxf.jaxrs;
 
-import java.io.InputStream;
 import java.lang.reflect.Method;
 import java.util.List;
 
@@ -27,11 +26,12 @@
 import org.apache.camel.Message;
 import org.apache.camel.component.cxf.CxfConstants;
 import org.apache.camel.impl.DefaultProducer;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.cxf.jaxrs.JAXRSServiceFactoryBean;
 import org.apache.cxf.jaxrs.client.Client;
 import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
-import org.apache.cxf.message.MessageContentsList;
 
 /**
  * CxfRsProducer binds a Camel exchange to a CXF exchange, acts as a CXF 
@@ -39,6 +39,9 @@
  * according to resource annotation.  Any response will be bound to Camel exchange. 
  */
 public class CxfRsProducer extends DefaultProducer {
+    
+    private static final Log LOG = LogFactory.getLog(CxfRsProducer.class);
+
     JAXRSClientFactoryBean cfb;
 
     public CxfRsProducer(CxfRsEndpoint endpoint) {
@@ -47,6 +50,11 @@
     }
 
     public void process(Exchange exchange) throws Exception {
+        
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("Process exchange: " + exchange);
+        }
+        
         Message inMessage = exchange.getIn();
         Boolean httpClientAPI = inMessage.getHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.class);
         if (httpClientAPI != null && httpClientAPI.booleanValue()) {
@@ -58,37 +66,57 @@
     }
     
     @SuppressWarnings("unchecked")
-    protected void invokeHttpClient(Exchange exchange) {
+    protected void invokeHttpClient(Exchange exchange) throws Exception {
         Message inMessage = exchange.getIn();       
         WebClient client = cfb.createWebClient();
+        
         String httpMethod = inMessage.getHeader(Exchange.HTTP_METHOD, String.class); 
         Class responseClass = inMessage.getHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, Class.class);        
         String path = inMessage.getHeader(Exchange.HTTP_PATH, String.class);
        
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("HTTP method = " + httpMethod);
+            LOG.trace("path = " + path);
+            LOG.trace("responseClass = " + responseClass);
+        }
+        
+        // set the path
         if (path != null) {
             client.path(path);
         } 
+        
+        CxfRsBinding binding = ((CxfRsEndpoint)getEndpoint()).getBinding();
+
+        // set the body
         Object body = null;
         if (!"GET".equals(httpMethod)) {
-            // need to check the request object
-            body = checkRequestObject(inMessage.getBody());            
+            // need to check the request object.           
+            body = binding.bindCamelMessageBodyToRequestBody(inMessage, exchange);
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("Request body = " + body);
+            }
         }
         
-        /*String acceptContentType = inMessage.getHeader(Exchange.ACCEPT_CONTENT_TYPE, String.class);
-        if (acceptContentType != null) {            
-            client.accept(acceptContentType);            
-        }*/
+        // set headers
+        client.headers(binding.bindCamelHeadersToRequestHeaders(inMessage.getHeaders(),
+                                                                exchange));
+        
+        // invoke the client
         Object response = null;        
-        if (responseClass == null) {
-            response = client.invoke(httpMethod, body, InputStream.class);
-        } else if (responseClass.equals(Response.class)) {
+        if (responseClass == null || Response.class.equals(responseClass)) {
             response = client.invoke(httpMethod, body);
         } else {
             response = client.invoke(httpMethod, body, responseClass);
         }
-       
-        if (exchange.getPattern().isOutCapable()) {
-            exchange.getOut().setBody(response);
+        
+        // set response
+        if (exchange.getPattern().isOutCapable()) {     
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("Response body = " + response);
+            }
+            
+            exchange.getOut().setBody(binding.bindResponseToCamelBody(response, exchange));
+            exchange.getOut().setHeaders(binding.bindResponseHeadersToCamelHeaders(response, exchange));
         }
     }
 
@@ -116,9 +144,10 @@
         }
     }
 
+    @SuppressWarnings("unchecked")
     private Method findRightMethod(List<Class> resourceClasses, String methodName, Class[] parameterTypes) throws NoSuchMethodException {        
         Method answer = null;
-        for (Class clazz : resourceClasses) {
+        for (Class<?> clazz : resourceClasses) {
             try {
                 answer = clazz.getMethod(methodName, parameterTypes);
             } catch (NoSuchMethodException ex) {
@@ -134,21 +163,9 @@
             + "withe these parameter " + arrayToString(parameterTypes));
     }
     
-    private Object checkRequestObject(Object request) {
-        if (request != null) {
-            if (request instanceof MessageContentsList) {
-                request = ((MessageContentsList)request).get(0);
-            } else if (request instanceof List) {
-                request = ((List)request).get(0);
-            } else if (request.getClass().isArray()) {
-                request = ((Object[])request)[0];
-            }
-        }
-        return request;
-    }
     
-    private Class[] getParameterTypes(Object[] objects) {
-        Class[] answer = new Class[objects.length];
+    private Class<?>[] getParameterTypes(Object[] objects) {
+        Class<?>[] answer = new Class[objects.length];
         int i = 0;
         for (Object obj : objects) {
             answer[i] = obj.getClass();

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java Wed Aug  5 23:11:04 2009
@@ -18,27 +18,58 @@
 package org.apache.camel.component.cxf.jaxrs;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.component.cxf.CxfConstants;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.camel.spi.HeaderFilterStrategyAware;
-import org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor;
-import org.apache.cxf.jaxrs.model.MethodInvocationInfo;
-import org.apache.cxf.jaxrs.model.OperationResourceInfo;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.cxf.jaxrs.impl.MetadataMap;
 import org.apache.cxf.jaxrs.model.OperationResourceInfoStack;
-import org.apache.cxf.jaxrs.model.URITemplate;
+import org.apache.cxf.message.MessageContentsList;
 
+/**
+ * Default strategy  to bind between Camel and CXF exchange for RESTful resources.
+ *
+ *
+ * @version $Revision$
+ */
 public class DefaultCxfRsBinding implements CxfRsBinding, HeaderFilterStrategyAware {
+    private static final Log LOG = LogFactory.getLog(DefaultCxfRsBinding.class);
+
+    protected Map<String, String> camelToCxfHeaderMap = new HashMap<String, String>();
+    protected Map<String, String> cxfToCamelHeaderMap = new HashMap<String, String>();
+    
     private HeaderFilterStrategy headerFilterStrategy;
     
+    public DefaultCxfRsBinding() {
+        // initialize mappings between Camel and CXF header names
+        
+        camelToCxfHeaderMap.put(Exchange.HTTP_URI, org.apache.cxf.message.Message.REQUEST_URI);
+        camelToCxfHeaderMap.put(Exchange.HTTP_METHOD, org.apache.cxf.message.Message.HTTP_REQUEST_METHOD);
+        camelToCxfHeaderMap.put(Exchange.HTTP_PATH, org.apache.cxf.message.Message.PATH_INFO);
+        camelToCxfHeaderMap.put(Exchange.CONTENT_TYPE, org.apache.cxf.message.Message.CONTENT_TYPE);
+        camelToCxfHeaderMap.put(Exchange.HTTP_CHARACTER_ENCODING, org.apache.cxf.message.Message.ENCODING);
+        camelToCxfHeaderMap.put(Exchange.HTTP_QUERY, org.apache.cxf.message.Message.QUERY_STRING);
+        camelToCxfHeaderMap.put(Exchange.ACCEPT_CONTENT_TYPE, org.apache.cxf.message.Message.ACCEPT_CONTENT_TYPE);
+    
+        cxfToCamelHeaderMap.put(org.apache.cxf.message.Message.REQUEST_URI, Exchange.HTTP_URI);
+        cxfToCamelHeaderMap.put(org.apache.cxf.message.Message.HTTP_REQUEST_METHOD, Exchange.HTTP_METHOD);
+        cxfToCamelHeaderMap.put(org.apache.cxf.message.Message.PATH_INFO, Exchange.HTTP_PATH);
+        cxfToCamelHeaderMap.put(org.apache.cxf.message.Message.CONTENT_TYPE, Exchange.CONTENT_TYPE);
+        cxfToCamelHeaderMap.put(org.apache.cxf.message.Message.ENCODING, Exchange.HTTP_CHARACTER_ENCODING);
+        cxfToCamelHeaderMap.put(org.apache.cxf.message.Message.QUERY_STRING, Exchange.HTTP_QUERY);
+        cxfToCamelHeaderMap.put(org.apache.cxf.message.Message.ACCEPT_CONTENT_TYPE, Exchange.ACCEPT_CONTENT_TYPE);
+    }
+    
     public Object populateCxfRsResponseFromExchange(Exchange camelExchange,
                                                     org.apache.cxf.message.Exchange cxfExchange) throws Exception {
         if (camelExchange.isFailed()) {
@@ -55,6 +86,8 @@
         //Copy the CXF message header into the Camel inMessage
         org.apache.cxf.message.Message cxfMessage = cxfExchange.getInMessage();
         
+        // TODO use header filter strategy and cxfToCamelHeaderMap
+        
         copyMessageHeader(cxfMessage, camelMessage, org.apache.cxf.message.Message.REQUEST_URI, Exchange.HTTP_URI);
         
         copyMessageHeader(cxfMessage, camelMessage, org.apache.cxf.message.Message.HTTP_REQUEST_METHOD, Exchange.HTTP_METHOD);
@@ -75,11 +108,111 @@
         
         camelMessage.setHeader(CxfConstants.OPERATION_NAME, method.getName());
         
-        camelMessage.setHeader(CxfConstants.CAMEL_CXF_RS_METHOD, method);
-        
         camelMessage.setBody(paramArray);        
     }
 
+    
+    public MultivaluedMap<String, String> bindCamelHeadersToRequestHeaders(Map<String, Object> camelHeaders,
+                                                                           Exchange camelExchange)
+        throws Exception {
+
+        MultivaluedMap<String, String> answer = new MetadataMap<String, String>();
+        for (Map.Entry<String, Object> entry : camelHeaders.entrySet()) {
+            
+            if (headerFilterStrategy.applyFilterToCamelHeaders(entry.getKey(), entry.getValue(), camelExchange)) {
+                if (LOG.isTraceEnabled()) {
+                    LOG.trace("Drop Camel header: " + entry.getKey() + "=" + entry.getValue());
+                }
+                continue;
+            }
+            
+            String mappedHeaderName = camelToCxfHeaderMap.get(entry.getKey());
+            if (mappedHeaderName == null) {
+                mappedHeaderName = entry.getKey();
+            }
+            
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("Propagate Camel header: " + entry.getKey() + "=" + entry.getValue() + " as " 
+                          + mappedHeaderName);
+            }
+            
+            answer.putSingle(mappedHeaderName, entry.getValue().toString());
+        }
+        return answer;
+    }
+
+    /**
+     * This method call Message.getBody({@link MessageContentsList}) to allow
+     * an appropriate converter to kick in even through we only read the first
+     * element off the MessageContextList.  If that returns null, we check  
+     * the body to see if it is a List or an array and then return the first 
+     * element.  If that fails, we will simply return the object.
+     */
+    public Object bindCamelMessageBodyToRequestBody(Message camelMessage, Exchange camelExchange)
+        throws Exception {
+
+        Object request = camelMessage.getBody(MessageContentsList.class);
+        if (request != null) {
+            return ((MessageContentsList)request).get(0);
+        } 
+
+        request = camelMessage.getBody();
+        if (request instanceof List) {
+            request = ((List<?>)request).get(0);
+        } else if (request.getClass().isArray()) {
+            request = ((Object[])request)[0];
+        }
+
+        return request;
+
+    }
+
+    /**
+     * We will return an empty Map unless the response parameter is a {@link Response} object. 
+     */
+    public Map<String, Object> bindResponseHeadersToCamelHeaders(Object response, Exchange exchange)
+        throws Exception {
+        
+        Map<String, Object> answer = new HashMap<String, Object>();
+        if (response instanceof Response) {
+            
+            for (Map.Entry<String, List<Object>> entry : ((Response)response).getMetadata().entrySet()) {
+                if (!headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), 
+                                                                       entry.getValue(), exchange)) {
+                    
+                    String mappedHeaderName = cxfToCamelHeaderMap.get(entry.getKey());
+                    if (mappedHeaderName == null) {
+                        mappedHeaderName = entry.getKey();
+                    }
+                    
+                    if (LOG.isTraceEnabled()) {
+                        LOG.trace("Populate external header " + entry.getKey() + "=" + entry.getValue()
+                                  + " as " + mappedHeaderName);
+                    }
+                    
+                    answer.put(mappedHeaderName, entry.getValue().get(0));
+
+                } else {
+                    if (LOG.isTraceEnabled()) {
+                        LOG.trace("Drop external header " + entry.getKey() + "=" + entry.getValue());
+                    }
+                }
+            }
+            
+            // put response code in Camel message header
+            answer.put(Exchange.HTTP_RESPONSE_CODE, ((Response)response).getStatus());
+        }
+        
+        return answer;
+    }
+
+    /**
+     *  By default, we just return the response object. 
+     */
+    public Object bindResponseToCamelBody(Object response, Exchange camelExchange) throws Exception {
+        return response;
+    }
+    
     public HeaderFilterStrategy getHeaderFilterStrategy() {        
         return headerFilterStrategy;
     }
@@ -89,6 +222,22 @@
         headerFilterStrategy = strategy;        
     }
     
+    public Map<String, String> getCamelToCxfHeaderMap() {
+        return camelToCxfHeaderMap;
+    }
+
+    public void setCamelToCxfHeaderMap(Map<String, String> camelToCxfHeaderMap) {
+        this.camelToCxfHeaderMap = camelToCxfHeaderMap;
+    }
+
+    public Map<String, String> getCxfToCamelHeaderMap() {
+        return cxfToCamelHeaderMap;
+    }
+
+    public void setCxfToCamelHeaderMap(Map<String, String> cxfToCamelHeaderMap) {
+        this.cxfToCamelHeaderMap = cxfToCamelHeaderMap;
+    }
+    
     protected void copyMessageHeader(org.apache.cxf.message.Message cxfMessage, Message camelMessage, String cxfKey, String camelKey) {
         if (cxfMessage.get(cxfKey) != null) {
             camelMessage.setHeader(camelKey, cxfMessage.get(cxfKey));

Modified: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java (original)
+++ camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java Wed Aug  5 23:11:04 2009
@@ -17,7 +17,6 @@
 package org.apache.camel.component.cxf.jaxrs;
 
 import java.io.InputStream;
-import java.net.MalformedURLException;
 import java.net.URL;
 
 import org.apache.camel.Exchange;

Added: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest.java?rev=801457&view=auto
==============================================================================
--- camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest.java (added)
+++ camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest.java Wed Aug  5 23:11:04 2009
@@ -0,0 +1,142 @@
+/**
+ * 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.component.cxf.jaxrs;
+
+import java.io.InputStream;
+
+import javax.ws.rs.core.Response;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.component.cxf.CxfConstants;
+import org.apache.camel.component.cxf.util.CxfUtils;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+/**
+ * Unit test that verify header propagation functionality for CxfRsProducer
+ * that uses WebClient API.
+ *  
+ * @version $Revision$
+ */
+@ContextConfiguration
+public class CxfRsProducerHeaderTest extends AbstractJUnit4SpringContextTests {
+    
+    private static final Object RESPONSE = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
+        + "<Customer><id>123</id><name>John</name></Customer>";
+    
+    @Autowired
+    protected CamelContext camelContext;
+    
+    @Test
+    public void testInvokeThatDoesNotInvolveHeaders() throws Exception {
+        Exchange exchange = camelContext.createProducerTemplate().send("direct://http", new Processor() {
+
+            public void process(Exchange exchange) throws Exception {
+                exchange.setPattern(ExchangePattern.InOut);
+                Message inMessage = exchange.getIn();
+                inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.TRUE);
+                inMessage.setHeader(Exchange.HTTP_METHOD, "GET");
+                inMessage.setHeader(Exchange.HTTP_PATH, "/customerservice/customers/123");                
+                inMessage.setBody(null);                
+            }
+            
+        });
+     
+        // verify the out message is a Response object by default
+        Response response = (Response)exchange.getOut().getBody();
+        assertNotNull("The response should not be null ", response);
+        assertEquals(200, response.getStatus());
+        
+        // test converter (from Response to InputStream)
+        assertEquals(RESPONSE, CxfUtils.getStringFromInputStream(exchange.getOut().getBody(InputStream.class)));
+    }
+
+    @Test
+    public void testHeaderFilteringAndPropagation() throws Exception {
+        Exchange exchange = camelContext.createProducerTemplate().send("direct://http2", new Processor() {
+
+            public void process(Exchange exchange) throws Exception {
+                exchange.setPattern(ExchangePattern.InOut);
+                Message inMessage = exchange.getIn();
+                inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.TRUE);
+                inMessage.setHeader(Exchange.HTTP_METHOD, "GET");
+                inMessage.setHeader(Exchange.HTTP_PATH, "/customerservice/customers/123");    
+                inMessage.setHeader(Exchange.ACCEPT_CONTENT_TYPE, "application/json");
+                inMessage.setHeader("my-user-defined-header", "my-value");
+                inMessage.setBody(null);                
+            }
+            
+        });
+     
+        // get the response message 
+        Response response = (Response)exchange.getOut().getBody();
+        
+        // check the response code on the Response object as set by the "HttpProcess"
+        assertEquals(200, response.getStatus());
+        
+        // get out message
+        Message outMessage = exchange.getOut();
+        
+        // verify the content-type header sent by the "HttpProcess"
+        assertEquals("text/xml", outMessage.getHeader(Exchange.CONTENT_TYPE));
+        
+        // check the user defined header echoed by the "HttpProcess"
+        assertEquals("my-value", outMessage.getHeader("echo-my-user-defined-header"));
+        
+        // check the Accept header echoed by the "HttpProcess"
+        assertEquals("application/json", outMessage.getHeader("echo-accept"));
+        
+        // make sure the HttpProcess have not seen CxfConstants.CAMEL_CXF_RS_USING_HTTP_API
+        assertNull(outMessage.getHeader("failed-header-using-http-api"));
+        
+        // make sure response code has been set in out header
+        assertEquals(200, outMessage.getHeader(Exchange.HTTP_RESPONSE_CODE));
+        
+    }
+    
+    public static class HttpProcessor implements Processor {
+
+        public void process(Exchange exchange) throws Exception {
+            Message in = exchange.getIn();
+            Message out = exchange.getOut();
+            
+            if (in.getHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API) != null) {
+                // this should have been filtered
+                out.setHeader("failed-header-using-http-api", CxfConstants.CAMEL_CXF_RS_USING_HTTP_API);
+            }
+            
+            out.setHeader("echo-accept", in.getHeader("Accept"));
+            out.setHeader("echo-my-user-defined-header", in.getHeader("my-user-defined-header"));
+            
+            exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, 200);
+            exchange.getOut().setHeader(Exchange.CONTENT_TYPE, "text/xml");
+            
+            
+        }
+        
+    }
+}

Propchange: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRouterTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRouterTest.java?rev=801457&r1=801456&r2=801457&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRouterTest.java (original)
+++ camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRouterTest.java Wed Aug  5 23:11:04 2009
@@ -17,12 +17,9 @@
 
 package org.apache.camel.component.cxf.jaxrs;
 
-import java.io.InputStream;
-import java.net.URL;
-
-import org.apache.camel.component.cxf.util.CxfUtils;
 import org.apache.camel.test.junit4.CamelSpringTestSupport;
 import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.GetMethod;
 import org.apache.commons.httpclient.methods.PostMethod;
 import org.apache.commons.httpclient.methods.PutMethod;
 import org.apache.commons.httpclient.methods.RequestEntity;
@@ -31,8 +28,6 @@
 import org.springframework.context.support.AbstractXmlApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
-import static org.junit.Assert.assertEquals;
-
 public class CxfRsRouterTest extends CamelSpringTestSupport {
     private static final String PUT_REQUEST = "<Customer><name>Mary</name><id>123</id></Customer>";
     private static final String POST_REQUEST = "<Customer><name>Jack</name></Customer>";
@@ -43,18 +38,35 @@
     }
     
     @Test
-    public void testGetCustomer() throws Exception {
-        URL url = new URL("http://localhost:9000/customerservice/customers/123");
+    public void testGetCustomer() throws Exception {      
+        GetMethod get = new GetMethod("http://localhost:9000/customerservice/customers/123");
+        get.addRequestHeader("Accept" , "application/json");
+        
+        HttpClient httpclient = new HttpClient();
 
-        InputStream in = url.openStream();
-        assertEquals("{\"Customer\":{\"id\":123,\"name\":\"John\"}}", CxfUtils.getStringFromInputStream(in));
+        try {
+            assertEquals(200, httpclient.executeMethod(get));
+            assertEquals("{\"Customer\":{\"id\":123,\"name\":\"John\"}}", 
+                         get.getResponseBodyAsString());
+        } finally {
+            get.releaseConnection();
+        }
     }
     
     @Test
     public void testGetSubResource() throws Exception {
-        URL url = new URL("http://localhost:9000/customerservice/orders/223/products/323");
-        InputStream in = url.openStream();
-        assertEquals("{\"Product\":{\"description\":\"product 323\",\"id\":323}}", CxfUtils.getStringFromInputStream(in));
+        GetMethod get = new GetMethod("http://localhost:9000/customerservice/orders/223/products/323");
+        get.addRequestHeader("Accept" , "application/json");
+
+        HttpClient httpclient = new HttpClient();
+
+        try {
+            assertEquals(200, httpclient.executeMethod(get));
+            assertEquals("{\"Product\":{\"description\":\"product 323\",\"id\":323}}", 
+                         get.getResponseBodyAsString());
+        } finally {
+            get.releaseConnection();
+        }
     }
     
     @Test

Added: camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest-context.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest-context.xml?rev=801457&view=auto
==============================================================================
--- camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest-context.xml (added)
+++ camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest-context.xml Wed Aug  5 23:11:04 2009
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:cxf="http://camel.apache.org/schema/cxf"
+       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
+       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+  
+  <jaxrs:server id="restService"
+		        address="http://localhost:9002" 
+		        staticSubresourceResolution="true">
+    <jaxrs:serviceBeans>
+      <ref bean="customerService"/>
+    </jaxrs:serviceBeans>       
+  </jaxrs:server>
+  
+  <bean id="customerService" class="org.apache.camel.component.cxf.jaxrs.testbean.CustomerService" />
+  
+  <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+    <route>
+       <from uri="direct://http"/>
+       <to uri="cxfrs://http://localhost:9002"/>
+    </route>
+    
+    <route>
+       <from uri="direct://http2"/>
+       <to uri="cxfrs://http://localhost:9003"/>
+    </route>
+    
+    <route>
+       <from uri="jetty://http://localhost:9003?matchOnUriPrefix=true"/>
+       <process ref="httpProcessor" />
+    </route>
+  </camelContext>
+
+  <bean id="httpProcessor" class="org.apache.camel.component.cxf.jaxrs.CxfRsProducerHeaderTest$HttpProcessor" />
+</beans>

Propchange: camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest-context.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest-context.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsProducerHeaderTest-context.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml