You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2009/12/01 10:51:55 UTC
svn commit: r885705 - in /camel/trunk/components/camel-cxf/src:
main/java/org/apache/camel/component/cxf/
main/java/org/apache/camel/component/cxf/jaxrs/
test/java/org/apache/camel/component/cxf/jaxrs/
test/java/org/apache/camel/component/cxf/jaxrs/tes...
Author: ningjiang
Date: Tue Dec 1 09:51:54 2009
New Revision: 885705
URL: http://svn.apache.org/viewvc?rev=885705&view=rev
Log:
CAMEL-2242 support to call the WebClient.invokeAndGetCollection()
Modified:
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/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/CxfRsRouterTest.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/CxfConstants.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConstants.java?rev=885705&r1=885704&r2=885705&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 Tue Dec 1 09:51:54 2009
@@ -45,7 +45,9 @@
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_RESPONSE_GENERIC_TYPE = "CamelCxfRsResponseGenericType";
String CAMEL_CXF_RS_QUERY_MAP = "CamelCxfRsQueryMap";
+ String CAMEL_CXF_RS_EXTRACT_ENTITY = "CamelCxfRsExtractEntity";
String CAMEL_CXF_RS_OPERATION_RESOURCE_INFO_STACK = "CamelCxfRsOperationResourceInfoStack";
String CAMEL_CXF_ATTACHMENTS = "CamelAttachments";
}
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=885705&r1=885704&r2=885705&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 Tue Dec 1 09:51:54 2009
@@ -18,10 +18,15 @@
package org.apache.camel.component.cxf.jaxrs;
import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
+
import javax.ws.rs.core.Response;
+import org.apache.camel.CamelException;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.component.cxf.CxfConstants;
@@ -33,6 +38,7 @@
import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
import org.apache.cxf.jaxrs.client.WebClient;
+
/**
* CxfRsProducer binds a Camel exchange to a CXF exchange, acts as a CXF
* JAXRS client, it will turn the normal Object invocation to a RESTful request
@@ -72,10 +78,10 @@
@SuppressWarnings("unchecked")
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);
+ 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);
+ Type genericType = inMessage.getHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_GENERIC_TYPE, Type.class);
String path = inMessage.getHeader(Exchange.HTTP_PATH, String.class);
if (LOG.isTraceEnabled()) {
@@ -118,9 +124,17 @@
exchange));
// invoke the client
- Object response = null;
+ Object response = null;
if (responseClass == null || Response.class.equals(responseClass)) {
response = client.invoke(httpMethod, body);
+ } else if (Collection.class.isAssignableFrom(responseClass)) {
+ if (genericType instanceof ParameterizedType) {
+ // Get the collection member type first
+ Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments();
+ response = client.invokeAndGetCollection(httpMethod, body, (Class)actualTypeArguments[0]);
+ } else {
+ throw new CamelException("Can't find the Collection member type");
+ }
} else {
response = client.invoke(httpMethod, body, responseClass);
}
@@ -129,8 +143,7 @@
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));
}
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=885705&r1=885704&r2=885705&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 Tue Dec 1 09:51:54 2009
@@ -103,6 +103,8 @@
copyMessageHeader(cxfMessage, camelMessage, org.apache.cxf.message.Message.ACCEPT_CONTENT_TYPE, Exchange.ACCEPT_CONTENT_TYPE);
camelMessage.setHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, method.getReturnType());
+
+ camelMessage.setHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_GENERIC_TYPE, method.getGenericReturnType());
copyOperationResourceInfoStack(cxfMessage, camelMessage);
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=885705&r1=885704&r2=885705&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 Tue Dec 1 09:51:54 2009
@@ -54,6 +54,22 @@
}
@Test
+ public void testGetCustomers() throws Exception {
+ GetMethod get = new GetMethod("http://localhost:9000/customerservice/customers/");
+ get.addRequestHeader("Accept" , "application/xml");
+
+ HttpClient httpclient = new HttpClient();
+
+ try {
+ assertEquals(200, httpclient.executeMethod(get));
+ assertEquals("<Customers><Customer><id>123</id><name>John</name></Customer><Customer><id>113</id><name>Dan</name></Customer></Customers>",
+ get.getResponseBodyAsString());
+ } finally {
+ get.releaseConnection();
+ }
+ }
+
+ @Test
public void testGetSubResource() throws Exception {
GetMethod get = new GetMethod("http://localhost:9000/customerservice/orders/223/products/323");
get.addRequestHeader("Accept" , "application/json");
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=885705&r1=885704&r2=885705&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 Dec 1 09:51:54 2009
@@ -16,7 +16,9 @@
*/
package org.apache.camel.component.cxf.jaxrs.testbean;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import javax.ws.rs.DELETE;
@@ -25,6 +27,7 @@
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
@@ -50,6 +53,14 @@
Customer c = customers.get(idNumber);
return c;
}
+
+ @GET
+ @Path("/customers/")
+ @Produces("application/xml")
+ public List<Customer> getCustomers() {
+ List<Customer> l = new ArrayList<Customer>(customers.values());
+ return l;
+ }
@PUT
@Path("/customers/")