Repository: tomee Updated Branches: refs/heads/tomee-1.7.x 9a340c02f -> 3f1f037e5
TOMEE-1466 Apply WS-Security config (cxf interceptor) when use @WebService with javax.xml.ws.Service, thanks Yann Blazart Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/3f1f037e Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/3f1f037e Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/3f1f037e Branch: refs/heads/tomee-1.7.x Commit: 3f1f037e532e2fe32033597391b6f99625359056 Parents: 9a340c0 Author: Romain Manni-Bucau <[email protected]> Authored: Wed Dec 3 12:08:37 2014 +0100 Committer: Romain Manni-Bucau <[email protected]> Committed: Wed Dec 3 12:08:37 2014 +0100 ---------------------------------------------------------------------- .../core/ivm/naming/JaxWsServiceReference.java | 12 +- .../core/webservices/ProviderWrapper.java | 181 ++++++++++--------- .../core/webservices/ProviderWrapperTest.java | 2 +- .../client/WebServiceInjectionConfigurator.java | 13 +- .../server/cxf/WebServiceInjectionTest.java | 74 +++++++- 5 files changed, 178 insertions(+), 104 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/3f1f037e/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/3f1f037e/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 a7ae404..5c172dd 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; @@ -63,9 +64,9 @@ public class ProviderWrapper extends Provider { // Magic to get our provider wrapper installed with the PortRefData // - private static ThreadLocal<ProviderWrapperData> threadPortRefs = new ThreadLocal<ProviderWrapperData>(); + 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; } } @@ -145,12 +150,12 @@ public class ProviderWrapper extends Provider { final List<Element> referenceParameters) { return (W3CEndpointReference) invoke21Delegate(delegate, createW3CEndpointReference, - address, - serviceName, - portName, - metadata, - wsdlDocumentLocation, - referenceParameters); + address, + serviceName, + portName, + metadata, + wsdlDocumentLocation, + referenceParameters); } public EndpointReference readEndpointReference(final Source source) { @@ -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) { @@ -211,32 +233,32 @@ public class ProviderWrapper extends Provider { @SuppressWarnings({"unchecked"}) public <T> Dispatch<T> createDispatch(final QName portName, final Class<T> type, final Service.Mode mode, final WebServiceFeature... features) { return (Dispatch<T>) invoke21Delegate(serviceDelegate, createDispatchInterface, - portName, - type, - mode, - features); + portName, + type, + mode, + features); } @SuppressWarnings({"unchecked"}) public Dispatch<Object> createDispatch(final QName portName, final JAXBContext context, final Service.Mode mode, final WebServiceFeature... features) { return (Dispatch<Object>) invoke21Delegate(serviceDelegate, createDispatchJaxBContext, - portName, - context, - mode, - features); + portName, + context, + mode, + features); } @SuppressWarnings({"unchecked"}) public Dispatch<Object> createDispatch( - final EndpointReference endpointReference, - final JAXBContext context, - final Service.Mode mode, - final WebServiceFeature... features) { + final EndpointReference endpointReference, + final JAXBContext context, + final Service.Mode mode, + final WebServiceFeature... features) { return (Dispatch<Object>) invoke21Delegate(serviceDelegate, createDispatchReferenceJaxB, - endpointReference, - context, - mode, - features); + endpointReference, + context, + mode, + features); } @SuppressWarnings({"unchecked"}) @@ -245,54 +267,42 @@ public class ProviderWrapper extends Provider { final Service.Mode mode, final WebServiceFeature... features) { return (Dispatch<T>) invoke21Delegate(serviceDelegate, createDispatchReferenceClass, - endpointReference, - type, - mode, - features); + endpointReference, + type, + mode, + features); } @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) { @@ -530,12 +539,12 @@ public class ProviderWrapper extends Provider { Method method = null; try { method = Provider.class.getMethod("createW3CEndpointReference", - String.class, - QName.class, - QName.class, - List.class, - String.class, - List.class); + String.class, + QName.class, + QName.class, + List.class, + String.class, + List.class); } catch (final NoSuchMethodException e) { // no-op } @@ -544,9 +553,9 @@ public class ProviderWrapper extends Provider { method = null; try { method = Provider.class.getMethod("getPort", - EndpointReference.class, - Class.class, - WebServiceFeature[].class); + EndpointReference.class, + Class.class, + WebServiceFeature[].class); } catch (final NoSuchMethodException e) { // no-op } @@ -564,10 +573,10 @@ public class ProviderWrapper extends Provider { method = null; try { method = ServiceDelegate.class.getMethod("createDispatch", - EndpointReference.class, - JAXBContext.class, - Service.Mode.class, - WebServiceFeature[].class); + EndpointReference.class, + JAXBContext.class, + Service.Mode.class, + WebServiceFeature[].class); } catch (final NoSuchMethodException e) { // no-op } @@ -576,10 +585,10 @@ public class ProviderWrapper extends Provider { method = null; try { method = ServiceDelegate.class.getMethod("createDispatch", - EndpointReference.class, - Class.class, - Service.Mode.class, - WebServiceFeature[].class); + EndpointReference.class, + Class.class, + Service.Mode.class, + WebServiceFeature[].class); } catch (final NoSuchMethodException e) { // no-op } @@ -588,10 +597,10 @@ public class ProviderWrapper extends Provider { method = null; try { method = ServiceDelegate.class.getMethod("createDispatch", - QName.class, - JAXBContext.class, - Service.Mode.class, - WebServiceFeature[].class); + QName.class, + JAXBContext.class, + Service.Mode.class, + WebServiceFeature[].class); } catch (final NoSuchMethodException e) { // no-op } @@ -600,10 +609,10 @@ public class ProviderWrapper extends Provider { method = null; try { method = ServiceDelegate.class.getMethod("createDispatch", - QName.class, - Class.class, - Service.Mode.class, - WebServiceFeature[].class); + QName.class, + Class.class, + Service.Mode.class, + WebServiceFeature[].class); } catch (final NoSuchMethodException e) { // no-op } @@ -612,9 +621,9 @@ public class ProviderWrapper extends Provider { method = null; try { method = ServiceDelegate.class.getMethod("getPort", - EndpointReference.class, - Class.class, - WebServiceFeature[].class); + EndpointReference.class, + Class.class, + WebServiceFeature[].class); } catch (final NoSuchMethodException e) { // no-op } @@ -623,9 +632,9 @@ public class ProviderWrapper extends Provider { method = null; try { method = ServiceDelegate.class.getMethod("getPort", - QName.class, - Class.class, - WebServiceFeature[].class); + QName.class, + Class.class, + WebServiceFeature[].class); } catch (final NoSuchMethodException e) { // no-op } @@ -634,8 +643,8 @@ public class ProviderWrapper extends Provider { method = null; try { method = ServiceDelegate.class.getMethod("getPort", - Class.class, - WebServiceFeature[].class); + Class.class, + WebServiceFeature[].class); } catch (final NoSuchMethodException e) { // no-op } http://git-wip-us.apache.org/repos/asf/tomee/blob/3f1f037e/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/3f1f037e/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/WebServiceInjectionConfigurator.java ---------------------------------------------------------------------- diff --git a/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/WebServiceInjectionConfigurator.java b/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/WebServiceInjectionConfigurator.java index 7c242ce..422365b 100644 --- a/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/WebServiceInjectionConfigurator.java +++ b/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/WebServiceInjectionConfigurator.java @@ -28,8 +28,6 @@ import org.apache.openejb.config.sys.Openejb; import org.apache.openejb.config.sys.Service; import org.apache.openejb.core.ivm.naming.JaxWsServiceReference; import org.apache.openejb.loader.SystemInstance; -import org.apache.openejb.util.LogCategory; -import org.apache.openejb.util.Logger; import javax.xml.namespace.QName; import javax.xml.ws.WebServiceFeature; @@ -89,15 +87,14 @@ public class WebServiceInjectionConfigurator implements JaxWsServiceReference.We @Override public void customize(final Object o, final Properties properties) { + final Client client; try { - if (!javax.xml.ws.Service.class.isInstance(o)) { - final Client client = ClientProxy.getClient(o); - configure(client, properties); - } + client = ClientProxy.getClient(o); } catch (final Exception e) { - Logger.getInstance(LogCategory.CXF, WebServiceInjectionConfigurator.class.getName()) - .error(e.getMessage(), e); + return; } + + configure(client, properties); } private void configure(final Client client, final Properties properties) { http://git-wip-us.apache.org/repos/asf/tomee/blob/3f1f037e/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); + } + + + } }
