Open Kilda Java Documentation
GlobalExceptionMapper.java
Go to the documentation of this file.
1 package org.openkilda.security.mapper;
2 
3 import static java.util.stream.Collectors.joining;
4 
5 import java.nio.file.AccessDeniedException;
6 
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
9 
10 import org.springframework.beans.ConversionNotSupportedException;
11 import org.springframework.beans.TypeMismatchException;
12 import org.springframework.http.HttpHeaders;
13 import org.springframework.http.HttpStatus;
14 import org.springframework.http.MediaType;
15 import org.springframework.http.ResponseEntity;
16 import org.springframework.http.converter.HttpMessageNotReadableException;
17 import org.springframework.http.converter.HttpMessageNotWritableException;
18 import org.springframework.util.MultiValueMap;
19 import org.springframework.validation.BindException;
20 import org.springframework.validation.FieldError;
21 import org.springframework.web.HttpMediaTypeNotAcceptableException;
22 import org.springframework.web.HttpMediaTypeNotSupportedException;
23 import org.springframework.web.HttpRequestMethodNotSupportedException;
24 import org.springframework.web.bind.MethodArgumentNotValidException;
25 import org.springframework.web.bind.MissingPathVariableException;
26 import org.springframework.web.bind.MissingServletRequestParameterException;
27 import org.springframework.web.bind.ServletRequestBindingException;
28 import org.springframework.web.bind.annotation.ExceptionHandler;
29 import org.springframework.web.context.request.WebRequest;
30 import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
31 import org.springframework.web.multipart.support.MissingServletRequestPartException;
32 import org.springframework.web.servlet.NoHandlerFoundException;
33 import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
35 
36 import com.fasterxml.jackson.databind.JsonMappingException;
37 import com.fasterxml.jackson.databind.JsonMappingException.Reference;
38 
43 
47 public class GlobalExceptionMapper extends ResponseEntityExceptionHandler {
48 
50  private static final Logger _log = LoggerFactory.getLogger(GlobalExceptionMapper.class);
51 
56  _log.info("[GlobalExceptionMapper] Initializing {}...",
57  GlobalExceptionMapper.class.getName());
58  }
59 
60  @Override
61  protected ResponseEntity<Object> handleHttpRequestMethodNotSupported(
62  final HttpRequestMethodNotSupportedException ex, final HttpHeaders headers,
63  final HttpStatus status, final WebRequest request) {
64  _log.error("Exception: " + ex.getMessage(), ex);
65  return response(HttpError.METHOD_NOT_ALLOWED.getHttpStatus(),
66  HttpError.METHOD_NOT_ALLOWED.getCode(),
67  HttpError.METHOD_NOT_ALLOWED.getAuxilaryMessage(), ex.toString());
68  }
69 
70  @Override
71  protected ResponseEntity<Object> handleHttpMediaTypeNotSupported(
72  final HttpMediaTypeNotSupportedException ex, final HttpHeaders headers,
73  final HttpStatus status, final WebRequest request) {
74  _log.error("Exception: " + ex.getMessage(), ex);
75  return response(HttpError.UNPROCESSABLE_ENTITY.getHttpStatus(),
77  HttpError.UNPROCESSABLE_ENTITY.getAuxilaryMessage(), ex.toString());
78  }
79 
80  @Override
81  protected ResponseEntity<Object> handleHttpMediaTypeNotAcceptable(
82  final HttpMediaTypeNotAcceptableException ex, final HttpHeaders headers,
83  final HttpStatus status, final WebRequest request) {
84  _log.error("Exception: " + ex.getMessage(), ex);
85  return response(HttpError.UNPROCESSABLE_ENTITY.getHttpStatus(),
87  HttpError.UNPROCESSABLE_ENTITY.getAuxilaryMessage(), ex.toString());
88  }
89 
90  @Override
91  protected ResponseEntity<Object> handleMissingPathVariable(
92  final MissingPathVariableException ex, final HttpHeaders headers,
93  final HttpStatus status, final WebRequest request) {
94  _log.error("Exception: " + ex.getMessage(), ex);
95  return response(HttpError.BAD_REQUEST.getHttpStatus(), HttpError.BAD_REQUEST.getCode(),
96  HttpError.BAD_REQUEST.getAuxilaryMessage(), ex.toString());
97  }
98 
99  @Override
100  protected ResponseEntity<Object> handleMissingServletRequestParameter(
101  final MissingServletRequestParameterException ex, final HttpHeaders headers,
102  final HttpStatus status, final WebRequest request) {
103  _log.error("Exception: " + ex.getMessage(), ex);
104  return response(HttpError.BAD_REQUEST.getHttpStatus(), HttpError.BAD_REQUEST.getCode(),
105  HttpError.BAD_REQUEST.getAuxilaryMessage(), ex.toString());
106  }
107 
108  @Override
109  protected ResponseEntity<Object> handleServletRequestBindingException(
110  final ServletRequestBindingException ex, final HttpHeaders headers,
111  final HttpStatus status, final WebRequest request) {
112  _log.error("Exception: " + ex.getMessage(), ex);
113  return response(HttpError.METHOD_NOT_FOUND.getHttpStatus(),
114  HttpError.METHOD_NOT_FOUND.getCode(),
115  HttpError.METHOD_NOT_FOUND.getAuxilaryMessage(), ex.toString());
116  }
117 
118  @Override
119  protected ResponseEntity<Object> handleConversionNotSupported(
120  final ConversionNotSupportedException ex, final HttpHeaders headers,
121  final HttpStatus status, final WebRequest request) {
122  _log.error("Exception: " + ex.getMessage(), ex);
123  return response(HttpError.UNPROCESSABLE_ENTITY.getHttpStatus(),
125  HttpError.UNPROCESSABLE_ENTITY.getAuxilaryMessage(), ex.toString());
126  }
127 
128  @Override
129  protected ResponseEntity<Object> handleTypeMismatch(final TypeMismatchException ex,
130  final HttpHeaders headers, final HttpStatus status, final WebRequest request) {
131  _log.error("Exception: " + ex.getMessage(), ex);
132  return response(HttpError.METHOD_NOT_ALLOWED.getHttpStatus(),
133  HttpError.METHOD_NOT_ALLOWED.getCode(),
134  HttpError.METHOD_NOT_ALLOWED.getAuxilaryMessage(), ex.toString());
135  }
136 
137  @Override
138  protected ResponseEntity<Object> handleHttpMessageNotReadable(
139  final HttpMessageNotReadableException ex, final HttpHeaders headers,
140  final HttpStatus status, final WebRequest request) {
141  _log.error("Exception: " + ex.getMessage(), ex);
142  String message = new String();
143  if (ex.getCause() instanceof JsonMappingException) {
144  StringBuilder msg = new StringBuilder();
145  JsonMappingException jme = (JsonMappingException) ex.getCause();
146  for (Reference reference : jme.getPath()) {
147  msg.append(reference.getFieldName()).append(" -> ");
148  }
149  if (msg.length() > 0) {
150  msg.setLength(msg.length() - 3);
151  msg.append(": INVALID.");
152  }
153  message = msg.toString();
154  } else {
155  message = ex.getMessage();
156  }
157  return response(HttpError.UNPROCESSABLE_ENTITY.getHttpStatus(),
159  HttpError.UNPROCESSABLE_ENTITY.getAuxilaryMessage(), message);
160  }
161 
162  @Override
163  protected ResponseEntity<Object> handleHttpMessageNotWritable(
164  final HttpMessageNotWritableException ex, final HttpHeaders headers,
165  final HttpStatus status, final WebRequest request) {
166  _log.error("Exception: " + ex.getMessage(), ex);
167  return response(HttpError.UNPROCESSABLE_ENTITY.getHttpStatus(),
169  HttpError.UNPROCESSABLE_ENTITY.getAuxilaryMessage(), ex.toString());
170  }
171 
172  @Override
173  protected ResponseEntity<Object> handleMethodArgumentNotValid(
174  final MethodArgumentNotValidException ex, final HttpHeaders headers,
175  final HttpStatus status, final WebRequest request) {
176  _log.error("Exception: " + ex.getMessage(), ex);
177  String message = ex.getBindingResult().getFieldErrors().stream()
178  .map(FieldError::getDefaultMessage).collect(joining(", "));
179  return response(HttpError.BAD_REQUEST.getHttpStatus(), HttpError.BAD_REQUEST.getCode(),
180  HttpError.BAD_REQUEST.getAuxilaryMessage(), message);
181  }
182 
183  @Override
184  protected ResponseEntity<Object> handleMissingServletRequestPart(
185  final MissingServletRequestPartException ex, final HttpHeaders headers,
186  final HttpStatus status, final WebRequest request) {
187  _log.error("Exception: " + ex.getMessage(), ex);
188  return response(HttpError.BAD_REQUEST.getHttpStatus(), HttpError.BAD_REQUEST.getCode(),
189  HttpError.BAD_REQUEST.getAuxilaryMessage(), ex.toString());
190  }
191 
192  @Override
193  protected ResponseEntity<Object> handleBindException(final BindException ex,
194  final HttpHeaders headers, final HttpStatus status, final WebRequest request) {
195  _log.error("Exception: " + ex.getMessage(), ex);
196  String message = ex.getFieldErrors().stream().map(FieldError::getDefaultMessage)
197  .collect(joining(", "));
198  return response(HttpError.BAD_REQUEST.getHttpStatus(), HttpError.BAD_REQUEST.getCode(),
199  HttpError.BAD_REQUEST.getAuxilaryMessage(), message);
200  }
201 
202  @Override
203  protected ResponseEntity<Object> handleNoHandlerFoundException(final NoHandlerFoundException ex,
204  final HttpHeaders headers, final HttpStatus status, final WebRequest request) {
205  _log.error("Exception: " + ex.getMessage(), ex);
206  return response(HttpError.METHOD_NOT_FOUND.getHttpStatus(),
207  HttpError.METHOD_NOT_FOUND.getCode(),
208  HttpError.METHOD_NOT_FOUND.getAuxilaryMessage(), ex.getMessage());
209  }
210 
211  @Override
212  protected ResponseEntity<Object> handleAsyncRequestTimeoutException(
213  final AsyncRequestTimeoutException ex, final HttpHeaders headers,
214  final HttpStatus status, final WebRequest webRequest) {
215  return super.handleAsyncRequestTimeoutException(ex, headers, status, webRequest);
216  }
217 
227  protected ResponseEntity<Object> response(final HttpStatus status, final Integer code,
228  final String auxilaryMessage, final String message) {
229  MultiValueMap<String, String> headers = new HttpHeaders();
230  headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
231  return new ResponseEntity<Object>(new ErrorMessage(code, message, auxilaryMessage), headers,
232  status);
233  }
234 
245  protected ResponseEntity<Object> response(final HttpStatus status, final Integer code,
246  final String auxilaryMessage, final String message, final String correlationId) {
247  MultiValueMap<String, String> headers = new HttpHeaders();
248  headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
249  return new ResponseEntity<Object>(
250  new ErrorMessage(code, message, auxilaryMessage, correlationId), headers, status);
251  }
252 
259  @ExceptionHandler(RequestValidationException.class)
260  protected ResponseEntity<Object> handleEntityNotFound(
262  ex.setStackTrace(new StackTraceElement[0]);
263  return response(HttpError.UNPROCESSABLE_ENTITY.getHttpStatus(),
264  ex.getCode() != null ? ex.getCode() :HttpError.UNPROCESSABLE_ENTITY.getCode(),
265  ex.getMessage(), ex.getMessage());
266  }
267 
274  @ExceptionHandler(AccessDeniedException.class)
275  protected ResponseEntity<Object> unauthorizeAccess(
276  AccessDeniedException ex) {
277  ex.setStackTrace(new StackTraceElement[0]);
278  return response(HttpError.UNAUTHORIZED.getHttpStatus(),
279  HttpError.UNAUTHORIZED.getCode(),
280  ex.getMessage(), ex.getMessage());
281  }
288  @ExceptionHandler(InvalidOtpException.class)
289  protected ResponseEntity<Object> invalidOTP(
290  InvalidOtpException ex) {
291  ex.setStackTrace(new StackTraceElement[0]);
292  return response(HttpError.UNAUTHORIZED.getHttpStatus(),
293  HttpError.UNAUTHORIZED.getCode(),
294  ex.getMessage(), ex.getMessage());
295  }
296 
303  @ExceptionHandler(TwoFaKeyNotSetException.class)
304  protected ResponseEntity<Object> twoFaKeyNotSetException(
306  ex.setStackTrace(new StackTraceElement[0]);
307  return response(HttpError.UNAUTHORIZED.getHttpStatus(),
308  HttpError.UNAUTHORIZED.getCode(),
309  ex.getMessage(), ex.getMessage());
310  }
311 }
ResponseEntity< Object > handleServletRequestBindingException(final ServletRequestBindingException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > unauthorizeAccess(AccessDeniedException ex)
ResponseEntity< Object > handleMissingServletRequestParameter(final MissingServletRequestParameterException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > handleMethodArgumentNotValid(final MethodArgumentNotValidException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > handleNoHandlerFoundException(final NoHandlerFoundException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > invalidOTP(InvalidOtpException ex)
ResponseEntity< Object > response(final HttpStatus status, final Integer code, final String auxilaryMessage, final String message, final String correlationId)
ResponseEntity< Object > handleMissingPathVariable(final MissingPathVariableException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > handleAsyncRequestTimeoutException(final AsyncRequestTimeoutException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest webRequest)
ResponseEntity< Object > handleConversionNotSupported(final ConversionNotSupportedException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
def status()
Definition: rest.py:593
ResponseEntity< Object > handleHttpMessageNotReadable(final HttpMessageNotReadableException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > handleEntityNotFound(RequestValidationException ex)
ResponseEntity< Object > handleTypeMismatch(final TypeMismatchException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > handleHttpMediaTypeNotSupported(final HttpMediaTypeNotSupportedException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > handleMissingServletRequestPart(final MissingServletRequestPartException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > handleHttpMediaTypeNotAcceptable(final HttpMediaTypeNotAcceptableException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > handleHttpMessageNotWritable(final HttpMessageNotWritableException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > handleHttpRequestMethodNotSupported(final HttpRequestMethodNotSupportedException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)
ResponseEntity< Object > response(final HttpStatus status, final Integer code, final String auxilaryMessage, final String message)
ResponseEntity< Object > twoFaKeyNotSetException(TwoFaKeyNotSetException ex)
ResponseEntity< Object > handleBindException(final BindException ex, final HttpHeaders headers, final HttpStatus status, final WebRequest request)