package org.radargun.service;
import javax.transaction.TransactionManager;
import org.infinispan.AdvancedCache;
import org.radargun.logging.Log;
import org.radargun.logging.LogFactory;
import org.radargun.traits.Transactional;
/**
* @author Radim Vansa <rvansa@redhat.com>
*/
public class InfinispanTransactional implements Transactional {
protected static final Log log = LogFactory.getLog(InfinispanTransactional.class);
protected static final boolean trace = log.isTraceEnabled();
protected final InfinispanEmbeddedService service;
protected final boolean enlistExtraXAResource;
public InfinispanTransactional(InfinispanEmbeddedService service) {
this.service = service;
this.enlistExtraXAResource = service.enlistExtraXAResource;
}
@Override
public Configuration getConfiguration(String cacheName) {
return service.isCacheTransactional(service.getCache(cacheName)) ?
Configuration.TRANSACTIONAL : Configuration.NON_TRANSACTIONAL;
}
@Override
public Transaction getTransaction() {
return new Tx();
}
protected AdvancedCache getAdvancedCache(Object resource) {
if (resource == null) {
return null;
} else if (resource instanceof AdvancedCacheHolder) {
return ((AdvancedCacheHolder) resource).getAdvancedCache();
} else {
throw new IllegalArgumentException(String.valueOf(resource));
}
}
protected class Tx implements Transaction {
protected TransactionManager tm;
@Override
public <T> T wrap(T resource) {
if (resource == null) {
return null;
}
TransactionManager tm = getAdvancedCache(resource).getTransactionManager();
if (this.tm != null && this.tm != tm) {
throw new IllegalArgumentException("Different transaction managers for single transaction!");
}
this.tm = tm;
// we don't have to wrap anything for Infinispan
return resource;
}
@Override
public void begin() {
try {
tm.begin();
javax.transaction.Transaction transaction = tm.getTransaction();
if (trace) log.trace("Transaction begin " + transaction);
if (enlistExtraXAResource) {
transaction.enlistResource(new DummyXAResource());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void commit() {
try {
if (trace) log.trace("Transaction commit " + tm.getTransaction());
tm.commit();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void rollback() {
try {
if (trace) log.trace("Transaction rollback " + tm.getTransaction());
tm.rollback();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}