fd6530f2bad0a961f24a1a57f407ec6c5c757b4c
[oam/tr069-adapter.git] / ves-agent / src / main / java / org / commscope / tr069adapter / vesagent / async / AsyncRequestHandler.java
1 package org.commscope.tr069adapter.vesagent.async;\r
2 \r
3 import java.util.concurrent.Future;\r
4 \r
5 import org.commscope.tr069adapter.acs.common.DeviceDetails;\r
6 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
7 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
8 import org.commscope.tr069adapter.acs.common.OperationCode;\r
9 import org.commscope.tr069adapter.acs.common.OperationOptions;\r
10 import org.commscope.tr069adapter.acs.common.dto.CustomOperationCode;\r
11 import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
12 import org.commscope.tr069adapter.vesagent.VesConfiguration;\r
13 import org.commscope.tr069adapter.vesagent.controller.HeartBeatMessageHandler;\r
14 import org.commscope.tr069adapter.vesagent.entity.DeviceDataEntity;\r
15 import org.commscope.tr069adapter.vesagent.mapper.MapperRequestSender;\r
16 import org.commscope.tr069adapter.vesagent.util.VesAgentConstants;\r
17 import org.commscope.tr069adapter.vesagent.util.VesAgentUtils;\r
18 import org.slf4j.Logger;\r
19 import org.slf4j.LoggerFactory;\r
20 import org.springframework.beans.factory.annotation.Autowired;\r
21 import org.springframework.scheduling.annotation.Async;\r
22 import org.springframework.stereotype.Component;\r
23 \r
24 /**\r
25  * \r
26  * @version 1.0\r
27  * @since June 12, 2020\r
28  * @author Prashant Kumar\r
29  */\r
30 @Component\r
31 public class AsyncRequestHandler {\r
32 \r
33   private static final Logger LOG = LoggerFactory.getLogger(AsyncRequestHandler.class);\r
34 \r
35   @Autowired\r
36   MapperRequestSender mapperRequestSender;\r
37 \r
38   @Autowired\r
39   WaitForNotifications waitForNotifications;\r
40 \r
41   @Autowired\r
42   HeartBeatMessageHandler heartBeatMessageHandler;\r
43 \r
44   @Autowired\r
45   VesConfiguration config;\r
46 \r
47   public DeviceRPCResponse performDeviceOperation(DeviceRPCRequest deviceRPCRequest) {\r
48     LOG.info("Initiating device connectivity request to ACS for device {}",\r
49         deviceRPCRequest.getDeviceDetails().getDeviceId());\r
50 \r
51     Future<DeviceRPCResponse> futureResponse = mapperRequestSender.sendRequest(deviceRPCRequest);\r
52     if (null == futureResponse) {\r
53       LOG.error("Request could not be sent. response is null");\r
54       return null;\r
55     }\r
56 \r
57     boolean isSuccess = false;\r
58     DeviceRPCResponse response = null;\r
59 \r
60     OperationCode opCode = deviceRPCRequest.getOpDetails().getOpCode();\r
61     String deviceId = deviceRPCRequest.getDeviceDetails().getDeviceId();\r
62     long timeOut = getOperationTimeOut(deviceRPCRequest.getOptions().getExecutionTimeout());\r
63 \r
64     try {\r
65       waitForNotifications.waitForResult(deviceId, opCode, futureResponse, timeOut);\r
66       response = waitForNotifications.getOperationResult(deviceId, opCode);\r
67 \r
68       if (null == response) {\r
69         LOG.error("Request got timed out.");\r
70       } else {\r
71         LOG.debug("Received operation result for device : {}, operation = {} as {}", deviceId,\r
72             opCode, response);\r
73       }\r
74       waitForNotifications.stopOperation(deviceId, opCode);\r
75 \r
76       // if(isSuccess) {\r
77       // response = waitForNotifications.getOperationResult(deviceId, opCode);\r
78       // LOG.debug("Received operation result for device : {}, operation = {} as {}",deviceId,\r
79       // opCode,response);\r
80       //\r
81       // waitForNotifications.stopOperation(deviceId, opCode);\r
82       // }else {\r
83       // LOG.error("Request got timed out.");\r
84       // }\r
85     } catch (InterruptedException e) {\r
86       LOG.debug(\r
87           "InterruptedException while waiting for mapper operation result for device : {}, operation : {} request.",\r
88           deviceId, opCode);\r
89     }\r
90 \r
91     return response;\r
92   }\r
93 \r
94   private long getOperationTimeOut(long timeOut) {\r
95     if (timeOut > 0) {\r
96       return timeOut;\r
97     }\r
98 \r
99     if (null != config.getRequestTimeout()) {\r
100       timeOut = Long.valueOf(config.getRequestTimeout());\r
101     }\r
102 \r
103     return timeOut;\r
104   }\r
105 \r
106   @Async\r
107   public void initiateDeviceReachabilityCheck(DeviceDataEntity deviceDataEntity) {\r
108     DeviceDetails deviceDetails = new DeviceDetails();\r
109     deviceDetails.setDeviceId(deviceDataEntity.getDeviceId());\r
110     deviceDetails.setOui(deviceDataEntity.getOui());\r
111     deviceDetails.setProductClass(deviceDataEntity.getProductClass());\r
112 \r
113     TR069OperationDetails operationDetails = new TR069OperationDetails();\r
114     operationDetails.setOpCode(CustomOperationCode.CONNECT);\r
115 \r
116     DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
117 \r
118     deviceRPCRequest.setDeviceDetails(deviceDetails);\r
119     deviceRPCRequest.setOpDetails(operationDetails);\r
120 \r
121     OperationOptions options = new OperationOptions();\r
122     if (null != config.getRequestTimeout()) {\r
123       options.setExecutionTimeout(Integer.valueOf(config.getRequestTimeout()));\r
124     }\r
125 \r
126     deviceRPCRequest.setOptions(options);\r
127 \r
128     DeviceRPCResponse deviceRPCResponse = performDeviceOperation(deviceRPCRequest);\r
129 \r
130     if (VesAgentUtils.isDeviceReachable(deviceRPCResponse)) {\r
131       LOG.debug("Device {} is reachable.", deviceDataEntity.getDeviceId());\r
132       try {\r
133         LOG.debug("Sending heatbeat event for device {}.", deviceDataEntity.getDeviceId());\r
134         heartBeatMessageHandler.sendHeartBeatEvent(deviceDataEntity, Integer.parseInt(\r
135             deviceDataEntity.getAttributesMap().get(VesAgentConstants.HEART_BEAT_PERIOD)));\r
136       } catch (NumberFormatException e) {\r
137         LOG.error("heartBeatPeriod doesn't have numeric value. ErrorMsg: {}", e.getMessage());\r
138       } catch (Exception e) {\r
139         LOG.error("Error while sending heart beat ves event. ErrorMsg: {}", e.getMessage());\r
140       }\r
141     }\r
142   }\r
143 }\r