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/06/22 13:52:47 UTC

svn commit: r787210 - 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/

Author: ningjiang
Date: Mon Jun 22 11:52:47 2009
New Revision: 787210

URL: http://svn.apache.org/viewvc?rev=787210&view=rev
Log:
CAMEL-1737 support http central client API in camel-cxfrs producer

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/CxfRsEndpoint.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
    camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.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=787210&r1=787209&r2=787210&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 Mon Jun 22 11:52:47 2009
@@ -42,6 +42,9 @@
     String CAMEL_TRANSPORT_PREFIX = "camel:";
     String CXF_EXCHANGE = "org.apache.cxf.message.exchange";
     String CAMEL_EXCHANGE = "org.apache.camel.exchange";
+    String CAMEL_CXF_RS_USING_HTTP_API = "CamelCxfRsUsingHttpAPI";
+    String CAMEL_CXF_RS_VAR_VALUES = "CamelCxfRsVarValues";
+    String CAMEL_CXF_RS_RESPONSE_CLASS = "CamelCxfRsResponseClass";
 }
 
 

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=787210&r1=787209&r2=787210&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 Mon Jun 22 11:52:47 2009
@@ -90,7 +90,9 @@
     protected void setupJAXRSClientFactoryBean(JAXRSClientFactoryBean cfb) {        
         // address
         cfb.setAddress(getEndpointUri());
-        cfb.setResourceClass(getResourceClasses().get(0));
+        if (getResourceClasses() != null) {
+            cfb.setResourceClass(getResourceClasses().get(0));
+        }    
     }
    
     public JAXRSServerFactoryBean createJAXRSServerFactoryBean() {

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=787210&r1=787209&r2=787210&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 Mon Jun 22 11:52:47 2009
@@ -17,9 +17,12 @@
 
 package org.apache.camel.component.cxf.jaxrs;
 
+import java.io.InputStream;
 import java.lang.reflect.Method;
 import java.util.List;
 
+import javax.ws.rs.core.Response;
+
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
@@ -28,6 +31,7 @@
 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;
 
 /**
  * CxfRsProducer binds a Camel exchange to a CXF exchange, acts as a CXF 
@@ -44,7 +48,38 @@
 
     public void process(Exchange exchange) throws Exception {
         Message inMessage = exchange.getIn();
-        Object[] varValues = inMessage.getHeader("VarValues", Object[].class);
+        Boolean httpClientAPI = inMessage.getHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.class);
+        if (httpClientAPI != null && httpClientAPI.booleanValue()) {
+            invokeHttpClient(exchange);
+        } else {
+            invokeProxyClient(exchange);            
+        }
+        
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void invokeHttpClient(Exchange exchange) {
+        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_RELATIVE_PATH, String.class);
+        client.path(path);
+        Object body = inMessage.getBody();
+        Object response = null;
+        if (responseClass == null) {
+            response = client.invoke(httpMethod, body, InputStream.class);
+        } else {
+            response = client.invoke(httpMethod, body, responseClass);
+        }
+        if (exchange.getPattern().isOutCapable()) {
+            exchange.getOut().setBody(response);
+        }
+    }
+
+    private void invokeProxyClient(Exchange exchange) throws Exception {
+        Message inMessage = exchange.getIn();
+        Object[] varValues = inMessage.getHeader(CxfConstants.CAMEL_CXF_RS_VAR_VALUES, Object[].class);
         String methodName = inMessage.getHeader(CxfConstants.OPERATION_NAME, String.class);
         Client target = null;
         if (varValues == null) {

Modified: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java?rev=787210&r1=787209&r2=787210&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java (original)
+++ camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java Mon Jun 22 11:52:47 2009
@@ -35,7 +35,7 @@
     }
     
     @Test
-    public void testGetConstumer() {
+    public void testGetConstumerWithClientProxyAPI() {
         // START SNIPPET: example
         Exchange exchange = template.send("direct:start", new Processor() {
 
@@ -44,6 +44,8 @@
                 Message inMessage = exchange.getIn();
                 // set the operation name 
                 inMessage.setHeader(CxfConstants.OPERATION_NAME, "getCustomer");
+                // using the proxy client API
+                inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.FALSE);
                 // set the parameters , if you just have one parameter 
                 // camel will put this object into an Object[] itself
                 inMessage.setBody("123");
@@ -60,5 +62,36 @@
         // END SNIPPET: example        
     }
     
+    @Test
+    public void testGetConstumerWithHttpCentralClientAPI() {
+     // START SNIPPET: example-http
+        Exchange exchange = template.send("direct:start", new Processor() {
+
+            public void process(Exchange exchange) throws Exception {
+                exchange.setPattern(ExchangePattern.InOut);
+                Message inMessage = exchange.getIn();
+                // using the http central client API
+                inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.TRUE);
+                // set the Http method
+                inMessage.setHeader(Exchange.HTTP_METHOD, "GET");
+                // set the relative path
+                inMessage.setHeader(Exchange.HTTP_RELATIVE_PATH, "/customerservice/customers/123");                
+                // Specify the response class , cxfrs will use InputStream as the response object type 
+                inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, Customer.class);
+                // since we use the Get method, so we don't need to set the message body
+                inMessage.setBody(null);                
+            }
+            
+        });
+     
+        // get the response message 
+        Customer response = (Customer) exchange.getOut().getBody();
+        
+        assertNotNull("The response should not be null ", response);
+        assertEquals("Get a wrong customer id ", String.valueOf(response.getId()), "123");
+        assertEquals("Get a wrong customer name", response.getName(), "John");
+        // END SNIPPET: example-http 
+    }
+    
 
 }