Author: rmannibucau
Date: Fri Feb 14 17:54:00 2014
New Revision: 1568402

URL: http://svn.apache.org/r1568402
Log:
TOMEE-1125 @Remove doesnt trigger stateful cleanup

Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?rev=1568402&r1=1568401&r2=1568402&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
 Fri Feb 14 17:54:00 2014
@@ -589,7 +589,7 @@ public class StatefulContainer implement
                         callContext.setCurrentOperation(Operation.REMOVE);
                     }
 
-                    discardInstance(callContext);
+                    discardInstance(primKey, instance);
                 }
 
                 // un register EntityManager
@@ -799,19 +799,24 @@ public class StatefulContainer implement
         }
     }
 
-    private void discardInstance(final ThreadContext threadContext) {
-        final Object primaryKey = threadContext.getPrimaryKey();
+    private void discardInstance(final Object primaryKey, final Instance 
instance) {
         if (primaryKey == null) {
             return;
         }
 
-        final Instance instance = checkedOutInstances.remove(primaryKey);
-        if (instance != null && 
!containsExtendedPersistenceContext(instance.beanContext)) {
-            cache.remove(primaryKey);
+        final Instance i;
+        if (instance == null) {
+            i = checkedOutInstances.remove(primaryKey);
+        } else {
+            checkedOutInstances.remove(primaryKey);
+            i = instance;
         }
 
-        if (null != instance && null != instance.creationalContext) {
-            instance.creationalContext.release();
+        if (!containsExtendedPersistenceContext(instance.beanContext)) {
+            cache.remove(primaryKey);
+        }
+        if (i != null && null != i.creationalContext) {
+            i.creationalContext.release();
         }
     }
 
@@ -829,7 +834,7 @@ public class StatefulContainer implement
 
         final ExceptionType type = 
callContext.getBeanContext().getExceptionType(e);
         if (type == ExceptionType.SYSTEM) {
-            discardInstance(callContext);
+            discardInstance(callContext.getPrimaryKey(), null);
             EjbTransactionUtil.handleSystemException(txPolicy, e, callContext);
         } else {
             EjbTransactionUtil.handleApplicationException(txPolicy, e, type == 
ExceptionType.APPLICATION_ROLLBACK);
@@ -1074,7 +1079,7 @@ public class StatefulContainer implement
                     txPolicy.setRollbackOnly(e);
 
                     // [3] Discard the instance
-                    discardInstance(callContext);
+                    discardInstance(callContext.getPrimaryKey(), instance);
 
                     // [4] throw the java.rmi.RemoteException to the client
                     throw new OpenEJBRuntimeException(message, e);
@@ -1116,7 +1121,7 @@ public class StatefulContainer implement
                     // Transaction is complete so can not be rolled back
 
                     // [3] Discard the instance
-                    discardInstance(callContext);
+                    discardInstance(callContext.getPrimaryKey(), instance);
 
                     // [4] throw throw first exception to the client
                     if (firstException == null)
@@ -1148,7 +1153,7 @@ public class StatefulContainer implement
 
                 interceptorStack.invoke();
             } catch (Throwable callbackException) {
-                discardInstance(threadContext);
+                discardInstance(threadContext.getPrimaryKey(), instance);
                 
EjbTransactionUtil.handleSystemException(threadContext.getTransactionPolicy(), 
callbackException, threadContext);
             } finally {
                 ThreadContext.exit(oldContext);


Reply via email to