You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2010/02/19 22:55:06 UTC
svn commit: r912000 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/component/
main/java/org/apache/webbeans/container/
main/java/org/apache/webbeans/intercept/
main/java/org/apache/webbeans/proxy/ test/java/org/apache/webbean...
Author: struberg
Date: Fri Feb 19 21:55:05 2010
New Revision: 912000
URL: http://svn.apache.org/viewvc?rev=912000&view=rev
Log:
OWB-288 implement caching for proxies in a 1st version.
This is far from being perfect, but should be better than creating new proxies every time!
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ResourceBean.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/DependingInterceptorTest.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/portable/events/MyExtension.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ResourceBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ResourceBean.java?rev=912000&r1=911999&r2=912000&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ResourceBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ResourceBean.java Fri Feb 19 21:55:05 2010
@@ -52,6 +52,7 @@
X instance = null;
try
{
+ //X TODO cache proxy class!
ProxyFactory proxyFactory = JavassistProxyFactory.createProxyFactory(this);
ResourceInjectionService resourceService = ServiceLoader.getService(ResourceInjectionService.class);
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=912000&r1=911999&r2=912000&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java Fri Feb 19 21:55:05 2010
@@ -25,7 +25,6 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
-import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -118,9 +117,6 @@
/**Injection resolver instance*/
private InjectionResolver injectionResolver = null;
- /**Proxy map for the webbeans components*/
- private Map<Bean<?>, Object> proxyMap = Collections.synchronizedMap(new IdentityHashMap<Bean<?>, Object>());
-
/**XML configurator instance*/
private WebBeansXMLConfigurator xmlConfigurator = null;
@@ -756,23 +752,11 @@
return instance;
}
//Create Managed Bean Proxy
- else
- {
- if (this.proxyMap.containsKey(bean))
- {
- instance = this.proxyMap.get(bean);
- }
- else
- {
- instance = JavassistProxyFactory.createNormalScopedBeanProxy((AbstractOwbBean<?>)bean,creationalContext);
-
- this.proxyMap.put(bean, instance);
-
- //push this proxy instance into creational context
- CreationalContextImpl<Object> temp = (CreationalContextImpl<Object>)creationalContext;
- temp.setProxyInstance(instance);
- }
- }
+ instance = JavassistProxyFactory.createNormalScopedBeanProxy((AbstractOwbBean<?>)bean,creationalContext);
+
+ //push this proxy instance into creational context
+ CreationalContextImpl<Object> temp = (CreationalContextImpl<Object>)creationalContext;
+ temp.setProxyInstance(instance);
}
//Create Pseudo-Scope Bean Instance
else
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java?rev=912000&r1=911999&r2=912000&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java Fri Feb 19 21:55:05 2010
@@ -23,7 +23,7 @@
import javax.enterprise.context.spi.CreationalContext;
-import org.apache.webbeans.component.AbstractOwbBean;
+import org.apache.webbeans.component.OwbBean;
import org.apache.webbeans.context.creational.CreationalContextImpl;
public class DependentScopedBeanInterceptorHandler extends InterceptorHandler
@@ -34,7 +34,7 @@
private CreationalContext<?> creationalContext;
- public DependentScopedBeanInterceptorHandler(AbstractOwbBean<?> bean, Object instance, CreationalContext<?> creationalContext)
+ public DependentScopedBeanInterceptorHandler(OwbBean<?> bean, Object instance, CreationalContext<?> creationalContext)
{
super(bean);
this.actualInstance = instance;
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java?rev=912000&r1=911999&r2=912000&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java Fri Feb 19 21:55:05 2010
@@ -22,9 +22,12 @@
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.ProxyFactory;
+import javassist.util.proxy.ProxyObject;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.BeanManager;
@@ -141,20 +144,25 @@
*/
public abstract class InterceptorHandler implements MethodHandler, Serializable
{
+ private static final long serialVersionUID = 1L;
+
private static final WebBeansLogger logger = WebBeansLogger.getLogger(InterceptorHandler.class);
protected OwbBean<?> bean = null;
- protected InterceptorHandler(AbstractOwbBean<?> bean)
+ // TODO this proxy cache should get moved to JavassistProxyFactory
+ private static Map<OwbBean<?>, Class<?>> interceptorProxyClasses = new ConcurrentHashMap<OwbBean<?>, Class<?>>();
+
+ protected InterceptorHandler(OwbBean<?> bean2)
{
- this.bean = bean;
+ this.bean = bean2;
}
public Object invoke(Object instance, Method method, Method proceed, Object[] arguments, CreationalContextImpl<?> ownerCreationalContext) throws Exception
{
try
{
- if (bean instanceof InjectionTargetBean)
+ if (bean instanceof InjectionTargetBean<?>)
{
InjectionTargetBean<?> injectionTarget = (InjectionTargetBean<?>) this.bean;
@@ -167,10 +175,17 @@
if (injectionTarget.getDecoratorStack().size() > 0)
{
- ProxyFactory delegateFactory = JavassistProxyFactory.createProxyFactory(bean);
+ // TODO move this part into JavassistProxyFactory
+ Class<?> proxyClass = interceptorProxyClasses.get(bean);
+ if (proxyClass == null)
+ {
+ ProxyFactory delegateFactory = JavassistProxyFactory.createProxyFactory(bean);
+ proxyClass = delegateFactory.createClass();
+ interceptorProxyClasses.put(bean, proxyClass);
+ }
+ Object delegate = proxyClass.newInstance();
delegateHandler = new DelegateHandler();
- delegateFactory.setHandler(delegateHandler);
- Object delegate = delegateFactory.createClass().newInstance();
+ ((ProxyObject)delegate).setHandler(delegateHandler);
// Gets component decorator stack
decorators = WebBeansDecoratorConfig.getDecoratorStack(injectionTarget, instance, delegate, ownerCreationalContext);
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java?rev=912000&r1=911999&r2=912000&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java Fri Feb 19 21:55:05 2010
@@ -25,7 +25,7 @@
import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
-import org.apache.webbeans.component.AbstractOwbBean;
+import org.apache.webbeans.component.OwbBean;
import org.apache.webbeans.container.BeanManagerImpl;
import org.apache.webbeans.context.creational.CreationalContextImpl;
@@ -33,15 +33,12 @@
{
private static final long serialVersionUID = -7169354477951284657L;
- // A creationalContext has a very short lifespan. So we can use a ThreadLocal to pass it over
- // if we make sure that it is cleaned up properly!
- private static ThreadLocal<CreationalContext<Object>> creationalContxt = new ThreadLocal<CreationalContext<Object>>();
+ private CreationalContext<?> creationalContext;
- @SuppressWarnings("unchecked")
- public NormalScopedBeanInterceptorHandler(AbstractOwbBean<?> bean, CreationalContext<?> cc)
+ public NormalScopedBeanInterceptorHandler(OwbBean<?> bean, CreationalContext<?> creationalContext)
{
super(bean);
- creationalContxt.set((CreationalContext<Object>) cc);
+ this.creationalContext = creationalContext;
}
@SuppressWarnings("unchecked")
@@ -52,40 +49,11 @@
//Context of the bean
Context webbeansContext = beanManager.getContext(bean.getScope());
- Object webbeansInstance = webbeansContext.get(this.bean);
-
- CreationalContext<Object> cc = null;
-
- if (webbeansInstance == null)
- {
- cc = creationalContxt.get();
-
- if (cc == null)
- {
- // we need to create the CreationalContext ourself and store it
- try
- {
- cc = (CreationalContext<Object>) beanManager.createCreationalContext(bean);
- creationalContxt.set(cc);
- //Get bean instance from context
- webbeansInstance = webbeansContext.get((Contextual<Object>)this.bean, cc);
- }
- finally
- {
- // make sure that we remove the cc from the thread in the handler who created it
- creationalContxt.remove();
- }
- }
- else
- {
- //Get bean instance from context
- webbeansInstance = webbeansContext.get((Contextual<Object>)this.bean, cc);
- }
-
- }
+ //Get bean instance from context
+ Object webbeansInstance = webbeansContext.get((Contextual<Object>)this.bean, (CreationalContext<Object>) creationalContext);
- return super.invoke(webbeansInstance, method, proceed, arguments, (CreationalContextImpl<?>) cc);
+ return super.invoke(webbeansInstance, method, proceed, arguments, (CreationalContextImpl<?>) creationalContext);
}
protected <T> Object callAroundInvokes(Method proceed, Object[] arguments, List<InterceptorData> stack) throws Exception
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java?rev=912000&r1=911999&r2=912000&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java Fri Feb 19 21:55:05 2010
@@ -19,16 +19,19 @@
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import javassist.util.proxy.ProxyFactory;
+import javassist.util.proxy.ProxyObject;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.Decorator;
import org.apache.webbeans.annotation.WebBeansAnnotation;
-import org.apache.webbeans.component.AbstractOwbBean;
+import org.apache.webbeans.component.OwbBean;
import org.apache.webbeans.component.InjectionTargetBean;
import org.apache.webbeans.decorator.WebBeansDecorator;
import org.apache.webbeans.exception.WebBeansException;
@@ -44,20 +47,31 @@
{
}
+
+ private static Map<OwbBean<?>, Class<?>> normalScopedBeanProxyClasses = new ConcurrentHashMap<OwbBean<?>, Class<?>>();
+
+ private static Map<OwbBean<?>, Class<?>> dependentScopedBeanProxyClasses = new ConcurrentHashMap<OwbBean<?>, Class<?>>();
- public static Object createNormalScopedBeanProxy(AbstractOwbBean<?> bean, CreationalContext<?> creationalContext)
+ public static Object createNormalScopedBeanProxy(OwbBean<?> bean, CreationalContext<?> creationalContext)
{
Object result = null;
try
{
- ProxyFactory fact = createProxyFactory(bean);
+ Class<?> proxyClass = normalScopedBeanProxyClasses.get(bean);
+ if (proxyClass == null)
+ {
+ ProxyFactory fact = createProxyFactory(bean);
- if (!(bean instanceof WebBeansDecorator) && !(bean instanceof WebBeansInterceptor))
+ proxyClass = fact.createClass();
+ normalScopedBeanProxyClasses.put(bean, proxyClass);
+ }
+
+ result = proxyClass.newInstance();
+
+ if (!(bean instanceof WebBeansDecorator<?>) && !(bean instanceof WebBeansInterceptor<?>))
{
- fact.setHandler(new NormalScopedBeanInterceptorHandler((AbstractOwbBean<?>) bean, creationalContext));
+ ((ProxyObject)result).setHandler(new NormalScopedBeanInterceptorHandler(bean, creationalContext));
}
-
- result = fact.createClass().newInstance();
}
catch (Exception e)
{
@@ -67,14 +81,14 @@
return result;
}
- public static Object createDependentScopedBeanProxy(AbstractOwbBean<?> bean, Object actualInstance, CreationalContext<?> creastionalContext)
+ public static Object createDependentScopedBeanProxy(OwbBean<?> bean, Object actualInstance, CreationalContext<?> creastionalContext)
{
Object result = null;
List<InterceptorData> interceptors = null;
List<Decorator<?>> decorators = null;
InjectionTargetBean<?> injectionTargetBean = null;
- if(bean instanceof InjectionTargetBean)
+ if(bean instanceof InjectionTargetBean<?>)
{
injectionTargetBean = (InjectionTargetBean<?>)bean;
interceptors = injectionTargetBean.getInterceptorStack();
@@ -97,11 +111,8 @@
{
continue;
}
- else
- {
- notInInterceptorClassAndLifecycle = true;
- break;
- }
+ notInInterceptorClassAndLifecycle = true;
+ break;
}
}
@@ -113,14 +124,20 @@
try
{
- ProxyFactory fact = createProxyFactory(bean);
-
- if (!(bean instanceof WebBeansDecorator) && !(bean instanceof WebBeansInterceptor))
+ Class<?> proxyClass = dependentScopedBeanProxyClasses.get(bean);
+ if (proxyClass == null)
+ {
+ ProxyFactory fact = createProxyFactory(bean);
+ proxyClass = fact.createClass();
+ dependentScopedBeanProxyClasses.put(bean, proxyClass);
+ }
+
+ result = proxyClass.newInstance();
+ if (!(bean instanceof WebBeansDecorator<?>) && !(bean instanceof WebBeansInterceptor<?>))
{
- fact.setHandler(new DependentScopedBeanInterceptorHandler(bean, actualInstance, creastionalContext));
+ ((ProxyObject)result).setHandler(new DependentScopedBeanInterceptorHandler(bean, actualInstance, creastionalContext));
}
- result = fact.createClass().newInstance();
}
catch (Exception e)
{
@@ -138,7 +155,7 @@
Class<?> superClass = null;
for (Type generic : types)
{
- Class<?> type = (Class<?>)ClassUtil.getClazz(generic);
+ Class<?> type = ClassUtil.getClazz(generic);
if (type.isInterface())
{
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/DependingInterceptorTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/DependingInterceptorTest.java?rev=912000&r1=911999&r2=912000&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/DependingInterceptorTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/DependingInterceptorTest.java Fri Feb 19 21:55:05 2010
@@ -92,7 +92,7 @@
Assert.assertEquals(2, TransactionInterceptor.coount);
Assert.assertNotSame(realInstance1, realInstance2);
- Assert.assertSame(realInstance1.getMyService(), realInstance2.getMyService());
+ Assert.assertEquals(realInstance1.getMyService().getJ(), realInstance2.getMyService().getJ());
shutDownContainer();
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/portable/events/MyExtension.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/portable/events/MyExtension.java?rev=912000&r1=911999&r2=912000&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/portable/events/MyExtension.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/portable/events/MyExtension.java Fri Feb 19 21:55:05 2010
@@ -64,7 +64,6 @@
public MyExtension()
{
- reset();
}
public void observeBeforeBeanDiscovery(@Observes BeforeBeanDiscovery beforeBean)