Author: rmannibucau Date: Tue Mar 19 11:17:37 2013 New Revision: 1458224 URL: http://svn.apache.org/r1458224 Log: using app classloader instead of class classloader for cxf webservices to be sure to get the right initial context - in embedded mode class classloader is often appclassloader
Modified: tomee/tomee/trunk/server/openejb-axis/src/main/java/org/apache/openejb/server/axis/AxisService.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-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.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/pojo/PojoEndpoint.java tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java tomee/tomee/trunk/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java Modified: tomee/tomee/trunk/server/openejb-axis/src/main/java/org/apache/openejb/server/axis/AxisService.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-axis/src/main/java/org/apache/openejb/server/axis/AxisService.java?rev=1458224&r1=1458223&r2=1458224&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-axis/src/main/java/org/apache/openejb/server/axis/AxisService.java (original) +++ tomee/tomee/trunk/server/openejb-axis/src/main/java/org/apache/openejb/server/axis/AxisService.java Tue Mar 19 11:17:37 2013 @@ -102,7 +102,7 @@ public class AxisService extends WsServi } } - protected HttpListener createPojoWsContainer(URL moduleBaseUrl, PortData port, String serviceId, Class target, Context context, String contextRoot, Map<String, Object> bdgs, ServiceConfiguration serviceInfos) throws Exception { + protected HttpListener createPojoWsContainer(ClassLoader loader, URL moduleBaseUrl, PortData port, String serviceId, Class target, Context context, String contextRoot, Map<String, Object> bdgs, ServiceConfiguration serviceInfos) throws Exception { ClassLoader classLoader = target.getClassLoader(); // todo build JaxRpcServiceInfo in assembler 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=1458224&r1=1458223&r2=1458224&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 Tue Mar 19 11:17:37 2013 @@ -197,9 +197,9 @@ public class CxfRsHttpListener implement } @Override - public void deployPojo(String contextRoot, String fullContext, Class<?> loadedClazz, Application app, Collection<Injection> injections, + public void deployPojo(ClassLoader loader, String contextRoot, String fullContext, Class<?> loadedClazz, Application app, Collection<Injection> injections, Context context, WebBeansContext owbCtx, Collection<Object> additionalProviders, ServiceConfiguration configuration) { - deploy(contextRoot, loadedClazz, fullContext, new OpenEJBPerRequestPojoResourceProvider(loadedClazz, injections, context, owbCtx), + deploy(contextRoot, loadedClazz, fullContext, new OpenEJBPerRequestPojoResourceProvider(loader, loadedClazz, injections, context, owbCtx), null, app, null, additionalProviders, configuration); } @@ -325,7 +325,7 @@ public class CxfRsHttpListener implement 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.setResourceProvider(clazz, new OpenEJBPerRequestPojoResourceProvider(classLoader, clazz, injections, context, owbCtx)); } } Modified: tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java?rev=1458224&r1=1458223&r2=1458224&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java (original) +++ tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java Tue Mar 19 11:17:37 2013 @@ -65,10 +65,10 @@ public class OpenEJBPerRequestPojoResour private BeanCreator creator; private final Collection<Class<?>> contextTypes = new HashSet<Class<?>>(); - public OpenEJBPerRequestPojoResourceProvider(final Class<?> clazz, final Collection<Injection> injectionCollection, final Context initialContext, final WebBeansContext owbCtx) { + public OpenEJBPerRequestPojoResourceProvider(final ClassLoader loader, final Class<?> clazz, final Collection<Injection> injectionCollection, final Context initialContext, final WebBeansContext owbCtx) { injections = injectionCollection; webbeansContext = owbCtx; - classLoader = clazz.getClassLoader(); + classLoader = loader; context = (Context) Proxy.newProxyInstance(classLoader, new Class<?>[]{Context.class}, new InitialContextWrapper(initialContext)); constructor = ResourceUtils.findResourceConstructor(clazz, true); 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=1458224&r1=1458223&r2=1458224&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 Tue Mar 19 11:17:37 2013 @@ -68,7 +68,7 @@ public class CxfService extends WsServic } } - protected HttpListener createPojoWsContainer(URL moduleBaseUrl, PortData port, String serviceId, Class target, Context context, String contextRoot, Map<String, Object> bdgs, ServiceConfiguration services) { + protected HttpListener createPojoWsContainer(ClassLoader loader, URL moduleBaseUrl, PortData port, String serviceId, Class target, Context context, String contextRoot, Map<String, Object> bdgs, ServiceConfiguration services) { Bus bus = CxfUtil.getBus(); final ClassLoader oldLoader = Thread.currentThread().getContextClassLoader(); @@ -76,7 +76,7 @@ public class CxfService extends WsServic try { CxfCatalogUtils.loadOASISCatalog(bus, moduleBaseUrl, "META-INF/jax-ws-catalog.xml"); - PojoWsContainer container = new PojoWsContainer(bus, port, context, target, bdgs, services); + PojoWsContainer container = new PojoWsContainer(loader, bus, port, context, target, bdgs, services); container.start(); wsContainers.put(serviceId, container); return container; Modified: tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoEndpoint.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoEndpoint.java?rev=1458224&r1=1458223&r2=1458224&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoEndpoint.java (original) +++ tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoEndpoint.java Tue Mar 19 11:17:37 2013 @@ -44,7 +44,7 @@ import static org.apache.openejb.Injecti public class PojoEndpoint extends CxfEndpoint { private InjectionProcessor<Object> injectionProcessor; - public PojoEndpoint(Bus bus, PortData port, Context context, Class<?> instance, + public PojoEndpoint(ClassLoader loader, Bus bus, PortData port, Context context, Class<?> instance, HTTPTransportFactory httpTransportFactory, Map<String, Object> bindings, ServiceConfiguration config) { super(bus, port, context, instance, httpTransportFactory, config); @@ -65,7 +65,9 @@ public class PojoEndpoint extends CxfEnd service = serviceFactory.create(); - // instantiate and inject resources into service + // instantiate and inject resources into service using the app classloader to be sure to get the right InitialContext + final ClassLoader old = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(loader); try { injectionProcessor = new InjectionProcessor<Object>(instance, port.getInjections(), null, null, unwrap(context), bindings); injectionProcessor.createInstance(); @@ -74,6 +76,8 @@ public class PojoEndpoint extends CxfEnd injectCxfResources(implementor); } catch (Exception e) { throw new WebServiceException("Service resource injection failed", e); + } finally { + Thread.currentThread().setContextClassLoader(old); } service.setInvoker(new JAXWSMethodInvoker(implementor)); Modified: tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java?rev=1458224&r1=1458223&r2=1458224&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java (original) +++ tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java Tue Mar 19 11:17:37 2013 @@ -29,17 +29,19 @@ public class PojoWsContainer extends Cxf private final Context context; private final Class target; private final Map<String, Object> bindings; + private final ClassLoader loader; - public PojoWsContainer(Bus bus, PortData port, Context context, Class target, + public PojoWsContainer(ClassLoader loader, Bus bus, PortData port, Context context, Class target, Map<String, Object> bdgs, ServiceConfiguration configuration) { super(bus, port, configuration); if (target == null) throw new NullPointerException("target is null"); this.context = context; this.target = target; this.bindings = bdgs; + this.loader = loader; } protected PojoEndpoint createEndpoint() { - return new PojoEndpoint(bus, port, context, target, httpTransportFactory, bindings, serviceConfiguration); + return new PojoEndpoint(loader, bus, port, context, target, httpTransportFactory, bindings, serviceConfiguration); } } Modified: tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java?rev=1458224&r1=1458223&r2=1458224&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java (original) +++ tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java Tue Mar 19 11:17:37 2013 @@ -678,7 +678,7 @@ public abstract class RESTService implem final RsRegistry.AddressInfo address = rsRegistry.createRsHttpListener(web, listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost); services.add(new DeployedService(address.complete, contextRoot, loadedClazz.getName())); - listener.deployPojo(contextRoot, getFullContext(address.base, contextRoot), loadedClazz, app, injections, context, owbCtx, + listener.deployPojo(classLoader, contextRoot, getFullContext(address.base, contextRoot), loadedClazz, app, injections, context, owbCtx, additionalProviders, config); LOGGER.info("REST Service: " + address.complete + " -> Pojo " + loadedClazz.getName()); Modified: tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java?rev=1458224&r1=1458223&r2=1458224&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java (original) +++ tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java Tue Mar 19 11:17:37 2013 @@ -32,8 +32,9 @@ public interface RsHttpListener extends void deploySingleton(String webContext, String fullContext, Object o, Application appInstance, Collection<Object> additionalProviders, ServiceConfiguration serviceInfos); - void deployPojo(String webContext, String fullContext, Class<?> loadedClazz, Application app, Collection<Injection> injections, - Context context, WebBeansContext owbCtx, Collection<Object> additionalProviders, ServiceConfiguration serviceInfos); + void deployPojo(ClassLoader classloader, String webContext, String fullContext, Class<?> loadedClazz, Application app, + Collection<Injection> injections, Context context, WebBeansContext owbCtx, + Collection<Object> additionalProviders, ServiceConfiguration serviceInfos); void deployEJB(String webContext, String fullContext, BeanContext beanContext, Collection<Object> additionalProviders, ServiceConfiguration serviceInfos); 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=1458224&r1=1458223&r2=1458224&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 Tue Mar 19 11:17:37 2013 @@ -207,7 +207,9 @@ public abstract class WsService implemen protected abstract void destroyEjbWsContainer(String deploymentId); - protected abstract HttpListener createPojoWsContainer(URL moduleBaseUrl, PortData port, String serviceId, Class target, Context context, String contextRoot, Map<String, Object> bindings, ServiceConfiguration configuration) throws Exception; + protected abstract HttpListener createPojoWsContainer(ClassLoader loader, URL moduleBaseUrl, PortData port, String serviceId, + Class target, Context context, String contextRoot, + Map<String, Object> bindings, ServiceConfiguration configuration) throws Exception; protected abstract void destroyPojoWsContainer(String serviceId); @@ -370,7 +372,7 @@ public abstract class WsService implemen pojoConfiguration = PojoUtil.findPojoConfig(pojoConfiguration, appInfo, webApp); - final HttpListener container = createPojoWsContainer(moduleBaseUrl, port, portInfo.serviceLink, + final HttpListener container = createPojoWsContainer(classLoader, moduleBaseUrl, port, portInfo.serviceLink, target, context, webApp.contextRoot, bindings, new ServiceConfiguration(PojoUtil.findConfiguration(pojoConfiguration, target.getName()), appInfo.services));