Repository: camel Updated Branches: refs/heads/master 6560d5bbf -> e086d29fa
CAMEL-8383: CXFRS Consumer processors should be able to use JAX-RS contexts. Thanks to Sergey for the patch. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e086d29f Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e086d29f Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e086d29f Branch: refs/heads/master Commit: e086d29fa73cf4bcd628f3874a450d8bb662593b Parents: 6560d5b Author: Claus Ibsen <davscl...@apache.org> Authored: Sun Mar 1 09:24:49 2015 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sun Mar 1 09:24:49 2015 +0100 ---------------------------------------------------------------------- .../component/cxf/jaxrs/CxfRsEndpoint.java | 10 ++++ .../camel/component/cxf/jaxrs/CxfRsInvoker.java | 56 ++++++++++++-------- .../component/cxf/jaxrs/CxfRsConsumerTest.java | 28 +++++++++- 3 files changed, 71 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/e086d29f/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java index 3680c58..68a0cbe 100644 --- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java @@ -121,6 +121,8 @@ public class CxfRsEndpoint extends DefaultEndpoint implements HeaderFilterStrate @UriParam private boolean performInvocation; @UriParam + private boolean propagateContexts; + @UriParam private String modelRef; private List<Feature> features = new ModCountCopyOnWriteArrayList<Feature>(); private InterceptorHolder interceptorHolder = new InterceptorHolder(); @@ -621,4 +623,12 @@ public class CxfRsEndpoint extends DefaultEndpoint implements HeaderFilterStrate public void setPerformInvocation(boolean performInvocation) { this.performInvocation = performInvocation; } + + public boolean isPropagateContexts() { + return propagateContexts; + } + + public void setPropagateContexts(boolean propagateContexts) { + this.propagateContexts = propagateContexts; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/e086d29f/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java index 179ec05..fb999f0 100644 --- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java @@ -19,6 +19,10 @@ package org.apache.camel.component.cxf.jaxrs; import java.lang.reflect.Method; import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.Request; +import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.core.UriInfo; import org.apache.camel.AsyncCallback; import org.apache.camel.ExchangePattern; @@ -26,6 +30,10 @@ import org.apache.camel.RuntimeCamelException; import org.apache.cxf.continuations.Continuation; import org.apache.cxf.continuations.ContinuationProvider; import org.apache.cxf.jaxrs.JAXRSInvoker; +import org.apache.cxf.jaxrs.impl.HttpHeadersImpl; +import org.apache.cxf.jaxrs.impl.RequestImpl; +import org.apache.cxf.jaxrs.impl.SecurityContextImpl; +import org.apache.cxf.jaxrs.impl.UriInfoImpl; import org.apache.cxf.jaxrs.model.OperationResourceInfo; import org.apache.cxf.message.Exchange; import org.slf4j.Logger; @@ -74,16 +82,7 @@ public class CxfRsInvoker extends JAXRSInvoker { Object[] paramArray, final Continuation continuation, Object response) throws Exception { synchronized (continuation) { if (continuation.isNew()) { - ExchangePattern ep = ExchangePattern.InOut; - if (method.getReturnType() == Void.class) { - ep = ExchangePattern.InOnly; - } - final org.apache.camel.Exchange camelExchange = endpoint.createExchange(ep); - if (response != null) { - camelExchange.getOut().setBody(response); - } - CxfRsBinding binding = endpoint.getBinding(); - binding.populateExchangeFromCxfRsRequest(cxfExchange, camelExchange, method, paramArray); + final org.apache.camel.Exchange camelExchange = prepareExchange(cxfExchange, method, paramArray, response); // we want to handle the UoW cxfRsConsumer.createUoW(camelExchange); // Now we don't set up the timeout value @@ -120,17 +119,7 @@ public class CxfRsInvoker extends JAXRSInvoker { private Object syncInvoke(Exchange cxfExchange, final Object serviceObject, Method method, Object[] paramArray, Object response) throws Exception { - ExchangePattern ep = ExchangePattern.InOut; - - if (method.getReturnType() == Void.class) { - ep = ExchangePattern.InOnly; - } - org.apache.camel.Exchange camelExchange = endpoint.createExchange(ep); - if (response != null) { - camelExchange.getOut().setBody(response); - } - CxfRsBinding binding = endpoint.getBinding(); - binding.populateExchangeFromCxfRsRequest(cxfExchange, camelExchange, method, paramArray); + final org.apache.camel.Exchange camelExchange = prepareExchange(cxfExchange, method, paramArray, response); // we want to handle the UoW cxfRsConsumer.createUoW(camelExchange); @@ -147,6 +136,31 @@ public class CxfRsInvoker extends JAXRSInvoker { } } + private org.apache.camel.Exchange prepareExchange(Exchange cxfExchange, Method method, + Object[] paramArray, Object response) { + ExchangePattern ep = ExchangePattern.InOut; + if (method.getReturnType() == Void.class) { + ep = ExchangePattern.InOnly; + } + final org.apache.camel.Exchange camelExchange = endpoint.createExchange(ep); + if (response != null) { + camelExchange.getOut().setBody(response); + } + CxfRsBinding binding = endpoint.getBinding(); + binding.populateExchangeFromCxfRsRequest(cxfExchange, camelExchange, method, paramArray); + + // REVISIT: It can be done inside a binding but a propagateContext would need to be passed along as + // the CXF in message property. Question: where should this property name be set up ? + if (endpoint.isPropagateContexts()) { + camelExchange.setProperty(UriInfo.class.getName(), new UriInfoImpl(cxfExchange.getInMessage())); + camelExchange.setProperty(Request.class.getName(), new RequestImpl(cxfExchange.getInMessage())); + camelExchange.setProperty(HttpHeaders.class.getName(), new HttpHeadersImpl(cxfExchange.getInMessage())); + camelExchange.setProperty(SecurityContext.class.getName(), new SecurityContextImpl(cxfExchange.getInMessage())); + } + + return camelExchange; + } + private Object returnResponse(Exchange cxfExchange, org.apache.camel.Exchange camelExchange) throws Exception { if (camelExchange.getException() != null) { Throwable exception = camelExchange.getException(); http://git-wip-us.apache.org/repos/asf/camel/blob/e086d29f/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java index d5153dd..fafccf3 100644 --- a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java +++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java @@ -28,7 +28,9 @@ import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; import org.apache.camel.Exchange; import org.apache.camel.Message; @@ -65,10 +67,14 @@ public class CxfRsConsumerTest extends CamelTestSupport { private static final String CXF_RS_ENDPOINT_URI4 = "cxfrs://http://localhost:" + CXT + "/rest4?" + "modelRef=classpath:/org/apache/camel/component/cxf/jaxrs/CustomerServiceDefaultHandlerModel.xml"; - + private static final String CXF_RS_ENDPOINT_URI5 = + "cxfrs://http://localhost:" + CXT + "/rest5?" + + "propagateContexts=true&" + + "modelRef=classpath:/org/apache/camel/component/cxf/jaxrs/CustomerServiceDefaultHandlerModel.xml"; protected RouteBuilder createRouteBuilder() throws Exception { final Processor testProcessor = new TestProcessor(); final Processor testProcessor2 = new TestProcessor2(); + final Processor testProcessor3 = new TestProcessor3(); return new RouteBuilder() { public void configure() { errorHandler(new NoErrorHandlerBuilder()); @@ -76,6 +82,7 @@ public class CxfRsConsumerTest extends CamelTestSupport { from(CXF_RS_ENDPOINT_URI2).process(testProcessor); from(CXF_RS_ENDPOINT_URI3).process(testProcessor); from(CXF_RS_ENDPOINT_URI4).process(testProcessor2); + from(CXF_RS_ENDPOINT_URI5).process(testProcessor3); } }; } @@ -121,7 +128,10 @@ public class CxfRsConsumerTest extends CamelTestSupport { assertEquals(333L, c.getId()); assertEquals("Barry", c.getName()); } - + @Test + public void testGetCustomerDefaultHandlerAndModelAndContexts() throws Exception { + doTestGetCustomer("rest5"); + } private void doTestGetCustomer(String contextUri) throws Exception { invokeGetCustomer("http://localhost:" + CXT + "/" + contextUri + "/customerservice/customers/126", "{\"Customer\":{\"id\":126,\"name\":\"Willem\"}}"); @@ -263,4 +273,18 @@ public class CxfRsConsumerTest extends CamelTestSupport { } } + private static class TestProcessor3 extends AbstractTestProcessor { + public void process(Exchange exchange) throws Exception { + UriInfo ui = exchange.getProperty(UriInfo.class.getName(), UriInfo.class); + String path = ui.getPath(); + + Request req = exchange.getProperty(Request.class.getName(), Request.class); + String httpMethod = req.getMethod(); + + if (path.startsWith("customerservice/customers") && HttpMethod.GET.equals(httpMethod)) { + processGetCustomer(exchange); + } + } + + } }