ExceptionTranslator.java
package cn.home1.oss.lib.errorhandle.api;
import static com.google.common.base.Preconditions.checkNotNull;
import lombok.Getter;
import lombok.ToString;
import org.springframework.context.HierarchicalMessageSource;
import org.springframework.context.MessageSource;
import org.springframework.web.context.request.RequestAttributes;
import java.io.Serializable;
import java.util.Comparator;
import java.util.Map;
import java.util.Optional;
/**
* ExceptionTranslator.
*
* <p>
* Created by zhanghaolun on 16/8/9.
* </p>
*/
public interface ExceptionTranslator {
@ToString
final class Location {
/**
* Order first.
*/
public static final Comparator<Location> ORDER_FIRST_COMPARATOR = (o1, o2) -> {
final int result;
if (o1 != null && o2 != null) {
final int sourceOrderResult = o1.sourceOrder.compareTo(o2.sourceOrder);
final int levelResult = o1.level.compareTo(o2.level);
result = sourceOrderResult != 0 ? sourceOrderResult : levelResult;
} else if (o1 == null) {
result = 1;
} else {
result = -1;
}
return result;
};
/**
* Hierarchy first.
*/
public static final Comparator<Location> HIERARCHY_FIRST_COMPARATOR = (o1, o2) -> {
final int result;
if (o1 != null && o2 != null) {
final int sourceOrderResult = o1.sourceOrder.compareTo(o2.sourceOrder);
final int levelResult = o1.level.compareTo(o2.level);
result = levelResult != 0 ? levelResult : sourceOrderResult;
} else if (o1 == null) {
result = 1;
} else {
result = -1;
}
return result;
};
@Getter
private final MessageSource source;
@Getter
private final Integer sourceOrder;
@Getter
private final String key;
@Getter
private final Integer level;
public Location( //
final MessageSource source, //
final Integer sourceOrder, //
final String key, //
final Integer level //
) {
this.source = checkNotNull(source);
this.sourceOrder = checkNotNull(sourceOrder);
this.key = checkNotNull(key);
this.level = checkNotNull(level);
}
}
@Deprecated
static HierarchicalMessageSource rootMessageSource(final MessageSource messageSource) {
final HierarchicalMessageSource result;
if (messageSource instanceof HierarchicalMessageSource) {
final MessageSource parent = ((HierarchicalMessageSource) messageSource).getParentMessageSource();
result = parent != null ? //
rootMessageSource(parent) //
: (HierarchicalMessageSource) messageSource; //
} else {
result = null;
}
return result;
}
/**
* locate info.
*
* @param throwable The exception to handle and get data from.
* @return info location.
*/
Optional<Location> find(Throwable throwable);
/**
* Translate exception and generates localized message.
*
* @param template template
* @param request The current request attributes.
* @param throwable throwable
* @param contextVariables The variables in context
* @return A TranslateResult.
*/
Optional<String> localizedMessage( //
String template, //
RequestAttributes request, //
Throwable throwable, //
Map<String, Serializable> contextVariables //
);
Optional<Integer> status(Location location);
Optional<String> template(Location location);
}