/*
 * Created on: Dec 17, 2004
 * Author: Dibyendu Majumdar
 */
package com.ponl.framework.dao.ibatis;

import java.util.Properties;

import javax.sql.DataSource;

import com.ibatis.common.exception.NestedRuntimeException;
import com.ibatis.dao.client.DaoTransaction;
import com.ponl.framework.tm.IDataSourceFactory;

/**
 * <p>
 * DaoTransactionManager: 
 * </p> 
 *
 * <pre>
 * History:
 * Dec 17, 2004 DM Created
 * </pre>
 * 
 * @author Dibyendu Majumdar
 * @version 
 * @since TCA 3.0
 */
public class DaoTransactionManager implements
        com.ibatis.dao.engine.transaction.DaoTransactionManager, Constants {

    DataSource dataSource;
    boolean globalCommit = false;
    
    public void configure(Properties props) {
        String value = props.getProperty(GLOBAL_COMMIT);
        if (value != null && "TRUE".equalsIgnoreCase(value)) {
            globalCommit = true;
        }
        String factoryClass = props.getProperty(DATASOURCE_FACTORY_CLASS);
        if (factoryClass != null) {
            try {
                IDataSourceFactory factory = (IDataSourceFactory) Class.forName(factoryClass).newInstance();
                dataSource = factory.getDataSource(props);
            } catch (Exception e) {
                throw new NestedRuntimeException("OracleXADataSourceFactory: Unable to load factory class - " + e, e);
            }
        }
        else {
            throw new NestedRuntimeException("OracleXADataSourceFactory: Property " + DATASOURCE_FACTORY_CLASS + " not defined.");
        }
    }

    public DaoTransaction startTransaction() {
        return new GenericDaoTransaction(dataSource, globalCommit);
    }

    public void commitTransaction(DaoTransaction trans) {
        ((GenericDaoTransaction) trans).commit();
    }

    public void rollbackTransaction(DaoTransaction trans) {
        ((GenericDaoTransaction) trans).rollback();
    }

}
