/*
 * XAPool: Open Source XA JDBC Pool
 * Copyright (C) 2003 Objectweb.org
 * Initial Developer: Lutris Technologies Inc.
 * Contact: xapool-public@lists.debian-sf.objectweb.org
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY 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 along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
 * USA
 */
package org.enhydra.jdbc.instantdb;

import org.enhydra.jdbc.standard.StandardXAConnection;
import org.enhydra.jdbc.standard.StandardXADataSource;
import org.enhydra.jdbc.standard.StandardXAStatefulConnection;
import org.enhydra.instantdb.jdbc.ConnectionExtensions;

import javax.transaction.xa.XAException;
import javax.transaction.xa.Xid;
import javax.transaction.xa.XAResource;
import java.sql.SQLException;


Provides and InstantDB specific instance of StandardXAConnection. Almost all of the required functionality is provided curtesy of the generic super class which looks after most of the transaction state management. InstantDB's own Transaction object is informed that it is part of a global transaction and looks after the detail thereafter.
/** * Provides and InstantDB specific instance of StandardXAConnection. Almost all of * the required functionality is provided curtesy of the generic super class * which looks after most of the transaction state management. InstantDB's * own Transaction object is informed that it is part of a global transaction * and looks after the detail thereafter. */
public final class IdbXAConnection extends StandardXAConnection {
Creates the first free connection.
/** * Creates the first free connection. */
public IdbXAConnection (StandardXADataSource dataSource, String user, String password) throws SQLException { super (dataSource, user, password); // creates the first Connection object }
Associates this XAConnection with a global transaction. This is the only method which can associate the current connection with a global transaction. It acts only on the current connection which must have been previously established using getConnection.
/** * Associates this XAConnection with a global transaction. This * is the only method which can associate the current connection * with a global transaction. It acts only on the current * connection which must have been previously established using * getConnection. */
public void start(Xid xid, int flags) throws XAException { doStart (xid, flags); // do state checks and set state curCon.commitOnPrepare = false; // we will do a REAL prepare ConnectionExtensions conExt = (ConnectionExtensions)curCon.con; // get the InstantDB connection conExt.startGlobalTransaction (xid); // associate the transaction with the global TX curCon = null; // no longer owned by this object con = null; // ditto } // We don't override "end" as all it does is change the state of a connection.
Prepares to perform a commit.
/** * Prepares to perform a commit. */
public int prepare(Xid xid) throws XAException { StandardXAStatefulConnection stateCon = checkPreparedState (xid);// do generic state checking etc. ConnectionExtensions con = (ConnectionExtensions)stateCon.con; // get the InstantDB connection int status = con.prepare(); // prepare to commit if (status == XA_RDONLY) { // if transaction didn't update the database xaDataSource.freeConnection (xid, false); // free the connection } // if return status; } // We don't override commit or rollback. Connection.commit and // Connection.rollback already know that they're part of a global // transaction and will behave accordingly.
Checks to see if two XAResource objects correspond to the same Resource Manager. This can go one better than its super class as it can actually check the InstantDB database objects.
/** * Checks to see if two XAResource objects correspond to the * same Resource Manager. This can go one better than its * super class as it can actually check the InstantDB database * objects. */
public boolean isSameRM(XAResource xares) throws XAException { if (super.isSameRM(xares)) { // if super class can figure it out return true; // then accept its conclusion } // if if (xares instanceof IdbXAConnection) { // if it's one of our wrappers IdbXAConnection xac = (IdbXAConnection)xares; // cast to something more convenient IdbXADataSource cmpds = (IdbXADataSource)xac.dataSource;// get the data source to compare IdbXADataSource ds = (IdbXADataSource)dataSource;// get our own data source if (ds.databaseId.equals (cmpds.databaseId)) { // if using the same database return true; // they're the same resource } // if } // if return false; } }