You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/10/07 14:54:46 UTC

svn commit: r1629880 - /tomee/tomee/branches/tomee-1.7.x/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java

Author: rmannibucau
Date: Tue Oct  7 12:54:45 2014
New Revision: 1629880

URL: http://svn.apache.org/r1629880
Log:
TOMEE-1386 skipping wink providers to not conflict with CXF + backporting provider CDI support for Application (default) deployment mode and deprecated EJB one (not for singleton and pojo)

Modified:
    tomee/tomee/branches/tomee-1.7.x/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java

Modified: tomee/tomee/branches/tomee-1.7.x/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
URL: http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1629880&r1=1629879&r2=1629880&view=diff
==============================================================================
--- tomee/tomee/branches/tomee-1.7.x/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java (original)
+++ tomee/tomee/branches/tomee-1.7.x/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java Tue Oct  7 12:54:45 2014
@@ -64,7 +64,11 @@ import org.apache.openejb.util.LogCatego
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.proxy.ProxyEJB;
 import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.container.BeanManagerImpl;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
 
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.Bean;
 import javax.management.ObjectName;
 import javax.management.openmbean.TabularData;
 import javax.naming.Context;
@@ -86,6 +90,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -119,6 +124,7 @@ public class CxfRsHttpListener implement
     private String servlet = "";
     private final Collection<Pattern> staticResourcesList = new CopyOnWriteArrayList<Pattern>();
     private final List<ObjectName> jmxNames = new ArrayList<ObjectName>();
+    private final Collection<CreationalContext<?>> toRelease = new LinkedHashSet<CreationalContext<?>>();
 
     private static final char[] URL_SEP = new char[] { '?', '#', ';' };
 
@@ -275,7 +281,8 @@ public class CxfRsHttpListener implement
     @Override
     public void deploySingleton(final String contextRoot, final String fullContext, final Object o, final Application appInstance,
                                 final Collection<Object> additionalProviders, final ServiceConfiguration configuration) {
-        deploy(contextRoot, o.getClass(), fullContext, new SingletonResourceProvider(o), o, appInstance, null, additionalProviders, configuration);
+        deploy(contextRoot, o.getClass(), fullContext, new SingletonResourceProvider(o),
+                o, appInstance, null, additionalProviders, configuration, null);
     }
 
     @Deprecated
@@ -291,7 +298,7 @@ public class CxfRsHttpListener implement
                            final Collection<Object> additionalProviders,
                            final ServiceConfiguration configuration) {
         deploy(contextRoot, loadedClazz, fullContext, new OpenEJBPerRequestPojoResourceProvider(loader, loadedClazz, injections, context, owbCtx),
-            null, app, null, additionalProviders, configuration);
+            null, app, null, additionalProviders, configuration, null);
     }
 
     @Deprecated
@@ -303,16 +310,18 @@ public class CxfRsHttpListener implement
                           final ServiceConfiguration configuration) {
         final Object proxy = ProxyEJB.subclassProxy(beanContext);
 
-        deploy(contextRoot, beanContext.getBeanClass(), fullContext, new NoopResourceProvider(beanContext.getBeanClass(), proxy), proxy, null, new OpenEJBEJBInvoker(Collections.singleton(beanContext)), additionalProviders, configuration);
+        deploy(contextRoot, beanContext.getBeanClass(), fullContext, new NoopResourceProvider(beanContext.getBeanClass(), proxy),
+                proxy, null, new OpenEJBEJBInvoker(Collections.singleton(beanContext)), additionalProviders, configuration, beanContext.getWebBeansContext());
     }
 
     private void deploy(final String contextRoot, final Class<?> clazz, final String address, final ResourceProvider rp, final Object serviceBean,
-                        final Application app, final Invoker invoker, final Collection<Object> additionalProviders, final ServiceConfiguration configuration) {
+                        final Application app, final Invoker invoker, final Collection<Object> additionalProviders, final ServiceConfiguration configuration,
+                        final WebBeansContext webBeansContext) {
         final ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
         Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
         try {
             final JAXRSServerFactoryBean factory = newFactory(address);
-            configureFactory(additionalProviders, configuration, factory);
+            configureFactory(additionalProviders, configuration, factory, webBeansContext);
             factory.setResourceClasses(clazz);
             context = contextRoot;
             if (context == null) {
@@ -346,30 +355,47 @@ public class CxfRsHttpListener implement
         }
     }
 
-    private Collection<Object> providers(final Collection<ServiceInfo> services, final Collection<Object> additionalProviders) {
+    private Collection<Object> providers(final Collection<ServiceInfo> services, final Collection<Object> additionalProviders, final WebBeansContext ctx) {
         final Collection<Object> instances = new ArrayList<Object>();
+        final BeanManagerImpl bm = ctx == null ? null : ctx.getBeanManagerImpl();
         for (final Object o : additionalProviders) {
             if (o instanceof Class<?>) {
                 final Class<?> clazz = (Class<?>) o;
-                if ("false".equalsIgnoreCase(SystemInstance.get().getProperty(clazz.getName() + ".activated", "true"))) {
+                final String name = clazz.getName();
+                if (shouldSkipProvider(name)) {
                     continue;
                 }
 
-                final Collection<Object> instance = ServiceInfos.resolve(services, new String[]{clazz.getName()}, ProviderFactory.INSTANCE);
+                if (bm != null && bm.isInUse()) {
+                    try {
+                        final Set<Bean<?>> beans = bm.getBeans(clazz);
+                        if (beans != null && !beans.isEmpty()) {
+                            final Bean<?> bean = bm.resolve(beans);
+                            final CreationalContextImpl<?> creationalContext = bm.createCreationalContext(bean);
+                            instances.add(bm.getReference(bean, clazz, creationalContext));
+                            toRelease.add(creationalContext);
+                            continue;
+                        }
+                    } catch (final Throwable th) {
+                        LOGGER.info("Can't use CDI to create provider " + name);
+                    }
+                }
+
+                final Collection<Object> instance = ServiceInfos.resolve(services, new String[]{name}, ProviderFactory.INSTANCE);
                 if (instance != null && !instance.isEmpty()) {
                     instances.add(instance.iterator().next());
                 } else {
                     try {
                         instances.add(newProvider(clazz));
                     } catch (final Exception e) {
-                        LOGGER.error("can't instantiate " + clazz.getName(), e);
+                        LOGGER.error("can't instantiate " + name, e);
                     }
                 }
             } else {
-                if ("false".equalsIgnoreCase(SystemInstance.get().getProperty(o.getClass().getName() + ".activated", "true"))) {
+                final String name = o.getClass().getName();
+                if (shouldSkipProvider(name)) {
                     continue;
                 }
-
                 instances.add(o);
             }
         }
@@ -377,6 +403,11 @@ public class CxfRsHttpListener implement
         return instances;
     }
 
+    private static boolean shouldSkipProvider(final String name) {
+        return "false".equalsIgnoreCase(SystemInstance.get().getProperty(name + ".activated", "true"))
+                || name.startsWith("org.apache.wink.common.internal.");
+    }
+
     private static void addMandatoryProviders(final Collection<Object> instances) {
         instances.add(EJBAccessExceptionMapper.INSTANCE);
     }
@@ -392,6 +423,14 @@ public class CxfRsHttpListener implement
             LocalMBeanServer.unregisterSilently(objectName);
         }
 
+        for (final CreationalContext<?> cc : toRelease) {
+            try {
+                cc.release();
+            } catch (final Exception e) {
+                LOGGER.warning(e.getMessage(), e);
+            }
+        }
+
         final ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
         Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
         try {
@@ -418,7 +457,7 @@ public class CxfRsHttpListener implement
         Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
         try {
             final JAXRSServerFactoryBean factory = newFactory(prefix);
-            configureFactory(additionalProviders, serviceConfiguration, factory);
+            configureFactory(additionalProviders, serviceConfiguration, factory, owbCtx);
             factory.setApplication(application);
 
             final List<Class<?>> classes = new ArrayList<Class<?>>();
@@ -603,7 +642,10 @@ public class CxfRsHttpListener implement
         return factory;
     }
 
-    private void configureFactory(final Collection<Object> givenAdditionalProviders, final ServiceConfiguration serviceConfiguration, final JAXRSServerFactoryBean factory) {
+    private void configureFactory(final Collection<Object> givenAdditionalProviders,
+                                  final ServiceConfiguration serviceConfiguration,
+                                  final JAXRSServerFactoryBean factory,
+                                  final WebBeansContext ctx) {
         CxfUtil.configureEndpoint(factory, serviceConfiguration, CXF_JAXRS_PREFIX);
 
         final Collection<ServiceInfo> services = serviceConfiguration.getAvailableServices();
@@ -670,13 +712,13 @@ public class CxfRsHttpListener implement
         if (providersConfig != null) {
             providers = ServiceInfos.resolve(services, providersConfig.toArray(new String[providersConfig.size()]), ProviderFactory.INSTANCE);
             if (providers != null && additionalProviders != null && !additionalProviders.isEmpty()) {
-                providers.addAll(providers(services, additionalProviders));
+                providers.addAll(providers(services, additionalProviders, ctx));
             }
         }
         if (providers == null) {
             providers = new ArrayList<Object>(4);
             if (additionalProviders != null && !additionalProviders.isEmpty()) {
-                providers.addAll(providers(services, additionalProviders));
+                providers.addAll(providers(services, additionalProviders, ctx));
             } else {
                 providers.addAll(defaultProviders());
             }