Initial source code
[oam/tr069-adapter.git] / acs / requestprocessor / src / main / java / org / commscope / tr069adapter / acs / requestprocessor / helper / TR069RequestProcessEngineHelper.java
diff --git a/acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/helper/TR069RequestProcessEngineHelper.java b/acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/helper/TR069RequestProcessEngineHelper.java
new file mode 100644 (file)
index 0000000..b2f78c9
--- /dev/null
@@ -0,0 +1,404 @@
+/*\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.helper;\r
+\r
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.CR_REQ_Q;\r
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.DEVICE_RESPONSE_TIMEOUT;\r
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.DEVICE_RPC_EXECUTION_TIMEOUT_SECONDS;\r
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.SEPERATOR;\r
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.SESSION_TIMEOUT_CALLBACK_JNDI;\r
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.WAITING_FOR_DEVICE_RESPONSE;\r
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.WAITING_FOR_NBI_RESPONSE;\r
+\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceDetails;\r
+import org.commscope.tr069adapter.acs.common.DeviceInform;\r
+import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069InformType;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
+import org.commscope.tr069adapter.acs.common.exception.DeviceOperationException;\r
+import org.commscope.tr069adapter.acs.common.exception.SessionConcurrentAccessException;\r
+import org.commscope.tr069adapter.acs.common.exception.SessionManagerException;\r
+import org.commscope.tr069adapter.acs.common.utils.ErrorCode;\r
+import org.commscope.tr069adapter.acs.requestprocessor.custom.CustomOperation;\r
+import org.commscope.tr069adapter.acs.requestprocessor.dto.CustomOperationData;\r
+import org.commscope.tr069adapter.acs.requestprocessor.dto.SessionDTO;\r
+import org.commscope.tr069adapter.acs.requestprocessor.dto.SessionState;\r
+import org.commscope.tr069adapter.acs.requestprocessor.dto.TR069RequestProcessorData;\r
+import org.commscope.tr069adapter.acs.requestprocessor.impl.SessionManager;\r
+import org.commscope.tr069adapter.acs.requestprocessor.util.TR069RequestProcessorCacheUtil;\r
+import org.commscope.tr069adapter.common.timer.TimerException;\r
+import org.commscope.tr069adapter.common.timer.TimerServiceManagerAPI;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.context.ApplicationContext;\r
+import org.springframework.jms.core.JmsTemplate;\r
+\r
+public class TR069RequestProcessEngineHelper {\r
+\r
+  private static final Logger logger =\r
+      LoggerFactory.getLogger(TR069RequestProcessEngineHelper.class);\r
+\r
+  @Autowired\r
+  private ApplicationContext context;\r
+\r
+  @Autowired\r
+  private SessionManager sessionManager;\r
+\r
+  @Autowired\r
+  private TimerServiceManagerAPI timerServiceManagerAPI;\r
+\r
+  @Autowired\r
+  TR069RequestProcessorCacheUtil requestCacheUtil;\r
+\r
+  @Autowired\r
+  protected TR069RequestProcessEngineUtility tr069RequestProcessEngineUtility;\r
+\r
+  @Autowired\r
+  private JmsTemplate jmsTemplate;\r
+\r
+  /**\r
+   * @param deviceId\r
+   * @return\r
+   * @throws SessionManagerException\r
+   */\r
+  protected SessionDTO getSession(String deviceId) {\r
+    logger.debug("Getting the existing Session Object for the device");\r
+    return sessionManager.getSession(deviceId);\r
+  }\r
+\r
+  /**\r
+   * @param sessionId\r
+   * @return\r
+   * @throws SessionManagerException\r
+   */\r
+  public SessionDTO getSessionBySessionId(String sessionId) throws SessionManagerException {\r
+    return sessionManager.getSessionBySessionId(sessionId);\r
+  }\r
+\r
+  /**\r
+   * @param deviceDetails\r
+   * @param session\r
+   */\r
+  protected void initThreadLocalCache(DeviceDetails deviceDetails, SessionDTO session) {\r
+    TR069RequestProcessorData tr069RequestProcessorData = new TR069RequestProcessorData();\r
+    tr069RequestProcessorData.setTr069DeviceDetails((TR069DeviceDetails) deviceDetails);\r
+    tr069RequestProcessorData.setSessionDTO(session);\r
+\r
+    requestCacheUtil.put(tr069RequestProcessorData);\r
+  }\r
+\r
+  /**\r
+   * @return\r
+   */\r
+  protected TR069RequestProcessorData getTR069RequestProcessorData() {\r
+    return requestCacheUtil.get();\r
+  }\r
+\r
+  /**\r
+   * @return\r
+   */\r
+  protected String getUniqueSessionIdentifier() {\r
+    return sessionManager.generateUniqueSessionID();\r
+  }\r
+\r
+  /**\r
+   * @param deviceId\r
+   * @param notificationType\r
+   * @return\r
+   * @throws SessionConcurrentAccessException\r
+   * @throws DeviceOperationException\r
+   */\r
+  protected SessionDTO acquireSessionLock(String deviceId, TR069InformType notificationType,\r
+      boolean generateNewSessionId)\r
+      throws SessionConcurrentAccessException, DeviceOperationException {\r
+    logger.debug("Acquiring the session lock for the device");\r
+    SessionDTO session = null;\r
+\r
+    String sessionID = null;\r
+    session = sessionManager.getLockedSession(deviceId);\r
+\r
+    if (session == null && TR069InformType.BOOTSTRAP.equals(notificationType)) {\r
+      logger.info(\r
+          "Device is contacting ACS for the first time, creating the new session ID for the device");\r
+      sessionID = getUniqueSessionIdentifier();\r
+      session = new SessionDTO(deviceId, sessionID, null);\r
+      session.setSessionStartTime(new Date());\r
+      try {\r
+        sessionManager.createSession(session);\r
+        generateNewSessionId = false;\r
+      } catch (Exception ex) {\r
+        SessionConcurrentAccessException scae =\r
+            new SessionConcurrentAccessException(ErrorCode.SESSION_ALREADY_LOCKED, ex.getMessage());\r
+        logger.error(scae.getMessage());\r
+        throw scae;\r
+      }\r
+\r
+      session = sessionManager.getLockedSession(deviceId);\r
+    } else if (session == null) {\r
+      DeviceOperationException doe = new DeviceOperationException(ErrorCode.DEVICE_NOT_ACTIVATED);\r
+      logger.error(doe.getMessage());\r
+      throw doe;\r
+    }\r
+\r
+    if (generateNewSessionId) {\r
+      sessionID = getUniqueSessionIdentifier();\r
+      session.setSessionId(sessionID);\r
+    }\r
+\r
+    return session;\r
+  }\r
+\r
+  /**\r
+   * @param session\r
+   * @throws SessionManagerException\r
+   */\r
+  protected void updateSession(SessionDTO session) {\r
+    logger.debug("Updating the session");\r
+    sessionManager.updateSession(session);\r
+  }\r
+\r
+  /**\r
+   * @param deviceId\r
+   * @throws SessionConcurrentAccessException\r
+   */\r
+  protected void deleteSession(String deviceId) {\r
+    sessionManager.deleteSession(deviceId);\r
+  }\r
+\r
+  /**\r
+   * Utility method to post the connection request initiation asynchronously on the device\r
+   * \r
+   * @param tr069DeviceDetails\r
+   */\r
+  protected void requestForConnectionRequestInform(TR069DeviceDetails tr069DeviceDetails) {\r
+    logger.info("Initiating Connection request on device: {}", tr069DeviceDetails.getDeviceId());\r
+    try {\r
+      jmsTemplate.convertAndSend(CR_REQ_Q, tr069DeviceDetails);\r
+    } catch (Exception e) {\r
+      logger.error("Connection request initiation failed, Reason: {}", e.getMessage());\r
+    }\r
+  }\r
+\r
+  /**\r
+   * @param tr069RequestProcessorData\r
+   * @param sessionID\r
+   */\r
+  protected void updateSessionOnDeviceNotification(\r
+      TR069RequestProcessorData tr069RequestProcessorData, String sessionID) {\r
+    SessionDTO session = tr069RequestProcessorData.getSessionDTO();\r
+    session.setSessionId(sessionID);\r
+    session.setSessionStartTime(new Date());\r
+    session.setCurrentOperationId(null);\r
+    session.setSessionState(SessionState.PROCESSING);\r
+  }\r
+\r
+  /**\r
+   * @param tr069RequestProcessorData\r
+   * @param sessionState\r
+   */\r
+  protected void changeSessionState(TR069RequestProcessorData tr069RequestProcessorData,\r
+      SessionState sessionState) {\r
+    SessionDTO session = tr069RequestProcessorData.getSessionDTO();\r
+    String oldSessionState =\r
+        (session.getSessionState() != null) ? session.getSessionState().name() : null;\r
+    String newSessionState = sessionState.name();\r
+    logger.debug("Changing the session state from {} to {}", oldSessionState, newSessionState);\r
+    session.setSessionState(sessionState);\r
+  }\r
+\r
+  /**\r
+   * @param tr069RequestProcessorData\r
+   * @param operationId\r
+   */\r
+  protected void updateSessionCurOpId(TR069RequestProcessorData tr069RequestProcessorData,\r
+      Long operationId) {\r
+    SessionDTO session = tr069RequestProcessorData.getSessionDTO();\r
+    session.setCurrentOperationId(operationId);\r
+  }\r
+\r
+  /**\r
+   * @param tr069RequestProcessorData\r
+   * @param deviceNotification\r
+   * @return\r
+   */\r
+  protected Boolean isDeviceUpdateExists(TR069RequestProcessorData tr069RequestProcessorData,\r
+      DeviceInform deviceNotification) {\r
+    Boolean isDeviceDataUpdated = false;\r
+    TR069DeviceDetails persistedDeviceDetails = tr069RequestProcessorData.getTr069DeviceDetails();\r
+    TR069DeviceDetails notificationDeviceDetails =\r
+        (TR069DeviceDetails) deviceNotification.getDeviceDetails();\r
+\r
+    if (notificationDeviceDetails.getConnectionRequestURL() == null\r
+        || notificationDeviceDetails.getSoftwareVersion() == null\r
+        || notificationDeviceDetails.getHardwareVersion() == null) {\r
+      isDeviceDataUpdated = true;\r
+      logger.warn(\r
+          "Notification do not contains either connection request URL or swVer or hwVer of the device");\r
+      return isDeviceDataUpdated;\r
+    }\r
+\r
+    if (!notificationDeviceDetails.getConnectionRequestURL()\r
+        .equals(persistedDeviceDetails.getConnectionRequestURL())\r
+        || !notificationDeviceDetails.getSoftwareVersion()\r
+            .equals(persistedDeviceDetails.getSoftwareVersion())\r
+        || !notificationDeviceDetails.getHardwareVersion()\r
+            .equals(persistedDeviceDetails.getHardwareVersion())) {\r
+      logger.debug("Device details are changed");\r
+      isDeviceDataUpdated = true;\r
+    }\r
+    return isDeviceDataUpdated;\r
+  }\r
+\r
+  protected void updateDeviceDetails(TR069RequestProcessorData tr069RequestProcessorData,\r
+      DeviceInform deviceNotification) {\r
+    TR069DeviceDetails persistedDeviceDetails = tr069RequestProcessorData.getTr069DeviceDetails();\r
+    TR069DeviceDetails notificationDeviceDetails =\r
+        (TR069DeviceDetails) deviceNotification.getDeviceDetails();\r
+\r
+    persistedDeviceDetails\r
+        .setConnectionRequestURL(notificationDeviceDetails.getConnectionRequestURL());\r
+    persistedDeviceDetails.setSoftwareVersion(notificationDeviceDetails.getSoftwareVersion());\r
+    persistedDeviceDetails.setHardwareVersion(notificationDeviceDetails.getHardwareVersion());\r
+  }\r
+\r
+  /**\r
+   * @param customClassJNDI\r
+   * @param customOperationData\r
+   * @return\r
+   */\r
+  public CustomOperationData executeCustomOperation(String customClassJNDI,\r
+      CustomOperationData customOperationData) {\r
+    try {\r
+      logger.debug("Executing the custom logic implemented for JNDI: {}", customClassJNDI);\r
+      CustomOperation customOperation = (CustomOperation) context.getBean(customClassJNDI);\r
+      customOperationData =\r
+          (CustomOperationData) customOperation.executeCustomLogic(customOperationData);\r
+    } catch (Exception e) {\r
+      logger.error("Custom operation execution failed, Reason: {}", e.getMessage());\r
+    }\r
+    return customOperationData;\r
+  }\r
+\r
+  /**\r
+   * returns the operation code for Custom function execution\r
+   * \r
+   * @param operationDetails\r
+   * @return\r
+   */\r
+  protected TR069OperationCode getCustomOperationCode(TR069OperationDetails operationDetails) {\r
+    List<ParameterDTO> deleteList = operationDetails.getDeleteParamList();\r
+    List<ParameterDTO> setList = operationDetails.getSetParamList();\r
+    List<ParameterDTO> modifyList = operationDetails.getModifyParamList();\r
+\r
+    for (ParameterDTO param : deleteList) {\r
+      if (!param.isProcessed())\r
+        return TR069OperationCode.DELETE_OBJECT;\r
+    }\r
+\r
+    for (ParameterDTO param : setList) {\r
+      if (!param.isProcessed())\r
+        return TR069OperationCode.ADD_OBJECT;\r
+    }\r
+\r
+    for (ParameterDTO param : modifyList) {\r
+      if (!param.isProcessed())\r
+        return TR069OperationCode.SET_PARAMETER_VALUES;\r
+    }\r
+\r
+    return TR069OperationCode.SET_PARAMETER_VALUES;\r
+  }\r
+\r
+  /**\r
+   * @param deviceId\r
+   * @param operationId\r
+   * @param timeout\r
+   */\r
+  protected void startDeviceRPCRequestTimer(String deviceId, Long operationId, Long timeout) {\r
+    String timerId = deviceId + SEPERATOR + operationId;\r
+    if (null == timeout || timeout == 0L) {\r
+      timeout = DEVICE_RPC_EXECUTION_TIMEOUT_SECONDS;\r
+    }\r
+\r
+    try {\r
+      timerServiceManagerAPI.startTimer(timerId, SESSION_TIMEOUT_CALLBACK_JNDI, (timeout * 1000),\r
+          WAITING_FOR_NBI_RESPONSE);\r
+      logger.debug(\r
+          "Successfully started the timer task for Device RPC request with operation ID : {}",\r
+          operationId);\r
+    } catch (TimerException e) {\r
+      logger.error("Couldn't start the timer task for Device RPC Request with operation ID : {}",\r
+          operationId);\r
+    }\r
+  }\r
+\r
+  /**\r
+   * @param deviceId\r
+   * @param operationId\r
+   */\r
+  public void stopDeviceRPCRequestTimer(String deviceId, Long operationId) {\r
+    String timerId = deviceId + SEPERATOR + operationId;\r
+    try {\r
+      timerServiceManagerAPI.stopTimer(timerId);\r
+      logger.debug(\r
+          "Successfully stopped the timer task for Device RPC request with operation ID : {}",\r
+          operationId);\r
+    } catch (TimerException e) {\r
+      logger.error("Couldn't stop the timer task for Device RPC Request with operation ID : {}",\r
+          operationId);\r
+    }\r
+  }\r
+\r
+  /**\r
+   * @param deviceId\r
+   * @param operationId\r
+   * @param timeout\r
+   */\r
+  protected void startSessionTimer(String sessionId) {\r
+    try {\r
+      timerServiceManagerAPI.startTimer(sessionId, SESSION_TIMEOUT_CALLBACK_JNDI,\r
+          DEVICE_RESPONSE_TIMEOUT, WAITING_FOR_DEVICE_RESPONSE);\r
+      logger.debug("Successfully started the timer task for Device request with session ID : {}",\r
+          sessionId);\r
+    } catch (TimerException e) {\r
+      logger.error("Couldn't start the timer task for Device Request with session ID : {}",\r
+          sessionId);\r
+    }\r
+  }\r
+\r
+  /**\r
+   * @param deviceId\r
+   * @param operationId\r
+   */\r
+  protected void stopSessionTimer(String sessionId) {\r
+    try {\r
+      timerServiceManagerAPI.stopTimer(sessionId);\r
+      logger.debug("Successfully stopped the timer task for Device request with session ID : {}",\r
+          sessionId);\r
+    } catch (TimerException e) {\r
+      logger.error("Couldn't stop the timer task for Device Request with session ID : {}",\r
+          sessionId);\r
+    }\r
+  }\r
+}\r