package org.jboss.cache.interceptors;
import org.jboss.cache.TreeCache;
import org.jboss.cache.lock.IdentityLock;
import org.jgroups.blocks.MethodCall;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
public class UnlockInterceptor extends Interceptor {
HashMap lock_table=null;
TransactionManager tx_mgr=null;
public void setCache(TreeCache cache) {
super.setCache(cache);
tx_mgr=cache.getTransactionManager();
lock_table=cache.getLockTable();
}
public Object invoke(MethodCall m) throws Throwable {
Transaction tx;
try {
return super.invoke(m);
}
finally {
if(tx_mgr != null && (tx=tx_mgr.getTransaction()) != null && isValid(tx)) {
; }
else { List locks=(List)lock_table.get(Thread.currentThread());
if(locks != null) {
releaseLocks(locks);
lock_table.remove(Thread.currentThread());
}
}
}
}
private void releaseLocks(List locks) {
IdentityLock lock;
if(locks != null) {
for(ListIterator it=locks.listIterator(locks.size()); it.hasPrevious();) {
lock=(IdentityLock)it.previous();
if(log.isTraceEnabled())
log.trace("releasing lock for " + lock.getFqn() + ": " + lock);
lock.release(Thread.currentThread());
}
locks.clear();
}
}
}