[jboss-svn-commits] JBL Code SVN: r31835 - in labs/jbosstm/trunk/ArjunaCore: arjuna/classes/com/arjuna/ats/arjuna/coordinator and 12 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Feb 25 08:22:01 EST 2010


Author: mark.little at jboss.com
Date: 2010-02-25 08:22:00 -0500 (Thu, 25 Feb 2010)
New Revision: 31835

Added:
   labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/abstactrecords/
   labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/abstactrecords/CadaverUnitTest.java
   labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/abstactrecords/LockRecordUnitTest.java
   labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/basic/ReactivateUnitTest.java
   labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/basic/TypesUnitTest.java
   labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/recovery/RecoveryModuleUnitTest.java
Modified:
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/StateManager.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/ActivationRecord.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/CadaverActivationRecord.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/RecoveryRecord.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/StateManagerFriend.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/abstractrecords/ActivationRecordUnitTest.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/resources/BasicObject.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/statemanager/BasicTest.java
   labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/abstractrecords/CadaverLockRecord.java
   labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/abstractrecords/LockRecord.java
   labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/recovery/RecoveredTransactionalObject.java
   labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/txoj/ConflictType.java
   labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/txoj/LockManager.java
   labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/common/resources/AtomicObject.java
   labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/recovery/RecoveryTest.java
Log:
https://jira.jboss.org/jira/browse/JBTM-709

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/StateManager.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/StateManager.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/StateManager.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -298,10 +298,13 @@
 
             synchronized (usingActions)
             {
-                if (usingActions.get(action.topLevelAction().get_uid()) == null)
+                if (usingActions.get(action.get_uid()) == null)
                 {
-                    usingActions.put(action.topLevelAction().get_uid(), action
-                            .topLevelAction());
+                    /*
+                     * May cause us to add parent as well as child.
+                     */
+                    
+                    usingActions.put(action.get_uid(), action);
                     forceAR = true;
                 }
             }
@@ -395,7 +398,7 @@
             {
                 int arStatus = AddOutcome.AR_ADDED;
                 ActivationRecord ar = new ActivationRecord(oldStatus, this,
-                        action.topLevelAction());
+                        action);
 
                 if ((arStatus = action.add(ar)) != AddOutcome.AR_ADDED)
                 {
@@ -405,8 +408,7 @@
                     {
                         synchronized (usingActions)
                         {
-                            usingActions.remove(action.topLevelAction()
-                                    .get_uid());
+                            usingActions.remove(action.get_uid());
                         }
                     }
 
@@ -423,6 +425,11 @@
                     currentlyActivated = activated = true;
                 }
             }
+            else
+            {
+                if (currentStatus == ObjectStatus.ACTIVE_NEW)
+                    currentlyActivated = activated = true;
+            }
         }
         
         return result;
@@ -555,6 +562,11 @@
         return myType;
     }
 
+    public int getObjectModel ()
+    {
+        return objectModel;
+    }
+    
     /**
      * @return the object's unique identifier.
      */
@@ -998,6 +1010,7 @@
             if (tsLogger.arjLoggerI18N.isWarnEnabled())
                 tsLogger.arjLoggerI18N
                         .warn("com.arjuna.ats.arjuna.StateManager_10");
+            
             activate();
         }
 
@@ -1212,7 +1225,7 @@
         /*
          * Here the object must be either RECOVERABLE or PERSISTENT. Whether or
          * not an action exists we still need to reset the object status to
-         * avoid possible later confusion What it gets set to is not important
+         * avoid possible later confusion. What it gets set to is not important
          * really as long as it gets changed from ACTIVE_NEW which might cause
          * any running action to abort.
          */
@@ -1433,7 +1446,7 @@
                         if (committed)
                         {
                             if ((myType == ObjectType.RECOVERABLE)
-                                    && (objectModel == ObjectModel.SINGLE))
+                                    && (objectModel == ObjectModel.SINGLE) || (action.typeOfAction() == ActionType.NESTED))
                             {
                                 initialStatus = currentStatus = ObjectStatus.ACTIVE;
                             }

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -3007,7 +3007,7 @@
 		{
 			p = ((actionType == ActionType.TOP_LEVEL) ? record.topLevelPrepare()
 					: record.nestedPrepare());
-			
+
 			if (p == TwoPhaseOutcome.PREPARE_OK)
 			{
 				record = insertRecord(preparedList, record);

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/ActivationRecord.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/ActivationRecord.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/ActivationRecord.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -141,7 +141,18 @@
                     "ActivationRecord::nestedPrepare() for " + order());
         }
 
-        return TwoPhaseOutcome.PREPARE_READONLY;
+        if ((objectAddr != null) && (actionHandle != null))
+        {
+            if (StateManagerFriend.forgetAction(objectAddr, actionHandle, true, RecordType.ACTIVATION))
+            {              
+                actionHandle = actionHandle.parent();
+                
+                if (StateManagerFriend.rememberAction(objectAddr, actionHandle, RecordType.ACTIVATION))
+                    return TwoPhaseOutcome.PREPARE_READONLY;
+            }
+        }
+        
+        return TwoPhaseOutcome.FINISH_ERROR;
     }
 
     /**
@@ -246,7 +257,7 @@
 
     /*
      * should_merge and should_replace are invoked by the record list manager to
-     * determine if two records should be merged togethor or if the 'newer'
+     * determine if two records should be merged together or if the 'newer'
      * should replace the older. shouldAdd determines if the new record should
      * be added in addition to the existing record and is currently only invoked
      * if both of should_merge and should_replace return FALSE Default

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/CadaverActivationRecord.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/CadaverActivationRecord.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/CadaverActivationRecord.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -78,6 +78,8 @@
 				     "CadaverActivationRecord::nestedAbort() for "+get_uid());
 	}
 	
+	super.nestedAbort();
+	
 	return TwoPhaseOutcome.FINISH_OK;
     }
     
@@ -102,6 +104,8 @@
 				     "CadaverActivationRecord::nestedPrepare() for "+get_uid());
 	}
 	
+	super.nestedPrepare();
+	
 	return TwoPhaseOutcome.PREPARE_READONLY;
     }
     
@@ -114,6 +118,8 @@
 				     "CadaverActivationRecord::topLevelAbort() for "+get_uid());
 	}
 	
+	super.topLevelAbort();
+	
 	return TwoPhaseOutcome.FINISH_OK;
     }
     
@@ -125,6 +131,8 @@
 				     "CadaverActivationRecord::topLevelCommit() for "+get_uid());
 	}
 	
+	super.topLevelCommit();
+	
 	return TwoPhaseOutcome.FINISH_OK;
     }
 
@@ -136,6 +144,10 @@
 				     "CadaverActivationRecord::topLevelPrepare() for "+get_uid());
 	}
 	
+	// make sure SM instance forgets about action
+	
+	super.topLevelCommit();
+	
 	return TwoPhaseOutcome.PREPARE_READONLY;
     }
     
@@ -146,7 +158,7 @@
     
     /*
      * shouldMerge and should_replace are invoked by the record list manager
-     * to determine if two records should be merged togethor or if the
+     * to determine if two records should be merged together or if the
      * 'newer' should replace the older.
      * shouldAdd determines if the new record should be added in addition
      * to the existing record and is currently only invoked if both of

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/RecoveryRecord.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/RecoveryRecord.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/RecoveryRecord.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -160,7 +160,7 @@
      * nestedCommit does nothing since the passing of the state up to the parent
      * action is handled by the record list merging system. In fact since
      * nestedPrepare returns PREPARE_READONLY this function should never
-     * actaully be called
+     * actually be called
      */
 
     public int nestedCommit ()

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/StateManagerFriend.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/StateManagerFriend.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/abstractrecords/StateManagerFriend.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -31,7 +31,6 @@
 
 package com.arjuna.ats.internal.arjuna.abstractrecords;
 
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 import com.arjuna.ats.arjuna.StateManager;
@@ -48,6 +47,8 @@
  *          [com.arjuna.ats.internal.arjuna.abstractrecords.smf1] - StateManagerFriend.forgetAction
  * @message com.arjuna.ats.internal.arjuna.abstractrecords.smf2
  *          [com.arjuna.ats.internal.arjuna.abstractrecords.smf2] - StateManagerFriend.destroyed
+ * @message com.arjuna.ats.internal.arjuna.abstractrecords.smf3
+ *          [com.arjuna.ats.internal.arjuna.abstractrecords.smf3] - StateManagerFriend.rememberAction
  */
 
 public class StateManagerFriend
@@ -74,7 +75,30 @@
             return false;
         }
     }
+    
+    public static final boolean rememberAction (StateManager inst,
+            BasicAction act, int recordType)
+    {
+        try
+        {
+            Method m = StateManager.class.getDeclaredMethod("rememberAction", BasicAction.class, int.class);
 
+            m.setAccessible(true);
+            Boolean b = (Boolean) m.invoke(inst, act, recordType);
+            m.setAccessible(false);
+
+            return b.booleanValue();
+        }
+        catch (final Throwable ex)
+        {
+            if (tsLogger.arjLoggerI18N.isWarnEnabled())
+                tsLogger.arjLoggerI18N
+                .warn("com.arjuna.ats.internal.arjuna.abstractrecords.smf3", ex);
+            
+            return false;
+        }
+    }
+
     public static final void destroyed (StateManager inst) //throws NoSuchMethodException, InvocationTargetException, IllegalAccessException
     {
         try

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/abstractrecords/ActivationRecordUnitTest.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/abstractrecords/ActivationRecordUnitTest.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/abstractrecords/ActivationRecordUnitTest.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -43,8 +43,14 @@
     @Test
     public void test ()
     {
-        ActivationRecord cr = new ActivationRecord(ObjectType.ANDPERSISTENT, new ExtendedObject(), new AtomicAction());
+        AtomicAction A = new AtomicAction();
+        AtomicAction B = new AtomicAction();
         
+        A.begin();
+        B.begin();
+        
+        ActivationRecord cr = new ActivationRecord(ObjectType.ANDPERSISTENT, new ExtendedObject(), B);
+        
         assertFalse(cr.propagateOnAbort());
         assertTrue(cr.propagateOnCommit());
         assertEquals(cr.typeIs(), RecordType.ACTIVATION);
@@ -57,17 +63,19 @@
         assertEquals(cr.nestedPrepare(), TwoPhaseOutcome.PREPARE_READONLY);
         assertEquals(cr.nestedAbort(), TwoPhaseOutcome.FINISH_OK);
 
-        cr = new ActivationRecord(ObjectType.ANDPERSISTENT, new ExtendedObject(), new AtomicAction());
+        cr = new ActivationRecord(ObjectType.ANDPERSISTENT, new ExtendedObject(), B);
         
         assertEquals(cr.nestedPrepare(), TwoPhaseOutcome.PREPARE_READONLY);
         assertEquals(cr.nestedCommit(), TwoPhaseOutcome.FINISH_OK);
         
-        cr = new ActivationRecord(ObjectType.ANDPERSISTENT, new ExtendedObject(), new AtomicAction());
+        B.abort();
+        
+        cr = new ActivationRecord(ObjectType.ANDPERSISTENT, new ExtendedObject(), A);
 
         assertEquals(cr.topLevelPrepare(), TwoPhaseOutcome.PREPARE_OK);
         assertEquals(cr.topLevelAbort(), TwoPhaseOutcome.FINISH_OK);
  
-        cr = new ActivationRecord(ObjectType.ANDPERSISTENT, new ExtendedObject(), new AtomicAction());
+        cr = new ActivationRecord(ObjectType.ANDPERSISTENT, new ExtendedObject(), A);
         
         assertEquals(cr.topLevelPrepare(), TwoPhaseOutcome.PREPARE_OK);
         assertEquals(cr.topLevelCommit(), TwoPhaseOutcome.FINISH_OK);
@@ -79,5 +87,7 @@
         
         assertTrue(cr.save_state(new OutputObjectState(), ObjectType.ANDPERSISTENT));
         assertFalse(cr.restore_state(new InputObjectState(), ObjectType.ANDPERSISTENT));
+        
+        A.abort();
     }
 }

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/resources/BasicObject.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/resources/BasicObject.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/resources/BasicObject.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -76,10 +76,19 @@
 
     public int get()
     {
-        if (activate())
-            return state;
-        else
-            return -1;
+        try
+        {
+            lockMutex();
+            
+            if (activate())
+                return state;
+            else
+                return -1;
+        }
+        finally
+        {
+            getMutex().unlock();
+        }
     }
 
     public String type()

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/statemanager/BasicTest.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/statemanager/BasicTest.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/tests/classes/com/hp/mwtests/ts/arjuna/statemanager/BasicTest.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -32,6 +32,8 @@
 package com.hp.mwtests.ts.arjuna.statemanager;
 
 import com.arjuna.ats.arjuna.AtomicAction;
+import com.arjuna.ats.arjuna.ObjectModel;
+import com.arjuna.ats.arjuna.common.Uid;
 
 import com.hp.mwtests.ts.arjuna.resources.*;
 
@@ -54,5 +56,34 @@
         
         assertTrue(bo.getStore() != null);
         assertTrue(bo.getStoreRoot() != null);
+        
+        assertEquals(bo.getObjectModel(), ObjectModel.SINGLE);
     }
+
+    @Test
+    public void testNested () throws Exception
+    {
+        AtomicAction A = new AtomicAction();
+        AtomicAction B = new AtomicAction();      
+        BasicObject bo = new BasicObject();
+        Uid u = bo.get_uid();
+        
+        A.begin();
+        B.begin();
+        
+        bo.set(2);
+
+        B.commit();
+        A.commit();
+
+        bo = new BasicObject(u);
+        
+        A = new AtomicAction();
+        
+        A.begin();
+        
+        assertEquals(bo.get(), 2);
+        
+        A.commit();
+    }
 }

Modified: labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/abstractrecords/CadaverLockRecord.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/abstractrecords/CadaverLockRecord.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/abstractrecords/CadaverLockRecord.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -77,7 +77,7 @@
 	cadaverLockStore = store;
 	objectTypeName = new String(lm.type());
 	
-	if (super.objectModel == ObjectModel.SINGLE)
+	if (lm.getObjectModel() == ObjectModel.SINGLE)
 	{
 	    doRelease = false;
 	}

Modified: labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/abstractrecords/LockRecord.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/abstractrecords/LockRecord.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/abstractrecords/LockRecord.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -60,13 +60,7 @@
 
     public LockRecord (LockManager lm, BasicAction currAct)
     {
-	super(lm.get_uid(), lm.type(), ObjectType.ANDPERSISTENT);
-
-	actionHandle = currAct;
-
-	managerAddress = lm;
-	readOnly = false;
-	managerType = lm.type();
+        this(lm, false, currAct);
     }
     
     public LockRecord (LockManager lm, boolean rdOnly, BasicAction currAct)

Modified: labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/recovery/RecoveredTransactionalObject.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/recovery/RecoveredTransactionalObject.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/internal/txoj/recovery/RecoveredTransactionalObject.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -37,20 +37,15 @@
 import com.arjuna.ats.arjuna.state.*;
 
 import com.arjuna.ats.txoj.logging.txojLogger;
-import com.arjuna.ats.txoj.logging.FacilityCode;
 
 import com.arjuna.common.util.logging.*;
 
 import com.arjuna.ats.arjuna.objectstore.*;
 import com.arjuna.ats.arjuna.recovery.TransactionStatusConnectionManager;
-import java.util.*;
-import java.io.PrintWriter;
 
 import com.arjuna.ats.arjuna.exceptions.ObjectStoreException;
 import com.arjuna.ats.internal.arjuna.Header;
 
-import java.io.IOException;
-
 /**
  * TransactionalObject shell instantiated at recovery time.
  * <p>
@@ -121,9 +116,7 @@
 
 public class RecoveredTransactionalObject extends StateManager
 {
-
-    RecoveredTransactionalObject(Uid objectUid, String originalType,
-            ObjectStore objectStore)
+    protected RecoveredTransactionalObject(Uid objectUid, String originalType, ObjectStore objectStore)
     {
         _ourUid = objectUid;
         _type = originalType;
@@ -143,7 +136,7 @@
         }
     }
 
-    final void replayPhase2 ()
+    protected final void replayPhase2 ()
     {
         if (findHoldingTransaction())
         {
@@ -221,6 +214,8 @@
             {
                 rollback();
             }
+            else
+                commit();
         }
         else
         {

Modified: labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/txoj/ConflictType.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/txoj/ConflictType.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/txoj/ConflictType.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -38,7 +38,7 @@
  * trying to set a lock.
  */
 
-class ConflictType
+public class ConflictType
 {
 
     public static final int CONFLICT = 0;

Modified: labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/txoj/LockManager.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/txoj/LockManager.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/classes/com/arjuna/ats/txoj/LockManager.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -726,6 +726,7 @@
         }
 
         cleanUp();
+
         super.terminate();
     }
 
@@ -754,17 +755,19 @@
              * act accordingly.
              */
 
+            BasicAction current = BasicAction.Current();
+
             synchronized (super.usingActions)
             {
                 if (super.usingActions != null)
                 {
-                    Enumeration e = super.usingActions.keys();
+                    Enumeration e = super.usingActions.elements();
 
                     while (e.hasMoreElements())
                     {
                         BasicAction action = (BasicAction) e.nextElement();
 
-                        while (action != null)
+                        if (action != null)  // shouldn't be null!!
                         {
                             /*
                              * Pop actions off using list. Don't check if action
@@ -777,12 +780,14 @@
                              * maintain the locks because this object is being
                              * deleted.
                              */
-
+                            
                             AbstractRecord A = new CadaverLockRecord(lockStore,
                                     this, action);
 
                             if (action.add(A) != AddOutcome.AR_ADDED)
+                            {
                                 A = null;
+                            }
                         }
                     }
                 }

Added: labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/abstactrecords/CadaverUnitTest.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/abstactrecords/CadaverUnitTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/abstactrecords/CadaverUnitTest.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -0,0 +1,193 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * 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,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ *
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+package com.hp.mwtests.ts.txoj.abstactrecords;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+
+import org.junit.Test;
+
+import com.arjuna.ats.arjuna.AtomicAction;
+import com.arjuna.ats.arjuna.ObjectModel;
+import com.arjuna.ats.arjuna.common.Uid;
+import com.arjuna.ats.arjuna.coordinator.ActionStatus;
+import com.arjuna.ats.arjuna.coordinator.BasicAction;
+import com.arjuna.ats.internal.txoj.abstractrecords.CadaverLockRecord;
+import com.arjuna.ats.internal.txoj.abstractrecords.LockRecord;
+import com.hp.mwtests.ts.txoj.common.resources.AtomicObject;
+
+import static org.junit.Assert.*;
+
+public class CadaverUnitTest
+{
+    @Test
+    public void testCommit () throws Exception
+    {
+	AtomicAction A = new AtomicAction();
+	AtomicObject B = new AtomicObject(ObjectModel.MULTIPLE);
+	Uid u = B.get_uid();
+	
+	A.begin();
+
+	B.set(1234);
+	 
+	A.commit();
+	
+	A = new AtomicAction();	
+	B = new AtomicObject(u, ObjectModel.MULTIPLE);
+	
+	A.begin();
+	
+	AtomicAction C = new AtomicAction();
+	
+	C.begin();
+	
+	assertEquals(B.get(), 1234);
+	
+	B.set(5678);
+	
+	B.terminate();
+
+	C.commit();
+	
+	assertEquals(A.commit(), ActionStatus.COMMITTED);
+    }
+    
+    @Test
+    public void testAbort () throws Exception
+    {
+        AtomicAction A = new AtomicAction();
+        AtomicObject B = new AtomicObject(ObjectModel.MULTIPLE);
+        Uid u = B.get_uid();
+        
+        A.begin();
+
+        B.set(1234);
+         
+        A.commit();
+        
+        A = new AtomicAction();
+        
+        B = new AtomicObject(u, ObjectModel.MULTIPLE);
+        
+        A.begin();
+        
+        AtomicAction C = new AtomicAction();
+        
+        C.begin();
+        
+        assertEquals(B.get(), 1234);
+        
+        B.set(5678);
+        
+        B.terminate();
+
+        C.commit();
+        
+        assertEquals(A.abort(), ActionStatus.ABORTED);
+    }
+ 
+    @Test
+    public void testMultipleNestedCommit () throws Exception
+    {
+        AtomicAction A = new AtomicAction();
+        AtomicObject B = new AtomicObject(ObjectModel.MULTIPLE);
+        Uid u = B.get_uid();
+        
+        A.begin();
+        
+        B.set(1234);
+         
+        A.commit();
+        
+        A = new AtomicAction();
+        B = new AtomicObject(u, ObjectModel.MULTIPLE);
+        
+        A.begin();
+        
+        AtomicAction C = new AtomicAction();
+        
+        C.begin();
+        
+        assertEquals(B.get(), 1234);
+
+        B.set(5678);
+
+        B.terminate();
+
+        C.commit();
+        
+        assertEquals(A.commit(), ActionStatus.COMMITTED);
+    }
+    
+    @Test
+    public void testMultipleNestedAbort () throws Exception
+    {
+        AtomicAction A = new AtomicAction();
+        AtomicObject B = new AtomicObject(ObjectModel.MULTIPLE);
+        Uid u = B.get_uid();
+        
+        A.begin();
+
+        B.set(1234);
+         
+        A.commit();
+        
+        A = new AtomicAction();
+        B = new AtomicObject(u, ObjectModel.MULTIPLE);
+        
+        A.begin();
+
+        AtomicAction C = new AtomicAction();
+        
+        C.begin();
+
+        assertEquals(B.get(), 1234);
+        
+        B.set(5678);
+
+        B.terminate();
+
+        C.abort();
+        
+        assertEquals(A.commit(), ActionStatus.COMMITTED);
+    }
+    
+    @Test
+    public void testBasic () throws Exception
+    {
+        AtomicAction A = new AtomicAction();
+        AtomicObject B = new AtomicObject();
+        
+        A.begin();
+        
+        CadaverLockRecord clr = new CadaverLockRecord(null, B, A);
+        LockRecord lr = new LockRecord(B, A);
+        
+        assertTrue(clr.type() != null);
+        
+        clr.print(new PrintWriter(new ByteArrayOutputStream()));
+        
+        clr.replace(lr);
+        
+        A.abort();
+    }
+}

Added: labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/abstactrecords/LockRecordUnitTest.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/abstactrecords/LockRecordUnitTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/abstactrecords/LockRecordUnitTest.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -0,0 +1,68 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * 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,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ *
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+package com.hp.mwtests.ts.txoj.abstactrecords;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+
+import org.junit.Test;
+
+import com.arjuna.ats.arjuna.AtomicAction;
+import com.arjuna.ats.arjuna.ObjectType;
+import com.arjuna.ats.arjuna.coordinator.TwoPhaseOutcome;
+import com.arjuna.ats.arjuna.state.InputObjectState;
+import com.arjuna.ats.arjuna.state.OutputObjectState;
+import com.arjuna.ats.internal.txoj.abstractrecords.LockRecord;
+import com.hp.mwtests.ts.txoj.common.resources.AtomicObject;
+
+import static org.junit.Assert.*;
+
+public class LockRecordUnitTest
+{
+    @Test
+    public void test ()
+    {
+	LockRecord lr = new LockRecord();
+	
+	assertEquals(lr.lockType(), null);
+	assertTrue(lr.save_state(new OutputObjectState(), ObjectType.ANDPERSISTENT));
+	assertFalse(lr.restore_state(new InputObjectState(), ObjectType.ANDPERSISTENT));
+	assertEquals(lr.value(), null);
+	
+	lr.setValue(null);
+	
+	assertEquals(lr.nestedAbort(), TwoPhaseOutcome.FINISH_ERROR);
+	assertEquals(lr.nestedCommit(), TwoPhaseOutcome.FINISH_ERROR);
+	assertEquals(lr.topLevelAbort(), TwoPhaseOutcome.FINISH_ERROR);
+        assertEquals(lr.topLevelCommit(), TwoPhaseOutcome.FINISH_ERROR);
+        
+        lr = new LockRecord(new AtomicObject(), new AtomicAction());
+        
+        assertTrue(lr.toString() != null);
+        
+        lr.print(new PrintWriter(new ByteArrayOutputStream()));
+        
+        assertTrue(lr.type() != null);
+        
+        lr.merge(null);
+        lr.alter(null);
+    }
+}

Added: labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/basic/ReactivateUnitTest.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/basic/ReactivateUnitTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/basic/ReactivateUnitTest.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * 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,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ *
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+/*
+ * Copyright (C) 1998, 1999, 2000,
+ *
+ * Arjuna Solutions Limited,
+ * Newcastle upon Tyne,
+ * Tyne and Wear,
+ * UK.
+ *
+ * $Id: RecoveryTest.java 2342 2006-03-30 13:06:17Z  $
+ */
+
+package com.hp.mwtests.ts.txoj.basic;
+
+import com.arjuna.ats.arjuna.*;
+import com.arjuna.ats.arjuna.common.*;
+
+import com.hp.mwtests.ts.txoj.common.resources.AtomicObject;
+
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class ReactivateUnitTest
+{
+    @Test
+    public void test()
+    {
+        try {
+            AtomicObject obj = new AtomicObject();
+            Uid objRef = obj.get_uid();
+
+            AtomicAction A = new AtomicAction();
+
+            A.begin();
+
+            obj.set(1234);
+
+            A.commit();
+
+            AtomicObject recObj = new AtomicObject(objRef);
+
+            AtomicAction B = new AtomicAction();
+
+            B.begin();
+
+            assertEquals(1234, recObj.get());
+
+            B.abort();
+        }
+        catch (Exception ex)
+        {
+            fail(ex.toString());
+        }
+    }
+}

Added: labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/basic/TypesUnitTest.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/basic/TypesUnitTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/basic/TypesUnitTest.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -0,0 +1,80 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors 
+ * as indicated by the @author tags. 
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors. 
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A 
+ * 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,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
+ * MA  02110-1301, USA.
+ * 
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+/*
+ * Copyright (C) 1998, 1999, 2000,
+ *
+ * Arjuna Solutions Limited,
+ * Newcastle upon Tyne,
+ * Tyne and Wear,
+ * UK.  
+ *
+ * $Id: TestException.java 2342 2006-03-30 13:06:17Z  $
+ */
+
+package com.hp.mwtests.ts.txoj.basic;
+
+import java.io.PrintWriter;
+
+import org.junit.Test;
+
+import com.arjuna.ats.txoj.ConflictType;
+import com.arjuna.ats.txoj.LockMode;
+import com.arjuna.ats.txoj.LockResult;
+import com.arjuna.ats.txoj.LockStatus;
+
+import static org.junit.Assert.*;
+
+public class TypesUnitTest
+{
+    @Test
+    public void test()
+    {
+        assertEquals(ConflictType.stringForm(ConflictType.COMPATIBLE), "ConflictType.COMPATIBLE");
+        assertEquals(ConflictType.stringForm(ConflictType.CONFLICT), "ConflictType.CONFLICT");
+        assertEquals(ConflictType.stringForm(ConflictType.PRESENT), "ConflictType.PRESENT");
+        assertEquals(ConflictType.stringForm(-1), "Unknown");
+        
+        ConflictType.print(new PrintWriter(System.err), ConflictType.COMPATIBLE);
+        
+        assertEquals(LockMode.stringForm(LockMode.INTENTION_READ), "LockMode.INTENTION_READ");
+        assertEquals(LockMode.stringForm(LockMode.INTENTION_WRITE), "LockMode.INTENTION_WRITE");
+        assertEquals(LockMode.stringForm(LockMode.READ), "LockMode.READ");
+        assertEquals(LockMode.stringForm(LockMode.WRITE), "LockMode.WRITE");
+        assertEquals(LockMode.stringForm(LockMode.UPGRADE), "LockMode.UPGRADE");
+        assertEquals(LockMode.stringForm(-1), "Unknown");
+        
+        LockMode.print(new PrintWriter(System.err), LockMode.INTENTION_READ);
+        
+        assertEquals(LockResult.stringForm(LockResult.GRANTED), "LockResult.GRANTED");
+        assertEquals(LockResult.stringForm(LockResult.REFUSED), "LockResult.REFUSED");
+        assertEquals(LockResult.stringForm(LockResult.RELEASED), "LockResult.RELEASED");
+        assertEquals(LockResult.stringForm(-1), "Unknown");
+        
+        LockResult.print(new PrintWriter(System.err), LockResult.GRANTED);
+        
+        assertEquals(LockStatus.printString(LockStatus.LOCKFREE), "LockStatus.LOCKFREE");
+        assertEquals(LockStatus.printString(LockStatus.LOCKHELD), "LockStatus.LOCKHELD");
+        assertEquals(LockStatus.printString(LockStatus.LOCKRETAINED), "LockStatus.LOCKRETAINED");
+        assertEquals(LockStatus.printString(-1), "Unknown");
+        
+        LockStatus.print(new PrintWriter(System.err), LockStatus.LOCKFREE);
+    }
+}

Modified: labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/common/resources/AtomicObject.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/common/resources/AtomicObject.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/common/resources/AtomicObject.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -109,12 +109,11 @@
             printDebug = true;
     }
 
-    public void finalize () throws Throwable
+    public void terminate ()
     {
         super.terminate();
-        super.finalize();
     }
-
+    
     public void incr (int value) throws TestException
     {
         AtomicAction A = new AtomicAction();

Added: labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/recovery/RecoveryModuleUnitTest.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/recovery/RecoveryModuleUnitTest.java	                        (rev 0)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/recovery/RecoveryModuleUnitTest.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * 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,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ *
+ * (C) 2005-2006,
+ * @author JBoss Inc.
+ */
+/*
+ * Copyright (C) 1998, 1999, 2000,
+ *
+ * Arjuna Solutions Limited,
+ * Newcastle upon Tyne,
+ * Tyne and Wear,
+ * UK.
+ *
+ * $Id: RecoveryTest.java 2342 2006-03-30 13:06:17Z  $
+ */
+
+package com.hp.mwtests.ts.txoj.recovery;
+
+import org.junit.Test;
+
+import com.arjuna.ats.arjuna.AtomicAction;
+import com.arjuna.ats.arjuna.ObjectType;
+import com.arjuna.ats.arjuna.common.Uid;
+import com.arjuna.ats.arjuna.coordinator.TxControl;
+import com.arjuna.ats.arjuna.state.OutputObjectState;
+import com.arjuna.ats.internal.txoj.recovery.TORecoveryModule;
+import com.hp.mwtests.ts.txoj.common.resources.AtomicObject;
+
+import static org.junit.Assert.*;
+
+
+public class RecoveryModuleUnitTest
+{
+    @Test
+    public void test () throws Exception
+    {
+        TORecoveryModule trm = new TORecoveryModule();
+        AtomicAction A = new AtomicAction();
+        
+        A.begin();
+        
+        AtomicObject obj = new AtomicObject();
+        OutputObjectState os = new OutputObjectState();
+        Uid u = new Uid();
+        
+        assertTrue(obj.save_state(os, ObjectType.ANDPERSISTENT));
+        
+        assertTrue(TxControl.getStore().write_uncommitted(u, obj.type(), os));
+        
+        A.abort();
+        
+        trm.periodicWorkFirstPass();
+        trm.periodicWorkSecondPass();
+    }
+}

Modified: labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/recovery/RecoveryTest.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/recovery/RecoveryTest.java	2010-02-25 05:05:57 UTC (rev 31834)
+++ labs/jbosstm/trunk/ArjunaCore/txoj/tests/classes/com/hp/mwtests/ts/txoj/recovery/RecoveryTest.java	2010-02-25 13:22:00 UTC (rev 31835)
@@ -33,42 +33,73 @@
 
 import com.arjuna.ats.arjuna.*;
 import com.arjuna.ats.arjuna.common.*;
+import com.arjuna.ats.arjuna.coordinator.TxControl;
+import com.arjuna.ats.arjuna.objectstore.ObjectStore;
+import com.arjuna.ats.arjuna.state.OutputObjectState;
+import com.arjuna.ats.internal.txoj.recovery.RecoveredTransactionalObject;
 
 import com.hp.mwtests.ts.txoj.common.resources.AtomicObject;
 
 import org.junit.Test;
 import static org.junit.Assert.*;
 
+class MyRecoveredTO extends RecoveredTransactionalObject
+{
+    public MyRecoveredTO(Uid objectUid, String originalType,
+            ObjectStore objectStore)
+    {
+        super(objectUid, originalType, objectStore);
+    }
+    
+    public void replay ()
+    {
+        super.replayPhase2();
+    }
+}
+
 public class RecoveryTest
 {
     @Test
-    public void test()
+    public void testCommit () throws Exception
     {
-        try {
-            AtomicObject obj = new AtomicObject();
-            Uid objRef = obj.get_uid();
-
-            AtomicAction A = new AtomicAction();
-
-            A.begin();
-
-            obj.set(1234);
-
-            A.commit();
-
-            AtomicObject recObj = new AtomicObject(objRef);
-
-            AtomicAction B = new AtomicAction();
-
-            B.begin();
-
-            assertEquals(1234, recObj.get());
-
-            B.abort();
-        }
-        catch (Exception ex)
-        {
-            fail(ex.toString());
-        }
+        AtomicAction A = new AtomicAction();
+        
+        A.begin();
+        
+        AtomicObject obj = new AtomicObject();
+        OutputObjectState os = new OutputObjectState();
+        Uid u = new Uid();
+        
+        assertTrue(obj.save_state(os, ObjectType.ANDPERSISTENT));
+        
+        assertTrue(TxControl.getStore().write_uncommitted(u, obj.type(), os));
+        
+        MyRecoveredTO rto = new MyRecoveredTO(u, obj.type(), TxControl.getStore());
+        
+        rto.replay();
+        
+        A.abort();
     }
+    
+    @Test
+    public void testAbort () throws Exception
+    {
+        AtomicAction A = new AtomicAction();
+        
+        A.begin();
+        
+        AtomicObject obj = new AtomicObject();
+        OutputObjectState os = new OutputObjectState();
+        Uid u = new Uid();
+        
+        assertTrue(obj.save_state(os, ObjectType.ANDPERSISTENT));
+        
+        assertTrue(TxControl.getStore().write_uncommitted(u, obj.type(), os));
+        
+        MyRecoveredTO rto = new MyRecoveredTO(u, obj.type(), TxControl.getStore());
+        
+        A.abort();
+        
+        rto.replay();
+    }
 }



More information about the jboss-svn-commits mailing list