You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ff...@apache.org on 2022/11/23 21:32:34 UTC
[camel-spring-boot] 02/02: [CAMEL-18729]add more tests in camel-cxf-soap-starter
This is an automated email from the ASF dual-hosted git repository.
ffang pushed a commit to branch camel-spring-boot-3.18.x
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git
commit 8ebcf05fac8fe400644cac1fd7b0d96785e5e166
Author: Freeman Fang <fr...@gmail.com>
AuthorDate: Tue Sep 20 16:38:35 2022 -0400
[CAMEL-18729]add more tests in camel-cxf-soap-starter
(cherry picked from commit 9d04c4bfedef9c80b22c533b33da41191415bd7c)
(cherry picked from commit 263ac456dc6fcdcf2b821c95fd2bf0b945f72566)
(cherry picked from commit a5b2a7032fcf8126bd34b121fe798fea18af1004)
---
components-starter/camel-cxf-soap-starter/pom.xml | 76 +-
.../springboot/CxfComponentEnableMtomTest.java | 145 +++
.../soap/springboot/CxfConsumerMessageTest.java | 32 +-
.../CxfConsumerPayLoadConverterTest.java | 9 +-
.../CxfConsumerPayloadFaultCauseEnabledTest.java | 159 ++++
.../soap/springboot/CxfConsumerPayloadTest.java | 38 +-
.../soap/springboot/CxfConsumerProviderTest.java | 16 +-
.../cxf/soap/springboot/CxfEndpointBeanTest.java | 157 ++++
.../springboot/CxfMessageHeaderTimeoutTest.java | 167 ++++
.../cxf/soap/springboot/CxfNonWrapperTest.java | 142 +++
.../cxf/soap/springboot/CxfOneWayRouteTest.java | 219 +++++
.../CxfPayLoadMessageXmlBindingRouterTest.java | 177 ++++
.../springboot/CxfPayLoadSoapHeaderSpringTest.java | 213 +++++
.../CxfSpringCustomizedExceptionTest.java | 146 +++
.../cxf/soap/springboot/CxfSpringRouterTest.java | 163 ++++
.../cxf/soap/springboot/CxfTimeoutTest.java | 266 ++++++
.../springboot/FileToCxfMessageDataFormatTest.java | 176 ++++
.../cxf/soap/springboot/JaxwsTestHandler.java | 82 ++
.../LoggingInterceptorInMessageModeTest.java | 209 +++++
.../cxf/soap/springboot/MultiPartInvokeImpl.java | 52 --
.../cxf/soap/springboot/ServiceProvider.java | 34 -
.../cxf/soap/springboot/SpringBusFactoryTest.java | 70 ++
.../springboot/WriteXmlDeclarationInterceptor.java | 38 -
.../converter/PayLoadConvertToPOJOTest.java | 130 +++
.../dispatch/CxfDispatchMessageTest.java | 159 ++++
.../dispatch/CxfDispatchPayloadTest.java | 161 ++++
.../dispatch/CxfDispatchTestSupport.java | 122 +++
.../dispatch/CxfSoapMessageProviderTest.java | 188 ++++
.../greeterroute/AbstractCXFGreeterRouterTest.java | 132 +++
.../greeterroute/CXFGreeterEnrichTest.java | 120 +++
.../greeterroute/CXFGreeterRouterTest.java | 120 +++
.../CxfGreeterCXFMessageRouterTest.java | 113 +++
.../CxfGreeterCXFMessageWithoutSEIRouterTest.java | 118 +++
.../CxfGreeterConverterRouterTest.java | 117 +++
.../CxfGreeterMessageCamelHttpRouterTest.java | 106 +++
.../greeterroute/CxfGreeterMessageRouterTest.java | 113 +++
.../greeterroute/CxfGreeterPayLoadRouterTest.java | 115 +++
.../CxfGreeterPayLoadWithFeatureRouterTest.java | 115 +++
.../greeterroute/CxfGreeterWSDLOnlyRouterTest.java | 113 +++
.../greeterroute/CxfPayloadProviderRouterTest.java | 186 ++++
.../springboot/jms/CxfEndpointJMSConsumerTest.java | 127 +++
.../mtom/CxfJavaMtomProducerPayloadTest.java | 104 +++
.../mtom/CxfMtomConsumerMutipleParameterTest.java | 152 ++++
.../mtom/CxfMtomConsumerPayloadModeTest.java | 206 +++++
.../soap/springboot/mtom/CxfMtomConsumerTest.java | 168 ++++
.../CxfMtomDisabledConsumerPayloadModeTest.java | 192 ++++
.../CxfMtomDisabledProducerPayloadModeTest.java | 287 ++++++
.../springboot/mtom/CxfMtomPOJOProducerTest.java | 192 ++++
.../mtom/CxfMtomProducerPayloadModeTest.java | 241 +++++
.../mtom/CxfMtomRouterCxfMessageModeTest.java | 102 +++
.../mtom/CxfMtomRouterPayloadMode12Test.java | 109 +++
.../mtom/CxfMtomRouterPayloadModeTest.java | 214 +++++
.../springboot/mtom/CxfMtomRouterRawModeTest.java | 102 +++
.../springboot/mtom/ImageService.java} | 25 +-
.../cxf/soap/springboot/mtom/MtomTestHelper.java | 102 +++
...dConsumerDuplicateNamespaceStreamCacheTest.java | 70 ++
...ConsumerNamespaceOnEnvelopeStreamCacheTest.java | 75 ++
.../CxfPayloadConsumerNamespaceOnEnvelopeTest.java | 150 ++++
...ProducerNamespaceOnEnvelopeStreamCacheTest.java | 84 ++
.../CxfPayloadProducerNamespaceOnEnvelopeTest.java | 151 ++++
.../cxf/soap/springboot/noparam/NoParamTest.java | 125 +++
.../soap/headers/CxfMessageHeadersRelayTest.java | 977 +++++++++++++++++++++
.../{ => springxml}/CXFMultiPartTest.java | 18 +-
.../{ => springxml}/WSSUsernameTokenHandler.java | 2 +-
.../{ => springxml}/WSSUsernameTokenTest.java | 27 +-
.../soap/springboot/ssl/SslBuilderCustomizer.java | 231 +++++
.../cxf/soap/springboot/ssl/SslGlobalTest.java | 250 ++++++
.../component/cxf/soap/springboot/ssl/SslTest.java | 253 ++++++
.../undertowhandler/AccessLogHandlerTest.java | 188 ++++
.../DisallowedMethodsHandlerTest.java | 169 ++++
.../RequestLimitingHandlerTest.java | 191 ++++
.../springboot/wsa/WSAddressingPAYLOADTest.java | 192 ++++
.../cxf/soap/springboot/wsa/WSAddressingTest.java | 189 ++++
.../springboot/wsdl/AbstractCxfWsdlFirstTest.java | 169 ++++
.../cxf/soap/springboot/wsdl/CXFWsdlOnlyTest.java | 234 +++++
.../wsdl/CxfPayloadWsdlWithoutSEITest.java | 168 ++++
.../wsdl/CxfWsdlFirstPayloadModeTest.java | 148 ++++
.../springboot/wsdl/CxfWsdlFirstProcessorTest.java | 185 ++++
.../cxf/soap/springboot/wsdl/CxfWsdlFirstTest.java | 130 +++
.../cxf/soap/springboot/wsdl/OrderTest.java | 156 ++++
.../cxf/soap/springboot/wsrm/WSRMTest.java | 193 ++++
.../cxf/soap/springboot/wssecurity/CxfServer.java | 18 +
.../springboot/wssecurity/WSSecurityRouteTest.java | 319 +++++++
.../org/apache/camel/wsdl_first/PersonImpl.java | 41 +
.../src/test/resources/MultiPartTest.wsdl | 56 --
.../soap/springboot/wssecurity/client/wssec.xml | 129 +++
.../soap/springboot/wssecurity/server/wssec.xml | 151 ++++
.../src/test/resources/routes/MultiPartTest.xml | 4 +-
.../src/test/resources/routes/soap-security.xml | 2 +-
89 files changed, 12501 insertions(+), 281 deletions(-)
diff --git a/components-starter/camel-cxf-soap-starter/pom.xml b/components-starter/camel-cxf-soap-starter/pom.xml
index 11bdee34a66..71c2a91aa13 100644
--- a/components-starter/camel-cxf-soap-starter/pom.xml
+++ b/components-starter/camel-cxf-soap-starter/pom.xml
@@ -57,12 +57,32 @@
<type>test-jar</type>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-cxf-spring-soap</artifactId>
+ <version>${camel-version}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-cxf-soap</artifactId>
+ <version>${camel-version}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http</artifactId>
<version>${camel-version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-jaxb</artifactId>
+ <version>${camel-version}</version>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
@@ -85,6 +105,33 @@
<scope>test</scope>
<version>${cxf-version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-ws-rm</artifactId>
+ <scope>test</scope>
+ <version>${cxf-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-testutils</artifactId>
+ <scope>test</scope>
+ <version>${cxf-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-transports-jms</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.activemq</groupId>
+ <artifactId>activemq-broker</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.activemq</groupId>
+ <artifactId>activemq-kahadb-store</artifactId>
+ <scope>test</scope>
+ </dependency>
<!--START OF GENERATED CODE-->
<dependency>
<groupId>org.apache.camel.springboot</groupId>
@@ -95,31 +142,10 @@
<build>
<plugins>
<plugin>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-codegen-plugin</artifactId>
- <version>${cxf-version}</version>
- <executions>
- <execution>
- <id>generate-sources</id>
- <phase>generate-sources</phase>
- <configuration>
- <fork>${cxf.codegenplugin.forkmode}</fork>
- <additionalJvmArgs>${cxf.codegen.jvmArgs}</additionalJvmArgs>
- <testSourceRoot>${basedir}/target/generated/src/test/java</testSourceRoot>
- <defaultOptions>
- <frontEnd>jaxws21</frontEnd>
- </defaultOptions>
- <wsdlOptions>
- <wsdlOption>
- <wsdl>${basedir}/src/test/resources/MultiPartTest.wsdl</wsdl>
- </wsdlOption>
- </wsdlOptions>
- </configuration>
- <goals>
- <goal>wsdl2java</goal>
- </goals>
- </execution>
- </executions>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <rerunFailingTestsCount>0</rerunFailingTestsCount>
+ </configuration>
</plugin>
</plugins>
</build>
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfComponentEnableMtomTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfComponentEnableMtomTest.java
new file mode 100644
index 00000000000..0d5c74e5a9f
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfComponentEnableMtomTest.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfComponentEnableMtomTest.class,
+ CxfComponentEnableMtomTest.TestConfig.class,
+ CxfAutoConfiguration.class
+})
+public class CxfComponentEnableMtomTest {
+
+ @Autowired
+ private CamelContext camelContext;
+
+
+ @Test
+ public void testIsMtomEnabledEnabledThroughBeanSetter() throws InterruptedException {
+ Endpoint endpoint = camelContext.getEndpoint("cxf:bean:mtomByBeanSetter");
+
+ if (endpoint instanceof CxfEndpoint) {
+ CxfEndpoint cxfEndpoint = (CxfEndpoint) endpoint;
+ assertTrue(cxfEndpoint.isMtomEnabled(), "Mtom should be enabled");
+ } else {
+ fail("CXF Endpoint not found");
+ }
+ }
+
+ @Test
+ public void testIsMtomEnabledEnabledThroughBeanProperties() throws InterruptedException {
+ Endpoint endpoint = camelContext.getEndpoint("cxf:bean:mtomByBeanProperties");
+
+ if (endpoint instanceof CxfEndpoint) {
+ CxfEndpoint cxfEndpoint = (CxfEndpoint) endpoint;
+ assertTrue(cxfEndpoint.isMtomEnabled(), "Mtom should be enabled");
+ } else {
+ fail("CXF Endpoint not found");
+ }
+ }
+
+ @Test
+ public void testIsMtomEnabledEnabledThroughURIProperties() throws InterruptedException {
+ Endpoint endpoint = camelContext.getEndpoint("cxf:bean:mtomByURIProperties?properties.mtom-enabled=true");
+
+ if (endpoint instanceof CxfEndpoint) {
+ CxfEndpoint cxfEndpoint = (CxfEndpoint) endpoint;
+ assertTrue(cxfEndpoint.isMtomEnabled(), "Mtom should be enabled");
+ } else {
+ fail("CXF Endpoint not found");
+ }
+ }
+
+ @Test
+ public void testIsMtomEnabledEnabledThroughQueryParameters() throws InterruptedException {
+ Endpoint endpoint = camelContext.getEndpoint("cxf:bean:mtomByQueryParameters?mtomEnabled=true");
+
+ if (endpoint instanceof CxfEndpoint) {
+ CxfEndpoint cxfEndpoint = (CxfEndpoint) endpoint;
+ assertTrue(cxfEndpoint.isMtomEnabled(), "Mtom should be enabled");
+ } else {
+ fail("CXF Endpoint not found");
+ }
+ }
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+
+ static class TestConfig {
+
+ @Bean("mtomByQueryParameters")
+ public CxfEndpoint mtomByQueryParameters(CamelContext context) {
+ CxfEndpoint endpoint = new CxfSpringEndpoint();
+ return endpoint;
+ }
+
+ @Bean("mtomByURIProperties")
+ public CxfEndpoint mtomByURIProperties() {
+ return new CxfSpringEndpoint();
+ }
+
+ @Bean("mtomByBeanProperties")
+ public CxfEndpoint mtomByBeanProperties() {
+ CxfEndpoint endpoint = new CxfSpringEndpoint();
+ Map<String, Object> properties = new HashMap<>();
+ properties.put(Message.MTOM_ENABLED, true);
+
+ endpoint.setProperties(properties);
+ return endpoint;
+
+ }
+
+ @Bean("mtomByBeanSetter")
+ public CxfEndpoint mtomByBeanSetter() {
+ CxfEndpoint endpoint = new CxfSpringEndpoint();
+ endpoint.setMtomEnabled(true);
+ return endpoint;
+
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerMessageTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerMessageTest.java
index 71c130ba172..fa7c76f7fb5 100644
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerMessageTest.java
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerMessageTest.java
@@ -23,7 +23,8 @@ import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.cxf.jaxws.HelloService;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.HelloService;
import org.apache.camel.spring.boot.CamelAutoConfiguration;
import org.junit.jupiter.api.Test;
@@ -54,6 +55,7 @@ import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
CamelAutoConfiguration.class,
CxfConsumerMessageTest.class,
CxfConsumerMessageTest.TestConfiguration.class,
+ CxfConsumerMessageTest.ServletConfiguration.class,
CxfAutoConfiguration.class
}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
@@ -62,36 +64,35 @@ public class CxfConsumerMessageTest {
private static final String TEST_MESSAGE = "Hello World!";
- private static final String ECHO_METHOD = "ns1:echo xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\"";
+ private static final String ECHO_METHOD = "ns1:echo xmlns:ns1=\"http://cxf.component.camel.apache.org/\"";
private static final String ECHO_RESPONSE = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
- + "<soap:Body><ns1:echoResponse xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
- + "<return xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">echo Hello World!</return>"
+ + "<soap:Body><ns1:echoResponse xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+ + "<return xmlns=\"http://cxf.component.camel.apache.org/\">echo Hello World!</return>"
+ "</ns1:echoResponse></soap:Body></soap:Envelope>";
private static final String ECHO_BOOLEAN_RESPONSE
= "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
- + "<soap:Body><ns1:echoBooleanResponse xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
- + "<return xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">true</return>"
+ + "<soap:Body><ns1:echoBooleanResponse xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+ + "<return xmlns=\"http://cxf.component.camel.apache.org/\">true</return>"
+ "</ns1:echoBooleanResponse></soap:Body></soap:Envelope>";
protected final String simpleEndpointAddress = "/" + getClass().getSimpleName() + "-test";
protected final String simpleEndpointURI = "cxf://" + simpleEndpointAddress
- + "?serviceClass=org.apache.camel.component.cxf.jaxws.HelloService";
+ + "?serviceClass=org.apache.camel.component.cxf.HelloService";
+ static int port = CXFTestSupport.getPort1();
@Autowired
ProducerTemplate template;
- @Bean
- public ServletWebServerFactory servletWebServerFactory() {
- return new UndertowServletWebServerFactory();
- }
+
@Test
public void testInvokingServiceFromClient() throws Exception {
ClientProxyFactoryBean proxyFactory = new ClientProxyFactoryBean();
ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
- clientBean.setAddress("http://localhost:8080/services" + simpleEndpointAddress);
+ clientBean.setAddress("http://localhost:" + port
+ + "/services" + simpleEndpointAddress);
clientBean.setServiceClass(HelloService.class);
clientBean.setBus(BusFactory.getDefaultBus());
@@ -142,4 +143,11 @@ public class CxfConsumerMessageTest {
}
}
+ @Configuration
+ class ServletConfiguration {
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+ }
}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayLoadConverterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayLoadConverterTest.java
index 4a4f6ce1906..a12ecefd852 100644
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayLoadConverterTest.java
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayLoadConverterTest.java
@@ -32,8 +32,6 @@ import org.apache.camel.spring.boot.CamelAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
-import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.annotation.DirtiesContext;
@@ -49,17 +47,14 @@ import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
CamelAutoConfiguration.class,
CxfConsumerPayLoadConverterTest.class,
CxfConsumerPayLoadConverterTest.TestConfiguration.class,
+ CxfConsumerMessageTest.ServletConfiguration.class,
CxfAutoConfiguration.class
}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
public class CxfConsumerPayLoadConverterTest extends CxfConsumerPayloadTest {
- @Bean
- public ServletWebServerFactory servletWebServerFactory() {
- return new UndertowServletWebServerFactory();
- }
-
+
// *************************************
// Config
// *************************************
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadFaultCauseEnabledTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadFaultCauseEnabledTest.java
new file mode 100644
index 00000000000..c11463c2630
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadFaultCauseEnabledTest.java
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.ResourceBundle;
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPFault;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Holder;
+import javax.xml.ws.soap.SOAPFaultException;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.camel.wsdl_first.Person;
+import org.apache.camel.wsdl_first.PersonService;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.ext.logging.LoggingInInterceptor;
+import org.apache.cxf.ext.logging.LoggingOutInterceptor;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfConsumerPayloadFaultCauseEnabledTest.class,
+ CxfConsumerPayloadFaultCauseEnabledTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfConsumerPayloadFaultCauseEnabledTest {
+
+ protected static final QName SERVICE_QNAME = new QName("http://camel.apache.org/wsdl-first", "PersonService");
+ protected static final QName PORT_QNAME = new QName("http://camel.apache.org/wsdl-first", "soap");
+
+ static int port = CXFTestSupport.getPort1();
+
+
+ @Test
+ public void testInvokingFromCxfClient() throws Exception {
+
+ URL wsdlURL = getClass().getClassLoader().getResource("person.wsdl");
+ PersonService ss = new PersonService(wsdlURL, SERVICE_QNAME);
+
+ Person client = ss.getSoap();
+
+ Client c = ClientProxy.getClient(client);
+ c.getInInterceptors().add(new LoggingInInterceptor());
+ c.getOutInterceptors().add(new LoggingOutInterceptor());
+ ((BindingProvider) client).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port
+ + "/services/CxfConsumerPayloadFaultCauseEnabledTest/PersonService");
+
+ Holder<String> personId = new Holder<>();
+ personId.value = "";
+ Holder<String> ssn = new Holder<>();
+ Holder<String> name = new Holder<>();
+ try {
+ client.getPerson(personId, ssn, name);
+ fail("SOAPFault expected!");
+ } catch (Exception e) {
+ assertTrue(e instanceof SOAPFaultException);
+ SOAPFault fault = ((SOAPFaultException) e).getFault();
+ assertEquals("Someone messed up the service. Caused by: Homer", fault.getFaultString());
+ }
+ }
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+ @Bean
+ CxfEndpoint consumerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("/CxfConsumerPayloadFaultCauseEnabledTest/PersonService");
+ cxfEndpoint.setWsdlURL("classpath:person.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ properties.put("exceptionMessageCauseEnabled", "true");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:consumerEndpoint").process(new Processor() {
+ public void process(final Exchange exchange) throws Exception {
+ Throwable cause = new IllegalArgumentException("Homer");
+ Fault fault = new Fault("Someone messed up the service.", (ResourceBundle) null, cause);
+ exchange.setException(fault);
+ }
+ });
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadTest.java
index b5a8d89c10a..0bc605e4989 100644
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadTest.java
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerPayloadTest.java
@@ -35,8 +35,6 @@ import org.apache.camel.spring.boot.CamelAutoConfiguration;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
-import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.annotation.DirtiesContext;
@@ -47,38 +45,36 @@ import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
@DirtiesContext
@CamelSpringBootTest
@SpringBootTest(classes = {
- CamelAutoConfiguration.class, CxfConsumerPayloadTest.class,
+ CamelAutoConfiguration.class,
+ CxfConsumerPayloadTest.class,
CxfConsumerPayloadTest.TestConfiguration.class,
+ CxfConsumerMessageTest.ServletConfiguration.class,
CxfAutoConfiguration.class
}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class CxfConsumerPayloadTest extends CxfConsumerMessageTest {
- protected static final String ECHO_RESPONSE = "<ns1:echoResponse xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
- + "<return xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">echo Hello World!</return>"
+ protected static final String ECHO_RESPONSE = "<ns1:echoResponse xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+ + "<return xmlns=\"http://cxf.component.camel.apache.org/\">echo Hello World!</return>"
+ "</ns1:echoResponse>";
- protected static final String ECHO_BOOLEAN_RESPONSE = "<ns1:echoBooleanResponse xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
- + "<return xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">true</return>"
+ protected static final String ECHO_BOOLEAN_RESPONSE = "<ns1:echoBooleanResponse xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+ + "<return xmlns=\"http://cxf.component.camel.apache.org/\">true</return>"
+ "</ns1:echoBooleanResponse>";
- protected static final String ECHO_REQUEST = "<ns1:echo xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
- + "<arg0 xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">Hello World!</arg0></ns1:echo>";
- protected static final String ECHO_BOOLEAN_REQUEST = "<ns1:echoBoolean xmlns:ns1=\"http://jaxws.cxf.component.camel.apache.org/\">"
- + "<arg0 xmlns=\"http://jaxws.cxf.component.camel.apache.org/\">true</arg0></ns1:echoBoolean>";
+ protected static final String ECHO_REQUEST = "<ns1:echo xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+ + "<arg0 xmlns=\"http://cxf.component.camel.apache.org/\">Hello World!</arg0></ns1:echo>";
+ protected static final String ECHO_BOOLEAN_REQUEST = "<ns1:echoBoolean xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
+ + "<arg0 xmlns=\"http://cxf.component.camel.apache.org/\">true</arg0></ns1:echoBoolean>";
- protected static final String ELEMENT_NAMESPACE = "http://jaxws.cxf.component.camel.apache.org/";
+ protected static final String ELEMENT_NAMESPACE = "http://cxf.component.camel.apache.org/";
- @Bean
- public ServletWebServerFactory servletWebServerFactory() {
- return new UndertowServletWebServerFactory();
- }
-
+
protected void checkRequest(String expect, String request) {
if (expect.equals("ECHO_REQUEST")) {
- assertTrue(request.startsWith(ECHO_REQUEST.substring(0, 66))
- && request.endsWith(ECHO_REQUEST.substring(67)), "Get a wrong request");
+ assertTrue(request.startsWith(ECHO_REQUEST.substring(0, 60))
+ && request.endsWith(ECHO_REQUEST.substring(61)), "Get a wrong request");
} else {
- assertTrue(request.startsWith(ECHO_BOOLEAN_REQUEST.substring(0, 73))
- && request.endsWith(ECHO_BOOLEAN_REQUEST.substring(74)), "Get a wrong request");
+ assertTrue(request.startsWith(ECHO_BOOLEAN_REQUEST.substring(0, 67))
+ && request.endsWith(ECHO_BOOLEAN_REQUEST.substring(68)), "Get a wrong request");
}
}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerProviderTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerProviderTest.java
index c601b66e0cc..53b1cb8b8b1 100644
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerProviderTest.java
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfConsumerProviderTest.java
@@ -24,6 +24,7 @@ import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
import org.apache.camel.converter.jaxp.XmlConverter;
import org.apache.camel.spring.boot.CamelAutoConfiguration;
@@ -69,19 +70,17 @@ public class CxfConsumerProviderTest {
protected final String relativeAddress = "/" + getClass().getSimpleName() + "/test";
- protected final String simpleEndpointAddress = "http://localhost:8080/services"
+ protected final String simpleEndpointAddress = "http://localhost:" + port + "/services"
+ relativeAddress;
protected final String simpleEndpointURI = "cxf://" + relativeAddress
- + "?serviceClass=org.apache.camel.component.cxf.soap.springboot.ServiceProvider";
+ + "?serviceClass=org.apache.camel.component.cxf.ServiceProvider";
+ static int port = CXFTestSupport.getPort1();
@Autowired
ProducerTemplate template;
- @Bean
- public ServletWebServerFactory servletWebServerFactory() {
- return new UndertowServletWebServerFactory();
- }
+
@Test
public void testInvokingServiceFromHttpCompnent() throws Exception {
@@ -110,6 +109,11 @@ public class CxfConsumerProviderTest {
@Configuration
public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
@Bean
public RouteBuilder routeBuilder() {
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfEndpointBeanTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfEndpointBeanTest.java
new file mode 100644
index 00000000000..69da17b4357
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfEndpointBeanTest.java
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.handler.Handler;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.jaxws.CxfProducer;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.binding.soap.Soap12;
+import org.apache.cxf.binding.soap.SoapBindingConfiguration;
+import org.apache.cxf.configuration.security.AuthorizationPolicy;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.transport.http.HTTPConduit;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfEndpointBeanTest.class,
+ CxfEndpointBeanTest.TestConfiguration.class
+})
+public class CxfEndpointBeanTest {
+
+ private QName serviceName = QName.valueOf("{http://camel.apache.org/wsdl-first}PersonService");
+ private QName endpointName = QName.valueOf("{http://camel.apache.org/wsdl-first}soap");
+ static int port = CXFTestSupport.getPort1();
+ @Autowired
+ ApplicationContext ctx;
+
+ @Test
+ public void testCxfEndpointsWithCamelContext() {
+ CamelContext context = ctx.getBean("camelContext", CamelContext.class);
+ // try to create a new CxfEndpoint which could override the old bean's setting
+ CxfEndpoint myLocalCxfEndpoint = (CxfEndpoint)context
+ .getEndpoint("cxf:bean:routerEndpoint?address=http://localhost:" + port + "/services"
+ + "/CxfEndpointBeanTest/myCamelContext/");
+ assertEquals("http://localhost:" + port + "/services" + "/CxfEndpointBeanTest/myCamelContext/",
+ myLocalCxfEndpoint.getAddress(), "Got the wrong endpoint address");
+
+ CxfEndpoint routerEndpoint = ctx.getBean("routerEndpoint", CxfEndpoint.class);
+ assertEquals("http://localhost:" + port + "/services" + "/CxfEndpointBeanTest/myCamelContext/",
+ routerEndpoint.getAddress(), "Got the wrong endpoint address");
+ }
+
+ @Test
+ public void testPropertiesSettingOnCxfClient() throws Exception {
+ CxfEndpoint clientEndpoint = ctx.getBean("clientEndpoint", CxfEndpoint.class);
+ CxfProducer producer = (CxfProducer) clientEndpoint.createProducer();
+ // need to start the producer to get the client
+ producer.start();
+ Client client = producer.getClient();
+ HTTPConduit conduit = (HTTPConduit) client.getConduit();
+ assertEquals("test", conduit.getAuthorization().getUserName(), "Got the wrong user name");
+ }
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+ cxfEndpoint.setAddress("/CxfEndpointBeanTest/router");
+ cxfEndpoint.setContinuationTimeout(60000);
+ List<String> schemaLocations = new ArrayList<String>();
+ schemaLocations.add("classpath:wsdl/Message.xsd");
+ cxfEndpoint.setSchemaLocations(schemaLocations);
+ List<Handler> handlers = new ArrayList<Handler>();
+ handlers.add(new JaxwsTestHandler());
+ cxfEndpoint.setHandlers(handlers);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint clientEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfEndpointBeanTest/helloworld");
+
+ Map<String, Object> properties = new HashMap<String, Object>();
+ AuthorizationPolicy policy = new AuthorizationPolicy();
+ policy.setUserName("test");
+ properties.put("org.apache.cxf.configuration.security.AuthorizationPolicy", policy);
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint myEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.wsdl_first.Person.class);
+ cxfEndpoint.setAddress("/CxfEndpointBeanTest/test");
+ cxfEndpoint.setWsdlURL("person.wsdl");
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setLoggingFeatureEnabled(true);
+ cxfEndpoint.setLoggingSizeLimit(200);
+
+ SoapBindingConfiguration bindingCfg = new SoapBindingConfiguration();
+ bindingCfg.setVersion(Soap12.getInstance());
+ cxfEndpoint.setBindingConfig(bindingCfg);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:start")
+ .to("cxf:bean:myEndpoint");
+ from("cxf:bean:myEndpoint").to("mock:result");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfMessageHeaderTimeoutTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfMessageHeaderTimeoutTest.java
new file mode 100644
index 00000000000..27dded0c7ae
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfMessageHeaderTimeoutTest.java
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+
+
+import java.net.SocketTimeoutException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.GreeterImplWithSleep;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
+import org.apache.hello_world_soap_http.Greeter;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfMessageHeaderTimeoutTest.class,
+ CxfMessageHeaderTimeoutTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfMessageHeaderTimeoutTest {
+
+
+ protected static final String GREET_ME_OPERATION = "greetMe";
+ protected static final String TEST_MESSAGE = "Hello World!";
+ protected static final String SERVER_ADDRESS
+ = "/CxfMessageHeaderTimeoutTest/SoapContext/SoapPort";
+
+
+
+ static int port = CXFTestSupport.getPort1();
+
+ private Endpoint endpoint;
+
+ @BeforeEach
+ public void startService() {
+ Greeter implementor = new GreeterImplWithSleep();
+ endpoint = Endpoint.publish(SERVER_ADDRESS, implementor);
+ }
+
+ @AfterEach
+ public void stopService() {
+ endpoint.stop();
+ }
+
+
+ @Autowired
+ ProducerTemplate template;
+
+ @Test
+ public void testInvokingJaxWsServerWithCxfEndpoint() throws Exception {
+ sendTimeOutMessage("cxf://bean:springEndpoint");
+ }
+
+ protected void sendTimeOutMessage(String endpointUri) throws Exception {
+ Exchange reply = sendJaxWsMessage(endpointUri);
+ Exception e = reply.getException();
+ assertNotNull(e, "We should get the exception cause here");
+ assertTrue(e instanceof SocketTimeoutException, "We should get the socket time out exception here");
+ }
+
+ protected Exchange sendJaxWsMessage(String endpointUri) throws InterruptedException {
+ Exchange exchange = template.send(endpointUri, new Processor() {
+ public void process(final Exchange exchange) {
+ final List<String> params = new ArrayList<>();
+ params.add(TEST_MESSAGE);
+ exchange.getIn().setBody(params);
+ exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, GREET_ME_OPERATION);
+ // setup the receive timeout dynamically
+ Map<String, Object> requestContext = new HashMap<>();
+ HTTPClientPolicy clientPolicy = new HTTPClientPolicy();
+ clientPolicy.setReceiveTimeout(100);
+ requestContext.put(HTTPClientPolicy.class.getName(), clientPolicy);
+ exchange.getIn().setBody(params);
+ exchange.getIn().setHeader(Client.REQUEST_CONTEXT, requestContext);
+
+ }
+ });
+ return exchange;
+ }
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ errorHandler(noErrorHandler());
+ from("direct:start").to("cxf:bean:springEndpoint");
+ }
+ };
+ }
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+ @Bean
+ public CxfEndpoint springEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("http://localhost:" + port
+ + "/services" + SERVER_ADDRESS);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ return cxfEndpoint;
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfNonWrapperTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfNonWrapperTest.java
new file mode 100644
index 00000000000..f0b6477c12c
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfNonWrapperTest.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+
+
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.non_wrapper.Person;
+import org.apache.camel.non_wrapper.PersonProcessor;
+import org.apache.camel.non_wrapper.PersonService;
+import org.apache.camel.non_wrapper.UnknownPersonFault;
+import org.apache.camel.non_wrapper.types.GetPerson;
+import org.apache.camel.non_wrapper.types.GetPersonResponse;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfNonWrapperTest.class,
+ CxfNonWrapperTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfNonWrapperTest {
+
+ private static final QName SERVICE_NAME = new QName("http://camel.apache.org/wsdl-first", "PersonService");
+ private static final QName PORT_NAME = new QName("http://camel.apache.org/wsdl-first", "soap");
+
+
+ static int port = CXFTestSupport.getPort1();
+
+ @Test
+ public void testInvokingServiceFromCXFClient() throws Exception {
+
+ URL wsdlURL = getClass().getClassLoader().getResource("person-non-wrapper.wsdl");
+ PersonService ss = new PersonService(wsdlURL, new QName("http://camel.apache.org/non-wrapper", "PersonService"));
+ Person client = ss.getSoap();
+ ((BindingProvider) client).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfNonWrapperTest/PersonService/");
+
+ GetPerson request = new GetPerson();
+ request.setPersonId("hello");
+ GetPersonResponse response = client.getPerson(request);
+
+ assertEquals("Bonjour", response.getName(), "we should get the right answer from router");
+
+ request.setPersonId("");
+ try {
+ client.getPerson(request);
+ fail("We expect to get the UnknowPersonFault here");
+ } catch (UnknownPersonFault fault) {
+ // We expect to get fault here
+ }
+ }
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public PersonProcessor personProcessor() {
+ return new PersonProcessor();
+ }
+
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_NAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_NAME);
+ cxfEndpoint.setServiceClass(org.apache.camel.non_wrapper.Person.class);
+ cxfEndpoint.setAddress("/CxfNonWrapperTest/PersonService/");
+ cxfEndpoint.setDataFormat(DataFormat.POJO);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint")
+ .process("personProcessor");
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfOneWayRouteTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfOneWayRouteTest.java
new file mode 100644
index 00000000000..b80190cea7e
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfOneWayRouteTest.java
@@ -0,0 +1,219 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+
+
+import java.io.ByteArrayOutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.jaxws.DefaultCxfBinding;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.spi.Synchronization;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.Greeter;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfOneWayRouteTest.class,
+ CxfOneWayRouteTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfOneWayRouteTest {
+
+ private static final QName SERVICE_NAME = new QName("http://apache.org/hello_world_soap_http", "SOAPService");
+ private static final QName PORT_NAME = new QName("http://apache.org/hello_world_soap_http", "SoapPort");
+ private static final String ROUTER_ADDRESS = "/CxfOneWayRouteTest/router";
+
+ private static Exception bindingException;
+ private static boolean bindingDone;
+ private static boolean onCompeletedCalled;
+
+ static int port = CXFTestSupport.getPort1();
+
+ @BeforeEach
+ public void setup() {
+ bindingException = null;
+ bindingDone = false;
+ onCompeletedCalled = false;
+ }
+
+
+ protected Greeter getCXFClient() throws Exception {
+ Service service = Service.create(SERVICE_NAME);
+ service.addPort(PORT_NAME, "http://schemas.xmlsoap.org/soap/",
+ "http://localhost:" + port
+ + "/services" + ROUTER_ADDRESS);
+ Greeter greeter = service.getPort(PORT_NAME, Greeter.class);
+ return greeter;
+ }
+
+
+
+ @EndpointInject("mock:result")
+ MockEndpoint mock;
+
+
+ @Bean
+ TestProcessor testProcessor() {
+ return new TestProcessor();
+ }
+
+ @Test
+ public void testInvokingOneWayServiceFromCXFClient() throws Exception {
+ mock.expectedMessageCount(1);
+ mock.expectedFileExists("target/camel-file/cxf-oneway-route");
+
+ Greeter client = getCXFClient();
+ client.greetMeOneWay("lemac");
+
+ // may need to wait until the oneway call completes
+ long waitUntil = System.currentTimeMillis() + 10000;
+ while (!bindingDone && System.currentTimeMillis() < waitUntil) {
+ Thread.sleep(1000);
+ }
+
+ mock.assertIsSatisfied();
+ assertTrue(onCompeletedCalled, "UnitOfWork done should be called");
+ assertNull(bindingException, "exception occured: " + bindingException);
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_NAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_NAME);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+ cxfEndpoint.setAddress(ROUTER_ADDRESS);
+ cxfEndpoint.getInInterceptors().add(new org.apache.cxf.ext.logging.LoggingInInterceptor());
+ cxfEndpoint.getOutInterceptors().add(new org.apache.cxf.ext.logging.LoggingOutInterceptor());
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("org.apache.cxf.oneway.robust", true);
+ cxfEndpoint.setProperties(properties);
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ cxfEndpoint.setCxfBinding(new TestCxfBinding());
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint")
+ .to("log:org.apache.camel?level=DEBUG")
+ .to("bean:testProcessor")
+ .to("file://target/camel-file/cxf-oneway-route")
+ .to("mock:result");
+ }
+ };
+ }
+ }
+
+ public static class TestProcessor implements Processor {
+ static final byte[] MAGIC = { (byte) 0xca, 0x3e, 0x1e };
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ // just check the MEP here
+ assertEquals(ExchangePattern.InOnly, exchange.getPattern(), "Don't get the right MEP");
+ // adding some binary segment
+ String msg = exchange.getIn().getBody(String.class);
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ bos.write(MAGIC);
+ bos.write(msg.getBytes());
+ exchange.getIn().setBody(bos.toByteArray());
+ // add compliation
+ exchange.getUnitOfWork().addSynchronization(new Synchronization() {
+ @Override
+ public void onComplete(Exchange exchange) {
+ onCompeletedCalled = true;
+ }
+
+ @Override
+ public void onFailure(Exchange exchange) {
+ // do nothing here
+ }
+ });
+ }
+ }
+
+ public static class TestCxfBinding extends DefaultCxfBinding {
+
+ @Override
+ public void populateCxfResponseFromExchange(Exchange camelExchange, org.apache.cxf.message.Exchange cxfExchange) {
+ try {
+ super.populateCxfResponseFromExchange(camelExchange, cxfExchange);
+ } catch (RuntimeException e) {
+ bindingException = e;
+ throw e;
+ } finally {
+ bindingDone = true;
+ }
+ }
+
+ }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadMessageXmlBindingRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadMessageXmlBindingRouterTest.java
new file mode 100644
index 00000000000..7b716842d80
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadMessageXmlBindingRouterTest.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+import java.util.List;
+
+import javax.xml.transform.Source;
+
+import org.w3c.dom.Element;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.HelloService;
+import org.apache.camel.component.cxf.HelloServiceImpl;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.ClientFactoryBean;
+import org.apache.cxf.frontend.ClientProxyFactoryBean;
+import org.apache.cxf.frontend.ServerFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfPayLoadMessageXmlBindingRouterTest.class,
+ CxfPayLoadMessageXmlBindingRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfPayLoadMessageXmlBindingRouterTest {
+
+ protected static final String ROUTER_ADDRESS = "/CxfPayLoadMessageXmlBindingRouterTest/router";
+ protected static final String SERVICE_ADDRESS = "/CxfPayLoadMessageXmlBindingRouterTest/helloworld";
+
+ protected static String getBindingId() {
+ return "http://cxf.apache.org/bindings/xformat";
+ }
+
+ static int port = CXFTestSupport.getPort1();;
+
+ @BeforeEach
+ public void startService() {
+ //start a service
+ ServerFactoryBean svrBean = new ServerFactoryBean();
+
+ svrBean.setAddress(SERVICE_ADDRESS);
+ svrBean.setServiceClass(HelloService.class);
+ svrBean.setServiceBean(new HelloServiceImpl());
+ svrBean.setBindingId(getBindingId());
+ Server server = svrBean.create();
+ server.start();
+ }
+
+
+
+ protected HelloService getCXFClient() throws Exception {
+ ClientProxyFactoryBean proxyFactory = new ClientProxyFactoryBean();
+ ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
+ clientBean.setAddress("http://localhost:" + port
+ + "/services" + ROUTER_ADDRESS);
+ clientBean.setServiceClass(HelloService.class);
+ clientBean.setBindingId(getBindingId());
+
+ HelloService client = (HelloService) proxyFactory.create();
+ return client;
+ }
+
+ @Test
+ public void testInvokingServiceFromCXFClient() throws Exception {
+ HelloService client = getCXFClient();
+ String result = client.echo("hello world");
+ assertEquals("echo hello world", result, "we should get the right answer from router");
+
+ int count = client.getInvocationCount();
+ client.ping();
+ //oneway ping invoked, so invocationCount ++
+ assertEquals(client.getInvocationCount(), ++count, "The ping should be invocated");
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() throws InterruptedException {
+ ServletWebServerFactory webServerFactory = new UndertowServletWebServerFactory(port);
+ return webServerFactory;
+ }
+
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+ cxfEndpoint.setAddress(ROUTER_ADDRESS);
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ cxfEndpoint.setBindingId(getBindingId());
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+ cxfEndpoint.setAddress("http://localhost:"
+ + port + "/services" + SERVICE_ADDRESS);
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ cxfEndpoint.setBindingId(getBindingId());
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ errorHandler(noErrorHandler());
+ from("cxf:bean:routerEndpoint").process(new Processor() {
+ public void process(Exchange exchange) throws Exception {
+ CxfPayload<?> payload = exchange.getIn().getBody(CxfPayload.class);
+ List<Source> elements = payload.getBodySources();
+ assertNotNull(elements, "We should get the elements here");
+ assertEquals(1, elements.size(), "Get the wrong elements size");
+
+ Element el = new XmlConverter().toDOMElement(elements.get(0));
+ assertEquals("http://cxf.component.camel.apache.org/", el.getNamespaceURI(),
+ "Get the wrong namespace URI");
+ }
+
+ })
+ .to("cxf:bean:serviceEndpoint");
+
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadSoapHeaderSpringTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadSoapHeaderSpringTest.java
new file mode 100644
index 00000000000..7fa13457755
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfPayLoadSoapHeaderSpringTest.java
@@ -0,0 +1,213 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+
+
+
+import java.net.URL;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Endpoint;
+
+import org.w3c.dom.Element;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.PizzaImpl;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.pizza.Pizza;
+import org.apache.camel.pizza.PizzaService;
+import org.apache.camel.pizza.types.CallerIDHeaderType;
+import org.apache.camel.pizza.types.OrderPizzaResponseType;
+import org.apache.camel.pizza.types.OrderPizzaType;
+import org.apache.camel.pizza.types.ToppingsListType;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.binding.soap.SoapHeader;
+import org.apache.cxf.headers.Header;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfPayLoadSoapHeaderSpringTest.class,
+ CxfPayLoadSoapHeaderSpringTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfPayLoadSoapHeaderSpringTest {
+
+ private final QName serviceName = new QName("http://camel.apache.org/pizza", "PizzaService");
+
+ static int port = CXFTestSupport.getPort1();
+
+ protected void start(String n) {
+ Object implementor = new PizzaImpl();
+ String address = "/" + n
+ + "/new_pizza_service/services/PizzaService";
+ Endpoint.publish(address, implementor);
+ }
+
+ @BeforeEach
+ public void startService() {
+ start(getClass().getSimpleName());
+ }
+
+
+
+ @Test
+ public void testPizzaService() {
+ Pizza port = getPort();
+
+ OrderPizzaType req = new OrderPizzaType();
+ ToppingsListType t = new ToppingsListType();
+ t.getTopping().add("test");
+ req.setToppings(t);
+
+ CallerIDHeaderType header = new CallerIDHeaderType();
+ header.setName("Willem");
+ header.setPhoneNumber("108");
+
+ OrderPizzaResponseType res = port.orderPizza(req, header);
+
+ assertEquals(208, res.getMinutesUntilReady());
+ }
+
+ private Pizza getPort() {
+ URL wsdl = getClass().getResource("/pizza_service.wsdl");
+ assertNotNull(wsdl, "WSDL is null");
+
+ PizzaService service = new PizzaService(wsdl, serviceName);
+ assertNotNull(service, "Service is null");
+
+ Pizza pizza = service.getPizzaPort();
+ ((BindingProvider) pizza).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/" + getClass().getSimpleName()
+ + "/pizza_service/services/PizzaService");
+ return pizza;
+ }
+
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setWsdlURL("pizza_service.wsdl");
+ cxfEndpoint.setAddress("/" + "CxfPayLoadSoapHeaderSpringTest"
+ + "/pizza_service/services/PizzaService");
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setWsdlURL("pizza_service.wsdl");
+ cxfEndpoint.setAddress("http://localhost:" + port
+ + "/services/" + "CxfPayLoadSoapHeaderSpringTest"
+ + "/new_pizza_service/services/PizzaService");
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ // START SNIPPET: payload
+ from("cxf:bean:routerEndpoint").process(new Processor() {
+ @SuppressWarnings("unchecked")
+ public void process(Exchange exchange) throws Exception {
+ CxfPayload<SoapHeader> payload = exchange.getIn().getBody(CxfPayload.class);
+ List<Source> elements = payload.getBodySources();
+ assertNotNull(elements, "We should get the elements here");
+ assertEquals(1, elements.size(), "Get the wrong elements size");
+
+ Element el = new XmlConverter().toDOMElement(elements.get(0));
+ elements.set(0, new DOMSource(el));
+ assertEquals("http://camel.apache.org/pizza/types",
+ el.getNamespaceURI(), "Get the wrong namespace URI");
+
+ List<SoapHeader> headers = payload.getHeaders();
+ assertNotNull(headers, "We should get the headers here");
+ assertEquals(1, headers.size(), "Get the wrong headers size");
+ assertEquals("http://camel.apache.org/pizza/types",
+ ((Element) (headers.get(0).getObject())).getNamespaceURI(), "Get the wrong namespace URI");
+ // alternatively you can also get the SOAP header via the camel header:
+ headers = exchange.getIn().getHeader(Header.HEADER_LIST, List.class);
+ assertNotNull(headers, "We should get the headers here");
+ assertEquals(1, headers.size(), "Get the wrong headers size");
+ assertEquals("http://camel.apache.org/pizza/types",
+ ((Element) (headers.get(0).getObject())).getNamespaceURI(), "Get the wrong namespace URI");
+
+ }
+
+ })
+ .to("cxf:bean:serviceEndpoint");
+ // END SNIPPET: payload
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringCustomizedExceptionTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringCustomizedExceptionTest.java
new file mode 100644
index 00000000000..7c00b156e9d
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringCustomizedExceptionTest.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Text;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.binding.soap.SoapFault;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfSpringCustomizedExceptionTest.class,
+ CxfSpringCustomizedExceptionTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfSpringCustomizedExceptionTest {
+
+ private static final String EXCEPTION_MESSAGE = "This is an exception test message";
+ private static final String DETAIL_TEXT = "This is a detail text node";
+ private static final SoapFault SOAP_FAULT;
+ static int port = CXFTestSupport.getPort1();
+
+ static {
+ // START SNIPPET: FaultDefine
+ SOAP_FAULT = new SoapFault(EXCEPTION_MESSAGE, Fault.FAULT_CODE_CLIENT);
+ Element detail = SOAP_FAULT.getOrCreateDetail();
+ Document doc = detail.getOwnerDocument();
+ Text tn = doc.createTextNode(DETAIL_TEXT);
+ detail.appendChild(tn);
+ // END SNIPPET: FaultDefine
+ }
+
+
+
+ @Bean
+ private CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+ cxfEndpoint.setAddress("http://localhost:" + port
+ + "/services/CxfSpringCustomizedExceptionTest/router");
+ return cxfEndpoint;
+ }
+
+ @Autowired
+ ProducerTemplate template;
+
+ @Test
+ public void testInvokingServiceFromCamel() throws Exception {
+ try {
+ template.sendBodyAndHeader("direct:start", ExchangePattern.InOut, "hello world", CxfConstants.OPERATION_NAME,
+ "echo");
+ fail("Should have thrown an exception");
+ } catch (Exception ex) {
+ Throwable result = ex.getCause();
+ assertTrue(result instanceof SoapFault, "Exception is not instance of SoapFault");
+ assertEquals(DETAIL_TEXT, ((SoapFault) result).getDetail().getTextContent(), "Expect to get right detail message");
+ assertEquals("{http://schemas.xmlsoap.org/soap/envelope/}Client", ((SoapFault) result).getFaultCode().toString(),
+ "Expect to get right fault-code");
+ }
+
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+ cxfEndpoint.setAddress("/CxfSpringCustomizedExceptionTest/router");
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:start")
+ .to("cxf:bean:serviceEndpoint");
+ from("cxf:bean:routerEndpoint").process(new Processor() {
+ public void process(final Exchange exchange) {
+ exchange.getMessage().setBody(SOAP_FAULT);
+ }
+ }).to("log:mylog");
+
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringRouterTest.java
new file mode 100644
index 00000000000..3c53764ff9e
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfSpringRouterTest.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.HelloService;
+import org.apache.camel.component.cxf.HelloServiceImpl;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.ClientFactoryBean;
+import org.apache.cxf.frontend.ClientProxyFactoryBean;
+import org.apache.cxf.frontend.ServerFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfSpringRouterTest.class,
+ CxfSpringRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfSpringRouterTest {
+
+ protected Server server;
+
+ static int port = CXFTestSupport.getPort1();
+
+ @BeforeEach
+ public void startService() {
+ //start a service
+ ServerFactoryBean svrBean = new ServerFactoryBean();
+
+ svrBean.setAddress("/CxfSpringRouterTest/helloworld");
+ svrBean.setServiceClass(HelloService.class);
+ svrBean.setServiceBean(new HelloServiceImpl());
+ server = svrBean.create();
+ server.start();
+ }
+
+ @AfterEach
+ public void shutdownService() {
+ if (server != null) {
+ server.stop();
+ }
+ }
+
+
+
+
+ @Bean
+ private CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(HelloService.class);
+ cxfEndpoint.setAddress("/CxfSpringRouterTest/router");
+ return cxfEndpoint;
+ }
+
+ @Bean
+ private CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(HelloService.class);
+ cxfEndpoint.setAddress("http://localhost:" + port
+ + "/services/CxfSpringRouterTest/helloworld");
+ return cxfEndpoint;
+ }
+
+ protected HelloService getCXFClient() throws Exception {
+ ClientProxyFactoryBean proxyFactory = new ClientProxyFactoryBean();
+ ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
+ clientBean.setAddress("http://localhost:" + port
+ + "/services/CxfSpringRouterTest/router");
+ clientBean.setServiceClass(HelloService.class);
+
+ HelloService client = (HelloService) proxyFactory.create();
+ return client;
+ }
+
+ @Test
+ public void testInvokingServiceFromCXFClient() throws Exception {
+ HelloService client = getCXFClient();
+ String result = client.echo("hello world");
+ assertEquals("echo hello world", result, "we should get the right answer from router");
+
+ }
+
+ @Test
+ public void testOnwayInvocation() throws Exception {
+ HelloService client = getCXFClient();
+ int count = client.getInvocationCount();
+ client.ping();
+ //oneway ping invoked, so invocationCount ++
+ assertEquals(client.getInvocationCount(), ++count, "The ping should be invocated");
+ }
+
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint").to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfTimeoutTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfTimeoutTest.java
new file mode 100644
index 00000000000..747cf58b95a
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CxfTimeoutTest.java
@@ -0,0 +1,266 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+import java.net.SocketTimeoutException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.GreeterImplWithSleep;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.component.cxf.jaxws.CxfConfigurer;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.support.jsse.KeyManagersParameters;
+import org.apache.camel.support.jsse.KeyStoreParameters;
+import org.apache.camel.support.jsse.SSLContextParameters;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
+import org.apache.hello_world_soap_http.Greeter;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class, CxfTimeoutTest.class,
+ CxfTimeoutTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfTimeoutTest {
+
+
+ static int port = CXFTestSupport.getPort1();;
+
+ protected static final String GREET_ME_OPERATION = "greetMe";
+ protected static final String TEST_MESSAGE = "Hello World!";
+ protected static final String SERVER_ADDRESS = "/CxfTimeoutTest/SoapContext/SoapPort";
+ protected static final String JAXWS_SERVER_ADDRESS
+ = "http://localhost:" + port + "/services/CxfTimeoutTest/SoapContext/SoapPort";
+
+ private Endpoint endpoint;
+ @BeforeEach
+ public void startService() {
+ Greeter implementor = new GreeterImplWithSleep();
+ endpoint = Endpoint.publish(SERVER_ADDRESS, implementor);
+ }
+
+ @AfterEach
+ public void stopService() {
+ endpoint.stop();
+ }
+
+
+
+ @Test
+ public void testInvokingJaxWsServerWithBusUriParams() throws Exception {
+ sendTimeOutMessage("cxf://" + JAXWS_SERVER_ADDRESS + "?serviceClass=org.apache.hello_world_soap_http.Greeter&bus=#cxf&cxfConfigurer=#origConfigurer");
+ }
+
+ @Test
+ public void testInvokingJaxWsServerWithoutBusUriParams() throws Exception {
+ sendTimeOutMessage("cxf://" + JAXWS_SERVER_ADDRESS + "?serviceClass=org.apache.hello_world_soap_http.Greeter&cxfConfigurer=#origConfigurer");
+ }
+
+ @Test
+ public void testInvokingJaxWsServerWithCxfEndpoint() throws Exception {
+ sendTimeOutMessage("cxf://bean:springEndpoint");
+ }
+
+ @Test
+ public void testInvokingFromCamelRoute() throws Exception {
+ sendTimeOutMessage("direct:start");
+ }
+
+ @Test
+ public void testDoCatchWithTimeOutException() throws Exception {
+ sendTimeOutMessage("direct:doCatch");
+ }
+
+ protected void sendTimeOutMessage(String endpointUri) throws Exception {
+ Exchange reply = sendJaxWsMessage(endpointUri);
+ Exception e = reply.getException();
+ assertNotNull(e, "We should get the exception cause here");
+ assertTrue(e instanceof SocketTimeoutException, "We should get the socket time out exception here");
+ }
+
+ @Autowired
+ ProducerTemplate template;
+ protected Exchange sendJaxWsMessage(String endpointUri) throws InterruptedException {
+ Exchange exchange = template.send(endpointUri, new Processor() {
+ public void process(final Exchange exchange) {
+ final List<String> params = new ArrayList<>();
+ params.add(TEST_MESSAGE);
+ exchange.getIn().setBody(params);
+ exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, GREET_ME_OPERATION);
+ }
+ });
+ return exchange;
+ }
+
+ public static class MyCxfConfigurer implements CxfConfigurer {
+
+ @Override
+ public void configure(AbstractWSDLBasedEndpointFactory factoryBean) {
+ // Do nothing here
+ }
+
+ @Override
+ public void configureClient(Client client) {
+ // reset the timeout option to override the spring configuration one
+ HTTPConduit conduit = (HTTPConduit) client.getConduit();
+ HTTPClientPolicy policy = new HTTPClientPolicy();
+ policy.setReceiveTimeout(60000);
+ conduit.setClient(policy);
+
+ }
+
+ @Override
+ public void configureServer(Server server) {
+ // Do nothing here
+
+ }
+
+ }
+
+ public static class OrigCxfConfigurer implements CxfConfigurer {
+
+ @Override
+ public void configure(AbstractWSDLBasedEndpointFactory factoryBean) {
+ // Do nothing here
+ }
+
+ @Override
+ public void configureClient(Client client) {
+ // reset the timeout option to override the spring configuration one
+ HTTPConduit conduit = (HTTPConduit) client.getConduit();
+ HTTPClientPolicy policy = new HTTPClientPolicy();
+ policy.setReceiveTimeout(100);
+ conduit.setClient(policy);
+
+ }
+
+ @Override
+ public void configureServer(Server server) {
+ // Do nothing here
+
+ }
+
+ }
+
+
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ HostnameVerifier defaultHostnameVerifier() {
+ return new org.apache.cxf.transport.https.httpclient.DefaultHostnameVerifier();
+ }
+
+ @Bean
+ MyCxfConfigurer myConfigurer() {
+ return new MyCxfConfigurer();
+ }
+
+ @Bean
+ OrigCxfConfigurer origConfigurer() {
+ return new OrigCxfConfigurer();
+ }
+
+ @Bean
+ SSLContextParameters mySslContext() {
+ SSLContextParameters sslContext = new SSLContextParameters();
+ KeyManagersParameters keyManager = new KeyManagersParameters();
+ keyManager.setKeyPassword("changeit");
+ KeyStoreParameters keyStore = new KeyStoreParameters();
+ keyStore.setPassword("changeit");
+ keyStore.setResource("/localhost.p12");
+ keyManager.setKeyStore(keyStore);
+ sslContext.setKeyManagers(keyManager);
+ return sslContext;
+ }
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() throws InterruptedException {
+ ServletWebServerFactory webServerFactory = new UndertowServletWebServerFactory(port);
+ return webServerFactory;
+ }
+
+
+ @Bean
+ CxfEndpoint springEndpoint() {
+
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ cxfEndpoint.setAddress(JAXWS_SERVER_ADDRESS);
+ cxfEndpoint.setCxfConfigurer(new OrigCxfConfigurer());
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ errorHandler(noErrorHandler());
+ from("direct:start").
+ to("cxf:bean:springEndpoint?sslContextParameters=#mySslContext&hostnameVerifier=#defaultHostnameVerifier");
+ from("direct:doCatch").
+ to("cxf:bean:springEndpoint");
+
+
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/FileToCxfMessageDataFormatTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/FileToCxfMessageDataFormatTest.java
new file mode 100644
index 00000000000..24a6e4e40cd
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/FileToCxfMessageDataFormatTest.java
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+
+
+import static org.apache.camel.test.junit5.TestSupport.deleteDirectory;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.HelloService;
+import org.apache.camel.component.cxf.HelloServiceImpl;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.ServerFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ FileToCxfMessageDataFormatTest.class,
+ FileToCxfMessageDataFormatTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class FileToCxfMessageDataFormatTest {
+
+
+ private static final Logger LOG = LoggerFactory.getLogger(FileToCxfMessageDataFormatTest.class);
+
+ private Server server;
+
+ static int port = CXFTestSupport.getPort1();
+
+ @BeforeEach
+ public void setUp() throws Exception {
+ deleteDirectory("target/filetocxf");
+
+ // set CXF
+ ServerFactoryBean factory = new ServerFactoryBean();
+
+ factory.setAddress("/FileToCxfMessageDataFormatTest/router");
+ factory.setServiceClass(HelloService.class);
+ factory.setServiceBean(new HelloServiceImpl());
+
+ server = factory.create();
+ server.start();
+
+ }
+
+ @AfterEach
+ public void tearDown() throws Exception {
+ server.stop();
+ server.destroy();
+ }
+
+
+
+
+ @EndpointInject("mock:result")
+ MockEndpoint mock;
+
+ @Autowired
+ ProducerTemplate template;
+
+ @Test
+ public void testFileToCxfMessageDataFormat() throws Exception {
+
+ mock.expectedMessageCount(1);
+
+ template.sendBodyAndHeader("file:target/filetocxf", createBody(), Exchange.FILE_NAME, "payload.xml");
+
+ mock.assertIsSatisfied();
+
+ String out = mock.getReceivedExchanges().get(0).getIn().getBody(String.class);
+ assertNotNull(out);
+ LOG.info("Reply payload as a String:\n" + out);
+ assertTrue(out.contains("echo Camel"), "Should invoke the echo operation");
+ }
+
+ private String createBody() throws Exception {
+ return "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:cxf=\"http://cxf.component.camel.apache.org/\">\n"
+ + " <soapenv:Header/>\n"
+ + " <soapenv:Body>\n"
+ + " <cxf:echo>\n"
+ + " <cxf:arg0>Camel</cxf:arg0>\n"
+ + " </cxf:echo>\n"
+ + " </soapenv:Body>\n"
+ + "</soapenv:Envelope>";
+ }
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("http://localhost:" + port
+ + "/services" + "/FileToCxfMessageDataFormatTest/router");
+ cxfEndpoint.setDataFormat(DataFormat.RAW);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("file:target/filetocxf")
+ .to("log:request")
+ .to(ExchangePattern.InOut, "routerEndpoint")
+ .to("log:reply")
+ .to("mock:result");
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/JaxwsTestHandler.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/JaxwsTestHandler.java
new file mode 100644
index 00000000000..38e78a882fc
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/JaxwsTestHandler.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.soap.SOAPHandler;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
+
+public class JaxwsTestHandler implements SOAPHandler<SOAPMessageContext> {
+
+ private int faultCount;
+ private int messageCount;
+ private int getHeadersCount;
+
+ public JaxwsTestHandler() {
+ }
+
+ public int getGetHeadersCount() {
+ return getHeadersCount;
+ }
+
+ @Override
+ public Set<QName> getHeaders() {
+ getHeadersCount++;
+ return null;
+ }
+
+ @Override
+ public void close(MessageContext messagecontext) {
+
+ }
+
+ @Override
+ public boolean handleFault(SOAPMessageContext messagecontext) {
+ faultCount++;
+ return true;
+ }
+
+ @Override
+ public boolean handleMessage(SOAPMessageContext messagecontext) {
+ messageCount++;
+ return true;
+ }
+
+ public void reset() {
+ faultCount = 0;
+ messageCount = 0;
+ getHeadersCount = 0;
+ }
+
+ public int getFaultCount() {
+ return faultCount;
+ }
+
+ public int getMessageCount() {
+ return messageCount;
+ }
+
+ @Override
+ public String toString() {
+ return "faultCount=" + faultCount + ", messageCount="
+ + messageCount + ", getHeadersCount=" + getHeadersCount;
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/LoggingInterceptorInMessageModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/LoggingInterceptorInMessageModeTest.java
new file mode 100644
index 00000000000..90fbfc7348d
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/LoggingInterceptorInMessageModeTest.java
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+
+
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.HelloService;
+import org.apache.camel.component.cxf.HelloServiceImpl;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.ClientFactoryBean;
+import org.apache.cxf.frontend.ClientProxyFactoryBean;
+import org.apache.cxf.frontend.ServerFactoryBean;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.interceptor.LoggingOutInterceptor;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ LoggingInterceptorInMessageModeTest.class,
+ LoggingInterceptorInMessageModeTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class LoggingInterceptorInMessageModeTest {
+
+
+ protected static final String ROUTER_ADDRESS = "/LoggingInterceptorInMessageModeTest/router";
+ protected static final String SERVICE_ADDRESS
+ = "/LoggingInterceptorInMessageModeTest/helloworld";
+
+ static Server server;
+
+
+ static int port = CXFTestSupport.getPort1();
+
+
+ @BeforeEach
+ public void startService() {
+ //start a service
+ ServerFactoryBean svrBean = new ServerFactoryBean();
+
+ svrBean.setAddress(SERVICE_ADDRESS);
+ svrBean.setServiceClass(HelloService.class);
+ svrBean.setServiceBean(new HelloServiceImpl());
+
+ server = svrBean.create();
+ }
+
+ @AfterEach
+ public void stopService() {
+ server.stop();
+ server.destroy();
+ }
+
+
+ @Autowired
+ protected CamelContext context;
+
+ @Test
+ public void testInvokingServiceFromCXFClient() throws Exception {
+
+ LoggingOutInterceptor logInterceptor = null;
+
+ for (Interceptor<?> interceptor : context.getEndpoint("cxf:bean:serviceEndpoint", CxfSpringEndpoint.class)
+ .getOutInterceptors()) {
+ if (interceptor instanceof LoggingOutInterceptor) {
+ logInterceptor = LoggingOutInterceptor.class.cast(interceptor);
+ break;
+ }
+ }
+
+ assertNotNull(logInterceptor);
+ // StringPrintWriter writer = new StringPrintWriter();
+ // Unfortunately, LoggingOutInterceptor does not have a setter for writer so
+ // we can't capture the output to verify.
+ // logInterceptor.setPrintWriter(writer);
+
+ ClientProxyFactoryBean proxyFactory = new ClientProxyFactoryBean();
+ ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
+ clientBean.setAddress("http://localhost:" + port
+ + "/services" + ROUTER_ADDRESS);
+ clientBean.setServiceClass(HelloService.class);
+
+ HelloService client = (HelloService) proxyFactory.create();
+
+ String result = client.echo("hello world");
+ assertEquals("echo hello world", result, "we should get the right answer from router");
+
+ }
+
+ @SuppressWarnings("unused")
+ private static final class StringPrintWriter extends PrintWriter {
+ private StringPrintWriter() {
+ super(new StringWriter());
+ }
+
+ private StringPrintWriter(int initialSize) {
+ super(new StringWriter(initialSize));
+ }
+
+ private String getString() {
+ flush();
+ return ((StringWriter) out).toString();
+ }
+ }
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint").to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+ @Bean
+ public CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress(ROUTER_ADDRESS);
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "RAW");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public CxfEndpoint serviceEndpoint(LoggingOutInterceptor loggingOutInterceptor) {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("http://localhost:" + port
+ + "/services" + SERVICE_ADDRESS);
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.HelloService.class);
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "RAW");
+ cxfEndpoint.setProperties(properties);
+ cxfEndpoint.getOutInterceptors().add(loggingOutInterceptor);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public LoggingOutInterceptor loggingOutInterceptor() {
+ LoggingOutInterceptor logger = new LoggingOutInterceptor("write");
+ return logger;
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/MultiPartInvokeImpl.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/MultiPartInvokeImpl.java
deleted file mode 100644
index d64a58c9c59..00000000000
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/MultiPartInvokeImpl.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.cxf.soap.springboot;
-
-import javax.xml.ws.Holder;
-
-import org.apache.camel.cxf.multipart.MultiPartInvoke;
-import org.apache.camel.cxf.multipart.types.InE;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@javax.jws.WebService(
- serviceName = "MultiPartInvokeService",
- portName = "MultiPartInvokePort",
- targetNamespace = "http://adapter.ti.tongtech.com/ws",
- endpointInterface = "org.apache.camel.cxf.multipart.MultiPartInvoke")
-
-public class MultiPartInvokeImpl implements MultiPartInvoke {
-
- private static final Logger LOG = LoggerFactory.getLogger(MultiPartInvokeImpl.class);
-
- @Override
- public void foo(InE in, InE in1, Holder<InE> out, Holder<InE> out1) {
- LOG.info("Executing operation foo");
- LOG.info("{}", in);
- LOG.info("{}", in1);
- try {
- InE outValue = in;
- out.value = outValue;
- InE out1Value = in1;
- out1.value = out1Value;
- } catch (Exception ex) {
- LOG.warn("I/O error: {}", ex.getMessage(), ex);
- throw new RuntimeException(ex);
- }
- }
-
-}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ServiceProvider.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ServiceProvider.java
deleted file mode 100644
index 897eaaf503c..00000000000
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ServiceProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.cxf.soap.springboot;
-
-import javax.xml.transform.Source;
-import javax.xml.ws.Provider;
-import javax.xml.ws.Service.Mode;
-import javax.xml.ws.ServiceMode;
-import javax.xml.ws.WebServiceProvider;
-
-@WebServiceProvider
-@ServiceMode(Mode.PAYLOAD)
-public class ServiceProvider implements Provider<Source> {
-
- @Override
- public Source invoke(Source m) {
- throw new UnsupportedOperationException("Place holder method");
- }
-
-}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/SpringBusFactoryTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/SpringBusFactoryTest.java
new file mode 100644
index 00000000000..697d8361658
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/SpringBusFactoryTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot;
+
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.Bus;
+import org.apache.cxf.binding.soap.SoapBindingFactory;
+import org.apache.cxf.bus.spring.SpringBusFactory;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ SpringBusFactoryTest.class,
+
+})
+public class SpringBusFactoryTest {
+ @Autowired
+ ApplicationContext ctx;
+
+ @Bean
+ Bus cxfBus() {
+ SpringBusFactory bf = new SpringBusFactory();
+ return bf.createBus("META-INF/cxf/cxf.xml", false);
+ }
+
+ @Bean
+ Bus myBus() {
+ SpringBusFactory bf = new SpringBusFactory();
+ return bf.createBus("META-INF/cxf/cxf.xml", true);
+ }
+
+ @Test
+ public void getTheBusInstance() {
+ Bus bus = ctx.getBean("cxfBus", Bus.class);
+ assertNotNull(bus, "The bus should not be null");
+
+ bus = ctx.getBean("myBus", Bus.class);
+ assertNotNull(bus, "The bus should not be null");
+
+ SoapBindingFactory soapBindingFactory = bus.getExtension(SoapBindingFactory.class);
+ assertNotNull(soapBindingFactory, "You should find the factory here");
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WriteXmlDeclarationInterceptor.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WriteXmlDeclarationInterceptor.java
deleted file mode 100644
index b166016bb8d..00000000000
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WriteXmlDeclarationInterceptor.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.cxf.soap.springboot;
-
-import org.apache.cxf.binding.soap.SoapMessage;
-import org.apache.cxf.interceptor.Fault;
-import org.apache.cxf.interceptor.StaxOutInterceptor;
-import org.apache.cxf.phase.AbstractPhaseInterceptor;
-import org.apache.cxf.phase.Phase;
-
-//START SNIPPET: example
-public class WriteXmlDeclarationInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
- public WriteXmlDeclarationInterceptor() {
- super(Phase.PRE_STREAM);
- addBefore(StaxOutInterceptor.class.getName());
- }
-
- @Override
- public void handleMessage(SoapMessage message) throws Fault {
- message.put("org.apache.cxf.stax.force-start-document", Boolean.TRUE);
- }
-
-}
-//END SNIPPET: example
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/converter/PayLoadConvertToPOJOTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/converter/PayLoadConvertToPOJOTest.java
new file mode 100644
index 00000000000..8ee6f77d530
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/converter/PayLoadConvertToPOJOTest.java
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.converter;
+
+
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.non_wrapper.Person;
+import org.apache.camel.non_wrapper.types.GetPerson;
+import org.apache.camel.non_wrapper.types.GetPersonResponse;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ PayLoadConvertToPOJOTest.class,
+ PayLoadConvertToPOJOTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class PayLoadConvertToPOJOTest {
+
+
+ static int port = CXFTestSupport.getPort1();
+
+ @Test
+ public void testClient() throws Exception {
+
+ JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
+ factory.setAddress("http://localhost:" + port + "/services/"
+ + getClass().getSimpleName() + "/CamelContext/RouterPort");
+ factory.setServiceClass(Person.class);
+ Person person = factory.create(Person.class);
+ GetPerson payload = new GetPerson();
+ payload.setPersonId("1234");
+
+ GetPersonResponse reply = person.getPerson(payload);
+ assertEquals("1234", reply.getPersonId(), "Get the wrong person id.");
+
+ }
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+ @Bean
+ public CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("/PayLoadConvertToPOJOTest/CamelContext/RouterPort");
+ cxfEndpoint.setServiceClass(org.apache.camel.non_wrapper.Person.class);
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint").streamCaching().process(new Processor() {
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ // just try to turn the payload to the parameter we want
+ // to use
+ GetPerson request = exchange.getIn().getBody(GetPerson.class);
+
+ GetPersonResponse reply = new GetPersonResponse();
+ reply.setPersonId(request.getPersonId());
+ exchange.getMessage().setBody(reply);
+ }
+
+ });
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchMessageTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchMessageTest.java
new file mode 100644
index 00000000000..1af7b5e57cd
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchMessageTest.java
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.dispatch;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import org.w3c.dom.Document;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+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.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfDispatchMessageTest.class,
+ CxfDispatchMessageTest.TestConfiguration.class,
+ CxfDispatchTestSupport.ServletConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfDispatchMessageTest extends CxfDispatchTestSupport {
+
+ @Autowired
+ ProducerTemplate template;
+
+
+
+
+
+ @Test
+ public void testDipatchMessage() throws Exception {
+ final String name = "Tila";
+ Exchange exchange = sendJaxWsDispatchMessage(name, false);
+ assertEquals(false, exchange.isFailed(), "The request should be handled sucessfully");
+
+ org.apache.camel.Message response = exchange.getMessage();
+ assertNotNull(response, "The response message must not be null");
+
+ String value = decodeResponseFromMessage(response.getBody(InputStream.class), exchange);
+ assertTrue(value.endsWith(name), "The response body must match the request");
+ }
+
+ @Test
+ public void testDipatchMessageOneway() throws Exception {
+ final String name = "Tila";
+ Exchange exchange = sendJaxWsDispatchMessage(name, true);
+ assertEquals(false, exchange.isFailed(), "The request should be handled sucessfully");
+
+ org.apache.camel.Message response = exchange.getOut();
+ assertNotNull(response, "The response message must not be null");
+
+ assertNull(response.getBody(), "The response body must be null");
+ }
+
+ protected Exchange sendJaxWsDispatchMessage(final String name, final boolean oneway) {
+ Exchange exchange = template.send("direct:producer", new Processor() {
+ public void process(final Exchange exchange) {
+ InputStream request
+ = encodeRequestInMessage(oneway ? MESSAGE_ONEWAY_TEMPLATE : MESSAGE_TEMPLATE, name, exchange);
+ exchange.getIn().setBody(request, InputStream.class);
+ // set the operation for oneway; otherwise use the default operation
+ if (oneway) {
+ exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, INVOKE_ONEWAY_NAME);
+ }
+ }
+ });
+ return exchange;
+ }
+
+ private static InputStream encodeRequestInMessage(String form, String name, Exchange exchange) {
+ String payloadstr = String.format(form, name);
+ InputStream message = null;
+ try {
+ message = new ByteArrayInputStream(payloadstr.getBytes("utf-8"));
+ } catch (Exception e) {
+ // ignore and let it fail
+ }
+ return message;
+ }
+
+ private String decodeResponseFromMessage(InputStream message, Exchange exchange) {
+ String value = null;
+ try {
+ Document doc = getDocumentBuilderFactory().newDocumentBuilder().parse(message);
+ value = getResponseType(doc.getDocumentElement());
+ } catch (Exception e) {
+ // ignore and let it fail
+ }
+ return value;
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services"
+ + "/CxfDispatchMessageTest/SoapContext/GreeterPort");
+ cxfEndpoint.setDataFormat(DataFormat.RAW);
+ cxfEndpoint.setSynchronous(true);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:producer")
+ .to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchPayloadTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchPayloadTest.java
new file mode 100644
index 00000000000..08f2b5fe6e9
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchPayloadTest.java
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.dispatch;
+
+import java.io.ByteArrayInputStream;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.component.cxf.converter.CxfPayloadConverter;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.binding.soap.SoapHeader;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfDispatchPayloadTest.class,
+ CxfDispatchPayloadTest.TestConfiguration.class,
+ CxfDispatchTestSupport.ServletConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfDispatchPayloadTest extends CxfDispatchTestSupport {
+
+ @Autowired
+ ProducerTemplate template;
+
+
+ @Test
+ public void testDispatchPayload() throws Exception {
+ final String name = "Tila";
+ Exchange exchange = sendJaxWsDispatchPayload(name, false);
+ assertEquals(false, exchange.isFailed(), "The request should be handled sucessfully");
+
+ org.apache.camel.Message response = exchange.getMessage();
+ assertNotNull(response, "The response must not be null");
+
+ String value = decodeResponseFromPayload((CxfPayload<?>) response.getBody(CxfPayload.class), exchange);
+ assertTrue(value.endsWith(name), "The response must match the request");
+ }
+
+ @Test
+ public void testDispatchPayloadOneway() throws Exception {
+ final String name = "Tila";
+ Exchange exchange = sendJaxWsDispatchPayload(name, true);
+ assertEquals(false, exchange.isFailed(), "The request should be handled sucessfully");
+
+ org.apache.camel.Message response = exchange.getOut();
+ assertNotNull(response, "The response must not be null");
+
+ assertNull(response.getBody(), "The response must be null");
+ }
+
+ private Exchange sendJaxWsDispatchPayload(final String name, final boolean oneway) {
+ Exchange exchange = template.send("direct:producer", new Processor() {
+ public void process(final Exchange exchange) {
+ CxfPayload<SoapHeader> request = encodeRequestInPayload(oneway ? PAYLOAD_ONEWAY_TEMPLATE : PAYLOAD_TEMPLATE,
+ name, exchange);
+ exchange.getIn().setBody(request, CxfPayload.class);
+ exchange.getIn().setHeader(CxfConstants.OPERATION_NAMESPACE, DISPATCH_NS);
+ // set the operation for oneway; otherwise use the default operation
+ if (oneway) {
+ exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, INVOKE_ONEWAY_NAME);
+ }
+ }
+ });
+ return exchange;
+ }
+
+ private static <T> CxfPayload<T> encodeRequestInPayload(String form, String name, Exchange exchange) {
+ String payloadstr = String.format(form, name);
+ CxfPayload<T> payload = null;
+ try {
+ Document doc = getDocumentBuilderFactory().newDocumentBuilder()
+ .parse(new ByteArrayInputStream(payloadstr.getBytes("utf-8")));
+ payload = CxfPayloadConverter.documentToCxfPayload(doc, exchange);
+ } catch (Exception e) {
+ // ignore and let it fail
+ }
+ return payload;
+ }
+
+ private <T> String decodeResponseFromPayload(CxfPayload<T> payload, Exchange exchange) {
+ String value = null;
+ NodeList nodes = CxfPayloadConverter.cxfPayloadToNodeList(payload, exchange);
+ if (nodes != null && nodes.getLength() == 1 && nodes.item(0) instanceof Element) {
+ value = getResponseType((Element) nodes.item(0));
+ }
+ return value;
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services"
+ + "/CxfDispatchPayloadTest/SoapContext/GreeterPort");
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ cxfEndpoint.setSynchronous(true);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:producer")
+ .to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchTestSupport.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchTestSupport.java
new file mode 100644
index 00000000000..86609b0b78e
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfDispatchTestSupport.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.dispatch;
+
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.ws.Endpoint;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfDispatchTestSupport.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public abstract class CxfDispatchTestSupport {
+
+
+
+ protected static final String DISPATCH_NS = "http://camel.apache.org/cxf/jaxws/dispatch";
+ protected static final String INVOKE_NAME = "Invoke";
+ protected static final String INVOKE_ONEWAY_NAME = "InvokeOneWay";
+
+ protected static final String PAYLOAD_TEMPLATE
+ = "<ns1:greetMe xmlns:ns1=\"http://apache.org/hello_world_soap_http/types\"><ns1:requestType>%s</ns1:requestType></ns1:greetMe>";
+ protected static final String PAYLOAD_ONEWAY_TEMPLATE
+ = "<ns1:greetMeOneWay xmlns:ns1=\"http://apache.org/hello_world_soap_http/types\"><ns1:requestType>%s</ns1:requestType></ns1:greetMeOneWay>";
+ protected static final String MESSAGE_TEMPLATE
+ = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body>"
+ + PAYLOAD_TEMPLATE
+ + "</soap:Body></soap:Envelope>";
+ protected static final String MESSAGE_ONEWAY_TEMPLATE
+ = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body>"
+ + PAYLOAD_ONEWAY_TEMPLATE
+ + "</soap:Body></soap:Envelope>";
+ private static DocumentBuilderFactory documentBuilderFactory;
+
+ static int port = CXFTestSupport.getPort1();
+
+ protected Endpoint endpoint;
+
+ @BeforeEach
+ public void startService() {
+ Object implementor = new GreeterImpl();
+ String address = "/"
+ + getClass().getSimpleName() + "/SoapContext/GreeterPort";
+ endpoint = Endpoint.publish(address, implementor);
+ }
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ protected static String getResponseType(Element node) {
+ NodeList nodes = node.getElementsByTagNameNS("http://apache.org/hello_world_soap_http/types", "responseType");
+ if (nodes != null && nodes.getLength() == 1) {
+ Node c = nodes.item(0).getFirstChild();
+ if (c != null) {
+ return c.getNodeValue();
+ }
+ }
+ return null;
+ }
+
+ protected static synchronized DocumentBuilderFactory getDocumentBuilderFactory() {
+ if (documentBuilderFactory == null) {
+ documentBuilderFactory = DocumentBuilderFactory.newInstance();
+ documentBuilderFactory.setNamespaceAware(true);
+ documentBuilderFactory.setIgnoringElementContentWhitespace(true);
+ documentBuilderFactory.setIgnoringComments(true);
+ }
+ return documentBuilderFactory;
+ }
+
+ @Configuration
+ class ServletConfiguration {
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfSoapMessageProviderTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfSoapMessageProviderTest.java
new file mode 100644
index 00000000000..cd05b630ac9
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/dispatch/CxfSoapMessageProviderTest.java
@@ -0,0 +1,188 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.dispatch;
+
+
+
+
+import java.lang.reflect.UndeclaredThrowableException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.handler.Handler;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.ParameterProcessor;
+import org.apache.camel.component.cxf.SoapTargetBean;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.wsdl_first.JaxwsTestHandler;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.Greeter;
+import org.apache.hello_world_soap_http.SOAPService;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfSoapMessageProviderTest.class,
+ CxfSoapMessageProviderTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfSoapMessageProviderTest {
+
+
+
+ static int port = CXFTestSupport.getPort1();
+
+
+
+ @Test
+ public void testSOAPMessageModeDocLit() throws Exception {
+ JaxwsTestHandler fromHandler = getMandatoryBean(JaxwsTestHandler.class, "fromEndpointJaxwsHandler");
+ fromHandler.reset();
+
+ QName serviceName = new QName("http://apache.org/hello_world_soap_http", "SOAPProviderService");
+ QName portName = new QName("http://apache.org/hello_world_soap_http", "SoapProviderPort");
+
+ URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
+ assertNotNull(wsdl);
+
+ SOAPService service = new SOAPService(wsdl, serviceName);
+ assertNotNull(service);
+
+ String response1 = new String("TestSOAPOutputPMessage");
+ String response2 = new String("Bonjour");
+ try {
+ Greeter greeter = service.getPort(portName, Greeter.class);
+ ((BindingProvider) greeter).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfSoapMessageProviderTest/SoapContext/SoapProviderPort");
+ for (int idx = 0; idx < 2; idx++) {
+ String greeting = greeter.greetMe("Milestone-" + idx);
+ assertNotNull(greeting, "no response received from service");
+ assertEquals(response1, greeting);
+
+ String reply = greeter.sayHi();
+ assertNotNull(reply, "no response received from service");
+ assertEquals(response2, reply);
+ }
+ } catch (UndeclaredThrowableException ex) {
+ throw (Exception) ex.getCause();
+ }
+
+ assertEquals(8, fromHandler.getMessageCount(), "Can't get the right message count");
+ assertEquals(0, fromHandler.getFaultCount(), "Can't get the right fault count");
+
+ }
+
+ @Autowired
+ AbstractApplicationContext applicationContext;
+
+ private <T> T getMandatoryBean(Class<T> type, String name) {
+ Object value = applicationContext.getBean(name);
+ assertNotNull(value, "No spring bean found for name <" + name + ">");
+ if (type.isInstance(value)) {
+ return type.cast(value);
+ } else {
+ fail("Spring bean <" + name + "> is not an instanceof " + type.getName() + " but is of type "
+ + ObjectHelper.className(value));
+ return null;
+ }
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public SoapTargetBean targetBean() {
+ return new SoapTargetBean();
+ }
+
+ @Bean
+ public ParameterProcessor parameterProcessor() {
+ return new ParameterProcessor();
+ }
+
+ @Bean
+ public JaxwsTestHandler fromEndpointJaxwsHandler() {
+ return new JaxwsTestHandler();
+ }
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+ @Bean
+ CxfEndpoint soapMessageEndpoint(JaxwsTestHandler fromEndpointJaxwsHandler) {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.SoapMessageProvider.class);
+ cxfEndpoint.setAddress("/CxfSoapMessageProviderTest/SoapContext/SoapProviderPort");
+ List<Handler> handlers = new ArrayList<Handler>();
+ handlers.add(fromEndpointJaxwsHandler);
+ cxfEndpoint.setHandlers(handlers);
+ return cxfEndpoint;
+ }
+
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:soapMessageEndpoint")
+ .process("parameterProcessor")
+ .to("bean:targetBean?method=invokeSoapMessage");
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/AbstractCXFGreeterRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/AbstractCXFGreeterRouterTest.java
new file mode 100644
index 00000000000..85babddb697
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/AbstractCXFGreeterRouterTest.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.http.base.HttpOperationFailedException;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.Greeter;
+import org.apache.hello_world_soap_http.NoSuchCodeLitFault;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ AbstractCXFGreeterRouterTest.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public abstract class AbstractCXFGreeterRouterTest {
+
+
+ private final String testDocLitFaultBody = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+ + "<soap:Body><testDocLitFault xmlns=\"http://apache.org/hello_world_soap_http/types\">"
+ + "<faultType>NoSuchCodeLitFault</faultType></testDocLitFault>"
+ + "</soap:Body></soap:Envelope>";
+
+ protected String routerAddress = "http://localhost:" + port + "/services/"
+ + getClass().getSimpleName() + "/CamelContext/RouterPort";
+
+ protected final QName serviceName = new QName("http://apache.org/hello_world_soap_http", "SOAPService");
+ protected final QName routerPortName = new QName("http://apache.org/hello_world_soap_http", "RouterPort");
+ protected final QName endpointName = new QName("http://apache.org/hello_world_soap_http", "SoapPort");
+
+ static int port = CXFTestSupport.getPort1();
+
+ @Autowired
+ ProducerTemplate template;
+
+
+
+ @Test
+ public void testInvokingServiceFromCXFClient() throws Exception {
+ Service service = Service.create(serviceName);
+ service.addPort(routerPortName, "http://schemas.xmlsoap.org/soap/",
+ routerAddress);
+ Greeter greeter = service.getPort(routerPortName, Greeter.class);
+
+ String reply = greeter.greetMe("test");
+ assertNotNull(reply, "No response received from service");
+ assertEquals("Hello test", reply, "Got the wrong reply");
+ reply = greeter.sayHi();
+ assertNotNull(reply, "No response received from service");
+ assertEquals("Bonjour", reply, "Got the wrong reply");
+
+ greeter.greetMeOneWay("call greetMe OneWay !");
+
+ // test throw the exception
+ try {
+ greeter.testDocLitFault("NoSuchCodeLitFault");
+ // should get the exception here
+ fail("Should get the NoSuchCodeLitFault here.");
+ } catch (NoSuchCodeLitFault fault) {
+ // expect the fault here
+ assertNotNull(fault.getFaultInfo(), "The fault info should not be null");
+ }
+
+ }
+
+ @Test
+ public void testRoutingSOAPFault() {
+ Exception ex = assertThrows(RuntimeCamelException.class,
+ () -> template.sendBody(routerAddress, testDocLitFaultBody));
+
+ assertTrue(ex.getCause() instanceof HttpOperationFailedException, "It should get the response error");
+ assertEquals(500, ((HttpOperationFailedException) ex.getCause()).getStatusCode(),
+ "Get a wrong response code");
+ }
+
+ @Test
+ public void testPublishEndpointUrl() throws Exception {
+ String response = template.requestBody(routerAddress
+ + "?wsdl",
+ null, String.class);
+ assertTrue(response.indexOf("http://www.simple.com/services/test") > 0, "Can't find the right service location.");
+ }
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+ }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterEnrichTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterEnrichTest.java
new file mode 100644
index 00000000000..8e07c18b1c9
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterEnrichTest.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.WriteXmlDeclarationInterceptor;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CXFGreeterEnrichTest.class,
+ CXFGreeterEnrichTest.TestConfiguration.class,
+ CxfAutoConfiguration.class,
+ AbstractCXFGreeterRouterTest.TestConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CXFGreeterEnrichTest extends AbstractCXFGreeterRouterTest {
+
+ private static String backServiceAddress = "/CXFGreeterEnrichTest/SoapContext/SoapPort";
+ protected Endpoint endpoint;
+
+
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @BeforeEach
+ public void startService() {
+ Object implementor = new GreeterImpl();
+ endpoint = Endpoint.publish(backServiceAddress, implementor);
+ }
+
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+ cxfEndpoint.setAddress("/CXFGreeterEnrichTest/CamelContext/RouterPort");
+ cxfEndpoint.setSkipFaultLogging(true);
+ //This interceptor will force the CXF server send the XML start document to client
+ cxfEndpoint.getOutInterceptors().
+ add(new WriteXmlDeclarationInterceptor());
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("publishedEndpointUrl", "http://www.simple.com/services/test");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+ cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ errorHandler(noErrorHandler());
+ from("cxf:bean:routerEndpoint")
+ .enrich().simple("ref:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterRouterTest.java
new file mode 100644
index 00000000000..2b4bbca1988
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CXFGreeterRouterTest.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.WriteXmlDeclarationInterceptor;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CXFGreeterRouterTest.class,
+ CXFGreeterRouterTest.TestConfiguration.class,
+ AbstractCXFGreeterRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CXFGreeterRouterTest extends AbstractCXFGreeterRouterTest {
+
+ private static String backServiceAddress = "/CXFGreeterRouterTest/SoapContext/SoapPort";
+ protected static Endpoint endpoint;
+
+
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @BeforeEach
+ public void startService() {
+ Object implementor = new GreeterImpl();
+ endpoint = Endpoint.publish(backServiceAddress, implementor);
+ }
+
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+ cxfEndpoint.setAddress("/CXFGreeterRouterTest/CamelContext/RouterPort");
+ cxfEndpoint.setSkipFaultLogging(true);
+ //This interceptor will force the CXF server send the XML start document to client
+ cxfEndpoint.getOutInterceptors().
+ add(new WriteXmlDeclarationInterceptor());
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("publishedEndpointUrl", "http://www.simple.com/services/test");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+ cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ errorHandler(noErrorHandler());
+ from("cxf:bean:routerEndpoint")
+ .to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageRouterTest.java
new file mode 100644
index 00000000000..f032ad1d1be
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageRouterTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+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.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfGreeterCXFMessageRouterTest.class,
+ CxfGreeterCXFMessageRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class,
+ AbstractCXFGreeterRouterTest.TestConfiguration.class,
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterCXFMessageRouterTest extends AbstractCXFGreeterRouterTest {
+
+ private static String backServiceAddress = "/CxfGreeterCXFMessageRouterTest/SoapContext/SoapPort";
+ protected static Endpoint endpoint;
+
+
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @BeforeEach
+ public void startService() {
+ Object implementor = new GreeterImpl();
+ endpoint = Endpoint.publish(backServiceAddress, implementor);
+ }
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+ cxfEndpoint.setAddress("/CxfGreeterCXFMessageRouterTest/CamelContext/RouterPort");
+ cxfEndpoint.setLoggingFeatureEnabled(true);
+ cxfEndpoint.setDataFormat(DataFormat.CXF_MESSAGE);
+ cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+ cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+ cxfEndpoint.setDataFormat(DataFormat.CXF_MESSAGE);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint")
+ .to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageWithoutSEIRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageWithoutSEIRouterTest.java
new file mode 100644
index 00000000000..685833f86b3
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterCXFMessageWithoutSEIRouterTest.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+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.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfGreeterCXFMessageWithoutSEIRouterTest.class,
+ CxfGreeterCXFMessageWithoutSEIRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class,
+ AbstractCXFGreeterRouterTest.TestConfiguration.class,
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterCXFMessageWithoutSEIRouterTest extends CxfGreeterCXFMessageRouterTest {
+
+ private static String backServiceAddress = "/CxfGreeterCXFMessageWithoutSEIRouterTest/SoapContext/SoapPort";
+ protected static Endpoint endpoint;
+
+
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @BeforeEach
+ public void startService() {
+ Object implementor = new GreeterImpl();
+ endpoint = Endpoint.publish(backServiceAddress, implementor);
+ }
+
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+ cxfEndpoint.setAddress("/CxfGreeterCXFMessageWithoutSEIRouterTest/CamelContext/RouterPort");
+ cxfEndpoint.setLoggingFeatureEnabled(true);
+ cxfEndpoint.setDataFormat(DataFormat.CXF_MESSAGE);
+ cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+ cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+ cxfEndpoint.setDataFormat(DataFormat.CXF_MESSAGE);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ errorHandler(noErrorHandler());
+
+ from("cxf:bean:routerEndpoint")
+ .to("cxf:bean:serviceEndpoint");
+ }
+
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterConverterRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterConverterRouterTest.java
new file mode 100644
index 00000000000..ef28b0b29d2
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterConverterRouterTest.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfGreeterConverterRouterTest.class,
+ CxfGreeterConverterRouterTest.TestConfiguration.class,
+ AbstractCXFGreeterRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterConverterRouterTest extends AbstractCXFGreeterRouterTest {
+
+ private static String backServiceAddress = "/CxfGreeterConverterRouterTest/SoapContext/SoapPort";
+ protected static Endpoint endpoint;
+
+
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @BeforeEach
+ public void startService() {
+ Object implementor = new GreeterImpl();
+ endpoint = Endpoint.publish(backServiceAddress, implementor);
+ }
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ cxfEndpoint.setAddress("/CxfGreeterConverterRouterTest/CamelContext/RouterPort");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("publishedEndpointUrl", "http://www.simple.com/services/test");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+ cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ errorHandler(noErrorHandler());
+ from("cxf:bean:routerEndpoint")
+ .to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageCamelHttpRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageCamelHttpRouterTest.java
new file mode 100644
index 00000000000..c6a73377c43
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageCamelHttpRouterTest.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+
+import javax.xml.ws.Endpoint;
+
+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.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfGreeterMessageCamelHttpRouterTest.class,
+ CxfGreeterMessageCamelHttpRouterTest.TestConfiguration.class,
+ AbstractCXFGreeterRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfGreeterMessageCamelHttpRouterTest extends CxfGreeterMessageRouterTest {
+
+ protected static Endpoint endpoint;
+ protected static String serverAddress = "http://localhost:" + port + "/services"
+ + "/CxfGreeterMessageCamelHttpRouterTest/SoapContext/SoapPort";
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @BeforeEach
+ public void startService() {
+ Object implementor = new GreeterImpl();
+ String address = "/CxfGreeterMessageCamelHttpRouterTest/SoapContext/SoapPort";
+ endpoint = Endpoint.publish(address, implementor);
+ }
+
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+ cxfEndpoint.setAddress("/CxfGreeterMessageCamelHttpRouterTest/CamelContext/RouterPort");
+ cxfEndpoint.setDataFormat(DataFormat.RAW);
+ cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint")
+ .removeHeaders("CamelHttp*")
+ .to(serverAddress + "?throwExceptionOnFailure=false");
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageRouterTest.java
new file mode 100644
index 00000000000..4c1833ab9b5
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterMessageRouterTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+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.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfGreeterMessageRouterTest.class,
+ CxfGreeterMessageRouterTest.TestConfiguration.class,
+ AbstractCXFGreeterRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterMessageRouterTest extends AbstractCXFGreeterRouterTest {
+
+ private static String backServiceAddress = "/CxfGreeterMessageRouterTest/SoapContext/SoapPort";
+ protected static Endpoint endpoint;
+
+
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @BeforeEach
+ public void startService() {
+ Object implementor = new GreeterImpl();
+ endpoint = Endpoint.publish(backServiceAddress, implementor);
+ }
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+ cxfEndpoint.setAddress("/CxfGreeterMessageRouterTest/CamelContext/RouterPort");
+ cxfEndpoint.setLoggingFeatureEnabled(true);
+ cxfEndpoint.setDataFormat(DataFormat.RAW);
+ cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+ cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+ cxfEndpoint.setDataFormat(DataFormat.RAW);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint")
+ .to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadRouterTest.java
new file mode 100644
index 00000000000..77888e53eaf
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadRouterTest.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+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.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfGreeterPayLoadRouterTest.class,
+ CxfGreeterPayLoadRouterTest.TestConfiguration.class,
+ AbstractCXFGreeterRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterPayLoadRouterTest extends AbstractCXFGreeterRouterTest {
+
+ private static String backServiceAddress = "/CxfGreeterPayLoadRouterTest/SoapContext/SoapPort";
+ protected static Endpoint endpoint;
+
+
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @BeforeEach
+ public void startService() {
+ Object implementor = new GreeterImpl();
+ endpoint = Endpoint.publish(backServiceAddress, implementor);
+ }
+
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+ cxfEndpoint.setAddress("/CxfGreeterPayLoadRouterTest/CamelContext/RouterPort");
+ cxfEndpoint.setLoggingFeatureEnabled(true);
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+ cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint")
+ .to("cxf://http://localhost:" + port + "/services" + backServiceAddress
+ + "?wsdlURL=testutils/hello_world.wsdl"
+ + "&dataFormat=PAYLOAD&serviceClass=org.apache.hello_world_soap_http.Greeter");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadWithFeatureRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadWithFeatureRouterTest.java
new file mode 100644
index 00000000000..cd409f5c118
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterPayLoadWithFeatureRouterTest.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.TestCxfFeature;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfGreeterPayLoadWithFeatureRouterTest.class,
+ CxfGreeterPayLoadWithFeatureRouterTest.TestConfiguration.class,
+ AbstractCXFGreeterRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterPayLoadWithFeatureRouterTest extends AbstractCXFGreeterRouterTest {
+
+ private static String backServiceAddress = "/CxfGreeterPayLoadWithFeatureRouterTest/SoapContext/SoapPort";
+ protected static Endpoint endpoint;
+
+
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @BeforeEach
+ public void startService() {
+ Object implementor = new GreeterImpl();
+ endpoint = Endpoint.publish(backServiceAddress, implementor);
+ }
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.GreeterImpl.class);
+ cxfEndpoint.setAddress("/CxfGreeterPayLoadWithFeatureRouterTest/CamelContext/RouterPort");
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+ cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ cxfEndpoint.getFeatures().add(new TestCxfFeature());
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ errorHandler(noErrorHandler());
+ from("cxf:bean:routerEndpoint")
+ .to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterWSDLOnlyRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterWSDLOnlyRouterTest.java
new file mode 100644
index 00000000000..f17f3910089
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfGreeterWSDLOnlyRouterTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+import javax.xml.ws.Endpoint;
+
+
+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.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfGreeterWSDLOnlyRouterTest.class,
+ CxfGreeterWSDLOnlyRouterTest.TestConfiguration.class,
+ AbstractCXFGreeterRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfGreeterWSDLOnlyRouterTest extends AbstractCXFGreeterRouterTest {
+
+ private static String backServiceAddress = "/CxfGreeterWSDLOnlyRouterTest/SoapContext/SoapPort";
+ protected static Endpoint endpoint;
+
+
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @BeforeEach
+ public void startService() {
+ Object implementor = new GreeterImpl();
+ endpoint = Endpoint.publish(backServiceAddress, implementor);
+ }
+
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("/CxfGreeterWSDLOnlyRouterTest/CamelContext/RouterPort");
+ cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setPublishedEndpointUrl("http://www.simple.com/services/test");
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+ cxfEndpoint.setWsdlURL("testutils/hello_world.wsdl");
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint")
+ .to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfPayloadProviderRouterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfPayloadProviderRouterTest.java
new file mode 100644
index 00000000000..5cca137bdb3
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/greeterroute/CxfPayloadProviderRouterTest.java
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.greeterroute;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Service;
+
+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.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.Greeter;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfPayloadProviderRouterTest.class,
+ CxfPayloadProviderRouterTest.TestConfiguration.class,
+ AbstractCXFGreeterRouterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfPayloadProviderRouterTest extends AbstractCXFGreeterRouterTest {
+
+ private static String backServiceAddress = "/CxfPayloadProviderRouterTest/SoapContext/SoapPort";
+ protected static Endpoint endpoint;
+ protected static GreeterImpl implementor;
+
+
+ @AfterEach
+ public void stopService() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @BeforeEach
+ public void startService() {
+ implementor = new GreeterImpl();
+ endpoint = Endpoint.publish(backServiceAddress, implementor);
+ }
+
+ @Override
+ @Test
+ public void testPublishEndpointUrl() throws Exception {
+ final String path = getClass().getSimpleName() + "/CamelContext/RouterPort/" + getClass().getSimpleName();
+ String response = template.requestBody("http://localhost:" + port + "/services/" + path
+ + "?wsdl",
+ null, String.class);
+ assertTrue(response.indexOf(path) > 0, "Can't find the right service location.");
+ }
+
+ @Test
+ public void testInvokeGreetMeOverProvider() throws Exception {
+ Service service = Service.create(serviceName);
+ service.addPort(routerPortName, "http://schemas.xmlsoap.org/soap/",
+ "http://localhost:" + port + "/services/"
+ + getClass().getSimpleName()
+ + "/CamelContext/RouterPort");
+ Greeter greeter = service.getPort(routerPortName, Greeter.class);
+ org.apache.cxf.endpoint.Client client = org.apache.cxf.frontend.ClientProxy.getClient(greeter);
+ VerifyInboundInterceptor icp = new VerifyInboundInterceptor();
+ client.getInInterceptors().add(icp);
+
+ int ic = implementor.getInvocationCount();
+
+ icp.setCalled(false);
+ String reply = greeter.greetMe("test");
+ assertEquals("Hello test", reply, "Got the wrong reply");
+ assertTrue(icp.isCalled(), "No Inbound message received");
+ assertEquals(++ic, implementor.getInvocationCount(), "The target service not invoked");
+
+ icp.setCalled(false);
+ greeter.greetMeOneWay("call greetMe OneWay !");
+ assertFalse(icp.isCalled(), "An unnecessary inbound message");
+ // wait a few seconds for the async oneway service to be invoked
+ Thread.sleep(3000);
+ assertEquals(++ic, implementor.getInvocationCount(), "The target service not invoked");
+ }
+
+ static class VerifyInboundInterceptor extends AbstractPhaseInterceptor<Message> {
+ private boolean called;
+
+ VerifyInboundInterceptor() {
+ super(Phase.USER_PROTOCOL);
+ }
+
+ @Override
+ public void handleMessage(Message message) throws Fault {
+ called = true;
+ }
+
+ public boolean isCalled() {
+ return called;
+ }
+
+ public void setCalled(boolean b) {
+ called = b;
+ }
+
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("/CxfPayloadProviderRouterTest/CamelContext/RouterPort");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("jaxws.provider.interpretNullAsOneway", true);
+ cxfEndpoint.setProperties(properties);
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ cxfEndpoint.setSynchronous(true);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services" + backServiceAddress);
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ cxfEndpoint.setSynchronous(true);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint")
+ .setHeader("operationNamespace", constant("http://camel.apache.org/cxf/jaxws/dispatch"))
+ .setHeader("operationName", constant("Invoke"))
+ .to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/jms/CxfEndpointJMSConsumerTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/jms/CxfEndpointJMSConsumerTest.java
new file mode 100644
index 00000000000..832e6c1fcd5
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/jms/CxfEndpointJMSConsumerTest.java
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.jms;
+
+
+
+
+import javax.xml.namespace.QName;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.hello_world_soap_http.Greeter;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfEndpointJMSConsumerTest.class,
+ CxfEndpointJMSConsumerTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }
+)
+public class CxfEndpointJMSConsumerTest {
+
+ private String namespace = "http://apache.org/hello_world_soap_http";
+ private QName serviceName = new QName(namespace, "SOAPService");
+ private QName endpointName = new QName(namespace, "SoapPort");
+ // Here we just the address with JMS URI
+ String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue"
+ + "?jndiInitialContextFactory"
+ + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
+ + "&jndiConnectionFactoryName=ConnectionFactory&jndiURL="
+ + "vm://localhost";
+
+
+
+ @Test
+ public void testInvocation() {
+ // Here we just the address with JMS URI
+ String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue"
+ + "?jndiInitialContextFactory"
+ + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
+ + "&jndiConnectionFactoryName=ConnectionFactory&jndiURL="
+ + "vm://localhost";
+
+ JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
+ factory.setServiceClass(Greeter.class);
+ factory.setAddress(address);
+ Greeter greeter = factory.create(Greeter.class);
+ String response = greeter.greetMe("Camel");
+ assertEquals("Hello Camel", response, "Get a wrong response");
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ CxfEndpoint jmsEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setEndpointNameAsQName(endpointName);
+ cxfEndpoint.setServiceClass(org.apache.hello_world_soap_http.Greeter.class);
+ cxfEndpoint.setAddress(address);
+ cxfEndpoint.getInInterceptors().add(new org.apache.cxf.ext.logging.LoggingInInterceptor());
+ cxfEndpoint.getOutInterceptors().add(new org.apache.cxf.ext.logging.LoggingOutInterceptor());
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:jmsEndpoint").process(new Processor() {
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ // just set the response for greetme operation here
+ String me = exchange.getIn().getBody(String.class);
+ exchange.getMessage().setBody("Hello " + me);
+ }
+ });
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfJavaMtomProducerPayloadTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfJavaMtomProducerPayloadTest.java
new file mode 100644
index 00000000000..e95ec0609dc
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfJavaMtomProducerPayloadTest.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+import java.awt.Image;
+import java.util.List;
+
+import javax.xml.ws.Holder;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class, CxfJavaMtomProducerPayloadTest.class,
+ CxfAutoConfiguration.class,
+ CxfMtomConsumerTest.TestConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfJavaMtomProducerPayloadTest extends CxfMtomConsumerTest {
+ protected String MTOM_ENDPOINT_URI_MTOM_ENABLE = "cxf://http://localhost:" + port + "/services"
+ + MTOM_ENDPOINT_ADDRESS
+ + "?serviceClass=org.apache.camel.cxf.mtom_feature.Hello"
+ + "&properties.mtom-enabled=true"
+ + "&defaultOperationName=Detail";
+ private static final Logger LOG = LoggerFactory.getLogger(CxfJavaMtomProducerPayloadTest.class);
+
+ @Autowired
+ CamelContext context;
+
+
+ @Override
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testInvokingService() throws Exception {
+ if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+ return;
+ }
+
+ final Holder<byte[]> photo = new Holder<>("RequestFromCXF".getBytes("UTF-8"));
+ final Holder<Image> image = new Holder<>(getImage("/java.jpg"));
+
+ Exchange exchange = context.createProducerTemplate().send(MTOM_ENDPOINT_URI_MTOM_ENABLE,
+ new Processor() {
+
+ @Override
+ public void process(Exchange exchange)
+ throws Exception {
+ exchange.getIn()
+ .setBody(new Object[] {
+ photo,
+ image
+ });
+
+ }
+
+ });
+
+ AttachmentMessage out = exchange.getMessage(AttachmentMessage.class);
+ assertEquals(2, out.getAttachments().size(), "We should get 2 attachements here.");
+ assertEquals("application/xop+xml", out.getHeader("Content-Type"), "Get a wrong Content-Type header");
+ // Get the parameter list
+ List<?> parameter = out.getBody(List.class);
+ // Get the operation name
+ final Holder<byte[]> responsePhoto = (Holder<byte[]>)parameter.get(1);
+ assertNotNull(responsePhoto.value, "The photo should not be null");
+ assertEquals(new String(responsePhoto.value, "UTF-8"), "ResponseFromCamel",
+ "Should get the right response");
+
+ final Holder<Image> responseImage = (Holder<Image>)parameter.get(2);
+ assertNotNull(responseImage.value, "We should get the image here");
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerMutipleParameterTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerMutipleParameterTest.java
new file mode 100644
index 00000000000..601b33881f4
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerMutipleParameterTest.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+import java.awt.image.BufferedImage;
+import java.util.List;
+
+import java.awt.Image;
+import javax.imageio.ImageIO;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.soap.SOAPBinding;
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.ext.logging.LoggingFeature;
+import org.apache.cxf.frontend.ClientFactoryBean;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfMtomConsumerMutipleParameterTest.class,
+ CxfMtomConsumerMutipleParameterTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomConsumerMutipleParameterTest {
+
+ protected String MTOM_ENDPOINT_ADDRESS = "/CxfMtomConsumerTest/jaxws-mtom/hello";
+ protected String MTOM_ENDPOINT_URI = "cxf://" + MTOM_ENDPOINT_ADDRESS
+ + "?serviceClass=org.apache.camel.component.cxf.soap.springboot.mtom.ImageService&properties.mtom-enabled=true";
+ private static final Logger LOG = LoggerFactory.getLogger(CxfMtomConsumerMutipleParameterTest.class);
+
+ static int port = CXFTestSupport.getPort1();
+
+
+
+
+ private ImageService getPort() {
+
+ JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();
+ ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
+ clientBean.setAddress("http://localhost:" + port + "/services" + MTOM_ENDPOINT_ADDRESS);
+ clientBean.setServiceClass(ImageService.class);
+ proxyFactory.getFeatures().add(new LoggingFeature());
+ ImageService imageService = (ImageService) proxyFactory.create();
+ return imageService;
+ }
+
+ protected Image getImage(String name) throws Exception {
+ return ImageIO.read(getClass().getResource(name));
+ }
+
+
+ @Test
+ public void testInvokingServiceBare() throws Exception {
+ if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+ return;
+ }
+
+ Image image = getImage("/java.jpg");
+
+ ImageService port = getPort();
+
+ SOAPBinding binding = (SOAPBinding) ((BindingProvider) port).getBinding();
+ binding.setMTOMEnabled(true);
+
+ String ret = port.uploadImage(image, "RequestFromCXF");
+
+ assertEquals(ret,
+ "RequestFromCXF hello", "Should get the right response");
+
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from(MTOM_ENDPOINT_URI).process(new Processor() {
+ public void process(final Exchange exchange) throws Exception {
+ AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
+ assertNull(in.getAttachments(), "We should not get any attachements here.");
+ assertEquals("application/xop+xml", in.getHeader("Content-Type"), "Get a wrong Content-Type header");
+ // Get the parameter list
+ List<?> parameter = in.getBody(List.class);
+ // Get the operation name
+ String name = (String)parameter.get(1);
+ assertNotNull(name, "The name should not be null");
+ assertEquals(name,
+ "RequestFromCXF", "Should get the right request");
+ BufferedImage image = (BufferedImage) parameter.get(0);
+ assertNotNull(image, "We should get the image here");
+ exchange.getMessage().setBody(name + " hello");
+
+ }
+ });
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerPayloadModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerPayloadModeTest.java
new file mode 100644
index 00000000000..72b053f3edc
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerPayloadModeTest.java
@@ -0,0 +1,206 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.activation.DataHandler;
+import javax.mail.util.ByteArrayDataSource;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.xpath.XPathConstants;
+
+import org.w3c.dom.Element;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.binding.soap.SoapHeader;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.helpers.XPathUtils;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfMtomConsumerPayloadModeTest.class,
+ CxfMtomConsumerPayloadModeTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomConsumerPayloadModeTest {
+
+ private final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+ private final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+
+
+
+ private static final Logger LOG = LoggerFactory.getLogger(CxfMtomConsumerPayloadModeTest.class);
+
+ static int port = CXFTestSupport.getPort1();
+
+ @Autowired
+ private ProducerTemplate template;
+
+ @Test
+ public void testConsumer() throws Exception {
+ if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+ return;
+ }
+
+ Exchange exchange = template.send("cxf:bean:consumerEndpoint", new Processor() {
+
+ public void process(Exchange exchange) throws Exception {
+ exchange.setPattern(ExchangePattern.InOut);
+ List<Source> elements = new ArrayList<>();
+ elements.add(new DOMSource(StaxUtils.read(new StringReader(getRequestMessage())).getDocumentElement()));
+ CxfPayload<SoapHeader> body = new CxfPayload<>(
+ new ArrayList<SoapHeader>(),
+ elements, null);
+ exchange.getIn().setBody(body);
+ exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_PHOTO_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, "application/octet-stream")));
+
+ exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_IMAGE_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
+ }
+ });
+ assertEquals(exchange.getIn(AttachmentMessage.class).getAttachments().size(), 2);
+ }
+
+ protected String getRequestMessage() {
+ return MtomTestHelper.REQ_MESSAGE;
+ }
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+ @Bean
+ public CxfEndpoint consumerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("/" + getClass().getSimpleName()+ "/jaxws-mtom/hello");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ properties.put("mtom-enabled", true);
+ properties.put("loggingFeatureEnabled", false);
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:consumerEndpoint").process(new Processor() {
+
+ @SuppressWarnings("unchecked")
+ public void process(Exchange exchange) throws Exception {
+ CxfPayload<SoapHeader> in = exchange.getIn().getBody(CxfPayload.class);
+
+ // verify request
+ assertEquals(1, in.getBody().size());
+
+ Map<String, String> ns = new HashMap<>();
+ ns.put("ns", MtomTestHelper.SERVICE_TYPES_NS);
+ ns.put("xop", MtomTestHelper.XOP_NS);
+
+ XPathUtils xu = new XPathUtils(ns);
+ Element body = new XmlConverter().toDOMElement(in.getBody().get(0));
+ Element ele = (Element) xu.getValue("//ns:Detail/ns:photo/xop:Include", body,
+ XPathConstants.NODE);
+ String photoId = ele.getAttribute("href").substring(4); // skip "cid:"
+ assertEquals(MtomTestHelper.REQ_PHOTO_CID, photoId);
+
+ ele = (Element) xu.getValue("//ns:Detail/ns:image/xop:Include", body,
+ XPathConstants.NODE);
+ String imageId = ele.getAttribute("href").substring(4); // skip "cid:"
+ assertEquals(MtomTestHelper.REQ_IMAGE_CID, imageId);
+
+ DataHandler dr = exchange.getIn(AttachmentMessage.class).getAttachment(photoId);
+ assertEquals("application/octet-stream", dr.getContentType());
+ assertArrayEquals(MtomTestHelper.REQ_PHOTO_DATA, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+ dr = exchange.getIn(AttachmentMessage.class).getAttachment(imageId);
+ assertEquals("image/jpeg", dr.getContentType());
+ assertArrayEquals(MtomTestHelper.requestJpeg, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+ // create response
+ List<Source> elements = new ArrayList<>();
+ elements.add(new DOMSource(StaxUtils.read(new StringReader(MtomTestHelper.RESP_MESSAGE)).getDocumentElement()));
+ CxfPayload<SoapHeader> sbody = new CxfPayload<>(
+ new ArrayList<SoapHeader>(),
+ elements, null);
+ exchange.getIn().setBody(sbody);
+ exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_PHOTO_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.RESP_PHOTO_DATA, "application/octet-stream")));
+
+ exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_IMAGE_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.responseJpeg, "image/jpeg")));
+
+ }
+ });
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerTest.java
new file mode 100644
index 00000000000..7e9ba5d77ae
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomConsumerTest.java
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+import java.awt.Image;
+import java.net.URL;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Holder;
+import javax.xml.ws.soap.SOAPBinding;
+
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.ext.logging.LoggingInInterceptor;
+import org.apache.cxf.ext.logging.LoggingOutInterceptor;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfMtomConsumerTest.class,
+ CxfMtomConsumerTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomConsumerTest {
+
+ protected String MTOM_ENDPOINT_ADDRESS = "/CxfMtomConsumerTest/jaxws-mtom/hello";
+ protected String MTOM_ENDPOINT_URI = "cxf://" + MTOM_ENDPOINT_ADDRESS
+ + "?serviceClass=org.apache.camel.cxf.mtom_feature.Hello&properties.mtom-enabled=true";
+
+ private static final Logger LOG = LoggerFactory.getLogger(CxfMtomConsumerTest.class);
+
+ private final QName serviceName = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+
+ static int port = CXFTestSupport.getPort1();
+
+
+
+
+ private Hello getPort() {
+ URL wsdl = getClass().getResource("/mtom.wsdl");
+ assertNotNull(wsdl, "WSDL is null");
+
+ HelloService service = new HelloService(wsdl, serviceName);
+ assertNotNull(service, "Service is null");
+ Hello hello = service.getHelloPort();
+
+ ((BindingProvider) hello).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services" + MTOM_ENDPOINT_ADDRESS);
+ Client c = ClientProxy.getClient(hello);
+ c.getInInterceptors().add(new LoggingInInterceptor());
+ c.getOutInterceptors().add(new LoggingOutInterceptor());
+ return hello;
+ }
+
+ protected Image getImage(String name) throws Exception {
+ return ImageIO.read(getClass().getResource(name));
+ }
+
+ @Test
+ public void testInvokingService() throws Exception {
+ if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+ return;
+ }
+
+ Holder<byte[]> photo = new Holder<>("RequestFromCXF".getBytes("UTF-8"));
+ Holder<Image> image = new Holder<>(getImage("/java.jpg"));
+
+ Hello port = getPort();
+
+ SOAPBinding binding = (SOAPBinding) ((BindingProvider) port).getBinding();
+ binding.setMTOMEnabled(true);
+
+ port.detail(photo, image);
+
+ assertEquals("ResponseFromCamel", new String(photo.value, "UTF-8"));
+ assertNotNull(image.value);
+
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from(MTOM_ENDPOINT_URI).process(new Processor() {
+ @SuppressWarnings("unchecked")
+ public void process(final Exchange exchange) throws Exception {
+ AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
+ assertNull(in.getAttachments(), "We should not get any attachements here.");
+ assertEquals("application/xop+xml", in.getHeader("Content-Type"), "Get a wrong Content-Type header");
+ // Get the parameter list
+ List<?> parameter = in.getBody(List.class);
+ // Get the operation name
+ Holder<byte[]> photo = (Holder<byte[]>) parameter.get(0);
+ assertNotNull(photo.value, "The photo should not be null");
+ assertEquals(new String(photo.value, "UTF-8"),
+ "RequestFromCXF", "Should get the right request");
+ photo.value = "ResponseFromCamel".getBytes("UTF-8");
+ Holder<Image> image = (Holder<Image>) parameter.get(1);
+ assertNotNull(image.value, "We should get the image here");
+ // set the holder message back
+ exchange.getMessage().setBody(new Object[] { null, photo, image });
+
+ }
+ });
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledConsumerPayloadModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledConsumerPayloadModeTest.java
new file mode 100644
index 00000000000..fd52ce69a74
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledConsumerPayloadModeTest.java
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.activation.DataHandler;
+import javax.mail.util.ByteArrayDataSource;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.CxfMtomConsumerPayloadModeTest;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.binding.soap.SoapHeader;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Unit test for exercising SOAP with Attachment (SwA) feature of a CxfConsumer in PAYLOAD mode. That is, testing
+ * attachment with MTOM optimization off.
+ */
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class, CxfMtomDisabledConsumerPayloadModeTest.class,
+ CxfMtomDisabledConsumerPayloadModeTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomDisabledConsumerPayloadModeTest {
+
+
+ private final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+ private final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+
+ static int port = CXFTestSupport.getPort1();
+
+
+ private static final Logger LOG = LoggerFactory.getLogger(CxfMtomConsumerPayloadModeTest.class);
+
+ @Autowired
+ private ProducerTemplate template;
+
+ @Test
+ public void testConsumer() throws Exception {
+ if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+ return;
+ }
+
+ template.send("cxf:bean:consumerEndpoint", new Processor() {
+
+ public void process(Exchange exchange) throws Exception {
+ exchange.setPattern(ExchangePattern.InOut);
+ List<Source> elements = new ArrayList<>();
+ elements.add(new DOMSource(StaxUtils.read(new StringReader(getRequestMessage())).getDocumentElement()));
+ CxfPayload<SoapHeader> body = new CxfPayload<>(
+ new ArrayList<SoapHeader>(),
+ elements, null);
+ exchange.getIn().setBody(body);
+ exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_PHOTO_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, "application/octet-stream")));
+
+ exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_IMAGE_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
+ }
+ });
+ }
+
+ protected String getRequestMessage() {
+ return MtomTestHelper.MTOM_DISABLED_REQ_MESSAGE;
+ }
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+ @Bean
+ public CxfEndpoint consumerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("/" + getClass().getSimpleName()+ "/jaxws-mtom/hello");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ properties.put("mtom-enabled", false);
+ properties.put("loggingFeatureEnabled", false);
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:consumerEndpoint").process(new Processor() {
+
+ @SuppressWarnings("unchecked")
+ public void process(Exchange exchange) throws Exception {
+ CxfPayload<SoapHeader> in = exchange.getIn().getBody(CxfPayload.class);
+
+ // verify request
+ assertEquals(1, in.getBody().size());
+
+ DataHandler dr = exchange.getIn(AttachmentMessage.class).getAttachment(MtomTestHelper.REQ_PHOTO_CID);
+ assertEquals("application/octet-stream", dr.getContentType());
+ assertArrayEquals(MtomTestHelper.REQ_PHOTO_DATA, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+ dr = exchange.getIn(AttachmentMessage.class).getAttachment(MtomTestHelper.REQ_IMAGE_CID);
+ assertEquals("image/jpeg", dr.getContentType());
+ assertArrayEquals(MtomTestHelper.requestJpeg, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+ // create response
+ List<Source> elements = new ArrayList<>();
+ elements.add(new DOMSource(
+ StaxUtils.read(new StringReader(MtomTestHelper.MTOM_DISABLED_RESP_MESSAGE)).getDocumentElement()));
+ CxfPayload<SoapHeader> body = new CxfPayload<>(
+ new ArrayList<SoapHeader>(),
+ elements, null);
+ exchange.getMessage().setBody(body);
+ exchange.getMessage(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_PHOTO_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.RESP_PHOTO_DATA, "application/octet-stream")));
+
+ exchange.getMessage(AttachmentMessage.class).addAttachment(MtomTestHelper.RESP_IMAGE_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.responseJpeg, "image/jpeg")));
+
+ }
+ });
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledProducerPayloadModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledProducerPayloadModeTest.java
new file mode 100644
index 00000000000..70e77210e0a
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomDisabledProducerPayloadModeTest.java
@@ -0,0 +1,287 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+
+
+
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import javax.mail.util.ByteArrayDataSource;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Holder;
+import javax.xml.ws.WebServiceContext;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.soap.SOAPBinding;
+
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.HelloImpl;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.cxf.attachment.AttachmentDataSource;
+import org.apache.cxf.binding.soap.SoapHeader;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfMtomDisabledProducerPayloadModeTest.class,
+ CxfMtomDisabledProducerPayloadModeTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfMtomDisabledProducerPayloadModeTest {
+
+ protected final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+ protected final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+ private static final Logger LOG = LoggerFactory.getLogger(CxfMtomDisabledProducerPayloadModeTest.class);
+
+ @Autowired
+ protected CamelContext context;
+ private Endpoint endpoint;
+
+ static int port = CXFTestSupport.getPort1();
+
+
+
+
+ @BeforeEach
+ public void setUp() throws Exception {
+ endpoint = Endpoint.publish("/" + getClass().getSimpleName()
+ + "/jaxws-mtom/hello",
+ getServiceImpl());
+ SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
+ binding.setMTOMEnabled(isMtomEnabled());
+ }
+
+ @AfterEach
+ public void tearDown() throws Exception {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @Test
+ public void testProducer() throws Exception {
+ if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+ return;
+ }
+
+ Exchange exchange = context.createProducerTemplate().send("direct:testEndpoint", new Processor() {
+
+ public void process(Exchange exchange) throws Exception {
+ exchange.setPattern(ExchangePattern.InOut);
+ List<Source> elements = new ArrayList<>();
+ elements.add(new DOMSource(
+ StaxUtils.read(new StringReader(MtomTestHelper.MTOM_DISABLED_REQ_MESSAGE)).getDocumentElement()));
+ CxfPayload<SoapHeader> body = new CxfPayload<>(
+ new ArrayList<SoapHeader>(),
+ elements, null);
+ exchange.getIn().setBody(body);
+ exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_PHOTO_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, "application/octet-stream")));
+
+ exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_IMAGE_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
+
+ }
+
+ });
+
+ // process response - verify response attachments
+
+ CxfPayload<?> out = exchange.getMessage().getBody(CxfPayload.class);
+ assertEquals(1, out.getBody().size());
+
+ DataHandler dr = exchange.getMessage(AttachmentMessage.class).getAttachment(MtomTestHelper.RESP_PHOTO_CID);
+ assertEquals("application/octet-stream", dr.getContentType());
+ assertArrayEquals(MtomTestHelper.RESP_PHOTO_DATA, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+ dr = exchange.getMessage(AttachmentMessage.class).getAttachment(MtomTestHelper.RESP_IMAGE_CID);
+ assertEquals("image/jpeg", dr.getContentType());
+
+ BufferedImage image = ImageIO.read(dr.getInputStream());
+ assertEquals(560, image.getWidth());
+ assertEquals(300, image.getHeight());
+
+ }
+
+ public static class MyHelloImpl extends HelloImpl implements Hello {
+
+ @Resource
+ WebServiceContext ctx;
+
+ @Override
+ public void detail(Holder<byte[]> photo, Holder<Image> image) {
+
+ // verify request attachments
+ Map<String, DataHandler> map
+ = CastUtils.cast((Map<?, ?>) ctx.getMessageContext().get(MessageContext.INBOUND_MESSAGE_ATTACHMENTS));
+ assertEquals(2, map.size());
+
+ DataHandler dh = map.get(MtomTestHelper.REQ_PHOTO_CID);
+ assertEquals("application/octet-stream", dh.getContentType());
+ byte[] bytes = null;
+ try {
+ bytes = IOUtils.readBytesFromStream(dh.getInputStream());
+ } catch (IOException e) {
+ LOG.warn("I/O error reading bytes from stream: {}", e.getMessage(), e);
+ }
+ assertArrayEquals(MtomTestHelper.REQ_PHOTO_DATA, bytes);
+
+ dh = map.get(MtomTestHelper.REQ_IMAGE_CID);
+ assertEquals("image/jpeg", dh.getContentType());
+
+ BufferedImage bufferedImage = null;
+ try {
+ bufferedImage = ImageIO.read(dh.getInputStream());
+
+ } catch (IOException e) {
+ LOG.warn("I/O error reading bytes from stream: {}", e.getMessage(), e);
+ }
+ assertNotNull(bufferedImage);
+ assertEquals(41, bufferedImage.getWidth());
+ assertEquals(39, bufferedImage.getHeight());
+
+ // add output attachments
+ map = CastUtils.cast((Map<?, ?>) ctx.getMessageContext().get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS));
+
+ try {
+ DataSource ds = new AttachmentDataSource("image/jpeg", getClass().getResourceAsStream("/Splash.jpg"));
+ map.put(MtomTestHelper.RESP_IMAGE_CID, new DataHandler(ds));
+
+ } catch (Exception e) {
+ LOG.warn("I/O error: {}", e.getMessage(), e);
+ }
+
+ try {
+ DataSource ds = new AttachmentDataSource(
+ "application/octet-stream",
+ new ByteArrayInputStream(MtomTestHelper.RESP_PHOTO_DATA));
+ map.put(MtomTestHelper.RESP_PHOTO_CID, new DataHandler(ds));
+
+ } catch (Exception e) {
+ LOG.warn("I/O error: {}", e.getMessage(), e);
+ }
+
+ }
+ }
+
+
+ protected boolean isMtomEnabled() {
+ return false;
+ }
+
+ protected Object getServiceImpl() {
+ return new MyHelloImpl();
+ }
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+
+ @Bean
+ public CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/"
+ + "CxfMtomDisabledProducerPayloadModeTest" + "/jaxws-mtom/hello");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ properties.put("loggingFeatureEnabled", false);
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:testEndpoint").
+ to("cxf:bean:serviceEndpoint?defaultOperationName=Detail");
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomPOJOProducerTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomPOJOProducerTest.java
new file mode 100644
index 00000000000..cfeaefc6702
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomPOJOProducerTest.java
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+
+
+
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.imageio.ImageIO;
+import javax.xml.namespace.QName;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Holder;
+import javax.xml.ws.soap.SOAPBinding;
+
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.HelloImpl;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfMtomPOJOProducerTest.class,
+ CxfMtomPOJOProducerTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfMtomPOJOProducerTest {
+
+ protected final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+ protected final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+ private static final Logger LOG = LoggerFactory.getLogger(CxfMtomPOJOProducerTest.class);
+
+ @Autowired
+ protected CamelContext context;
+ private Endpoint endpoint;
+
+ static int port = CXFTestSupport.getPort1();
+
+
+ @BeforeEach
+ public void setUp() throws Exception {
+ endpoint = Endpoint.publish("/CxfMtomPOJOProducerTest/jaxws-mtom/hello", getImpl());
+ SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
+ binding.setMTOMEnabled(true);
+
+ }
+
+ @AfterEach
+ public void tearDown() throws Exception {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testInvokingServiceFromCxfProducer() throws Exception {
+ if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+ return;
+ }
+
+ final Holder<byte[]> photo = new Holder<>(MtomTestHelper.REQ_PHOTO_DATA);
+ final Holder<Image> image = new Holder<>(getImage("/java.jpg"));
+
+ Exchange exchange = context.createProducerTemplate().send("direct://testEndpoint", new Processor() {
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ exchange.getIn().setBody(new Object[] { photo, image });
+
+ }
+
+ });
+
+ assertEquals(2, exchange.getMessage(AttachmentMessage.class).getAttachments().size(),
+ "The attachement size should be 2");
+
+ Object[] result = exchange.getMessage().getBody(Object[].class);
+ Holder<byte[]> photo1 = (Holder<byte[]>) result[1];
+ assertArrayEquals(MtomTestHelper.RESP_PHOTO_DATA, photo1.value);
+ Holder<Image> image1 = (Holder<Image>) result[2];
+ assertNotNull(image1.value);
+ if (image.value instanceof BufferedImage) {
+ assertEquals(560, ((BufferedImage) image1.value).getWidth());
+ assertEquals(300, ((BufferedImage) image1.value).getHeight());
+ }
+
+ }
+
+ private Image getImage(String name) throws Exception {
+ return ImageIO.read(getClass().getResource(name));
+ }
+
+ protected Object getImpl() {
+ return new HelloImpl();
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+
+ @Bean
+ public CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/"
+ + "CxfMtomPOJOProducerTest" + "/jaxws-mtom/hello");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ cxfEndpoint.setServiceClass(org.apache.camel.cxf.mtom_feature.Hello.class);
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("mtom-enabled", true);
+ properties.put("loggingFeatureEnabled", false);
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:testEndpoint").
+ to("cxf:bean:serviceEndpoint?defaultOperationName=Detail");
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomProducerPayloadModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomProducerPayloadModeTest.java
new file mode 100644
index 00000000000..48271a55b8f
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomProducerPayloadModeTest.java
@@ -0,0 +1,241 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+
+
+
+import java.awt.image.BufferedImage;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.activation.DataHandler;
+import javax.imageio.ImageIO;
+import javax.mail.util.ByteArrayDataSource;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.soap.SOAPBinding;
+import javax.xml.xpath.XPathConstants;
+
+import org.w3c.dom.Element;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.HelloImpl;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.apache.cxf.binding.soap.SoapHeader;
+import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.helpers.XPathUtils;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfMtomProducerPayloadModeTest.class,
+ CxfMtomProducerPayloadModeTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfMtomProducerPayloadModeTest {
+
+ protected final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+ protected final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+ private static final Logger LOG = LoggerFactory.getLogger(CxfMtomProducerPayloadModeTest.class);
+
+ @Autowired
+ protected CamelContext context;
+ private Endpoint endpoint;
+
+ static int port = CXFTestSupport.getPort1();
+
+
+
+ @BeforeEach
+ public void setUp() throws Exception {
+ endpoint = Endpoint.publish("/" + getClass().getSimpleName()
+ + "/jaxws-mtom/hello",
+ getServiceImpl());
+ SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
+ binding.setMTOMEnabled(isMtomEnabled());
+ }
+
+ @AfterEach
+ public void tearDown() throws Exception {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testProducer() throws Exception {
+ if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+ return;
+ }
+
+ // START SNIPPET: producer
+
+ Exchange exchange = context.createProducerTemplate().send("direct:testEndpoint", new Processor() {
+
+ public void process(Exchange exchange) throws Exception {
+ exchange.setPattern(ExchangePattern.InOut);
+ List<Source> elements = new ArrayList<>();
+ elements.add(new DOMSource(StaxUtils.read(new StringReader(MtomTestHelper.REQ_MESSAGE)).getDocumentElement()));
+ CxfPayload<SoapHeader> body = new CxfPayload<>(
+ new ArrayList<SoapHeader>(),
+ elements, null);
+ exchange.getIn().setBody(body);
+ exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_PHOTO_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.REQ_PHOTO_DATA, "application/octet-stream")));
+
+ exchange.getIn(AttachmentMessage.class).addAttachment(MtomTestHelper.REQ_IMAGE_CID,
+ new DataHandler(new ByteArrayDataSource(MtomTestHelper.requestJpeg, "image/jpeg")));
+
+ }
+
+ });
+
+ // process response
+
+ CxfPayload<SoapHeader> out = exchange.getMessage().getBody(CxfPayload.class);
+ assertEquals(1, out.getBody().size());
+
+ Map<String, String> ns = new HashMap<>();
+ ns.put("ns", MtomTestHelper.SERVICE_TYPES_NS);
+ ns.put("xop", MtomTestHelper.XOP_NS);
+
+ XPathUtils xu = new XPathUtils(ns);
+ Element oute = new XmlConverter().toDOMElement(out.getBody().get(0));
+ Element ele = (Element) xu.getValue("//ns:DetailResponse/ns:photo/xop:Include", oute,
+ XPathConstants.NODE);
+ String photoId = ele.getAttribute("href").substring(4); // skip "cid:"
+
+ ele = (Element) xu.getValue("//ns:DetailResponse/ns:image/xop:Include", oute,
+ XPathConstants.NODE);
+ String imageId = ele.getAttribute("href").substring(4); // skip "cid:"
+
+ DataHandler dr = exchange.getMessage(AttachmentMessage.class).getAttachment(decodingReference(photoId));
+ assertEquals("application/octet-stream", dr.getContentType());
+ assertArrayEquals(MtomTestHelper.RESP_PHOTO_DATA, IOUtils.readBytesFromStream(dr.getInputStream()));
+
+ dr = exchange.getMessage(AttachmentMessage.class).getAttachment(decodingReference(imageId));
+ assertEquals("image/jpeg", dr.getContentType());
+
+ BufferedImage image = ImageIO.read(dr.getInputStream());
+ assertEquals(560, image.getWidth());
+ assertEquals(300, image.getHeight());
+
+ // END SNIPPET: producer
+
+ }
+
+ // CXF encoding the XOP reference since 3.0.1
+ private String decodingReference(String reference) throws UnsupportedEncodingException {
+ return java.net.URLDecoder.decode(reference, "UTF-8");
+ }
+
+ protected boolean isMtomEnabled() {
+ return true;
+ }
+
+ protected Object getServiceImpl() {
+ return new HelloImpl();
+ }
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+
+ @Bean
+ public CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/"
+ + "CxfMtomProducerPayloadModeTest" + "/jaxws-mtom/hello");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ properties.put("mtom-enabled", true);
+ properties.put("loggingFeatureEnabled", false);
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:testEndpoint").
+ to("cxf:bean:serviceEndpoint?defaultOperationName=Detail");
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterCxfMessageModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterCxfMessageModeTest.java
new file mode 100644
index 00000000000..dc11e8b3385
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterCxfMessageModeTest.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.BindingProvider;
+
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfMtomRouterCxfMessageModeTest.class,
+ CxfMtomRouterPayloadModeTest.TestConfiguration.class,
+ CxfMtomRouterCxfMessageModeTest.EndpointConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomRouterCxfMessageModeTest extends CxfMtomRouterPayloadModeTest {
+
+
+
+
+ @Override
+ protected Hello getPort() {
+ URL wsdl = getClass().getResource("/mtom.wsdl");
+ assertNotNull(wsdl, "WSDL is null");
+
+ HelloService service = new HelloService(wsdl, HelloService.SERVICE);
+ assertNotNull(service, "Service is null");
+ Hello hello = service.getHelloPort();
+ ((BindingProvider) hello).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services" + "/CxfMtomRouterCxfMessageModeTest/jaxws-mtom/hello");
+ return hello;
+ }
+
+ @Configuration
+ class EndpointConfiguration {
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("/" + "CxfMtomRouterCxfMessageModeTest"
+ + "/jaxws-mtom/hello");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "CXF_MESSAGE");
+ properties.put("mtom-enabled", "true");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/"
+ + "CxfMtomRouterCxfMessageModeTest" + "/jaxws-mtom/backend");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "CXF_MESSAGE");
+ properties.put("mtom-enabled", "true");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadMode12Test.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadMode12Test.java
new file mode 100644
index 00000000000..b8d5f015028
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadMode12Test.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.HelloImpl12;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService12;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfMtomRouterPayloadMode12Test.class,
+ CxfMtomRouterPayloadModeTest.TestConfiguration.class,
+ CxfMtomRouterPayloadMode12Test.EndpointConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomRouterPayloadMode12Test extends CxfMtomRouterPayloadModeTest {
+
+ protected final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService12");
+
+
+ @Override
+ protected Object getImpl() {
+ return new HelloImpl12();
+ }
+
+ @Override
+ protected Hello getPort() {
+ URL wsdl = getClass().getResource("/mtom.wsdl");
+ assertNotNull(wsdl, "WSDL is null");
+
+ HelloService12 service = new HelloService12(wsdl, HelloService12.SERVICE);
+ assertNotNull(service, "Service is null");
+ Hello hello = service.getHelloPort();
+ ((BindingProvider) hello).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services" + "/CxfMtomRouterPayloadMode12Test/jaxws-mtom/hello");
+ return hello;
+ }
+
+ @Configuration
+ class EndpointConfiguration {
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("/" + "CxfMtomRouterPayloadMode12Test"
+ + "/jaxws-mtom/hello");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ properties.put("mtom-enabled", "true");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/"
+ + "CxfMtomRouterPayloadMode12Test" + "/jaxws-mtom/backend");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ properties.put("mtom-enabled", "true");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadModeTest.java
new file mode 100644
index 00000000000..7b635447867
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterPayloadModeTest.java
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+
+
+
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.imageio.ImageIO;
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Holder;
+import javax.xml.ws.soap.SOAPBinding;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.mtom.HelloImpl;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfMtomRouterPayloadModeTest.class,
+ CxfMtomRouterPayloadModeTest.TestConfiguration.class,
+ CxfMtomRouterPayloadModeTest.EndpointConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfMtomRouterPayloadModeTest {
+
+ protected final QName SERVICE_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloService");
+ protected final QName PORT_QNAME = new QName("http://apache.org/camel/cxf/mtom_feature", "HelloPort");
+ private static final Logger LOG = LoggerFactory.getLogger(CxfMtomRouterPayloadModeTest.class);
+
+ @Autowired
+ protected CamelContext context;
+ private Endpoint endpoint;
+
+ static int port = CXFTestSupport.getPort1();
+
+
+
+ @BeforeEach
+ public void setUp() throws Exception {
+ endpoint = Endpoint.publish("/"
+ + getClass().getSimpleName() + "/jaxws-mtom/backend",
+ getImpl());
+ SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
+ binding.setMTOMEnabled(true);
+
+ }
+
+ @AfterEach
+ public void tearDown() throws Exception {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @Test
+ public void testInvokingServiceFromCXFClient() throws Exception {
+ if (MtomTestHelper.isAwtHeadless(null, LOG)) {
+ return;
+ }
+
+ Holder<byte[]> photo = new Holder<>(MtomTestHelper.REQ_PHOTO_DATA);
+ Holder<Image> image = new Holder<>(getImage("/java.jpg"));
+
+ Hello port = getPort();
+
+ SOAPBinding binding = (SOAPBinding) ((BindingProvider) port).getBinding();
+ binding.setMTOMEnabled(true);
+
+ port.detail(photo, image);
+
+ assertArrayEquals(MtomTestHelper.RESP_PHOTO_DATA, photo.value);
+ assertNotNull(image.value);
+ if (image.value instanceof BufferedImage) {
+ assertEquals(560, ((BufferedImage) image.value).getWidth());
+ assertEquals(300, ((BufferedImage) image.value).getHeight());
+ }
+
+ }
+
+ protected Hello getPort() {
+ URL wsdl = getClass().getResource("/mtom.wsdl");
+ assertNotNull(wsdl, "WSDL is null");
+
+ HelloService service = new HelloService(wsdl, HelloService.SERVICE);
+ assertNotNull(service, "Service is null");
+ Hello hello = service.getHelloPort();
+ ((BindingProvider) hello).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMtomRouterPayloadModeTest/jaxws-mtom/hello");
+ return hello;
+ }
+
+ private Image getImage(String name) throws Exception {
+ return ImageIO.read(getClass().getResource(name));
+ }
+
+ protected Object getImpl() {
+ return new HelloImpl();
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:routerEndpoint").
+ to("cxf:bean:serviceEndpoint");
+ }
+ };
+ }
+ }
+
+ @Configuration
+ class EndpointConfiguration {
+ @Bean
+ public CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("/" + "CxfMtomRouterPayloadModeTest"
+ + "/jaxws-mtom/hello");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ properties.put("mtom-enabled", "true");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/"
+ + "CxfMtomRouterPayloadModeTest" + "/jaxws-mtom/backend");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ properties.put("mtom-enabled", "true");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+ }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterRawModeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterRawModeTest.java
new file mode 100644
index 00000000000..639d37c39e5
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/CxfMtomRouterRawModeTest.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.ws.BindingProvider;
+
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfMtomRouterRawModeTest.class,
+ CxfMtomRouterRawModeTest.TestConfiguration.class,
+ CxfMtomRouterRawModeTest.EndpointConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMtomRouterRawModeTest extends CxfMtomRouterPayloadModeTest {
+
+
+
+
+ @Override
+ protected Hello getPort() {
+ URL wsdl = getClass().getResource("/mtom.wsdl");
+ assertNotNull(wsdl, "WSDL is null");
+
+ HelloService service = new HelloService(wsdl, HelloService.SERVICE);
+ assertNotNull(service, "Service is null");
+ Hello hello = service.getHelloPort();
+ ((BindingProvider) hello).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services" + "/CxfMtomRouterRawModeTest/jaxws-mtom/hello");
+ return hello;
+ }
+
+ @Configuration
+ class EndpointConfiguration {
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("/" + "CxfMtomRouterRawModeTest"
+ + "/jaxws-mtom/hello");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "RAW");
+ properties.put("mtom-enabled", "true");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICE_QNAME);
+ cxfEndpoint.setEndpointNameAsQName(PORT_QNAME);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/"
+ + "CxfMtomRouterRawModeTest" + "/jaxws-mtom/backend");
+ cxfEndpoint.setWsdlURL("mtom.wsdl");
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "RAW");
+ properties.put("mtom-enabled", "true");
+ cxfEndpoint.setProperties(properties);
+ return cxfEndpoint;
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/jaxws/HelloService.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/ImageService.java
similarity index 63%
rename from components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/jaxws/HelloService.java
rename to components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/ImageService.java
index 2b75b4d1d66..7c0b6f74e1f 100644
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/jaxws/HelloService.java
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/ImageService.java
@@ -14,21 +14,20 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.component.cxf.jaxws;
+package org.apache.camel.component.cxf.soap.springboot.mtom;
-import java.util.List;
+import java.awt.Image;
+import javax.jws.WebParam;
+import javax.jws.WebService;
+import javax.xml.ws.soap.MTOM;
-public interface HelloService {
- String sayHello();
+@WebService(name = "ImageService", targetNamespace = "http://apache.org/camel/cxf/mtom_feature")
+@MTOM
+public interface ImageService {
- void ping();
+ Image downloadImage(@WebParam(name = "name") String name);
- int getInvocationCount();
+
+ String uploadImage(@WebParam(name = "data") Image data, @WebParam(name = "name") String name);
- String echo(String text) throws Exception;
-
- Boolean echoBoolean(Boolean bool);
-
- String complexParameters(List<String> par1, List<String> par2);
-
-}
+}
\ No newline at end of file
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/MtomTestHelper.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/MtomTestHelper.java
new file mode 100644
index 00000000000..179c0ecfbc7
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/mtom/MtomTestHelper.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.mtom;
+
+import java.io.IOException;
+
+import org.apache.cxf.helpers.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+/**
+ * Package local test helper
+ */
+public final class MtomTestHelper {
+ static final String SERVICE_TYPES_NS = "http://apache.org/camel/cxf/mtom_feature/types";
+ static final String XOP_NS = "http://www.w3.org/2004/08/xop/include";
+ static final byte[] REQ_PHOTO_DATA = { 1, 0, -1, 34, 23, 3, 23, 55, 33 };
+ static final byte[] RESP_PHOTO_DATA = { 5, -7, 23, 1, 0, -1, 34, 23, 3, 23, 55, 33, 3 };
+
+ static final String REQ_PHOTO_CID = "e33b6792-6666-4837-b0d9-68c88c8cadcb-1@apache.org";
+ static final String REQ_IMAGE_CID = "e33b6792-6666-4837-b0d9-68c88c8cadcb-2@apache.org";
+
+ static final String REQ_MESSAGE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+ + "<Detail xmlns=\"http://apache.org/camel/cxf/mtom_feature/types\">"
+ + "<photo><xop:Include xmlns:xop=\"http://www.w3.org/2004/08/xop/include\""
+ + " href=\"cid:" + REQ_PHOTO_CID + "\"/>"
+ + "</photo><image><xop:Include xmlns:xop=\"http://www.w3.org/2004/08/xop/include\""
+ + " href=\"cid:" + REQ_IMAGE_CID + "\"/></image></Detail>";
+
+ static final String MTOM_DISABLED_REQ_MESSAGE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+ + "<Detail xmlns=\"http://apache.org/camel/cxf/mtom_feature/types\">"
+ + "<photo>cid:" + REQ_PHOTO_CID + "</photo>"
+ + "<image>cid:" + REQ_IMAGE_CID + "</image></Detail>";
+
+ static final String RESP_PHOTO_CID = "4c7b78dc-356a-4fca-8877-068ee2f31824-7@apache.org";
+ static final String RESP_IMAGE_CID = "4c7b78dc-356a-4fca-8877-068ee2f31824-8@apache.org";
+
+ static final String RESP_MESSAGE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+ + "<DetailResponse xmlns=\"http://apache.org/camel/cxf/mtom_feature/types\">"
+ + "<photo><xop:Include xmlns:xop=\"http://www.w3.org/2004/08/xop/include\""
+ + " href=\"cid:" + RESP_PHOTO_CID + "\"/>"
+ + "</photo><image><xop:Include xmlns:xop=\"http://www.w3.org/2004/08/xop/include\""
+ + " href=\"cid:" + RESP_IMAGE_CID + "\"/></image></DetailResponse>";
+
+ static final String MTOM_DISABLED_RESP_MESSAGE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+ + "<DetailResponse xmlns=\"http://apache.org/camel/cxf/mtom_feature/types\">"
+ + "<photo>cid:" + RESP_PHOTO_CID + "</photo>"
+ + "<image>cid:" + RESP_IMAGE_CID + "</image></DetailResponse>";
+
+ static byte[] requestJpeg;
+ static byte[] responseJpeg;
+
+ private static final Logger LOG = LoggerFactory.getLogger(MtomTestHelper.class);
+
+ static {
+ try {
+ requestJpeg = IOUtils.readBytesFromStream(MtomTestHelper.class.getResourceAsStream("/java.jpg"));
+ responseJpeg = IOUtils.readBytesFromStream(MtomTestHelper.class.getResourceAsStream("/Splash.jpg"));
+ } catch (IOException e) {
+ LOG.warn("I/O error reading bytes from stream: {}", e.getMessage(), e);
+ }
+ }
+
+ private MtomTestHelper() {
+ // utility class
+ }
+
+ static boolean isAwtHeadless(org.apache.commons.logging.Log log, org.slf4j.Logger logger) {
+ assertFalse(log == null && logger == null, "Both loggers are not allowed to be null!");
+ boolean headless = Boolean.getBoolean("java.awt.headless");
+ if (headless) {
+ // having the conversion characters %c{1} inside log4j.properties will reveal us the
+ // test class currently running as we make use of it's logger to warn about skipping!
+ String warning = "Running headless. Skipping test as Images may not work.";
+ if (log != null) {
+ log.warn(warning);
+ }
+
+ if (logger != null) {
+ logger.warn("Running headless. Skipping test as Images may not work.");
+ }
+ }
+
+ return headless;
+ }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerDuplicateNamespaceStreamCacheTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerDuplicateNamespaceStreamCacheTest.java
new file mode 100644
index 00000000000..928e7c8b280
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerDuplicateNamespaceStreamCacheTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.namespace;
+
+
+
+
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfPayloadConsumerDuplicateNamespaceStreamCacheTest.class,
+ CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.TestConfiguration.class,
+ CxfAutoConfiguration.class,
+ CxfPayloadConsumerNamespaceOnEnvelopeTest.EndpointConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfPayloadConsumerDuplicateNamespaceStreamCacheTest extends CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest {
+
+
+ /*
+ * The soap namespace prefix is already defined on the root tag of the
+ * payload. If this is set another time from the envelope, the result will
+ * be an invalid XML.
+ */
+ protected static final String REQUEST_MESSAGE
+ = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
+ + "<soap:Body><ns2:getToken xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns2=\"http://camel.apache.org/cxf/namespace\">"
+ + "<arg0 xsi:type=\"xs:string\">Send</arg0></ns2:getToken></soap:Body></soap:Envelope>";
+
+ @Override
+ @Test
+ public void testInvokeRouter() {
+ Object returnValue = template.requestBody("direct:router", REQUEST_MESSAGE);
+ assertNotNull(returnValue);
+ assertTrue(returnValue instanceof String);
+ assertTrue(((String) returnValue).contains("Return Value"));
+ assertTrue(((String) returnValue).contains("http://www.w3.org/2001/XMLSchema-instance"));
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.java
new file mode 100644
index 00000000000..54e22556b35
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.namespace;
+
+import org.w3c.dom.Document;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.class,
+ CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest.TestConfiguration.class,
+ CxfAutoConfiguration.class,
+ CxfPayloadConsumerNamespaceOnEnvelopeTest.EndpointConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfPayloadConsumerNamespaceOnEnvelopeStreamCacheTest
+ extends CxfPayloadConsumerNamespaceOnEnvelopeTest {
+
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:router")
+ // Use message mode to send the raw message
+ .to("cxf:bean:serviceEndpoint")
+ // Convert to String to make testing the result easier
+ .convertBodyTo(String.class);
+ // The consumer is running in payload mode
+ from("cxf:bean:routerEndpoint")
+ // Use stream caching to trigger the issue
+ .streamCaching()
+ // Parse to DOM to make sure it's still valid XML
+ .convertBodyTo(Document.class).setBody().constant(RESPONSE_PAYLOAD);
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeTest.java
new file mode 100644
index 00000000000..c143728e37a
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadConsumerNamespaceOnEnvelopeTest.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.namespace;
+
+
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Document;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfPayloadConsumerNamespaceOnEnvelopeTest.class,
+ CxfPayloadConsumerNamespaceOnEnvelopeTest.TestConfiguration.class,
+ CxfPayloadConsumerNamespaceOnEnvelopeTest.EndpointConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfPayloadConsumerNamespaceOnEnvelopeTest {
+
+ /*
+ * The request message is generated directly. The issue here is that the xsi and xs namespaces are defined
+ * on the SOAP envelope but are used within the payload. This can cause issues with some type conversions
+ * in PAYLOAD mode, as the Camel-CXF endpoint will return some kind of window within the StAX parsing (and
+ * the namespace definitions are outside). If some CXF proxy is used to send the message the namespaces
+ * will be defined within the payload (and everything works fine).
+ */
+ protected static final String RESPONSE_PAYLOAD = "<ns2:getTokenResponse xmlns:ns2=\"http://camel.apache.org/cxf/namespace\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
+ + "<return xsi:type=\"xs:string\">Return Value</return></ns2:getTokenResponse>";
+ protected static final String REQUEST_MESSAGE = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
+ + "<soap:Body><ns2:getToken xmlns:ns2=\"http://camel.apache.org/cxf/namespace\"><arg0 xsi:type=\"xs:string\">Send</arg0></ns2:getToken></soap:Body></soap:Envelope>";
+
+ private QName serviceName = QName.valueOf("{http://camel.apache.org/cxf/namespace}GetTokenService");
+
+ @Autowired
+ ProducerTemplate template;
+
+ static int port = CXFTestSupport.getPort1();
+
+
+
+ @Test
+ public void testInvokeRouter() {
+ Object returnValue = template.requestBody("direct:router", REQUEST_MESSAGE);
+ assertNotNull(returnValue);
+ assertTrue(returnValue instanceof String);
+ assertTrue(((String)returnValue).contains("Return Value"));
+ assertTrue(((String)returnValue).contains("http://www.w3.org/2001/XMLSchema-instance"));
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:router")
+ // Use message mode to send the raw message
+ .to("cxf:bean:serviceEndpoint")
+ // Convert to String to make testing the result easier
+ .convertBodyTo(String.class);
+ // The consumer is running in payload mode
+ from("cxf:bean:routerEndpoint")
+ // Convert the CxfPayload to a String to trigger the issue
+ .convertBodyTo(String.class)
+ // Parse to DOM to make sure it's still valid XML
+ .convertBodyTo(Document.class).setBody().constant(RESPONSE_PAYLOAD);
+ }
+ };
+ }
+
+
+
+
+ }
+
+ @Configuration
+ public class EndpointConfiguration {
+
+ @Bean
+ ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("/GetToken/SoapContext/SoapPort");
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setWsdlURL("GetToken.wsdl");
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/GetToken/SoapContext/SoapPort");
+ cxfEndpoint.setServiceNameAsQName(serviceName);
+ cxfEndpoint.setWsdlURL("GetToken.wsdl");
+ cxfEndpoint.setDataFormat(DataFormat.RAW);
+ return cxfEndpoint;
+ }
+
+ }
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest.java
new file mode 100644
index 00000000000..189dab3e4e8
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.namespace;
+
+
+
+
+import org.w3c.dom.Document;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest.class,
+ CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest.TestConfiguration.class,
+ CxfPayloadProducerNamespaceOnEnvelopeTest.EndpointConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfPayloadProducerNamespaceOnEnvelopeStreamCacheTest extends CxfPayloadProducerNamespaceOnEnvelopeTest {
+
+
+
+
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:router") //
+ .streamCaching()
+ // call an external Web service in payload mode
+ .to("cxf:bean:serviceEndpoint?dataFormat=PAYLOAD")
+ // Check that the issue doesn't occur if stream caching is enabled
+ // Parse to DOM to make sure it's still valid XML
+ .convertBodyTo(Document.class)
+ // Convert back to String to make testing the result
+ // easier
+ .convertBodyTo(String.class);
+ // This route just returns the test message
+ from("cxf:bean:serviceEndpoint?dataFormat=RAW").setBody().constant(RESPONSE_MESSAGE);
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeTest.java
new file mode 100644
index 00000000000..d163277480b
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/namespace/CxfPayloadProducerNamespaceOnEnvelopeTest.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.namespace;
+
+
+
+
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Document;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.DataFormat;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ CxfPayloadProducerNamespaceOnEnvelopeTest.class,
+ CxfPayloadProducerNamespaceOnEnvelopeTest.TestConfiguration.class,
+ CxfPayloadProducerNamespaceOnEnvelopeTest.EndpointConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfPayloadProducerNamespaceOnEnvelopeTest {
+
+
+ protected static final String RESPONSE_MESSAGE
+ = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"><soap:Body>"
+ + "<ns2:getTokenResponse xmlns:ns2=\"http://camel.apache.org/cxf/namespace\"><return xsi:type=\"xs:string\">Return Value</return></ns2:getTokenResponse></soap:Body></soap:Envelope>";
+ protected static final String REQUEST_PAYLOAD = "<ns2:getToken xmlns:ns2=\"http://camel.apache.org/cxf/namespace\"/>";
+
+ private static QName SERVICENAME = QName.valueOf("{http://camel.apache.org/cxf/namespace}GetTokenService");
+
+ static int port = CXFTestSupport.getPort1();
+
+
+
+
+
+
+ @Autowired
+ ProducerTemplate template;
+
+ @Test
+ public void testInvokeRouter() {
+ Object returnValue = template.requestBody("direct:router", REQUEST_PAYLOAD);
+ assertNotNull(returnValue);
+ assertTrue(returnValue instanceof String);
+ assertTrue(((String) returnValue).contains("Return Value"));
+ assertTrue(((String) returnValue).contains("http://www.w3.org/2001/XMLSchema-instance"));
+ }
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:router") //
+ // call an external Web service in payload mode
+ .to("cxf:bean:serviceEndpoint")
+ // Convert the CxfPayload to a String to trigger the
+ // issue
+ .convertBodyTo(String.class)
+ // Parse to DOM to make sure it's still valid XML
+ .convertBodyTo(Document.class)
+ // Convert back to String to make testing the result
+ // easier
+ .convertBodyTo(String.class);
+ // This route just returns the test message
+ from("cxf:bean:routerEndpoint").setBody().constant(RESPONSE_MESSAGE);
+ }
+ };
+ }
+ }
+
+ @Configuration
+ class EndpointConfiguration {
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+ @Bean
+ CxfEndpoint routerEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+ cxfEndpoint.setAddress("/GetToken/SoapContext/SoapPort");
+ cxfEndpoint.setDataFormat(DataFormat.RAW);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ CxfEndpoint serviceEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+ cxfEndpoint.setAddress("http://localhost:" + port
+ + "/services/GetToken/SoapContext/SoapPort");
+ cxfEndpoint.setDataFormat(DataFormat.PAYLOAD);
+ return cxfEndpoint;
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/noparam/NoParamTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/noparam/NoParamTest.java
new file mode 100644
index 00000000000..cd9d9f46660
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/noparam/NoParamTest.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.noparam;
+
+
+
+import javax.xml.ws.Endpoint;
+
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(
+ classes = {
+ CamelAutoConfiguration.class,
+ NoParamTest.class,
+ NoParamTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+ }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class NoParamTest {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(NoParamTest.class);
+
+ static int port = CXFTestSupport.getPort1();
+
+
+ @BeforeEach
+ public void setup() {
+ Object implementor = new org.apache.camel.component.cxf.noparam.NoParamEndpoint();
+ String address = "/cxf-noparam/";
+ Endpoint.publish(address, implementor);
+ }
+
+
+
+
+ @Autowired
+ ProducerTemplate template;
+
+ @Test
+ public void testNullBody() throws Exception {
+ Object body = template.sendBody("direct:noParam", ExchangePattern.InOut, null);
+ assertNotNull(body);
+ LOGGER.error(body.toString());
+ }
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
+
+
+ @Bean
+ CxfEndpoint noParamEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.noparam.NoParamEndpoint.class);
+ cxfEndpoint.setAddress("/camel-noparam/");
+ return cxfEndpoint;
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("cxf:bean:noParamEndpoint")
+ .transform(constant("OK"))
+ .to("mock:end");
+
+ from("direct:noParam")
+ .to("cxf:bean:noParamEndpoint?address=" + "http://localhost:" + port
+ + "/services/camel-noparam/");
+ }
+ };
+ }
+ }
+
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/soap/headers/CxfMessageHeadersRelayTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/soap/headers/CxfMessageHeadersRelayTest.java
new file mode 100644
index 00000000000..62d1a642968
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/soap/headers/CxfMessageHeadersRelayTest.java
@@ -0,0 +1,977 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.cxf.soap.springboot.soap.headers;
+
+import java.io.StringReader;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Holder;
+
+import org.w3c.dom.Node;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.CxfPayload;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.component.cxf.jaxws.CxfEndpoint;
+import org.apache.camel.component.cxf.soap.headers.Constants;
+import org.apache.camel.component.cxf.soap.headers.CustomHeaderFilter;
+import org.apache.camel.component.cxf.soap.headers.HeaderService;
+import org.apache.camel.component.cxf.soap.headers.HeaderTester;
+import org.apache.camel.component.cxf.soap.headers.HeaderTesterImpl;
+import org.apache.camel.component.cxf.soap.headers.HeaderTesterWithInsertionImpl;
+import org.apache.camel.component.cxf.soap.headers.InHeader;
+import org.apache.camel.component.cxf.soap.headers.InHeaderResponse;
+import org.apache.camel.component.cxf.soap.headers.InoutHeader;
+import org.apache.camel.component.cxf.soap.headers.InoutHeaderResponse;
+import org.apache.camel.component.cxf.soap.headers.Me;
+import org.apache.camel.component.cxf.soap.headers.OutHeader;
+import org.apache.camel.component.cxf.soap.headers.OutHeaderResponse;
+import org.apache.camel.component.cxf.soap.headers.SOAPHeaderData;
+import org.apache.camel.component.cxf.spring.jaxws.CxfSpringEndpoint;
+import org.apache.camel.component.cxf.transport.header.CxfHeaderFilterStrategy;
+import org.apache.camel.component.cxf.transport.header.MessageHeaderFilter;
+import org.apache.camel.component.cxf.transport.header.SoapMessageHeaderFilter;
+import org.apache.camel.spi.HeaderFilterStrategy;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.support.DefaultExchange;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.binding.soap.SoapHeader;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.ext.logging.LoggingFeature;
+import org.apache.cxf.headers.Header;
+import org.apache.cxf.headers.Header.Direction;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.jaxb.JAXBDataBinding;
+import org.apache.cxf.message.MessageContentsList;
+import org.apache.cxf.outofband.header.OutofBandHeader;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = {
+ CamelAutoConfiguration.class,
+ CxfMessageHeadersRelayTest.class,
+ CxfMessageHeadersRelayTest.TestConfiguration.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CxfMessageHeadersRelayTest {
+
+ private static QName SERVICENAME = QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}HeaderService");
+
+ static int port = CXFTestSupport.getPort1();
+
+
+ private static final Logger LOG = LoggerFactory.getLogger(CxfMessageHeadersRelayTest.class);
+
+ @Autowired
+ protected CamelContext context;
+
+ @Autowired
+ protected ProducerTemplate template;
+
+ private Endpoint relayEndpoint;
+ private Endpoint noRelayEndpoint;
+ private Endpoint relayEndpointWithInsertion;
+
+ @BeforeEach
+ public void setUp() throws Exception {
+ relayEndpoint = Endpoint.publish("/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointBackend",
+ new HeaderTesterImpl());
+ noRelayEndpoint = Endpoint.publish("/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpointBackend",
+ new HeaderTesterImpl(false));
+ relayEndpointWithInsertion = Endpoint.publish("/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointWithInsertionBackend",
+ new HeaderTesterWithInsertionImpl());
+
+ }
+
+ @AfterEach
+ public void tearDown() throws Exception {
+
+ if (relayEndpoint != null) {
+ relayEndpoint.stop();
+ relayEndpoint = null;
+ }
+
+ if (noRelayEndpoint != null) {
+ noRelayEndpoint.stop();
+ noRelayEndpoint = null;
+ }
+
+ if (relayEndpointWithInsertion != null) {
+ relayEndpointWithInsertion.stop();
+ relayEndpointWithInsertion = null;
+ }
+ }
+
+ protected static void addOutOfBoundHeader(HeaderTester proxy, boolean invalid) throws JAXBException {
+ InvocationHandler handler = Proxy.getInvocationHandler(proxy);
+ BindingProvider bp = null;
+
+ try {
+ if (handler instanceof BindingProvider) {
+ bp = (BindingProvider) handler;
+ Map<String, Object> requestContext = bp.getRequestContext();
+ requestContext.put(Header.HEADER_LIST, buildOutOfBandHeaderList(invalid));
+ }
+ } catch (JAXBException ex) {
+ throw ex;
+ }
+
+ }
+
+ @Test
+ public void testInHeaderCXFClientRelay() throws Exception {
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+ InHeader me = new InHeader();
+ me.setRequestType("CXF user");
+ InHeaderResponse response = proxy.inHeader(me, Constants.IN_HEADER_DATA);
+ assertEquals("pass", response.getResponseType(), "Expected in band header to propagate but it didn't");
+ }
+
+ @Test
+ public void testOutHeaderCXFClientRelay() throws Exception {
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+
+ OutHeader me = new OutHeader();
+ me.setRequestType("CXF user");
+ Holder<OutHeaderResponse> result = new Holder<>(new OutHeaderResponse());
+ Holder<SOAPHeaderData> header = new Holder<>(new SOAPHeaderData());
+ proxy.outHeader(me, result, header);
+ assertEquals("pass", result.value.getResponseType(), "Expected in band header to propagate but it didn't");
+ assertTrue(Constants.equals(Constants.OUT_HEADER_DATA, header.value),
+ "Expected in band response header to propagate but it either didn't "
+ + " or its contents do not match");
+ }
+
+ @Test
+ public void testInOutHeaderCXFClientRelay() throws Exception {
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+ InoutHeader me = new InoutHeader();
+ me.setRequestType("CXF user");
+ Holder<SOAPHeaderData> header = new Holder<>(Constants.IN_OUT_REQUEST_HEADER_DATA);
+ InoutHeaderResponse result = proxy.inoutHeader(me, header);
+ assertEquals("pass", result.getResponseType(), "Expected in band header to propagate but it didn't");
+ assertTrue(Constants.equals(Constants.IN_OUT_RESPONSE_HEADER_DATA, header.value),
+ "Expected in band response header to propagate but it either didn't "
+ + " or its contents do not match");
+ }
+
+ @Test
+ public void testInOutOfBandHeaderCXFClientRelay() throws Exception {
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+ addOutOfBoundHeader(proxy, false);
+ Me me = new Me();
+ me.setFirstName("john");
+ me.setLastName("Doh");
+
+ Me response = proxy.inOutOfBandHeader(me);
+ assertEquals("pass", response.getFirstName(), "Expected the out of band header to propagate but it didn't");
+ }
+
+ @Test
+ public void testInoutOutOfBandHeaderCXFClientRelay() throws Exception {
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+ addOutOfBoundHeader(proxy, false);
+ Me me = new Me();
+ me.setFirstName("john");
+ me.setLastName("Doh");
+ Me response = proxy.inoutOutOfBandHeader(me);
+ assertEquals("pass", response.getFirstName(), "Expected the out of band header to propagate but it didn't");
+ validateReturnedOutOfBandHeader(proxy);
+ }
+
+ @Test
+ public void testInoutOutOfBandHeaderCXFClientRelayWithHeaderInsertion() throws Exception {
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortRelayWithInsertion();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointWithInsertion");
+ addOutOfBoundHeader(proxy, false);
+ Me me = new Me();
+ me.setFirstName("john");
+ me.setLastName("Doh");
+ Me response = proxy.inoutOutOfBandHeader(me);
+ assertEquals("pass", response.getFirstName(), "Expected the out of band header to propagate but it didn't");
+
+ InvocationHandler handler = Proxy.getInvocationHandler(proxy);
+ BindingProvider bp = null;
+ if (!(handler instanceof BindingProvider)) {
+ fail("Unable to cast dynamic proxy InocationHandler to BindingProvider type");
+ }
+
+ bp = (BindingProvider) handler;
+ Map<String, Object> responseContext = bp.getResponseContext();
+ validateReturnedOutOfBandHeaderWithInsertion(responseContext, true);
+ }
+
+ @Test
+ public void testOutOutOfBandHeaderCXFClientRelay() throws Exception {
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+ Me me = new Me();
+ me.setFirstName("john");
+ me.setLastName("Doh");
+ Me response = proxy.outOutOfBandHeader(me);
+ assertEquals("pass", response.getFirstName(), "Expected the out of band header to propagate but it didn't");
+ validateReturnedOutOfBandHeader(proxy);
+ }
+
+ @Test
+ public void testInOutOfBandHeaderCXFClientNoRelay() throws Exception {
+
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortNoRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+
+ addOutOfBoundHeader(proxy, false);
+ Me me = new Me();
+ me.setFirstName("john");
+ me.setLastName("Doh");
+ Me response = proxy.inOutOfBandHeader(me);
+ assertEquals("pass", response.getFirstName(), "Expected the in out of band header *not* to propagate but it did");
+
+ }
+
+ @Test
+ public void testOutOutOfBandHeaderCXFClientNoRelay() throws Exception {
+
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortNoRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+ Me me = new Me();
+ me.setFirstName("john");
+ me.setLastName("Doh");
+ Thread.sleep(5000);
+ Me response = proxy.outOutOfBandHeader(me);
+ assertEquals("pass", response.getFirstName(), "Expected the out out of band header *not* to propagate but it did");
+ validateReturnedOutOfBandHeader(proxy, false);
+ }
+
+ @Test
+ public void testInoutOutOfBandHeaderCXFClientNoRelay() throws Exception {
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortNoRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+ addOutOfBoundHeader(proxy, false);
+ Me me = new Me();
+ me.setFirstName("john");
+ me.setLastName("Doh");
+ Me response = proxy.inoutOutOfBandHeader(me);
+ assertEquals("pass", response.getFirstName(), "Expected the in out of band header to *not* propagate but it did");
+ validateReturnedOutOfBandHeader(proxy, false);
+ }
+
+ @Test
+ public void testInHeaderCXFClientNoRelay() throws Exception {
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortNoRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+ InHeader me = new InHeader();
+ me.setRequestType("CXF user");
+ InHeaderResponse response = null;
+ try {
+ response = proxy.inHeader(me, Constants.IN_HEADER_DATA);
+ } catch (Exception e) {
+ // do nothing
+ }
+ assertEquals("pass", response.getResponseType(), "Expected in in band header *not* to propagate but it did");
+ }
+
+ @Test
+ public void testOutHeaderCXFClientNoRelay() throws Exception {
+ Thread.sleep(5000);
+
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortNoRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+ OutHeader me = new OutHeader();
+ me.setRequestType("CXF user");
+ Holder<OutHeaderResponse> result = new Holder<>(new OutHeaderResponse());
+ Holder<SOAPHeaderData> header = new Holder<>(new SOAPHeaderData());
+ try {
+ proxy.outHeader(me, result, header);
+ } catch (Exception e) {
+ // do nothing
+ }
+ assertEquals("pass", result.value.getResponseType(),
+ "Ultimate remote HeaderTester.outHeader() destination was not reached");
+ assertNull(header.value, "Expected in band response header *not* to propagate but it did");
+ }
+
+ @Test
+ public void testInoutHeaderCXFClientNoRelay() throws Exception {
+ HeaderService s = new HeaderService(
+ getClass().getClassLoader().getResource("soap_header.wsdl"),
+ HeaderService.SERVICE);
+ HeaderTester proxy = s.getSoapPortNoRelay();
+ ((BindingProvider) proxy).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+ InoutHeader me = new InoutHeader();
+ me.setRequestType("CXF user");
+ Holder<SOAPHeaderData> header = new Holder<>(Constants.IN_OUT_REQUEST_HEADER_DATA);
+ InoutHeaderResponse result = null;
+ try {
+ result = proxy.inoutHeader(me, header);
+ } catch (Exception e) {
+ // do nothing
+ }
+ assertEquals("pass", result.getResponseType(), "Expected in band out header *not* to propagate but it did");
+ assertNull(header.value, "Expected in band response header *not* to propagate but did");
+ }
+
+ @Test
+
+ public void testInoutHeaderCXFClientNoServiceClassNoRelay() throws Exception {
+ // TODO: Fix this test later
+ QName qname = QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SOAPHeaderInfo");
+ String uri = "cxf:bean:routerNoRelayNoServiceClassEndpoint?headerFilterStrategy=#dropAllMessageHeadersStrategy"
+ + "&address=http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayNoServiceClassEndpoint";
+ String requestHeader = "<ns2:SOAPHeaderInfo xmlns:ns2=\"http://apache.org/camel/"
+ + "component/cxf/soap/headers\"><originator>CxfSoapHeaderRoutePropagationTest.testInOutHeader Requestor"
+ + "</originator><message>Invoking CxfSoapHeaderRoutePropagationTest.testInOutHeader() Request"
+ + "</message></ns2:SOAPHeaderInfo>";
+ String requestBody = "<ns2:inoutHeader xmlns:ns2=\"http://apache.org/camel/component/cxf/soap/headers\">"
+ + "<requestType>CXF user</requestType></ns2:inoutHeader>";
+ List<Source> elements = new ArrayList<>();
+ elements.add(new DOMSource(StaxUtils.read(new StringReader(requestBody)).getDocumentElement()));
+ final List<SoapHeader> headers = new ArrayList<>();
+ headers.add(new SoapHeader(
+ qname,
+ StaxUtils.read(new StringReader(requestHeader)).getDocumentElement()));
+ final CxfPayload<SoapHeader> cxfPayload = new CxfPayload<>(headers, elements, null);
+
+ Exchange exchange = template.request(uri, new Processor() {
+ public void process(Exchange exchange) throws Exception {
+ exchange.getIn().setBody(cxfPayload);
+ exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, "inoutHeader");
+ exchange.getIn().setHeader(Header.HEADER_LIST, headers);
+ }
+
+ });
+
+ CxfPayload<?> out = exchange.getMessage().getBody(CxfPayload.class);
+ assertEquals(1, out.getBodySources().size());
+
+ assertTrue(out.getBodySources().get(0) instanceof DOMSource);
+
+ assertEquals(0, out.getHeaders().size());
+
+ String responseExp = "<ns2:inoutHeaderResponse xmlns:ns2=\"http://apache.org/camel/"
+ + "component/cxf/soap/headers\"><responseType>pass</responseType>"
+ + "</ns2:inoutHeaderResponse>";
+ String response = StaxUtils.toString(out.getBody().get(0));
+ //REVISIT use a more reliable comparison to tolerate some namespaces being added to the root element
+ assertTrue(response.startsWith(responseExp.substring(0, 87))
+ && response.endsWith(responseExp.substring(88, responseExp.length())), response);
+ }
+
+ @Test
+ public void testMessageHeadersRelaysSpringContext() throws Exception {
+ CxfEndpoint endpoint = context.getEndpoint(
+ "cxf:bean:serviceExtraRelays?headerFilterStrategy=#customMessageFilterStrategy", CxfEndpoint.class);
+ CxfHeaderFilterStrategy strategy = (CxfHeaderFilterStrategy) endpoint.getHeaderFilterStrategy();
+ List<MessageHeaderFilter> filters = strategy.getMessageHeaderFilters();
+ assertEquals(2, filters.size(), "Expected number of filters");
+ Map<String, MessageHeaderFilter> messageHeaderFilterMap = strategy.getMessageHeaderFiltersMap();
+ for (String ns : new CustomHeaderFilter().getActivationNamespaces()) {
+ assertEquals(CustomHeaderFilter.class, messageHeaderFilterMap.get(ns).getClass(),
+ "Expected a filter class for namespace: " + ns);
+ }
+ }
+
+ @Test
+ public void testInOutOfBandHeaderCamelTemplateDirect() throws Exception {
+ doTestInOutOfBandHeaderCamelTemplate("direct:directProducer");
+ }
+
+ @Test
+ public void testOutOutOfBandHeaderCamelTemplateDirect() throws Exception {
+ doTestOutOutOfBandHeaderCamelTemplate("direct:directProducer");
+ }
+
+ @Test
+ public void testInOutOutOfBandHeaderCamelTemplateDirect() throws Exception {
+ doTestInOutOutOfBandHeaderCamelTemplate("direct:directProducer");
+ }
+
+ @Test
+ public void testInOutOfBandHeaderCamelTemplateRelay() throws Exception {
+ doTestInOutOfBandHeaderCamelTemplate("direct:relayProducer");
+ }
+
+ @Test
+ public void testOutOutOfBandHeaderCamelTemplateRelay() throws Exception {
+ doTestOutOutOfBandHeaderCamelTemplate("direct:relayProducer");
+ }
+
+ @Test
+ public void testInOutOutOfBandHeaderCamelTemplateRelay() throws Exception {
+ doTestInOutOutOfBandHeaderCamelTemplate("direct:relayProducer");
+ }
+
+ protected void doTestInOutOfBandHeaderCamelTemplate(String producerUri) throws Exception {
+ // START SNIPPET: sending
+ Exchange senderExchange = new DefaultExchange(context, ExchangePattern.InOut);
+ final List<Object> params = new ArrayList<>();
+ Me me = new Me();
+ me.setFirstName("john");
+ me.setLastName("Doh");
+
+ params.add(me);
+ senderExchange.getIn().setBody(params);
+ senderExchange.getIn().setHeader(CxfConstants.OPERATION_NAME, "inOutOfBandHeader");
+
+ List<Header> headers = buildOutOfBandHeaderList(false);
+ Map<String, Object> requestContext = new HashMap<>();
+ requestContext.put(Header.HEADER_LIST, headers);
+ senderExchange.getIn().setHeader(Client.REQUEST_CONTEXT, requestContext);
+
+ Exchange exchange = template.send(producerUri, senderExchange);
+
+ org.apache.camel.Message out = exchange.getMessage();
+ MessageContentsList result = (MessageContentsList) out.getBody();
+ Map<String, Object> responseContext = CastUtils.cast((Map<?, ?>) out.getHeader(Client.RESPONSE_CONTEXT));
+ assertNotNull(responseContext);
+ assertTrue(result.get(0) != null && ((Me) result.get(0)).getFirstName().equals("pass"),
+ "Expected the out of band header to propagate but it didn't");
+
+ }
+
+ protected void doTestOutOutOfBandHeaderCamelTemplate(String producerUri) throws Exception {
+ // START SNIPPET: sending
+ Exchange senderExchange = new DefaultExchange(context, ExchangePattern.InOut);
+ final List<Object> params = new ArrayList<>();
+ Me me = new Me();
+ me.setFirstName("john");
+ me.setLastName("Doh");
+
+ params.add(me);
+ senderExchange.getIn().setBody(params);
+ senderExchange.getIn().setHeader(CxfConstants.OPERATION_NAME, "outOutOfBandHeader");
+
+ Exchange exchange = template.send(producerUri, senderExchange);
+
+ org.apache.camel.Message out = exchange.getMessage();
+ MessageContentsList result = (MessageContentsList) out.getBody();
+ assertTrue(result.get(0) != null && ((Me) result.get(0)).getFirstName().equals("pass"),
+ "Expected the out of band header to propagate but it didn't");
+ Map<String, Object> responseContext = CastUtils.cast((Map<?, ?>) out.getHeader(Client.RESPONSE_CONTEXT));
+ assertNotNull(responseContext);
+ validateReturnedOutOfBandHeader(responseContext);
+ }
+
+ public void doTestInOutOutOfBandHeaderCamelTemplate(String producerUri) throws Exception {
+ // START SNIPPET: sending
+ Exchange senderExchange = new DefaultExchange(context, ExchangePattern.InOut);
+ final List<Object> params = new ArrayList<>();
+ Me me = new Me();
+ me.setFirstName("john");
+ me.setLastName("Doh");
+
+ params.add(me);
+ senderExchange.getIn().setBody(params);
+ senderExchange.getIn().setHeader(CxfConstants.OPERATION_NAME, "inoutOutOfBandHeader");
+
+ List<Header> inHeaders = buildOutOfBandHeaderList(false);
+ Map<String, Object> requestContext = new HashMap<>();
+ requestContext.put(Header.HEADER_LIST, inHeaders);
+ senderExchange.getIn().setHeader(Client.REQUEST_CONTEXT, requestContext);
+
+ Exchange exchange = template.send(producerUri, senderExchange);
+
+ org.apache.camel.Message out = exchange.getMessage();
+ MessageContentsList result = (MessageContentsList) out.getBody();
+ assertTrue(result.get(0) != null && ((Me) result.get(0)).getFirstName().equals("pass"),
+ "Expected the out of band header to propagate but it didn't");
+ Map<String, Object> responseContext = CastUtils.cast((Map<?, ?>) out.getHeader(Client.RESPONSE_CONTEXT));
+ assertNotNull(responseContext);
+ validateReturnedOutOfBandHeader(responseContext);
+ }
+
+ protected static void validateReturnedOutOfBandHeader(HeaderTester proxy) {
+ validateReturnedOutOfBandHeader(proxy, true);
+ }
+
+ protected static void validateReturnedOutOfBandHeader(HeaderTester proxy, boolean expect) {
+ InvocationHandler handler = Proxy.getInvocationHandler(proxy);
+ BindingProvider bp = null;
+ if (!(handler instanceof BindingProvider)) {
+ fail("Unable to cast dynamic proxy InocationHandler to BindingProvider type");
+ }
+
+ bp = (BindingProvider) handler;
+ Map<String, Object> responseContext = bp.getResponseContext();
+ validateReturnedOutOfBandHeader(responseContext, expect);
+ }
+
+ protected static void validateReturnedOutOfBandHeader(Map<String, Object> responseContext) {
+ validateReturnedOutOfBandHeader(responseContext, true);
+ }
+
+ protected static void validateReturnedOutOfBandHeader(Map<String, Object> responseContext, boolean expect) {
+ OutofBandHeader hdrToTest = null;
+ List<Header> oobHdr = CastUtils.cast((List<?>) responseContext.get(Header.HEADER_LIST));
+ if (!expect) {
+ if (oobHdr == null || oobHdr != null && oobHdr.size() == 0) {
+ return;
+ }
+ fail("Should have got *no* out-of-band headers, but some were found");
+ }
+ if (oobHdr == null) {
+ fail("Should have got List of out-of-band headers");
+ }
+
+ assertEquals(1, oobHdr.size(), "HeaderHolder list expected to conain 1 object received " + oobHdr.size());
+
+ for (Header hdr1 : oobHdr) {
+ if (hdr1.getObject() instanceof Node) {
+ try {
+ JAXBElement<?> job = (JAXBElement<?>) JAXBContext
+ .newInstance(org.apache.cxf.outofband.header.ObjectFactory.class)
+ .createUnmarshaller().unmarshal((Node) hdr1.getObject());
+ hdrToTest = (OutofBandHeader) job.getValue();
+ } catch (JAXBException ex) {
+ LOG.warn("JAXB error: {}", ex.getMessage(), ex);
+ }
+ }
+ }
+
+ assertNotNull(hdrToTest, "out-of-band header should not be null");
+ assertEquals("testOobReturnHeaderName", hdrToTest.getName(),
+ "Expected out-of-band Header name testOobReturnHeaderName recevied :"
+ + hdrToTest.getName());
+ assertEquals("testOobReturnHeaderValue", hdrToTest.getValue(),
+ "Expected out-of-band Header value testOobReturnHeaderValue recevied :"
+ + hdrToTest.getValue());
+ assertEquals("testReturnHdrAttribute", hdrToTest.getHdrAttribute(),
+ "Expected out-of-band Header attribute testReturnHdrAttribute recevied :" + hdrToTest.getHdrAttribute());
+ }
+
+ protected static List<Header> buildOutOfBandHeaderList(boolean invalid) throws JAXBException {
+ OutofBandHeader ob = new OutofBandHeader();
+ ob.setName("testOobHeader");
+ ob.setValue("testOobHeaderValue");
+ ob.setHdrAttribute(invalid ? "dontProcess" : "testHdrAttribute");
+
+ SoapHeader hdr = new SoapHeader(
+ new QName(Constants.TEST_HDR_NS, Constants.TEST_HDR_REQUEST_ELEM),
+ ob,
+ new JAXBDataBinding(ob.getClass()));
+
+ hdr.setMustUnderstand(invalid);
+
+ List<Header> headers = new ArrayList<>();
+ headers.add(hdr);
+ return headers;
+ }
+
+ protected static void validateReturnedOutOfBandHeaderWithInsertion(Map<String, Object> responseContext, boolean expect) {
+ List<OutofBandHeader> hdrToTest = new ArrayList<>();
+ List<Header> oobHdr = CastUtils.cast((List<?>) responseContext.get(Header.HEADER_LIST));
+ if (!expect) {
+ if (oobHdr == null || oobHdr != null && oobHdr.size() == 0) {
+ return;
+ }
+ fail("Should have got *no* out-of-band headers, but some were found");
+ }
+ if (oobHdr == null) {
+ fail("Should have got List of out-of-band headers");
+ }
+
+ assertEquals(2, oobHdr.size(), "HeaderHolder list expected to conain 2 object received " + oobHdr.size());
+
+ for (Header hdr1 : oobHdr) {
+ if (hdr1.getObject() instanceof Node) {
+ try {
+ JAXBElement<?> job = (JAXBElement<?>) JAXBContext
+ .newInstance(org.apache.cxf.outofband.header.ObjectFactory.class)
+ .createUnmarshaller().unmarshal((Node) hdr1.getObject());
+ hdrToTest.add((OutofBandHeader) job.getValue());
+ } catch (JAXBException ex) {
+ LOG.warn("JAXB error: {}", ex.getMessage(), ex);
+ }
+ }
+ }
+
+ assertTrue(hdrToTest.size() > 0, "out-of-band header should not be null");
+ assertEquals("testOobReturnHeaderName", hdrToTest.get(0).getName(),
+ "Expected out-of-band Header name testOobReturnHeaderName recevied :"
+ + hdrToTest.get(0).getName());
+ assertEquals("testOobReturnHeaderValue", hdrToTest.get(0).getValue(),
+ "Expected out-of-band Header value testOobReturnHeaderValue recevied :"
+ + hdrToTest.get(0).getValue());
+ assertEquals("testReturnHdrAttribute", hdrToTest.get(0).getHdrAttribute(),
+ "Expected out-of-band Header attribute testReturnHdrAttribute recevied :"
+ + hdrToTest.get(0).getHdrAttribute());
+
+ assertEquals("New_testOobHeader", hdrToTest.get(1).getName(),
+ "Expected out-of-band Header name New_testOobHeader recevied :"
+ + hdrToTest.get(1).getName());
+ assertEquals("New_testOobHeaderValue", hdrToTest.get(1).getValue(),
+ "Expected out-of-band Header value New_testOobHeaderValue recevied :"
+ + hdrToTest.get(1).getValue());
+ assertEquals("testHdrAttribute", hdrToTest.get(1).getHdrAttribute(),
+ "Expected out-of-band Header attribute testHdrAttribute recevied :"
+ + hdrToTest.get(1).getHdrAttribute());
+ }
+
+ public static class InsertRequestOutHeaderProcessor implements Processor {
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ List<SoapHeader> soapHeaders = CastUtils.cast((List<?>) exchange.getIn().getHeader(Header.HEADER_LIST));
+
+ // Insert a new header
+ String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><outofbandHeader "
+ + "xmlns=\"http://cxf.apache.org/outofband/Header\" hdrAttribute=\"testHdrAttribute\" "
+ + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" soap:mustUnderstand=\"1\">"
+ + "<name>New_testOobHeader</name><value>New_testOobHeaderValue</value></outofbandHeader>";
+
+ SoapHeader newHeader = new SoapHeader(
+ soapHeaders.get(0).getName(),
+ StaxUtils.read(new StringReader(xml)).getDocumentElement());
+ // make sure direction is IN since it is a request message.
+ newHeader.setDirection(Direction.DIRECTION_IN);
+ //newHeader.setMustUnderstand(false);
+ soapHeaders.add(newHeader);
+
+ }
+
+ }
+
+ // START SNIPPET: InsertResponseOutHeaderProcessor
+
+ public static class InsertResponseOutHeaderProcessor implements Processor {
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ // You should be able to get the header if exchange is routed from camel-cxf endpoint
+ List<SoapHeader> soapHeaders = CastUtils.cast((List<?>) exchange.getIn().getHeader(Header.HEADER_LIST));
+ if (soapHeaders == null) {
+ // we just create a new soap headers in case the header is null
+ soapHeaders = new ArrayList<>();
+ }
+
+ // Insert a new header
+ String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><outofbandHeader "
+ + "xmlns=\"http://cxf.apache.org/outofband/Header\" hdrAttribute=\"testHdrAttribute\" "
+ + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" soap:mustUnderstand=\"1\">"
+ + "<name>New_testOobHeader</name><value>New_testOobHeaderValue</value></outofbandHeader>";
+ SoapHeader newHeader = new SoapHeader(
+ soapHeaders.get(0).getName(),
+ StaxUtils.read(new StringReader(xml)).getDocumentElement());
+ // make sure direction is OUT since it is a response message.
+ newHeader.setDirection(Direction.DIRECTION_OUT);
+ //newHeader.setMustUnderstand(false);
+ soapHeaders.add(newHeader);
+
+ }
+
+ }
+
+ // END SNIPPET: InsertResponseOutHeaderProcessor
+
+
+ // *************************************
+ // Config
+ // *************************************
+
+ @Configuration
+ public class TestConfiguration {
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() throws InterruptedException {
+ ServletWebServerFactory webServerFactory = new UndertowServletWebServerFactory(port);
+ return webServerFactory;
+ }
+
+
+ @Bean
+ CxfEndpoint routerRelayEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+ cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint");
+ cxfEndpoint.setWsdlURL("soap_header.wsdl");
+ cxfEndpoint.setEndpointNameAsQName(
+ QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortRelay"));
+ cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceRelayEndpoint() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointBackend");
+ cxfEndpoint.setWsdlURL("soap_header.wsdl");
+ cxfEndpoint.setEndpointNameAsQName(
+ QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortRelay"));
+ cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint routerRelayEndpointWithInsertion() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+ cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointWithInsertion");
+ cxfEndpoint.setWsdlURL("soap_header.wsdl");
+ cxfEndpoint.setEndpointNameAsQName(
+ QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortRelayWithInsertion"));
+ cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+ cxfEndpoint.getFeatures().add(new LoggingFeature());
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceRelayEndpointWithInsertion() {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpointWithInsertionBackend");
+ cxfEndpoint.setWsdlURL("soap_header.wsdl");
+ cxfEndpoint.setEndpointNameAsQName(
+ QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortRelayWithInsertion"));
+ cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+ cxfEndpoint.getFeatures().add(new LoggingFeature());
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint routerNoRelayEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+ cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpoint");
+ cxfEndpoint.setWsdlURL("soap_header.wsdl");
+ cxfEndpoint.setEndpointNameAsQName(
+ QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
+ cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ cxfEndpoint.setProperties(properties);
+ cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceNoRelayEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpointBackend");
+ cxfEndpoint.setWsdlURL("soap_header.wsdl");
+ cxfEndpoint.setEndpointNameAsQName(
+ QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
+ cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ cxfEndpoint.setProperties(properties);
+ cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
+ return cxfEndpoint;
+ }
+
+
+ @Bean
+ CxfEndpoint routerNoRelayNoServiceClassEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayNoServiceClassEndpoint");
+ cxfEndpoint.setWsdlURL("soap_header.wsdl");
+ cxfEndpoint.setEndpointNameAsQName(
+ QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
+ cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ properties.put("allowStreaming", "false");
+ cxfEndpoint.setProperties(properties);
+ cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceNoRelayNoServiceClassEndpoint(HeaderFilterStrategy dropAllMessageHeadersStrategy) {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("http://localhost:" + port + "/services/CxfMessageHeadersRelayTest/HeaderService/routerNoRelayEndpointBackend");
+ cxfEndpoint.setWsdlURL("soap_header.wsdl");
+ cxfEndpoint.setEndpointNameAsQName(
+ QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortNoRelay"));
+ cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+ Map<String, Object> properties = new HashMap<String, Object>();
+ properties.put("dataFormat", "PAYLOAD");
+ cxfEndpoint.setProperties(properties);
+ cxfEndpoint.setHeaderFilterStrategy(dropAllMessageHeadersStrategy);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ CxfEndpoint serviceExtraRelays(HeaderFilterStrategy customMessageFilterStrategy) {
+ CxfSpringEndpoint cxfEndpoint = new CxfSpringEndpoint();
+ cxfEndpoint.setAddress("/CxfMessageHeadersRelayTest/HeaderService/serviceExtraRelays");
+ cxfEndpoint.setWsdlURL("soap_header.wsdl");
+ cxfEndpoint.setServiceClass(org.apache.camel.component.cxf.soap.headers.HeaderTester.class);
+ cxfEndpoint.setEndpointNameAsQName(
+ QName.valueOf("{http://apache.org/camel/component/cxf/soap/headers}SoapPortCustomRelay"));
+ cxfEndpoint.setServiceNameAsQName(SERVICENAME);
+ cxfEndpoint.setHeaderFilterStrategy(customMessageFilterStrategy);
+ return cxfEndpoint;
+ }
+
+ @Bean
+ HeaderFilterStrategy dropAllMessageHeadersStrategy() {
+ CxfHeaderFilterStrategy headerFilterStrategy = new CxfHeaderFilterStrategy();
+ headerFilterStrategy.setRelayHeaders(false);
+ return headerFilterStrategy;
+ }
+
+ @Bean
+ HeaderFilterStrategy customMessageFilterStrategy() {
+ CxfHeaderFilterStrategy headerFilterStrategy = new CxfHeaderFilterStrategy();
+ List<MessageHeaderFilter> headerFilterList = new ArrayList<MessageHeaderFilter>();
+ headerFilterList.add(new SoapMessageHeaderFilter());
+ headerFilterList.add(new CustomHeaderFilter());
+ headerFilterStrategy.setMessageHeaderFilters(headerFilterList);
+ return headerFilterStrategy;
+ }
+
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+
+ from("cxf:bean:routerRelayEndpoint")
+ .to("cxf:bean:serviceRelayEndpoint");
+ from("cxf:bean:routerRelayEndpointWithInsertion")
+ .process(new InsertRequestOutHeaderProcessor())
+ .to("cxf:bean:serviceRelayEndpointWithInsertion")
+ .process(new InsertResponseOutHeaderProcessor());
+ from("direct:directProducer")
+ .to("cxf:bean:serviceRelayEndpoint");
+ from("direct:relayProducer")
+ .to("cxf://"
+ + "http://localhost:" + port
+ + "/services/CxfMessageHeadersRelayTest/HeaderService/routerRelayEndpoint" +
+ "?serviceClass=\"org.apache.camel.component.cxf.soap.headers.HeaderTester\"");
+ from("cxf:bean:routerNoRelayEndpoint")
+ .to("cxf:bean:serviceNoRelayEndpoint");
+ from("cxf:bean:routerNoRelayNoServiceClassEndpoint")
+ .to("cxf:bean:serviceNoRelayNoServiceClassEndpoint");
+ from("cxf:bean:serviceExtraRelays")
+ .to("mock:result");
+ }
+ };
+ }
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CXFMultiPartTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/CXFMultiPartTest.java
similarity index 86%
rename from components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CXFMultiPartTest.java
rename to components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/CXFMultiPartTest.java
index de5e711c741..a40f4655b8b 100644
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/CXFMultiPartTest.java
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/CXFMultiPartTest.java
@@ -14,12 +14,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.component.cxf.soap.springboot;
+package org.apache.camel.component.cxf.soap.springboot.springxml;
import javax.xml.namespace.QName;
import javax.xml.ws.Endpoint;
import javax.xml.ws.Service;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.multipart.MultiPartInvokeImpl;
import org.apache.camel.cxf.multipart.MultiPartInvoke;
import org.apache.camel.cxf.multipart.types.InE;
import org.apache.camel.cxf.multipart.types.ObjectFactory;
@@ -38,7 +40,9 @@ import org.springframework.context.annotation.ImportResource;
import org.springframework.test.annotation.DirtiesContext;
import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
-
+/*
+ * This test uses xml beans and camel route definition
+ */
@DirtiesContext
@CamelSpringBootTest
@SpringBootTest(classes = {
@@ -61,15 +65,18 @@ public class CXFMultiPartTest {
public static final QName ROUTE_PORT_NAME = new QName("http://camel.apache.org/cxf/multipart",
"MultiPartInvokePort");
protected static Endpoint endpoint;
+
+ static int backendSerivcePort = CXFTestSupport.getPort1();
+ static int servletPort = CXFTestSupport.getPort2();
@Bean
public ServletWebServerFactory servletWebServerFactory() {
- return new UndertowServletWebServerFactory();
+ return new UndertowServletWebServerFactory(servletPort);
}
public void startService() {
Object implementor = new MultiPartInvokeImpl();
- String address = "http://localhost:16231"
+ String address = "http://localhost:" + backendSerivcePort
+ "/CXFMultiPartTest/SoapContext/SoapPort";
endpoint = Endpoint.publish(address, implementor);
@@ -85,7 +92,8 @@ public class CXFMultiPartTest {
@Test
public void testInvokingServiceFromCXFClient() throws Exception {
startService();
- String reply = invokeMultiPartService("http://localhost:8080/services/CXFMultiPartTest/CamelContext/RouterPort", "in0", "in1");
+ String reply = invokeMultiPartService("http://localhost:" + servletPort
+ + "/services/CXFMultiPartTest/CamelContext/RouterPort", "in0", "in1");
assertNotNull(reply, "No response received from service");
assertEquals("in0 in1", reply);
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenHandler.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenHandler.java
similarity index 97%
rename from components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenHandler.java
rename to components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenHandler.java
index e5a1bfa36e7..9c34b4118f9 100644
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenHandler.java
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenHandler.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.component.cxf.soap.springboot;
+package org.apache.camel.component.cxf.soap.springboot.springxml;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenTest.java
similarity index 83%
rename from components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenTest.java
rename to components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenTest.java
index ab3c41e9c3a..ac4b823488b 100644
--- a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/WSSUsernameTokenTest.java
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/springxml/WSSUsernameTokenTest.java
@@ -14,19 +14,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.component.cxf.soap.springboot;
+package org.apache.camel.component.cxf.soap.springboot.springxml;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
import org.apache.camel.component.cxf.security.GreetingService;
import org.apache.camel.component.cxf.security.jaas.SimpleLoginModule;
import org.apache.camel.spring.boot.CamelAutoConfiguration;
import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;
import org.springframework.test.annotation.DirtiesContext;
@@ -46,22 +49,25 @@ import java.util.List;
@SpringBootTest(classes = {
CamelAutoConfiguration.class,
WSSUsernameTokenTest.class,
- SimpleLoginModule.class
-}
+ SimpleLoginModule.class,
+ CxfAutoConfiguration.class
+}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
@ImportResource({
"classpath:routes/soap-security.xml"
})
public class WSSUsernameTokenTest {
- private static final Logger LOG = LoggerFactory.getLogger(WSSUsernameTokenTest.class);
-
+
private static final String BAD_PASSWORD = "123";
private static final URL WSDL_URL;
+
+ static int port = CXFTestSupport.getPort1();
static {
try {
- WSDL_URL = new URL("http://localhost:16232/cxf/ws/greeting-service?wsdl");
+ WSDL_URL = new URL("http://localhost:" + port
+ + "/services/greeting-service?wsdl");
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
@@ -69,6 +75,11 @@ public class WSSUsernameTokenTest {
private static final QName SERVICE_NAME = new QName("http://security.cxf.component.camel.apache.org/",
"GreetingServiceImplService");
+
+ @Bean
+ public ServletWebServerFactory servletWebServerFactory() {
+ return new UndertowServletWebServerFactory(port);
+ }
private void addWSSUsernameTokenHandler(Service service, final String username, final String password) {
// set a handler resolver providing WSSUsernameTokenHandler in the handler chain
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslBuilderCustomizer.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslBuilderCustomizer.java
new file mode 100644
index 00000000000..dafd4cee995
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslBuilderCustomizer.java
@@ -0,0 +1,231 @@
+package org.apache.camel.component.cxf.soap.springboot.ssl;
+
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.NoSuchAlgorithmException;
+import java.security.Principal;
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509ExtendedKeyManager;
+
+import org.springframework.boot.web.embedded.undertow.UndertowBuilderCustomizer;
+import org.springframework.boot.web.server.Ssl;
+import org.springframework.boot.web.server.SslConfigurationValidator;
+import org.springframework.boot.web.server.SslStoreProvider;
+import org.springframework.boot.web.server.WebServerException;
+import org.springframework.util.ResourceUtils;
+import org.xnio.Options;
+import org.xnio.Sequence;
+import org.xnio.SslClientAuthMode;
+
+import io.undertow.Undertow;
+
+public class SslBuilderCustomizer implements UndertowBuilderCustomizer {
+ private final int port;
+
+ private final InetAddress address;
+
+ private final Ssl ssl;
+
+ private final SslStoreProvider sslStoreProvider;
+
+ SslBuilderCustomizer(int port, InetAddress address, Ssl ssl, SslStoreProvider sslStoreProvider) {
+ this.port = port;
+ this.address = address;
+ this.ssl = ssl;
+ this.sslStoreProvider = sslStoreProvider;
+ }
+
+ public void customize(Undertow.Builder builder) {
+ try {
+ SSLContext sslContext = SSLContext.getInstance(this.ssl.getProtocol());
+ sslContext.init(getKeyManagers(this.ssl, this.sslStoreProvider),
+ getTrustManagers(this.ssl, this.sslStoreProvider), null);
+ builder.addHttpsListener(this.port, getListenAddress(), sslContext);
+ builder.setSocketOption(Options.SSL_CLIENT_AUTH_MODE, getSslClientAuthMode(this.ssl));
+ if (this.ssl.getEnabledProtocols() != null) {
+ builder.setSocketOption(Options.SSL_ENABLED_PROTOCOLS, Sequence.of(this.ssl.getEnabledProtocols()));
+ }
+ if (this.ssl.getCiphers() != null) {
+ builder.setSocketOption(Options.SSL_ENABLED_CIPHER_SUITES, Sequence.of(this.ssl.getCiphers()));
+ }
+ }
+ catch (NoSuchAlgorithmException | KeyManagementException ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+
+ private String getListenAddress() {
+ if (this.address == null) {
+ return "0.0.0.0";
+ }
+ return this.address.getHostAddress();
+ }
+
+ private SslClientAuthMode getSslClientAuthMode(Ssl ssl) {
+ if (ssl.getClientAuth() == Ssl.ClientAuth.NEED) {
+ return SslClientAuthMode.REQUIRED;
+ }
+ if (ssl.getClientAuth() == Ssl.ClientAuth.WANT) {
+ return SslClientAuthMode.REQUESTED;
+ }
+ return SslClientAuthMode.NOT_REQUESTED;
+ }
+
+ private KeyManager[] getKeyManagers(Ssl ssl, SslStoreProvider sslStoreProvider) {
+ try {
+ KeyStore keyStore = getKeyStore(ssl, sslStoreProvider);
+ SslConfigurationValidator.validateKeyAlias(keyStore, ssl.getKeyAlias());
+ KeyManagerFactory keyManagerFactory = KeyManagerFactory
+ .getInstance(KeyManagerFactory.getDefaultAlgorithm());
+ String keyPassword = (sslStoreProvider != null) ? sslStoreProvider.getKeyPassword() : null;
+ if (keyPassword == null) {
+ keyPassword = (ssl.getKeyPassword() != null) ? ssl.getKeyPassword() : ssl.getKeyStorePassword();
+ }
+ keyManagerFactory.init(keyStore, (keyPassword != null) ? keyPassword.toCharArray() : null);
+ if (ssl.getKeyAlias() != null) {
+ return getConfigurableAliasKeyManagers(ssl, keyManagerFactory.getKeyManagers());
+ }
+ return keyManagerFactory.getKeyManagers();
+ }
+ catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+
+ private KeyManager[] getConfigurableAliasKeyManagers(Ssl ssl, KeyManager[] keyManagers) {
+ for (int i = 0; i < keyManagers.length; i++) {
+ if (keyManagers[i] instanceof X509ExtendedKeyManager) {
+ keyManagers[i] = new ConfigurableAliasKeyManager((X509ExtendedKeyManager) keyManagers[i],
+ ssl.getKeyAlias());
+ }
+ }
+ return keyManagers;
+ }
+
+ private KeyStore getKeyStore(Ssl ssl, SslStoreProvider sslStoreProvider) throws Exception {
+ if (sslStoreProvider != null) {
+ return sslStoreProvider.getKeyStore();
+ }
+ return loadKeyStore(ssl.getKeyStoreType(), ssl.getKeyStoreProvider(), ssl.getKeyStore(),
+ ssl.getKeyStorePassword());
+ }
+
+ private TrustManager[] getTrustManagers(Ssl ssl, SslStoreProvider sslStoreProvider) {
+ try {
+ KeyStore store = getTrustStore(ssl, sslStoreProvider);
+ TrustManagerFactory trustManagerFactory = TrustManagerFactory
+ .getInstance(TrustManagerFactory.getDefaultAlgorithm());
+ trustManagerFactory.init(store);
+ return trustManagerFactory.getTrustManagers();
+ }
+ catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+
+ private KeyStore getTrustStore(Ssl ssl, SslStoreProvider sslStoreProvider) throws Exception {
+ if (sslStoreProvider != null) {
+ return sslStoreProvider.getTrustStore();
+ }
+ return loadTrustStore(ssl.getTrustStoreType(), ssl.getTrustStoreProvider(), ssl.getTrustStore(),
+ ssl.getTrustStorePassword());
+ }
+
+ private KeyStore loadKeyStore(String type, String provider, String resource, String password) throws Exception {
+ return loadStore(type, provider, resource, password);
+ }
+
+ private KeyStore loadTrustStore(String type, String provider, String resource, String password) throws Exception {
+ if (resource == null) {
+ return null;
+ }
+ return loadStore(type, provider, resource, password);
+ }
+
+ private KeyStore loadStore(String type, String provider, String resource, String password) throws Exception {
+ type = (type != null) ? type : "JKS";
+ KeyStore store = (provider != null) ? KeyStore.getInstance(type, provider) : KeyStore.getInstance(type);
+ try {
+ URL url = ResourceUtils.getURL(resource);
+ try (InputStream stream = url.openStream()) {
+ store.load(stream, (password != null) ? password.toCharArray() : null);
+ }
+ return store;
+ }
+ catch (Exception ex) {
+ throw new WebServerException("Could not load key store '" + resource + "'", ex);
+ }
+ }
+
+ /**
+ * {@link X509ExtendedKeyManager} that supports custom alias configuration.
+ */
+ private static class ConfigurableAliasKeyManager extends X509ExtendedKeyManager {
+
+ private final X509ExtendedKeyManager keyManager;
+
+ private final String alias;
+
+ ConfigurableAliasKeyManager(X509ExtendedKeyManager keyManager, String alias) {
+ this.keyManager = keyManager;
+ this.alias = alias;
+ }
+
+ @Override
+ public String chooseEngineClientAlias(String[] strings, Principal[] principals, SSLEngine sslEngine) {
+ return this.keyManager.chooseEngineClientAlias(strings, principals, sslEngine);
+ }
+
+ @Override
+ public String chooseEngineServerAlias(String s, Principal[] principals, SSLEngine sslEngine) {
+ if (this.alias == null) {
+ return this.keyManager.chooseEngineServerAlias(s, principals, sslEngine);
+ }
+ return this.alias;
+ }
+
+ @Override
+ public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
+ return this.keyManager.chooseClientAlias(keyType, issuers, socket);
+ }
+
+ @Override
+ public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) {
+ return this.keyManager.chooseServerAlias(keyType, issuers, socket);
+ }
+
+ @Override
+ public X509Certificate[] getCertificateChain(String alias) {
+ return this.keyManager.getCertificateChain(alias);
+ }
+
+ @Override
+ public String[] getClientAliases(String keyType, Principal[] issuers) {
+ return this.keyManager.getClientAliases(keyType, issuers);
+ }
+
+ @Override
+ public PrivateKey getPrivateKey(String alias) {
+ return this.keyManager.getPrivateKey(alias);
+ }
+
+ @Override
+ public String[] getServerAliases(String keyType, Principal[] issuers) {
+ return this.keyManager.getServerAliases(keyType, issuers);
+ }
+
+ }
+
+}
diff --git a/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslGlobalTest.java b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslGlobalTest.java
new file mode 100644
index 00000000000..ccf6666c4c5
--- /dev/null
+++ b/components-starter/camel-cxf-soap-starter/src/test/java/org/apache/camel/component/cxf/soap/springboot/ssl/SslGlobalTest.java
@@ -0,0 +1,250 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
... 3671 lines suppressed ...