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 2011/10/03 18:58:53 UTC

svn commit: r1178455 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core: managed/ mdb/ singleton/ stateful/ stateless/

Author: rmannibucau
Date: Mon Oct  3 16:58:53 2011
New Revision: 1178455

URL: http://svn.apache.org/viewvc?rev=1178455&view=rev
Log:
trying to release cdi dependent beans from ejb instances (see creationcontext.release())

Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/Instance.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/Instance.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/Instance.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/Instance.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/Instance.java?rev=1178455&r1=1178454&r2=1178455&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/Instance.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/Instance.java Mon Oct  3 16:58:53 2011
@@ -25,6 +25,7 @@ import org.apache.openejb.util.Duration;
 import org.apache.openejb.util.Index;
 import org.apache.openejb.util.PojoSerialization;
 
+import javax.enterprise.context.spi.CreationalContext;
 import javax.persistence.EntityManagerFactory;
 import javax.transaction.Transaction;
 import java.io.ObjectStreamException;
@@ -40,6 +41,7 @@ public class Instance implements Seriali
     public final BeanContext beanContext;
     public final Object primaryKey;
     public final Object bean;
+    public final CreationalContext creationalContext;
     public final Map<String, Object> interceptors;
 
     private boolean inUse;
@@ -53,16 +55,17 @@ public class Instance implements Seriali
     private Map<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> entityManagers;
     private final JtaEntityManagerRegistry.EntityManagerTracker[] entityManagerArray;
 
-    public Instance(BeanContext beanContext, Object primaryKey, Object bean, Map<String, Object> interceptors, Map<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> entityManagers) {
+    public Instance(BeanContext beanContext, Object primaryKey, Object bean, Map<String, Object> interceptors, CreationalContext creationalContext, Map<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> entityManagers) {
         this.beanContext = beanContext;
         this.primaryKey = primaryKey;
         this.bean = bean;
         this.interceptors = interceptors;
+        this.creationalContext = creationalContext;
         this.entityManagers = entityManagers;
         this.entityManagerArray = null;
     }
 
-    public Instance(Object deploymentId, Object primaryKey, Object bean, Map<String, Object> interceptors, JtaEntityManagerRegistry.EntityManagerTracker[] entityManagerArray) {
+    public Instance(Object deploymentId, Object primaryKey, Object bean, Map<String, Object> interceptors, CreationalContext creationalContext, JtaEntityManagerRegistry.EntityManagerTracker[] entityManagerArray) {
         this.beanContext = SystemInstance.get().getComponent(ContainerSystem.class).getBeanContext(deploymentId);
         if (beanContext == null) {
             throw new IllegalArgumentException("Unknown deployment " + deploymentId);
@@ -70,6 +73,7 @@ public class Instance implements Seriali
         this.primaryKey = primaryKey;
         this.bean = bean;
         this.interceptors = interceptors;
+        this.creationalContext = creationalContext;
         this.entityManagerArray = entityManagerArray;
     }
 
@@ -147,12 +151,14 @@ public class Instance implements Seriali
         public final Object primaryKey;
         public final Object bean;
         public final Map<String, Object> interceptors;
+        public final CreationalContext creationalContext;
         public final JtaEntityManagerRegistry.EntityManagerTracker[] entityManagerArray;
 
         public Serialization(Instance i) {
             deploymentId = i.beanContext.getDeploymentID();
             primaryKey = i.primaryKey;
             bean = toSerializable(i.bean);
+            creationalContext = i.creationalContext;
 
             interceptors = new HashMap<String, Object>(i.interceptors.size());
             for (Map.Entry<String, Object> e : i.interceptors.entrySet()) {
@@ -185,7 +191,7 @@ public class Instance implements Seriali
             // Anything wrapped with PojoSerialization will have been automatically
             // unwrapped via it's own readResolve so passing in the raw bean
             // and interceptors variables is totally fine.
-            return new Instance(deploymentId, primaryKey, bean, interceptors, entityManagerArray);
+            return new Instance(deploymentId, primaryKey, bean, interceptors, creationalContext, entityManagerArray);
         }
     }
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java?rev=1178455&r1=1178454&r2=1178455&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java Mon Oct  3 16:58:53 2011
@@ -330,6 +330,8 @@ public class ManagedContainer implements
             default:
                 return businessMethod(beanContext, primKey, callInterface, callMethod, args, type);
         }
+
+
     }
 
     protected ProxyInfo createEJBObject(BeanContext beanContext, Method callMethod, Object[] args, InterfaceType interfaceType) throws OpenEJBException {
@@ -369,7 +371,7 @@ public class ManagedContainer implements
                     final InstanceContext context = beanContext.newInstance();
 
                     // Wrap-up everthing into a object
-                    instance = new Instance(beanContext, primaryKey, context.getBean(), context.getInterceptors(), entityManagers);
+                    instance = new Instance(beanContext, primaryKey, context.getBean(), context.getInterceptors(), context.getCreationalContext(), entityManagers);
 
                 } catch (Throwable throwable) {
                     ThreadContext callContext = ThreadContext.getThreadContext();
@@ -691,8 +693,11 @@ public class ManagedContainer implements
             return;
         }
 
-        checkedOutInstances.remove(primaryKey);
+        Instance instance = checkedOutInstances.remove(primaryKey);
         cache.remove(primaryKey);
+        if (instance.creationalContext != null) {
+            instance.creationalContext.release();
+        }
     }
 
     private void checkAuthorization(Method callMethod, InterfaceType interfaceType) throws ApplicationException {

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/Instance.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/Instance.java?rev=1178455&r1=1178454&r2=1178455&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/Instance.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/Instance.java Mon Oct  3 16:58:53 2011
@@ -16,6 +16,7 @@
  */
 package org.apache.openejb.core.mdb;
 
+import javax.enterprise.context.spi.CreationalContext;
 import java.util.Map;
 
 /**
@@ -24,9 +25,11 @@ import java.util.Map;
 public class Instance {
     public final Object bean;
     public final Map<String,Object> interceptors;
+    public final CreationalContext creationalContext;
 
-    public Instance(Object bean, Map<String, Object> interceptors) {
+    public Instance(Object bean, Map<String, Object> interceptors, CreationalContext creationalContext) {
         this.bean = bean;
         this.interceptors = interceptors;
+        this.creationalContext = creationalContext;
     }
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java?rev=1178455&r1=1178454&r2=1178455&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java Mon Oct  3 16:58:53 2011
@@ -169,6 +169,9 @@ public class MdbInstanceFactory {
             List<InterceptorData> callbackInterceptors = beanContext.getCallbackInterceptors();
             InterceptorStack interceptorStack = new InterceptorStack(instance.bean, remove, Operation.PRE_DESTROY, callbackInterceptors, instance.interceptors);
             interceptorStack.invoke();
+            if (instance.creationalContext != null) {
+                instance.creationalContext.release();
+            }
         } catch (Throwable re) {
             MdbInstanceFactory.logger.error("The bean instance " + instance.bean + " threw a system exception:" + re, re);
         } finally {
@@ -209,7 +212,7 @@ public class MdbInstanceFactory {
                 ejbCreate.invoke();
             }
 
-            return new Instance(context.getBean(), context.getInterceptors());
+            return new Instance(context.getBean(), context.getInterceptors(), context.getCreationalContext());
         } catch (Throwable e) {
             if (e instanceof java.lang.reflect.InvocationTargetException) {
                 e = ((java.lang.reflect.InvocationTargetException) e).getTargetException();

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/Instance.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/Instance.java?rev=1178455&r1=1178454&r2=1178455&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/Instance.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/Instance.java Mon Oct  3 16:58:53 2011
@@ -16,6 +16,7 @@
  */
 package org.apache.openejb.core.singleton;
 
+import javax.enterprise.context.spi.CreationalContext;
 import java.util.Map;
 import java.util.concurrent.locks.ReadWriteLock;
 
@@ -26,10 +27,12 @@ public class Instance {
     public final Object bean;
     public final Map<String,Object> interceptors;
     public final ReadWriteLock lock;
+    public final CreationalContext creationalContext;
 
-    public Instance(Object bean, Map<String, Object> interceptors, ReadWriteLock lock) {
+    public Instance(Object bean, Map<String, Object> interceptors, CreationalContext creationalContext, ReadWriteLock lock) {
         this.bean = bean;
         this.interceptors = interceptors;
         this.lock = lock;
+        this.creationalContext = creationalContext;
     }
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java?rev=1178455&r1=1178454&r2=1178455&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java Mon Oct  3 16:58:53 2011
@@ -196,7 +196,7 @@ public class SingletonInstanceManager {
                 lock = new ReentrantReadWriteLock();
             }
 
-            return new Instance(context.getBean(), context.getInterceptors(), lock);
+            return new Instance(context.getBean(), context.getInterceptors(), context.getCreationalContext(), lock);
         } catch (Throwable e) {
             if (e instanceof java.lang.reflect.InvocationTargetException) {
                 e = ((java.lang.reflect.InvocationTargetException) e).getTargetException();
@@ -256,6 +256,9 @@ public class SingletonInstanceManager {
             try{
                 //Call the chain
                 interceptorStack.invoke();
+                if (instance.creationalContext != null) {
+                    instance.creationalContext.release();
+                }
             } catch(Throwable e) {
                 //RollBack Transaction
                 EjbTransactionUtil.handleSystemException(transactionPolicy, e, callContext);

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java?rev=1178455&r1=1178454&r2=1178455&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java Mon Oct  3 16:58:53 2011
@@ -25,6 +25,7 @@ import org.apache.openejb.util.Duration;
 import org.apache.openejb.util.Index;
 import org.apache.openejb.util.PojoSerialization;
 
+import javax.enterprise.context.spi.CreationalContext;
 import javax.persistence.EntityManagerFactory;
 import javax.transaction.Transaction;
 import java.io.ObjectStreamException;
@@ -40,6 +41,7 @@ public class Instance implements Seriali
     public final BeanContext beanContext;
     public final Object primaryKey;
     public final Object bean;
+    public CreationalContext creationalContext;
     public final Map<String, Object> interceptors;
 
     private boolean inUse;
@@ -53,22 +55,24 @@ public class Instance implements Seriali
     private Map<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> entityManagers;
     private final JtaEntityManagerRegistry.EntityManagerTracker[] entityManagerArray;
 
-    public Instance(BeanContext beanContext, Object primaryKey, Object bean, Map<String, Object> interceptors, Map<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> entityManagers) {
+    public Instance(BeanContext beanContext, Object primaryKey, Object bean, CreationalContext creationalContext, Map<String, Object> interceptors, Map<EntityManagerFactory, JtaEntityManagerRegistry.EntityManagerTracker> entityManagers) {
         this.beanContext = beanContext;
         this.primaryKey = primaryKey;
         this.bean = bean;
         this.interceptors = interceptors;
+        this.creationalContext = creationalContext;
         this.entityManagers = entityManagers;
         this.entityManagerArray = null;
     }
 
-    public Instance(Object deploymentId, Object primaryKey, Object bean, Map<String, Object> interceptors, JtaEntityManagerRegistry.EntityManagerTracker[] entityManagerArray) {
+    public Instance(Object deploymentId, Object primaryKey, Object bean, CreationalContext creationalContext, Map<String, Object> interceptors, JtaEntityManagerRegistry.EntityManagerTracker[] entityManagerArray) {
         this.beanContext = SystemInstance.get().getComponent(ContainerSystem.class).getBeanContext(deploymentId);
         if (beanContext == null) {
             throw new IllegalArgumentException("Unknown deployment " + deploymentId);
         }
         this.primaryKey = primaryKey;
         this.bean = bean;
+        this.creationalContext = creationalContext;
         this.interceptors = interceptors;
         this.entityManagerArray = entityManagerArray;
     }
@@ -146,6 +150,7 @@ public class Instance implements Seriali
         public final Object deploymentId;
         public final Object primaryKey;
         public final Object bean;
+        public final CreationalContext creationalContext;
         public final Map<String, Object> interceptors;
         public final JtaEntityManagerRegistry.EntityManagerTracker[] entityManagerArray;
 
@@ -153,6 +158,7 @@ public class Instance implements Seriali
             deploymentId = i.beanContext.getDeploymentID();
             primaryKey = i.primaryKey;
             bean = toSerializable(i.bean);
+            creationalContext = i.creationalContext;
 
             interceptors = new HashMap<String, Object>(i.interceptors.size());
             for (Map.Entry<String, Object> e : i.interceptors.entrySet()) {
@@ -185,7 +191,7 @@ public class Instance implements Seriali
             // Anything wrapped with PojoSerialization will have been automatically
             // unwrapped via it's own readResolve so passing in the raw bean
             // and interceptors variables is totally fine.
-            return new Instance(deploymentId, primaryKey, bean, interceptors, entityManagerArray);
+            return new Instance(deploymentId, primaryKey, bean, creationalContext, interceptors, entityManagerArray);
         }
     }
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?rev=1178455&r1=1178454&r2=1178455&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java Mon Oct  3 16:58:53 2011
@@ -386,7 +386,7 @@ public class StatefulContainer implement
                     final InstanceContext context = beanContext.newInstance();
 
                     // Wrap-up everthing into a object
-                    instance = new Instance(beanContext, primaryKey, context.getBean(), context.getInterceptors(), entityManagers);
+                    instance = new Instance(beanContext, primaryKey, context.getBean(),  context.getCreationalContext(), context.getInterceptors(), entityManagers);
 
                 } catch (Throwable throwable) {
                     ThreadContext callContext = ThreadContext.getThreadContext();
@@ -770,8 +770,11 @@ public class StatefulContainer implement
             return;
         }
 
-        checkedOutInstances.remove(primaryKey);
+        Instance instance = checkedOutInstances.remove(primaryKey);
         cache.remove(primaryKey);
+        if (instance.creationalContext != null) {
+            instance.creationalContext.release();
+        }
     }
 
     private void checkAuthorization(Method callMethod, InterfaceType interfaceType) throws ApplicationException {

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java?rev=1178455&r1=1178454&r2=1178455&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/Instance.java Mon Oct  3 16:58:53 2011
@@ -18,6 +18,7 @@ package org.apache.openejb.core.stateles
 
 import org.apache.openejb.util.Pool;
 
+import javax.enterprise.context.spi.CreationalContext;
 import java.util.Map;
 
 /**
@@ -26,12 +27,14 @@ import java.util.Map;
 public class Instance {
     public final Object bean;
     public final Map<String, Object> interceptors;
+    public CreationalContext creationalContext;
 
     private Pool<Instance>.Entry poolEntry;
 
-    public Instance(Object bean, Map<String, Object> interceptors) {
+    public Instance(Object bean, Map<String, Object> interceptors, CreationalContext creationalContext) {
         this.bean = bean;
         this.interceptors = interceptors;
+        this.creationalContext = creationalContext;
     }
 
     public Pool<Instance>.Entry getPoolEntry() {

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java?rev=1178455&r1=1178454&r2=1178455&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java Mon Oct  3 16:58:53 2011
@@ -190,7 +190,7 @@ public class StatelessInstanceManager {
                 }
             }
 
-            return new Instance(context.getBean(), context.getInterceptors());
+            return new Instance(context.getBean(), context.getInterceptors(), context.getCreationalContext());
         } catch (Throwable e) {
             if (e instanceof InvocationTargetException) {
                 e = ((InvocationTargetException) e).getTargetException();
@@ -261,6 +261,10 @@ public class StatelessInstanceManager {
             InterceptorStack interceptorStack = new InterceptorStack(instance.bean, remove, Operation.PRE_DESTROY, callbackInterceptors, instance.interceptors);
 
             interceptorStack.invoke();
+
+            if (instance.creationalContext != null) {
+                instance.creationalContext.release();
+            }
         } catch (Throwable re) {
             logger.error("The bean instance " + instance + " threw a system exception:" + re, re);
         }