Merge "adding catalog-service for mod2"
[dcaegen2/platform.git] / mod2 / catalog-service / src / main / java / org / onap / dcaegen2 / platform / mod / web / controller / AppExceptionHandler.java
1 /*
2  * ============LICENSE_START=======================================================
3  *  org.onap.dcae
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
10  *
11  *       http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20
21 package org.onap.dcaegen2.platform.mod.web.controller;
22
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;
44
45 import java.util.ArrayList;
46 import java.util.Arrays;
47 import java.util.List;
48 import java.util.Map;
49
50 /**
51  * a class to manage all exceptions
52  */
53 @ControllerAdvice
54 @Slf4j
55 public class AppExceptionHandler {
56
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);
62     }
63
64     @ExceptionHandler(value = {JsonParseException.class})
65     public ResponseEntity<GenericErrorResponse> handleJsonParsedException
66             (JsonParseException ex, WebRequest request) {
67
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);
73     }
74
75     @ExceptionHandler
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);
83     }
84
85     @ExceptionHandler
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);
92     }
93
94     @ExceptionHandler
95     public ResponseEntity<ErrorResponse> resolveUserNotPassedException(UserNotPassedException ex){
96         return new ResponseEntity<>(new ErrorResponse(ex.getMessage()), HttpStatus.BAD_REQUEST);
97     }
98
99     @ExceptionHandler
100     public ResponseEntity<ErrorResponse> resolveMsInstanceNotFoundException(MsInstanceNotFoundException ex) {
101         log.error(ex.getMessage());
102         return new ResponseEntity<>(new ErrorResponse(ex.getMessage()), HttpStatus.BAD_REQUEST);
103     }
104
105     @ExceptionHandler
106     public ResponseEntity<ErrorResponse> resolveDeploymentArtifactNotFound(DeploymentArtifactNotFound ex) {
107         log.error(ex.getMessage());
108         return new ResponseEntity<>(new ErrorResponse(ex.getMessage()),
109                 HttpStatus.BAD_REQUEST);
110     }
111
112     @ExceptionHandler
113     public ResponseEntity<ErrorResponse> resolveOperationNotAllowed(OperationNotAllowedException ex) {
114         log.error(ex.getMessage());
115         return new ResponseEntity<>(new ErrorResponse(ex.getMessage()),
116                 HttpStatus.CONFLICT);
117     }
118
119     @ExceptionHandler
120     public ResponseEntity<ErrorResponse> resolveResourceConflict(ResourceConflictException ex) {
121         return new ResponseEntity<>(new ErrorResponse(ex.getMessage()), HttpStatus.CONFLICT);
122     }
123
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);
128     }
129
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);
138     }
139
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));
146         });
147         return errors;
148     }
149 }