package org.jboss.cache.interceptors;
import org.jgroups.blocks.MethodCall;
import org.jboss.cache.TreeCache;
import org.jboss.cache.GlobalTransaction;
import org.jboss.cache.TransactionTable;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
public class CallInterceptor extends Interceptor {
TransactionManager tx_mgr=null;
TransactionTable tx_table=null;
public void setCache(TreeCache cache) {
super.setCache(cache);
tx_mgr=cache.getTransactionManager();
tx_table=cache.getTransactionTable();
}
public Object invoke(MethodCall m) throws Throwable {
Object retval;
try {
retval=m.invoke(cache);
}
catch(Throwable t) {
retval=t;
}
Transaction tx=null;
if(tx_mgr != null)
tx=tx_mgr.getTransaction();
if(tx != null && (isActive(tx) || isPreparing(tx))) {
if(retval != null && retval instanceof Throwable) {
tx.setRollbackOnly(); }
else {
if(TreeCache.isCrudMethod(m.getMethod())) {
GlobalTransaction gtx=tx_table.get(tx);
if(gtx == null) {
if(log.isDebugEnabled())
log.debug("didn't find GlobalTransaction for " + tx + "; won't add modification to transaction list");
}
else {
tx_table.addModification(gtx, m);
}
}
}
}
if(retval != null && retval instanceof Throwable)
throw (Throwable)retval;
return retval;
}
}