package org.radargun.service;
import com.hazelcast.core.DistributedObject;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.transaction.TransactionContext;
import org.radargun.logging.Log;
import org.radargun.logging.LogFactory;
import org.radargun.traits.Transactional;
/**
* Provides transactional operations for Hazelcast
*
* @author Radim Vansa <rvansa@redhat.com>
*/
public class Hazelcast36Transactional implements Transactional {
protected final Hazelcast36Service service;
private static final Log log = LogFactory.getLog(Hazelcast36Transactional.class);
private static final boolean trace = log.isTraceEnabled();
public Hazelcast36Transactional(Hazelcast36Service service) {
this.service = service;
}
@Override
public Configuration getConfiguration(String cache) {
if (service.useTransactions) {
return Configuration.TRANSACTIONAL;
} else {
// Use transactions, if the stage requests it
return Configuration.TRANSACTIONS_ENABLED;
}
}
@Override
public Transaction getTransaction() {
return new Tx();
}
private class Tx implements Transactional.Transaction {
private TransactionContext transactionContext;
private boolean started = false;
public Tx() {
transactionContext = ((HazelcastInstance) service.hazelcastInstance).newTransactionContext();
}
@Override
public <T> T wrap(T resource) {
if (resource == null) {
return null;
}
if (!started) begin();
if (resource instanceof DistributedObject) {
return (T) transactionContext.getMap(((DistributedObject) resource).getName());
} else if (resource instanceof Hazelcast36Operations.Cache) {
String cacheName = ((Hazelcast36Operations.Cache) resource).map.getName();
return (T) new Hazelcast36Operations.Cache(transactionContext.getMap(cacheName));
} else if (resource instanceof HazelcastQuery.Context) {
String cacheName = ((HazelcastQuery.Context) resource).map.getName();
return (T) new HazelcastQuery.Context(transactionContext.getMap(cacheName));
} else {
throw new IllegalArgumentException(String.valueOf(resource));
}
}
@Override
public void begin() {
if (trace) log.trace("Starting TX " + transactionContext.getTxnId());
if (!started) {
transactionContext.beginTransaction();
started = true;
}
}
@Override
public void commit() {
if (trace) log.trace("Committing TX " + transactionContext.getTxnId());
transactionContext.commitTransaction();
}
@Override
public void rollback() {
if (trace) log.trace("Rolling back TX " + transactionContext.getTxnId());
transactionContext.rollbackTransaction();
}
}
}