package cokr.xit.foundation; import cokr.xit.foundation.data.DataObject; /**애플리케이션이 발생시키는 예외 * @author mjkhan */ public class ApplicationException extends RuntimeException { private static final long serialVersionUID = 1L; /**주어진 오류를 최초 원인으로 하는 ApplicationException을 반환한다. * @param cause 최초 원인이 되는 오류 * @return ApplicationException */ public static ApplicationException get(Throwable cause) { return cause instanceof ApplicationException ? ApplicationException.class.cast(cause) : new ApplicationException(cause); } private DataObject objs; private ApplicationException(Throwable cause) { super(Assert.rootCause(cause)); } /**추가정보를 갖는 DataObject를 반환한다. * @return 추가정보를 갖는 DataObject */ public DataObject info() { if (objs == null) objs = new DataObject(); return objs; } /**추가정보를 설정한다. * @param key 추가정보의 키 * @param value 추가정보 * @return ApplicationException */ public ApplicationException info(String key, Object value) { info().set(key, value); return this; } /**에러코드를 반환한다. * @return 에러코드 */ public String getCode() { return objs != null ? objs.string("code") : null; } /**에러코드를 설정한다. * @param errorCode 에러코드 * @return ApplicationException */ public ApplicationException setCode(String errorCode) { return info("code", errorCode); } @Override public String getMessage() { String msg = objs != null ? objs.string("msg") : ""; if (Assert.isEmpty(msg)) { Throwable cause = getCause(); if (cause != null) msg = cause.getMessage(); } return msg; } /**에러 메시지를 설정한다. * @param msg 에러 메시지 * @return ApplicationException */ public ApplicationException setMessage(String msg) { return info("msg", msg); } }