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 {