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();