CAMEL-7701

- more liberal choice of right method in proxy-client cxfrs
- remove Content-Type header propagation from Camel to  CXFRS


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/d63a7916
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d63a7916
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d63a7916

Branch: refs/heads/camel-2.12.x
Commit: d63a7916645ba56ee1282608a9f553ad4143a09c
Parents: ff70262
Author: Benjamin BONNET <benjamin.bon...@m4x.org>
Authored: Thu Aug 14 23:55:31 2014 +0200
Committer: Willem Jiang <willem.ji...@gmail.com>
Committed: Mon Aug 18 21:21:50 2014 +0800

----------------------------------------------------------------------
 .../component/cxf/jaxrs/CxfRsProducer.java      |  23 +--
 .../cxf/jaxrs/DefaultCxfRsBinding.java          |   1 -
 .../component/cxf/jaxrs/CxfRsRelayTest.java     | 140 +++++++++++++++++++
 .../component/cxf/jaxrs/UploadService.java      |  35 +++++
 .../component/cxf/jaxrs/CxfRsSpringRelay.xml    |  28 ++++
 5 files changed, 218 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/d63a7916/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
index d4bbca7..356e199 100644
--- 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
+++ 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
@@ -278,20 +278,27 @@ public class CxfRsProducer extends DefaultProducer {
     }
 
     private Method findRightMethod(List<Class<?>> resourceClasses, String 
methodName, Class<?>[] parameterTypes) throws NoSuchMethodException {
-        Method answer = null;
         for (Class<?> clazz : resourceClasses) {
             try {
-                answer = clazz.getMethod(methodName, parameterTypes);
-            } catch (NoSuchMethodException ex) {
-                // keep looking 
+                Method[] m = clazz.getMethods();
+                iterate_on_methods: for (Method method : m) {
+                    if (!method.getName().equals(methodName))
+                        continue;
+                    Class<?>[] params = method.getParameterTypes();
+                    if (params.length != parameterTypes.length)
+                        continue;
+                    for (int i = 0; i < parameterTypes.length; i++) {
+                        if (!params[i].isAssignableFrom(parameterTypes[i])) {
+                            continue iterate_on_methods;
+                        }
+                    }
+                    return method;
+                }
             } catch (SecurityException ex) {
                 // keep looking
             }
-            if (answer != null) {
-                return answer;
-            }
         }
-        throw new NoSuchMethodException("Cannot find method with name: " + 
methodName + " having parameters: " + arrayToString(parameterTypes));
+        throw new NoSuchMethodException("Cannot find method with name: " + 
methodName + " having parameters assignable from: " + 
arrayToString(parameterTypes));
     }
 
     private Class<?>[] getParameterTypes(Object[] objects) {

http://git-wip-us.apache.org/repos/asf/camel/blob/d63a7916/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java
 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java
index d72ceab..664ebe3 100644
--- 
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java
+++ 
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java
@@ -58,7 +58,6 @@ public class DefaultCxfRsBinding implements CxfRsBinding, 
HeaderFilterStrategyAw
         camelToCxfHeaderMap.put(Exchange.HTTP_URI, 
org.apache.cxf.message.Message.REQUEST_URI);
         camelToCxfHeaderMap.put(Exchange.HTTP_METHOD, 
org.apache.cxf.message.Message.HTTP_REQUEST_METHOD);
         camelToCxfHeaderMap.put(Exchange.HTTP_PATH, 
org.apache.cxf.message.Message.PATH_INFO);
-        camelToCxfHeaderMap.put(Exchange.CONTENT_TYPE, 
org.apache.cxf.message.Message.CONTENT_TYPE);
         camelToCxfHeaderMap.put(Exchange.HTTP_CHARACTER_ENCODING, 
org.apache.cxf.message.Message.ENCODING);
         camelToCxfHeaderMap.put(Exchange.HTTP_QUERY, 
org.apache.cxf.message.Message.QUERY_STRING);
         camelToCxfHeaderMap.put(Exchange.ACCEPT_CONTENT_TYPE, 
org.apache.cxf.message.Message.ACCEPT_CONTENT_TYPE);

http://git-wip-us.apache.org/repos/asf/camel/blob/d63a7916/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRelayTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRelayTest.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRelayTest.java
new file mode 100644
index 0000000..6c5c227
--- /dev/null
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRelayTest.java
@@ -0,0 +1,140 @@
+package org.apache.camel.component.cxf.jaxrs;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.spring.Main;
+import org.apache.camel.test.junit4.TestSupport;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
+import org.apache.cxf.jaxrs.ext.multipart.Multipart;
+import org.junit.Test;
+
+public class CxfRsRelayTest extends TestSupport {
+       /**
+        * A sample service "interface" (technically, it is a class since we 
will
+        * use proxy-client. That interface exposes three methods over-loading 
each
+        * other : we are testing the appropriate one will be chosen at runtime.
+        * 
+        */
+       @WebService
+       @Path("/rootpath")
+       @Consumes("multipart/form-data")
+       @Produces("application/xml")
+       public static class UploadService {
+               @WebMethod
+               @POST
+               @Path("/path1")
+               @Consumes("multipart/form-data")
+               public void upload(
+                               @Multipart(value = "content", type = 
"application/octet-stream") java.lang.Number content,
+                               @Multipart(value = "name", type = "text/plain") 
String name) {
+               }
+
+               @WebMethod
+               @GET
+               @Path("/path2")
+               @Consumes("text/plain")
+               private void upload() {
+               }
+
+               @WebMethod
+               @POST
+               @Path("/path3")
+               @Consumes("multipart/form-data")
+               public void upload(
+                               @Multipart(value = "content", type = 
"application/octet-stream") InputStream content,
+                               @Multipart(value = "name", type = "text/plain") 
String name) {
+               }
+
+       }
+
+       private static final String SAMPLE_CONTENT_PATH = 
"/org/apache/camel/component/cxf/jaxrs/CxfRsSpringRelay.xml";
+       private static final String SAMPLE_NAME = "CxfRsSpringRelay.xml";
+       private static final CountDownLatch latch = new CountDownLatch(1);
+       private static String content;
+       private static String name;
+
+       /**
+        * That test builds a route chaining two cxfrs endpoints. It shows a 
request
+        * sent to the first one will be correctly transferred and consumed by 
the
+        * other one.
+        */
+       @Test
+       public void test() throws Exception {
+               final Main main = new Main();
+               try {
+                       
main.setApplicationContextUri("org/apache/camel/component/cxf/jaxrs/CxfRsSpringRelay.xml");
+                       main.start();
+                       latch.await(10, TimeUnit.SECONDS);
+                       assertEquals(SAMPLE_NAME, name);
+                       StringWriter writer = new StringWriter();
+                       IOUtils.copyAndCloseInput(
+                                       new 
InputStreamReader(CamelRouteBuilder.class
+                                                       
.getResourceAsStream(SAMPLE_CONTENT_PATH)), writer);
+                       assertEquals(writer.toString(), content);
+               } finally {
+                       main.stop();
+               }
+       }
+
+       /**
+        * Route builder to be used with
+        * org/apache/camel/component/cxf/jaxrs/CxfRsSpringRelay.xml
+        * 
+        */
+       public static class CamelRouteBuilder extends RouteBuilder {
+               @Override
+               public void configure() throws InterruptedException {
+                       from("upload1").process(new Processor() {
+                               @Override
+                               public void process(Exchange arg0) throws 
Exception {
+                                       // 
arg0.getIn().removeHeader(Exchange.CONTENT_TYPE);
+                               }
+                       }).to("upload2Client");
+                       from("upload2").process(new Processor() {
+                               @Override
+                               public void process(Exchange exchange) throws 
Exception {
+                                       // once the message arrives in the 
second endpoint, stores
+                                       // the message components and warns 
results can be compared
+                                       content = 
(exchange.getIn().getHeader("content", String.class));
+                                       name = 
(exchange.getIn().getHeader("name", String.class));
+                                       latch.countDown();
+                               }
+                       });
+                       Thread t = new Thread(new Runnable() {
+                               /**
+                                * Sends a request to the first endpoint in the 
route
+                                */
+                               public void run() {
+                                       try {
+                                               JAXRSClientFactory
+                                                               
.create(getContext().getEndpoint("upload1", CxfRsEndpoint.class).getAddress(),
+                                                                               
UploadService.class)
+                                                               
.upload(CamelRouteBuilder.class
+                                                                               
.getResourceAsStream(SAMPLE_CONTENT_PATH),
+                                                                               
SAMPLE_NAME);
+                                       } catch (Exception e) {
+                                               e.printStackTrace();
+                                               throw new RuntimeException(e);
+                                       }
+                               }
+                       });
+                       t.start();
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/d63a7916/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/UploadService.java
----------------------------------------------------------------------
diff --git 
a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/UploadService.java
 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/UploadService.java
new file mode 100644
index 0000000..a9c65be
--- /dev/null
+++ 
b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/UploadService.java
@@ -0,0 +1,35 @@
+package org.apache.camel.component.cxf.jaxrs;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import org.apache.cxf.jaxrs.ext.multipart.Multipart;
+
+@WebService
+@Path("/cms")
+@Consumes("multipart/form-data")
+@Produces("application/xml")
+public  class UploadService {
+       @WebMethod
+       @POST
+       @Path("/upload2")
+       @Consumes("multipart/form-data")
+       public void addVideo(
+                       @Multipart(value = "contenu", type = 
"application/octet-stream") java.lang.Number video,
+                       @Multipart(value = "nom", type = "text/plain") String 
nom) {
+       }
+
+       @WebMethod
+       @POST
+       @Path("/upload")
+       @Consumes("multipart/form-data")
+       public void addVideo(
+                       @Multipart(value = "contenu", type = 
"application/octet-stream") java.io.InputStream video,
+                       @Multipart(value = "nom", type = "text/plain") String 
nom) {
+       }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/d63a7916/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsSpringRelay.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsSpringRelay.xml
 
b/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsSpringRelay.xml
new file mode 100644
index 0000000..c5a844e
--- /dev/null
+++ 
b/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsSpringRelay.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans";
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:camel="http://camel.apache.org/schema/spring";
+       xmlns:cxf="http://camel.apache.org/schema/cxf"; 
+       xsi:schemaLocation="http://camel.apache.org/schema/cxf 
http://camel.apache.org/schema/cxf/camel-cxf.xsd
+                        http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
+                        http://camel.apache.org/schema/spring 
http://camel.apache.org/schema/spring/camel-spring.xsd";>
+       <bean id="builder"
+               
class="org.apache.camel.component.cxf.jaxrs.CxfRsRelayTest.CamelRouteBuilder" />
+       <camel:camelContext id="cxfrs_context">
+               <camel:routeBuilder ref="builder" />
+               <camel:endpoint id="upload1"
+                       uri="cxfrs:bean:rsServer1?bindingStyle=SimpleConsumer" 
/>
+               <camel:endpoint id="upload2"
+                       uri="cxfrs:bean:rsServer2?bindingStyle=SimpleConsumer" 
/>
+               <camel:endpoint id="upload2Client"
+                       uri="cxfrs:bean:rsClient2?httpClientAPI=false" />
+       </camel:camelContext>
+       <cxf:rsServer id="rsServer1" address="http://localhost:9002/rest";
+               
serviceClass="org.apache.camel.component.cxf.jaxrs.CxfRsRelayTest.UploadService"
+               loggingFeatureEnabled="true" loggingSizeLimit="5000" />
+       <cxf:rsServer id="rsServer2" address="http://localhost:9002/rast";
+               
serviceClass="org.apache.camel.component.cxf.jaxrs.CxfRsRelayTest.UploadService"
+               loggingFeatureEnabled="true" loggingSizeLimit="5000" />
+       <cxf:rsClient id="rsClient2" address="http://localhost:9002/rast";
+               
serviceClass="org.apache.camel.component.cxf.jaxrs.CxfRsRelayTest.UploadService"
+               loggingFeatureEnabled="true" loggingSizeLimit="5000" />
+</beans>
\ No newline at end of file

Reply via email to