Handle exceptions around DB transcations, data integrity
[policy/api.git] / main / src / main / java / org / onap / policy / api / main / rest / CommonRestController.java
index 5e4c3ee..ce479bc 100644 (file)
@@ -31,9 +31,9 @@ import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoder;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
-import org.springframework.http.HttpHeaders;\r
 import org.springframework.http.ResponseEntity;\r
 import org.springframework.web.bind.annotation.ExceptionHandler;\r
+import org.springframework.web.context.request.WebRequest;\r
 \r
 /**\r
  * Super class from which REST controllers are derived.\r
@@ -63,7 +63,7 @@ public class CommonRestController {
     protected static final String VERSION_LATEST_NAME = "X-LatestVersion";\r
     protected static final String VERSION_LATEST_DESCRIPTION = "Used only to communicate an API's latest version";\r
 \r
-    protected static final String REQUEST_ID_NAME = "X-ONAP-RequestID";\r
+    public static final String REQUEST_ID_NAME = "X-ONAP-RequestID";\r
     protected static final String REQUEST_ID_HDR_DESCRIPTION = "Used to track REST transactions for logging purpose";\r
     protected static final String REQUEST_ID_PARAM_DESCRIPTION = "RequestID for http transaction";\r
 \r
@@ -79,32 +79,34 @@ public class CommonRestController {
     protected final Coder coder = new StandardCoder();\r
 \r
     protected <T> ResponseEntity<T> makeOkResponse(UUID requestId, T respEntity) {\r
-        HttpHeaders headers = new HttpHeaders();\r
-        addVersionControlHeaders(headers);\r
-        addLoggingHeaders(headers, requestId);\r
-        return ResponseEntity.ok().headers(headers).body(respEntity);\r
+        return CommonRestController.addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)\r
+            .body(respEntity);\r
     }\r
 \r
-    protected <T> ResponseEntity<T> makeErrorResponse(UUID requestId, T respEntity, int status) {\r
-        HttpHeaders headers = new HttpHeaders();\r
-        addVersionControlHeaders(headers);\r
-        addLoggingHeaders(headers, requestId);\r
-        return ResponseEntity.status(status).headers(headers).body(respEntity);\r
-    }\r
-\r
-    private void addVersionControlHeaders(HttpHeaders headers) {\r
-        headers.add("X-MinorVersion", "0");\r
-        headers.add("X-PatchVersion", "0");\r
-        headers.add("X-LatestVersion", "1.0.0");\r
+    /**\r
+     * Adds version headers to the response.\r
+     *\r
+     * @param respBuilder response builder\r
+     * @return the response builder, with version headers\r
+     */\r
+    public static ResponseEntity.BodyBuilder addVersionControlHeaders(ResponseEntity.BodyBuilder respBuilder) {\r
+        return respBuilder.header(VERSION_MINOR_NAME, "0").header(VERSION_PATCH_NAME, "0").header(VERSION_LATEST_NAME,\r
+            API_VERSION);\r
     }\r
 \r
-    private void addLoggingHeaders(HttpHeaders headers, UUID requestId) {\r
+    /**\r
+     * Adds logging headers to the response.\r
+     *\r
+     * @param respBuilder response builder\r
+     * @return the response builder, with version logging\r
+     */\r
+    public static ResponseEntity.BodyBuilder addLoggingHeaders(ResponseEntity.BodyBuilder respBuilder, UUID requestId) {\r
         if (requestId == null) {\r
             // Generate a random uuid if client does not embed requestId in rest request\r
-            headers.add("X-ONAP-RequestID", UUID.randomUUID().toString());\r
-        } else {\r
-            headers.add("X-ONAP-RequestID", requestId.toString());\r
+            return respBuilder.header(REQUEST_ID_NAME, UUID.randomUUID().toString());\r
         }\r
+\r
+        return respBuilder.header(REQUEST_ID_NAME, requestId.toString());\r
     }\r
 \r
     /**\r
@@ -128,9 +130,12 @@ public class CommonRestController {
     }\r
 \r
     @ExceptionHandler(value = {PolicyApiRuntimeException.class})\r
-    protected ResponseEntity<Object> handleException(PolicyApiRuntimeException ex) {\r
+    protected ResponseEntity<Object> handleException(PolicyApiRuntimeException ex, WebRequest req) {\r
         LOGGER.warn(ex.getMessage(), ex.getCause());\r
-        return makeErrorResponse(ex.getRequestId(), ex.getErrorResponse(),\r
-            ex.getErrorResponse().getResponseCode().getStatusCode());\r
+        final var requestId = req.getHeader(CommonRestController.REQUEST_ID_NAME);\r
+        final var status = ex.getErrorResponse().getResponseCode().getStatusCode();\r
+        return CommonRestController.addLoggingHeaders(\r
+            CommonRestController.addVersionControlHeaders(ResponseEntity.status(status)),\r
+            requestId != null ? UUID.fromString(requestId) : ex.getRequestId()).body(ex.getErrorResponse());\r
     }\r
 }
\ No newline at end of file