ef288e47feae3bcb6d75ce1a7ed501755979b088
[policy/api.git] / main / src / main / java / org / onap / policy / api / main / rest / CommonRestController.java
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * ONAP Policy API\r
4  * ================================================================================\r
5  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.\r
6  * Modifications Copyright (C) 2022 Bell Canada. All rights reserved.\r
7  * Modifications Copyright (C) 2022 Nordix Foundation.\r
8  * ================================================================================\r
9  * Licensed under the Apache License, Version 2.0 (the "License");\r
10  * you may not use this file except in compliance with the License.\r
11  * You may obtain a copy of the License at\r
12  *\r
13  *      http://www.apache.org/licenses/LICENSE-2.0\r
14  *\r
15  * Unless required by applicable law or agreed to in writing, software\r
16  * distributed under the License is distributed on an "AS IS" BASIS,\r
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
18  * See the License for the specific language governing permissions and\r
19  * limitations under the License.\r
20  *\r
21  * SPDX-License-Identifier: Apache-2.0\r
22  * ============LICENSE_END=========================================================\r
23  */\r
24 \r
25 package org.onap.policy.api.main.rest;\r
26 \r
27 import java.util.UUID;\r
28 import org.onap.policy.api.main.exception.PolicyApiRuntimeException;\r
29 import org.onap.policy.common.utils.coder.Coder;\r
30 import org.onap.policy.common.utils.coder.CoderException;\r
31 import org.onap.policy.common.utils.coder.StandardCoder;\r
32 import org.slf4j.Logger;\r
33 import org.slf4j.LoggerFactory;\r
34 import org.springframework.http.HttpStatus;\r
35 import org.springframework.http.ResponseEntity;\r
36 import org.springframework.web.bind.annotation.ExceptionHandler;\r
37 import org.springframework.web.context.request.WebRequest;\r
38 \r
39 /**\r
40  * Super class from which REST controllers are derived.\r
41  */\r
42 public class CommonRestController {\r
43 \r
44     private static final Logger LOGGER = LoggerFactory.getLogger(CommonRestController.class);\r
45 \r
46     protected static final String EXTENSION_NAME = "interface info";\r
47 \r
48     protected static final String API_VERSION_NAME = "api-version";\r
49     protected static final String API_VERSION = "1.0.0";\r
50 \r
51     protected static final String LAST_MOD_NAME = "last-mod-release";\r
52 \r
53     protected static final String AUTHORIZATION_TYPE = "basicAuth";\r
54 \r
55     protected static final String VERSION_MINOR_NAME = "X-MinorVersion";\r
56     protected static final String VERSION_MINOR_DESCRIPTION =\r
57         "Used to request or communicate a MINOR version back from the client"\r
58             + " to the server, and from the server back to the client";\r
59 \r
60     protected static final String VERSION_PATCH_NAME = "X-PatchVersion";\r
61     protected static final String VERSION_PATCH_DESCRIPTION = "Used only to communicate a PATCH version in a "\r
62         + "response for troubleshooting purposes only, and will not be provided by" + " the client on request";\r
63 \r
64     protected static final String VERSION_LATEST_NAME = "X-LatestVersion";\r
65     protected static final String VERSION_LATEST_DESCRIPTION = "Used only to communicate an API's latest version";\r
66 \r
67     public static final String REQUEST_ID_NAME = "X-ONAP-RequestID";\r
68     protected static final String REQUEST_ID_HDR_DESCRIPTION = "Used to track REST transactions for logging purpose";\r
69     protected static final String REQUEST_ID_PARAM_DESCRIPTION = "RequestID for http transaction";\r
70 \r
71     protected static final String AUTHENTICATION_ERROR_MESSAGE = "Authentication Error";\r
72     protected static final String AUTHORIZATION_ERROR_MESSAGE = "Authorization Error";\r
73     protected static final String SERVER_ERROR_MESSAGE = "Internal Server Error";\r
74     protected static final String NOT_FOUND_MESSAGE = "Resource Not Found";\r
75     protected static final String INVALID_BODY_MESSAGE = "Invalid Body";\r
76     protected static final String INVALID_PAYLOAD_MESSAGE = "Not Acceptable Payload";\r
77     protected static final String HTTP_CONFLICT_MESSAGE = "Delete Conflict, Rule Violation";\r
78     protected static final String ERROR_MESSAGE_NO_POLICIES_FOUND = "No policies found";\r
79 \r
80     protected final Coder coder = new StandardCoder();\r
81 \r
82     protected <T> ResponseEntity<T> makeOkResponse(UUID requestId, T respEntity) {\r
83         return makeResponse(requestId, respEntity, HttpStatus.OK.value());\r
84     }\r
85 \r
86     protected <T> ResponseEntity<T> makeResponse(UUID requestId, T respEntity, int status) {\r
87         return CommonRestController\r
88             .addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(status)), requestId)\r
89             .body(respEntity);\r
90     }\r
91 \r
92     /**\r
93      * Adds version headers to the response.\r
94      *\r
95      * @param respBuilder response builder\r
96      * @return the response builder, with version headers\r
97      */\r
98     public static ResponseEntity.BodyBuilder addVersionControlHeaders(ResponseEntity.BodyBuilder respBuilder) {\r
99         return respBuilder.header(VERSION_MINOR_NAME, "0").header(VERSION_PATCH_NAME, "0").header(VERSION_LATEST_NAME,\r
100             API_VERSION);\r
101     }\r
102 \r
103     /**\r
104      * Adds logging headers to the response.\r
105      *\r
106      * @param respBuilder response builder\r
107      * @return the response builder, with version logging\r
108      */\r
109     public static ResponseEntity.BodyBuilder addLoggingHeaders(ResponseEntity.BodyBuilder respBuilder, UUID requestId) {\r
110         if (requestId == null) {\r
111             // Generate a random uuid if client does not embed requestId in rest request\r
112             return respBuilder.header(REQUEST_ID_NAME, UUID.randomUUID().toString());\r
113         }\r
114 \r
115         return respBuilder.header(REQUEST_ID_NAME, requestId.toString());\r
116     }\r
117 \r
118     /**\r
119      * Converts an object to a JSON string.\r
120      *\r
121      * @param object object to convert\r
122      * @return a JSON string representing the object\r
123      */\r
124     protected String toJson(Object object) {\r
125         if (object == null) {\r
126             return null;\r
127         }\r
128 \r
129         try {\r
130             return coder.encode(object);\r
131 \r
132         } catch (CoderException e) {\r
133             LOGGER.warn("cannot convert {} to JSON", object.getClass().getName(), e);\r
134             return null;\r
135         }\r
136     }\r
137 \r
138     @ExceptionHandler(value = {PolicyApiRuntimeException.class})\r
139     protected ResponseEntity<Object> handleException(PolicyApiRuntimeException ex, WebRequest req) {\r
140         LOGGER.warn(ex.getMessage(), ex.getCause());\r
141         final var requestId = req.getHeader(CommonRestController.REQUEST_ID_NAME);\r
142         final var status = ex.getErrorResponse().getResponseCode().getStatusCode();\r
143         return CommonRestController.addLoggingHeaders(\r
144             CommonRestController.addVersionControlHeaders(ResponseEntity.status(status)),\r
145             requestId != null ? UUID.fromString(requestId) : ex.getRequestId()).body(ex.getErrorResponse());\r
146     }\r
147 }\r