Initial source code
[oam/tr069-adapter.git] / acs / requestprocessor / src / main / java / org / commscope / tr069adapter / acs / requestprocessor / dao / DeviceRPCRequestRepositoryHelper.java
diff --git a/acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/dao/DeviceRPCRequestRepositoryHelper.java b/acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/dao/DeviceRPCRequestRepositoryHelper.java
new file mode 100644 (file)
index 0000000..079c029
--- /dev/null
@@ -0,0 +1,205 @@
+/*\r
+ * ============LICENSE_START========================================================================\r
+ * ONAP : tr-069-adapter\r
+ * =================================================================================================\r
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
+ * =================================================================================================\r
+ * This tr-069-adapter software file is distributed by CommScope Inc under the Apache License,\r
+ * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You\r
+ * may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\r
+ * either express or implied. See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ===============LICENSE_END=======================================================================\r
+ */\r
+\r
+package org.commscope.tr069adapter.acs.requestprocessor.dao;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.exception.TR069EventProcessingException;\r
+import org.commscope.tr069adapter.acs.common.utils.ErrorCode;\r
+import org.commscope.tr069adapter.acs.requestprocessor.entity.TR069DeviceRPCRequestEntity;\r
+import org.commscope.tr069adapter.acs.requestprocessor.util.TR069RequestProcessorUtility;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.stereotype.Component;\r
+\r
+@Component\r
+public class DeviceRPCRequestRepositoryHelper {\r
+\r
+  private static final Logger logger =\r
+      LoggerFactory.getLogger(DeviceRPCRequestRepositoryHelper.class);\r
+\r
+  @Autowired\r
+  protected DeviceRPCRequestRepository deviceRPCRequestRepository;\r
+\r
+  /**\r
+   * @param tr069DeviceRPCRequestEntities\r
+   */\r
+  public void saveAll(List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntities) {\r
+    deviceRPCRequestRepository.saveAll(tr069DeviceRPCRequestEntities);\r
+  }\r
+\r
+  /**\r
+   * @param deviceId\r
+   * @return\r
+   */\r
+  public List<TR069DeviceRPCRequestEntity> findByDeviceId(String deviceId) {\r
+    List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntities =\r
+        deviceRPCRequestRepository.findByDeviceId(deviceId);\r
+    Collections.sort(deviceRPCRequestEntities, idComparator);\r
+    return deviceRPCRequestEntities;\r
+  }\r
+\r
+  /**\r
+   * @param deviceId\r
+   * @param operationId\r
+   * @return\r
+   */\r
+  public List<TR069DeviceRPCRequestEntity> findByDeviceIdAndOperationId(String deviceId,\r
+      Long operationId) {\r
+    List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntities =\r
+        deviceRPCRequestRepository.findByDeviceIdAndOperationId(deviceId, operationId);\r
+    Collections.sort(deviceRPCRequestEntities, idComparator);\r
+    return deviceRPCRequestEntities;\r
+  }\r
+\r
+  /**\r
+   * @param deviceId\r
+   * @return\r
+   * @throws TR069EventProcessingException\r
+   */\r
+  public List<DeviceRPCRequest> findAllDeviceRPCRequests(String deviceId) {\r
+    logger.debug("Retrieving all the pending Device RPC requests");\r
+    List<DeviceRPCRequest> deviceRPCRequestList = new ArrayList<>();\r
+    List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntities =\r
+        deviceRPCRequestRepository.findByDeviceIdAndIsProcessed(deviceId, 0);\r
+    if (deviceRPCRequestEntities == null) {\r
+      logger.debug("There exists no pending RPC requests for the device: {}", deviceId);\r
+      return deviceRPCRequestList;\r
+    }\r
+\r
+    logger.debug("Grouping the records based on operationId");\r
+    Map<Long, List<TR069DeviceRPCRequestEntity>> opIdEntityMap = new HashMap<>();\r
+    for (TR069DeviceRPCRequestEntity entity : deviceRPCRequestEntities) {\r
+      List<TR069DeviceRPCRequestEntity> entityList = opIdEntityMap.get(entity.getOperationId());\r
+      if (entityList == null) {\r
+        entityList = new ArrayList<>();\r
+        opIdEntityMap.put(entity.getOperationId(), entityList);\r
+      }\r
+      entityList.add(entity);\r
+    }\r
+\r
+    logger.debug("There exists {} pending NBI requests for the device", opIdEntityMap.size());\r
+    Iterator<Long> opIdIterator = opIdEntityMap.keySet().iterator();\r
+    while (opIdIterator.hasNext()) {\r
+      Long operationId = opIdIterator.next();\r
+      List<TR069DeviceRPCRequestEntity> entityList = opIdEntityMap.get(operationId);\r
+      Collections.sort(entityList, idComparator);\r
+      deviceRPCRequestList.add(TR069RequestProcessorUtility.convertToDTO(entityList));\r
+    }\r
+\r
+    return deviceRPCRequestList;\r
+  }\r
+\r
+  /**\r
+   * @param deviceId\r
+   * @return\r
+   * @throws TR069EventProcessingException\r
+   */\r
+\r
+  public DeviceRPCRequest findOldestDeviceRPCRequest(String deviceId) {\r
+    logger.debug("Retrieving the oldest pending Device RPC request");\r
+\r
+    List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntities =\r
+        deviceRPCRequestRepository.findByDeviceIdAndIsProcessed(deviceId, 0);\r
+    if (deviceRPCRequestEntities == null || deviceRPCRequestEntities.isEmpty()) {\r
+      logger.debug("There exists no pending Device RPC requests for the device: {}", deviceId);\r
+      return null;\r
+    }\r
+\r
+    List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntityList =\r
+        getOldestDeviceRPCRequestList(deviceRPCRequestEntities);\r
+\r
+    if (deviceRPCRequestEntityList != null) {\r
+      Collections.sort(deviceRPCRequestEntityList, idComparator);\r
+      return TR069RequestProcessorUtility.convertToDTO(deviceRPCRequestEntityList);\r
+    } else {\r
+      logger.debug("Empty deviceRPCRequestEntityList");\r
+      return null;\r
+    }\r
+\r
+  }\r
+\r
+  private List<TR069DeviceRPCRequestEntity> getOldestDeviceRPCRequestList(\r
+      List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntities) {\r
+    List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntityList = null;\r
+\r
+    logger.debug("Grouping the records based on operationId");\r
+    Map<Long, List<TR069DeviceRPCRequestEntity>> opIdEntityMap = new HashMap<>();\r
+    for (TR069DeviceRPCRequestEntity entity : deviceRPCRequestEntities) {\r
+      List<TR069DeviceRPCRequestEntity> entityList = opIdEntityMap.get(entity.getOperationId());\r
+      if (entityList == null) {\r
+        entityList = new ArrayList<>();\r
+        opIdEntityMap.put(entity.getOperationId(), entityList);\r
+      }\r
+      entityList.add(entity);\r
+    }\r
+\r
+    Iterator<Long> opIdIterator = opIdEntityMap.keySet().iterator();\r
+    while (opIdIterator.hasNext()) {\r
+      Long operationId = opIdIterator.next();\r
+      List<TR069DeviceRPCRequestEntity> entityList = opIdEntityMap.get(operationId);\r
+      TR069DeviceRPCRequestEntity entity = entityList.get(0);\r
+      if (deviceRPCRequestEntityList == null) {\r
+        deviceRPCRequestEntityList = entityList;\r
+      } else {\r
+        if (entity.getCreateTime().before(deviceRPCRequestEntityList.get(0).getCreateTime()))\r
+          deviceRPCRequestEntityList = entityList;\r
+      }\r
+    }\r
+\r
+    return deviceRPCRequestEntityList;\r
+  }\r
+\r
+  /**\r
+   * @param operationId\r
+   * @throws TR069EventProcessingException\r
+   */\r
+  public void markDeviceRPCRequestAsProcessed(String deviceId, Long operationId)\r
+      throws TR069EventProcessingException {\r
+    logger.debug("Marking the Device RPC request for device: {} and operationId: {} as processed",\r
+        deviceId, operationId);\r
+    List<TR069DeviceRPCRequestEntity> deviceRPCRequestEntityList =\r
+        deviceRPCRequestRepository.findByDeviceIdAndOperationId(deviceId, operationId);\r
+    if (deviceRPCRequestEntityList == null) {\r
+      TR069EventProcessingException ex =\r
+          new TR069EventProcessingException(ErrorCode.MISSING_OPERATION_DETAILS);\r
+      logger.error(ex.getMessage());\r
+      throw ex;\r
+    }\r
+\r
+    for (TR069DeviceRPCRequestEntity deviceRPCRequestEntity : deviceRPCRequestEntityList) {\r
+      deviceRPCRequestEntity.setIsProcessed(Integer.valueOf(1));\r
+    }\r
+    deviceRPCRequestRepository.saveAll(deviceRPCRequestEntityList);\r
+  }\r
+\r
+\r
+  public static final Comparator<TR069DeviceRPCRequestEntity> idComparator =\r
+      (TR069DeviceRPCRequestEntity e1, TR069DeviceRPCRequestEntity e2) -> e1.getId()\r
+          .compareTo(e2.getId());\r
+\r
+}\r