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