Listing distributions (/services/{distributionId}/distribution/) fails with ClassCast...
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / DistributionMonitoringBusinessLogic.java
index 66cab35..77bd9f3 100644 (file)
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-
 package org.openecomp.sdc.be.components.impl;
 
 import fj.data.Either;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
 import org.apache.http.HttpStatus;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.dao.cassandra.AuditCassandraDao;
@@ -40,62 +48,44 @@ import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
 import org.openecomp.sdc.be.resources.data.auditing.AuditingGenericEvent;
 import org.openecomp.sdc.be.resources.data.auditing.DistributionStatusEvent;
 import org.openecomp.sdc.common.datastructure.AuditingFieldsKey;
+import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 import org.openecomp.sdc.exception.ResponseFormat;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 @Component("distributionMonitoringBusinessLogic")
 public class DistributionMonitoringBusinessLogic extends BaseBusinessLogic {
-    private static final String DEPLOYED = "Deployed";
 
+    private static final Logger log = Logger.getLogger(ArtifactsBusinessLogic.class.getName());
+    private static final String DEPLOYED = "Deployed";
     private static final String ERROR = "Error";
-
     private static final String DISTRIBUTED = "Distributed";
-
     private static final String IN_PROGRESS = "In Progress";
-
-    private static final Logger log = Logger.getLogger(ArtifactsBusinessLogic.class.getName());
-
     private final AuditCassandraDao cassandraDao;
 
     @Autowired
-    public DistributionMonitoringBusinessLogic(IElementOperation elementDao,
-        IGroupOperation groupOperation,
-        IGroupInstanceOperation groupInstanceOperation,
-        IGroupTypeOperation groupTypeOperation,
-        InterfaceOperation interfaceOperation,
-        InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
-        AuditCassandraDao cassandraDao,
-        ArtifactsOperations artifactToscaOperation) {
-        super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation,
-            interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation);
+    public DistributionMonitoringBusinessLogic(IElementOperation elementDao, IGroupOperation groupOperation,
+                                               IGroupInstanceOperation groupInstanceOperation, IGroupTypeOperation groupTypeOperation,
+                                               InterfaceOperation interfaceOperation, InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
+                                               AuditCassandraDao cassandraDao, ArtifactsOperations artifactToscaOperation) {
+        super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation,
+            artifactToscaOperation);
         this.cassandraDao = cassandraDao;
     }
 
     public Either<DistributionStatusListResponse, ResponseFormat> getListOfDistributionStatus(String did, String userId) {
-
         validateUserExists(userId);
-
         log.trace("getListOfDistributionStatus for did {}", did);
         Either<List<DistributionStatusEvent>, ActionStatus> distributionStatus = cassandraDao.getListOfDistributionStatuses(did);
         if (distributionStatus.isRight()) {
             log.debug("not found distribution statuses for did {}   status is {} ", did, distributionStatus.right().value());
             return Either.right(componentsUtils.getResponseFormat(distributionStatus.right().value(), did));
         }
-        List<DistributionStatusInfo> distribStatusInfoList = new ArrayList<>();
-        List<DistributionStatusEvent> distributionStatusEventList = distributionStatus.left().value();
-        if (distributionStatusEventList != null) {
-            for (AuditingGenericEvent distributionStatusEvent : distributionStatusEventList) {
-                distribStatusInfoList.add(new DistributionStatusInfo(distributionStatusEvent));
-            }
-        }
+        List<DistributionStatusInfo> distribStatusInfoList = distributionStatus.left().value().stream()
+            .filter(Objects::nonNull)
+            .map(DistributionStatusInfo::new)
+            .collect(Collectors.toList());
 
         DistributionStatusListResponse distributionStatusListResponse = new DistributionStatusListResponse();
         distributionStatusListResponse.setDistributionStatusList(distribStatusInfoList);
@@ -105,18 +95,15 @@ public class DistributionMonitoringBusinessLogic extends BaseBusinessLogic {
 
     public Either<DistributionStatusOfServiceListResponce, ResponseFormat> getListOfDistributionServiceStatus(String serviceUuid, String userId) {
         validateUserExists(userId);
-
         log.trace("getListOfDistributionServiceStatus for serviceUUID {}", serviceUuid);
         Either<List<? extends AuditingGenericEvent>, ActionStatus> status = cassandraDao.getServiceDistributionStatusesList(serviceUuid);
         if (status.isRight()) {
             log.debug("failed to find service distribution statuses. error: {}", status);
             return Either.right(componentsUtils.getResponseFormat(status.right().value(), serviceUuid));
         }
-        List<DistributionStatusOfServiceInfo> distribStatusInfoList;
         List<? extends AuditingGenericEvent> distributionStatusEventList = status.left().value();
-        distribStatusInfoList = handleAuditingDaoResponse(distributionStatusEventList);
-        DistributionStatusOfServiceListResponce distributionStatusListResponse = new DistributionStatusOfServiceListResponce();
-        distributionStatusListResponse.setDistributionStatusOfServiceList(distribStatusInfoList);
+        List<DistributionStatusOfServiceInfo> distributionStatusInfoList = handleAuditingDaoResponse(distributionStatusEventList);
+        DistributionStatusOfServiceListResponce distributionStatusListResponse = new DistributionStatusOfServiceListResponce(distributionStatusInfoList);
         return Either.left(distributionStatusListResponse);
     }
 
@@ -134,15 +121,12 @@ public class DistributionMonitoringBusinessLogic extends BaseBusinessLogic {
             AuditingGenericEvent resAuditingGenericEvent = null;
             for (AuditingGenericEvent auditingGenericEvent : auditingGenericEventList) {
                 auditingGenericEvent.fillFields();
-
                 String action = (String) auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_ACTION.getDisplayName());
                 Object modifierUserId = auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_MODIFIER_UID.getDisplayName());
                 if (modifierUserId != null) {
                     distributionStatusOfServiceInfo.setUserId((String) modifierUserId);
                 }
-
                 if (action.equals(AuditingActionEnum.DISTRIBUTION_DEPLOY.getName())) {
-
                     isResult = true;
                     resAuditingGenericEvent = auditingGenericEvent;
                     break;
@@ -151,41 +135,52 @@ public class DistributionMonitoringBusinessLogic extends BaseBusinessLogic {
                 } else if (action.equals(AuditingActionEnum.DISTRIBUTION_NOTIFY.getName())) {
                     dNotifyStatus = getStatusFromAuditEvent(auditingGenericEvent);
                 }
-
                 resAuditingGenericEvent = auditingGenericEvent;
             }
-
             if (resAuditingGenericEvent != null) {
                 Map<String, Object> fields = resAuditingGenericEvent.getFields();
-
                 if (fields != null) {
-                    Optional.ofNullable(
-                        fields.get(AuditingFieldsKey.AUDIT_TIMESTAMP.getDisplayName()))
-                        .ifPresent(timestamp -> distributionStatusOfServiceInfo.setTimestamp((String) timestamp));
+                    Optional.ofNullable(fields.get(AuditingFieldsKey.AUDIT_TIMESTAMP.getDisplayName()))
+                        .ifPresent(timestamp -> distributionStatusOfServiceInfo.setTimestamp(formatTimestamp(timestamp)));
                 }
             }
-
             if (!isResult) {
                 if (dReguestStatus.equals(String.valueOf(HttpStatus.SC_OK))) {
                     if (dNotifyStatus.isEmpty()) {
                         distributionStatusOfServiceInfo.setDeployementStatus(IN_PROGRESS);
-
                     } else {
-                        if (dNotifyStatus.equals(String.valueOf(HttpStatus.SC_OK)))
+                        if (dNotifyStatus.equals(String.valueOf(HttpStatus.SC_OK))) {
                             distributionStatusOfServiceInfo.setDeployementStatus(DISTRIBUTED);
-                        else
+                        } else {
                             distributionStatusOfServiceInfo.setDeployementStatus(ERROR);
+                        }
                     }
-                } else
+                } else {
                     distributionStatusOfServiceInfo.setDeployementStatus(ERROR);
-            } else
+                }
+            } else {
                 distributionStatusOfServiceInfo.setDeployementStatus(DEPLOYED);
+            }
             reslist.add(distributionStatusOfServiceInfo);
         }
-
         return reslist;
     }
 
+    private String formatTimestamp(Object timestamp) {
+        if(timestamp instanceof String) {
+            return (String) timestamp;
+        } else if (timestamp instanceof Long) {
+            try {
+                return Instant.ofEpochMilli((Long) timestamp).atOffset(ZoneOffset.UTC).toString();
+            } catch (Exception e) {
+                log.warn(EcompLoggerErrorCode.DATA_ERROR, "sdc-be", "Failed to format timestamp: {}. Returning without formatting", timestamp, e);
+                return String.valueOf(timestamp);
+            }
+        } else {
+            return String.valueOf(timestamp);
+        }
+    }
+
     private String getStatusFromAuditEvent(AuditingGenericEvent auditingGenericEvent) {
         String status = "";
         Object requestStatus = auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_STATUS.getDisplayName());
@@ -196,25 +191,21 @@ public class DistributionMonitoringBusinessLogic extends BaseBusinessLogic {
     }
 
     private Map<String, List<AuditingGenericEvent>> createServiceDidMap(List<? extends AuditingGenericEvent> distribStatusInfoList) {
-
         Map<String, List<AuditingGenericEvent>> serviceDidMap = new HashMap<>();
         for (AuditingGenericEvent auditingGenericEvent : distribStatusInfoList) {
             List<AuditingGenericEvent> auditingGenericEventList = null;
             String did = "";
             auditingGenericEvent.fillFields();
-
             Object didValue = auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_DISTRIBUTION_ID.getDisplayName());
             if (didValue != null) {
                 did = (String) didValue;
             }
-
             if (!did.isEmpty()) {
                 if (serviceDidMap.containsKey(did)) {
                     auditingGenericEventList = serviceDidMap.get(did);
                 }
                 if (auditingGenericEventList == null) {
                     auditingGenericEventList = new ArrayList<>();
-
                 }
                 auditingGenericEventList.add(auditingGenericEvent);
                 serviceDidMap.put(did, auditingGenericEventList);
@@ -222,5 +213,4 @@ public class DistributionMonitoringBusinessLogic extends BaseBusinessLogic {
         }
         return serviceDidMap;
     }
-
 }