You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by da...@apache.org on 2005/02/15 03:15:20 UTC
svn commit: r153879 - in
geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction:
InstanceContext.java context/BeanTransactionContext.java
context/ContainerTransactionContext.java
context/InheritableTransactionContext.java context/TransactionContext.java
context/UnspecifiedTransactionContext.java
Author: dain
Date: Mon Feb 14 18:15:17 2005
New Revision: 153879
URL: http://svn.apache.org/viewcvs?view=rev&rev=153879
Log:
Fixed bugs with BMT transactions not correctly driving the SessionSynchronization methods.
Moved most of the code from BeanTransactionContext and ContaienrTransactionContext into InheritableTransactionContext.
Modified:
geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/InstanceContext.java
geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/BeanTransactionContext.java
geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/ContainerTransactionContext.java
geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/InheritableTransactionContext.java
geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/TransactionContext.java
geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/UnspecifiedTransactionContext.java
Modified: geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/InstanceContext.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/InstanceContext.java?view=diff&r1=153878&r2=153879
==============================================================================
--- geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/InstanceContext.java (original)
+++ geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/InstanceContext.java Mon Feb 14 18:15:17 2005
@@ -37,9 +37,9 @@
void flush() throws Throwable;
- void beforeCommit() throws Exception;
+ void beforeCommit() throws Throwable;
- void afterCommit(boolean status) throws Exception;
+ void afterCommit(boolean status) throws Throwable;
/**
* IMPORTANT INVARIANT: this should always return a map, never null.
Modified: geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/BeanTransactionContext.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/BeanTransactionContext.java?view=diff&r1=153878&r2=153879
==============================================================================
--- geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/BeanTransactionContext.java (original)
+++ geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/BeanTransactionContext.java Mon Feb 14 18:15:17 2005
@@ -17,30 +17,16 @@
package org.apache.geronimo.transaction.context;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.InvalidTransactionException;
-import javax.transaction.NotSupportedException;
-import javax.transaction.RollbackException;
-import javax.transaction.Status;
-import javax.transaction.SystemException;
-import javax.transaction.Transaction;
-
import org.apache.geronimo.transaction.ExtendedTransactionManager;
/**
- *
- *
* @version $Rev$ $Date$
*/
public class BeanTransactionContext extends InheritableTransactionContext {
- private final ExtendedTransactionManager txnManager;
- private final UnspecifiedTransactionContext oldContext;
- private Transaction transaction;
-
+ private UnspecifiedTransactionContext oldContext;
public BeanTransactionContext(ExtendedTransactionManager txnManager, UnspecifiedTransactionContext oldContext) {
- this.txnManager = txnManager;
+ super(txnManager);
this.oldContext = oldContext;
}
@@ -48,58 +34,7 @@
return oldContext;
}
- public void begin(long transactionTimeoutMilliseconds) throws SystemException, NotSupportedException {
- transaction = txnManager.begin(transactionTimeoutMilliseconds);
- }
-
- public void suspend() throws SystemException {
- Transaction suspendedTransaction = txnManager.suspend();
- assert (transaction == suspendedTransaction) : "suspend did not return our transaction";
- }
-
- public void resume() throws SystemException, InvalidTransactionException {
- txnManager.resume(transaction);
- }
-
- public void commit() throws HeuristicMixedException, HeuristicRollbackException, RollbackException, SystemException {
- try {
- try {
- flushState();
- } catch (Throwable t) {
- try {
- txnManager.rollback();
- } catch (Throwable t1) {
- log.error("Unable to roll back transaction", t1);
- }
- throw (RollbackException) new RollbackException("Could not flush state before commit").initCause(t);
- }
- txnManager.commit();
- } finally {
- connectorAfterCommit();
- transaction = null;
- }
- }
-
- public void rollback() throws SystemException {
- try {
- txnManager.rollback();
- } finally {
- connectorAfterCommit();
- transaction = null;
- }
- }
-
- //Geronimo connector framework support
-
- public boolean isActive() {
- try {
- return txnManager.getStatus() == Status.STATUS_ACTIVE;
- } catch (SystemException e) {
- return false;
- }
- }
-
- public Transaction getTransaction() {
- return transaction;
+ public void setOldContext(UnspecifiedTransactionContext oldContext) {
+ this.oldContext = oldContext;
}
}
Modified: geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/ContainerTransactionContext.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/ContainerTransactionContext.java?view=diff&r1=153878&r2=153879
==============================================================================
--- geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/ContainerTransactionContext.java (original)
+++ geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/ContainerTransactionContext.java Mon Feb 14 18:15:17 2005
@@ -17,199 +17,22 @@
package org.apache.geronimo.transaction.context;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.InvalidTransactionException;
import javax.transaction.NotSupportedException;
-import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.Transaction;
-import javax.transaction.TransactionManager;
-import javax.transaction.RollbackException;
+
+import org.apache.geronimo.transaction.ExtendedTransactionManager;
/**
* @version $Rev$ $Date$
*/
public class ContainerTransactionContext extends InheritableTransactionContext {
- private final TransactionManager txnManager;
- private Transaction transaction;
-
- private boolean threadAssociated = false;
-
- public ContainerTransactionContext(TransactionManager txnManager) throws SystemException, NotSupportedException {
- this.txnManager = txnManager;
- txnManager.begin();
- transaction = txnManager.getTransaction();
- threadAssociated = true;
- }
-
- public ContainerTransactionContext(TransactionManager txnManager, Transaction transaction) {
- this.txnManager = txnManager;
- this.transaction = transaction;
- }
-
- public void suspend() throws SystemException {
- Transaction suspendedTransaction = txnManager.suspend();
- assert (transaction == suspendedTransaction) : "suspend did not return our transaction. ours: " + transaction + ", suspended returned: " + suspendedTransaction;
- threadAssociated = false;
- }
-
- public void resume() throws SystemException, InvalidTransactionException {
- txnManager.resume(transaction);
- threadAssociated = true;
- }
-
- public void commit() throws HeuristicMixedException, HeuristicRollbackException, SystemException, RollbackException {
- boolean wasCommitted = false;
- try {
- if (checkRolledback()) {
- return;
- }
-
- flushState();
-
- if (checkRolledback()) {
- return;
- }
-
- // todo we need to flush anyone enrolled during before and then call before on any flushed...
- beforeCommit();
-
- if (checkRolledback()) {
- return;
- }
-
- txnManager.commit();
- wasCommitted = true;
- } catch (Throwable t) {
- rollbackAndThrow("Unable to commit container transaction", t);
- } finally {
- try {
- afterCommit(wasCommitted);
- } catch (Exception e) {
- rollbackAndThrow("After commit of container transaction failed", e);
- } finally {
- connectorAfterCommit();
- transaction = null;
- }
- }
- }
-
- private boolean checkRolledback() throws SystemException {
- int status;
- try {
- status = transaction.getStatus();
- } catch (SystemException e) {
- txnManager.rollback();
- throw e;
- }
-
- if (status == Status.STATUS_MARKED_ROLLBACK) {
- // we need to rollback
- txnManager.rollback();
- return true;
- } else if (status == Status.STATUS_ROLLEDBACK ||
- status == Status.STATUS_ROLLING_BACK) {
- // already rolled back
- return true;
- }
- return false;
- }
-
- private void rollbackAndThrow(String message, Throwable throwable) throws HeuristicMixedException, HeuristicRollbackException, SystemException, RollbackException {
- try {
- // just incase there is a junk transaction on the thread
- if (txnManager.getStatus() != Status.STATUS_NO_TRANSACTION) {
- txnManager.rollback();
- }
- } catch (Throwable t) {
- log.error("Unable to roll back transaction", t);
- }
-
- if (throwable instanceof HeuristicMixedException) {
- throw (HeuristicMixedException) throwable;
- } else if (throwable instanceof HeuristicRollbackException) {
- throw (HeuristicRollbackException) throwable;
- } else if (throwable instanceof RollbackException) {
- throw (RollbackException) throwable;
- } else if (throwable instanceof SystemException) {
- throw (SystemException) throwable;
- } else if (throwable instanceof Error) {
- throw (Error) throwable;
- } else if (throwable instanceof RuntimeException) {
- throw (RuntimeException) throwable;
- } else {
- throw (SystemException) new SystemException(message).initCause(throwable);
- }
+ public ContainerTransactionContext(ExtendedTransactionManager txnManager) throws SystemException, NotSupportedException {
+ super(txnManager);
+ begin(0);
}
- public void rollback() throws SystemException {
- try {
- try {
- if (txnManager.getStatus() != Status.STATUS_NO_TRANSACTION) {
- txnManager.rollback();
- }
- } finally {
- try {
- afterCommit(false);
- } catch (Throwable e) {
- try {
- // just incase there is a junk transaction on the thread
- if (txnManager.getStatus() != Status.STATUS_NO_TRANSACTION) {
- txnManager.rollback();
- }
- } catch (Throwable t1) {
- log.error("Unable to roll back transaction", t1);
- }
-
- if (e instanceof SystemException) {
- throw (SystemException) e;
- } else if (e instanceof Error) {
- throw (Error) e;
- } else if (e instanceof RuntimeException) {
- throw (RuntimeException) e;
- }
- throw (SystemException) new SystemException("After commit of container transaction failed").initCause(e);
- }
- }
- } finally {
- connectorAfterCommit();
- transaction = null;
- }
- }
-
- public boolean isThreadAssociated() {
- return threadAssociated;
- }
-
- //Geronimo connector framework support
- public boolean isActive() {
- try {
- return txnManager.getStatus() == Status.STATUS_ACTIVE;
- } catch (SystemException e) {
- return false;
- }
- }
-
- public Transaction getTransaction() {
- return transaction;
- }
-
- public void setRollbackOnly() throws IllegalStateException, SystemException {
- if (transaction == null) {
- throw new IllegalStateException("There is no transaction in progress.");
- }
- transaction.setRollbackOnly();
- }
-
- public boolean getRollbackOnly() throws SystemException {
- if (transaction == null) {
- throw new IllegalStateException("There is no transaction in progress.");
- }
-
- int status = transaction.getStatus();
- return (status == Status.STATUS_MARKED_ROLLBACK ||
- status == Status.STATUS_ROLLEDBACK ||
- status == Status.STATUS_ROLLING_BACK);
+ public ContainerTransactionContext(ExtendedTransactionManager txnManager, Transaction transaction) {
+ super(txnManager, transaction);
}
}
Modified: geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/InheritableTransactionContext.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/InheritableTransactionContext.java?view=diff&r1=153878&r2=153879
==============================================================================
--- geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/InheritableTransactionContext.java (original)
+++ geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/InheritableTransactionContext.java Mon Feb 14 18:15:17 2005
@@ -17,7 +17,16 @@
package org.apache.geronimo.transaction.context;
-import org.apache.geronimo.transaction.context.TransactionContext;
+import javax.transaction.SystemException;
+import javax.transaction.Status;
+import javax.transaction.Transaction;
+import javax.transaction.InvalidTransactionException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.RollbackException;
+
+import org.apache.geronimo.transaction.ExtendedTransactionManager;
/**
*
@@ -25,4 +34,180 @@
* @version $Rev$ $Date$
*/
public abstract class InheritableTransactionContext extends TransactionContext {
+ private final ExtendedTransactionManager txnManager;
+ private Transaction transaction;
+ private boolean threadAssociated = false;
+
+ protected InheritableTransactionContext(ExtendedTransactionManager txnManager) {
+ this.txnManager = txnManager;
+ }
+
+ protected InheritableTransactionContext(ExtendedTransactionManager txnManager, Transaction transaction) {
+ this.txnManager = txnManager;
+ this.transaction = transaction;
+ }
+
+ public boolean isThreadAssociated() {
+ return threadAssociated;
+ }
+
+ public Transaction getTransaction() {
+ return transaction;
+ }
+
+ public boolean isActive() {
+ try {
+ return txnManager.getStatus() == Status.STATUS_ACTIVE;
+ } catch (SystemException e) {
+ return false;
+ }
+ }
+
+ public boolean getRollbackOnly() throws SystemException {
+ Transaction transaction = getTransaction();
+ if (transaction == null) {
+ throw new IllegalStateException("There is no transaction in progress.");
+ }
+
+ int status = transaction.getStatus();
+ return (status == Status.STATUS_MARKED_ROLLBACK ||
+ status == Status.STATUS_ROLLEDBACK ||
+ status == Status.STATUS_ROLLING_BACK);
+ }
+
+ public void setRollbackOnly() throws IllegalStateException, SystemException {
+ Transaction transaction = getTransaction();
+ if (transaction == null) {
+ throw new IllegalStateException("There is no transaction in progress.");
+ }
+ transaction.setRollbackOnly();
+ }
+
+ public void begin(long transactionTimeoutMilliseconds) throws SystemException, NotSupportedException {
+ transaction = txnManager.begin(transactionTimeoutMilliseconds);
+ threadAssociated = true;
+ }
+
+ public void suspend() throws SystemException {
+ Transaction suspendedTransaction = txnManager.suspend();
+ assert (transaction == suspendedTransaction) : "suspend did not return our transaction. ours: " + transaction + ", suspended returned: " + suspendedTransaction;
+ threadAssociated = false;
+ }
+
+ public void resume() throws SystemException, InvalidTransactionException {
+ txnManager.resume(transaction);
+ threadAssociated = true;
+ }
+
+ public void commit() throws HeuristicMixedException, HeuristicRollbackException, SystemException, RollbackException {
+ boolean wasCommitted = false;
+ try {
+ checkRolledback();
+
+ flushState();
+
+ checkRolledback();
+
+ // todo we need to flush anyone enrolled during before and then call before on any flushed...
+ beforeCommit();
+
+ checkRolledback();
+
+ txnManager.commit();
+ wasCommitted = true;
+ } catch (Throwable t) {
+ rollbackAndThrow("Unable to commit container transaction", t);
+ } finally {
+ try {
+ afterCommit(wasCommitted);
+ } catch (Throwable e) {
+ rollbackAndThrow("After commit of container transaction failed", e);
+ } finally {
+ connectorAfterCommit();
+ transaction = null;
+ }
+ }
+ }
+
+ private void checkRolledback() throws SystemException, RollbackException {
+ int status;
+ try {
+ status = transaction.getStatus();
+ } catch (SystemException e) {
+ txnManager.rollback();
+ throw e;
+ }
+
+ if (status == Status.STATUS_MARKED_ROLLBACK) {
+ // we need to rollback
+ txnManager.rollback();
+ throw new RollbackException();
+ } else if (status == Status.STATUS_ROLLEDBACK ||
+ status == Status.STATUS_ROLLING_BACK) {
+ // already rolled back
+ throw new RollbackException();
+ }
+ }
+
+ private void rollbackAndThrow(String message, Throwable throwable) throws HeuristicMixedException, HeuristicRollbackException, SystemException, RollbackException {
+ try {
+ // just incase there is a junk transaction on the thread
+ if (txnManager.getStatus() != Status.STATUS_NO_TRANSACTION) {
+ txnManager.rollback();
+ }
+ } catch (Throwable t) {
+ log.error("Unable to roll back transaction", t);
+ }
+
+ if (throwable instanceof HeuristicMixedException) {
+ throw (HeuristicMixedException) throwable;
+ } else if (throwable instanceof HeuristicRollbackException) {
+ throw (HeuristicRollbackException) throwable;
+ } else if (throwable instanceof RollbackException) {
+ throw (RollbackException) throwable;
+ } else if (throwable instanceof SystemException) {
+ throw (SystemException) throwable;
+ } else if (throwable instanceof Error) {
+ throw (Error) throwable;
+ } else if (throwable instanceof RuntimeException) {
+ throw (RuntimeException) throwable;
+ } else {
+ throw (SystemException) new SystemException(message).initCause(throwable);
+ }
+ }
+
+ public void rollback() throws SystemException {
+ try {
+ try {
+ if (txnManager.getStatus() != Status.STATUS_NO_TRANSACTION) {
+ txnManager.rollback();
+ }
+ } finally {
+ try {
+ afterCommit(false);
+ } catch (Throwable e) {
+ try {
+ // just incase there is a junk transaction on the thread
+ if (txnManager.getStatus() != Status.STATUS_NO_TRANSACTION) {
+ txnManager.rollback();
+ }
+ } catch (Throwable t1) {
+ log.error("Unable to roll back transaction", t1);
+ }
+
+ if (e instanceof SystemException) {
+ throw (SystemException) e;
+ } else if (e instanceof Error) {
+ throw (Error) e;
+ } else if (e instanceof RuntimeException) {
+ throw (RuntimeException) e;
+ }
+ throw (SystemException) new SystemException("After commit of container transaction failed").initCause(e);
+ }
+ }
+ } finally {
+ connectorAfterCommit();
+ transaction = null;
+ }
+ }
}
Modified: geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/TransactionContext.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/TransactionContext.java?view=diff&r1=153878&r2=153879
==============================================================================
--- geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/TransactionContext.java (original)
+++ geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/TransactionContext.java Mon Feb 14 18:15:17 2005
@@ -110,7 +110,7 @@
}
}
- protected void beforeCommit() throws Exception {
+ protected void beforeCommit() throws Throwable {
// @todo allow for enrollment during pre-commit
ArrayList toFlush = new ArrayList(associatedContexts.values());
for (Iterator i = toFlush.iterator(); i.hasNext();) {
@@ -119,7 +119,7 @@
}
}
- protected void afterCommit(boolean status) throws Exception {
+ protected void afterCommit(boolean status) throws Throwable {
Throwable firstThrowable = null;
ArrayList toFlush = new ArrayList(associatedContexts.values());
for (Iterator i = toFlush.iterator(); i.hasNext();) {
Modified: geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/UnspecifiedTransactionContext.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/UnspecifiedTransactionContext.java?view=diff&r1=153878&r2=153879
==============================================================================
--- geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/UnspecifiedTransactionContext.java (original)
+++ geronimo/trunk/modules/transaction/src/java/org/apache/geronimo/transaction/context/UnspecifiedTransactionContext.java Mon Feb 14 18:15:17 2005
@@ -18,14 +18,12 @@
package org.apache.geronimo.transaction.context;
import javax.transaction.Transaction;
+import javax.transaction.SystemException;
import org.apache.geronimo.transaction.ConnectionReleaser;
-import org.apache.geronimo.transaction.context.TransactionContext;
/**
- *
- *
* @version $Rev$ $Date$
*/
public class UnspecifiedTransactionContext extends TransactionContext {
@@ -53,7 +51,6 @@
public void rollback() {
}
- //Geronimo connector framework support
public void setManagedConnectionInfo(ConnectionReleaser key, Object info) {
}