2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (c) 2020 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.dcaegen2.platform.mod.web.controller;
23 import org.onap.dcaegen2.platform.mod.model.exceptions.MissingRequestBodyException;
24 import org.onap.dcaegen2.platform.mod.model.exceptions.OperationNotAllowedException;
25 import org.onap.dcaegen2.platform.mod.model.exceptions.ResourceConflictException;
26 import org.onap.dcaegen2.platform.mod.model.exceptions.basemicroservice.BaseMicroserviceNotFoundException;
27 import org.onap.dcaegen2.platform.mod.model.exceptions.common.UserNotPassedException;
28 import org.onap.dcaegen2.platform.mod.model.exceptions.deploymentartifact.DeploymentArtifactNotFound;
29 import org.onap.dcaegen2.platform.mod.model.exceptions.msinstance.MsInstanceNotFoundException;
30 import org.onap.dcaegen2.platform.mod.model.exceptions.specification.SpecificationInvalid;
31 import org.onap.dcaegen2.platform.mod.model.restapi.ErrorResponse;
32 import org.onap.dcaegen2.platform.mod.model.restapi.GenericErrorResponse;
33 import com.fasterxml.jackson.core.JsonParseException;
34 import com.google.gson.Gson;
35 import lombok.extern.slf4j.Slf4j;
36 import org.springframework.http.HttpStatus;
37 import org.springframework.http.ResponseEntity;
38 import org.springframework.validation.FieldError;
39 import org.springframework.web.bind.MethodArgumentNotValidException;
40 import org.springframework.web.bind.annotation.ControllerAdvice;
41 import org.springframework.web.bind.annotation.ExceptionHandler;
42 import org.springframework.web.context.request.WebRequest;
43 import org.springframework.web.reactive.function.client.WebClientResponseException;
45 import java.util.ArrayList;
46 import java.util.Arrays;
47 import java.util.List;
51 * a class to manage all exceptions
55 public class AppExceptionHandler {
57 @ExceptionHandler(value = {WebClientResponseException.class})
58 public ResponseEntity<ErrorResponse> handleCompSpecInvalidException
59 (WebClientResponseException ex, WebRequest request) {
60 return new ResponseEntity<ErrorResponse>
61 (new ErrorResponse(ex.getResponseBodyAsString()), HttpStatus.INTERNAL_SERVER_ERROR);
64 @ExceptionHandler(value = {JsonParseException.class})
65 public ResponseEntity<GenericErrorResponse> handleJsonParsedException
66 (JsonParseException ex, WebRequest request) {
68 GenericErrorResponse response = new GenericErrorResponse();
69 response.setStatus(HttpStatus.BAD_REQUEST);
70 response.setMessage("Invalid JSON request body format.");
71 response.setErrors(Arrays.asList(ex.getMessage()));
72 return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
76 public ResponseEntity<GenericErrorResponse> specificationInvalid(SpecificationInvalid ex) {
77 Map<String, Object> errorResponse = new Gson().fromJson(ex.getMessage(), Map.class);
78 GenericErrorResponse response = new GenericErrorResponse();
79 response.setMessage((String) errorResponse.get("summary"));
80 response.setStatus(HttpStatus.BAD_REQUEST);
81 response.setErrors((List<String>) errorResponse.get("errors"));
82 return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
86 public ResponseEntity<GenericErrorResponse> missingRequestBodyException(MissingRequestBodyException ex){
87 GenericErrorResponse response = new GenericErrorResponse();
88 response.setMessage("Missing paramaters");
89 response.setStatus(HttpStatus.BAD_REQUEST);
90 response.setErrors(Arrays.asList("Missing required request body paramaters"));
91 return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
95 public ResponseEntity<ErrorResponse> resolveUserNotPassedException(UserNotPassedException ex){
96 return new ResponseEntity<>(new ErrorResponse(ex.getMessage()), HttpStatus.BAD_REQUEST);
100 public ResponseEntity<ErrorResponse> resolveMsInstanceNotFoundException(MsInstanceNotFoundException ex) {
101 log.error(ex.getMessage());
102 return new ResponseEntity<>(new ErrorResponse(ex.getMessage()), HttpStatus.BAD_REQUEST);
106 public ResponseEntity<ErrorResponse> resolveDeploymentArtifactNotFound(DeploymentArtifactNotFound ex) {
107 log.error(ex.getMessage());
108 return new ResponseEntity<>(new ErrorResponse(ex.getMessage()),
109 HttpStatus.BAD_REQUEST);
113 public ResponseEntity<ErrorResponse> resolveOperationNotAllowed(OperationNotAllowedException ex) {
114 log.error(ex.getMessage());
115 return new ResponseEntity<>(new ErrorResponse(ex.getMessage()),
116 HttpStatus.CONFLICT);
120 public ResponseEntity<ErrorResponse> resolveResourceConflict(ResourceConflictException ex) {
121 return new ResponseEntity<>(new ErrorResponse(ex.getMessage()), HttpStatus.CONFLICT);
124 @ExceptionHandler(value = {BaseMicroserviceNotFoundException.class})
125 public ResponseEntity<ErrorResponse> resolveResourceNotFoundExcetions(RuntimeException ex) {
126 log.error(ex.getMessage(), ex);
127 return new ResponseEntity<>(new ErrorResponse(ex.getMessage()), HttpStatus.CONFLICT);
130 @ExceptionHandler(MethodArgumentNotValidException.class)
131 public ResponseEntity<GenericErrorResponse> resolveBeanValidationException(MethodArgumentNotValidException ex){
132 log.error(ex.getMessage());
133 GenericErrorResponse response = new GenericErrorResponse();
134 response.setMessage("Validation failed.");
135 response.setStatus(HttpStatus.BAD_REQUEST);
136 response.setErrors(getBeanValidationErrors(ex));
137 return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
140 private List<String> getBeanValidationErrors(MethodArgumentNotValidException ex) {
141 List<String> errors = new ArrayList<>();
142 ex.getBindingResult().getAllErrors().forEach((error) -> {
143 String fieldName = ((FieldError) error).getField();
144 String errorMessage = error.getDefaultMessage();
145 errors.add(String.format("%s: %s", fieldName, errorMessage));