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}/")