--- /dev/null
+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