Merge "Async MSO error format: handle more cases"
[vid.git] / vid-app-common / src / main / java / org / onap / vid / mso / MsoUtil.java
index 6a1030c..8de534a 100644 (file)
@@ -2,8 +2,8 @@
  * ============LICENSE_START=======================================================
  * VID
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2018 Nokia. All rights reserved.
+ * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2018 - 2019 Nokia. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 package org.onap.vid.mso;
 
-import io.joshworks.restclient.http.HttpResponse;
+import static org.apache.commons.lang3.StringUtils.firstNonBlank;
+import static org.apache.commons.lang3.StringUtils.isEmpty;
+import static org.onap.vid.utils.KotlinUtilsKt.JACKSON_OBJECT_MAPPER;
 
-import java.util.Objects;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import io.joshworks.restclient.http.HttpResponse;
+import java.io.IOException;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 
 public class MsoUtil {
 
+
     private MsoUtil() {
     }
 
@@ -36,12 +43,64 @@ public class MsoUtil {
         return new MsoResponseWrapper(status, response);
     }
 
-    public static <T> MsoResponseWrapper wrapResponse(HttpResponse<T> httpResponse) {
+    public static <T> MsoResponseWrapper wrapResponse(HttpResponse<T> httpResponse)  {
         MsoResponseWrapper msoResponseWrapper = new MsoResponseWrapper();
         msoResponseWrapper.setStatus(httpResponse.getStatus());
         if (httpResponse.getRawBody() != null) {
-            msoResponseWrapper.setEntity(Objects.toString(httpResponse.getBody()));
+            try {
+                T body = httpResponse.getBody();
+                String entityStr = (body instanceof String || body==null) ? (String) body :
+                    JACKSON_OBJECT_MAPPER.writeValueAsString(httpResponse.getBody());
+                msoResponseWrapper.setEntity(entityStr);
+            } catch(JsonProcessingException e) {
+                ExceptionUtils.rethrow(e);
+            }
         }
         return msoResponseWrapper;
     }
+
+    public static <T> MsoResponseWrapper2<T> wrapResponse2(HttpResponse<String> httpResponse, Class<T> clazz) {
+        String raw = httpResponse.getBody(); // As body's T is String, use getBody as a simple way to get raw
+        if (raw != null) {
+            try {
+                T entity = JACKSON_OBJECT_MAPPER.readValue(raw, clazz);
+                return new MsoResponseWrapper2<>(httpResponse.getStatus(), entity, raw);
+            } catch (JsonProcessingException exception) {
+                return new MsoResponseWrapper2<>(httpResponse.getStatus(), null, raw);
+            } catch (IOException exception) {
+                ExceptionUtils.rethrow(exception);
+            }
+        }
+
+        return new MsoResponseWrapper2<>(httpResponse.getStatus(), null, null);
+    }
+
+    public static String formatExceptionAdditionalInfo(int statusCode, String msoResponse) {
+        final String errorMsg = "Http Code:" + statusCode;
+
+        if (isEmpty(msoResponse)) {
+            return errorMsg;
+        }
+
+        try {
+            JsonNode jsonNode = JACKSON_OBJECT_MAPPER.readTree(msoResponse);
+
+            return errorMsg + ", " + firstNonBlank(
+                removeBraces(jsonNode.get("serviceException")),
+                removeBraces(jsonNode.path("requestError").get("serviceException")),
+                msoResponse
+            );
+
+        } catch (Exception e) {
+            return errorMsg + ", " + msoResponse;
+        }
+    }
+
+    private static String removeBraces(JsonNode jsonNode) {
+        if (jsonNode == null || jsonNode.isMissingNode()) {
+            return null;
+        }
+
+        return jsonNode.toString().replaceAll("[\\{\\}]", "");
+    }
 }