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/03/02 17:30:22 UTC

svn commit: r1573328 - /tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java

Author: rmannibucau
Date: Sun Mar  2 16:30:22 2014
New Revision: 1573328

URL: http://svn.apache.org/r1573328
Log:
optimizing normal scoped cdi bean in cxf-rs module (there are proxies so we can cache them brutally)

Modified:
    tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java

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=1573328&r1=1573327&r2=1573328&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 Sun Mar  2 16:30:22 2014
@@ -29,7 +29,6 @@ import org.apache.webbeans.container.Bea
 import org.apache.webbeans.inject.OWBInjector;
 import org.apache.webbeans.intercept.InterceptorResolutionService;
 import org.apache.webbeans.portable.InjectionTargetImpl;
-import org.apache.webbeans.util.WebBeansUtil;
 
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.InjectionException;
@@ -61,9 +60,10 @@ public class OpenEJBPerRequestPojoResour
     protected final Method preDestroyMethod;
     protected final ClassLoader classLoader;
 
-    private BeanCreator creator;
     private final Collection<Class<?>> contextTypes = new HashSet<Class<?>>();
-    private Object instance = null;
+    private final BeanManagerImpl bm;
+    private final Bean<?> bean;
+    private final BeanCreator normalScopeCreator;
 
     public OpenEJBPerRequestPojoResourceProvider(final ClassLoader loader, final Class<?> clazz, final Collection<Injection> injectionCollection, final Context initialContext, final WebBeansContext owbCtx) {
         injections = injectionCollection;
@@ -78,8 +78,7 @@ public class OpenEJBPerRequestPojoResour
         postConstructMethod = ResourceUtils.findPostConstructMethod(clazz);
         preDestroyMethod = ResourceUtils.findPreDestroyMethod(clazz);
 
-        final Bean<?> bean;
-        final BeanManagerImpl bm = webbeansContext.getBeanManagerImpl();
+        bm = webbeansContext.getBeanManagerImpl();
         if (bm.isInUse()) {
             try {
                 final Set<Bean<?>> beans = bm.getBeans(clazz);
@@ -113,23 +112,32 @@ public class OpenEJBPerRequestPojoResour
                     Contexts.findContextFields(decorator.getBeanClass(), contextTypes);
                 }
             }
+            if (bean != null && bm.isNormalScope(bean.getScope())) {
+                // singleton is faster
+                normalScopeCreator = new ProvidedInstanceBeanCreator(bm.getReference(bean, bean.getBeanClass(), bm.createCreationalContext(bean)));
+            } else {
+                normalScopeCreator = null;
+            }
         } else {
             bean = null;
+            normalScopeCreator = null;
         }
 
         Contexts.findContextFields(clazz, contextTypes); // for the class itself
-        if (bean != null) {
-            creator = new CdiBeanCreator(bm, bean);
-        } else { // do it manually
-            creator = null;
-        }
     }
 
     @Override
     public Object getInstance(final Message m) {
         Contexts.bind(m.getExchange(), contextTypes);
 
-        if (creator == null) {
+        BeanCreator creator;
+        if (bean != null) {
+            if (normalScopeCreator != null) {
+                creator = normalScopeCreator;
+            } else {
+                creator = new PseudoScopedCdiBeanCreator();
+            }
+        } else {
             creator = new DefaultBeanCreator(m);
         }
         m.put(BeanCreator.class, creator);
@@ -138,11 +146,11 @@ public class OpenEJBPerRequestPojoResour
         final ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
         Thread.currentThread().setContextClassLoader(classLoader);
         try {
-            instance = creator.create();
-            return instance;
+            return creator.create();
         } catch (final NoBeanFoundException nbfe) {
             creator = new DefaultBeanCreator(m);
-            return instance = creator.create();
+            m.put(BeanCreator.class, creator);
+            return creator.create();
         } finally {
             Thread.currentThread().setContextClassLoader(oldLoader);
         }
@@ -214,27 +222,17 @@ public class OpenEJBPerRequestPojoResour
         void release();
     }
 
-    private class CdiBeanCreator implements BeanCreator {
-        private final BeanManager bm;
-        private final Bean<?> bean;
-        private CreationalContext<?> toClean;
-
-        public CdiBeanCreator(final BeanManager bm, final Bean<?> bean) {
-            this.bm = bm;
-            this.bean = bean;
+    private class ProvidedInstanceBeanCreator implements BeanCreator {
+        private final Object instance;
+
+        private ProvidedInstanceBeanCreator(final Object instance) {
+            this.instance = instance;
         }
 
         @Override
         public Object create() {
             try {
-                toClean = bm.createCreationalContext(bean);
-                try {
-                    return bm.getReference(bean, bean.getBeanClass(), toClean);
-                } finally {
-                    if (!WebBeansUtil.isDependent(bean)) {
-                        toClean = null; // will be released by the container
-                    }
-                }
+                return instance;
             } catch (final InjectionException ie) {
                 final String msg = "Resource class " + constructor.getDeclaringClass().getName() + " can not be instantiated";
                 throw new WebApplicationException(Response.serverError().entity(msg).build());
@@ -243,15 +241,29 @@ public class OpenEJBPerRequestPojoResour
 
         @Override
         public void release() {
-            if (toClean != null) {
-                synchronized (this) {
-                    if (toClean != null) {
-                        toClean.release();
-                        toClean = null;
-                    }
-                }
+            // no-op
+        }
+    }
+
+    private class PseudoScopedCdiBeanCreator implements BeanCreator {
+        private CreationalContext<?> toClean = null;
+
+        @Override
+        public Object create() {
+            try {
+                toClean = bm.createCreationalContext(bean);
+                return bm.getReference(bean, bean.getBeanClass(), toClean);
+            } catch (final InjectionException ie) {
+                final String msg = "Resource class " + constructor.getDeclaringClass().getName() + " can not be instantiated";
+                throw new WebApplicationException(Response.serverError().entity(msg).build());
             }
         }
+
+        @Override
+        public void release() {
+            toClean.release();
+            toClean = null;
+        }
     }
 
     private class DefaultBeanCreator implements BeanCreator {