package tryXA;

import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.XADataSource;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource;


import org.apache.geronimo.transaction.manager.GeronimoTransactionManager;

import junit.framework.TestCase;

public class TestGeronimoTransactionManagerWithOracle extends TestCase {

	public void testGeronimoSameXAResourceJoinTwice_Oracle() throws Exception
	{
		TransactionManager tm = createGeronimoTransactionManager();
		XADataSource ds = createOracleXADataSource();
		javax.sql.XAConnection xaConn = ds.getXAConnection();
		for(int i = 0; i < 2; i++)
		{
		tm.begin();
		
		Transaction transaction = tm.getTransaction();
		
		
		boolean suspend = false;
		int delistStatus = suspend ? XAResource.TMSUSPEND : XAResource.TMSUCCESS;
		doXADatabaseOperation(transaction, xaConn, 
				"a", "msgseq", delistStatus);
		tm.commit();
		}
	}
	private XADataSource createOracleXADataSource() throws SQLException {
		oracle.jdbc.xa.client.OracleXADataSource xaDs = new oracle.jdbc.xa.client.OracleXADataSource();
		//xaDs.setURL("jdbc:oracle:thin:@168.1.100.30:1521:ora9i30");
		xaDs.setUser("changjun");
		xaDs.setPassword("changjun");
		
		xaDs.setServerName("168.1.100.30");
		xaDs.setPortNumber(1521);
		xaDs.setDriverType("thin");
		xaDs.setDataSourceName("OracleXADataSource1");
		xaDs.setServiceName("ora9i30");
		return xaDs;
	}

	void doXADatabaseOperation(Transaction transaction, javax.sql.XAConnection xaConn, String appname, String table, int delistStatus) throws Exception
	{
		String sql = "select * from " + table + " where appname='"+appname+"'";
		
		XAResource res1 = xaConn.getXAResource();
		transaction.enlistResource(res1);

		Connection sqlConn1 = xaConn.getConnection();
		PreparedStatement statement1 = sqlConn1.prepareStatement(sql);
		ResultSet set = statement1.executeQuery();
		if(!set.next())
			sql = "insert into " + table + " values('" + appname+"', 'key', 0)";
		else
		{
			String value = set.getString("value");
			value = new Integer(Integer.parseInt(value) + 1).toString();
			sql = "update " + table + " set value=" + value + " where appname='" +  appname+ "'";
		}
		statement1 = sqlConn1.prepareStatement(sql);
		statement1.executeUpdate();
		sqlConn1.close();
		transaction.delistResource(res1, delistStatus);
		
	}


	private static TransactionManager createGeronimoTransactionManager()
			throws Exception {
		org.apache.geronimo.transaction.manager.XidFactoryImpl xidFactory = new org.apache.geronimo.transaction.manager.XidFactoryImpl();
		org.apache.servicemix.transaction.HowlLogFactoryBean logFactory = new org.apache.servicemix.transaction.HowlLogFactoryBean();
		logFactory.setLogFileDir("./geronimo");
		logFactory.setXidFactory(xidFactory);
		GeronimoTransactionManager tm = new GeronimoTransactionManager(60000,
				xidFactory,
				/*
				 * (org.apache.geronimo.transaction.manager.TransactionLog)
				 * logFactory .getObject()
				 */null);

		return tm;
	}

	public static TransactionManager createJbossTransactionManager()
			throws Exception {
		com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple tm = new com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple();
		return tm;
	}

	public static TransactionManager createAtomicTransactionManager()
			throws Exception {
		new File("tmlog.lck").delete();
		new File("tm.out.lck").delete();
		System.setProperty("com.atomikos.icatch.file",
				"configs/atomikos.properties");
		com.atomikos.icatch.jta.UserTransactionManager tm = new com.atomikos.icatch.jta.UserTransactionManager();
		tm.init();
		tm.setForceShutdown(true);
		tm.setTransactionTimeout(60000);
		return tm;

	}
	static XADataSource createMysqlXADataSource(String schema)
	{
		com.mysql.jdbc.jdbc2.optional.MysqlXADataSource source = new com.mysql.jdbc.jdbc2.optional.MysqlXADataSource();
		source
				.setURL("jdbc:mysql://127.0.0.1:3306/"+schema+ "?autoReconnect=true");
		source.setUser("root");
		source.setPassword("white7bust");
		return source;
	}
}
