You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ar...@apache.org on 2013/01/18 15:14:58 UTC

svn commit: r1435150 - in /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: component/AbstractOwbBean.java context/creational/CreationalContextImpl.java

Author: arne
Date: Fri Jan 18 14:14:58 2013
New Revision: 1435150

URL: http://svn.apache.org/viewvc?rev=1435150&view=rev
Log:
OWB-755: Fixed disposal of dependent instances

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java?rev=1435150&r1=1435149&r2=1435150&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java Fri Jan 18 14:14:58 2013
@@ -164,6 +164,10 @@ public abstract class AbstractOwbBean<T>
                 injectionTarget.inject(instance, creationalContext);
                 injectionTarget.postConstruct(instance);
             }
+            if (getScope().equals(Dependent.class))
+            {
+                ((CreationalContextImpl<T>)creationalContext).addDependent(null, this, instance);
+            }
             return instance;
         }
         catch (Exception re)

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java?rev=1435150&r1=1435149&r2=1435150&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/creational/CreationalContextImpl.java Fri Jan 18 14:14:58 2013
@@ -50,11 +50,10 @@ public class CreationalContextImpl<T> im
 
     /**
      * Contextual bean dependent instances
-     * key: contextual instance --> value: dependents
      *
      * <p><b>ATTENTION</b> This variable gets initiated lazily!</p>
      */
-    private Map<Object, List<DependentCreationalContext<?>>> dependentObjects = null;
+    private List<DependentCreationalContext<?>> dependentObjects = null;
 
     /**Contextual bean*/
     private Contextual<T> contextual = null;
@@ -126,17 +125,9 @@ public class CreationalContextImpl<T> im
             {
                 if (dependentObjects == null)
                 {
-                    dependentObjects = new HashMap<Object, List<DependentCreationalContext<?>>>();
+                    dependentObjects = new ArrayList<DependentCreationalContext<?>>();
                 }
-
-                List<DependentCreationalContext<?>> dependentList = dependentObjects.get(ownerInstance);
-                if(dependentList == null)
-                {
-                    dependentList = new ArrayList<DependentCreationalContext<?>>();
-                    dependentObjects.put(ownerInstance, dependentList);
-                }
-
-                dependentList.add(dependentCreational);
+                dependentObjects.add(dependentCreational);
             }
         }
     }
@@ -157,35 +148,27 @@ public class CreationalContextImpl<T> im
         {
             if (dependentObjects != null)
             {
-                Collection<List<DependentCreationalContext<?>>> values = dependentObjects.values();
-                if (values != null)
+                // this is kind of an emergency valve...
+                int maxRemoval = dependentObjects.size() * 3;
+                while (!dependentObjects.isEmpty() && maxRemoval > 0)
                 {
-                    for (List<DependentCreationalContext<?>> value : values)
-                    {
-                        // this is kind of an emergency valve...
-                        int maxRemoval = value.size() * 3;
-                        while (!value.isEmpty() && maxRemoval > 0)
-                        {
-                            // we don't use an iterator because the destroyal might register a 
-                            // fresh PreDestroy interceptor as dependent object...
-                            DependentCreationalContext<T> dependent = (DependentCreationalContext<T>) value.get(0);
-                            dependent.getContextual().destroy((T) dependent.getInstance(), this);
-                        
-                            value.remove(0);
-                            maxRemoval--;
-                        }
+                    // we don't use an iterator because the destroyal might register a 
+                    // fresh PreDestroy interceptor as dependent object...
+                    DependentCreationalContext<T> dependent = (DependentCreationalContext<T>) dependentObjects.get(0);
+                    dependent.getContextual().destroy((T) dependent.getInstance(), this);
                     
-                        if (maxRemoval == 0)
-                        {
-                            throw new WebBeansException("infinite loop detected while destroying bean " + contextual);
-                        }
-                    }
+                    dependentObjects.remove(0);
+                    maxRemoval--;
+                }
+                    
+                if (maxRemoval == 0)
+                {
+                    throw new WebBeansException("infinite loop detected while destroying bean " + contextual);
                 }
-
-                dependentObjects = null;
             }
         }
 
+        dependentObjects = null;
     }
     
     /**
@@ -234,7 +217,7 @@ public class CreationalContextImpl<T> im
     throws IOException, ClassNotFoundException
     {
         webBeansContext = WebBeansContext.currentInstance();
-        dependentObjects = (HashMap<Object, List<DependentCreationalContext<?>>>)s.readObject();
+        dependentObjects = (List<DependentCreationalContext<?>>)s.readObject();
 
         String id = (String) s.readObject();
         if (id != null)