Repository: tomee Updated Branches: refs/heads/develop 8aa67a537 -> b260a9651
TOMEE-1466 Apply WS-Security config (cxf interceptor) when use @WebService with javax.xml.ws.Service Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/beaa5be8 Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/beaa5be8 Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/beaa5be8 Branch: refs/heads/develop Commit: beaa5be858428f42fb3b628ad9a960990c5c9f34 Parents: 8aa67a5 Author: Romain Manni-Bucau <[email protected]> Authored: Wed Dec 3 12:04:01 2014 +0100 Committer: Romain Manni-Bucau <[email protected]> Committed: Wed Dec 3 12:04:01 2014 +0100 ---------------------------------------------------------------------- .../core/ivm/naming/JaxWsServiceReference.java | 12 ++-- .../core/webservices/ProviderWrapper.java | 61 +++++++++------- .../core/webservices/ProviderWrapperTest.java | 2 +- .../server/cxf/WebServiceInjectionTest.java | 74 +++++++++++++++++++- 4 files changed, 113 insertions(+), 36 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/beaa5be8/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/JaxWsServiceReference.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/JaxWsServiceReference.java b/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/JaxWsServiceReference.java index b139075..3be9fb4 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/JaxWsServiceReference.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/JaxWsServiceReference.java @@ -123,7 +123,10 @@ public class JaxWsServiceReference extends Reference { } } - ProviderWrapper.beforeCreate(ports); + final WebServiceClientCustomizer customizer = SystemInstance.get().getComponent(WebServiceClientCustomizer.class); + final Properties configuration = properties == null ? new Properties() : properties; + + ProviderWrapper.beforeCreate(ports, customizer, properties); Service instance; try { instance = null; @@ -145,9 +148,6 @@ public class JaxWsServiceReference extends Reference { instance.setHandlerResolver(handlerResolver); } - final WebServiceClientCustomizer customizer = SystemInstance.get().getComponent(WebServiceClientCustomizer.class); - final Properties configuration = properties == null ? new Properties() : properties; - final Object port; if (referenceClass != null && !Service.class.isAssignableFrom(referenceClass)) { final WebServiceFeature[] features = customizer == null ? null : customizer.features(serviceQName, configuration); @@ -172,10 +172,6 @@ public class JaxWsServiceReference extends Reference { portRefs); ServiceRefData.putServiceRefData(port, serviceRefData); - if (customizer != null) { - customizer.customize(port, configuration); - } - return port; } http://git-wip-us.apache.org/repos/asf/tomee/blob/beaa5be8/container/openejb-core/src/main/java/org/apache/openejb/core/webservices/ProviderWrapper.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/webservices/ProviderWrapper.java b/container/openejb-core/src/main/java/org/apache/openejb/core/webservices/ProviderWrapper.java index e79db39..62edd00 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/core/webservices/ProviderWrapper.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/core/webservices/ProviderWrapper.java @@ -18,6 +18,7 @@ package org.apache.openejb.core.webservices; import org.apache.openejb.OpenEJBRuntimeException; +import org.apache.openejb.core.ivm.naming.JaxWsServiceReference; import org.apache.openejb.loader.IO; import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; @@ -65,7 +66,7 @@ public class ProviderWrapper extends Provider { private static final ThreadLocal<ProviderWrapperData> threadPortRefs = new ThreadLocal<ProviderWrapperData>(); - public static void beforeCreate(final List<PortRefData> portRefData) { + public static void beforeCreate(final List<PortRefData> portRefData, final JaxWsServiceReference.WebServiceClientCustomizer customizer, final Properties properties) { // Axis JAXWS api is non compliant and checks system property before classloader // so we replace system property so this wrapper is selected. The original value // is saved into an openejb property so we can load the class in the find method @@ -83,7 +84,7 @@ public class ProviderWrapper extends Provider { } else { Thread.currentThread().setContextClassLoader(new ProviderClassLoader()); } - threadPortRefs.set(new ProviderWrapperData(portRefData, oldClassLoader)); + threadPortRefs.set(new ProviderWrapperData(portRefData, oldClassLoader, customizer, properties)); } public static void afterCreate() { @@ -94,10 +95,14 @@ public class ProviderWrapper extends Provider { private static class ProviderWrapperData { private final List<PortRefData> portRefData; private final ClassLoader callerClassLoader; + private final JaxWsServiceReference.WebServiceClientCustomizer customizer; + private final Properties properties; - public ProviderWrapperData(final List<PortRefData> portRefData, final ClassLoader callerClassLoader) { + public ProviderWrapperData(final List<PortRefData> portRefData, final ClassLoader callerClassLoader, final JaxWsServiceReference.WebServiceClientCustomizer customizer, final Properties properties) { this.portRefData = portRefData; this.callerClassLoader = callerClassLoader; + this.customizer = customizer; + this.properties = properties; } } @@ -164,15 +169,32 @@ public class ProviderWrapper extends Provider { private class ServiceDelegateWrapper extends ServiceDelegate { private final ServiceDelegate serviceDelegate; + private final JaxWsServiceReference.WebServiceClientCustomizer customizer; + private final Properties configuration; public ServiceDelegateWrapper(final ServiceDelegate serviceDelegate) { this.serviceDelegate = serviceDelegate; + final ProviderWrapperData providerWrapperData = threadPortRefs.get(); + if (providerWrapperData != null) { + this.customizer = providerWrapperData.customizer; + this.configuration = providerWrapperData.properties; + } else { + this.customizer = null; + this.configuration = null; + } + } + + private <T> T customizePort(final T port) { + if (customizer != null && configuration != null) { + customizer.customize(port, configuration); + } + return port; } public <T> T getPort(final QName portName, final Class<T> serviceEndpointInterface) { final T t = serviceDelegate.getPort(portName, serviceEndpointInterface); setProperties((BindingProvider) t, portName); - return t; + return customizePort(t); } public <T> T getPort(final Class<T> serviceEndpointInterface) { @@ -189,7 +211,7 @@ public class ProviderWrapper extends Provider { } setProperties((BindingProvider) t, qname); - return t; + return customizePort(t); } public void addPort(final QName portName, final String bindingId, final String endpointAddress) { @@ -254,45 +276,33 @@ public class ProviderWrapper extends Provider { @SuppressWarnings({"unchecked"}) public <T> T getPort(final QName portName, final Class<T> serviceEndpointInterface, final WebServiceFeature... features) { - return (T) invoke21Delegate(serviceDelegate, serviceGetPortByQName, - portName, - serviceEndpointInterface, - features); + return customizePort((T) invoke21Delegate(serviceDelegate, serviceGetPortByQName, portName, serviceEndpointInterface, features)); } @SuppressWarnings({"unchecked"}) public <T> T getPort(final EndpointReference endpointReference, final Class<T> serviceEndpointInterface, final WebServiceFeature... features) { - return (T) invoke21Delegate(serviceDelegate, serviceGetPortByEndpointReference, - endpointReference, - serviceEndpointInterface, - features); + return customizePort((T) invoke21Delegate(serviceDelegate, serviceGetPortByEndpointReference, endpointReference, serviceEndpointInterface, features)); } @SuppressWarnings({"unchecked"}) public <T> T getPort(final Class<T> serviceEndpointInterface, final WebServiceFeature... features) { - return (T) invoke21Delegate(serviceDelegate, serviceGetPortByInterface, - serviceEndpointInterface, - features); + return customizePort((T) invoke21Delegate(serviceDelegate, serviceGetPortByInterface, serviceEndpointInterface, features)); } public QName getServiceName() { - final QName qName = serviceDelegate.getServiceName(); - return qName; + return serviceDelegate.getServiceName(); } public Iterator<QName> getPorts() { - final Iterator<QName> ports = serviceDelegate.getPorts(); - return ports; + return serviceDelegate.getPorts(); } public URL getWSDLDocumentLocation() { - final URL documentLocation = serviceDelegate.getWSDLDocumentLocation(); - return documentLocation; + return serviceDelegate.getWSDLDocumentLocation(); } public HandlerResolver getHandlerResolver() { - final HandlerResolver handlerResolver = serviceDelegate.getHandlerResolver(); - return handlerResolver; + return serviceDelegate.getHandlerResolver(); } public void setHandlerResolver(final HandlerResolver handlerResolver) { @@ -300,8 +310,7 @@ public class ProviderWrapper extends Provider { } public Executor getExecutor() { - final Executor executor = serviceDelegate.getExecutor(); - return executor; + return serviceDelegate.getExecutor(); } public void setExecutor(final Executor executor) { http://git-wip-us.apache.org/repos/asf/tomee/blob/beaa5be8/container/openejb-core/src/test/java/org/apache/openejb/core/webservices/ProviderWrapperTest.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/test/java/org/apache/openejb/core/webservices/ProviderWrapperTest.java b/container/openejb-core/src/test/java/org/apache/openejb/core/webservices/ProviderWrapperTest.java index 230f257..7c7c99c 100644 --- a/container/openejb-core/src/test/java/org/apache/openejb/core/webservices/ProviderWrapperTest.java +++ b/container/openejb-core/src/test/java/org/apache/openejb/core/webservices/ProviderWrapperTest.java @@ -38,7 +38,7 @@ public class ProviderWrapperTest extends TestCase { assertNotNull("provider is null", provider); assertFalse("provider should not be an instance of ProviderWrapper", provider instanceof ProviderWrapper); - ProviderWrapper.beforeCreate(null); + ProviderWrapper.beforeCreate(null, null, null); try { provider = Provider.provider(); assertNotNull("provider is null", provider); http://git-wip-us.apache.org/repos/asf/tomee/blob/beaa5be8/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/WebServiceInjectionTest.java ---------------------------------------------------------------------- diff --git a/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/WebServiceInjectionTest.java b/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/WebServiceInjectionTest.java index c4f1606..4382fc7 100644 --- a/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/WebServiceInjectionTest.java +++ b/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/WebServiceInjectionTest.java @@ -21,6 +21,8 @@ import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.message.Message; +import org.apache.cxf.ws.addressing.impl.MAPAggregatorImpl; +import org.apache.cxf.ws.addressing.soap.MAPCodec; import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor; import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor; import org.apache.openejb.config.sys.MapFactory; @@ -37,7 +39,16 @@ import org.junit.runner.RunWith; import javax.ejb.Singleton; import javax.jws.WebService; +import javax.xml.namespace.QName; +import javax.xml.ws.Service; +import javax.xml.ws.WebEndpoint; +import javax.xml.ws.WebServiceClient; +import javax.xml.ws.WebServiceException; +import javax.xml.ws.WebServiceFeature; import javax.xml.ws.WebServiceRef; +import javax.xml.ws.soap.AddressingFeature; +import java.net.MalformedURLException; +import java.net.URL; import java.util.Iterator; import java.util.Properties; @@ -57,10 +68,20 @@ public class WebServiceInjectionTest { @WebServiceRef private MyWsApi api; + @WebServiceRef + private MyWebservice_Service service; + @Test - public void checkInjection() { + public void checkConfiguration() { // assertEquals("ok", api.test()); // local call so skip it but check config which is actually the only interesting thing final Client client = ClientProxy.getClient(api); + testPort(client); + + testPort(ClientProxy.getClient(service.getMyWsApi())); + testPortWithFeature(ClientProxy.getClient(service.getMyWsApi(new AddressingFeature()))); + } + + private void testPort(final Client client) { assertNotNull(client); assertEquals(2, client.getOutInterceptors().size()); assertEquals(1, client.getInInterceptors().size()); @@ -74,6 +95,23 @@ public class WebServiceInjectionTest { assertEquals("b", WSS4JInInterceptor.class.cast(wss4jin).getProperties().get("a")); } + private void testPortWithFeature(final Client client) { + assertNotNull(client); + assertEquals(4, client.getOutInterceptors().size()); + assertEquals(3, client.getInInterceptors().size()); + final Iterator<Interceptor<? extends Message>> Out = client.getOutInterceptors().iterator(); + assertTrue(MAPAggregatorImpl.class.isInstance(Out.next())); + assertTrue(MAPCodec.class.isInstance(Out.next())); + assertTrue(LoggingOutInterceptor.class.isInstance(Out.next())); + final Interceptor<? extends Message> wss4jout = Out.next(); + assertTrue(WSS4JOutInterceptor.class.isInstance(wss4jout)); + + final Iterator<Interceptor<? extends Message>> iteratorIn = client.getInInterceptors().iterator(); + assertTrue(MAPAggregatorImpl.class.isInstance(iteratorIn.next())); + assertTrue(MAPCodec.class.isInstance(iteratorIn.next())); + assertTrue(WSS4JInInterceptor.class.isInstance(iteratorIn.next())); + } + @ApplicationConfiguration public Properties props() { // return new PropertiesBuilder().p("cxf.jaxws.client.out-interceptors", LoggingOutInterceptor.class.getName()).build(); @@ -82,6 +120,9 @@ public class WebServiceInjectionTest { .p("cxf.jaxws.client.{http://cxf.server.openejb.apache.org/}MyWebservicePort.in-interceptors", "wss4jin") .p("cxf.jaxws.client.{http://cxf.server.openejb.apache.org/}MyWebservicePort.out-interceptors", "loo,wss4jout") + .p("cxf.jaxws.client.{http://cxf.server.openejb.apache.org/}myWebservice.in-interceptors", "wss4jin") + .p("cxf.jaxws.client.{http://cxf.server.openejb.apache.org/}myWebservice.out-interceptors", "loo,wss4jout") + .p("loo", "new://Service?class-name=" + LoggingOutInterceptor.class.getName()) .p("wss4jin", "new://Service?class-name=" + WSS4JInInterceptorFactory.class.getName() + "&factory-name=create") @@ -109,4 +150,35 @@ public class WebServiceInjectionTest { return "ok"; } } + + @WebServiceClient(name = "MyWebservice") + public static class MyWebservice_Service extends Service { + public MyWebservice_Service() { + super(getWsdl(), new QName("http://cxf.server.openejb.apache.org/", "MyWebservice_Service")); + } + + public MyWebservice_Service(final URL wsdlDocumentLocation, final QName serviceName) { + super(wsdlDocumentLocation, serviceName); + } + + public MyWebservice_Service(final URL wsdlDocumentLocation, final QName serviceName, final WebServiceFeature... features) { + super(wsdlDocumentLocation, serviceName, features); + } + + + static URL getWsdl() throws WebServiceException { + try { + return new URL("http://wsdl"); + } catch (final MalformedURLException ex) { + throw new WebServiceException(ex); + } + } + + @WebEndpoint(name = "myWebserviceWS") + public MyWsApi getMyWsApi(final WebServiceFeature... features) { + return super.getPort(new QName("http://cxf.server.openejb.apache.org/", "myWebservice"), MyWsApi.class, features); + } + + + } }
