content: package com.ctrip.framework.apollo.tracer.internals.cat;
  
  import com.ctrip.framework.apollo.tracer.spi.MessageProducer;
  import com.ctrip.framework.apollo.tracer.spi.Transaction;
  
  import java.lang.reflect.Method;
  
  /**
   * @author Jason Song(song_s@ctrip.com)
   */
  public class CatMessageProducer implements MessageProducer {
    private static Class CAT_CLASS;
    private static Method LOG_ERROR_WITH_CAUSE;
    private static Method LOG_ERROR_WITH_MESSAGE_AND_CAUSE;
    private static Method LOG_EVENT_WITH_TYPE_AND_NAME;
    private static Method LOG_EVENT_WITH_TYPE_AND_NAME_AND_STATUS_AND_NAME_VALUE_PAIRS;
    private static Method NEW_TRANSACTION_WITH_TYPE_AND_NAME;
  
    static {
      try {
        CAT_CLASS = Class.forName(CatNames.CAT_CLASS);
        LOG_ERROR_WITH_CAUSE = CAT_CLASS.getMethod(CatNames.LOG_ERROR_METHOD, Throwable.class);
        LOG_ERROR_WITH_MESSAGE_AND_CAUSE = CAT_CLASS.getMethod(CatNames.LOG_ERROR_METHOD,
            String.class, Throwable.class);
        LOG_EVENT_WITH_TYPE_AND_NAME = CAT_CLASS.getMethod(CatNames.LOG_EVENT_METHOD,
            String.class, String.class);
        LOG_EVENT_WITH_TYPE_AND_NAME_AND_STATUS_AND_NAME_VALUE_PAIRS =
            CAT_CLASS.getMethod(CatNames.LOG_EVENT_METHOD, String.class, String.class,
                String.class, String.class);
        NEW_TRANSACTION_WITH_TYPE_AND_NAME = CAT_CLASS.getMethod(
            CatNames.NEW_TRANSACTION_METHOD, String.class, String.class);
        //eager init CatTransaction
        CatTransaction.init();
      } catch (Throwable ex) {
        throw new IllegalStateException("Initialize Cat message producer failed", ex);
      }
    }
  
    @Override
    public void logError(Throwable cause) {
      try {
        LOG_ERROR_WITH_CAUSE.invoke(null, cause);
      } catch (Throwable ex) {
        throw new IllegalStateException(ex);
      }
    }
  
    @Override
    public void logError(String message, Throwable cause) {
      try {
        LOG_ERROR_WITH_MESSAGE_AND_CAUSE.invoke(null, message, cause);
      } catch (Throwable ex) {
        throw new IllegalStateException(ex);
      }
    }
  
    @Override
    public void logEvent(String type, String name) {
      try {
        LOG_EVENT_WITH_TYPE_AND_NAME.invoke(null, type, name);
      } catch (Throwable ex) {
        throw new IllegalStateException(ex);
      }
    }
  
    @Override
    public void logEvent(String type, String name, String status, String nameValuePairs) {
      try {
        LOG_EVENT_WITH_TYPE_AND_NAME_AND_STATUS_AND_NAME_VALUE_PAIRS.invoke(null, type, name,
            status, nameValuePairs);
      } catch (Throwable ex) {
        throw new IllegalStateException(ex);
      }
    }
  
    @Override
    public Transaction newTransaction(String type, String name) {
      try {
        return new CatTransaction(NEW_TRANSACTION_WITH_TYPE_AND_NAME.invoke(null, type, name));
      } catch (Throwable ex) {
        throw new IllegalStateException(ex);
      }
    }
  }
  