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/06/30 03:51:28 UTC

svn commit: r789534 - in /camel/trunk/components/camel-cxf/src: main/java/org/apache/camel/component/cxf/cxfbean/ main/java/org/apache/camel/component/cxf/transport/ test/java/org/apache/camel/component/cxf/cxfbean/ test/java/org/apache/camel/component...

Author: wtam
Date: Tue Jun 30 01:51:27 2009
New Revision: 789534

URL: http://svn.apache.org/viewvc?rev=789534&view=rev
Log:
[CAMEL-1774] cxfbean does not propagate in http response code to Camel header

Modified:
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanBinding.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanDestination.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/DefaultCxfBeanBinding.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java
    camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/cxfbean/CxfBeanTest.java
    camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerService.java

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanBinding.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanBinding.java?rev=789534&r1=789533&r2=789534&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanBinding.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanBinding.java Tue Jun 30 01:51:27 2009
@@ -36,4 +36,15 @@
     Message createCxfMessageFromCamelExchange(Exchange camelExchange, 
             HeaderFilterStrategy headerFilterStrategy);
 
+    /**
+     * Given a CXF out/response Message, this method propagates response headers to a 
+     * Camel exchange.
+     * 
+     * @param cxfMessage
+     * @param camelExchange
+     * @param headerFilterStrategy
+     */
+    void propagateResponseHeadersToCamel(Message cxfMessage, Exchange camelExchange,
+                                         HeaderFilterStrategy headerFilterStrategy);
+
 }

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanDestination.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanDestination.java?rev=789534&r1=789533&r2=789534&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanDestination.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanDestination.java Tue Jun 30 01:51:27 2009
@@ -25,6 +25,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.cxf.Bus;
+import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageImpl;
 import org.apache.cxf.service.model.EndpointInfo;
 import org.apache.cxf.transport.ConduitInitiator;
@@ -83,5 +84,11 @@
         // The response message will be send back by the outgoing chain
         incomingObserver.onMessage(cxfMessage);
     }
+    
+    @Override
+    protected void propagateResponseHeadersToCamel(Message outMessage, Exchange camelExchange) {
+        endpoint.getCxfBeanBinding().propagateResponseHeadersToCamel(outMessage, camelExchange,
+                                                                     endpoint.getHeaderFilterStrategy());
+    }
 
 }

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/DefaultCxfBeanBinding.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/DefaultCxfBeanBinding.java?rev=789534&r1=789533&r2=789534&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/DefaultCxfBeanBinding.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/DefaultCxfBeanBinding.java Tue Jun 30 01:51:27 2009
@@ -16,11 +16,15 @@
  */
 package org.apache.camel.component.cxf.cxfbean;
 
+import java.util.List;
+import java.util.Map;
+
 import org.apache.camel.Exchange;
 import org.apache.camel.component.cxf.CxfSoapBinding;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.message.Message;
 
 /**
@@ -77,6 +81,49 @@
 
         return answer;
     }
+    
+    public void propagateResponseHeadersToCamel(Message cxfMessage, Exchange exchange,
+                                                HeaderFilterStrategy strategy) {
+
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("Propagating response headers from CXF message " + cxfMessage);
+        }
+        
+        if (strategy == null) {
+            return;
+        }
+
+        Map<String, Object> camelHeaders = exchange.getOut().getHeaders();
+        
+        Map<String, List<String>> cxfHeaders =
+            CastUtils.cast((Map)cxfMessage.get(Message.PROTOCOL_HEADERS));
+                      
+        if (cxfHeaders != null) {
+            for (Map.Entry<String, List<String>> entry : cxfHeaders.entrySet()) {
+                if (!strategy.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), exchange)) {
+                    camelHeaders.put(entry.getKey(), entry.getValue().get(0));
+                    
+                    if (LOG.isTraceEnabled()) {
+                        LOG.trace("Populate header from CXF header=" + entry.getKey() + " value="
+                                + entry.getValue());
+                    }
+                }
+            }
+        }
+
+        
+        // propagate HTTP RESPONSE_CODE
+        String key = Message.RESPONSE_CODE;
+        Object value = cxfMessage.get(key);
+        if (value != null && !strategy.applyFilterToExternalHeaders(key, value, exchange)) {
+            camelHeaders.put(Exchange.HTTP_RESPONSE_CODE, value);
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("Populate header from CXF header=" + key + " value=" + value
+                          + " as " + Exchange.HTTP_RESPONSE_CODE);
+            } 
+        }
+        
+    }
 
     protected String getPath(org.apache.camel.Message camelMessage) {
         String answer = camelMessage.getHeader(Exchange.HTTP_PATH, String.class);

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java?rev=789534&r1=789533&r2=789534&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java Tue Jun 30 01:51:27 2009
@@ -248,6 +248,14 @@
         return conduitInitiator;
     }
 
+    /**
+     * @param outMessage
+     * @param camelExchange
+     */
+    protected void propagateResponseHeadersToCamel(Message outMessage, Exchange camelExchange) {
+        CxfHeaderHelper.propagateCxfToCamel(headerFilterStrategy, outMessage, 
+                                            camelExchange.getOut().getHeaders(), camelExchange);            
+    }
 
     private class CamelOutputStream extends CachedOutputStream {
         private Message outMessage;
@@ -261,8 +269,8 @@
         private void commitOutputMessage() throws IOException {
             Exchange camelExchange = (Exchange)outMessage.get(CxfConstants.CAMEL_EXCHANGE);
             
-            CxfHeaderHelper.propagateCxfToCamel(headerFilterStrategy, outMessage, 
-                                                camelExchange.getOut().getHeaders(), camelExchange);
+            propagateResponseHeadersToCamel(outMessage, camelExchange);
+            
             CachedOutputStream outputStream = (CachedOutputStream)outMessage.getContent(OutputStream.class);
             camelExchange.getOut().setBody(outputStream.getBytes());
             getLogger().log(Level.FINE, "send the response message: " + outputStream);

Modified: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/cxfbean/CxfBeanTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/cxfbean/CxfBeanTest.java?rev=789534&r1=789533&r2=789534&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/cxfbean/CxfBeanTest.java (original)
+++ camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/cxfbean/CxfBeanTest.java Tue Jun 30 01:51:27 2009
@@ -27,8 +27,6 @@
 import org.apache.commons.httpclient.methods.PutMethod;
 import org.apache.commons.httpclient.methods.RequestEntity;
 import org.apache.commons.httpclient.methods.StringRequestEntity;
-import org.apache.cxf.helpers.IOUtils;
-import org.apache.cxf.io.CachedOutputStream;
 import org.junit.Before;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -119,5 +117,23 @@
         }
 
     }
+    
+    @Test
+    public void testPostConsumerUniqueResponseCode() throws Exception {
+        PostMethod post = new PostMethod("http://localhost:9000/customerservice/customersUniqueResponseCode");
+        post.addRequestHeader("Accept" , "text/xml");
+        RequestEntity entity = new StringRequestEntity(POST_REQUEST, "text/xml", "ISO-8859-1");
+        post.setRequestEntity(entity);
+        HttpClient httpclient = new HttpClient();
+
+        try {
+            assertEquals(301, httpclient.executeMethod(post));
+            assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Customer><id>125</id><name>Jack</name></Customer>",
+                    post.getResponseBodyAsString());
+        } finally {
+            post.releaseConnection();
+        }
+
+    }
 
 }

Modified: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerService.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerService.java?rev=789534&r1=789533&r2=789534&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerService.java (original)
+++ camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerService.java Tue Jun 30 01:51:27 2009
@@ -72,9 +72,19 @@
         customer.setId(++currentId);
 
         customers.put(customer.getId(), customer);
-
+        
         return Response.ok(customer).build();
     }
+    
+    @POST
+    @Path("/customersUniqueResponseCode/")
+    public Response addCustomerUniqueResponseCode(Customer customer) {
+        customer.setId(++currentId);
+
+        customers.put(customer.getId(), customer);
+        
+        return Response.status(301).entity(customer).build();
+    }
 
     @DELETE
     @Path("/customers/{id}/")