package org.activiti.standalone.jta;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import bitronix.tm.resource.common.ResourceBean;
import bitronix.tm.resource.jdbc.PoolingDataSource;
/**
* FactoryBean for Bitronix PoolingDataSource to correctly manage its lifecycle when used in JUnit tests.
*
* @author Marcus Klimstra (CGI)
*/
public class BitronixDataSourceFactoryBean extends ResourceBean implements FactoryBean<PoolingDataSource>, DisposableBean {
private static final Logger LOG = LoggerFactory.getLogger(BitronixDataSourceFactoryBean.class);
private PoolingDataSource ds;
@Override
public Class<?> getObjectType() {
return PoolingDataSource.class;
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public PoolingDataSource getObject() throws Exception {
if (ds == null) {
ds = new PoolingDataSource();
ds.setClassName(getClassName());
ds.setUniqueName(getUniqueName() + "_" + System.currentTimeMillis());
ds.setAutomaticEnlistingEnabled(getAutomaticEnlistingEnabled());
ds.setUseTmJoin(getUseTmJoin());
ds.setMinPoolSize(getMinPoolSize());
ds.setMaxPoolSize(getMaxPoolSize());
ds.setMaxIdleTime(getMaxIdleTime());
ds.setAcquireIncrement(getAcquireIncrement());
ds.setAcquisitionTimeout(getAcquisitionTimeout());
ds.setAcquisitionInterval(getAcquisitionInterval());
ds.setDeferConnectionRelease(getDeferConnectionRelease());
ds.setAllowLocalTransactions(getAllowLocalTransactions());
ds.setShareTransactionConnections(getShareTransactionConnections());
ds.setDisabled(isDisabled());
ds.setIgnoreRecoveryFailures(getIgnoreRecoveryFailures());
ds.setDriverProperties(getDriverProperties());
LOG.debug("Initializing PoolingDataSource with id " + ds.getUniqueName());
ds.init();
}
return ds;
}
@Override
public void destroy() throws Exception {
LOG.debug("Closing PoolingDataSource with id " + ds.getUniqueName());
ds.close();
ds = null;
}
}