[jboss-svn-commits] JBL Code SVN: r37848 - in labs/jbosstm/branches/JBOSSTS_4_16: ArjunaJTA/jta/tests/classes/com/hp/mwtests/ts/jta/basic and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jan 18 08:44:52 EST 2012


Author: tomjenkinson
Date: 2012-01-18 08:44:51 -0500 (Wed, 18 Jan 2012)
New Revision: 37848

Added:
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/tests/classes/com/hp/mwtests/ts/jta/jts/basic/TransactionSynchronizationRegistryTest.java
Modified:
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionSynchronizationRegistryImple.java
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/tests/classes/com/hp/mwtests/ts/jta/basic/TransactionSynchronizationRegistryTest.java
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionSynchronizationRegistryImple.java
Log:
JBTM-1023 updated with the checks that during aftercompletion cannot access the resources in a TSR

Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionSynchronizationRegistryImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionSynchronizationRegistryImple.java	2012-01-17 15:21:07 UTC (rev 37847)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionSynchronizationRegistryImple.java	2012-01-18 13:44:51 UTC (rev 37848)
@@ -22,18 +22,24 @@
  */
 package com.arjuna.ats.internal.jta.transaction.arjunacore;
 
-import com.arjuna.ats.jta.logging.jtaLogger;
-import com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple;
-
-import javax.naming.Context;
-import javax.naming.Name;
-import javax.naming.spi.ObjectFactory;
-import javax.transaction.*;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
 import java.util.Hashtable;
 
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.spi.ObjectFactory;
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionSynchronizationRegistry;
+
+import com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple;
+import com.arjuna.ats.jta.logging.jtaLogger;
+
 /**
  * Implementation of the TransactionSynchronizationRegistry interface, in line with the JTA 1.1 specification.
  *
@@ -220,9 +226,13 @@
             throw new RuntimeException(jtaLogger.i18NLogger.get_transaction_arjunacore_systemexception(), e);
         }
 
-        if(transactionImple == null)
-        {
-            throw new IllegalStateException();
+        try {
+            if (transactionImple == null
+                    || (transactionImple.getStatus() != Status.STATUS_ACTIVE && transactionImple.getStatus() != Status.STATUS_MARKED_ROLLBACK)) {
+                throw new IllegalStateException("No transaction is running");
+            }
+        } catch (SystemException e) {
+            throw new IllegalStateException("Could not get the status of a transaction");
         }
 
         return transactionImple;

Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/tests/classes/com/hp/mwtests/ts/jta/basic/TransactionSynchronizationRegistryTest.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/tests/classes/com/hp/mwtests/ts/jta/basic/TransactionSynchronizationRegistryTest.java	2012-01-17 15:21:07 UTC (rev 37847)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/tests/classes/com/hp/mwtests/ts/jta/basic/TransactionSynchronizationRegistryTest.java	2012-01-18 13:44:51 UTC (rev 37848)
@@ -20,21 +20,25 @@
  */
 package com.hp.mwtests.ts.jta.basic;
 
-import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
+import javax.transaction.Synchronization;
 import javax.transaction.TransactionSynchronizationRegistry;
 
-import com.hp.mwtests.ts.jta.common.Synchronization;
 import org.junit.Test;
-import static org.junit.Assert.*;
 
+import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple;
+
 /**
  * Exercise the TransactionSynchronizationRegistry implementation.
- *
+ * 
  * @author Jonathan Halliday (jonathan.halliday at redhat.com) 2010-03
  */
-public class TransactionSynchronizationRegistryTest
-{
+public class TransactionSynchronizationRegistryTest {
     @Test
     public void testTSR() throws Exception {
 
@@ -57,7 +61,7 @@
         tsr.putResource(key, value);
         assertEquals(value, tsr.getResource(key));
 
-        Synchronization synchronization = new Synchronization();
+        Synchronization synchronization = new com.hp.mwtests.ts.jta.common.Synchronization();
         tsr.registerInterposedSynchronization(synchronization);
 
         assertFalse(tsr.getRollbackOnly());
@@ -67,7 +71,7 @@
         boolean gotExpectedException = false;
         try {
             tsr.registerInterposedSynchronization(synchronization);
-        } catch(IllegalStateException e) {
+        } catch (IllegalStateException e) {
             gotExpectedException = true;
         }
         assertTrue(gotExpectedException);
@@ -75,6 +79,74 @@
         tm.rollback();
 
         assertEquals(tm.getStatus(), tsr.getTransactionStatus());
-        
     }
+
+    @Test
+    public void testTSRUseAfterCompletion() throws Exception {
+
+        javax.transaction.TransactionManager tm = com.arjuna.ats.jta.TransactionManager.transactionManager();
+
+        final CompletionCountLock ccl = new CompletionCountLock(2);
+        tm.begin();
+        final TransactionSynchronizationRegistry tsr = new TransactionSynchronizationRegistryImple();
+        tsr.registerInterposedSynchronization(new Synchronization() {
+            @Override
+            public void afterCompletion(int status) {
+                String key = "key";
+                Object value = new Object();
+                try {
+                    tsr.getResource(key);
+                    ccl.incrementFailedCount();
+                } catch (IllegalStateException ise) {
+                    // Expected
+                    ccl.incrementCount();
+                }
+                try {
+                    tsr.putResource(key, value);
+                    ccl.incrementFailedCount();
+                } catch (IllegalStateException ise) {
+                    // Expected
+                    ccl.incrementCount();
+                }
+            }
+
+            @Override
+            public void beforeCompletion() {
+                // TODO Auto-generated method stub
+
+            }
+        });
+
+        tm.commit();
+
+        assertTrue(ccl.waitForCompletion());
+
+    }
+
+    private class CompletionCountLock {
+        private int successCount;
+        private int failedCount;
+        private int maxCount;
+
+        public CompletionCountLock(int maxCount) {
+            this.maxCount = maxCount;
+        }
+
+        public synchronized boolean waitForCompletion() throws InterruptedException {
+            while (successCount + failedCount < maxCount) {
+                wait();
+            }
+            return failedCount == 0;
+        }
+
+        public synchronized void incrementCount() {
+            this.successCount++;
+            this.notify();
+        }
+
+        public synchronized void incrementFailedCount() {
+            this.failedCount++;
+            this.notify();
+        }
+    }
 }

Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java	2012-01-17 15:21:07 UTC (rev 37847)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java	2012-01-18 13:44:51 UTC (rev 37848)
@@ -79,6 +79,7 @@
 import org.omg.CosTransactions.NoTransaction;
 import org.omg.CORBA.INVALID_TRANSACTION;
 import org.omg.CORBA.TRANSACTION_ROLLEDBACK;
+import org.omg.CORBA.TRANSACTION_UNAVAILABLE;
 import org.omg.CORBA.UNKNOWN;
 
 /**
@@ -1126,6 +1127,7 @@
 	{
 		TransactionImple tx = null;
 
+		try {
 		ControlWrapper otx = OTSImpleManager.current().getControlWrapper();
 
 		if (otx != null)
@@ -1164,6 +1166,12 @@
 		        }
 		    }
 		}
+		} catch (TRANSACTION_UNAVAILABLE e) {
+            if (e.minor != 1) {
+                throw e;
+            }
+        }
+        
 
 		return tx;
 	}

Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionSynchronizationRegistryImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionSynchronizationRegistryImple.java	2012-01-17 15:21:07 UTC (rev 37847)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionSynchronizationRegistryImple.java	2012-01-18 13:44:51 UTC (rev 37848)
@@ -30,6 +30,7 @@
 import javax.naming.Name;
 import javax.naming.spi.ObjectFactory;
 import javax.transaction.*;
+
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
@@ -223,9 +224,13 @@
             throw new RuntimeException(jtaxLogger.i18NLogger.get_jtax_transaction_jts_systemexception(), e);
         }
 
-        if(transactionImple == null)
-        {
-            throw new IllegalStateException();
+        try {
+            if (transactionImple == null
+                    || (transactionImple.getStatus() != Status.STATUS_ACTIVE && transactionImple.getStatus() != Status.STATUS_MARKED_ROLLBACK)) {
+                throw new IllegalStateException("No transaction is running");
+            }
+        } catch (SystemException e) {
+            throw new IllegalStateException("Could not get the status of a transaction");
         }
 
         return transactionImple;

Added: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/tests/classes/com/hp/mwtests/ts/jta/jts/basic/TransactionSynchronizationRegistryTest.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/tests/classes/com/hp/mwtests/ts/jta/jts/basic/TransactionSynchronizationRegistryTest.java	                        (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/jtax/tests/classes/com/hp/mwtests/ts/jta/jts/basic/TransactionSynchronizationRegistryTest.java	2012-01-18 13:44:51 UTC (rev 37848)
@@ -0,0 +1,185 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and/or its affiliates,
+ * 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) 2010,
+ * @author JBoss, by Red Hat.
+ */
+package com.hp.mwtests.ts.jta.jts.basic;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import javax.transaction.Synchronization;
+import javax.transaction.TransactionSynchronizationRegistry;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.omg.CORBA.SystemException;
+import org.omg.CORBA.ORBPackage.InvalidName;
+
+import com.arjuna.ats.internal.jta.transaction.jts.TransactionSynchronizationRegistryImple;
+import com.arjuna.ats.internal.jts.ORBManager;
+import com.arjuna.ats.jta.common.jtaPropertyManager;
+import com.arjuna.orbportability.OA;
+import com.arjuna.orbportability.ORB;
+import com.arjuna.orbportability.RootOA;
+
+/**
+ * Exercise the TransactionSynchronizationRegistry implementation.
+ */
+public class TransactionSynchronizationRegistryTest {
+    private ORB myORB;
+    private RootOA myOA;
+
+    @Before
+    public void setup() throws InvalidName, SystemException {
+        myORB = ORB.getInstance("test");
+        myOA = OA.getRootOA(myORB);
+
+        myORB.initORB(new String[] {}, null);
+        myOA.initOA();
+
+        ORBManager.setORB(myORB);
+        ORBManager.setPOA(myOA);
+
+        jtaPropertyManager.getJTAEnvironmentBean().setTransactionManagerClassName(
+                com.arjuna.ats.internal.jta.transaction.jts.TransactionManagerImple.class.getName());
+        jtaPropertyManager.getJTAEnvironmentBean().setUserTransactionClassName(
+                com.arjuna.ats.internal.jta.transaction.jts.UserTransactionImple.class.getName());
+    }
+
+    @After
+    public void teardown() {
+        myOA.destroy();
+        myORB.shutdown();
+    }
+
+    @Test
+    public void testTSR() throws Exception {
+
+        javax.transaction.TransactionManager tm = com.arjuna.ats.jta.TransactionManager.transactionManager();
+
+        TransactionSynchronizationRegistry tsr = new TransactionSynchronizationRegistryImple();
+
+        assertNull(tsr.getTransactionKey());
+
+        assertEquals(tm.getStatus(), tsr.getTransactionStatus());
+
+        tm.begin();
+
+        assertNotNull(tsr.getTransactionKey());
+        assertEquals(tm.getStatus(), tsr.getTransactionStatus());
+
+        String key = "key";
+        Object value = new Object();
+        assertNull(tsr.getResource(key));
+        tsr.putResource(key, value);
+        assertEquals(value, tsr.getResource(key));
+
+        Synchronization synchronization = new com.hp.mwtests.ts.jta.jts.common.Synchronization();
+        tsr.registerInterposedSynchronization(synchronization);
+
+        assertFalse(tsr.getRollbackOnly());
+        tsr.setRollbackOnly();
+        assertTrue(tsr.getRollbackOnly());
+
+        boolean gotExpectedException = false;
+        try {
+            tsr.registerInterposedSynchronization(synchronization);
+        } catch (IllegalStateException e) {
+            gotExpectedException = true;
+        }
+        assertTrue(gotExpectedException);
+
+        tm.rollback();
+
+        assertEquals(tm.getStatus(), tsr.getTransactionStatus());
+    }
+
+    @Test
+    public void testTSRUseAfterCompletion() throws Exception {
+
+        javax.transaction.TransactionManager tm = com.arjuna.ats.jta.TransactionManager.transactionManager();
+
+        final CompletionCountLock ccl = new CompletionCountLock(2);
+        tm.begin();
+        final TransactionSynchronizationRegistry tsr = new TransactionSynchronizationRegistryImple();
+        tsr.registerInterposedSynchronization(new Synchronization() {
+            @Override
+            public void afterCompletion(int status) {
+                String key = "key";
+                Object value = new Object();
+                try {
+                    tsr.getResource(key);
+                    ccl.incrementFailedCount();
+                } catch (IllegalStateException ise) {
+                    // Expected
+                    ccl.incrementCount();
+                }
+                try {
+                    tsr.putResource(key, value);
+                    ccl.incrementFailedCount();
+                } catch (IllegalStateException ise) {
+                    // Expected
+                    ccl.incrementCount();
+                }
+            }
+
+            @Override
+            public void beforeCompletion() {
+                // TODO Auto-generated method stub
+
+            }
+        });
+
+        tm.commit();
+
+        assertTrue(ccl.waitForCompletion());
+
+    }
+
+    private class CompletionCountLock {
+        private int successCount;
+        private int failedCount;
+        private int maxCount;
+
+        public CompletionCountLock(int maxCount) {
+            this.maxCount = maxCount;
+        }
+
+        public synchronized boolean waitForCompletion() throws InterruptedException {
+            while (successCount + failedCount < maxCount) {
+                wait();
+            }
+            return failedCount == 0;
+        }
+
+        public synchronized void incrementCount() {
+            this.successCount++;
+            this.notify();
+        }
+
+        public synchronized void incrementFailedCount() {
+            this.failedCount++;
+            this.notify();
+        }
+    }
+}



More information about the jboss-svn-commits mailing list