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