Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
io.mosip.certify.advice.ExceptionHandlerAdvice Maven / Gradle / Ivy
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package io.mosip.certify.advice;
import io.mosip.certify.core.dto.Error;
import io.mosip.certify.core.dto.ResponseWrapper;
import io.mosip.certify.core.dto.VCError;
import io.mosip.certify.core.exception.CertifyException;
import io.mosip.certify.core.exception.InvalidRequestException;
import io.mosip.certify.core.exception.NotAuthenticatedException;
import io.mosip.certify.core.util.CommonUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.TypeMismatchException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.validation.FieldError;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingRequestHeaderException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.io.IOException;
import java.util.*;
import static io.mosip.certify.core.constants.ErrorConstants.*;
@Slf4j
@ControllerAdvice
public class ExceptionHandlerAdvice extends ResponseEntityExceptionHandler implements AccessDeniedHandler {
@Autowired
MessageSource messageSource;
@Override
protected ResponseEntity handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers,
HttpStatusCode status, WebRequest request) {
return handleExceptions(ex, request);
}
@Override
protected ResponseEntity handleHttpMediaTypeNotAcceptable(
HttpMediaTypeNotAcceptableException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
return handleExceptions(ex, request);
}
@Override
protected ResponseEntity handleMissingServletRequestParameter(
MissingServletRequestParameterException ex,
HttpHeaders headers,
HttpStatusCode status,
WebRequest request) {
return handleExceptions(ex, request);
}
@Override
protected ResponseEntity handleMethodArgumentNotValid(
MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatusCode status,
WebRequest request) {
return handleExceptions(ex, request);
}
protected ResponseEntity handleTypeMismatch(TypeMismatchException ex, HttpHeaders headers,
HttpStatus status, WebRequest request) {
return handleExceptions(ex, request);
}
@ExceptionHandler(value = { Exception.class, RuntimeException.class, MissingRequestHeaderException.class })
public ResponseEntity handleExceptions(Exception ex, WebRequest request) {
log.error("Unhandled exception encountered in handler advice", ex);
String pathInfo = ((ServletWebRequest)request).getRequest().getPathInfo();
if(pathInfo != null && pathInfo.startsWith("/issuance/")) {
return handleVCIControllerExceptions(ex);
}
return handleInternalControllerException(ex);
}
private ResponseEntity handleInternalControllerException(Exception ex) {
if(ex instanceof MethodArgumentNotValidException) {
List errors = new ArrayList<>();
for (FieldError error : ((MethodArgumentNotValidException) ex).getBindingResult().getFieldErrors()) {
errors.add(new Error(error.getDefaultMessage(), error.getField() + ": " + error.getDefaultMessage()));
}
return new ResponseEntity(getResponseWrapper(errors), HttpStatus.OK);
}
if(ex instanceof javax.validation.ConstraintViolationException) {
List errors = new ArrayList<>();
Set> violations = ((javax.validation.ConstraintViolationException) ex).getConstraintViolations();
for(javax.validation.ConstraintViolation> cv : violations) {
errors.add(new Error(INVALID_REQUEST,cv.getPropertyPath().toString() + ": " + cv.getMessage()));
}
return new ResponseEntity(getResponseWrapper(errors), HttpStatus.OK);
}
if(ex instanceof MissingServletRequestParameterException) {
return new ResponseEntity(getResponseWrapper(INVALID_REQUEST, ex.getMessage()),
HttpStatus.OK);
}
if(ex instanceof HttpMediaTypeNotAcceptableException) {
return new ResponseEntity(getResponseWrapper(INVALID_REQUEST, ex.getMessage()),
HttpStatus.OK);
}
if(ex instanceof CertifyException) {
String errorCode = ((CertifyException) ex).getErrorCode();
return new ResponseEntity(getResponseWrapper(errorCode, getMessage(errorCode)), HttpStatus.OK);
}
if(ex instanceof AuthenticationCredentialsNotFoundException) {
return new ResponseEntity(getResponseWrapper(HttpStatus.UNAUTHORIZED.name(),
HttpStatus.UNAUTHORIZED.getReasonPhrase()), HttpStatus.UNAUTHORIZED);
}
if(ex instanceof AccessDeniedException) {
return new ResponseEntity(getResponseWrapper(HttpStatus.FORBIDDEN.name(),
HttpStatus.FORBIDDEN.getReasonPhrase()), HttpStatus.FORBIDDEN);
}
return new ResponseEntity(getResponseWrapper(UNKNOWN_ERROR, ex.getMessage()), HttpStatus.OK);
}
public ResponseEntity handleVCIControllerExceptions(Exception ex) {
if(ex instanceof MethodArgumentNotValidException) {
FieldError fieldError = ((MethodArgumentNotValidException) ex).getBindingResult().getFieldError();
String message = fieldError != null ? fieldError.getDefaultMessage() : ex.getMessage();
return new ResponseEntity(getVCErrorDto(message, message), HttpStatus.BAD_REQUEST);
}
if(ex instanceof javax.validation.ConstraintViolationException) {
Set> violations = ((ConstraintViolationException) ex).getConstraintViolations();
String message = !violations.isEmpty() ? violations.stream().findFirst().get().getMessage() : ex.getMessage();
return new ResponseEntity(getVCErrorDto(message, message), HttpStatus.BAD_REQUEST);
}
if(ex instanceof NotAuthenticatedException) {
String errorCode = ((CertifyException) ex).getErrorCode();
return new ResponseEntity(getVCErrorDto(errorCode, getMessage(errorCode)), HttpStatus.UNAUTHORIZED);
}
if(ex instanceof InvalidRequestException | ex instanceof CertifyException) {
String errorCode = ((CertifyException) ex).getErrorCode();
return new ResponseEntity(getVCErrorDto(errorCode, getMessage(errorCode)), HttpStatus.BAD_REQUEST);
}
log.error("Unhandled exception encountered in handler advice", ex);
return new ResponseEntity(getVCErrorDto(UNKNOWN_ERROR, ex.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
}
private ResponseWrapper getResponseWrapper(String errorCode, String errorMessage) {
Error error = new Error();
error.setErrorCode(errorCode);
error.setErrorMessage(errorMessage);
return getResponseWrapper(Arrays.asList(error));
}
private ResponseWrapper getResponseWrapper(List errors) {
ResponseWrapper responseWrapper = new ResponseWrapper<>();
responseWrapper.setResponseTime(CommonUtil.getUTCDateTime());
responseWrapper.setErrors(errors);
return responseWrapper;
}
@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException accessDeniedException) throws IOException, ServletException {
handleExceptions(accessDeniedException, (WebRequest) request);
}
private String getMessage(String errorCode) {
try {
messageSource.getMessage(errorCode, null, errorCode, Locale.getDefault());
} catch (NoSuchMessageException ex) {
log.error("Message not found in the i18n bundle", ex);
}
return errorCode;
}
private VCError getVCErrorDto(String errorCode, String description) {
VCError errorRespDto = new VCError();
errorRespDto.setError(errorCode);
errorRespDto.setError_description(description);
return errorRespDto;
}
}