/*
Copyright 2011 Jose Maria Arranz Santamaria
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package unittest.shared;
import example.CreateDBModel;
import example.DataSourceLoaderJTA;
import example.dao.ContactDAO;
import example.model.Contact;
import java.sql.Connection;
import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import jepl.JEPLBootJTA;
import jepl.JEPLBootRoot;
import jepl.JEPLConnection;
import jepl.JEPLConnectionListener;
import jepl.JEPLException;
import jepl.JEPLJTADataSource;
import jepl.JEPLTask;
import jepl.JEPLTransactionPropagation;
import jepl.JEPLTransactionalJTA;
import static org.junit.Assert.*;
/**
*
* @author jmarranz
*/
public class TestJTAShared
{
public TestJTAShared()
{
}
public static void execTest(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn,String jtaProvider)
{
try
{
testJEPLTaskUseGlobalDefaultTransactionMode(dsJTAFactory,useFakeUserTxn);
testJEPLTaskGlobalSetDefaultJEPLTransactionPropagation(dsJTAFactory,useFakeUserTxn);
testJEPLTaskTransactionModeExplicit(dsJTAFactory,useFakeUserTxn);
testJEPLTaskNestedAndTransactionModes(dsJTAFactory,useFakeUserTxn);
testJEPLTaskAnnotated(dsJTAFactory,useFakeUserTxn);
testJEPLTaskWithJEPLConnectionListenerTxnExplicitDemarcationExplicitRollback(dsJTAFactory,useFakeUserTxn);
testJEPLTaskImplicitRollback(dsJTAFactory,useFakeUserTxn);
testJEPLTaskWithJEPLConnectionListenerUsingJEPLTransaction(dsJTAFactory,useFakeUserTxn);
testJEPLTaskManualTransactionIntoTask(dsJTAFactory,useFakeUserTxn);
testInsertUpdateDeleteImplicitUpdateListeners(dsJTAFactory,useFakeUserTxn);
testListenersAsParams(dsJTAFactory,useFakeUserTxn);
testStandAloneDAODAL(dsJTAFactory,useFakeUserTxn);
testStandAloneDAODALInJEPLTask(dsJTAFactory,useFakeUserTxn);
testMultithread(dsJTAFactory,useFakeUserTxn,jtaProvider);
}
catch(AssertionError ex)
{
ex.printStackTrace(); // To show the stack fully
throw ex;
}
catch(Exception ex)
{
ex.printStackTrace(); // To show the stack fully
throw new RuntimeException(ex);
}
}
public static void testJEPLTaskUseGlobalDefaultTransactionMode(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn)
{
JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
assertTrue(jds.getDefaultJEPLTransactionPropagation() == JEPLTransactionPropagation.REQUIRED);
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.REQUIRED);
jds.exec(task);
}
public static void testJEPLTaskGlobalSetDefaultJEPLTransactionPropagation(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn)
{
// El valor por defecto es JEPLTransactionPropagation.REQUIRED
// que ya fue testeado por lo que cualquier otro valor es suficiente para testear
JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
jds.setDefaultJEPLTransactionPropagation(JEPLTransactionPropagation.NOT_SUPPORTED);
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.NOT_SUPPORTED);
jds.exec(task);
}
public static void testJEPLTaskTransactionModeExplicit(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn) throws Exception
{
// Estudiamos si funcionan todos los modos
JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
JEPLTask<Contact> task;
UserTransaction txn = jds.getJEPLBootJTA().getUserTransaction(); // Es porque puede ser null el parámetro txn
TransactionManager txnMgr = jds.getJEPLBootJTA().getTransactionManager();
// MANDATORY
try
{
task = createJEPLTask(jds,JEPLTransactionPropagation.MANDATORY);
jds.exec(task,JEPLTransactionPropagation.MANDATORY);
assertTrue(false); // No debe llegar aqui
}
catch(JEPLException ex)
{
assertTrue(ex.getMessage().equals("Specified MANDATORY transaction propagation mode and there is no active transaction"));
}
txn.begin();
task = createJEPLTask(jds,JEPLTransactionPropagation.MANDATORY);
jds.exec(task,JEPLTransactionPropagation.MANDATORY);
txn.commit();
// REQUIRED
task = createJEPLTask(jds,JEPLTransactionPropagation.REQUIRED);
jds.exec(task,JEPLTransactionPropagation.REQUIRED);
// Idem pero con un txn ya arrancada
txn.begin();
task = createJEPLTask(jds,JEPLTransactionPropagation.REQUIRED);
jds.exec(task,JEPLTransactionPropagation.REQUIRED);
txn.commit();
// REQUIRES_NEW
task = createJEPLTask(jds,JEPLTransactionPropagation.REQUIRES_NEW);
jds.exec(task,JEPLTransactionPropagation.REQUIRES_NEW);
// Probamos REQUIRES_NEW pero con una transacción activa, el comportamiento
// es el de suspender la transacción actual con el TransactionManager y abrir otra
if (txnMgr != null)
{
txn.begin();
task = createJEPLTask(jds,JEPLTransactionPropagation.REQUIRES_NEW);
jds.exec(task,JEPLTransactionPropagation.REQUIRES_NEW);
txn.commit();
}
else
{
try
{
txn.begin();
task = createJEPLTask(jds,JEPLTransactionPropagation.REQUIRES_NEW);
jds.exec(task,JEPLTransactionPropagation.REQUIRES_NEW);
assertTrue(false); // No debe llegar aqui
//txn.commit();
}
catch(JEPLException ex)
{
assertTrue(ex.getMessage().equals("Specified REQUIRES_NEW transaction propagation mode, there is an active transaction and this UserTransaction cannot be suspended (is not a TransactionManager)"));
txn.rollback();
}
}
// SUPPORTS
task = createJEPLTask(jds,JEPLTransactionPropagation.SUPPORTS);
jds.exec(task,JEPLTransactionPropagation.SUPPORTS);
txn.begin();
task = createJEPLTask(jds,JEPLTransactionPropagation.SUPPORTS);
jds.exec(task,JEPLTransactionPropagation.SUPPORTS);
txn.commit();
// NOT_SUPPORTED
task = createJEPLTask(jds,JEPLTransactionPropagation.NOT_SUPPORTED);
jds.exec(task,JEPLTransactionPropagation.NOT_SUPPORTED);
// Probamos NOT_SUPPORTED pero con una transacción activa, el comportamiento
// es el de suspender la transacción actual con el TransactionManager y abrir otra
txnMgr = jds.getJEPLBootJTA().getTransactionManager();
if (txnMgr != null)
{
txn.begin();
task = createJEPLTask(jds,JEPLTransactionPropagation.NOT_SUPPORTED);
jds.exec(task,JEPLTransactionPropagation.NOT_SUPPORTED);
txn.commit();
}
else
{
try
{
txn.begin();
task = createJEPLTask(jds,JEPLTransactionPropagation.NOT_SUPPORTED);
jds.exec(task,JEPLTransactionPropagation.NOT_SUPPORTED);
assertTrue(false); // No debe llegar aqui
//txn.commit();
}
catch(JEPLException ex)
{
assertTrue(ex.getMessage().equals("Specified NOT_SUPPORTED transaction propagation mode, there is an active transaction and this UserTransaction cannot be suspended (is not a TransactionManager)"));
txn.rollback();
}
}
// NEVER
task = createJEPLTask(jds,JEPLTransactionPropagation.NEVER);
jds.exec(task,JEPLTransactionPropagation.NEVER);
try
{
txn.begin();
task = createJEPLTask(jds,JEPLTransactionPropagation.NEVER);
jds.exec(task,JEPLTransactionPropagation.NEVER);
assertTrue(false); // No debe llegar aqui
//txn.commit();
}
catch(JEPLException ex)
{
assertTrue(ex.getMessage().equals("Specified NEVER transaction propagation mode and there is an active transaction"));
txn.rollback();
}
}
public static void testJEPLTaskNestedAndTransactionModes(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn) throws Exception
{
// Estudiamos si funcionan todos los modos en tasks anidados
final JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
JEPLTask<Contact> taskOutside;
UserTransaction txn = jds.getJEPLBootJTA().getUserTransaction();
// MANDATORY
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
try
{
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.MANDATORY,con);
jds.exec(task,JEPLTransactionPropagation.MANDATORY);
assertTrue(false); // No debe llegar aqui
}
catch(JEPLException ex)
{
assertTrue(ex.getMessage().equals("Specified MANDATORY transaction propagation mode and there is no active transaction"));
}
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.NEVER);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.NEVER);
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.MANDATORY,con);
jds.exec(task,JEPLTransactionPropagation.MANDATORY);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.REQUIRED);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.REQUIRED);
// REQUIRED
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.REQUIRED,con);
jds.exec(task,JEPLTransactionPropagation.REQUIRED);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.NEVER);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.NEVER);
// Idem pero con un txn ya arrancada
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.REQUIRED,con);
jds.exec(task,JEPLTransactionPropagation.REQUIRED);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.REQUIRED);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.REQUIRED);
// REQUIRES_NEW
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.REQUIRES_NEW,con);
jds.exec(task,JEPLTransactionPropagation.REQUIRES_NEW);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.NEVER);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.NEVER);
// Probamos REQUIRES_NEW pero con una transacción activa, el comportamiento
// es el de suspender la transacción actual con el TransactionManager y abrir otra
TransactionManager txnMgr = jds.getJEPLBootJTA().getTransactionManager();
if (txnMgr != null)
{
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.REQUIRES_NEW,con);
jds.exec(task,JEPLTransactionPropagation.REQUIRES_NEW);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.REQUIRED);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.REQUIRED);
}
else
{
try
{
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.REQUIRES_NEW,con);
jds.exec(task,JEPLTransactionPropagation.REQUIRES_NEW);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.REQUIRED);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.REQUIRED);
assertTrue(false); // No debe llegar aqui
}
catch(JEPLException ex)
{
assertTrue(ex.getMessage().equals("Specified REQUIRES_NEW transaction propagation mode, there is an active transaction and this UserTransaction cannot be suspended (is not a TransactionManager)"));
// Automáticamente se ha hecho un rollback
assertTrue(txn.getStatus() == Status.STATUS_NO_TRANSACTION);
}
}
// SUPPORTS
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.SUPPORTS,con);
jds.exec(task,JEPLTransactionPropagation.SUPPORTS);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.NEVER);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.NEVER);
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.SUPPORTS,con);
jds.exec(task,JEPLTransactionPropagation.SUPPORTS);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.REQUIRED);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.REQUIRED);
// NOT_SUPPORTED
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.NOT_SUPPORTED,con);
jds.exec(task,JEPLTransactionPropagation.NOT_SUPPORTED);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.NEVER);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.NEVER);
// Probamos NOT_SUPPORTED pero con una transacción activa, el comportamiento
// es el de suspender la transacción actual con el TransactionManager y abrir otra
txnMgr = jds.getJEPLBootJTA().getTransactionManager();
if (txnMgr != null)
{
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.NOT_SUPPORTED,con);
jds.exec(task,JEPLTransactionPropagation.NOT_SUPPORTED);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.REQUIRED);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.REQUIRED);
}
else
{
try
{
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.NOT_SUPPORTED,con);
jds.exec(task,JEPLTransactionPropagation.NOT_SUPPORTED);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.REQUIRED);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.REQUIRED);
assertTrue(false); // No debe llegar aqui
}
catch(JEPLException ex)
{
assertTrue(ex.getMessage().equals("Specified NOT_SUPPORTED transaction propagation mode, there is an active transaction and this UserTransaction cannot be suspended (is not a TransactionManager)"));
// Automáticamente se ha hecho un rollback
assertTrue(txn.getStatus() == Status.STATUS_NO_TRANSACTION);
}
}
// NEVER
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.NEVER,con);
jds.exec(task,JEPLTransactionPropagation.NEVER);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.NEVER);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.NEVER);
try
{
taskOutside = new JEPLTask<Contact>()
{
public Contact exec() throws Exception
{
Connection con = jds.getCurrentJEPLConnection().getConnection();
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.NEVER,con);
jds.exec(task,JEPLTransactionPropagation.NEVER);
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.REQUIRED);
return null;
}
};
jds.exec(taskOutside,JEPLTransactionPropagation.REQUIRED);
assertTrue(false); // No debe llegar aqui
}
catch(JEPLException ex)
{
assertTrue(ex.getMessage().equals("Specified NEVER transaction propagation mode and there is an active transaction"));
// Automáticamente se ha hecho un rollback
assertTrue(txn.getStatus() == Status.STATUS_NO_TRANSACTION);
}
}
public static void testJEPLTaskAnnotated(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn) throws Exception
{
final JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
jds.setDefaultJEPLTransactionPropagation(JEPLTransactionPropagation.NOT_SUPPORTED); // Para asegurar que el valor por defecto no es REQUIRED y testear que en el primer test se lee el valor de la anotación
JEPLTask<Contact> task = new JEPLTask<Contact>()
{
@JEPLTransactionalJTA // Por defecto es REQUIRED
public Contact exec() throws Exception
{
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.REQUIRED);
return null;
}
};
jds.exec(task);
task = new JEPLTask<Contact>()
{
@JEPLTransactionalJTA(propagation = JEPLTransactionPropagation.REQUIRES_NEW)
public Contact exec() throws Exception
{
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.REQUIRES_NEW);
return null;
}
};
jds.exec(task);
task = new JEPLTask<Contact>()
{
@JEPLTransactionalJTA(propagation = JEPLTransactionPropagation.NEVER)
public Contact exec() throws Exception
{
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.REQUIRED);
return null;
}
};
jds.exec(task,JEPLTransactionPropagation.REQUIRED); // Ha de ganar a la anotación
}
/** Este test debe ser monohilo porque se testea el rollback y hay que evitar que otro
* hilo inserte el elemento (mismo id) que estamos comprobando que no se ha insertado.
*/
public synchronized static void testJEPLTaskWithJEPLConnectionListenerTxnExplicitDemarcationExplicitRollback(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn)
{
final boolean[] used = new boolean[]{ false };
final JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
JEPLTask<Contact> task = createJEPLTask(jds,JEPLTransactionPropagation.SUPPORTS);
// Test transaction manually
Contact contact = jds.exec(task,new JEPLConnectionListener<Contact>()
{
public void setupJEPLConnection(JEPLConnection con,JEPLTask<Contact> task) throws Exception
{
used[0] = true;
// El método getCurrentJEPLTransactionPropagation() actúa como "hint"
// de la propagación que se aplicaría si no lo hiciéramos manualmente aquí
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.SUPPORTS);
UserTransaction txn = jds.getJEPLBootJTA().getUserTransaction();
txn.begin(); // transaction
try
{
Contact contact = task.exec();
// Comprobamos que está en la base de datos antes de hacer rollback
TestContactDAOShared.testIsInDB(jds,contact);
}
finally
{
txn.rollback();
}
}
},JEPLTransactionPropagation.SUPPORTS
);
assertTrue(used[0]);
TestContactDAOShared.testIsRollbacked(jds,contact);
}
/** Este test debe ser monohilo porque se testea el rollback y hay que evitar que otro
* hilo inserte el elemento (mismo id) que estamos comprobando que no se ha insertado.
*/
public synchronized static void testJEPLTaskImplicitRollback(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn)
{
final JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
final Contact[] contact = new Contact[1];
JEPLTask<Contact> task = new JEPLTask<Contact>()
{
@Override
public Contact exec() throws Exception
{
contact[0] = TestContactDAOShared.testDAO(new ContactDAO(jds));
if (true) throw new Exception("SOME EXCEPTION");
return null;
}
};
try
{
jds.exec(task,JEPLTransactionPropagation.REQUIRED);
assertTrue(false); // No debe llegar aquí
}
catch(JEPLException ex)
{
assertTrue(ex.getCause().getMessage().equals("SOME EXCEPTION"));
TestContactDAOShared.testIsRollbacked(jds,contact[0]);
}
}
public static void testJEPLTaskWithJEPLConnectionListenerUsingJEPLTransaction(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn)
{
/** Este test debe ser monohilo porque se testea el rollback y hay que evitar que otro
* hilo inserte el elemento (mismo id) que estamos comprobando que no se ha insertado.
*/
final JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
final boolean[] used = new boolean[]{ false };
JEPLTask<Contact> task = TestContactDAOShared.createJEPLTask(jds);
// Test transaction using JEPLTransaction wrapper
used[0] = false;
Contact contact = jds.exec(task,new JEPLConnectionListener<Contact>()
{
public void setupJEPLConnection(JEPLConnection con,JEPLTask<Contact> task) throws Exception
{
used[0] = true;
assertFalse(con.getJEPLTransaction().isActive());
con.getJEPLTransaction().begin();
try
{
Contact contact = task.exec();
// Comprobamos que está en la base de datos antes de hacer rollback
TestContactDAOShared.testIsInDB(jds,contact);
}
finally
{
con.getJEPLTransaction().rollback();
}
}
},JEPLTransactionPropagation.SUPPORTS
);
assertTrue(used[0]);
TestContactDAOShared.testIsRollbacked(jds,contact);
}
public static void testJEPLTaskManualTransactionIntoTask(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn)
{
final JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
JEPLTask<Contact> task = new JEPLTask<Contact>()
{
@Override
public Contact exec() throws Exception
{
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == JEPLTransactionPropagation.NEVER);
UserTransaction txn = jds.getJEPLBootJTA().getUserTransaction();
txn.begin();
Contact contact = TestContactDAOShared.testDAO(new ContactDAO(jds));
txn.commit();
return contact;
}
};
jds.exec(task,JEPLTransactionPropagation.NEVER);
}
public static void testInsertUpdateDeleteImplicitUpdateListeners(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn) throws SystemException
{
JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
// No debe haber una transacción abierta previamente en este test
UserTransaction txn = jds.getJEPLBootJTA().getUserTransaction();
if (txn != null && txn.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("Unexpected test parameters");
TestContactDAOSharedJTA testContact = new TestContactDAOSharedJTA();
testContact.testInsertUpdateDeleteImplicitUpdateListeners(jds);
}
public static void testListenersAsParams(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn) throws SystemException
{
JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
// No debe haber una transacción abierta previamente en este test
UserTransaction txn = jds.getJEPLBootJTA().getUserTransaction();
if (txn != null && txn.getStatus() != Status.STATUS_NO_TRANSACTION)
throw new RuntimeException("Unexpected test parameters");
TestContactDAOSharedJTA testContact = new TestContactDAOSharedJTA();
testContact.testListenersAsParams(jds);
}
public static void testStandAloneDAODALInJEPLTask(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn)
{
JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
TestContactDAOShared.testStandAloneDAODALInJEPLTask(jds);
}
public static void testStandAloneDAODAL(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn)
{
JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
TestContactDAOShared.testStandAloneDAODAL(jds);
}
public static void testMultithread(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn,String jtaProvider) throws Exception
{
final JEPLJTADataSource jds = createJEPLJTADataSource(dsJTAFactory,useFakeUserTxn);
final ContactDAO dao = new ContactDAO(jds);
TestContactDAOShared.initDataSimpleTest(dao);
final long waitMillisec = 5000; // 5 seconds is fine for concurrency
Runnable runnable = new Runnable()
{
@Override
public void run()
{
try
{
long start = System.currentTimeMillis();
while(true)
{
JEPLTask<Contact> task = new JEPLTask<Contact>()
{
@Override
public Contact exec() throws Exception
{
TestContactDAOShared.testDAOSimpleTest(dao);
return null;
}
};
jds.exec(task,JEPLTransactionPropagation.REQUIRED);
long current = System.currentTimeMillis();
if ((current - start) > waitMillisec) break;
}
}
catch(Exception ex)
{
ex.printStackTrace();
assertTrue(false);
}
}
};
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}
public static JEPLJTADataSource createJEPLJTADataSource(DataSourceLoaderJTA dsJTAFactory,boolean useFakeUserTxn)
{
JEPLBootJTA boot = JEPLBootRoot.get().createJEPLBootJTA();
if (!useFakeUserTxn)
{
boot.setUserTransaction(dsJTAFactory.getUserTransaction());
boot.setTransactionManager(dsJTAFactory.getTransactionManager());
}
else
{
boot.setUserTransaction(boot.createJDBCUserTransaction());
boot.setTransactionManager(null);
}
return boot.createJEPLJTADataSource(dsJTAFactory.getDataSource());
}
public static JEPLTask<Contact> createJEPLTask(final JEPLJTADataSource jds,final JEPLTransactionPropagation txnPropExpected)
{
return createJEPLTask(jds,txnPropExpected,null);
}
public static JEPLTask<Contact> createJEPLTask(final JEPLJTADataSource jds,final JEPLTransactionPropagation txnPropExpected,final Connection con)
{
JEPLTask<Contact> task = new JEPLTask<Contact>()
{
@Override
public Contact exec() throws Exception
{
if (con != null)
assertTrue(con == jds.getCurrentJEPLConnection().getConnection());
JEPLTransactionPropagation txnProp = jds.getCurrentJEPLTransactionPropagation();
assertTrue(txnProp == txnPropExpected);
return TestContactDAOShared.testDAO(new ContactDAO(jds));
}
};
return task;
}
}