Merge "VES Heartbeat and Software Management Feature"
[oam/tr069-adapter.git] / ves-agent / src / main / java / org / commscope / tr069adapter / vesagent / async / AsyncRequestHandler.java
diff --git a/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/AsyncRequestHandler.java b/ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/AsyncRequestHandler.java
new file mode 100644 (file)
index 0000000..fd6530f
--- /dev/null
@@ -0,0 +1,143 @@
+package org.commscope.tr069adapter.vesagent.async;\r
+\r
+import java.util.concurrent.Future;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceDetails;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.commscope.tr069adapter.acs.common.OperationCode;\r
+import org.commscope.tr069adapter.acs.common.OperationOptions;\r
+import org.commscope.tr069adapter.acs.common.dto.CustomOperationCode;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
+import org.commscope.tr069adapter.vesagent.VesConfiguration;\r
+import org.commscope.tr069adapter.vesagent.controller.HeartBeatMessageHandler;\r
+import org.commscope.tr069adapter.vesagent.entity.DeviceDataEntity;\r
+import org.commscope.tr069adapter.vesagent.mapper.MapperRequestSender;\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
+import org.springframework.scheduling.annotation.Async;\r
+import org.springframework.stereotype.Component;\r
+\r
+/**\r
+ * \r
+ * @version 1.0\r
+ * @since June 12, 2020\r
+ * @author Prashant Kumar\r
+ */\r
+@Component\r
+public class AsyncRequestHandler {\r
+\r
+  private static final Logger LOG = LoggerFactory.getLogger(AsyncRequestHandler.class);\r
+\r
+  @Autowired\r
+  MapperRequestSender mapperRequestSender;\r
+\r
+  @Autowired\r
+  WaitForNotifications waitForNotifications;\r
+\r
+  @Autowired\r
+  HeartBeatMessageHandler heartBeatMessageHandler;\r
+\r
+  @Autowired\r
+  VesConfiguration config;\r
+\r
+  public DeviceRPCResponse performDeviceOperation(DeviceRPCRequest deviceRPCRequest) {\r
+    LOG.info("Initiating device connectivity request to ACS for device {}",\r
+        deviceRPCRequest.getDeviceDetails().getDeviceId());\r
+\r
+    Future<DeviceRPCResponse> futureResponse = mapperRequestSender.sendRequest(deviceRPCRequest);\r
+    if (null == futureResponse) {\r
+      LOG.error("Request could not be sent. response is null");\r
+      return null;\r
+    }\r
+\r
+    boolean isSuccess = false;\r
+    DeviceRPCResponse response = null;\r
+\r
+    OperationCode opCode = deviceRPCRequest.getOpDetails().getOpCode();\r
+    String deviceId = deviceRPCRequest.getDeviceDetails().getDeviceId();\r
+    long timeOut = getOperationTimeOut(deviceRPCRequest.getOptions().getExecutionTimeout());\r
+\r
+    try {\r
+      waitForNotifications.waitForResult(deviceId, opCode, futureResponse, timeOut);\r
+      response = waitForNotifications.getOperationResult(deviceId, opCode);\r
+\r
+      if (null == response) {\r
+        LOG.error("Request got timed out.");\r
+      } else {\r
+        LOG.debug("Received operation result for device : {}, operation = {} as {}", deviceId,\r
+            opCode, response);\r
+      }\r
+      waitForNotifications.stopOperation(deviceId, opCode);\r
+\r
+      // if(isSuccess) {\r
+      // response = waitForNotifications.getOperationResult(deviceId, opCode);\r
+      // LOG.debug("Received operation result for device : {}, operation = {} as {}",deviceId,\r
+      // opCode,response);\r
+      //\r
+      // waitForNotifications.stopOperation(deviceId, opCode);\r
+      // }else {\r
+      // LOG.error("Request got timed out.");\r
+      // }\r
+    } catch (InterruptedException e) {\r
+      LOG.debug(\r
+          "InterruptedException while waiting for mapper operation result for device : {}, operation : {} request.",\r
+          deviceId, opCode);\r
+    }\r
+\r
+    return response;\r
+  }\r
+\r
+  private long getOperationTimeOut(long timeOut) {\r
+    if (timeOut > 0) {\r
+      return timeOut;\r
+    }\r
+\r
+    if (null != config.getRequestTimeout()) {\r
+      timeOut = Long.valueOf(config.getRequestTimeout());\r
+    }\r
+\r
+    return timeOut;\r
+  }\r
+\r
+  @Async\r
+  public void initiateDeviceReachabilityCheck(DeviceDataEntity deviceDataEntity) {\r
+    DeviceDetails deviceDetails = new DeviceDetails();\r
+    deviceDetails.setDeviceId(deviceDataEntity.getDeviceId());\r
+    deviceDetails.setOui(deviceDataEntity.getOui());\r
+    deviceDetails.setProductClass(deviceDataEntity.getProductClass());\r
+\r
+    TR069OperationDetails operationDetails = new TR069OperationDetails();\r
+    operationDetails.setOpCode(CustomOperationCode.CONNECT);\r
+\r
+    DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
+\r
+    deviceRPCRequest.setDeviceDetails(deviceDetails);\r
+    deviceRPCRequest.setOpDetails(operationDetails);\r
+\r
+    OperationOptions options = new OperationOptions();\r
+    if (null != config.getRequestTimeout()) {\r
+      options.setExecutionTimeout(Integer.valueOf(config.getRequestTimeout()));\r
+    }\r
+\r
+    deviceRPCRequest.setOptions(options);\r
+\r
+    DeviceRPCResponse deviceRPCResponse = performDeviceOperation(deviceRPCRequest);\r
+\r
+    if (VesAgentUtils.isDeviceReachable(deviceRPCResponse)) {\r
+      LOG.debug("Device {} is reachable.", deviceDataEntity.getDeviceId());\r
+      try {\r
+        LOG.debug("Sending heatbeat event for device {}.", deviceDataEntity.getDeviceId());\r
+        heartBeatMessageHandler.sendHeartBeatEvent(deviceDataEntity, Integer.parseInt(\r
+            deviceDataEntity.getAttributesMap().get(VesAgentConstants.HEART_BEAT_PERIOD)));\r
+      } catch (NumberFormatException e) {\r
+        LOG.error("heartBeatPeriod doesn't have numeric value. ErrorMsg: {}", e.getMessage());\r
+      } catch (Exception e) {\r
+        LOG.error("Error while sending heart beat ves event. ErrorMsg: {}", e.getMessage());\r
+      }\r
+    }\r
+  }\r
+}\r