package org.framework.proxy;
import org.framework.annotation.Transaction;
import org.framework.helper.DatabaseHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
/**
* 事务代理
* Created by lizhaoz on 2015/12/21.
*/
public class TransactionProxy implements Proxy {
private static final Logger LOGGER= LoggerFactory.getLogger(TransactionProxy.class);
private static final ThreadLocal<Boolean> FLAG_HOLDER=new ThreadLocal<Boolean>(){
@Override
protected Boolean initialValue() {
return false;
}
};
@Override
public Object doProxy(ProxyChain proxyChain) throws Throwable {
Object result;
boolean flag=FLAG_HOLDER.get();
Method method=proxyChain.getTargetMethod();
//
if (!flag&&method.isAnnotationPresent(Transaction.class)){
FLAG_HOLDER.set(true);
try{
DatabaseHelper.beginTranstion();
LOGGER.debug("begin transaction");
result =proxyChain.doProxyChain();
DatabaseHelper.commitTransaction();
LOGGER.debug("commit transaction");
}catch (Exception e){
DatabaseHelper.rollbackTransaction();
LOGGER.debug("rollback transaction");
throw e;
}
finally {
FLAG_HOLDER.remove();
}
}
else {
result=proxyChain.doProxyChain();
}
return result;
}
}