1 package org.commscope.tr069adapter.vesagent.async;
\r
3 import java.util.concurrent.Future;
\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
27 * @since June 12, 2020
\r
28 * @author Prashant Kumar
\r
31 public class AsyncRequestHandler {
\r
33 private static final Logger LOG = LoggerFactory.getLogger(AsyncRequestHandler.class);
\r
36 MapperRequestSender mapperRequestSender;
\r
39 WaitForNotifications waitForNotifications;
\r
42 HeartBeatMessageHandler heartBeatMessageHandler;
\r
45 VesConfiguration config;
\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
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
57 boolean isSuccess = false;
\r
58 DeviceRPCResponse response = null;
\r
60 OperationCode opCode = deviceRPCRequest.getOpDetails().getOpCode();
\r
61 String deviceId = deviceRPCRequest.getDeviceDetails().getDeviceId();
\r
62 long timeOut = getOperationTimeOut(deviceRPCRequest.getOptions().getExecutionTimeout());
\r
65 waitForNotifications.waitForResult(deviceId, opCode, futureResponse, timeOut);
\r
66 response = waitForNotifications.getOperationResult(deviceId, opCode);
\r
68 if (null == response) {
\r
69 LOG.error("Request got timed out.");
\r
71 LOG.debug("Received operation result for device : {}, operation = {} as {}", deviceId,
\r
74 waitForNotifications.stopOperation(deviceId, opCode);
\r
77 // response = waitForNotifications.getOperationResult(deviceId, opCode);
\r
78 // LOG.debug("Received operation result for device : {}, operation = {} as {}",deviceId,
\r
79 // opCode,response);
\r
81 // waitForNotifications.stopOperation(deviceId, opCode);
\r
83 // LOG.error("Request got timed out.");
\r
85 } catch (InterruptedException e) {
\r
87 "InterruptedException while waiting for mapper operation result for device : {}, operation : {} request.",
\r
94 private long getOperationTimeOut(long timeOut) {
\r
99 if (null != config.getRequestTimeout()) {
\r
100 timeOut = Long.valueOf(config.getRequestTimeout());
\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
113 TR069OperationDetails operationDetails = new TR069OperationDetails();
\r
114 operationDetails.setOpCode(CustomOperationCode.CONNECT);
\r
116 DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();
\r
118 deviceRPCRequest.setDeviceDetails(deviceDetails);
\r
119 deviceRPCRequest.setOpDetails(operationDetails);
\r
121 OperationOptions options = new OperationOptions();
\r
122 if (null != config.getRequestTimeout()) {
\r
123 options.setExecutionTimeout(Integer.valueOf(config.getRequestTimeout()));
\r
126 deviceRPCRequest.setOptions(options);
\r
128 DeviceRPCResponse deviceRPCResponse = performDeviceOperation(deviceRPCRequest);
\r
130 if (VesAgentUtils.isDeviceReachable(deviceRPCResponse)) {
\r
131 LOG.debug("Device {} is reachable.", deviceDataEntity.getDeviceId());
\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