package org.hibernate.envers.test;
import com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean;
import com.arjuna.ats.internal.arjuna.objectstore.VolatileStore;
import com.arjuna.common.internal.util.propertyservice.BeanPopulator;
import org.enhydra.jdbc.standard.StandardXADataSource;
import org.hibernate.cfg.Environment;
import org.hibernate.ejb.AvailableSettings;
import org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl;
import org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform;
import javax.transaction.Status;
import javax.transaction.TransactionManager;
import java.sql.SQLException;
import java.util.Map;
/**
* Copied from {@link org.hibernate.testing.jta.TestingJtaBootstrap}, as Envers tests use a different URL for
* testing databases.
* @author Adam Warski (adam at warski dot org)
*/
public class EnversTestingJtaBootstrap {
public static TransactionManager updateConfigAndCreateTM(Map configValues) {
BeanPopulator
.getDefaultInstance(ObjectStoreEnvironmentBean.class)
.setObjectStoreType( VolatileStore.class.getName() );
BeanPopulator
.getNamedInstance( ObjectStoreEnvironmentBean.class, "communicationStore" )
.setObjectStoreType( VolatileStore.class.getName() );
BeanPopulator
.getNamedInstance( ObjectStoreEnvironmentBean.class, "stateStore" )
.setObjectStoreType( VolatileStore.class.getName() );
TransactionManager transactionManager = com.arjuna.ats.jta.TransactionManager.transactionManager();
StandardXADataSource dataSource = new StandardXADataSource();
dataSource.setTransactionManager( transactionManager );
try {
dataSource.setDriverName( configValues.get(Environment.DRIVER).toString() );
}
catch (SQLException e) {
throw new RuntimeException( "Unable to set DataSource JDBC driver name", e );
}
dataSource.setUrl(configValues.get(Environment.URL).toString() + ";AUTOCOMMIT=OFF");
dataSource.setUser(configValues.get(Environment.USER).toString());
configValues.remove(Environment.URL);
configValues.remove(Environment.USER);
configValues.remove(Environment.DRIVER);
configValues.put( org.hibernate.cfg.AvailableSettings.JTA_PLATFORM, new JBossStandAloneJtaPlatform() );
configValues.put( Environment.CONNECTION_PROVIDER, DatasourceConnectionProviderImpl.class.getName() );
configValues.put( Environment.DATASOURCE, dataSource );
configValues.put(AvailableSettings.TRANSACTION_TYPE, "JTA");
return transactionManager;
}
public static void tryCommit(TransactionManager tm) throws Exception {
if (tm.getStatus() == Status.STATUS_MARKED_ROLLBACK) {
tm.rollback();
} else {
tm.commit();
}
}
}