1 package org.cateproject.controller.error;
2
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5
6 import org.apache.commons.logging.Log;
7 import org.apache.commons.logging.LogFactory;
8 import org.springframework.beans.TypeMismatchException;
9 import org.springframework.core.annotation.AnnotationUtils;
10 import org.springframework.util.StringUtils;
11 import org.springframework.web.bind.annotation.ResponseStatus;
12 import org.springframework.web.multipart.MaxUploadSizeExceededException;
13 import org.springframework.web.servlet.ModelAndView;
14 import org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver;
15 import org.springframework.webflow.execution.repository.snapshot.SnapshotNotFoundException;
16
17 import com.ibm.lsid.LSIDException;
18
19 import eu.etaxonomy.cdm.persistence.dao.common.OperationNotSupportedInPriorViewException;
20
21 public class CateExceptionResolver extends ResponseStatusExceptionResolver {
22
23 private static Log log = LogFactory.getLog(CateExceptionResolver.class);
24
25 @Override
26 protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) {
27
28 if(log.isDebugEnabled()) {
29 for(StackTraceElement ste : exception.getStackTrace()) {
30 log.error(ste);
31 }
32 }
33
34 ModelAndView modelAndView = new ModelAndView("exception/error");
35 if(exception instanceof LSIDException) {
36 LSIDException lsidException = (LSIDException) exception;
37 response.addHeader("LSID-Error-Code",Integer.toString(lsidException.getErrorCode()));
38 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
39 } else if(exception instanceof TypeMismatchException) {
40 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
41 } else if(exception instanceof OperationNotSupportedInPriorViewException) {
42 response.setStatus(HttpServletResponse.SC_NOT_ACCEPTABLE);
43 modelAndView.setViewName("exception/versioningError");
44 } else if(exception instanceof MaxUploadSizeExceededException) {
45 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
46 modelAndView.setViewName("exception/maxUploadSizeExceeded");
47 } else if(exception instanceof SnapshotNotFoundException) {
48 response.setStatus(HttpServletResponse.SC_NOT_FOUND);
49 modelAndView.setViewName("exception/snapshotNotFound");
50 } else {
51 ResponseStatus responseStatus = AnnotationUtils.findAnnotation(exception.getClass(), ResponseStatus.class);
52 if (responseStatus != null) {
53 int statusCode = responseStatus.value().value();
54 String reason = responseStatus.reason();
55 if (!StringUtils.hasLength(reason)) {
56 response.setStatus(statusCode);
57 } else {
58 response.setStatus(statusCode, reason);
59 }
60 }
61 }
62
63 modelAndView.addObject("exception",exception);
64
65 return modelAndView;
66 }
67
68 }