package com.ctrip.framework.apollo.tracer.internals.cat;
import com.ctrip.framework.apollo.tracer.spi.Transaction;
import java.lang.reflect.Method;
/**
* @author Jason Song(song_s@ctrip.com)
*/
public class CatTransaction implements Transaction {
private static Class CAT_TRANSACTION_CLASS;
private static Method SET_STATUS_WITH_STRING;
private static Method SET_STATUS_WITH_THROWABLE;
private static Method ADD_DATA_WITH_KEY_AND_VALUE;
private static Method COMPLETE;
private Object catTransaction;
static {
try {
CAT_TRANSACTION_CLASS = Class.forName(CatNames.CAT_TRANSACTION_CLASS);
SET_STATUS_WITH_STRING = CAT_TRANSACTION_CLASS.getMethod(CatNames.SET_STATUS_METHOD, String.class);
SET_STATUS_WITH_THROWABLE = CAT_TRANSACTION_CLASS.getMethod(CatNames.SET_STATUS_METHOD,
Throwable.class);
ADD_DATA_WITH_KEY_AND_VALUE = CAT_TRANSACTION_CLASS.getMethod(CatNames.ADD_DATA_METHOD,
String.class, Object.class);
COMPLETE = CAT_TRANSACTION_CLASS.getMethod(CatNames.COMPLETE_METHOD);
} catch (Throwable ex) {
throw new IllegalStateException("Initialize Cat transaction failed", ex);
}
}
static void init() {
//do nothing, just to initialize the static variables
}
public CatTransaction(Object catTransaction) {
this.catTransaction = catTransaction;
}
@Override
public void setStatus(String status) {
try {
SET_STATUS_WITH_STRING.invoke(catTransaction, status);
} catch (Throwable ex) {
throw new IllegalStateException(ex);
}
}
@Override
public void setStatus(Throwable status) {
try {
SET_STATUS_WITH_THROWABLE.invoke(catTransaction, status);
} catch (Throwable ex) {
throw new IllegalStateException(ex);
}
}
@Override
public void addData(String key, Object value) {
try {
ADD_DATA_WITH_KEY_AND_VALUE.invoke(catTransaction, key, value);
} catch (Throwable ex) {
throw new IllegalStateException(ex);
}
}
@Override
public void complete() {
try {
COMPLETE.invoke(catTransaction);
} catch (Throwable ex) {
throw new IllegalStateException(ex);
}
}
}