[Mulgara-svn] r573 - branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver
andrae at mulgara.org
andrae at mulgara.org
Wed Nov 21 11:18:54 UTC 2007
Author: andrae
Date: 2007-11-21 05:18:53 -0600 (Wed, 21 Nov 2007)
New Revision: 573
Modified:
branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraXAResource.java
Log:
Added code to handle session/transaction association/disassociation.
Also includes various compile-error fixes.
Modified: branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraXAResource.java
===================================================================
--- branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraXAResource.java 2007-11-21 11:16:09 UTC (rev 572)
+++ branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraXAResource.java 2007-11-21 11:18:53 UTC (rev 573)
@@ -19,12 +19,16 @@
package org.mulgara.resolver;
// Java2 packages
+import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
// Third party packages
import org.apache.log4j.Logger;
// Local packages
+import org.mulgara.query.MulgaraTransactionException;
+import org.mulgara.util.Assoc1toNMap;
/**
* Provides an external JTA-compliant TransactionManager with the ability to
@@ -42,6 +46,8 @@
*/
public class MulgaraXAResource implements XAResource {
+ private static final Logger logger =
+ Logger.getLogger(MulgaraXAResource.class.getName());
private MulgaraExternalTransactionFactory factory;
private DatabaseSession session;
@@ -91,10 +97,10 @@
// We are not allowed to forget this transaction if we completed
// heuristically.
switch (ex.errorCode) {
- case XA_HEURHAZ:
- case XA_HEURCOM:
- case XA_HEURRB:
- case XA_HEURMIX:
+ case XAException.XA_HEURHAZ:
+ case XAException.XA_HEURCOM:
+ case XAException.XA_HEURRB:
+ case XAException.XA_HEURMIX:
throw ex;
default:
xa2xid.remove1(xa);
@@ -119,7 +125,7 @@
}
switch (flags) {
case TMFAIL:
- xa.setRollbackOnly();
+ xa.rollback(xid);
break;
case TMSUCCESS:
break;
@@ -130,17 +136,27 @@
throw new XAException(XAException.XAER_INVAL);
}
- factory.disassociate(session, xa);
+ try {
+ factory.disassociateTransaction(session, xa);
+ } catch (MulgaraTransactionException em) {
+ logger.error("Error disassociating transaction from session", em);
+ throw new XAException(XAException.XAER_PROTO);
+ }
}
- public void forget(Xid xid) {
+ public void forget(Xid xid) throws XAException {
MulgaraExternalTransaction xa = xa2xid.get1(xid);
if (xa == null) {
throw new XAException(XAException.XAER_NOTA);
}
try {
- if (!xa.isHeuristicRollbackOnly()) {
- xa.abortTransaction("External XA Manager specified 'forget'", new Throwable());
+ if (!xa.isHeuristicallyRollbacked()) {
+ try {
+ xa.abortTransaction("External XA Manager specified 'forget'", new Throwable());
+ } catch (MulgaraTransactionException em) {
+ logger.error("Failed to abort transaction in forget", em);
+ throw new XAException(XAException.XAER_RMERR);
+ }
}
} finally {
xa2xid.remove1(xa);
@@ -148,11 +164,12 @@
}
public int getTransactionTimeout() {
- FIXME!
+ return 3600;
}
public boolean isSameRM(XAResource xares) {
- FIXME!
+ return false; // FIXME: We need another interface here, as well as some way
+ // of identifying a local Mulgara instance.
}
@@ -165,6 +182,8 @@
}
xa.prepare(xid);
+
+ return XA_OK;
}
/**
@@ -188,6 +207,7 @@
public boolean setTransactionTimeout(int seconds) {
+ return false;
}
public void start(Xid xid, int flags) throws XAException {
@@ -195,28 +215,35 @@
case TMNOFLAGS:
if (xa2xid.containsN(xid)) {
throw new XAException(XAException.XAER_DUPID);
- } else if (existing transaction(session)) {
+ } else if (factory.hasAssociatedTransaction(session)) {
throw new XAException(XAException.XA_RBDEADLOCK);
} else {
- MulgaraTransaction xa = factory.createTransaction(session, isWrite);
- xa2xid.put(xa, xid);
+ // FIXME: Need to consider read-only transactions here.
+ try {
+ MulgaraExternalTransaction xa = factory.createTransaction(session, true);
+ xa2xid.put(xa, xid);
+ } catch (MulgaraTransactionException em) {
+ logger.error("Failed to create transaction", em);
+ throw new XAException(XAException.XAER_RMFAIL);
+ }
}
break;
case TMJOIN:
- if (!existing transaction(session)) {
+ if (!factory.hasAssociatedTransaction(session)) {
throw new XAException(XAException.XAER_NOTA);
} else {
- FIXME! // Do stuff.
+ // FIXME
+ throw new XAException("Need to finalise understanding of semantics of TMJOIN");
}
- break;
+ //break;
case TMRESUME:
MulgaraExternalTransaction xa = xa2xid.get1(xid);
if (xa == null) {
throw new XAException(XAException.XAER_NOTA);
- } else if (xa.isRollbackOnly()) {
+ } else if (xa.isRollbacked()) {
throw new XAException(XAException.XA_RBROLLBACK);
} else {
- if (!factory.associate(session, xa)) {
+ if (!factory.associateTransaction(session, xa)) {
// session already associated with a transaction.
throw new XAException(XAException.XAER_PROTO);
}
@@ -229,6 +256,6 @@
* Called on session close to clean-up any remaining transactions.
*/
public void close() {
- FIXME!
+ factory.closingSession(session);
}
}
More information about the Mulgara-svn
mailing list