package cn.dreampie.route.interceptor.transaction;
import cn.dreampie.common.http.exception.HttpException;
import cn.dreampie.orm.DataSourceMeta;
import cn.dreampie.orm.Metadata;
import cn.dreampie.orm.transaction.Transaction;
import cn.dreampie.route.core.RouteInvocation;
import cn.dreampie.route.interceptor.Interceptor;
import cn.dreampie.route.interceptor.exception.InterceptorException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by wangrenhui on 15/1/2.
*/
public class TransactionInterceptor implements Interceptor {
public void intercept(RouteInvocation ri) {
List<DataSourceMeta> dataSourceMetas = null;
Transaction transactionAnn = ri.getMethod().getAnnotation(Transaction.class);
if (transactionAnn != null) {
String[] names = transactionAnn.name();
if (names.length == 0) {
names = new String[]{Metadata.getDefaultDsmName()};
}
int[] levels = transactionAnn.level();
boolean[] readonlys = transactionAnn.readonly();
dataSourceMetas = new ArrayList<DataSourceMeta>();
DataSourceMeta dataSourceMeta;
try {
for (int i = 0; i < names.length; i++) {
dataSourceMeta = Metadata.getDataSourceMeta(names[i]);
dataSourceMeta.initTransaction(readonlys.length == 1 ? readonlys[0] : readonlys[i], levels.length == 1 ? levels[0] : levels[i]);
dataSourceMetas.add(dataSourceMeta);
}
//执行操作
ri.invoke();
for (DataSourceMeta dsm : dataSourceMetas) {
dsm.commitTransaction();
}
} catch (Throwable t) {
for (DataSourceMeta dsm : dataSourceMetas) {
dsm.rollbackTransaction();
}
Throwable cause = t.getCause();
if (cause == null) {
cause = t;
}
if (cause instanceof HttpException) {
throw (HttpException) cause;
} else {
throw new InterceptorException(cause.getMessage(), cause);
}
} finally {
for (DataSourceMeta dsm : dataSourceMetas) {
dsm.endTranasaction();
}
}
} else {
//执行操作
ri.invoke();
}
}
}