This is an automated email from the ASF dual-hosted git repository.

ppalaga pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/main by this push:
     new 71aa57b850 Document CXF SOAP usage, configuration and limitations
71aa57b850 is described below

commit 71aa57b850214d4470848ffc5a76273988c9469f
Author: Peter Palaga <ppal...@redhat.com>
AuthorDate: Thu Apr 20 21:49:30 2023 +0200

    Document CXF SOAP usage, configuration and limitations
---
 docs/antora.yml                                    |   6 +
 .../ROOT/pages/reference/extensions/cxf-soap.adoc  | 250 +++++++++++++++++++++
 .../cxf-soap/runtime/src/main/doc/usage.adoc       | 239 ++++++++++++++++++++
 3 files changed, 495 insertions(+)

diff --git a/docs/antora.yml b/docs/antora.yml
index 56449ea052..170cd2b9bd 100644
--- a/docs/antora.yml
+++ b/docs/antora.yml
@@ -48,7 +48,13 @@ asciidoc:
     doc-show-extra-content: false # Whether additional content hosted in 
external AsciiDoc files should be loaded via an include:: directive
 
     # External URLs
+    link-camel-quarkus-source: 
https://github.com/apache/camel-quarkus/tree/main
     link-quarkus-code-generator: code.quarkus.io
+    link-quarkus-cxf-doc: 
https://quarkiverse.github.io/quarkiverse-docs/quarkus-cxf/dev
+    link-quarkus-cxf-source: 
https://github.com/quarkiverse/quarkus-cxf/tree/main
+    
+    # Misc
+    javaxOrJakartaPackagePrefix: jakarta # this can be switched to javax in 
older branches
 
     # Project name
     project-name: "Camel Quarkus"
diff --git a/docs/modules/ROOT/pages/reference/extensions/cxf-soap.adoc 
b/docs/modules/ROOT/pages/reference/extensions/cxf-soap.adoc
index b8481bf68f..91bc1a798f 100644
--- a/docs/modules/ROOT/pages/reference/extensions/cxf-soap.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/cxf-soap.adoc
@@ -43,3 +43,253 @@ Or add the coordinates to your existing project:
 ifeval::[{doc-show-user-guide-link} == true]
 Check the xref:user-guide/index.adoc[User guide] for more information about 
writing Camel Quarkus applications.
 endif::[]
+
+[id="extensions-cxf-soap-usage"]
+== Usage
+[id="extensions-cxf-soap-usage-general"]
+=== General
+
+`camel-quarkus-cxf-soap` uses extensions from the {link-quarkus-cxf-doc}[CXF 
Extensions for Quarkus] project - `quarkus-cxf`.
+This means the set of supported use cases and WS specifications is largely 
given by `quarkus-cxf`.
+
+IMPORTANT: To learn about supported use cases and WS specifications, see the 
Quarkus CXF {link-quarkus-cxf-doc}/reference/index.html[Reference].
+
+[id="extensions-cxf-soap-usage-dependency-management"]
+=== Dependency management
+
+The CXF and `quarkus-cxf` versions are 
xref:user-guide/dependency-management.adoc[managed] by {project-name}. You do 
not need select compatible versions for those projects.
+
+[id="extensions-cxf-soap-usage-client"]
+=== Client
+
+With `camel-quarkus-cxf-soap` (no additional dependencies required), you can 
use CXF clients as producers in Camel routes:
+
+[source,java]
+----
+import org.apache.camel.builder.RouteBuilder;
+import {javaxOrJakartaPackagePrefix}.enterprise.context.ApplicationScoped;
+import {javaxOrJakartaPackagePrefix}.enterprise.context.SessionScoped;
+import {javaxOrJakartaPackagePrefix}.enterprise.inject.Produces;
+import {javaxOrJakartaPackagePrefix}.inject.Named;
+
+@ApplicationScoped
+public class CxfSoapClientRoutes extends RouteBuilder {
+
+    @Override
+    public void configure() {
+
+        /* You can either configure the client inline */
+        from("direct:cxfUriParamsClient")
+                
.to("cxf://http://localhost:8082/calculator-ws?wsdlURL=wsdl/CalculatorService.wsdl&dataFormat=POJO&serviceClass=org.foo.CalculatorService";);
+
+        /* Or you can use a named bean produced below by beanClient() method */
+        from("direct:cxfBeanClient")
+                .to("cxf:bean:beanClient?dataFormat=POJO");
+
+    }
+
+    @Produces
+    @SessionScoped
+    @Named
+    CxfEndpoint beanClient() {
+        final CxfEndpoint result = new CxfEndpoint();
+        result.setServiceClass(CalculatorService.class);
+        result.setAddress("http://localhost:8082/calculator-ws";);
+        result.setWsdlURL("wsdl/CalculatorService.wsdl"); // a resource in the 
class path
+        return result;
+    }
+}
+----
+
+The `CalculatorService` may look like the following:
+
+[source,java]
+----
+import {javaxOrJakartaPackagePrefix}.jws.WebMethod;
+import {javaxOrJakartaPackagePrefix}.jws.WebService;
+
+@WebService(targetNamespace = CalculatorService.TARGET_NS) // <1>
+public interface CalculatorService {
+
+    public static final String TARGET_NS = 
"http://acme.org/wscalculator/Calculator";;
+
+    @WebMethod // <1>
+    public int add(int intA, int intB);
+
+    @WebMethod // <1>
+    public int subtract(int intA, int intB);
+
+    @WebMethod // <1>
+    public int divide(int intA, int intB);
+
+    @WebMethod // <1>
+    public int multiply(int intA, int intB);
+}
+----
+
+<1> NOTE: JAX-WS annotations are required. The Simple CXF Frontend is not 
supported. Complex parameter types require JAXB annotations to work in properly 
in native mode.
+
+[TIP]
+You can test this client application against the 
https://quay.io/repository/l2x6/calculator-ws[quay.io/l2x6/calculator-ws:1.2] 
container that implements this service endpoint interface:
++
+[source,shell]
+----
+$ docker run -p 8082:8080 quay.io/l2x6/calculator-ws:1.2
+----
+
+NOTE: `quarkus-cxf` supports 
{link-quarkus-cxf-doc}/user-guide/first-soap-client.html[injecting SOAP clients]
+      using `@io.quarkiverse.cxf.annotation.CXFClient` annotation.
+      Refer to the 
{link-quarkus-cxf-doc}/user-guide/first-soap-client.html[SOAP Clients] chapter 
of `quarkus-cxf` user guide for more details.
+
+[id="extensions-cxf-soap-usage-server"]
+=== Server
+
+With `camel-quarkus-cxf-soap`, you can expose SOAP endpoints as consumers in 
Camel routes.
+No additional dependencies are required for this use case.
+
+[source,java]
+----
+import org.apache.camel.builder.RouteBuilder;
+import {javaxOrJakartaPackagePrefix}.enterprise.context.ApplicationScoped;
+import {javaxOrJakartaPackagePrefix}.enterprise.inject.Produces;
+import {javaxOrJakartaPackagePrefix}.inject.Named;
+
+@ApplicationScoped
+public class CxfSoapRoutes extends RouteBuilder {
+
+    @Override
+    public void configure() {
+        /* A CXF Service configured through a CDI bean */
+        from("cxf:bean:helloBeanEndpoint")
+                .setBody().simple("Hello ${body} from CXF service");
+
+        /* A CXF Service configured through Camel URI parameters */
+        
from("cxf:///hello-inline?wsdlURL=wsdl/HelloService.wsdl&serviceClass=org.foo.HelloService")
+                        .setBody().simple("Hello ${body} from CXF service");
+    }
+
+    @Produces
+    @ApplicationScoped
+    @Named
+    CxfEndpoint helloBeanEndpoint() {
+        final CxfEndpoint result = new CxfEndpoint();
+        result.setServiceClass(HelloService.class);
+        result.setAddress("/hello-bean");
+        result.setWsdlURL("wsdl/HelloService.wsdl");
+        return result;
+    }
+}
+----
+
+The path under which these two services will be served depends on the value of 
`quarkus.cxf.path`
+{link-quarkus-cxf-doc}/reference/extensions/quarkus-cxf.html#quarkus-cxf_quarkus.cxf.path[configuration
 property]
+which can for example be set in `application.properties`:
+
+.application.properties
+[source,properties]
+----
+quarkus.cxf.path = /soap-services
+----
+
+With this configuration in place, our two services can be reached under 
`http://localhost:8080/soap-services/hello-bean`
+and `http://localhost:8080/soap-services/hello-inline` respectively.
+
+The WSDL can be accessed by adding `?wsdl` to the above URLs.
+
+IMPORTANT:  Do not use `quarkus.cxf.path = /` in your application unless you 
are 100% sure that no other extension will want to expose HTTP endpoints.
++
+Before `quarkus-cxf` 2.0.0 (i.e. before {project-name} 3.0.0), the default 
value of `quarkus.cxf.path` was `/`. The default was changed because it 
prevented other Quarkus extensions from exposing any further HTTP endpoints.
+Among others, RESTEasy, Vert.x, SmallRye Health (no health endpoints exposed!) 
were impacted by this.
+
+NOTE: `quarkus-cxf` supports alternative ways of exposing SOAP endpoints.
+      Refer to the 
{link-quarkus-cxf-doc}/user-guide/first-soap-web-service.html[SOAP Services] 
chapter of `quarkus-cxf` user guide for more details.
+
+[id="extensions-cxf-soap-usage-logging-of-requests-and-responses"]
+=== Logging of requests and responses
+
+You can enable verbose logging of SOAP messages for both clients and servers 
with `org.apache.cxf.ext.logging.LoggingFeature`:
+
+[source,java]
+----
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.cxf.ext.logging.LoggingFeature;
+import {javaxOrJakartaPackagePrefix}.enterprise.context.ApplicationScoped;
+import {javaxOrJakartaPackagePrefix}.enterprise.context.SessionScoped;
+import {javaxOrJakartaPackagePrefix}.enterprise.inject.Produces;
+import {javaxOrJakartaPackagePrefix}.inject.Named;
+
+@ApplicationScoped
+public class MyBeans {
+
+    @Produces
+    @ApplicationScoped
+    @Named("prettyLoggingFeature")
+    public LoggingFeature prettyLoggingFeature() {
+        final LoggingFeature result = new LoggingFeature();
+        result.setPrettyLogging(true);
+        return result;
+    }
+
+    @Inject
+    @Named("prettyLoggingFeature")
+    LoggingFeature prettyLoggingFeature;
+
+    @Produces
+    @SessionScoped
+    @Named
+    CxfEndpoint cxfBeanClient() {
+        final CxfEndpoint result = new CxfEndpoint();
+        result.setServiceClass(CalculatorService.class);
+        result.setAddress("https://acme.org/calculator";);
+        result.setWsdlURL("wsdl/CalculatorService.wsdl");
+        result.getFeatures().add(prettyLoggingFeature);
+        return result;
+    }
+
+    @Produces
+    @ApplicationScoped
+    @Named
+    CxfEndpoint helloBeanEndpoint() {
+        final CxfEndpoint result = new CxfEndpoint();
+        result.setServiceClass(HelloService.class);
+        result.setAddress("/hello-bean");
+        result.setWsdlURL("wsdl/HelloService.wsdl");
+        result.getFeatures().add(prettyLoggingFeature);
+        return result;
+    }
+}
+----
+
+NOTE: The support for `org.apache.cxf.ext.logging.LoggingFeature` is provided 
by `io.quarkiverse.cxf:quarkus-cxf-rt-features-logging` as a 
`camel-quarkus-cxf-soap` dependency. You do not need to add it explicitly to 
your application.
+
+[id="extensions-cxf-soap-usage-ws-specifications"]
+=== WS Specifications
+
+The extent of supported WS specifications is given by the Quarkus CXF project.
+
+`camel-quarkus-cxf-soap` covers the following specifications via the 
`{link-quarkus-cxf-doc}/reference/extensions/quarkus-cxf.html[io.quarkiverse.cxf:quarkus-cxf]`
 extension:
+
+* JAX-WS
+* JAXB
+* WS-Addressing
+* WS-Policy
+* MTOM
+
+If your application requires some other WS specification, you must add an 
additional Quarkus CXF dependency covering it.
+Refer to Quarkus CXF {link-quarkus-cxf-doc}/reference/index.html[Reference] 
page to see which WS specifications are covered by which Quarkus CXF extensions.
+
+TIP: Both {project-name} and Quarkus CXF contain a number of
+     {link-camel-quarkus-source}/integration-test-groups/cxf-soap[integration]
+     {link-quarkus-cxf-source}/integration-tests[tests] which can serve as 
executable examples
+     of applications that implement various WS specifications.
+
+[id="extensions-cxf-soap-usage-tooling"]
+=== Tooling
+
+`quarkus-cxf` wraps the following two CXF tools:
+
+* `wsdl2Java` - for 
{link-quarkus-cxf-doc}/user-guide/first-soap-client.html#wsdl2java[generating 
service classes from WSDL]
+* `java2ws` - for 
{link-quarkus-cxf-doc}/user-guide/generate-wsdl-from-java.html[generating WSDL 
from Java classes]
+
+IMPORTANT: For `wsdl2Java` to work properly, your application will have to 
directly depend on `io.quarkiverse.cxf:quarkus-cxf`.
+
diff --git a/extensions/cxf-soap/runtime/src/main/doc/usage.adoc 
b/extensions/cxf-soap/runtime/src/main/doc/usage.adoc
new file mode 100644
index 0000000000..73da8af485
--- /dev/null
+++ b/extensions/cxf-soap/runtime/src/main/doc/usage.adoc
@@ -0,0 +1,239 @@
+=== General
+
+`camel-quarkus-cxf-soap` uses extensions from the {link-quarkus-cxf-doc}[CXF 
Extensions for Quarkus] project - `quarkus-cxf`.
+This means the set of supported use cases and WS specifications is largely 
given by `quarkus-cxf`.
+
+IMPORTANT: To learn about supported use cases and WS specifications, see the 
Quarkus CXF {link-quarkus-cxf-doc}/reference/index.html[Reference].
+
+=== Dependency management
+
+The CXF and `quarkus-cxf` versions are 
xref:user-guide/dependency-management.adoc[managed] by {project-name}. You do 
not need select compatible versions for those projects.
+
+=== Client
+
+With `camel-quarkus-cxf-soap` (no additional dependencies required), you can 
use CXF clients as producers in Camel routes:
+
+[source,java]
+----
+import org.apache.camel.builder.RouteBuilder;
+import {javaxOrJakartaPackagePrefix}.enterprise.context.ApplicationScoped;
+import {javaxOrJakartaPackagePrefix}.enterprise.context.SessionScoped;
+import {javaxOrJakartaPackagePrefix}.enterprise.inject.Produces;
+import {javaxOrJakartaPackagePrefix}.inject.Named;
+
+@ApplicationScoped
+public class CxfSoapClientRoutes extends RouteBuilder {
+
+    @Override
+    public void configure() {
+
+        /* You can either configure the client inline */
+        from("direct:cxfUriParamsClient")
+                
.to("cxf://http://localhost:8082/calculator-ws?wsdlURL=wsdl/CalculatorService.wsdl&dataFormat=POJO&serviceClass=org.foo.CalculatorService";);
+
+        /* Or you can use a named bean produced below by beanClient() method */
+        from("direct:cxfBeanClient")
+                .to("cxf:bean:beanClient?dataFormat=POJO");
+
+    }
+
+    @Produces
+    @SessionScoped
+    @Named
+    CxfEndpoint beanClient() {
+        final CxfEndpoint result = new CxfEndpoint();
+        result.setServiceClass(CalculatorService.class);
+        result.setAddress("http://localhost:8082/calculator-ws";);
+        result.setWsdlURL("wsdl/CalculatorService.wsdl"); // a resource in the 
class path
+        return result;
+    }
+}
+----
+
+The `CalculatorService` may look like the following:
+
+[source,java]
+----
+import {javaxOrJakartaPackagePrefix}.jws.WebMethod;
+import {javaxOrJakartaPackagePrefix}.jws.WebService;
+
+@WebService(targetNamespace = CalculatorService.TARGET_NS) // <1>
+public interface CalculatorService {
+
+    public static final String TARGET_NS = 
"http://acme.org/wscalculator/Calculator";;
+
+    @WebMethod // <1>
+    public int add(int intA, int intB);
+
+    @WebMethod // <1>
+    public int subtract(int intA, int intB);
+
+    @WebMethod // <1>
+    public int divide(int intA, int intB);
+
+    @WebMethod // <1>
+    public int multiply(int intA, int intB);
+}
+----
+
+<1> NOTE: JAX-WS annotations are required. The Simple CXF Frontend is not 
supported. Complex parameter types require JAXB annotations to work in properly 
in native mode.
+
+[TIP]
+You can test this client application against the 
https://quay.io/repository/l2x6/calculator-ws[quay.io/l2x6/calculator-ws:1.2] 
container that implements this service endpoint interface:
++
+[source,shell]
+----
+$ docker run -p 8082:8080 quay.io/l2x6/calculator-ws:1.2
+----
+
+NOTE: `quarkus-cxf` supports 
{link-quarkus-cxf-doc}/user-guide/first-soap-client.html[injecting SOAP clients]
+      using `@io.quarkiverse.cxf.annotation.CXFClient` annotation.
+      Refer to the 
{link-quarkus-cxf-doc}/user-guide/first-soap-client.html[SOAP Clients] chapter 
of `quarkus-cxf` user guide for more details.
+
+=== Server
+
+With `camel-quarkus-cxf-soap`, you can expose SOAP endpoints as consumers in 
Camel routes.
+No additional dependencies are required for this use case.
+
+[source,java]
+----
+import org.apache.camel.builder.RouteBuilder;
+import {javaxOrJakartaPackagePrefix}.enterprise.context.ApplicationScoped;
+import {javaxOrJakartaPackagePrefix}.enterprise.inject.Produces;
+import {javaxOrJakartaPackagePrefix}.inject.Named;
+
+@ApplicationScoped
+public class CxfSoapRoutes extends RouteBuilder {
+
+    @Override
+    public void configure() {
+        /* A CXF Service configured through a CDI bean */
+        from("cxf:bean:helloBeanEndpoint")
+                .setBody().simple("Hello ${body} from CXF service");
+
+        /* A CXF Service configured through Camel URI parameters */
+        
from("cxf:///hello-inline?wsdlURL=wsdl/HelloService.wsdl&serviceClass=org.foo.HelloService")
+                        .setBody().simple("Hello ${body} from CXF service");
+    }
+
+    @Produces
+    @ApplicationScoped
+    @Named
+    CxfEndpoint helloBeanEndpoint() {
+        final CxfEndpoint result = new CxfEndpoint();
+        result.setServiceClass(HelloService.class);
+        result.setAddress("/hello-bean");
+        result.setWsdlURL("wsdl/HelloService.wsdl");
+        return result;
+    }
+}
+----
+
+The path under which these two services will be served depends on the value of 
`quarkus.cxf.path`
+{link-quarkus-cxf-doc}/reference/extensions/quarkus-cxf.html#quarkus-cxf_quarkus.cxf.path[configuration
 property]
+which can for example be set in `application.properties`:
+
+.application.properties
+[source,properties]
+----
+quarkus.cxf.path = /soap-services
+----
+
+With this configuration in place, our two services can be reached under 
`http://localhost:8080/soap-services/hello-bean`
+and `http://localhost:8080/soap-services/hello-inline` respectively.
+
+The WSDL can be accessed by adding `?wsdl` to the above URLs.
+
+IMPORTANT:  Do not use `quarkus.cxf.path = /` in your application unless you 
are 100% sure that no other extension will want to expose HTTP endpoints.
++
+Before `quarkus-cxf` 2.0.0 (i.e. before {project-name} 3.0.0), the default 
value of `quarkus.cxf.path` was `/`. The default was changed because it 
prevented other Quarkus extensions from exposing any further HTTP endpoints.
+Among others, RESTEasy, Vert.x, SmallRye Health (no health endpoints exposed!) 
were impacted by this.
+
+NOTE: `quarkus-cxf` supports alternative ways of exposing SOAP endpoints.
+      Refer to the 
{link-quarkus-cxf-doc}/user-guide/first-soap-web-service.html[SOAP Services] 
chapter of `quarkus-cxf` user guide for more details.
+
+=== Logging of requests and responses
+
+You can enable verbose logging of SOAP messages for both clients and servers 
with `org.apache.cxf.ext.logging.LoggingFeature`:
+
+[source,java]
+----
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.cxf.ext.logging.LoggingFeature;
+import {javaxOrJakartaPackagePrefix}.enterprise.context.ApplicationScoped;
+import {javaxOrJakartaPackagePrefix}.enterprise.context.SessionScoped;
+import {javaxOrJakartaPackagePrefix}.enterprise.inject.Produces;
+import {javaxOrJakartaPackagePrefix}.inject.Named;
+
+@ApplicationScoped
+public class MyBeans {
+
+    @Produces
+    @ApplicationScoped
+    @Named("prettyLoggingFeature")
+    public LoggingFeature prettyLoggingFeature() {
+        final LoggingFeature result = new LoggingFeature();
+        result.setPrettyLogging(true);
+        return result;
+    }
+
+    @Inject
+    @Named("prettyLoggingFeature")
+    LoggingFeature prettyLoggingFeature;
+
+    @Produces
+    @SessionScoped
+    @Named
+    CxfEndpoint cxfBeanClient() {
+        final CxfEndpoint result = new CxfEndpoint();
+        result.setServiceClass(CalculatorService.class);
+        result.setAddress("https://acme.org/calculator";);
+        result.setWsdlURL("wsdl/CalculatorService.wsdl");
+        result.getFeatures().add(prettyLoggingFeature);
+        return result;
+    }
+
+    @Produces
+    @ApplicationScoped
+    @Named
+    CxfEndpoint helloBeanEndpoint() {
+        final CxfEndpoint result = new CxfEndpoint();
+        result.setServiceClass(HelloService.class);
+        result.setAddress("/hello-bean");
+        result.setWsdlURL("wsdl/HelloService.wsdl");
+        result.getFeatures().add(prettyLoggingFeature);
+        return result;
+    }
+}
+----
+
+NOTE: The support for `org.apache.cxf.ext.logging.LoggingFeature` is provided 
by `io.quarkiverse.cxf:quarkus-cxf-rt-features-logging` as a 
`camel-quarkus-cxf-soap` dependency. You do not need to add it explicitly to 
your application.
+
+=== WS Specifications
+
+The extent of supported WS specifications is given by the Quarkus CXF project.
+
+`camel-quarkus-cxf-soap` covers the following specifications via the 
`{link-quarkus-cxf-doc}/reference/extensions/quarkus-cxf.html[io.quarkiverse.cxf:quarkus-cxf]`
 extension:
+
+* JAX-WS
+* JAXB
+* WS-Addressing
+* WS-Policy
+* MTOM
+
+If your application requires some other WS specification, you must add an 
additional Quarkus CXF dependency covering it.
+Refer to Quarkus CXF {link-quarkus-cxf-doc}/reference/index.html[Reference] 
page to see which WS specifications are covered by which Quarkus CXF extensions.
+
+TIP: Both {project-name} and Quarkus CXF contain a number of
+     {link-camel-quarkus-source}/integration-test-groups/cxf-soap[integration]
+     {link-quarkus-cxf-source}/integration-tests[tests] which can serve as 
executable examples
+     of applications that implement various WS specifications.
+
+=== Tooling
+
+`quarkus-cxf` wraps the following two CXF tools:
+
+* `wsdl2Java` - for 
{link-quarkus-cxf-doc}/user-guide/first-soap-client.html#wsdl2java[generating 
service classes from WSDL]
+* `java2ws` - for 
{link-quarkus-cxf-doc}/user-guide/generate-wsdl-from-java.html[generating WSDL 
from Java classes]
+
+IMPORTANT: For `wsdl2Java` to work properly, your application will have to 
directly depend on `io.quarkiverse.cxf:quarkus-cxf`.

Reply via email to