package org.mengyun.tcctransaction.utils;
import org.mengyun.tcctransaction.common.MethodType;
import org.mengyun.tcctransaction.api.TransactionContext;
/**
* 可補償方法工具類.
* Created by changmingxie .
*/
public class CompensableMethodUtils {
/**
* 計算方法類型.
* @param transactionContext
* @param isCompensable
* @return
*/
public static MethodType calculateMethodType( TransactionContext transactionContext, boolean isCompensable) {
if (transactionContext == null && isCompensable) {
// 沒有事務上下文信息,並且方法有事務註解的,爲可補償事務根方法(也就是事務發起者)
//isRootTransactionMethod
return MethodType.ROOT;
} else if (transactionContext == null && !isCompensable) {
// 沒有事務上下文信息,並且方法沒有事務註解的,爲可補償事務服務消費者(參考者)方法(一般爲被調用的服務接口)
//isSoaConsumer
return MethodType.CONSUMER;
} else if (transactionContext != null && isCompensable) {
// 有事務上下文信息,並且方法有事務註解的,爲可補償事務服務提供者方法(一般爲被調用的服務接口的實現方法)
//isSoaProvider
return MethodType.PROVIDER;
} else {
return MethodType.NORMAL;
}
}
/**
* 獲取事務上下文參數的位置.
* @param parameterTypes
* @return
*/
public static int getTransactionContextParamPosition(Class<?>[] parameterTypes) {
int i = -1;
for (i = 0; i < parameterTypes.length; i++) {
if (parameterTypes[i].equals(org.mengyun.tcctransaction.api.TransactionContext.class)) {
break;
}
}
return i;
}
/**
* 從參數獲取事務上下文.
* @param args
* @return
*/
public static TransactionContext getTransactionContextFromArgs(Object[] args) {
TransactionContext transactionContext = null;
for (Object arg : args) {
if (arg != null && org.mengyun.tcctransaction.api.TransactionContext.class.isAssignableFrom(arg.getClass())) {
transactionContext = (org.mengyun.tcctransaction.api.TransactionContext) arg;
}
}
return transactionContext;
}
}