[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