[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