[Mulgara-svn] r572 - branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver
andrae at mulgara.org
andrae at mulgara.org
Wed Nov 21 11:16:09 UTC 2007
Author: andrae
Date: 2007-11-21 05:16:09 -0600 (Wed, 21 Nov 2007)
New Revision: 572
Modified:
branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransactionFactory.java
Log:
Adds the ability to associate a specific MulgaraTransaction with a specific
Session.
This is required to support the SUSPEND/RESUME semantics of the JTA spec.
Modified: branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransactionFactory.java
===================================================================
--- branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransactionFactory.java 2007-11-21 11:14:39 UTC (rev 571)
+++ branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransactionFactory.java 2007-11-21 11:16:09 UTC (rev 572)
@@ -20,7 +20,9 @@
// Java2 packages
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import javax.transaction.xa.XAResource;
// Third party packages
@@ -28,7 +30,9 @@
// Local packages
import org.mulgara.query.MulgaraTransactionException;
+import org.mulgara.query.QueryException;
import org.mulgara.transaction.TransactionManagerFactory;
+import org.mulgara.util.Assoc1toNMap;
/**
* Manages external transactions.
@@ -44,7 +48,7 @@
* @licence Open Software License v3.0</a>
*/
-public class MulgaraExternalTransactionFactory implements MulgaraTransactionFactory {
+public class MulgaraExternalTransactionFactory extends MulgaraTransactionFactory {
private Map<DatabaseSession, MulgaraExternalTransaction> associatedTransaction;
private Assoc1toNMap<DatabaseSession, MulgaraExternalTransaction> sessionXAMap;
@@ -68,7 +72,7 @@
MulgaraExternalTransaction xa = associatedTransaction.get(session);
if (xa == null) {
throw new MulgaraTransactionException("No externally mediated transaction associated with session");
- } else if (write && !xa.isWriteTransaction()) {
+ } else if (write && xa != writeTransaction) {
throw new MulgaraTransactionException("RO-transaction associated with session when requesting write operation");
}
@@ -78,7 +82,7 @@
}
}
- protected MulgaraTransaction createTransaction(final DatabaseSession session, boolean write)
+ protected MulgaraExternalTransaction createTransaction(final DatabaseSession session, boolean write)
throws MulgaraTransactionException {
acquireMutex();
try {
@@ -97,22 +101,34 @@
}
});
try {
- MulgaraExternalTransaction xa = new MulgaraExternalTransaction(this, session.newOperationContext(true));
- associatedTransaction.put(session, xa);
- sessionXAMap.put(session, xa);
+ writeTransaction = new MulgaraExternalTransaction(this, session.newOperationContext(true));
+ associatedTransaction.put(session, writeTransaction);
+ sessionXAMap.put(session, writeTransaction);
+
+ return writeTransaction;
} catch (Throwable th) {
manager.releaseWriteLock(session);
throw new MulgaraTransactionException("Error initiating write transaction", th);
}
} else {
- MulgaraExternalTransaction xa = new MulgaraExternalTransaction(this, session.newOperationContext(false));
- associatedTransaction.put(session, xa);
+ try {
+ MulgaraExternalTransaction xa = new MulgaraExternalTransaction(this, session.newOperationContext(false));
+ associatedTransaction.put(session, xa);
+
+ return xa;
+ } catch (QueryException eq) {
+ throw new MulgaraTransactionException("Error obtaining new read-only operation-context", eq);
+ }
}
} finally {
releaseMutex();
}
}
+ public Set<MulgaraExternalTransaction> getTransactionsForSession(DatabaseSession session) {
+ Set<MulgaraExternalTransaction> xas = sessionXAMap.getN(session);
+ return xas != null ? xas : new HashSet<MulgaraExternalTransaction>();
+ }
public XAResource getXAResource(DatabaseSession session) {
acquireMutex();
@@ -141,7 +157,8 @@
}
}
- public void transactionComplete(MulgaraExternalTransaction xa) {
+ public void transactionComplete(MulgaraExternalTransaction xa)
+ throws MulgaraTransactionException {
acquireMutex();
try {
if (xa == null) {
@@ -160,4 +177,27 @@
releaseMutex();
}
}
+
+ public boolean hasAssociatedTransaction(DatabaseSession session) {
+ return associatedTransaction.get(session) != null;
+ }
+
+ public boolean associateTransaction(DatabaseSession session, MulgaraExternalTransaction xa) {
+ if (associatedTransaction.get(session) != null) {
+ return false;
+ } else {
+ associatedTransaction.put(session, xa);
+ return true;
+ }
+ }
+
+ public void disassociateTransaction(DatabaseSession session, MulgaraExternalTransaction xa)
+ throws MulgaraTransactionException {
+ if (associatedTransaction.get(session) != xa) {
+ throw new MulgaraTransactionException(
+ "Attempt to disassociate transaction from session from wrong transaction");
+ }
+
+ associatedTransaction.remove(session);
+ }
}
More information about the Mulgara-svn
mailing list