Fix spring transaction issue in getNodetemplates
[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.ResponseEntity;\r
35 import org.springframework.web.bind.annotation.ExceptionHandler;\r
36 import org.springframework.web.context.request.WebRequest;\r
37 \r
38 /**\r
39  * Super class from which REST controllers are derived.\r
40  */\r
41 public class CommonRestController {\r
42 \r
43     private static final Logger LOGGER = LoggerFactory.getLogger(CommonRestController.class);\r
44 \r
45     protected static final String EXTENSION_NAME = "interface info";\r
46 \r
47     protected static final String API_VERSION_NAME = "api-version";\r
48     protected static final String API_VERSION = "1.0.0";\r
49 \r
50     protected static final String LAST_MOD_NAME = "last-mod-release";\r
51 \r
52     protected static final String AUTHORIZATION_TYPE = "basicAuth";\r
53 \r
54     protected static final String VERSION_MINOR_NAME = "X-MinorVersion";\r
55     protected static final String VERSION_MINOR_DESCRIPTION =\r
56         "Used to request or communicate a MINOR version back from the client"\r
57             + " to the server, and from the server back to the client";\r
58 \r
59     protected static final String VERSION_PATCH_NAME = "X-PatchVersion";\r
60     protected static final String VERSION_PATCH_DESCRIPTION = "Used only to communicate a PATCH version in a "\r
61         + "response for troubleshooting purposes only, and will not be provided by" + " the client on request";\r
62 \r
63     protected static final String VERSION_LATEST_NAME = "X-LatestVersion";\r
64     protected static final String VERSION_LATEST_DESCRIPTION = "Used only to communicate an API's latest version";\r
65 \r
66     public static final String REQUEST_ID_NAME = "X-ONAP-RequestID";\r
67     protected static final String REQUEST_ID_HDR_DESCRIPTION = "Used to track REST transactions for logging purpose";\r
68     protected static final String REQUEST_ID_PARAM_DESCRIPTION = "RequestID for http transaction";\r
69 \r
70     protected static final String AUTHENTICATION_ERROR_MESSAGE = "Authentication Error";\r
71     protected static final String AUTHORIZATION_ERROR_MESSAGE = "Authorization Error";\r
72     protected static final String SERVER_ERROR_MESSAGE = "Internal Server Error";\r
73     protected static final String NOT_FOUND_MESSAGE = "Resource Not Found";\r
74     protected static final String INVALID_BODY_MESSAGE = "Invalid Body";\r
75     protected static final String INVALID_PAYLOAD_MESSAGE = "Not Acceptable Payload";\r
76     protected static final String HTTP_CONFLICT_MESSAGE = "Delete Conflict, Rule Violation";\r
77     protected static final String ERROR_MESSAGE_NO_POLICIES_FOUND = "No policies found";\r
78 \r
79     protected final Coder coder = new StandardCoder();\r
80 \r
81     protected <T> ResponseEntity<T> makeOkResponse(UUID requestId, T respEntity) {\r
82         return CommonRestController.addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)\r
83             .body(respEntity);\r
84     }\r
85 \r
86     /**\r
87      * Adds version headers to the response.\r
88      *\r
89      * @param respBuilder response builder\r
90      * @return the response builder, with version headers\r
91      */\r
92     public static ResponseEntity.BodyBuilder addVersionControlHeaders(ResponseEntity.BodyBuilder respBuilder) {\r
93         return respBuilder.header(VERSION_MINOR_NAME, "0").header(VERSION_PATCH_NAME, "0").header(VERSION_LATEST_NAME,\r
94             API_VERSION);\r
95     }\r
96 \r
97     /**\r
98      * Adds logging headers to the response.\r
99      *\r
100      * @param respBuilder response builder\r
101      * @return the response builder, with version logging\r
102      */\r
103     public static ResponseEntity.BodyBuilder addLoggingHeaders(ResponseEntity.BodyBuilder respBuilder, UUID requestId) {\r
104         if (requestId == null) {\r
105             // Generate a random uuid if client does not embed requestId in rest request\r
106             return respBuilder.header(REQUEST_ID_NAME, UUID.randomUUID().toString());\r
107         }\r
108 \r
109         return respBuilder.header(REQUEST_ID_NAME, requestId.toString());\r
110     }\r
111 \r
112     /**\r
113      * Converts an object to a JSON string.\r
114      *\r
115      * @param object object to convert\r
116      * @return a JSON string representing the object\r
117      */\r
118     protected String toJson(Object object) {\r
119         if (object == null) {\r
120             return null;\r
121         }\r
122 \r
123         try {\r
124             return coder.encode(object);\r
125 \r
126         } catch (CoderException e) {\r
127             LOGGER.warn("cannot convert {} to JSON", object.getClass().getName(), e);\r
128             return null;\r
129         }\r
130     }\r
131 \r
132     @ExceptionHandler(value = {PolicyApiRuntimeException.class})\r
133     protected ResponseEntity<Object> handleException(PolicyApiRuntimeException ex, WebRequest req) {\r
134         LOGGER.warn(ex.getMessage(), ex.getCause());\r
135         final var requestId = req.getHeader(CommonRestController.REQUEST_ID_NAME);\r
136         final var status = ex.getErrorResponse().getResponseCode().getStatusCode();\r
137         return CommonRestController.addLoggingHeaders(\r
138             CommonRestController.addVersionControlHeaders(ResponseEntity.status(status)),\r
139             requestId != null ? UUID.fromString(requestId) : ex.getRequestId()).body(ex.getErrorResponse());\r
140     }\r
141 }