You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2009/01/03 04:55:07 UTC

svn commit: r730902 - in /openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb: ./ config/ core/ core/stateful/

Author: dblevins
Date: Fri Jan  2 19:55:06 2009
New Revision: 730902

URL: http://svn.apache.org/viewvc?rev=730902&view=rev
Log:
OPENEJB-982: SessionSynchronization regression

Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentFactory.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java?rev=730902&r1=730901&r2=730902&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/DeploymentInfo.java Fri Jan  2 19:55:06 2009
@@ -146,4 +146,6 @@
     public boolean isLoadOnStartup();
 
     public Set<String> getDependsOn();
+
+    public boolean isSessionSynchronized();
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentFactory.java?rev=730902&r1=730901&r2=730902&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentFactory.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentFactory.java Fri Jan  2 19:55:06 2009
@@ -33,7 +33,7 @@
     }
 
     public String getProductVersion() {
-        return "3.0";
+        return "3.1.1";
     }
 
     public boolean handlesURI(String uri) {

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java?rev=730902&r1=730901&r2=730902&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java Fri Jan  2 19:55:06 2009
@@ -91,7 +91,7 @@
         String openejbUri = System.getProperty("openejb.server.uri");
         if (openejbUri == null) {
             try {
-                openejbUri = new URI("ejb", null, "localhost", 4201, null, null, null).toString();
+                openejbUri = new URI("ejbd", null, "localhost", 4201, null, null, null).toString();
             } catch (URISyntaxException e) {
                 throw new RuntimeException(e);
             }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java?rev=730902&r1=730901&r2=730902&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/CoreDeploymentInfo.java Fri Jan  2 19:55:06 2009
@@ -35,6 +35,7 @@
 import javax.ejb.TimedObject;
 import javax.ejb.Timer;
 import javax.ejb.ScheduleExpression;
+import javax.ejb.SessionSynchronization;
 import javax.naming.Context;
 import javax.persistence.EntityManagerFactory;
 
@@ -1069,4 +1070,8 @@
     public Set<String> getDependsOn() {
         return dependsOn;
     }
+
+    public boolean isSessionSynchronized() {
+        return !isBeanManagedTransaction() && SessionSynchronization.class.isAssignableFrom(beanClass);
+    }
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java?rev=730902&r1=730901&r2=730902&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/Instance.java Fri Jan  2 19:55:06 2009
@@ -40,7 +40,6 @@
 
     private boolean inUse;
     private SuspendedTransaction beanTransaction;
-    private boolean callSessionSynchronization;
 
     // todo if we keyed by an entity manager factory id we would not have to make this transient and rebuild the index below
     // This would require that we crete an id and that we track it
@@ -84,14 +83,6 @@
         this.beanTransaction = beanTransaction;
     }
 
-    public synchronized boolean isCallSessionSynchronization() {
-        return callSessionSynchronization;
-    }
-
-    public synchronized void setCallSessionSynchronization() {
-        this.callSessionSynchronization = true;
-    }
-
     public synchronized Map<EntityManagerFactory, EntityManager> getEntityManagers(Index<EntityManagerFactory, Map> factories) {
         if (entityManagers == null && entityManagerArray != null) {
             entityManagers = new HashMap<EntityManagerFactory, EntityManager>();

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?rev=730902&r1=730901&r2=730902&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java Fri Jan  2 19:55:06 2009
@@ -291,6 +291,9 @@
                 }
             }
 
+            createContext.setCurrentOperation(Operation.CREATE);
+            createContext.setCurrentAllowedStates(StatefulContext.getStates());
+
             // Start transaction
             TransactionPolicy txPolicy = createTransactionPolicy(createContext.getDeploymentInfo().getTransactionType(callMethod), createContext);
 
@@ -307,8 +310,6 @@
                         !callMethod.getDeclaringClass().equals(DeploymentInfo.BusinessRemoteHome.class)){
 
                     // Setup for business invocation
-                    createContext.setCurrentOperation(Operation.CREATE);
-                    createContext.setCurrentAllowedStates(StatefulContext.getStates());
                     Method createOrInit = deploymentInfo.getMatchingBeanMethod(callMethod);
                     createContext.set(Method.class, createOrInit);
 
@@ -764,12 +765,11 @@
         }
 
         // SessionSynchronization are only enabled for beans after CREATE that are not bean-managed and implement the SessionSynchronization interface
-        boolean sessionSynchronization = callContext.getCurrentOperation() != Operation.CREATE &&
-                callContext.getDeploymentInfo().isBeanManagedTransaction() &&
-                instance.bean instanceof SessionSynchronization &&
+        boolean synchronize = callContext.getCurrentOperation() != Operation.CREATE &&
+                callContext.getDeploymentInfo().isSessionSynchronized() &&
                 txPolicy.isTransactionActive();
 
-        coordinator.registerSessionSynchronization(instance, callContext.getDeploymentInfo(), callContext.getPrimaryKey(), sessionSynchronization);
+        coordinator.registerSessionSynchronization(instance, callContext.getDeploymentInfo(), callContext.getPrimaryKey(), synchronize);
     }
 
     /**
@@ -778,24 +778,49 @@
      * This class also is responsible for calling releaseInstance after the transaction completes. 
      */
     private class SessionSynchronizationCoordinator implements TransactionSynchronization {
-        private final Map<Object, Instance> registry = new HashMap<Object, Instance>();
+        private final Map<Object, Synchronization> registry = new HashMap<Object, Synchronization>();
         private final TransactionPolicy txPolicy;
 
         private SessionSynchronizationCoordinator(TransactionPolicy txPolicy) {
             this.txPolicy = txPolicy;
         }
 
-        private void registerSessionSynchronization(Instance instance, CoreDeploymentInfo deploymentInfo, Object primaryKey, boolean sessionSynchronization) {
-            // register
-            if (!registry.containsKey(primaryKey)) {
-                registry.put(primaryKey, instance);
+        public class Synchronization {
+            private final Instance instance;
+
+            private boolean callSessionSynchronization;
+
+            public Synchronization(Instance instance) {
+                this.instance = instance;
+            }
+
+            public synchronized boolean isCallSessionSynchronization() {
+                return callSessionSynchronization;
             }
 
+            public synchronized boolean setCallSessionSynchronization(boolean synchronize) {
+                boolean oldValue = this.callSessionSynchronization;
+                this.callSessionSynchronization = synchronize;
+                return oldValue;
+            }
+
+        }
+
+        private void registerSessionSynchronization(Instance instance, CoreDeploymentInfo deploymentInfo, Object primaryKey, boolean synchronize) {
+
+            Synchronization synchronization = registry.get(primaryKey);
+
+            if (synchronization == null){
+                synchronization = new Synchronization(instance);
+                registry.put(primaryKey, synchronization);
+            }
+
+            boolean wasSynchronized = synchronization.setCallSessionSynchronization(synchronize);
+
             // check if afterBegin has already been invoked or if this is not a session synchronization bean
-            if (instance.isCallSessionSynchronization() || !sessionSynchronization) {
+            if (wasSynchronized || !synchronize) {
                 return;
             }
-            instance.setCallSessionSynchronization();
 
             // Invoke afterBegin
             ThreadContext callContext = new ThreadContext(instance.deploymentInfo, instance.primaryKey, Operation.AFTER_BEGIN);
@@ -824,12 +849,15 @@
         }
 
         public void beforeCompletion() {
-            for (Instance instance : registry.values()) {
+            for (Synchronization synchronization : registry.values()) {
+
+                Instance instance = synchronization.instance;
+
                 // don't call beforeCompletion when transaction is marked rollback only
                 if (txPolicy.isRollbackOnly()) return;
 
                 // only call beforeCompletion on beans with session synchronization
-                if (!instance.isCallSessionSynchronization()) continue;
+                if (!synchronization.isCallSessionSynchronization()) continue;
 
                 // Invoke beforeCompletion
                 ThreadContext callContext = new ThreadContext(instance.deploymentInfo, instance.primaryKey, Operation.BEFORE_COMPLETION);
@@ -869,14 +897,16 @@
 
         public void afterCompletion(Status status) {
             Throwable firstException = null;
-            for (Instance instance : registry.values()) {
+            for (Synchronization synchronization : registry.values()) {
+
+                Instance instance = synchronization.instance;
 
                 ThreadContext callContext = new ThreadContext(instance.deploymentInfo, instance.primaryKey, Operation.AFTER_COMPLETION);
                 callContext.setCurrentAllowedStates(StatefulContext.getStates());
                 ThreadContext oldCallContext = ThreadContext.enter(callContext);
                 try {
                     instance.setInUse(true);
-                    if (instance.isCallSessionSynchronization()) {
+                    if (synchronization.isCallSessionSynchronization()) {
                         Method afterCompletion = SessionSynchronization.class.getMethod("afterCompletion", boolean.class);
 
                         List<InterceptorData> interceptors = instance.deploymentInfo.getMethodInterceptors(afterCompletion);