import java.util.Map;\r
import java.util.concurrent.Semaphore;\r
import java.util.concurrent.TimeUnit;\r
-\r
import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
import org.commscope.tr069adapter.mapper.MapperConfigProperties;\r
\r
private static final Logger LOG = LoggerFactory.getLogger(SynchronizedRequestHandler.class);\r
\r
- private static Map<Long, DeviceRPCResponse> opResultMap = new HashMap<>();\r
- private static Map<Long, Semaphore> semaphoreMap = new HashMap<>();\r
+ private static Map<String, DeviceRPCResponse> opResultMap = new HashMap<>();\r
+ private static Map<String, Semaphore> semaphoreMap = new HashMap<>();\r
\r
@Autowired\r
ACSRequestSender tr069RequestSender;\r
MapperConfigProperties config;\r
\r
public DeviceRPCResponse performDeviceOperation(DeviceRPCRequest deviceRPCRequest) {\r
- Long opId = tr069RequestSender.sendRequest(deviceRPCRequest);\r
- if (null == opId) {\r
+ Long acsOperationId = tr069RequestSender.sendRequest(deviceRPCRequest);\r
+\r
+ if (null == acsOperationId) {\r
LOG.error("Request could not be sent. opId is null");\r
return null;\r
}\r
+\r
+ String mapperUniqOperId =\r
+ deviceRPCRequest.getDeviceDetails().getDeviceId() + "_" + acsOperationId;\r
+ LOG.debug("Received operation mapperUniqOperId = {}", mapperUniqOperId);\r
+\r
boolean isSuccess = false;\r
try {\r
- isSuccess = waitForResult(opId);\r
+ isSuccess = waitForResult(mapperUniqOperId);\r
} catch (InterruptedException e) {\r
LOG.debug(\r
"InterruptedException while waiting for tr069 operation result for operation request {}",\r
}\r
DeviceRPCResponse result = null;\r
if (!isSuccess) {\r
- LOG.error("Request got timed out.");\r
+ LOG.error("Request got timed out for operation {}", mapperUniqOperId);\r
+ semaphoreMap.remove(mapperUniqOperId);\r
} else {\r
- result = getOperationResult(opId);\r
- LOG.debug("Received operation result for opId = {} GET-CONFIG : {}", opId, result);\r
-\r
+ result = getOperationResult(mapperUniqOperId);\r
+ LOG.debug("Received operation result for mapperUniqOperId = {} result : {}", mapperUniqOperId,\r
+ result);\r
}\r
return result;\r
\r
}\r
\r
public void notifyResult(DeviceRPCResponse opResult) {\r
- opResultMap.put(opResult.getOperationId(), opResult);\r
- Semaphore mutex = semaphoreMap.remove(opResult.getOperationId());\r
- mutex.release();\r
+ Semaphore mutex = semaphoreMap\r
+ .remove(opResult.getDeviceDetails().getDeviceId() + "_" + opResult.getOperationId());\r
+ if (mutex != null) {\r
+ opResultMap.put(opResult.getDeviceDetails().getDeviceId() + "_" + opResult.getOperationId(),\r
+ opResult);\r
+ mutex.release();\r
+ }\r
}\r
\r
- private DeviceRPCResponse getOperationResult(long opId) {\r
- return opResultMap.remove(opId);\r
+ private DeviceRPCResponse getOperationResult(String mapperUniqOperId) {\r
+ return opResultMap.remove(mapperUniqOperId);\r
}\r
\r
- private boolean waitForResult(long opId) throws InterruptedException {\r
- LOG.debug("Waiting for operation result for opId : {}", opId);\r
+ private boolean waitForResult(String mapperUniqOperId) throws InterruptedException {\r
+ LOG.debug("Waiting for operation result for mapperUniqOperId : {}", mapperUniqOperId);\r
Semaphore semaphore = new Semaphore(0);\r
- semaphoreMap.put(opId, semaphore);\r
+ semaphoreMap.put(mapperUniqOperId, semaphore);\r
LOG.debug("Semaphore MAP size = {}", semaphoreMap.size());\r
LOG.debug("opResultMap MAP size = {}", opResultMap.size());\r
Integer timeout = 0;\r
}\r
return semaphore.tryAcquire(timeout, TimeUnit.SECONDS);\r
}\r
-\r
}\r