ExceptionTranslator.java

  1. package cn.home1.oss.lib.errorhandle.api;

  2. import static com.google.common.base.Preconditions.checkNotNull;

  3. import lombok.Getter;
  4. import lombok.ToString;

  5. import org.springframework.context.HierarchicalMessageSource;
  6. import org.springframework.context.MessageSource;
  7. import org.springframework.web.context.request.RequestAttributes;

  8. import java.io.Serializable;
  9. import java.util.Comparator;
  10. import java.util.Map;
  11. import java.util.Optional;

  12. /**
  13.  * ExceptionTranslator.
  14.  *
  15.  * <p>
  16.  * Created by zhanghaolun on 16/8/9.
  17.  * </p>
  18.  */
  19. public interface ExceptionTranslator {

  20.   @ToString
  21.   final class Location {

  22.     /**
  23.      * Order first.
  24.      */
  25.     public static final Comparator<Location> ORDER_FIRST_COMPARATOR = (o1, o2) -> {
  26.       final int result;

  27.       if (o1 != null && o2 != null) {
  28.         final int sourceOrderResult = o1.sourceOrder.compareTo(o2.sourceOrder);
  29.         final int levelResult = o1.level.compareTo(o2.level);
  30.         result = sourceOrderResult != 0 ? sourceOrderResult : levelResult;
  31.       } else if (o1 == null) {
  32.         result = 1;
  33.       } else {
  34.         result = -1;
  35.       }

  36.       return result;
  37.     };

  38.     /**
  39.      * Hierarchy first.
  40.      */
  41.     public static final Comparator<Location> HIERARCHY_FIRST_COMPARATOR = (o1, o2) -> {
  42.       final int result;

  43.       if (o1 != null && o2 != null) {
  44.         final int sourceOrderResult = o1.sourceOrder.compareTo(o2.sourceOrder);
  45.         final int levelResult = o1.level.compareTo(o2.level);
  46.         result = levelResult != 0 ? levelResult : sourceOrderResult;
  47.       } else if (o1 == null) {
  48.         result = 1;
  49.       } else {
  50.         result = -1;
  51.       }

  52.       return result;
  53.     };

  54.     @Getter
  55.     private final MessageSource source;
  56.     @Getter
  57.     private final Integer sourceOrder;
  58.     @Getter
  59.     private final String key;
  60.     @Getter
  61.     private final Integer level;

  62.     public Location( //
  63.       final MessageSource source, //
  64.       final Integer sourceOrder, //
  65.       final String key, //
  66.       final Integer level //
  67.     ) {
  68.       this.source = checkNotNull(source);
  69.       this.sourceOrder = checkNotNull(sourceOrder);
  70.       this.key = checkNotNull(key);
  71.       this.level = checkNotNull(level);
  72.     }
  73.   }

  74.   @Deprecated
  75.   static HierarchicalMessageSource rootMessageSource(final MessageSource messageSource) {
  76.     final HierarchicalMessageSource result;
  77.     if (messageSource instanceof HierarchicalMessageSource) {
  78.       final MessageSource parent = ((HierarchicalMessageSource) messageSource).getParentMessageSource();
  79.       result = parent != null ? //
  80.         rootMessageSource(parent) //
  81.         : (HierarchicalMessageSource) messageSource; //
  82.     } else {
  83.       result = null;
  84.     }
  85.     return result;
  86.   }

  87.   /**
  88.    * locate info.
  89.    *
  90.    * @param throwable The exception to handle and get data from.
  91.    * @return info location.
  92.    */
  93.   Optional<Location> find(Throwable throwable);

  94.   /**
  95.    * Translate exception and generates localized message.
  96.    *
  97.    * @param template         template
  98.    * @param request          The current request attributes.
  99.    * @param throwable        throwable
  100.    * @param contextVariables The variables in context
  101.    * @return A TranslateResult.
  102.    */
  103.   Optional<String> localizedMessage( //
  104.     String template, //
  105.     RequestAttributes request, //
  106.     Throwable throwable, //
  107.     Map<String, Serializable> contextVariables //
  108.   );

  109.   Optional<Integer> status(Location location);

  110.   Optional<String> template(Location location);
  111. }