Author: rmannibucau
Date: Wed Mar 13 15:15:55 2013
New Revision: 1455994

URL: http://svn.apache.org/r1455994
Log:
TOMEE-793 use cxf of the container to deploy JavaEE webservices

Added:
    
tomee/tomee/trunk/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfContainerClassLoader.java
Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
    
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
    
tomee/tomee/trunk/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
    
tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java
    
tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/SaajInterceptor.java
    
tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/GlobalFeatureConfigTest.java
    
tomee/tomee/trunk/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1455994&r1=1455993&r2=1455994&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 Wed Mar 13 15:15:55 2013
@@ -1078,9 +1078,13 @@ public class AnnotationDeployer implemen
                 // create webApp and webservices objects if they don't exist 
already
 
                 // add new <servlet/> element
-                Servlet servlet = new Servlet();
+                final Servlet servlet = new Servlet();
                 servlet.setServletName(webServiceClass.getName());
                 servlet.setServletClass(webServiceClass.getName());
+                final ParamValue param = new ParamValue();
+                param.setParamName("openejb-internal");
+                param.setParamValue("true");
+                servlet.getInitParam().add(param);
                 webApp.getServlet().add(servlet);
             }
 

Modified: 
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java?rev=1455994&r1=1455993&r2=1455994&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
 Wed Mar 13 15:15:55 2013
@@ -58,14 +58,22 @@ public class CxfRSService extends RESTSe
 
         final Bus bus = CxfUtil.getBus();
 
-        // force init of bindings
-        if (!CxfUtil.hasService(JAXRSBindingFactory.JAXRS_BINDING_ID)) {
-            // cxf does it but with the pattern "if not here install it". It 
is slow so installing it without testing for presence here.
-            final BindingFactoryManager bfm = 
bus.getExtension(BindingFactoryManager.class);
-            try {
-                
bfm.registerBindingFactory(JAXRSBindingFactory.JAXRS_BINDING_ID, new 
JAXRSBindingFactory(bus));
-            } catch (Throwable b) {
-                // no-op
+        final ClassLoader oldLoader = 
Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
+        try {
+            // force init of bindings
+            if (!CxfUtil.hasService(JAXRSBindingFactory.JAXRS_BINDING_ID)) {
+                // cxf does it but with the pattern "if not here install it". 
It is slow so installing it without testing for presence here.
+                final BindingFactoryManager bfm = 
bus.getExtension(BindingFactoryManager.class);
+                try {
+                    
bfm.registerBindingFactory(JAXRSBindingFactory.JAXRS_BINDING_ID, new 
JAXRSBindingFactory(bus));
+                } catch (Throwable b) {
+                    // no-op
+                }
+            }
+        } finally {
+            if (oldLoader != null) {
+                CxfUtil.clearBusLoader(oldLoader);
             }
         }
     }

Modified: 
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1455994&r1=1455993&r2=1455994&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
 Wed Mar 13 15:15:55 2013
@@ -213,34 +213,42 @@ public class CxfRsHttpListener implement
 
     private void deploy(String contextRoot, Class<?> clazz, String address, 
ResourceProvider rp, Object serviceBean,
                         Application app, Invoker invoker, Collection<Object> 
additionalProviders, ServiceConfiguration configuration) {
-        final JAXRSServerFactoryBean factory = newFactory(address);
-        configureFactory(additionalProviders, configuration, factory);
-        factory.setResourceClasses(clazz);
-        context = contextRoot;
-        if (context == null) {
-            context = "";
-        }
-        if (!context.startsWith("/")) {
-            context = "/" + context;
-        }
+        final ClassLoader oldLoader = 
Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
+        try {
+            final JAXRSServerFactoryBean factory = newFactory(address);
+            configureFactory(additionalProviders, configuration, factory);
+            factory.setResourceClasses(clazz);
+            context = contextRoot;
+            if (context == null) {
+                context = "";
+            }
+            if (!context.startsWith("/")) {
+                context = "/" + context;
+            }
 
-        if (rp != null) {
-            factory.setResourceProvider(rp);
-        }
-        if (app != null) {
-            factory.setApplication(app);
-        }
-        if (invoker != null) {
-            factory.setInvoker(invoker);
-        }
-        if (serviceBean != null) {
-            factory.setServiceBean(serviceBean);
-        } else {
-            factory.setServiceClass(clazz);
-        }
+            if (rp != null) {
+                factory.setResourceProvider(rp);
+            }
+            if (app != null) {
+                factory.setApplication(app);
+            }
+            if (invoker != null) {
+                factory.setInvoker(invoker);
+            }
+            if (serviceBean != null) {
+                factory.setServiceBean(serviceBean);
+            } else {
+                factory.setServiceClass(clazz);
+            }
 
-        server = factory.create();
-        destination = (AbstractHTTPDestination) server.getDestination();
+            server = factory.create();
+            destination = (AbstractHTTPDestination) server.getDestination();
+        } finally {
+            if (oldLoader != null) {
+                CxfUtil.clearBusLoader(oldLoader);
+            }
+        }
     }
 
     private Collection<Object> providers(final Collection<ServiceInfo> 
services, final Collection<Object> additionalProviders) {
@@ -266,6 +274,8 @@ public class CxfRsHttpListener implement
     }
 
     public void undeploy() {
+        final ClassLoader oldLoader = 
Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
         try {
             server.stop();
         } catch (final RuntimeException ise) {
@@ -273,6 +283,10 @@ public class CxfRsHttpListener implement
             if (LOGGER.isDebugEnabled()) {
                 LOGGER.debug(ise.getMessage(), ise);
             }
+        } finally {
+            if (oldLoader != null) {
+                CxfUtil.clearBusLoader(oldLoader);
+            }
         }
     }
 
@@ -282,57 +296,70 @@ public class CxfRsHttpListener implement
                                   final Map<String, EJBRestServiceInfo> 
restEjbs, final ClassLoader classLoader,
                                   final Collection<Injection> injections, 
final Context context, final WebBeansContext owbCtx,
                                   final ServiceConfiguration 
serviceConfiguration) {
-        final JAXRSServerFactoryBean factory = newFactory(prefix);
-        configureFactory(additionalProviders, serviceConfiguration, factory);
-        factory.setApplication(application);
-
-        final List<Class<?>> classes = new ArrayList<Class<?>>();
-
-        for (Class<?> clazz : application.getClasses()) {
-            if (!additionalProviders.contains(clazz) && !clazz.isInterface()) {
-                classes.add(clazz);
+        final ClassLoader oldLoader = 
Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
+        try {
+            final JAXRSServerFactoryBean factory = newFactory(prefix);
+            configureFactory(additionalProviders, serviceConfiguration, 
factory);
+            factory.setApplication(application);
+
+            final List<Class<?>> classes = new ArrayList<Class<?>>();
+
+            for (Class<?> clazz : application.getClasses()) {
+                if (!additionalProviders.contains(clazz) && 
!clazz.isInterface()) {
+                    classes.add(clazz);
+                }
             }
-        }
 
-        for (Object o : application.getSingletons()) {
-            if (!additionalProviders.contains(o)) {
-                final Class<?> clazz = o.getClass();
-                classes.add(clazz);
+            for (Object o : application.getSingletons()) {
+                if (!additionalProviders.contains(o)) {
+                    final Class<?> clazz = o.getClass();
+                    classes.add(clazz);
+                }
             }
-        }
 
-        for (Class<?> clazz : classes) {
-            final String name = clazz.getName();
-            if (restEjbs.containsKey(name)) {
-                final BeanContext bc = restEjbs.get(name).context;
-                final Object proxy = ProxyEJB.subclassProxy(bc);
-                factory.setResourceProvider(clazz, new 
NoopResourceProvider(bc.getBeanClass(), proxy));
-            } else {
-                factory.setResourceProvider(clazz, new 
OpenEJBPerRequestPojoResourceProvider(clazz, injections, context, owbCtx));
+            for (Class<?> clazz : classes) {
+                final String name = clazz.getName();
+                if (restEjbs.containsKey(name)) {
+                    final BeanContext bc = restEjbs.get(name).context;
+                    final Object proxy = ProxyEJB.subclassProxy(bc);
+                    factory.setResourceProvider(clazz, new 
NoopResourceProvider(bc.getBeanClass(), proxy));
+                } else {
+                    factory.setResourceProvider(clazz, new 
OpenEJBPerRequestPojoResourceProvider(clazz, injections, context, owbCtx));
+                }
             }
-        }
 
-        factory.setResourceClasses(classes);
-        factory.setInvoker(new AutoJAXRSInvoker(restEjbs));
+            factory.setResourceClasses(classes);
+            factory.setInvoker(new AutoJAXRSInvoker(restEjbs));
 
-        server = factory.create();
-        this.context = webContext;
-        if (!webContext.startsWith("/")) {
-            this.context = "/" + webContext;
-        }
-        destination = (AbstractHTTPDestination) server.getDestination();
+            server = factory.create();
+            this.context = webContext;
+            if (!webContext.startsWith("/")) {
+                this.context = "/" + webContext;
+            }
+            destination = (AbstractHTTPDestination) server.getDestination();
+
+            final String base;
+            if (prefix.endsWith("/")) {
+                base = prefix.substring(0, prefix.length() - 1);
+            } else if (prefix.endsWith(wildcard)) {
+                base = prefix.substring(0, prefix.length() - 
wildcard.length());
+            } else {
+                base = prefix;
+            }
 
-        final String base;
-        if (prefix.endsWith("/")) {
-            base = prefix.substring(0, prefix.length() - 1);
-        } else if (prefix.endsWith(wildcard)) {
-            base = prefix.substring(0, prefix.length() - wildcard.length());
-        } else {
-            base = prefix;
+            // stack info to log to get nice logs
+            logEndpoints(application, prefix, restEjbs, factory, base);
+        } finally {
+            if (oldLoader != null) {
+                CxfUtil.clearBusLoader(oldLoader);
+            }
         }
+    }
 
-        // stack info to log to get nice logs
-
+    private void logEndpoints(final Application application, final String 
prefix,
+                              final Map<String, EJBRestServiceInfo> restEjbs,
+                              final JAXRSServerFactoryBean factory, final 
String base) {
         final List<Logs.LogResourceEndpointInfo> resourcesToLog = new 
ArrayList<Logs.LogResourceEndpointInfo>();
         int classSize = 0;
         int addressSize = 0;

Added: 
tomee/tomee/trunk/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfContainerClassLoader.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfContainerClassLoader.java?rev=1455994&view=auto
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfContainerClassLoader.java
 (added)
+++ 
tomee/tomee/trunk/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfContainerClassLoader.java
 Wed Mar 13 15:15:55 2013
@@ -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.openejb.server.cxf.transport.util;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+
+public class CxfContainerClassLoader extends ClassLoader {
+    private static final ClassLoader CONTAINER_LOADER = 
CxfUtil.class.getClassLoader();
+    public static final String CXF_PACKAGE = "org.apache.cxf.";
+
+    private final ThreadLocal<ClassLoader> tccl = new 
ThreadLocal<ClassLoader>();
+
+    public CxfContainerClassLoader() {
+        super(CONTAINER_LOADER);
+    }
+
+    public void tccl(final ClassLoader loader) {
+        if (loader != this) { // otherwise it will end up with infinite loops
+            tccl.set(loader);
+        }
+    }
+
+    public void clear() {
+        tccl.remove();
+    }
+
+    private ClassLoader tccl() {
+        final ClassLoader current = tccl.get();
+        if (current != null) {
+            return current;
+        }
+        return CONTAINER_LOADER;
+    }
+
+    @Override
+    protected Class<?> findClass(final String name) throws 
ClassNotFoundException {
+        if (name.startsWith(CXF_PACKAGE)) {
+            Throwable th;
+            try {
+                return CONTAINER_LOADER.loadClass(name);
+            } catch (final Exception e) {
+                th = e;
+            } catch (final Error err) {
+                th = err;
+            }
+
+            // some additional cxf classes can be provided by apps
+            try {
+                return tccl().loadClass(name);
+            } catch (final Exception e) {
+                // no-op: try tccl
+            } catch (final Error err) {
+                // no-op: try tccl
+            }
+
+            // if we are here we were not able to load the class from the 
container
+            // so throw the first exception
+            if (Error.class.isInstance(th)) {
+                throw Error.class.cast(th);
+            }
+            if (ClassNotFoundException.class.isInstance(th)) {
+                throw ClassNotFoundException.class.cast(th);
+            }
+            throw new ClassNotFoundException(th.getMessage(), th);
+        }
+
+        return tccl().loadClass(name);
+    }
+
+    @Override
+    protected Class<?> loadClass(final String name, final boolean resolve) 
throws ClassNotFoundException {
+        final Class<?> clazz = findClass(name);
+        if (resolve) {
+            resolveClass(clazz);
+        }
+        return clazz;
+    }
+
+    @Override
+    protected URL findResource(final String name) {
+        return tccl().getResource(name);
+    }
+
+    @Override
+    protected Enumeration<URL> findResources(final String name) throws 
IOException {
+        return tccl().getResources(name);
+    }
+}

Modified: 
tomee/tomee/trunk/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java?rev=1455994&r1=1455993&r2=1455994&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
 Wed Mar 13 15:15:55 2013
@@ -20,6 +20,7 @@ import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.binding.BindingFactory;
 import org.apache.cxf.binding.BindingFactoryManager;
+import org.apache.cxf.bus.CXFBusFactory;
 import org.apache.cxf.bus.CXFBusImpl;
 import org.apache.cxf.bus.extension.ExtensionManagerBus;
 import org.apache.cxf.bus.managers.BindingFactoryManagerImpl;
@@ -59,34 +60,25 @@ public final class CxfUtil {
 
     private static volatile boolean usingBindingFactoryMap = false;
     private static final Map<String, BindingFactory> bindingFactoryMap = new 
ConcurrentHashMap<String, BindingFactory>(8, 0.75f, 4);
+    private static final Bus DEFAULT_BUS = initDefaultBus(); // has to be 
initializd after bindingFactoryMap
 
     private CxfUtil() {
         // no-op
     }
 
-    /*
-     * Ensure the bus created is unqiue and non-shared.
-     * The very first bus created is set as a default bus which then can
-     * be (re)used in other places.
-     */
-    public static Bus getBus() {
-        getDefaultBus();
-        return new ExtensionManagerBus();
+    public static boolean hasService(final String name) {
+        return usingBindingFactoryMap && bindingFactoryMap.containsKey(name);
     }
 
-    /*
-     * Ensure the Spring bus is initialized with the CXF module classloader
-     * instead of the application classloader.
-     */
-    public static Bus getDefaultBus() {
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+    private static Bus initDefaultBus() {
+        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
         
Thread.currentThread().setContextClassLoader(CxfUtil.class.getClassLoader());
-        try {
-            final Bus bus = BusFactory.getDefaultBus();
+        try { // create the bus reusing cxf logic but skipping factory lookup
+            final Bus bus = 
BusFactory.newInstance(CXFBusFactory.class.getName()).createBus();
             final BindingFactoryManager bfm = 
bus.getExtension(BindingFactoryManager.class);
 
-            if (bfm instanceof BindingFactoryManagerImpl) {
-                ((BindingFactoryManagerImpl) bfm).setMapProvider(new 
MapProvider<String, BindingFactory>() {
+            if (BindingFactoryManagerImpl.class.isInstance(bfm) && 
!usingBindingFactoryMap) {
+                BindingFactoryManagerImpl.class.cast(bfm).setMapProvider(new 
MapProvider<String, BindingFactory>() {
                     @Override
                     public Map<String, BindingFactory> createMap() {
                         usingBindingFactoryMap = true;
@@ -101,8 +93,33 @@ public final class CxfUtil {
         }
     }
 
-    public static boolean hasService(final String name) {
-        return usingBindingFactoryMap && bindingFactoryMap.containsKey(name);
+    public static Bus getBus() {
+        return DEFAULT_BUS;
+    }
+
+    @Deprecated // no more useful since we create it once
+    public static Bus getDefaultBus() {
+        return getBus();
+    }
+
+    public static ClassLoader initBusLoader() {
+        final ClassLoader loader = 
CxfUtil.getBus().getExtension(ClassLoader.class);
+        if (loader != null) {
+            if (CxfContainerClassLoader.class.isInstance(loader)) {
+                
CxfContainerClassLoader.class.cast(loader).tccl(Thread.currentThread().getContextClassLoader());
+            }
+            return loader;
+        }
+        return Thread.currentThread().getContextClassLoader();
+    }
+
+    public static void clearBusLoader(final ClassLoader old) {
+        final ClassLoader loader = 
CxfUtil.getBus().getExtension(ClassLoader.class);
+        if (loader != null && CxfContainerClassLoader.class.isInstance(loader)
+                && (old == null || 
!CxfContainerClassLoader.class.isInstance(old))) {
+            CxfContainerClassLoader.class.cast(loader).clear();
+        }
+        Thread.currentThread().setContextClassLoader(old);
     }
 
     public static void configureEndpoint(final AbstractEndpointFactory 
svrFactory, final ServiceConfiguration configuration, final String prefix) {
@@ -199,7 +216,11 @@ public final class CxfUtil {
             return;
         }
 
-        final Bus bus = getDefaultBus();
+        final Bus bus = getBus();
+
+        // ensure cxf classes are loaded from container to avoid conflicts 
with app
+        bus.setExtension(new CxfContainerClassLoader(), ClassLoader.class);
+
         if (bus instanceof CXFBusImpl) {
             final ServiceConfiguration configuration = new 
ServiceConfiguration(SystemInstance.get().getProperties(),
                     
SystemInstance.get().getComponent(OpenEjbConfiguration.class).facilities.services);

Modified: 
tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java?rev=1455994&r1=1455993&r2=1455994&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java
 Wed Mar 13 15:15:55 2013
@@ -39,10 +39,6 @@ public class CxfService extends WsServic
 
     private final Map<String, CxfWsContainer> wsContainers = new 
TreeMap<String, CxfWsContainer>();
 
-    public CxfService() {
-        SaajInterceptor.registerInterceptors();
-    }
-
     public String getName() {
         return "cxf";
     }
@@ -50,41 +46,67 @@ public class CxfService extends WsServic
     public void init(final Properties props) throws java.lang.Exception {
         super.init(props);
         CxfUtil.configureBus();
+        SaajInterceptor.registerInterceptors();
     }
 
     protected HttpListener createEjbWsContainer(URL moduleBaseUrl, PortData 
port, BeanContext beanContext, ServiceConfiguration config) {
-        Bus bus = CxfUtil.getBus();
-
-        CxfCatalogUtils.loadOASISCatalog(bus, moduleBaseUrl, 
"META-INF/jax-ws-catalog.xml");
+        final Bus bus = CxfUtil.getBus();
 
-        EjbWsContainer container = new EjbWsContainer(bus, port, beanContext, 
config);
-        container.start();
-        wsContainers.put(beanContext.getDeploymentID().toString(), container);
-        return container;
-    }
-
-    protected void destroyEjbWsContainer(String deploymentId) {
-        CxfWsContainer container = wsContainers.remove(deploymentId);
-        if (container != null) {
-            container.destroy();
+        final ClassLoader oldLoader = 
Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
+        try {
+            CxfCatalogUtils.loadOASISCatalog(bus, moduleBaseUrl, 
"META-INF/jax-ws-catalog.xml");
+
+            final EjbWsContainer container = new EjbWsContainer(bus, port, 
beanContext, config);
+            container.start();
+            wsContainers.put(beanContext.getDeploymentID().toString(), 
container);
+            return container;
+        } finally {
+            if (oldLoader != null) {
+                CxfUtil.clearBusLoader(oldLoader);
+            }
         }
     }
 
     protected HttpListener createPojoWsContainer(URL moduleBaseUrl, PortData 
port, String serviceId, Class target, Context context, String contextRoot, 
Map<String, Object> bdgs, ServiceConfiguration services) {
         Bus bus = CxfUtil.getBus();
 
-        CxfCatalogUtils.loadOASISCatalog(bus, moduleBaseUrl, 
"META-INF/jax-ws-catalog.xml");
+        final ClassLoader oldLoader = 
Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
+        try {
+            CxfCatalogUtils.loadOASISCatalog(bus, moduleBaseUrl, 
"META-INF/jax-ws-catalog.xml");
+
+            PojoWsContainer container = new PojoWsContainer(bus, port, 
context, target, bdgs, services);
+            container.start();
+            wsContainers.put(serviceId, container);
+            return container;
+        } finally {
+            if (oldLoader != null) {
+                CxfUtil.clearBusLoader(oldLoader);
+            }
+        }
+    }
+
+    protected void destroyPojoWsContainer(final String serviceId) {
+        destroyWsContainer(serviceId);
+    }
 
-        PojoWsContainer container = new PojoWsContainer(bus, port, context, 
target, bdgs, services);
-        container.start();
-        wsContainers.put(serviceId, container);
-        return container;
+    protected void destroyEjbWsContainer(final String deploymentId) {
+        destroyWsContainer(deploymentId);
     }
 
-    protected void destroyPojoWsContainer(String serviceId) {
+    protected void destroyWsContainer(final String serviceId) {
         CxfWsContainer container = wsContainers.remove(serviceId);
         if (container != null) {
-            container.destroy();
+            final ClassLoader oldLoader = 
Thread.currentThread().getContextClassLoader();
+            
Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
+            try {
+                container.destroy();
+            } finally {
+                if (oldLoader != null) {
+                    CxfUtil.clearBusLoader(oldLoader);
+                }
+            }
         }
     }
 }

Modified: 
tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/SaajInterceptor.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/SaajInterceptor.java?rev=1455994&r1=1455993&r2=1455994&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/SaajInterceptor.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/client/SaajInterceptor.java
 Wed Mar 13 15:15:55 2013
@@ -21,6 +21,7 @@ import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.openejb.server.cxf.transport.util.CxfUtil;
 import org.apache.openejb.server.webservices.saaj.SaajUniverse;
 
 public abstract class SaajInterceptor extends 
AbstractPhaseInterceptor<Message> {
@@ -34,11 +35,19 @@ public abstract class SaajInterceptor ex
     
     public static synchronized void registerInterceptors() {
         if (!interceptorsRegistered) {
-            Bus bus = BusFactory.getDefaultBus();
-            SaajUniverse universe = new SaajUniverse();
-            bus.getOutInterceptors().add(new SaajOutInterceptor(universe));
-            bus.getInInterceptors().add(new SaajInInterceptor(universe));
-            bus.getInInterceptors().add(new SaajInFaultInterceptor(universe));
+            final Bus bus = CxfUtil.getBus();
+            final ClassLoader oldLoader = 
Thread.currentThread().getContextClassLoader();
+            
Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
+            try {
+                SaajUniverse universe = new SaajUniverse();
+                bus.getOutInterceptors().add(new SaajOutInterceptor(universe));
+                bus.getInInterceptors().add(new SaajInInterceptor(universe));
+                bus.getInInterceptors().add(new 
SaajInFaultInterceptor(universe));
+            } finally {
+                if (oldLoader != null) {
+                    CxfUtil.clearBusLoader(oldLoader);
+                }
+            }
             interceptorsRegistered = true;
         }
     }

Modified: 
tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/GlobalFeatureConfigTest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/GlobalFeatureConfigTest.java?rev=1455994&r1=1455993&r2=1455994&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/GlobalFeatureConfigTest.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/GlobalFeatureConfigTest.java
 Wed Mar 13 15:15:55 2013
@@ -54,7 +54,7 @@ public class GlobalFeatureConfigTest {
 
     @Test
     public void run() {
-        final Bus bus = CxfUtil.getDefaultBus();
+        final Bus bus = CxfUtil.getBus();
         assertEquals(1, bus.getFeatures().size());
         assertThat(bus.getFeatures().iterator().next(), 
instanceOf(LoggingFeature.class));
     }

Modified: 
tomee/tomee/trunk/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java?rev=1455994&r1=1455993&r2=1455994&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
 Wed Mar 13 15:15:55 2013
@@ -24,6 +24,7 @@ import org.apache.openejb.assembler.clas
 import org.apache.openejb.assembler.classic.EjbJarInfo;
 import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
 import org.apache.openejb.assembler.classic.IdPropertiesInfo;
+import org.apache.openejb.assembler.classic.ParamValueInfo;
 import org.apache.openejb.assembler.classic.PortInfo;
 import org.apache.openejb.assembler.classic.ServletInfo;
 import org.apache.openejb.assembler.classic.SingletonBeanInfo;

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java?rev=1455994&r1=1455993&r2=1455994&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 Wed Mar 13 15:15:55 2013
@@ -18,6 +18,7 @@ package org.apache.tomee.catalina;
 
 import org.apache.catalina.Container;
 import org.apache.catalina.Context;
+import org.apache.catalina.Wrapper;
 import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.core.StandardWrapper;
 import org.apache.catalina.deploy.ContextResource;
@@ -33,7 +34,9 @@ import org.apache.openejb.OpenEJBRuntime
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.ClassListInfo;
 import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
+import org.apache.openejb.assembler.classic.ParamValueInfo;
 import org.apache.openejb.assembler.classic.ResourceInfo;
+import org.apache.openejb.assembler.classic.ServletInfo;
 import org.apache.openejb.assembler.classic.WebAppBuilder;
 import org.apache.openejb.assembler.classic.WebAppInfo;
 import org.apache.openejb.config.ConfigurationFactory;
@@ -91,9 +94,47 @@ public class OpenEJBContextConfig extend
     public void configureStart() {
         super.configureStart();
         adjustDataSourceNameIfNecessary(); // doing it here to potentially 
factorize resource id resolution
+        addAddedJAXWsServices();
         cleanUpRestServlets();
     }
 
+    private void addAddedJAXWsServices() {
+        final WebAppInfo webAppInfo = info.get();
+        final AppInfo appInfo = info.app();
+        if (webAppInfo == null || appInfo == null || 
"false".equalsIgnoreCase(appInfo.properties.getProperty("openejb.jaxws.add-missing-servlets",
 "true"))) {
+            return;
+        }
+
+        try { // if no jaxws classes are here don't try anything
+            
OpenEJBContextConfig.class.getClassLoader().loadClass("org.apache.openejb.server.webservices.WsServlet");
+        } catch (final ClassNotFoundException e) {
+            return;
+        } catch (final NoClassDefFoundError e) {
+            return;
+        }
+
+        for (final ServletInfo servlet : webAppInfo.servlets) {
+            if (!servlet.mappings.iterator().hasNext()) { // no need to do 
anything
+                continue;
+            }
+
+            for (final ParamValueInfo pv : servlet.initParams) {
+                if ("openejb-internal".equals(pv.name) && 
"true".equals(pv.value)) {
+                    if (context.findChild(servlet.servletName) == null) {
+                        final Wrapper wrapper = context.createWrapper();
+                        wrapper.setName(servlet.servletName);
+                        
wrapper.setServletClass("org.apache.openejb.server.webservices.WsServlet");
+
+                        // add servlet to context
+                        context.addChild(wrapper);
+                        
context.addServletMapping(servlet.mappings.iterator().next(), 
wrapper.getName());
+                    }
+                    break;
+                }
+            }
+        }
+    }
+
     private void cleanUpRestServlets() {
         final WebAppInfo webAppInfo = info.get();
         final AppInfo appInfo = info.app();


Reply via email to