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/04/12 16:52:42 UTC

svn commit: r933259 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/intercept/ test/java/org/apache/webbeans/newtests/injection/circular/beans/ test/java/org/apache/webbeans/newtests/injection/circular/tests/

Author: struberg
Date: Mon Apr 12 14:52:42 2010
New Revision: 933259

URL: http://svn.apache.org/viewvc?rev=933259&view=rev
Log:
OWB-351 for NormalScoped bean proxies, we need to create a new CreationalContext per Context

If we don't find a already used CreationalContext in the Context, we always create a new one.
NormalScoped beans must not use the CreationalContext of the beans they get injected into.

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.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/NormalScopedBeanInterceptorHandler.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/circular/beans/CircularDependenScopeBean.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/circular/tests/CircularInjectionTest.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java?rev=933259&r1=933258&r2=933259&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java Mon Apr 12 14:52:42 2010
@@ -21,6 +21,7 @@ package org.apache.webbeans.intercept;
 import javax.enterprise.context.spi.CreationalContext;
 
 import org.apache.webbeans.component.OwbBean;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
 
 
 /**
@@ -42,7 +43,7 @@ public class ApplicationScopedBeanIntere
     /**
      * Creates a new handler.
      * @param bean bean
-     * @param creationalContext creaitonal context
+     * @param creationalContext creational context
      */
     public ApplicationScopedBeanIntereptorHandler(OwbBean<?> bean, CreationalContext<?> creationalContext)
     {
@@ -52,11 +53,11 @@ public class ApplicationScopedBeanIntere
     /**
      * {@inheritDoc}
      */
-    protected Object getContextualInstance(OwbBean<Object> bean)
+    protected Object getContextualInstance(OwbBean<Object> bean, CreationalContextImpl<?> creationalContext)
     {
         if (cachedInstance == null) 
         {
-            cachedInstance = super.getContextualInstance(bean);
+            cachedInstance = super.getContextualInstance(bean, creationalContext);
         }
         
         return cachedInstance;

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=933259&r1=933258&r2=933259&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 Mon Apr 12 14:52:42 2010
@@ -67,10 +67,12 @@ public class DependentScopedBeanIntercep
     /**
      * {@inheritDoc}
      */
-    protected Object callAroundInvokes(Method proceed, Object[] arguments, List<InterceptorData> stack) throws Exception
+    protected Object callAroundInvokes(Method proceed, Object[] arguments, List<InterceptorData> stack,
+                                       CreationalContextImpl<?> cc)
+    throws Exception
     {
         InvocationContextImpl impl = new InvocationContextImpl(this.bean, this.actualInstance ,proceed, arguments, stack, InterceptorType.AROUND_INVOKE);
-        impl.setCreationalContext(creationalContext);
+        impl.setCreationalContext(cc);
         
         return impl.proceed();
     }

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=933259&r1=933258&r2=933259&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 Mon Apr 12 14:52:42 2010
@@ -42,9 +42,6 @@ public class NormalScopedBeanInterceptor
     /**Serial id*/
     private static final long serialVersionUID = 1L;
     
-    /**Creational context*/
-    private transient CreationalContext<?> creationalContext;
-
     /**
      * Creates a new bean instance
      * @param bean bean 
@@ -53,7 +50,6 @@ public class NormalScopedBeanInterceptor
     public NormalScopedBeanInterceptorHandler(OwbBean<?> bean, CreationalContext<?> creationalContext)
     {
         super(bean);
-        this.creationalContext = creationalContext;
     }
     
     /**
@@ -62,19 +58,36 @@ public class NormalScopedBeanInterceptor
     @Override
     public Object invoke(Object instance, Method method, Method proceed, Object[] arguments) throws Exception
     {
+        CreationalContextImpl<?> creationalContext = null;
+        
+        //Context of the bean
+        Context webbeansContext = getBeanManager().getContext(bean.getScope());
+
+        if (webbeansContext instanceof AbstractContext)
+        {
+            creationalContext = (CreationalContextImpl<?>) ((AbstractContext)webbeansContext).getCreationalContext(bean);
+        }
+        if (creationalContext == null)
+        {
+            // if there was no CreationalContext set from external, we create a new one
+            creationalContext = (CreationalContextImpl<?>) CreationalContextFactory.getInstance().getCreationalContext(bean);
+        }
+        
         //Get instance from context
-        Object webbeansInstance = getContextualInstance((OwbBean<Object>) this.bean);
+        Object webbeansInstance = getContextualInstance((OwbBean<Object>) this.bean, creationalContext);
         
         //Call super
-        return super.invoke(webbeansInstance, method, proceed, arguments, (CreationalContextImpl<?>) this.creationalContext);
+        return super.invoke(webbeansInstance, method, proceed, arguments, creationalContext);
     }
         
     /**
      * {@inheritDoc}
      */
-    protected Object callAroundInvokes(Method proceed, Object[] arguments, List<InterceptorData> stack) throws Exception
+    protected Object callAroundInvokes(Method proceed, Object[] arguments, List<InterceptorData> stack, CreationalContextImpl<?> creationalContext)
+    throws Exception
     {
-        InvocationContextImpl impl = new InvocationContextImpl(this.bean, getContextualInstance((OwbBean<Object>) this.bean),
+        InvocationContextImpl impl = new InvocationContextImpl(this.bean, 
+                                                               getContextualInstance((OwbBean<Object>) this.bean, creationalContext),
                                                                proceed, arguments, stack, InterceptorType.AROUND_INVOKE);
         impl.setCreationalContext(creationalContext);
 
@@ -86,9 +99,10 @@ public class NormalScopedBeanInterceptor
     /**
      * Gets instance from context.
      * @param bean bean instance
+     * @param creationalContext
      * @return the underlying contextual instance, either cached or resolved from the context 
      */
-    protected Object getContextualInstance(OwbBean<Object> bean)
+    protected Object getContextualInstance(OwbBean<Object> bean, CreationalContextImpl<?> creationalContext)
     {
         Object webbeansInstance = null;
         
@@ -103,20 +117,6 @@ public class NormalScopedBeanInterceptor
             return webbeansInstance;
         }
         
-        if (webbeansContext instanceof AbstractContext)
-        {
-            CreationalContext<?> cc = ((AbstractContext)webbeansContext).getCreationalContext(bean);
-            if (cc != null)
-            {
-                creationalContext = cc;
-            }
-        }
-        if (creationalContext == null)
-        {
-            // if there was no CreationalContext set from external, we create a new one
-            creationalContext = CreationalContextFactory.getInstance().getCreationalContext(bean);
-        }
-        
         // finally, we create a new contextual instance
         webbeansInstance = webbeansContext.get((Contextual<Object>)this.bean, (CreationalContext<Object>) creationalContext);
         

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/circular/beans/CircularDependenScopeBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/circular/beans/CircularDependenScopeBean.java?rev=933259&r1=933258&r2=933259&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/circular/beans/CircularDependenScopeBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/circular/beans/CircularDependenScopeBean.java Mon Apr 12 14:52:42 2010
@@ -45,7 +45,9 @@ public class CircularDependenScopeBean i
     @PostConstruct
     public void postConstruct()
     {
-        app.hello();
+        // removed! This is not allowed in JSR-299 according to mbg because it causes a 
+        // cyclic reference in the creation of the beans! 
+        // app.hello();
         success = true;
     }
 }

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/circular/tests/CircularInjectionTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/circular/tests/CircularInjectionTest.java?rev=933259&r1=933258&r2=933259&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/circular/tests/CircularInjectionTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/injection/circular/tests/CircularInjectionTest.java Mon Apr 12 14:52:42 2010
@@ -50,12 +50,12 @@ public class CircularInjectionTest exten
         beanClasses.add(CircularDependenScopeBean.class);
         beanClasses.add(CircularApplicationScopedBean.class);
         
-        startContainer(beanClasses, beanXmls);        
+        startContainer(beanClasses, beanXmls);
         
         Set<Bean<?>> beans = getBeanManager().getBeans("org.apache.webbeans.newtests.injection.circular.beans.CircularApplicationScopedBean");
-        Assert.assertNotNull(beans);        
+        Assert.assertNotNull(beans);
         
-        Bean<CircularApplicationScopedBean> dependentBean = (Bean<CircularApplicationScopedBean>)beans.iterator().next();        
+        Bean<CircularApplicationScopedBean> dependentBean = (Bean<CircularApplicationScopedBean>)beans.iterator().next();
         CreationalContext<CircularApplicationScopedBean> ctx = getBeanManager().createCreationalContext(dependentBean);
         
         Object reference = getBeanManager().getReference(dependentBean, CircularApplicationScopedBean.class, ctx);
@@ -81,10 +81,10 @@ public class CircularInjectionTest exten
         beanClasses.add(CircularDependenScopeBean.class);
         beanClasses.add(CircularApplicationScopedBean.class);
         
-        startContainer(beanClasses, beanXmls);        
+        startContainer(beanClasses, beanXmls);
         
         Set<Bean<?>> beans = getBeanManager().getBeans("org.apache.webbeans.newtests.injection.circular.beans.CircularDependenScopeBean");
-        Assert.assertNotNull(beans);        
+        Assert.assertNotNull(beans);
         
         Bean<CircularDependenScopeBean> dependentBean = (Bean<CircularDependenScopeBean>)beans.iterator().next();        
         CreationalContext<CircularDependenScopeBean> ctx = getBeanManager().createCreationalContext(dependentBean);