Fix weakness causing NPE
[clamp.git] / src / main / java / org / onap / clamp / clds / client / req / sdc / SdcCatalogServices.java
index c01fe6a..240094e 100644 (file)
@@ -17,8 +17,9 @@
  * See the License for the specific language governing permissions and\r
  * limitations under the License.\r
  * ============LICENSE_END============================================\r
+ * Modifications copyright (c) 2018 Nokia\r
  * ===================================================================\r
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
+ * \r
  */\r
 \r
 package org.onap.clamp.clds.client.req.sdc;\r
@@ -58,7 +59,7 @@ import org.apache.commons.csv.CSVRecord;
 import org.apache.commons.io.IOUtils;\r
 import org.apache.commons.lang3.StringUtils;\r
 import org.apache.http.HttpHeaders;\r
-import org.onap.clamp.clds.config.CldsReferenceProperties;\r
+import org.onap.clamp.clds.config.ClampProperties;\r
 import org.onap.clamp.clds.exception.sdc.SdcCommunicationException;\r
 import org.onap.clamp.clds.model.CldsAlarmCondition;\r
 import org.onap.clamp.clds.model.CldsServiceData;\r
@@ -72,12 +73,16 @@ import org.onap.clamp.clds.model.sdc.SdcResource;
 import org.onap.clamp.clds.model.sdc.SdcResourceBasicInfo;\r
 import org.onap.clamp.clds.model.sdc.SdcServiceDetail;\r
 import org.onap.clamp.clds.model.sdc.SdcServiceInfo;\r
+import org.onap.clamp.clds.service.CldsService;\r
 import org.onap.clamp.clds.util.CryptoUtils;\r
+import org.onap.clamp.clds.util.JacksonUtils;\r
 import org.onap.clamp.clds.util.LoggingUtils;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.context.annotation.Primary;\r
 import org.springframework.stereotype.Component;\r
 \r
 @Component\r
+@Primary\r
 public class SdcCatalogServices {\r
 \r
     private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcCatalogServices.class);\r
@@ -93,7 +98,7 @@ public class SdcCatalogServices {
     private static final String SDC_INSTANCE_ID_CLAMP = "CLAMP-Tool";\r
     private static final String RESOURCE_URL_PREFIX = "resources";\r
     @Autowired\r
-    private CldsReferenceProperties refProp;\r
+    private ClampProperties refProp;\r
 \r
     /**\r
      * Return SDC id and pw as a HTTP Basic Auth string (for example: Basic\r
@@ -223,13 +228,12 @@ public class SdcCatalogServices {
      */\r
     public List<SdcResourceBasicInfo> removeDuplicateSdcResourceBasicInfo(\r
             List<SdcResourceBasicInfo> rawCldsSdcResourceListBasicList) {\r
-        List<SdcResourceBasicInfo> cldsSdcResourceBasicInfoList = null;\r
+        List<SdcResourceBasicInfo> cldsSdcResourceBasicInfoList = new ArrayList<>();\r
         if (rawCldsSdcResourceListBasicList != null && !rawCldsSdcResourceListBasicList.isEmpty()) {\r
             // sort list\r
             Collections.sort(rawCldsSdcResourceListBasicList);\r
             // and then take only the resources with the max version (last in\r
             // the list with the same name)\r
-            cldsSdcResourceBasicInfoList = new ArrayList<>();\r
             for (int i = 1; i < rawCldsSdcResourceListBasicList.size(); i++) {\r
                 // compare name with previous - if not equal, then keep the\r
                 // previous (it's the last with that name)\r
@@ -283,13 +287,12 @@ public class SdcCatalogServices {
      *         an empty list\r
      */\r
     private List<SdcServiceInfo> getCldsSdcServicesListFromJson(String jsonStr) {\r
-        ObjectMapper objectMapper = new ObjectMapper();\r
         if (StringUtils.isBlank(jsonStr)) {\r
             return new ArrayList<>();\r
         }\r
         try {\r
-            return objectMapper.readValue(jsonStr,\r
-                    objectMapper.getTypeFactory().constructCollectionType(List.class, SdcServiceInfo.class));\r
+            return JacksonUtils.getObjectMapperInstance().readValue(jsonStr, JacksonUtils.getObjectMapperInstance()\r
+                    .getTypeFactory().constructCollectionType(List.class, SdcServiceInfo.class));\r
         } catch (IOException e) {\r
             logger.error("Error when attempting to decode the JSON containing CldsSdcServiceInfo", e);\r
             return new ArrayList<>();\r
@@ -305,13 +308,12 @@ public class SdcCatalogServices {
      *         issues\r
      */\r
     private List<SdcResourceBasicInfo> getAllSdcResourcesListFromJson(String jsonStr) {\r
-        ObjectMapper objectMapper = new ObjectMapper();\r
         if (StringUtils.isBlank(jsonStr)) {\r
             return new ArrayList<>();\r
         }\r
         try {\r
-            return objectMapper.readValue(jsonStr,\r
-                    objectMapper.getTypeFactory().constructCollectionType(List.class, SdcResourceBasicInfo.class));\r
+            return JacksonUtils.getObjectMapperInstance().readValue(jsonStr, JacksonUtils.getObjectMapperInstance()\r
+                    .getTypeFactory().constructCollectionType(List.class, SdcResourceBasicInfo.class));\r
         } catch (IOException e) {\r
             logger.error("Exception occurred when attempting to decode the list of CldsSdcResourceBasicInfo JSON", e);\r
             return new ArrayList<>();\r
@@ -325,9 +327,8 @@ public class SdcCatalogServices {
      * @return\r
      */\r
     public SdcServiceDetail decodeCldsSdcServiceDetailFromJson(String jsonStr) {\r
-        ObjectMapper objectMapper = new ObjectMapper();\r
         try {\r
-            return objectMapper.readValue(jsonStr, SdcServiceDetail.class);\r
+            return JacksonUtils.getObjectMapperInstance().readValue(jsonStr, SdcServiceDetail.class);\r
         } catch (IOException e) {\r
             logger.error("Exception when attempting to decode the CldsSdcServiceDetail JSON", e);\r
             return null;\r
@@ -469,12 +470,12 @@ public class SdcCatalogServices {
         String serviceUuid = getServiceUuidFromServiceInvariantId(invariantServiceUuid);\r
         String serviceDetailUrl = url + "/" + serviceUuid + SDC_METADATA_URL_PREFIX;\r
         String responseStr = getCldsServicesOrResourcesBasedOnURL(serviceDetailUrl);\r
-        ObjectMapper objectMapper = new ObjectMapper();\r
         CldsServiceData cldsServiceData = new CldsServiceData();\r
         if (responseStr != null) {\r
             SdcServiceDetail cldsSdcServiceDetail;\r
             try {\r
-                cldsSdcServiceDetail = objectMapper.readValue(responseStr, SdcServiceDetail.class);\r
+                cldsSdcServiceDetail = JacksonUtils.getObjectMapperInstance().readValue(responseStr,\r
+                        SdcServiceDetail.class);\r
             } catch (IOException e) {\r
                 logger.error("Exception when decoding the CldsServiceData JSON from SDC", e);\r
                 throw new SdcCommunicationException("Exception when decoding the CldsServiceData JSON from SDC", e);\r
@@ -567,11 +568,10 @@ public class SdcCatalogServices {
         }\r
     }\r
 \r
-    private List<CldsVfcData> getVfcDataListFromVfResponse(String vfResponse) throws GeneralSecurityException {\r
-        ObjectMapper mapper = new ObjectMapper();\r
+    private List<CldsVfcData> getVfcDataListFromVfResponse(String vfResponse) {\r
         ObjectNode vfResponseNode;\r
         try {\r
-            vfResponseNode = (ObjectNode) mapper.readTree(vfResponse);\r
+            vfResponseNode = (ObjectNode) JacksonUtils.getObjectMapperInstance().readTree(vfResponse);\r
         } catch (IOException e) {\r
             logger.error("Exception when decoding the JSON list of CldsVfcData", e);\r
             return new ArrayList<>();\r
@@ -613,8 +613,7 @@ public class SdcCatalogServices {
             String vfcResourceUUIDUrl = catalogUrl + RESOURCE_URL_PREFIX + "/" + resourceUUID + SDC_METADATA_URL_PREFIX;\r
             try {\r
                 String vfcResponse = getCldsServicesOrResourcesBasedOnURL(vfcResourceUUIDUrl);\r
-                ObjectMapper mapper = new ObjectMapper();\r
-                ObjectNode vfResponseNode = (ObjectNode) mapper.readTree(vfcResponse);\r
+                ObjectNode vfResponseNode = (ObjectNode) JacksonUtils.getObjectMapperInstance().readTree(vfcResponse);\r
                 ArrayNode vfcArrayNode = (ArrayNode) vfResponseNode.get("resources");\r
                 if (vfcArrayNode != null) {\r
                     for (JsonNode vfcjsonNode : vfcArrayNode) {\r
@@ -638,10 +637,9 @@ public class SdcCatalogServices {
 \r
     private List<CldsAlarmCondition> getAlarmCondtionsFromVfc(String vfcResponse) throws GeneralSecurityException {\r
         List<CldsAlarmCondition> cldsAlarmConditionList = new ArrayList<>();\r
-        ObjectMapper mapper = new ObjectMapper();\r
         ObjectNode vfcResponseNode;\r
         try {\r
-            vfcResponseNode = (ObjectNode) mapper.readTree(vfcResponse);\r
+            vfcResponseNode = (ObjectNode) JacksonUtils.getObjectMapperInstance().readTree(vfcResponse);\r
         } catch (IOException e) {\r
             logger.error("Exception when decoding the JSON list of CldsAlarmCondition", e);\r
             return cldsAlarmConditionList;\r
@@ -683,10 +681,9 @@ public class SdcCatalogServices {
     // Method to get the artifact for any particular VF\r
     private List<CldsVfKPIData> getFieldPathFromVF(String vfResponse) throws GeneralSecurityException {\r
         List<CldsVfKPIData> cldsVfKPIDataList = new ArrayList<>();\r
-        ObjectMapper mapper = new ObjectMapper();\r
         ObjectNode vfResponseNode;\r
         try {\r
-            vfResponseNode = (ObjectNode) mapper.readTree(vfResponse);\r
+            vfResponseNode = (ObjectNode) JacksonUtils.getObjectMapperInstance().readTree(vfResponse);\r
         } catch (IOException e) {\r
             logger.error("Exception when decoding the JSON list of CldsVfKPIData", e);\r
             return cldsVfKPIDataList;\r
@@ -840,27 +837,28 @@ public class SdcCatalogServices {
      * @param globalProps\r
      * @param cldsServiceData\r
      * @return\r
+     * @throws IOException\r
+     *             In case of issues during the parsing of the Global Properties\r
      */\r
-    public String createPropertiesObjectByUUID(String globalProps, CldsServiceData cldsServiceData) {\r
+    public String createPropertiesObjectByUUID(CldsServiceData cldsServiceData) throws IOException {\r
         String totalPropsStr;\r
-        ObjectMapper mapper = new ObjectMapper();\r
-        ObjectNode globalPropsJson;\r
+        ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();\r
+        ObjectNode globalPropsJson = (ObjectNode) refProp.getJsonTemplate(CldsService.GLOBAL_PROPERTIES_KEY);\r
         if (cldsServiceData != null && cldsServiceData.getServiceUUID() != null) {\r
             // Objectnode to save all byservice, byvf , byvfc and byalarm nodes\r
             ObjectNode byIdObjectNode = mapper.createObjectNode();\r
             // To create vf ResourceUUID node with serviceInvariantUUID\r
-            ObjectNode invariantUuidObjectNodeWithVf = createVfObjectNodeByServiceInvariantUuid(mapper,\r
-                    cldsServiceData);\r
+            ObjectNode invariantUuidObjectNodeWithVf = createVfObjectNodeByServiceInvariantUuid(cldsServiceData);\r
             byIdObjectNode.putPOJO("byService", invariantUuidObjectNodeWithVf);\r
             // To create byVf and vfcResourceNode with vfResourceUUID\r
-            ObjectNode vfcObjectNodeByVfUuid = createVfcObjectNodeByVfUuid(mapper, cldsServiceData.getCldsVfs());\r
+            ObjectNode vfcObjectNodeByVfUuid = createVfcObjectNodeByVfUuid(cldsServiceData.getCldsVfs());\r
             byIdObjectNode.putPOJO("byVf", vfcObjectNodeByVfUuid);\r
             // To create byKpi\r
             ObjectNode kpiObjectNode = mapper.createObjectNode();\r
             if (cldsServiceData.getCldsVfs() != null && !cldsServiceData.getCldsVfs().isEmpty()) {\r
                 for (CldsVfData currCldsVfData : cldsServiceData.getCldsVfs()) {\r
                     if (currCldsVfData != null) {\r
-                        createKpiObjectNodeByVfUuid(mapper, kpiObjectNode, currCldsVfData.getCldsKPIList());\r
+                        createKpiObjectNodeByVfUuid(kpiObjectNode, currCldsVfData.getCldsKPIList());\r
                     }\r
                 }\r
             }\r
@@ -870,8 +868,7 @@ public class SdcCatalogServices {
             if (cldsServiceData.getCldsVfs() != null && !cldsServiceData.getCldsVfs().isEmpty()) {\r
                 for (CldsVfData currCldsVfData : cldsServiceData.getCldsVfs()) {\r
                     if (currCldsVfData != null) {\r
-                        createAlarmCondObjectNodeByVfcUuid(mapper, vfcResourceUuidObjectNode,\r
-                                currCldsVfData.getCldsVfcs());\r
+                        createAlarmCondObjectNodeByVfcUuid(vfcResourceUuidObjectNode, currCldsVfData.getCldsVfcs());\r
                     }\r
                 }\r
             }\r
@@ -879,35 +876,20 @@ public class SdcCatalogServices {
             // To create byAlarmCondition with alarmConditionKey\r
             List<CldsAlarmCondition> allAlarmConditions = getAllAlarmConditionsFromCldsServiceData(cldsServiceData,\r
                     "alarmCondition");\r
-            ObjectNode alarmCondObjectNodeByAlarmKey = createAlarmCondObjectNodeByAlarmKey(mapper, allAlarmConditions);\r
+            ObjectNode alarmCondObjectNodeByAlarmKey = createAlarmCondObjectNodeByAlarmKey(allAlarmConditions);\r
             byIdObjectNode.putPOJO("byAlarmCondition", alarmCondObjectNodeByAlarmKey);\r
             // To create byAlertDescription with AlertDescription\r
             List<CldsAlarmCondition> allAlertDescriptions = getAllAlarmConditionsFromCldsServiceData(cldsServiceData,\r
                     "alertDescription");\r
-            ObjectNode alertDescObjectNodeByAlert = createAlarmCondObjectNodeByAlarmKey(mapper, allAlertDescriptions);\r
+            ObjectNode alertDescObjectNodeByAlert = createAlarmCondObjectNodeByAlarmKey(allAlertDescriptions);\r
             byIdObjectNode.putPOJO("byAlertDescription", alertDescObjectNodeByAlert);\r
-            globalPropsJson = decodeGlobalProp(globalProps, mapper);\r
             globalPropsJson.putPOJO("shared", byIdObjectNode);\r
             logger.info("Global properties JSON created with SDC info:" + globalPropsJson);\r
-        } else {\r
-            /**\r
-             * to create json with total properties when no serviceUUID passed\r
-             */\r
-            globalPropsJson = decodeGlobalProp(globalProps, mapper);\r
         }\r
         totalPropsStr = globalPropsJson.toString();\r
         return totalPropsStr;\r
     }\r
 \r
-    private ObjectNode decodeGlobalProp(String globalProps, ObjectMapper mapper) {\r
-        try {\r
-            return (ObjectNode) mapper.readValue(globalProps, JsonNode.class);\r
-        } catch (IOException e) {\r
-            logger.error("Exception occurred during decoding of the global props, returning an empty objectNode", e);\r
-            return mapper.createObjectNode();\r
-        }\r
-    }\r
-\r
     /**\r
      * Method to get alarm conditions/alert description from Service Data.\r
      * \r
@@ -975,8 +957,8 @@ public class SdcCatalogServices {
         return alarmCondList;\r
     }\r
 \r
-    private ObjectNode createAlarmCondObjectNodeByAlarmKey(ObjectMapper mapper,\r
-            List<CldsAlarmCondition> cldsAlarmCondList) {\r
+    private ObjectNode createAlarmCondObjectNodeByAlarmKey(List<CldsAlarmCondition> cldsAlarmCondList) {\r
+        ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();\r
         ObjectNode alarmCondKeyNode = mapper.createObjectNode();\r
         if (cldsAlarmCondList != null && !cldsAlarmCondList.isEmpty()) {\r
             for (CldsAlarmCondition currCldsAlarmCondition : cldsAlarmCondList) {\r
@@ -996,7 +978,8 @@ public class SdcCatalogServices {
         return alarmCondKeyNode;\r
     }\r
 \r
-    private ObjectNode createVfObjectNodeByServiceInvariantUuid(ObjectMapper mapper, CldsServiceData cldsServiceData) {\r
+    private ObjectNode createVfObjectNodeByServiceInvariantUuid(CldsServiceData cldsServiceData) {\r
+        ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();\r
         ObjectNode invariantUuidObjectNode = mapper.createObjectNode();\r
         ObjectNode vfObjectNode = mapper.createObjectNode();\r
         ObjectNode vfUuidNode = mapper.createObjectNode();\r
@@ -1015,8 +998,9 @@ public class SdcCatalogServices {
         return invariantUuidObjectNode;\r
     }\r
 \r
-    private void createKpiObjectNodeByVfUuid(ObjectMapper mapper, ObjectNode vfResourceUuidObjectNode,\r
+    private void createKpiObjectNodeByVfUuid(ObjectNode vfResourceUuidObjectNode,\r
             List<CldsVfKPIData> cldsVfKpiDataList) {\r
+        ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();\r
         if (cldsVfKpiDataList != null && !cldsVfKpiDataList.isEmpty()) {\r
             for (CldsVfKPIData currCldsVfKpiData : cldsVfKpiDataList) {\r
                 if (currCldsVfKpiData != null) {\r
@@ -1034,8 +1018,9 @@ public class SdcCatalogServices {
         }\r
     }\r
 \r
-    private void createAlarmCondObjectNodeByVfcUuid(ObjectMapper mapper, ObjectNode vfcResourceUuidObjectNode,\r
+    private void createAlarmCondObjectNodeByVfcUuid(ObjectNode vfcResourceUuidObjectNode,\r
             List<CldsVfcData> cldsVfcDataList) {\r
+        ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();\r
         ObjectNode vfcObjectNode = mapper.createObjectNode();\r
         ObjectNode alarmCondNode = mapper.createObjectNode();\r
         ObjectNode alertDescNode = mapper.createObjectNode();\r
@@ -1075,7 +1060,8 @@ public class SdcCatalogServices {
      * @param cldsVfDataList\r
      * @return\r
      */\r
-    private ObjectNode createVfcObjectNodeByVfUuid(ObjectMapper mapper, List<CldsVfData> cldsVfDataList) {\r
+    private ObjectNode createVfcObjectNodeByVfUuid(List<CldsVfData> cldsVfDataList) {\r
+        ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();\r
         ObjectNode vfUuidObjectNode = mapper.createObjectNode();\r
         if (cldsVfDataList != null && !cldsVfDataList.isEmpty()) {\r
             for (CldsVfData currCldsVfData : cldsVfDataList) {\r
@@ -1243,4 +1229,77 @@ public class SdcCatalogServices {
             }\r
         }\r
     }\r
+\r
+    /**\r
+     * Method to delete blueprint and location json artifacts from sdc\r
+     * \r
+     * @param prop\r
+     * @param userid\r
+     * @param sdcReqUrlsList\r
+     * @param artifactName\r
+     * @param locationArtifactName\r
+     * @throws GeneralSecurityException\r
+     * @throws DecoderException\r
+     */\r
+    public void deleteArtifactsFromSdc(ModelProperties prop, String userid, List<String> sdcReqUrlsList,\r
+            String artifactName, String locationArtifactName) throws GeneralSecurityException, DecoderException {\r
+        String serviceInvariantUuid = getServiceInvariantUuidFromProps(prop);\r
+        for (String url : sdcReqUrlsList) {\r
+            String originalServiceUuid = getServiceUuidFromServiceInvariantId(serviceInvariantUuid);\r
+            logger.info("ServiceUUID used before deleting in url:" + originalServiceUuid);\r
+            String sdcServicesInformation = getSdcServicesInformation(originalServiceUuid);\r
+            SdcServiceDetail cldsSdcServiceDetail = decodeCldsSdcServiceDetailFromJson(sdcServicesInformation);\r
+            String uploadedArtifactUuid = getArtifactIdIfArtifactAlreadyExists(cldsSdcServiceDetail, artifactName);\r
+            String responseStr = deleteArtifact(userid, url, uploadedArtifactUuid);\r
+            logger.info("value of sdc Response of deleting blueprint from sdc :" + responseStr);\r
+            String updatedServiceUuid = getServiceUuidFromServiceInvariantId(serviceInvariantUuid);\r
+            if (!originalServiceUuid.equalsIgnoreCase(updatedServiceUuid)) {\r
+                url = url.replace(originalServiceUuid, updatedServiceUuid);\r
+            }\r
+            logger.info("ServiceUUID used after delete in ulr:" + updatedServiceUuid);\r
+            sdcServicesInformation = getSdcServicesInformation(updatedServiceUuid);\r
+            cldsSdcServiceDetail = decodeCldsSdcServiceDetailFromJson(sdcServicesInformation);\r
+            uploadedArtifactUuid = getArtifactIdIfArtifactAlreadyExists(cldsSdcServiceDetail, locationArtifactName);\r
+            responseStr = deleteArtifact(userid, url, uploadedArtifactUuid);\r
+            logger.info("value of sdc Response of deleting location json from sdc :" + responseStr);\r
+        }\r
+    }\r
+\r
+    private String deleteArtifact(String userid, String url, String uploadedArtifactUuid) {\r
+        try {\r
+            String responseStr = "";\r
+            if (uploadedArtifactUuid != null && !uploadedArtifactUuid.isEmpty()) {\r
+                logger.info("userid=" + userid);\r
+                String basicAuth = getSdcBasicAuth();\r
+                String sdcXonapInstanceId = refProp.getStringValue("sdc.sdcX-InstanceID");\r
+                url = url + "/" + uploadedArtifactUuid;\r
+                URL urlObj = new URL(url);\r
+                HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();\r
+                conn.setDoOutput(true);\r
+                conn.setRequestProperty(refProp.getStringValue(SDC_INSTANCE_ID_PROPERTY_NAME), sdcXonapInstanceId);\r
+                conn.setRequestProperty(HttpHeaders.AUTHORIZATION, basicAuth);\r
+                conn.setRequestProperty("USER_ID", userid);\r
+                conn.setRequestMethod("DELETE");\r
+                conn.setRequestProperty("charset", "utf-8");\r
+                conn.setUseCaches(false);\r
+                conn.setRequestProperty(refProp.getStringValue(SDC_REQUESTID_PROPERTY_NAME),\r
+                        LoggingUtils.getRequestId());\r
+                boolean requestFailed = true;\r
+                int responseCode = conn.getResponseCode();\r
+                logger.info("responseCode=" + responseCode);\r
+                if (responseCode == 200) {\r
+                    requestFailed = false;\r
+                }\r
+                responseStr = getResponse(conn);\r
+                if (responseStr != null && requestFailed) {\r
+                    logger.error("requestFailed - responseStr=" + responseStr);\r
+                    throw new BadRequestException(responseStr);\r
+                }\r
+            }\r
+            return responseStr;\r
+        } catch (IOException | DecoderException | GeneralSecurityException e) {\r
+            logger.error("Exception when attempting to communicate with SDC", e);\r
+            throw new SdcCommunicationException("Exception when attempting to communicate with SDC", e);\r
+        }\r
+    }\r
 }\r