Merge "VES Heartbeat and Software Management Feature"
[oam/tr069-adapter.git] / ves-agent / src / main / java / org / commscope / tr069adapter / vesagent / controller / HeartBeatMessageHandler.java
index be253c3..c62681c 100644 (file)
  */\r
 package org.commscope.tr069adapter.vesagent.controller;\r
 \r
-import com.fasterxml.jackson.core.JsonProcessingException;\r
 import com.fasterxml.jackson.databind.ObjectMapper;\r
 \r
-import org.commscope.tr069adapter.acs.common.DeviceInform;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.commscope.tr069adapter.acs.common.OperationDetails;\r
+import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
 import org.commscope.tr069adapter.mapper.model.VESNotification;\r
 import org.commscope.tr069adapter.mapper.model.VESNotificationResponse;\r
 import org.commscope.tr069adapter.vesagent.VesConfiguration;\r
+import org.commscope.tr069adapter.vesagent.entity.DeviceDataEntity;\r
+import org.commscope.tr069adapter.vesagent.exception.VesAgentException;\r
 import org.commscope.tr069adapter.vesagent.http.HttpRequestSender;\r
 import org.commscope.tr069adapter.vesagent.model.CommonEventHeader;\r
 import org.commscope.tr069adapter.vesagent.model.Event;\r
 import org.commscope.tr069adapter.vesagent.model.EventMessage;\r
 import org.commscope.tr069adapter.vesagent.model.HeartbeatFields;\r
+import org.commscope.tr069adapter.vesagent.service.VesAgentServiceHelper;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentConstants;\r
+import org.commscope.tr069adapter.vesagent.util.VesAgentUtils;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
@@ -39,16 +49,18 @@ public class HeartBeatMessageHandler {
 \r
   private static final Logger logger = LoggerFactory.getLogger(HeartBeatMessageHandler.class);\r
 \r
+  @Autowired\r
+  VesAgentServiceHelper vesAgentServiceHelper;\r
+\r
   @Autowired\r
   VesConfiguration config;\r
 \r
   @Autowired\r
   HttpRequestSender sender;\r
 \r
-  public VESNotificationResponse handlePINotification(VESNotification vesNoti)\r
-      throws JsonProcessingException {\r
-    Event event =\r
-        convertNotificationToVESEvent(vesNoti.getDevnotification(), vesNoti.geteNodeBName());\r
+  public VESNotificationResponse sendHeartBeatEvent(DeviceDataEntity deviceDataEntity,\r
+      int heartBeatPeriod) throws Exception {\r
+    Event event = convertNotificationToVESEvent(deviceDataEntity, heartBeatPeriod);\r
 \r
     EventMessage evMsg = new EventMessage();\r
     evMsg.setEvent(event);\r
@@ -64,34 +76,152 @@ public class HeartBeatMessageHandler {
     return sender.postRequest(url, requestBody);\r
   }\r
 \r
-  Event convertNotificationToVESEvent(DeviceInform notification, String eNodeBName) {\r
+  public void handleRegisterRequest(VESNotification vesNotification) {\r
+    try {\r
+      VesAgentUtils.validateVESNotification(vesNotification);\r
+    } catch (VesAgentException e) {\r
+      logger.error(\r
+          "Failed to create heartbeat timers for device on recieving bootstrap. ErrorMsg: {}",\r
+          e.getMessage());\r
+      return;\r
+    }\r
+\r
+    List<DeviceDataEntity> deviceDataEntityList = vesAgentServiceHelper.findByDeviceIdAndGroup(\r
+        vesNotification.getDevnotification().getDeviceDetails().getDeviceId(),\r
+        VesAgentConstants.HEART_BEAT);\r
+\r
+    if (Boolean.FALSE.equals(VesAgentUtils.isNullOrEmpty(deviceDataEntityList))) {\r
+      DeviceDataEntity deviceDataEntity = deviceDataEntityList.get(0);\r
+      String heartbeatPeriod =\r
+          deviceDataEntity.getAttributesMap().get(VesAgentConstants.HEART_BEAT_PERIOD);\r
+\r
+      if (!VesAgentUtils.isNullOrEmpty(heartbeatPeriod)\r
+          && !heartbeatPeriod.equalsIgnoreCase(VesAgentConstants.REMOVE_HEART_BEAT_TIMER_VAL)) {\r
+        return;\r
+      }\r
+    }\r
+\r
+    logger.info("Creating heartbeat records and timer using default heartbeatPeriod {} minutes.",\r
+        VesAgentConstants.HEART_BEAT_PERIOD_DEFAULT_VAL);\r
+\r
+    DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
+    deviceRPCRequest.setDeviceDetails(vesNotification.getDevnotification().getDeviceDetails());\r
+\r
+    OperationDetails opDetails = new OperationDetails();\r
+\r
+    ParameterDTO heartBeatPeriodParam = new ParameterDTO();\r
+    heartBeatPeriodParam.setParamName(VesAgentConstants.HEART_BEAT_PERIOD);\r
+    heartBeatPeriodParam.setParamValue(VesAgentConstants.HEART_BEAT_PERIOD_DEFAULT_VAL);\r
+\r
+    List<ParameterDTO> paramList = new ArrayList<>();\r
+    paramList.add(heartBeatPeriodParam);\r
+\r
+    opDetails.setParmeters(paramList);\r
+    deviceRPCRequest.setOpDetails(opDetails);\r
+\r
+    deviceRPCRequest.addContextParam(VesAgentConstants.ENODEB_NAME,\r
+        vesNotification.geteNodeBName());\r
+\r
+    handleSetConfigRequest(deviceRPCRequest);\r
+\r
+  }\r
+\r
+  public DeviceRPCResponse handleSetConfigRequest(DeviceRPCRequest deviceRPCRequest) {\r
+    try {\r
+      VesAgentUtils.validateDeviceRPCRequest(deviceRPCRequest);\r
+    } catch (VesAgentException e) {\r
+      return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());\r
+    }\r
+\r
+    OperationDetails operationDetails = deviceRPCRequest.getOpDetails();\r
+\r
+    String heartBeatPeriod = null;\r
+    String countDownTimer = null;\r
+\r
+    ParameterDTO countDownTimerDTO = null;\r
+\r
+    List<ParameterDTO> paramDTOList = operationDetails.getParmeters();\r
+    for (ParameterDTO paramDTO : paramDTOList) {\r
+      if (paramDTO.getParamName().equalsIgnoreCase(VesAgentConstants.HEART_BEAT_PERIOD)) {\r
+        heartBeatPeriod = paramDTO.getParamValue();\r
+      }\r
+\r
+      if (paramDTO.getParamName().equalsIgnoreCase(VesAgentConstants.COUNT_DOWN_TIMER)) {\r
+        countDownTimer = paramDTO.getParamValue();\r
+        countDownTimerDTO = paramDTO;\r
+      }\r
+    }\r
+\r
+    try {\r
+      vesAgentServiceHelper.processHeartBeatSetRequest(deviceRPCRequest, heartBeatPeriod,\r
+          countDownTimer);\r
+    } catch (VesAgentException e) {\r
+      return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());\r
+    }\r
+\r
+    copyHeartBeatPeriodToTimerForResponse(countDownTimerDTO, heartBeatPeriod);\r
+    return VesAgentUtils.getSuccessResponse(deviceRPCRequest);\r
+  }\r
+\r
+  private void copyHeartBeatPeriodToTimerForResponse(ParameterDTO countDownParam,\r
+      String heartBeatPeriod) {\r
+    if (null != countDownParam && !VesAgentUtils.isNullOrEmpty(heartBeatPeriod)) {\r
+      countDownParam.setParamValue(heartBeatPeriod);\r
+    }\r
+  }\r
+\r
+  public DeviceRPCResponse handleGetConfigRequest(DeviceRPCRequest deviceRPCRequest) {\r
+    try {\r
+      VesAgentUtils.validateDeviceRPCRequest(deviceRPCRequest);\r
+    } catch (VesAgentException e) {\r
+      return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());\r
+    }\r
+\r
+    vesAgentServiceHelper.processHeartBeatGetRequest(deviceRPCRequest);\r
+    return VesAgentUtils.getSuccessResponse(deviceRPCRequest);\r
+  }\r
+\r
+  public VESNotificationResponse handleDeleteConfigRequest(VESNotification vesNotification) {\r
+    try {\r
+      VesAgentUtils.validateDelVESNotification(vesNotification);\r
+      vesAgentServiceHelper.processHeartBeatDeleteRequest(vesNotification);\r
+    } catch (VesAgentException e) {\r
+      return new VESNotificationResponse(Integer.parseInt(e.getErrorCode()), e.getMessage());\r
+    } catch (Exception e) {\r
+      return new VESNotificationResponse(VesAgentConstants.RPC_FAILED, e.getMessage());\r
+    }\r
+\r
+    return new VESNotificationResponse(VesAgentConstants.RPC_SUCCESS, "success");\r
+  }\r
+\r
+  Event convertNotificationToVESEvent(DeviceDataEntity deviceDataEntity, int heartBeatPeriod) {\r
     Event hbEvent = new Event();\r
     CommonEventHeader eventHeader = new CommonEventHeader();\r
 \r
     eventHeader.setDomain("heartbeat");\r
-    eventHeader.setEventId(\r
-        "Heartbeat_" + notification.getDeviceDetails().getDeviceId() + System.currentTimeMillis());\r
-    eventHeader.setEventName("Heartbeat_" + notification.getDeviceDetails().getProductClass() + "-"\r
-        + config.getVendorName());\r
-    eventHeader.setEventType("CommScope_RAN_Vnf");\r
-    eventHeader.setLastEpochMicrosec(System.currentTimeMillis());\r
-\r
-    eventHeader.setPriority("Normal");\r
+    eventHeader\r
+        .setEventId("heartbeat_" + deviceDataEntity.getDeviceId() + System.currentTimeMillis());\r
+    eventHeader.setEventName(\r
+        "heartbeat_" + deviceDataEntity.getProductClass() + "-" + config.getVendorName());\r
+    eventHeader.setEventType("CommScope_RAN_heartbeat");\r
+    eventHeader.setLastEpochMicrosec(System.currentTimeMillis() * 1000);\r
+\r
+    eventHeader.setPriority("High");\r
     eventHeader.setSequence(0);\r
 \r
-    if (eNodeBName == null) {\r
-      eventHeader.setReportingEntityName(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setSourceName(notification.getDeviceDetails().getDeviceId());\r
+    if (deviceDataEntity.geteNodeBName() == null) {\r
+      eventHeader.setReportingEntityName(deviceDataEntity.getDeviceId());\r
+      eventHeader.setReportingEntityId(deviceDataEntity.getDeviceId());\r
+      eventHeader.setSourceId(deviceDataEntity.getDeviceId());\r
+      eventHeader.setSourceName(deviceDataEntity.getDeviceId());\r
     } else {\r
-      eventHeader.setReportingEntityName(eNodeBName);\r
-      eventHeader.setSourceName(eNodeBName);\r
-      eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
-      eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
+      eventHeader.setReportingEntityName(deviceDataEntity.geteNodeBName());\r
+      eventHeader.setSourceName(deviceDataEntity.geteNodeBName());\r
+      eventHeader.setReportingEntityId(deviceDataEntity.getDeviceId());\r
+      eventHeader.setSourceId(deviceDataEntity.getDeviceId());\r
     }\r
 \r
-    eventHeader.setStartEpochMicrosec(System.currentTimeMillis());\r
+    eventHeader.setStartEpochMicrosec(System.currentTimeMillis() * 1000);\r
     eventHeader.setVersion(config.getEventVersion());\r
     eventHeader.setNfNamingCode("");\r
     eventHeader.setNfcNamingCode("");\r
@@ -101,7 +231,7 @@ public class HeartBeatMessageHandler {
 \r
     HeartbeatFields heartbeatFields = new HeartbeatFields();\r
     heartbeatFields.setHeartbeatFieldsVersion("3.0");\r
-    heartbeatFields.setHeartbeatInterval(60);\r
+    heartbeatFields.setHeartbeatInterval(heartBeatPeriod * 60);\r
     hbEvent.setHeartbeatFields(heartbeatFields);\r
 \r
     return hbEvent;\r