--- /dev/null
+/*\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