package org.wso2.carbon.atomikos;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.InvalidTransactionException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.atomikos.icatch.jta.UserTransactionFactory;
import com.atomikos.icatch.jta.UserTransactionManager;
import com.atomikos.icatch.system.Configuration;
public class TransactionFactory extends UserTransactionFactory implements ObjectFactory {
private static Log log = LogFactory.getLog(TransactionFactory.class);
private static UserTransactionManager txManager;
public static void initTxManager() {
try {
if (txManager == null) {
log.info("Starting Atomikos Transaction Manager " + Configuration.getVersion());
txManager = new UserTransactionManager();
}
txManager.init();
} catch (SystemException e) {
log.error("Error in initializing Atomikos Transaction Manager", e);
}
}
public static void closeTxManager() {
if (txManager != null) {
log.info("Shutting down Atomikos Transaction Manager");
txManager.close();
txManager = null;
}
}
@SuppressWarnings("unchecked")
@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx,
Hashtable environment) throws Exception {
UserTransaction userTx = (UserTransaction) super.getObjectInstance(obj, name, nameCtx, environment);
return new TransactionManagerWrapper(userTx);
}
private class TransactionManagerWrapper implements UserTransaction, TransactionManager {
private UserTransaction userTx;
public TransactionManagerWrapper(UserTransaction userTx) {
this.userTx = userTx;
}
@Override
public void begin() throws NotSupportedException, SystemException {
this.userTx.begin();
}
@Override
public void commit() throws HeuristicMixedException,
HeuristicRollbackException, IllegalStateException,
RollbackException, SecurityException, SystemException {
this.userTx.commit();
}
@Override
public int getStatus() throws SystemException {
return this.userTx.getStatus();
}
@Override
public void rollback() throws IllegalStateException, SecurityException,
SystemException {
this.userTx.rollback();
}
@Override
public void setRollbackOnly() throws IllegalStateException,
SystemException {
this.userTx.setRollbackOnly();
}
@Override
public void setTransactionTimeout(int secs) throws SystemException {
this.userTx.setTransactionTimeout(secs);
}
@Override
public Transaction getTransaction() throws SystemException {
return txManager.getTransaction();
}
@Override
public void resume(Transaction tx) throws IllegalStateException,
InvalidTransactionException, SystemException {
txManager.resume(tx);
}
@Override
public Transaction suspend() throws SystemException {
return txManager.suspend();
}
}
}