This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch 2.13.x in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 3706ce0eb3e5db4a7557ec491cd47027d555d847 Author: Lukas Lowinger <[email protected]> AuthorDate: Mon Nov 21 15:49:21 2022 +0100 Extend tests with RAW and CXF_MESSAGE dataFormats --- .../cxf/soap/client/it/CxfSoapClientResource.java | 20 +++++++ .../cxf/soap/client/it/CxfSoapClientRoutes.java | 43 +++++++++++++- .../cxf/soap/client/it/CxfSoapClientTest.java | 17 ++++++ .../cxf/soap/server/it/CxfSoapRoutes.java | 69 ++++++++++++++++++++++ .../cxf/soap/server/it/CxfSoapServiceTest.java | 8 +++ 5 files changed, 155 insertions(+), 2 deletions(-) diff --git a/integration-test-groups/cxf-soap/cxf-soap-client/src/main/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientResource.java b/integration-test-groups/cxf-soap/cxf-soap-client/src/main/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientResource.java index 7485357953..4ecee01f68 100644 --- a/integration-test-groups/cxf-soap/cxf-soap-client/src/main/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientResource.java +++ b/integration-test-groups/cxf-soap/cxf-soap-client/src/main/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientResource.java @@ -17,6 +17,8 @@ package org.apache.camel.quarkus.component.cxf.soap.client.it; import java.net.URI; +import java.util.LinkedHashMap; +import java.util.Map; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; @@ -53,6 +55,24 @@ public class CxfSoapClientResource { .build(); } + @Path("/simpleAddDataFormat") + @POST + @Consumes(MediaType.WILDCARD) + @Produces(MediaType.TEXT_PLAIN) + public Response sendSimpleAddRequestDataFormat(@QueryParam("a") int a, + @QueryParam("b") int b, @QueryParam("endpointDataFormat") String endpointDataFormat) throws Exception { + Map<String, Object> headers = new LinkedHashMap<>(); + headers.put("endpointDataFormat", endpointDataFormat); + + final String response = producerTemplate.requestBodyAndHeaders("direct:simpleAddDataFormat", new int[] { a, b }, + headers, + String.class); + return Response + .created(new URI("https://camel.apache.org/")) + .entity(response) + .build(); + } + @Path("/operandsAdd") @POST @Consumes(MediaType.WILDCARD) diff --git a/integration-test-groups/cxf-soap/cxf-soap-client/src/main/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientRoutes.java b/integration-test-groups/cxf-soap/cxf-soap-client/src/main/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientRoutes.java index c2f5d97823..1f82daac7a 100644 --- a/integration-test-groups/cxf-soap/cxf-soap-client/src/main/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientRoutes.java +++ b/integration-test-groups/cxf-soap/cxf-soap-client/src/main/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientRoutes.java @@ -16,12 +16,22 @@ */ package org.apache.camel.quarkus.component.cxf.soap.client.it; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Map; + import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.context.SessionScoped; import javax.enterprise.inject.Produces; import javax.inject.Inject; import javax.inject.Named; +import javax.xml.soap.MessageFactory; +import javax.xml.soap.SOAPMessage; +import com.sun.xml.messaging.saaj.soap.ver1_1.Message1_1Impl; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.cxf.common.DataFormat; import org.apache.camel.component.cxf.common.message.CxfConstants; import org.apache.camel.component.cxf.jaxws.CxfEndpoint; import org.apache.cxf.ext.logging.LoggingFeature; @@ -38,16 +48,45 @@ public class CxfSoapClientRoutes extends RouteBuilder { @ConfigProperty(name = "camel-quarkus.it.calculator.baseUri") String serviceBaseUri; + public static final String MESSAGE_RAW_SIMPLE_ADD = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://www.jboss.org/eap/quickstarts/wscalculator/Calculator\">\n" + + + " <soapenv:Header/>\n" + + " <soapenv:Body>\n" + + " <ser:add>\n" + + " <arg0>%s</arg0>\n" + + " <arg1>%s</arg1>\n" + + " </ser:add>\n" + + " </soapenv:Body>\n" + + "</soapenv:Envelope>"; + @Override public void configure() { from("direct:simpleUriBean") - .to("cxf:bean:soapClientEndpoint?dataFormat=PAYLOAD"); + .to("cxf:bean:soapClientEndpoint?dataFormat=POJO"); from("direct:simpleUriAddress") .to(String.format("cxf://%s?wsdlURL=%s&dataFormat=POJO&serviceClass=%s", calculatorServiceAddress(), calculatorServiceWsdlUrl(), CalculatorService.class.getName())); + from("direct:simpleAddDataFormat") + .process(exchange -> { + Map<String, Object> headers = exchange.getIn().getHeaders(); + String endpointDataFormat = headers.get("endpointDataFormat").toString(); + int[] numbers = exchange.getIn().getBody(int[].class); + String xmlRequest = String.format(MESSAGE_RAW_SIMPLE_ADD, numbers[0], numbers[1]); + if (DataFormat.RAW.name().equals(endpointDataFormat)) { + exchange.getIn().setBody(xmlRequest); + } else if (DataFormat.CXF_MESSAGE.name().equals(endpointDataFormat)) { + try (InputStream is = new ByteArrayInputStream(xmlRequest.getBytes(StandardCharsets.UTF_8))) { + SOAPMessage requestMsg = MessageFactory.newInstance().createMessage(null, is); + exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, "add"); + exchange.getIn().setBody(new Message1_1Impl(requestMsg)); + } + } + }) + .toD("cxf:bean:soapClientEndpoint?dataFormat=${header.endpointDataFormat}"); + from("direct:operandsAdd") .setHeader(CxfConstants.OPERATION_NAME).constant("addOperands") .to("cxf:bean:soapClientEndpoint?dataFormat=POJO"); @@ -63,7 +102,7 @@ public class CxfSoapClientRoutes extends RouteBuilder { } @Produces - @ApplicationScoped + @SessionScoped @Named CxfEndpoint soapClientEndpoint() { final CxfEndpoint result = new CxfEndpoint(); diff --git a/integration-test-groups/cxf-soap/cxf-soap-client/src/test/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientTest.java b/integration-test-groups/cxf-soap/cxf-soap-client/src/test/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientTest.java index d5f41a787b..236c35295f 100644 --- a/integration-test-groups/cxf-soap/cxf-soap-client/src/test/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientTest.java +++ b/integration-test-groups/cxf-soap/cxf-soap-client/src/test/java/org/apache/camel/quarkus/component/cxf/soap/client/it/CxfSoapClientTest.java @@ -27,6 +27,8 @@ import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; import io.restassured.RestAssured; import org.eclipse.microprofile.config.ConfigProvider; +import org.hamcrest.CoreMatchers; +import org.hamcrest.Matchers; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -52,6 +54,21 @@ class CxfSoapClientTest { .body(equalTo("3")); } + @ParameterizedTest + @ValueSource(strings = { "RAW", "CXF_MESSAGE" }) + public void simpleSoapClientDataFormats(String endpointDataformat) { + RestAssured.given() + .queryParam("a", "9") + .queryParam("b", "3") + .queryParam("endpointDataFormat", endpointDataformat) + .post("/cxf-soap/client/simpleAddDataFormat") + .then() + .statusCode(201) + .body(Matchers.hasXPath( + "/*[local-name() = 'Envelope']/*[local-name() = 'Body']/*[local-name() = 'addResponse']/*[local-name() = 'return']/text()", + CoreMatchers.is("12"))); + } + @Test public void complexSoapClient() { RestAssured.given() diff --git a/integration-test-groups/cxf-soap/cxf-soap-server/src/main/java/org/apache/camel/quarkus/component/cxf/soap/server/it/CxfSoapRoutes.java b/integration-test-groups/cxf-soap/cxf-soap-server/src/main/java/org/apache/camel/quarkus/component/cxf/soap/server/it/CxfSoapRoutes.java index 42a515ce8b..46fa8ad7a0 100644 --- a/integration-test-groups/cxf-soap/cxf-soap-server/src/main/java/org/apache/camel/quarkus/component/cxf/soap/server/it/CxfSoapRoutes.java +++ b/integration-test-groups/cxf-soap/cxf-soap-server/src/main/java/org/apache/camel/quarkus/component/cxf/soap/server/it/CxfSoapRoutes.java @@ -16,16 +16,30 @@ */ package org.apache.camel.quarkus.component.cxf.soap.server.it; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; import javax.inject.Inject; import javax.inject.Named; +import javax.xml.soap.MessageFactory; +import javax.xml.soap.SOAPMessage; +import javax.xml.xpath.XPathConstants; + +import org.w3c.dom.Element; import com.helloworld.service.CodeFirstService; import com.helloworld.service.HelloPortType; +import com.sun.xml.messaging.saaj.soap.ver1_1.Message1_1Impl; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.cxf.common.DataFormat; import org.apache.camel.component.cxf.jaxws.CxfEndpoint; +import org.apache.camel.converter.jaxp.XmlConverter; +import org.apache.camel.util.xml.StringSource; import org.apache.cxf.ext.logging.LoggingFeature; +import org.apache.cxf.helpers.XPathUtils; @ApplicationScoped public class CxfSoapRoutes extends RouteBuilder { @@ -34,6 +48,14 @@ public class CxfSoapRoutes extends RouteBuilder { @Named("loggingFeatureServer") LoggingFeature loggingFeature; + public static final String response = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://it.server.soap.cxf.component.quarkus.camel.apache.org/\">\n" + + + " <soapenv:Header/>\n" + + " <soapenv:Body>\n" + + " <ser:echoResponse><return>%s</return></ser:echoResponse>\n" + + " </soapenv:Body>\n" + + "</soapenv:Envelope>"; + @Override public void configure() { /* Service */ @@ -47,6 +69,29 @@ public class CxfSoapRoutes extends RouteBuilder { from("cxf:bean:codeFirstServiceEndpoint") .setBody().constant("Hello CamelQuarkusCXF"); + from("cxf:bean:echoServiceResponseFromRouteCxfMessageDataFormat") + .process(exchange -> { + SOAPMessage requestMsg = exchange.getIn().getBody(SOAPMessage.class); + String requestText = requestMsg.getSOAPBody().getElementsByTagName("arg0").item(0).getFirstChild() + .getNodeValue(); + String xmlResponse = String.format(response, requestText + " from Camel route"); + try (InputStream is = new ByteArrayInputStream(xmlResponse.getBytes(StandardCharsets.UTF_8))) { + SOAPMessage responseMsg = MessageFactory.newInstance().createMessage(null, is); + + exchange.getIn().setBody(new Message1_1Impl(responseMsg)); + } + }); + + from("cxf:bean:echoServiceResponseFromRouteRawDataFormat") + .process(exchange -> { + String rawXmlRequest = exchange.getIn().getBody(String.class); + XPathUtils xu = new XPathUtils(); + Element body = new XmlConverter().toDOMElement(new StringSource(rawXmlRequest)); + String requestMsg = ((Element) xu.getValue("//arg0", body, XPathConstants.NODE)).getTextContent(); + + exchange.getIn().setBody(String.format(response, requestMsg + " from Camel route")); + }); + from("cxf:bean:echoServiceResponseFromRoute") .setBody(exchange -> exchange.getMessage().getBody(String.class) + " from Camel route"); @@ -87,6 +132,30 @@ public class CxfSoapRoutes extends RouteBuilder { return result; } + @Produces + @ApplicationScoped + @Named + CxfEndpoint echoServiceResponseFromRouteRawDataFormat() { + final CxfEndpoint result = new CxfEndpoint(); + result.setServiceClass(EchoServiceImpl.class); + result.setAddress("/echo-route-raw-data-format"); + result.setDataFormat(DataFormat.RAW); + result.getFeatures().add(loggingFeature); + return result; + } + + @Produces + @ApplicationScoped + @Named + CxfEndpoint echoServiceResponseFromRouteCxfMessageDataFormat() { + final CxfEndpoint result = new CxfEndpoint(); + result.setServiceClass(EchoServiceImpl.class); + result.setAddress("/echo-route-cxf-message-data-format"); + result.setDataFormat(DataFormat.CXF_MESSAGE); + result.getFeatures().add(loggingFeature); + return result; + } + @Produces @ApplicationScoped @Named diff --git a/integration-test-groups/cxf-soap/cxf-soap-server/src/test/java/org/apache/camel/quarkus/component/cxf/soap/server/it/CxfSoapServiceTest.java b/integration-test-groups/cxf-soap/cxf-soap-server/src/test/java/org/apache/camel/quarkus/component/cxf/soap/server/it/CxfSoapServiceTest.java index b397ac2446..60dec478d7 100644 --- a/integration-test-groups/cxf-soap/cxf-soap-server/src/test/java/org/apache/camel/quarkus/component/cxf/soap/server/it/CxfSoapServiceTest.java +++ b/integration-test-groups/cxf-soap/cxf-soap-server/src/test/java/org/apache/camel/quarkus/component/cxf/soap/server/it/CxfSoapServiceTest.java @@ -73,6 +73,14 @@ class CxfSoapServiceTest { org.junit.jupiter.api.Assertions.assertTrue(response.contains("Hello CamelQuarkusCXF")); } + @ParameterizedTest + @ValueSource(strings = { "raw", "cxf-message" }) + public void testCodeFirstSoapServiceDataFormats(String dataFormat) { + final EchoService echo = QuarkusCxfClientTestUtil.getClient(EchoService.class, + String.format("/soapservice/echo-route-%s-data-format", dataFormat)); + Assertions.assertEquals("Hello there! from Camel route", echo.echo("Hello there!")); + } + @Test public void echoServiceResponseFromRoute() { /* We setServiceClass(EchoServiceImpl.class) in org.apache.camel.quarkus.component.cxf.soap.server.it.CxfSoapRoutes.echoServiceResponseFromRoute()
