[jboss-cvs] JBossAS SVN: r70796 - in projects/ejb3/branches/cluster-dev/ejb3-cache/src: main/java/org/jboss/ejb3/cache/impl/factory and 4 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Mar 12 23:17:57 EDT 2008


Author: bstansberry at jboss.com
Date: 2008-03-12 23:17:56 -0400 (Wed, 12 Mar 2008)
New Revision: 70796

Added:
   projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/SynchronizationCoordinator.java
   projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/impl/SynchronizationCoordinatorImpl.java
Modified:
   projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/GroupAwareTransactionalCache.java
   projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/TransactionalCache.java
   projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/GroupAwareCacheFactory.java
   projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/NonClusteredIntegratedObjectStoreSource.java
   projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/NonPassivatingCacheFactory.java
   projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/IntegratedObjectStoreSource.java
   projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/impl/AbstractStatefulCacheFactory.java
   projects/ejb3/branches/cluster-dev/ejb3-cache/src/test/java/org/jboss/ejb3/test/cache/distributed/MockIntegratedObjectStoreSource.java
   projects/ejb3/branches/cluster-dev/ejb3-cache/src/test/java/org/jboss/ejb3/test/cache/mock/MockEjb3System.java
Log:
[EJBTHREE-1026] Add the SynchronizationCoordinator concept

Modified: projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/GroupAwareTransactionalCache.java
===================================================================
--- projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/GroupAwareTransactionalCache.java	2008-03-13 02:30:11 UTC (rev 70795)
+++ projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/GroupAwareTransactionalCache.java	2008-03-13 03:17:56 UTC (rev 70796)
@@ -32,6 +32,7 @@
 import org.jboss.ejb3.cache.SerializationGroup;
 import org.jboss.ejb3.cache.spi.BackingCacheEntry;
 import org.jboss.ejb3.cache.spi.GroupAwareBackingCache;
+import org.jboss.ejb3.cache.spi.SynchronizationCoordinator;
 import org.jboss.ejb3.cache.spi.impl.GroupCreationContext;
 import org.jboss.ejb3.cache.spi.impl.ItemCachePair;
 
@@ -55,9 +56,10 @@
     * @param tm       the transaction manager
     */
    public GroupAwareTransactionalCache(GroupAwareBackingCache<C, T> delegate, 
-                                       TransactionManager tm)
+                                       TransactionManager tm,
+                                       SynchronizationCoordinator syncCoordinator)
    {
-      super(delegate, tm);
+      super(delegate, tm, syncCoordinator);
       this.groupedCache = delegate;
    }
 

Modified: projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/TransactionalCache.java
===================================================================
--- projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/TransactionalCache.java	2008-03-13 02:30:11 UTC (rev 70795)
+++ projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/TransactionalCache.java	2008-03-13 03:17:56 UTC (rev 70796)
@@ -38,6 +38,7 @@
 import org.jboss.ejb3.cache.spi.BackingCache;
 import org.jboss.ejb3.cache.spi.BackingCacheEntry;
 import org.jboss.ejb3.cache.spi.IntegratedObjectStore;
+import org.jboss.ejb3.cache.spi.SynchronizationCoordinator;
 
 /**
  * {@link Cache#isGroupAware() Non-group-aware} <code>Cache</code> implementation 
@@ -68,6 +69,11 @@
    private final ConcurrentMap<Object, CacheReleaseSynchronization<C, T>> synchronizations;
    /** Our transaction manager */
    private final TransactionManager tm;
+   /** 
+    * Helper to allow coordination Transaction Synchronization execution
+    * between ourself and other elements of the caching subsystem.
+    */
+   private final SynchronizationCoordinator synchronizationCoordinator;
    
    private class Entry
    {
@@ -119,13 +125,17 @@
       }      
    }
    
-   public TransactionalCache(BackingCache<C, T> delegate, TransactionManager tm)
+   public TransactionalCache(BackingCache<C, T> delegate, 
+                             TransactionManager tm,
+                             SynchronizationCoordinator syncCoordinator)
    {
       assert delegate != null : "delegate is null";
       assert tm != null : "tm is null";
+      assert syncCoordinator != null : "syncCoordinator is null";
       
       this.delegate = delegate;
       this.tm = tm;
+      this.synchronizationCoordinator = syncCoordinator;
       
       this.inUseCache = new ConcurrentHashMap<Object, Entry>();
       this.synchronizations = new ConcurrentHashMap<Object, CacheReleaseSynchronization<C, T>>();
@@ -311,7 +321,7 @@
          CacheReleaseSynchronization<C, T> sync = new CacheReleaseSynchronization<C, T>(this, cacheItem, tx);
          try
          {
-            tx.registerSynchronization(sync);
+            synchronizationCoordinator.addSynchronizationFirst(tx, sync);
          }
          catch (RollbackException e)
          {

Modified: projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/GroupAwareCacheFactory.java
===================================================================
--- projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/GroupAwareCacheFactory.java	2008-03-13 02:30:11 UTC (rev 70795)
+++ projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/GroupAwareCacheFactory.java	2008-03-13 03:17:56 UTC (rev 70796)
@@ -87,7 +87,7 @@
       }
       
       PassivatingIntegratedObjectStore<T, SerializationGroupMember<T>> store = 
-         storeSource.createIntegratedObjectStore(containerName, configName, cacheConfig, getTransactionManager());
+         storeSource.createIntegratedObjectStore(containerName, configName, cacheConfig, getTransactionManager(), getSynchronizationCoordinator());
       
       // Make sure passivation/expiration occurs periodically
       if (store.getInterval() < 1)
@@ -111,7 +111,7 @@
       GroupAwareBackingCache<T, SerializationGroupMember<T>> backingCache =
          new GroupAwareBackingCacheImpl<T>(memberContainer, groupCache);
       
-      return new GroupAwareTransactionalCache<T, SerializationGroupMember<T>>(backingCache, getTransactionManager());
+      return new GroupAwareTransactionalCache<T, SerializationGroupMember<T>>(backingCache, getTransactionManager(), getSynchronizationCoordinator());
    }
 
    private PassivatingBackingCache<T, SerializationGroupImpl<T>> createGroupCache(String name, String configName, CacheConfig cacheConfig)
@@ -120,7 +120,7 @@
       StatefulObjectFactory<SerializationGroupImpl<T>> factory = container;
       PassivationManager<SerializationGroupImpl<T>> passivationManager = container;
       PassivatingIntegratedObjectStore<T, SerializationGroupImpl<T>> store = 
-         storeSource.createGroupIntegratedObjectStore(name, configName, cacheConfig, getTransactionManager());
+         storeSource.createGroupIntegratedObjectStore(name, configName, cacheConfig, getTransactionManager(), getSynchronizationCoordinator());
     
       // The group cache store should not passivate/expire -- that's a 
       // function of the caches for the members

Modified: projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/NonClusteredIntegratedObjectStoreSource.java
===================================================================
--- projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/NonClusteredIntegratedObjectStoreSource.java	2008-03-13 02:30:11 UTC (rev 70795)
+++ projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/NonClusteredIntegratedObjectStoreSource.java	2008-03-13 03:17:56 UTC (rev 70796)
@@ -31,6 +31,7 @@
 import org.jboss.ejb3.cache.impl.backing.SimplePassivatingIntegratedObjectStore;
 import org.jboss.ejb3.cache.spi.IntegratedObjectStoreSource;
 import org.jboss.ejb3.cache.spi.PassivatingIntegratedObjectStore;
+import org.jboss.ejb3.cache.spi.SynchronizationCoordinator;
 import org.jboss.ejb3.cache.spi.impl.FileObjectStore;
 import org.jboss.ejb3.cache.spi.impl.SerializationGroupImpl;
 import org.jboss.ejb3.cache.spi.impl.SerializationGroupMember;
@@ -62,7 +63,7 @@
    private int subdirectoryCount = DEFAULT_SUBDIRECTORY_COUNT;
    
    public PassivatingIntegratedObjectStore<T, SerializationGroupImpl<T>> createGroupIntegratedObjectStore(String containerName, String cacheConfigName,
-         CacheConfig cacheConfig, TransactionManager transactionManager)
+         CacheConfig cacheConfig, TransactionManager transactionManager, SynchronizationCoordinator synchronizationCoordinator)
    {
       FileObjectStore<SerializationGroupImpl<T>> objectStore = new FileObjectStore<SerializationGroupImpl<T>>();
       objectStore.setStorageDirectory(getFullGroupDirectoryName(containerName));
@@ -77,7 +78,7 @@
    }
 
    public PassivatingIntegratedObjectStore<T, SerializationGroupMember<T>> createIntegratedObjectStore(String containerName, String cacheConfigName,
-         CacheConfig cacheConfig, TransactionManager transactionManager)
+         CacheConfig cacheConfig, TransactionManager transactionManager, SynchronizationCoordinator synchronizationCoordinator)
    {
       FileObjectStore<SerializationGroupMember<T>> objectStore = new FileObjectStore<SerializationGroupMember<T>>();
       objectStore.setStorageDirectory(getFullSessionDirectoryName(containerName));

Modified: projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/NonPassivatingCacheFactory.java
===================================================================
--- projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/NonPassivatingCacheFactory.java	2008-03-13 02:30:11 UTC (rev 70795)
+++ projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/impl/factory/NonPassivatingCacheFactory.java	2008-03-13 03:17:56 UTC (rev 70796)
@@ -64,7 +64,7 @@
          backingCache.setInterval(getDefaultPassivationExpirationInterval());
       }
       
-      return new TransactionalCache<T, NonPassivatingBackingCacheEntry<T>>(backingCache, getTransactionManager());
+      return new TransactionalCache<T, NonPassivatingBackingCacheEntry<T>>(backingCache, getTransactionManager(), getSynchronizationCoordinator());
    }
 
 }

Modified: projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/IntegratedObjectStoreSource.java
===================================================================
--- projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/IntegratedObjectStoreSource.java	2008-03-13 02:30:11 UTC (rev 70795)
+++ projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/IntegratedObjectStoreSource.java	2008-03-13 03:17:56 UTC (rev 70796)
@@ -50,13 +50,17 @@
     * @param config configuration details of the cache
     * @param transactionManager TransactionManager the store should use if
     *                           it needs to monitor transactions
+    * @param synchronizationCoordinator SynchronizationCoordinator the store
+    *                                   should use if it needs to add
+    *                                   tranaction synchronizations
     * @return the store
     */
    PassivatingIntegratedObjectStore<T, SerializationGroupImpl<T>> 
          createGroupIntegratedObjectStore(String containerName, 
                                           String cacheConfigName, 
                                           CacheConfig config, 
-                                          TransactionManager transactionManager);
+                                          TransactionManager transactionManager, 
+                                          SynchronizationCoordinator synchronizationCoordinator);
    
    /**
     * Provide a {@link PassivatingIntegratedObjectStore} for storage
@@ -66,11 +70,16 @@
     * @param cacheConfigName TODO
     * @param transactionManager TransactionManager the store should use if
     *                           it needs to monitor transactions
+    * @param synchronizationCoordinator SynchronizationCoordinator the store
+    *                                   should use if it needs to add
+    *                                   tranaction synchronizations
     * @param config configuration details of the cache
     * @return the store
     */
    PassivatingIntegratedObjectStore<T, SerializationGroupMember<T>> 
          createIntegratedObjectStore(String containerName, 
                                      String cacheConfigName, 
-                                     CacheConfig cacheConfig, TransactionManager transactionManager);
+                                     CacheConfig cacheConfig, 
+                                     TransactionManager transactionManager, 
+                                     SynchronizationCoordinator synchronizationCoordinator);
 }

Added: projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/SynchronizationCoordinator.java
===================================================================
--- projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/SynchronizationCoordinator.java	                        (rev 0)
+++ projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/SynchronizationCoordinator.java	2008-03-13 03:17:56 UTC (rev 70796)
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.ejb3.cache.spi;
+
+import javax.transaction.RollbackException;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+
+/**
+ * Coordinates order of transaction {@link Synchronization} execution, allowing
+ * different elements of the caching system to ensure their synchronization
+ * executes either relatively early or relatively late in the transaction 
+ * commit process.
+ * <p>
+ * Note that a <code>SynchronizationCoordinator</code> has no effect on the
+ * order of execution of synchronizations it doesn't know about (e.g. those
+ * registered by code external to the caching subsystem.)
+ * </p>
+ * 
+ * @author Brian Stansberry
+ */
+public interface SynchronizationCoordinator
+{
+   /**
+    * Register the given Synchronization with the given Transaction, 
+    * ensuring that during transaction commit the synchronization executes 
+    * before any other synchronizations <strong>previously</strong> added to 
+    * this coordinator.
+    * 
+    * @param tx   the transaction
+    * @param sync the synchronization
+    * 
+    * @throws RollbackException
+    * @throws SystemException
+    */
+   void addSynchronizationFirst(Transaction tx, Synchronization sync) 
+      throws RollbackException, SystemException;
+   
+   /**
+    * Register the given Synchronization with the given Transaction, 
+    * ensuring that during transaction commit the synchronization executes 
+    * after any other synchronizations <strong>previously</strong> added to 
+    * this coordinator.
+    * 
+    * @param tx   the transaction
+    * @param sync the synchronization
+    * 
+    * @throws RollbackException
+    * @throws SystemException
+    */
+   void addSynchronizationLast(Transaction tx, Synchronization sync) 
+      throws RollbackException, SystemException;
+}

Modified: projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/impl/AbstractStatefulCacheFactory.java
===================================================================
--- projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/impl/AbstractStatefulCacheFactory.java	2008-03-13 02:30:11 UTC (rev 70795)
+++ projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/impl/AbstractStatefulCacheFactory.java	2008-03-13 03:17:56 UTC (rev 70796)
@@ -30,6 +30,7 @@
 import org.jboss.ejb3.cache.CacheItem;
 import org.jboss.ejb3.cache.StatefulCacheFactory;
 import org.jboss.ejb3.cache.spi.PassivationExpirationCoordinator;
+import org.jboss.ejb3.cache.spi.SynchronizationCoordinator;
 
 /**
  * Abstract superclass of {@link StatefulCacheFactory} implementations.
@@ -42,6 +43,7 @@
    public static final int DEFAULT_PASSIVATION_EXPIRATION_INTERVAL = 10;
    
    private TransactionManager transactionManager;
+   private SynchronizationCoordinator synchronizationCoordinator;
    private PassivationExpirationCoordinator passivationExpirationCoordinator;
    private int defaultPassivationExpirationInterval = DEFAULT_PASSIVATION_EXPIRATION_INTERVAL;
    private String defaultCacheConfigName;
@@ -67,6 +69,22 @@
    }
    
    /**
+    * Gets the {@link SynchronizationCoordinator} used by this factory.
+    */   
+   public SynchronizationCoordinator getSynchronizationCoordinator()
+   {
+      return synchronizationCoordinator;
+   }
+
+   /**
+    * Sets the {@link SynchronizationCoordinator} used by this factory.
+    */   
+   public void setSynchronizationCoordinator(SynchronizationCoordinator synchronizationCoordinator)
+   {
+      this.synchronizationCoordinator = synchronizationCoordinator;
+   }
+
+   /**
     * Gets the coordinator of passivation/expiration processes. If 
     * <code>null</code>, each cache will manager passivation/expiration
     * with their own thread.
@@ -167,5 +185,16 @@
       
       return substitute == null ? name : substitute;
    }
+   
+   public void start()
+   {
+      if (getSynchronizationCoordinator() == null)
+         setSynchronizationCoordinator(new SynchronizationCoordinatorImpl());
+   }
+   
+   public void stop()
+   {
+      // no-op
+   }
 
 }

Added: projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/impl/SynchronizationCoordinatorImpl.java
===================================================================
--- projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/impl/SynchronizationCoordinatorImpl.java	                        (rev 0)
+++ projects/ejb3/branches/cluster-dev/ejb3-cache/src/main/java/org/jboss/ejb3/cache/spi/impl/SynchronizationCoordinatorImpl.java	2008-03-13 03:17:56 UTC (rev 70796)
@@ -0,0 +1,172 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.ejb3.cache.spi.impl;
+
+import java.util.LinkedList;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import javax.transaction.RollbackException;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+
+import org.jboss.ejb3.cache.spi.SynchronizationCoordinator;
+import org.jboss.logging.Logger;
+
+/**
+ * @author Brian Stansberry
+ *
+ */
+public class SynchronizationCoordinatorImpl implements SynchronizationCoordinator
+{
+   private static final Logger log = Logger.getLogger(SynchronizationCoordinatorImpl.class);
+   
+   private ConcurrentMap<Transaction, OrderedSynchronizationHandler> handlers = 
+      new ConcurrentHashMap<Transaction, OrderedSynchronizationHandler>();
+   
+   public void addSynchronizationFirst(Transaction tx, Synchronization sync) 
+      throws RollbackException, SystemException
+   {      
+      getHandler(tx).registerAtHead(sync);
+   }
+
+   public void addSynchronizationLast(Transaction tx, Synchronization sync) 
+      throws RollbackException, SystemException
+   {
+      getHandler(tx).registerAtTail(sync);
+   }
+   
+   private OrderedSynchronizationHandler getHandler(Transaction tx) throws RollbackException, SystemException
+   {
+      OrderedSynchronizationHandler handler = handlers.get(tx);
+      if (handler == null)
+      {
+         handler = new OrderedSynchronizationHandler(tx, this);
+         OrderedSynchronizationHandler old = handlers.putIfAbsent(tx, handler);
+         if (old != null)
+         {
+            handler = old;
+         }
+         else
+         {
+            tx.registerSynchronization(handler);
+         }
+      }
+      
+      return handler;      
+   }
+   
+   private void removeHandler(Transaction tx)
+   {
+      handlers.remove(tx);
+   }
+
+   private static class OrderedSynchronizationHandler implements Synchronization
+   {       
+      private Transaction tx = null;
+      private SynchronizationCoordinatorImpl coordinator;
+      private final LinkedList<Synchronization> synchronizations = new LinkedList<Synchronization>();
+
+
+      private OrderedSynchronizationHandler(Transaction tx, SynchronizationCoordinatorImpl coordinator)
+      {
+         assert tx != null : "tx is null";
+         assert coordinator != null : "coordinator is null";
+         
+         this.tx = tx;
+         this.coordinator = coordinator;
+      }
+
+
+      public void registerAtHead(Synchronization handler)
+      {
+         register(handler, true);
+      }
+
+      public void registerAtTail(Synchronization handler)
+      {
+         register(handler, false);
+      }
+
+      void register(Synchronization handler, boolean head)
+      {
+         if (handler != null && !synchronizations.contains(handler))
+         {
+            if (head)
+               synchronizations.addFirst(handler);
+            else
+               synchronizations.addLast(handler);
+         }
+      }
+
+      public void beforeCompletion()
+      {
+         for (Synchronization sync : synchronizations)
+         {
+            sync.beforeCompletion();
+         }
+      }
+
+      public void afterCompletion(int status)
+      {
+         RuntimeException exceptionInAfterCompletion = null;
+         for (Synchronization sync : synchronizations)
+         {
+            try
+            {
+               sync.afterCompletion(status);
+            }
+            catch (Throwable t)
+            {
+               log.error("failed calling afterCompletion() on " + sync, t);
+               exceptionInAfterCompletion = (RuntimeException) t;
+            }
+         }
+
+         // finally unregister us from the hashmap
+         coordinator.removeHandler(tx);
+         tx = null;
+
+         // throw the exception so the TM can deal with it.
+         if (exceptionInAfterCompletion != null) throw exceptionInAfterCompletion;
+      }
+
+      public String toString()
+      {
+         StringBuffer sb = new StringBuffer();
+         sb.append("tx=" + getTxAsString() + ", handlers=" + synchronizations);
+         return sb.toString();
+      }
+      
+      private String getTxAsString()
+      {
+         // Don't call toString() on tx or it can lead to stack overflow
+         if (tx == null)
+            return null;
+         
+         return tx.getClass().getName() + "@" + System.identityHashCode(tx);
+      }
+      
+   }
+}

Modified: projects/ejb3/branches/cluster-dev/ejb3-cache/src/test/java/org/jboss/ejb3/test/cache/distributed/MockIntegratedObjectStoreSource.java
===================================================================
--- projects/ejb3/branches/cluster-dev/ejb3-cache/src/test/java/org/jboss/ejb3/test/cache/distributed/MockIntegratedObjectStoreSource.java	2008-03-13 02:30:11 UTC (rev 70795)
+++ projects/ejb3/branches/cluster-dev/ejb3-cache/src/test/java/org/jboss/ejb3/test/cache/distributed/MockIntegratedObjectStoreSource.java	2008-03-13 03:17:56 UTC (rev 70796)
@@ -28,6 +28,7 @@
 import org.jboss.ejb3.cache.CacheItem;
 import org.jboss.ejb3.cache.spi.IntegratedObjectStoreSource;
 import org.jboss.ejb3.cache.spi.PassivatingIntegratedObjectStore;
+import org.jboss.ejb3.cache.spi.SynchronizationCoordinator;
 import org.jboss.ejb3.cache.spi.impl.SerializationGroupImpl;
 import org.jboss.ejb3.cache.spi.impl.SerializationGroupMember;
 
@@ -48,14 +49,14 @@
    }
    
    public PassivatingIntegratedObjectStore<T, SerializationGroupImpl<T>>  createGroupIntegratedObjectStore(String containerName,
-         String cacheConfigName, CacheConfig cacheConfig, TransactionManager transactionManager)
+         String cacheConfigName, CacheConfig cacheConfig, TransactionManager transactionManager, SynchronizationCoordinator synchronizationCoordinator)
    {
       String keyBase = "GroupCache-" + containerName;
       return new MockJBCIntegratedObjectStore<T, SerializationGroupImpl<T>>(localMap, remoteMap, cacheConfig, keyBase, keyBase);
    }
 
    public PassivatingIntegratedObjectStore<T, SerializationGroupMember<T>>  createIntegratedObjectStore(String containerName, String cacheConfigName,
-         CacheConfig cacheConfig, TransactionManager transactionManager)
+         CacheConfig cacheConfig, TransactionManager transactionManager, SynchronizationCoordinator synchronizationCoordinator)
    {
       return new MockJBCIntegratedObjectStore<T, SerializationGroupMember<T>>(localMap, remoteMap, cacheConfig, containerName, containerName);
    }

Modified: projects/ejb3/branches/cluster-dev/ejb3-cache/src/test/java/org/jboss/ejb3/test/cache/mock/MockEjb3System.java
===================================================================
--- projects/ejb3/branches/cluster-dev/ejb3-cache/src/test/java/org/jboss/ejb3/test/cache/mock/MockEjb3System.java	2008-03-13 02:30:11 UTC (rev 70795)
+++ projects/ejb3/branches/cluster-dev/ejb3-cache/src/test/java/org/jboss/ejb3/test/cache/mock/MockEjb3System.java	2008-03-13 03:17:56 UTC (rev 70796)
@@ -158,6 +158,7 @@
       factory.setPassivationExpirationCoordinator(coordinator);
       // Process passivation/expiration as quickly as possible so tests run fast
       factory.setDefaultPassivationExpirationInterval(1);
+      factory.start();
       
       return factory;
    }




More information about the jboss-cvs-commits mailing list