content: 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);
      }
    }
  }
  