From 6b300f5287f6d9e2cf77140bf494d1a3d7042011 Mon Sep 17 00:00:00 2001 From: Pierre-Alexandre Meyer Date: Fri, 10 Jan 2025 23:19:33 +0000 Subject: [PATCH 1/3] CXF workaround for https://github.com/jakartaee/saaj-api/issues/43 Signed-off-by: Pierre-Alexandre Meyer --- pom.xml | 50 +++++++++++++++++++ .../helloworld/HelloWorldActivator.java | 48 ++++++++++++++++-- 2 files changed, 95 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 63177f5..175cefd 100644 --- a/pom.xml +++ b/pom.xml @@ -63,11 +63,36 @@ com.google.inject guice + + com.sun.xml.messaging.saaj + saaj-impl + 3.0.1 + + + jakarta.annotation + jakarta.annotation-api + 2.1.1 + jakarta.servlet jakarta.servlet-api provided + + jakarta.xml.bind + jakarta.xml.bind-api + 3.0.1 + + + jakarta.xml.soap + jakarta.xml.soap-api + 3.0.1 + + + jakarta.xml.ws + jakarta.xml.ws-api + 3.0.1 + javax.inject javax.inject @@ -77,11 +102,36 @@ joda-time provided + + org.apache.cxf + cxf-core + 4.0.3 + + + org.apache.cxf + cxf-rt-bindings-soap + 4.0.3 + + + org.apache.cxf + cxf-rt-frontend-jaxws + 4.0.3 + + + org.apache.cxf + cxf-rt-transports-http + 4.0.3 + org.apache.felix org.apache.felix.framework provided + + org.glassfish.jaxb + jaxb-runtime + 3.0.1 + org.jooby jooby diff --git a/src/main/java/org/killbill/billing/plugin/helloworld/HelloWorldActivator.java b/src/main/java/org/killbill/billing/plugin/helloworld/HelloWorldActivator.java index 1f3ca97..ecac4ff 100644 --- a/src/main/java/org/killbill/billing/plugin/helloworld/HelloWorldActivator.java +++ b/src/main/java/org/killbill/billing/plugin/helloworld/HelloWorldActivator.java @@ -19,12 +19,14 @@ package org.killbill.billing.plugin.helloworld; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.Hashtable; import java.util.Properties; - import javax.servlet.Servlet; import javax.servlet.http.HttpServlet; - +import javax.xml.namespace.QName; +import org.killbill.billing.invoice.plugin.api.InvoiceFormatterFactory; import org.killbill.billing.invoice.plugin.api.InvoicePluginApi; import org.killbill.billing.osgi.api.Healthcheck; import org.killbill.billing.osgi.api.OSGIPluginProperties; @@ -38,7 +40,16 @@ import org.killbill.billing.plugin.core.resources.jooby.PluginAppBuilder; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; -import org.killbill.billing.invoice.plugin.api.InvoiceFormatterFactory; +import jakarta.xml.soap.MessageFactory; +import jakarta.xml.soap.SOAPBody; +import jakarta.xml.soap.SOAPElement; +import jakarta.xml.soap.SOAPEnvelope; +import jakarta.xml.soap.SOAPException; +import jakarta.xml.soap.SOAPMessage; +import jakarta.xml.soap.SOAPPart; +import jakarta.xml.ws.Dispatch; +import jakarta.xml.ws.Service; +import jakarta.xml.ws.soap.SOAPBinding; public class HelloWorldActivator extends KillbillActivatorBase { @@ -99,6 +110,37 @@ public void start(final BundleContext context) throws Exception { registerServlet(context, httpServlet); registerHandlers(); + + final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + try { + soap(); + } finally { + Thread.currentThread().setContextClassLoader(contextClassLoader); + } + } + + private void soap() throws SOAPException, IOException { + String endpointAddress = "http://www.dneonline.com/calculator.asmx"; + MessageFactory factory = MessageFactory.newInstance(); + SOAPMessage request = factory.createMessage(); + SOAPPart soapPart = request.getSOAPPart(); + SOAPEnvelope envelope = soapPart.getEnvelope(); + SOAPBody body = envelope.getBody(); + SOAPElement operation = body.addChildElement("Add", "", "http://tempuri.org/"); + operation.addChildElement("intA").addTextNode("5"); + operation.addChildElement("intB").addTextNode("7"); + request.saveChanges(); + QName serviceName = new QName("http://tempuri.org/", "Calculator"); + QName portName = new QName("http://tempuri.org/", "CalculatorSoap"); + Service service = Service.create(serviceName); + service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress); + Dispatch dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE); + System.out.println("Sending 'Add' request to the public Calculator service..."); + SOAPMessage response = dispatch.invoke(request); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + response.writeTo(out); + System.out.println("\nSOAP Response:\n" + new String(out.toByteArray())); } @Override From 4751d2cf328384b5c2263cd92c1c7817b77ba948 Mon Sep 17 00:00:00 2001 From: Pierre-Alexandre Meyer Date: Sat, 11 Jan 2025 09:30:25 +0000 Subject: [PATCH 2/3] Ensure META-INF/cxf/bus-extensions.txt is properly aggregated in the final JAR https://cxf.apache.org/docs/bundling-cxf-into-single-jar-with-maven-shade-plugin.html Signed-off-by: Pierre-Alexandre Meyer --- pom.xml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pom.xml b/pom.xml index 175cefd..114bbbb 100644 --- a/pom.xml +++ b/pom.xml @@ -198,6 +198,26 @@ + + org.apache.maven.plugins + maven-shade-plugin + + + package + + shade + + + + + META-INF/cxf/bus-extensions.txt + + + + + + org.apache.felix maven-bundle-plugin From 643b75e56da93d847d05ddd92544ebeb9d8f9a7f Mon Sep 17 00:00:00 2001 From: Pierre-Alexandre Meyer Date: Sat, 11 Jan 2025 09:31:19 +0000 Subject: [PATCH 3/3] Make .NET happy Signed-off-by: Pierre-Alexandre Meyer --- .../billing/plugin/helloworld/HelloWorldActivator.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/killbill/billing/plugin/helloworld/HelloWorldActivator.java b/src/main/java/org/killbill/billing/plugin/helloworld/HelloWorldActivator.java index ecac4ff..86bc24e 100644 --- a/src/main/java/org/killbill/billing/plugin/helloworld/HelloWorldActivator.java +++ b/src/main/java/org/killbill/billing/plugin/helloworld/HelloWorldActivator.java @@ -22,6 +22,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Hashtable; +import java.util.Map; import java.util.Properties; import javax.servlet.Servlet; import javax.servlet.http.HttpServlet; @@ -136,6 +137,9 @@ private void soap() throws SOAPException, IOException { Service service = Service.create(serviceName); service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress); Dispatch dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE); + Map rc = dispatch.getRequestContext(); + rc.put(jakarta.xml.ws.BindingProvider.SOAPACTION_USE_PROPERTY, true); + rc.put(jakarta.xml.ws.BindingProvider.SOAPACTION_URI_PROPERTY, "\"http://tempuri.org/Add\""); System.out.println("Sending 'Add' request to the public Calculator service..."); SOAPMessage response = dispatch.invoke(request); ByteArrayOutputStream out = new ByteArrayOutputStream();