package cn.dreampie.route.holder;
import cn.dreampie.common.Constant;
import cn.dreampie.common.Render;
import cn.dreampie.common.http.HttpMessage;
import cn.dreampie.common.http.HttpRequest;
import cn.dreampie.common.http.HttpResponse;
import cn.dreampie.common.http.exception.HttpException;
import cn.dreampie.common.http.result.ErrorResult;
import cn.dreampie.common.http.result.HttpStatus;
import cn.dreampie.common.util.json.Jsoner;
import cn.dreampie.log.Logger;
import cn.dreampie.route.render.RenderFactory;
/**
* Created by Dreampie on 15/4/27.
*/
public class DefaultExceptionHolder extends ExceptionHolder {
private final static Logger logger = Logger.getLogger(DefaultExceptionHolder.class);
public void hold(HttpRequest request, HttpResponse response, Exception exception, boolean[] isHandled) {
String restPath = request.getRestPath();
Render render = RenderFactory.getByUrl(restPath);
String message;
if (exception instanceof HttpException) {
HttpException httpException = (HttpException) exception;
//api访问 所有的异常 以httpStatus返回
if (Constant.apiPrefix == null || restPath.startsWith(Constant.apiPrefix)) {
message = Jsoner.toJSON(httpException.getContent());
if (logger.isWarnEnabled()) {
logger.warn("Request \"" + request.getHttpMethod() + " " + request.getRestPath() + "\", error: " + httpException.getStatus().getCode() + " " + message);
}
response.setStatus(httpException.getStatus());
render.render(request, response, message);
} else {
//其他访问 跳转到 指定页面
go(response, httpException.getStatus(), isHandled);
}
} else {
message = exception.getMessage();
if (message == null) {
Throwable throwable = exception.getCause();
if (throwable != null) {
message = throwable.getMessage();
}
}
if (logger.isErrorEnabled()) {
logger.error("Request \"" + request.getHttpMethod() + " " + request.getRestPath() + "\", error: " + HttpStatus.INTERNAL_SERVER_ERROR.getCode() + " " + message, exception);
}
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
render.render(request, response, new ErrorResult(HttpMessage.INTERNAL_SERVER_ERROR));
}
}
}