package com.aggrepoint.winlet.spring; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import com.aggrepoint.winlet.ContextUtils; import com.aggrepoint.winlet.PsnRuleEngine; import com.aggrepoint.winlet.RespHeaderConst; /** * * @author Jiangming Yang (yangjm@gmail.com) */ public class WinletExceptionResolver implements HandlerExceptionResolver { static final Log logger = LogFactory.getLog(WinletExceptionResolver.class); List<ExceptionMapping> exceptionMap; @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { PsnRuleEngine psnEngine = ContextUtils.getPsnRuleEngine(request); for (ExceptionMapping map : exceptionMap) if (map.getClz().isAssignableFrom(ex.getClass())) { if (map.getRule() != null) { try { if (!psnEngine.eval(map.getRule())) continue; } catch (Exception e) { logger.error( "Error eveluating psn rule \"" + map.getRule() + "\" defined in ExceptionMapping", e); continue; } } if (map.isRedirect()) { response.setHeader(RespHeaderConst.HEADER_REDIRECT, map.getView()); ModelAndView mv = new ModelAndView(); mv.clear(); return mv; } return new ModelAndView(map.getView()); } return null; } public void setExceptionMappings(List<ExceptionMapping> map) { this.exceptionMap = map; } }