-/*\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.cpe.handler;\r
-\r
-import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.CONNECTION_REQUEST;\r
-import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.SEPERATOR;\r
-\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import javax.servlet.http.HttpServletResponse;\r
-\r
-import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
-import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
-import org.commscope.tr069adapter.acs.common.OperationResponse;\r
-import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
-import org.commscope.tr069adapter.acs.common.dto.DeviceOperationRequestDetails;\r
-import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
-import org.commscope.tr069adapter.acs.common.exception.SessionManagerException;\r
-import org.commscope.tr069adapter.acs.common.exception.TR069EventProcessingException;\r
-import org.commscope.tr069adapter.acs.common.inform.AbstractDeviceInform;\r
-import org.commscope.tr069adapter.acs.common.inform.TransferCompleteInform;\r
-import org.commscope.tr069adapter.acs.common.requestprocessor.service.TR069DeviceEventHandler;\r
-import org.commscope.tr069adapter.acs.common.response.DeviceInformResponse;\r
-import org.commscope.tr069adapter.acs.common.utils.ErrorCode;\r
-import org.commscope.tr069adapter.acs.cpe.TR069RPC;\r
-import org.commscope.tr069adapter.acs.cpe.builder.DeviceInformBuilder;\r
-import org.commscope.tr069adapter.acs.cpe.builder.DeviceRPCBuilder;\r
-import org.commscope.tr069adapter.acs.cpe.builder.DeviceRPCResponseBuilder;\r
-import org.commscope.tr069adapter.acs.cpe.rpc.Fault;\r
-import org.commscope.tr069adapter.acs.cpe.rpc.Inform;\r
-import org.commscope.tr069adapter.acs.cpe.rpc.TransferComplete;\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.slf4j.MDC;\r
-import org.springframework.beans.factory.annotation.Autowired;\r
-import org.springframework.stereotype.Component;\r
-\r
-@Component\r
-public class DeviceEventHandler {\r
-\r
- private static final Logger logger = LoggerFactory.getLogger(DeviceEventHandler.class);\r
-\r
- private static final String CLIENT_STR = "client";\r
-\r
- @Autowired\r
- private DeviceInformBuilder deviceInformBuilder;\r
-\r
- @Autowired\r
- private DeviceRPCBuilder deviceRPCBuilder;\r
-\r
- @Autowired\r
- private DeviceRPCResponseBuilder deviceRPCResponseBuilder;\r
-\r
- @Autowired\r
- private TR069DeviceEventHandler tr069DeviceEventHandler;\r
-\r
- @Autowired\r
- private TimerServiceManagerAPI timerServiceManagerAPI;\r
-\r
- @Autowired\r
- private DeviceValidator deviceValidtor;\r
-\r
- private static Map<String, List<String>> informParameter = null;\r
-\r
- static {\r
- informParameter = new HashMap<>();\r
- List<String> parameters = new ArrayList<>();\r
- parameters.add("InternetGatewayDevice.DeviceInfo.HardwareVersion");\r
- parameters.add("InternetGatewayDevice.DeviceInfo.SoftwareVersion");\r
- parameters.add("InternetGatewayDevice.DeviceInfo.ProvisioningCode");\r
- parameters.add("InternetGatewayDevice.ManagementServer.ConnectionRequestURL");\r
- parameters.add("InternetGatewayDevice.ManagementServer.ParameterKey");\r
- informParameter.put("InternetGatewayDevice", parameters);\r
-\r
- List<String> deviceParameters = new ArrayList<>();\r
- deviceParameters.add("Device.DeviceInfo.HardwareVersion");\r
- deviceParameters.add("Device.DeviceInfo.SoftwareVersion");\r
- deviceParameters.add("Device.DeviceInfo.ProvisioningCode");\r
- deviceParameters.add("Device.ManagementServer.ConnectionRequestURL");\r
- deviceParameters.add("Device.ManagementServer.ParameterKey");\r
- informParameter.put("Device", deviceParameters);\r
- }\r
-\r
- /**\r
- * @param inform\r
- * @param authorizationHeader\r
- * @return\r
- * @throws TR069EventProcessingException\r
- */\r
- public DeviceInformResponse processDeviceInform(Inform inform, String authorizationHeader)\r
- throws TR069EventProcessingException {\r
-\r
- DeviceInformResponse deviceInformResponse = null;\r
- try {\r
- String deviceId = inform.getSn();\r
- MDC.put(CLIENT_STR, deviceId);\r
-\r
- logger.info("Processing the device Inform event");\r
-\r
- logger.debug("Authorization header received in the request -> {}", authorizationHeader);\r
- Boolean isAuthorized = deviceValidtor.isDeviceAuthorized(inform, authorizationHeader);\r
- logger.info("Is device authentication successful: {}", isAuthorized);\r
- if (!isAuthorized.booleanValue()) {\r
- TR069EventProcessingException ex =\r
- new TR069EventProcessingException(ErrorCode.UNAUTHORIZED_EVENT, "Authorization failed");\r
- logger.error(ex.getMessage());\r
- throw ex;\r
- }\r
-\r
- logger.debug("The root element is: {}", inform.getRoot());\r
- // Canceling any connection initiator timer running, due to inform event\r
- stopConnectionInitiatorTimer(inform.getSn());\r
-\r
- if (!deviceValidtor.validateDevice(inform.getSn(), inform.getOui(), inform.getProductClass())\r
- .booleanValue()) {\r
- TR069EventProcessingException ex =\r
- new TR069EventProcessingException(ErrorCode.OUI_OR_PC_MISMATCH);\r
- logger.error(ex.getMessage());\r
- throw ex;\r
- }\r
-\r
- if (!validateInformParameters(inform)) {\r
- TR069EventProcessingException ex =\r
- new TR069EventProcessingException(ErrorCode.INVALID_PARAMS_IN_INFORM);\r
- logger.error(ex.getMessage());\r
- throw ex;\r
- }\r
-\r
- AbstractDeviceInform deviceInform = deviceInformBuilder.constructDeviceInform(inform);\r
- if (deviceInform == null) {\r
- TR069EventProcessingException ex =\r
- new TR069EventProcessingException(ErrorCode.INVALID_PARAMS_IN_INFORM);\r
- logger.error(ex.getMessage());\r
- throw ex;\r
- }\r
-\r
- logger.debug("Sending the device inform to TR069 Request Processor to process");\r
- deviceInformResponse = tr069DeviceEventHandler.processDeviceInform(deviceInform);\r
-\r
- } catch (TR069EventProcessingException tr069Ex) {\r
- throw tr069Ex;\r
- } catch (Exception e) {\r
- TR069EventProcessingException ex =\r
- new TR069EventProcessingException(ErrorCode.FAILED_PROCESSING_INFORM, e.getMessage());\r
- logger.error(ex.getMessage());\r
- throw ex;\r
- } finally {\r
- MDC.remove(CLIENT_STR);\r
- }\r
-\r
- return deviceInformResponse;\r
-\r
- }\r
-\r
- /**\r
- * @param tc\r
- * @return\r
- * @throws TR069EventProcessingException\r
- */\r
- public DeviceInformResponse processTransferComplete(TransferComplete tc)\r
- throws TR069EventProcessingException {\r
-\r
- logger.debug("Processing Transfer Complete");\r
-\r
- String startTime = tc.getStartTime();\r
- String completeTime = tc.getCompleteTime();\r
- int faultCode = tc.getFaultCode();\r
- String faultString = tc.getFaultString();\r
- String commandKey = tc.getCommandKey();\r
-\r
- DeviceInformResponse deviceInformResponse = null;\r
-\r
- try {\r
- MDC.put(CLIENT_STR, commandKey);\r
- TransferCompleteInform transferCompleteInform = new TransferCompleteInform();\r
- transferCompleteInform.setCommandKey(tc.getCommandKey());\r
- transferCompleteInform.setCompleteTime(completeTime);\r
- transferCompleteInform.setFaultCode(faultCode);\r
- transferCompleteInform.setFaultString(faultString);\r
- transferCompleteInform.setStartTime(startTime);\r
-\r
- logger.debug("TransferComplete inform received with Start time");\r
-\r
- transferCompleteInform.setDeviceDetails(tr069DeviceEventHandler.getDeviceDetails(commandKey));\r
- deviceInformResponse = tr069DeviceEventHandler.processDeviceInform(transferCompleteInform);\r
- logger.debug("Successfully processed the TRANSFER COMPLETE Inform");\r
-\r
- } catch (Exception e) {\r
- throw new TR069EventProcessingException(ErrorCode.FAILED_PROCESSING_INFORM, e.getMessage());\r
- } finally {\r
- MDC.remove(CLIENT_STR);\r
- }\r
-\r
- return deviceInformResponse;\r
- }\r
-\r
- /**\r
- * @param msg\r
- * @param sessionId\r
- * @return\r
- * @throws TR069EventProcessingException\r
- */\r
- public TR069RPC processRPCResponse(TR069RPC msg, String sessionId)\r
- throws TR069EventProcessingException {\r
- DeviceOperationRequestDetails deviceOperationRequestDetails = null;\r
- try {\r
- deviceOperationRequestDetails =\r
- tr069DeviceEventHandler.getOpRequestDetailsBySessionId(sessionId);\r
- if (null == deviceOperationRequestDetails\r
- || null == deviceOperationRequestDetails.getDeviceDetails()) {\r
- logger.error("Response with invalid session ID: {}", sessionId);\r
- return null;\r
- }\r
-\r
- String deviceId = deviceOperationRequestDetails.getDeviceDetails().getDeviceId();\r
- MDC.put(CLIENT_STR, deviceId);\r
- DeviceRPCResponse deviceRPCResponse = new DeviceRPCResponse();\r
- deviceRPCResponse.setDeviceDetails(deviceOperationRequestDetails.getDeviceDetails());\r
- deviceRPCResponse.setOperationId(deviceOperationRequestDetails.getOperationId());\r
- OperationResponse operationResponse = null;\r
- if (msg instanceof Fault) {\r
- Fault values = (Fault) msg;\r
- logger.info("{} ID->{} faultCode->{} faultString->{}", values.getName(), values.getId(),\r
- values.getCwmpFaultCode(), values.getFaultStringCwmp());\r
- deviceRPCResponse.setFaultKey(values.getCwmpFaultCode());\r
- deviceRPCResponse.setFaultString(\r
- values.getFaultStringCwmp() + ": Error code: " + values.getCwmpFaultCode());\r
-\r
- TR069OperationCode operationCode =\r
- (TR069OperationCode) deviceOperationRequestDetails.getOpCode();\r
- operationResponse = constructResponseForFault(operationCode);\r
- if (operationResponse != null) {\r
- operationResponse.setStatus(1);\r
- operationResponse.setParameterDTOs(new ArrayList<ParameterDTO>());\r
- }\r
- } else {\r
- operationResponse = deviceRPCResponseBuilder.constructDeviceRPCResponse(msg);\r
- }\r
- deviceRPCResponse.setOperationResponse(operationResponse);\r
-\r
- DeviceRPCRequest deviceRPCRequest =\r
- tr069DeviceEventHandler.processDeviceRPCResponse(deviceRPCResponse);\r
- if (null != deviceRPCRequest) {\r
- return deviceRPCBuilder.constructDeviceRPC(deviceRPCRequest);\r
- }\r
- } catch (SessionManagerException e) {\r
- logger.error("Error while getting device detail for the session id: {}", sessionId);\r
- } catch (Exception e) {\r
- throw new TR069EventProcessingException(ErrorCode.FAILED_PROCESSING_RPC_RESPONSE,\r
- msg.getName(), e.getMessage());\r
- } finally {\r
- MDC.remove(CLIENT_STR);\r
- }\r
-\r
- return null;\r
- }\r
-\r
- /**\r
- * @param sessionId\r
- * @return\r
- * @throws TR069EventProcessingException\r
- */\r
- public TR069RPC processEmptyRequest(String sessionId) throws TR069EventProcessingException {\r
- try {\r
- DeviceOperationRequestDetails deviceOperationRequestDetails =\r
- tr069DeviceEventHandler.getOpRequestDetailsBySessionId(sessionId);\r
- DeviceRPCRequest deviceRPCRequest = null;\r
- String deviceId = deviceOperationRequestDetails.getDeviceDetails().getDeviceId();\r
- MDC.put(CLIENT_STR, deviceId);\r
- deviceRPCRequest = tr069DeviceEventHandler\r
- .processEmptyDeviceRequest(deviceOperationRequestDetails.getDeviceDetails());\r
- if (null == deviceRPCRequest) {\r
- return null;\r
- } else {\r
- logger.debug("There exists a NBI request to process.");\r
- return deviceRPCBuilder.constructDeviceRPC(deviceRPCRequest);\r
- }\r
- } catch (SessionManagerException e) {\r
- logger.error("Error while processing empty request, reason: {}", e.getMessage());\r
- } catch (Exception e) {\r
- throw new TR069EventProcessingException(ErrorCode.EMPTY_REQUEST_PROCESSING_ERROR,\r
- e.getMessage());\r
- } finally {\r
- MDC.remove(CLIENT_STR);\r
- }\r
- return null;\r
- }\r
-\r
- /**\r
- * @param operationCode\r
- * @return\r
- */\r
- private OperationResponse constructResponseForFault(TR069OperationCode operationCode) {\r
- OperationResponse operationResponse = null;\r
- if (operationCode.equals(TR069OperationCode.ADD_OBJECT)) {\r
- operationResponse = new org.commscope.tr069adapter.acs.common.response.AddObjectResponse();\r
- } else if (operationCode.equals(TR069OperationCode.DELETE_OBJECT)) {\r
- operationResponse = new org.commscope.tr069adapter.acs.common.response.DeleteObjectResponse();\r
- } else if (operationCode.equals(TR069OperationCode.SET_PARAMETER_VALUES)) {\r
- operationResponse =\r
- new org.commscope.tr069adapter.acs.common.response.SetParameterValueResponse();\r
- } else if (operationCode.equals(TR069OperationCode.GET_PARAMETER_VALUES)) {\r
- operationResponse =\r
- new org.commscope.tr069adapter.acs.common.response.GetParameterValueResponse();\r
- } else if (operationCode.equals(TR069OperationCode.GET_PARAMETER_ATTRIBUTES)) {\r
- operationResponse =\r
- new org.commscope.tr069adapter.acs.common.response.GetParameterAttributeResponse();\r
- }\r
- return operationResponse;\r
- }\r
-\r
- /**\r
- * @param serialNumber\r
- */\r
- public void stopConnectionInitiatorTimer(String serialNumber) {\r
- String timerId = serialNumber + SEPERATOR + CONNECTION_REQUEST;\r
- try {\r
- logger\r
- .debug("Canceling the Connection initiation timer, as Inform is been sent by the device");\r
- timerServiceManagerAPI.stopTimer(timerId);\r
- } catch (TimerException e) {\r
- logger.error(\r
- "An exception occurred while stopping the connection initiator session timer, Reason: {}",\r
- e.getMessage());\r
- }\r
- }\r
-\r
- /**\r
- * @param lastInform\r
- * @return\r
- */\r
- private boolean validateInformParameters(Inform lastInform) {\r
- boolean validate = false;\r
- String root = lastInform.getRoot();\r
- if (!informParameter.containsKey(root))\r
- return validate;\r
- List<String> params = informParameter.get(root);\r
- Set<String> keySet = lastInform.getParams().keySet();\r
- validate = true;\r
- for (String param : params) {\r
- if (!keySet.contains(param)) {\r
- logger.warn("This param Not found in the inform {}", param);\r
- validate = false;\r
- break;\r
- }\r
- }\r
- return validate;\r
- }\r
-\r
- /**\r
- * @param tr069ex\r
- * @return\r
- */\r
- public int handleException(TR069EventProcessingException tr069ex) {\r
-\r
- int errorresponseCode = 0;\r
-\r
- ErrorCode errorCode = tr069ex.getErrorCode();\r
- switch (errorCode) {\r
- case UNSUPPORTED_CHARACTER_ENCODING:\r
- case INVALID_PARAMS_IN_INFORM:\r
- case FAILED_PROCESSING_INFORM:\r
- errorresponseCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;\r
- break;\r
- case UNAUTHORIZED_EVENT:\r
- errorresponseCode = HttpServletResponse.SC_UNAUTHORIZED;\r
- break;\r
- default:\r
- break;\r
- }\r
-\r
- return errorresponseCode;\r
- }\r
-\r
- /***************************************************************************************************************************/\r
-\r
- public void setDeviceInformBuilder(DeviceInformBuilder deviceInformBuilder) {\r
- this.deviceInformBuilder = deviceInformBuilder;\r
- }\r
-\r
- public void setDeviceRPCBuilder(DeviceRPCBuilder deviceRPCBuilder) {\r
- this.deviceRPCBuilder = deviceRPCBuilder;\r
- }\r
-\r
- public void setDeviceRPCResponseBuilder(DeviceRPCResponseBuilder deviceRPCResponseBuilder) {\r
- this.deviceRPCResponseBuilder = deviceRPCResponseBuilder;\r
- }\r
-\r
- public void setTr069DeviceEventHandler(TR069DeviceEventHandler tr069DeviceEventHandler) {\r
- this.tr069DeviceEventHandler = tr069DeviceEventHandler;\r
- }\r
-\r
- public void setTimerServiceManagerAPI(TimerServiceManagerAPI timerServiceManagerAPI) {\r
- this.timerServiceManagerAPI = timerServiceManagerAPI;\r
- }\r
-\r
- public void setDeviceAuthenticator(DeviceValidator deviceAuthenticator) {\r
- this.deviceValidtor = deviceAuthenticator;\r
- }\r
-\r
-}\r
+/*
+ * ============LICENSE_START========================================================================
+ * ONAP : tr-069-adapter
+ * =================================================================================================
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.
+ * =================================================================================================
+ * This tr-069-adapter software file is distributed by CommScope Inc under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You
+ * may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ===============LICENSE_END=======================================================================
+ */
+
+package org.commscope.tr069adapter.acs.cpe.handler;
+
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.CONNECTION_REQUEST;
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.SEPERATOR;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;
+import org.commscope.tr069adapter.acs.common.OperationResponse;
+import org.commscope.tr069adapter.acs.common.dto.DeviceOperationRequestDetails;
+import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;
+import org.commscope.tr069adapter.acs.common.exception.SessionManagerException;
+import org.commscope.tr069adapter.acs.common.exception.TR069EventProcessingException;
+import org.commscope.tr069adapter.acs.common.inform.AbstractDeviceInform;
+import org.commscope.tr069adapter.acs.common.inform.TransferCompleteInform;
+import org.commscope.tr069adapter.acs.common.requestprocessor.service.TR069DeviceEventHandler;
+import org.commscope.tr069adapter.acs.common.response.DeviceInformResponse;
+import org.commscope.tr069adapter.acs.common.utils.ErrorCode;
+import org.commscope.tr069adapter.acs.cpe.TR069RPC;
+import org.commscope.tr069adapter.acs.cpe.builder.DeviceInformBuilder;
+import org.commscope.tr069adapter.acs.cpe.builder.DeviceRPCBuilder;
+import org.commscope.tr069adapter.acs.cpe.builder.DeviceRPCResponseBuilder;
+import org.commscope.tr069adapter.acs.cpe.rpc.Fault;
+import org.commscope.tr069adapter.acs.cpe.rpc.Inform;
+import org.commscope.tr069adapter.acs.cpe.rpc.TransferComplete;
+import org.commscope.tr069adapter.common.timer.TimerException;
+import org.commscope.tr069adapter.common.timer.TimerServiceManagerAPI;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DeviceEventHandler {
+
+ private static final Logger logger = LoggerFactory.getLogger(DeviceEventHandler.class);
+ public static final String PATTERN = "[\n|\r|\t]";
+
+ private static final String CLIENT_STR = "client";
+
+ @Autowired
+ private DeviceInformBuilder deviceInformBuilder;
+
+ @Autowired
+ private DeviceRPCBuilder deviceRPCBuilder;
+
+ @Autowired
+ private DeviceRPCResponseBuilder deviceRPCResponseBuilder;
+
+ @Autowired
+ private TR069DeviceEventHandler tr069DeviceEventHandler;
+
+ @Autowired
+ private TimerServiceManagerAPI timerServiceManagerAPI;
+
+ @Autowired
+ private DeviceValidator deviceValidtor;
+
+ private static Map<String, List<String>> informParameter = null;
+
+ static {
+ informParameter = new HashMap<>();
+ List<String> parameters = new ArrayList<>();
+ parameters.add("InternetGatewayDevice.DeviceInfo.HardwareVersion");
+ parameters.add("InternetGatewayDevice.DeviceInfo.SoftwareVersion");
+ parameters.add("InternetGatewayDevice.DeviceInfo.ProvisioningCode");
+ parameters.add("InternetGatewayDevice.ManagementServer.ConnectionRequestURL");
+ parameters.add("InternetGatewayDevice.ManagementServer.ParameterKey");
+ informParameter.put("InternetGatewayDevice", parameters);
+
+ List<String> deviceParameters = new ArrayList<>();
+ deviceParameters.add("Device.DeviceInfo.HardwareVersion");
+ deviceParameters.add("Device.DeviceInfo.SoftwareVersion");
+ deviceParameters.add("Device.DeviceInfo.ProvisioningCode");
+ deviceParameters.add("Device.ManagementServer.ConnectionRequestURL");
+ deviceParameters.add("Device.ManagementServer.ParameterKey");
+ informParameter.put("Device", deviceParameters);
+ }
+
+ /**
+ * @param inform
+ * @param authorizationHeader
+ * @return
+ * @throws TR069EventProcessingException
+ */
+ public DeviceInformResponse processDeviceInform(Inform inform, String authorizationHeader)
+ throws TR069EventProcessingException {
+
+ DeviceInformResponse deviceInformResponse = null;
+ try {
+ String deviceId = inform.getSn();
+ MDC.put(CLIENT_STR, deviceId);
+
+ logger.info("Processing the device Inform event");
+
+ logger.debug("Authorization header received in the request -> {}", authorizationHeader);
+ Boolean isAuthorized = deviceValidtor.isDeviceAuthorized(inform, authorizationHeader);
+ logger.info("Is device authentication successful: {}", isAuthorized);
+ if (!isAuthorized.booleanValue()) {
+ TR069EventProcessingException ex =
+ new TR069EventProcessingException(ErrorCode.UNAUTHORIZED_EVENT, "Authorization failed");
+ String exceptionMessage = ex.getMessage().replaceAll(PATTERN, "_");
+ logger.error(exceptionMessage);
+ throw ex;
+ }
+
+ logger.debug("The root element is: {}", inform.getRoot());
+ // Canceling any connection initiator timer running, due to inform event
+ stopConnectionInitiatorTimer(inform.getSn());
+
+ if (!deviceValidtor.validateDevice(inform.getSn(), inform.getOui(), inform.getProductClass())
+ .booleanValue()) {
+ TR069EventProcessingException ex =
+ new TR069EventProcessingException(ErrorCode.OUI_OR_PC_MISMATCH);
+ logger.error(ex.getMessage());
+ throw ex;
+ }
+
+ if (!validateInformParameters(inform)) {
+ TR069EventProcessingException ex =
+ new TR069EventProcessingException(ErrorCode.INVALID_PARAMS_IN_INFORM);
+ logger.error(ex.getMessage());
+ throw ex;
+ }
+
+ AbstractDeviceInform deviceInform = deviceInformBuilder.constructDeviceInform(inform);
+ if (deviceInform == null) {
+ TR069EventProcessingException ex =
+ new TR069EventProcessingException(ErrorCode.INVALID_PARAMS_IN_INFORM);
+ logger.error(ex.getMessage());
+ throw ex;
+ }
+
+ logger.debug("Sending the device inform to TR069 Request Processor to process");
+ deviceInformResponse = tr069DeviceEventHandler.processDeviceInform(deviceInform);
+
+ } catch (TR069EventProcessingException tr069Ex) {
+ throw tr069Ex;
+ } catch (Exception e) {
+ TR069EventProcessingException ex =
+ new TR069EventProcessingException(ErrorCode.FAILED_PROCESSING_INFORM, e.getMessage());
+ String exceptionMessage = ex.getMessage().replaceAll(PATTERN, "_");
+ logger.error(exceptionMessage);
+ throw ex;
+ } finally {
+ MDC.remove(CLIENT_STR);
+ }
+
+ return deviceInformResponse;
+
+ }
+
+ /**
+ * @param tc
+ * @return
+ * @throws TR069EventProcessingException
+ */
+ public DeviceInformResponse processTransferComplete(TransferComplete tc)
+ throws TR069EventProcessingException {
+
+ logger.debug("Processing Transfer Complete");
+
+ String startTime = tc.getStartTime();
+ String completeTime = tc.getCompleteTime();
+ int faultCode = tc.getFaultCode();
+ String faultString = tc.getFaultString();
+ String commandKey = tc.getCommandKey();
+
+ DeviceInformResponse deviceInformResponse = null;
+
+ try {
+ MDC.put(CLIENT_STR, commandKey);
+ TransferCompleteInform transferCompleteInform = new TransferCompleteInform();
+ transferCompleteInform.setCommandKey(tc.getCommandKey());
+ transferCompleteInform.setCompleteTime(completeTime);
+ transferCompleteInform.setFaultCode(faultCode);
+ transferCompleteInform.setFaultString(faultString);
+ transferCompleteInform.setStartTime(startTime);
+
+ logger.debug("TransferComplete inform received with Start time");
+
+ transferCompleteInform.setDeviceDetails(tr069DeviceEventHandler.getDeviceDetails(commandKey));
+ deviceInformResponse = tr069DeviceEventHandler.processDeviceInform(transferCompleteInform);
+ logger.debug("Successfully processed the TRANSFER COMPLETE Inform");
+
+ } catch (Exception e) {
+ throw new TR069EventProcessingException(ErrorCode.FAILED_PROCESSING_INFORM, e.getMessage());
+ } finally {
+ MDC.remove(CLIENT_STR);
+ }
+
+ return deviceInformResponse;
+ }
+
+ /**
+ * @param msg
+ * @param sessionId
+ * @return
+ * @throws TR069EventProcessingException
+ */
+ public TR069RPC processRPCResponse(TR069RPC msg, String sessionId)
+ throws TR069EventProcessingException {
+ DeviceOperationRequestDetails deviceOperationRequestDetails = null;
+ try {
+ deviceOperationRequestDetails =
+ tr069DeviceEventHandler.getOpRequestDetailsBySessionId(sessionId);
+ if (null == deviceOperationRequestDetails
+ || null == deviceOperationRequestDetails.getDeviceDetails()) {
+ sessionId = sessionId.replaceAll(PATTERN, "_");
+ logger.error("Response with invalid session ID: {}", sessionId);
+ return null;
+ }
+
+ String deviceId = deviceOperationRequestDetails.getDeviceDetails().getDeviceId();
+ MDC.put(CLIENT_STR, deviceId);
+ DeviceRPCResponse deviceRPCResponse = new DeviceRPCResponse();
+ deviceRPCResponse.setDeviceDetails(deviceOperationRequestDetails.getDeviceDetails());
+ deviceRPCResponse.setOperationId(deviceOperationRequestDetails.getOperationId());
+ OperationResponse operationResponse = null;
+ if (msg instanceof Fault) {
+ Fault values = (Fault) msg;
+ logger.info("{} ID->{} faultCode->{} faultString->{}", values.getName(), values.getId(),
+ values.getCwmpFaultCode(), values.getFaultStringCwmp());
+ deviceRPCResponse.setFaultKey(values.getCwmpFaultCode());
+ deviceRPCResponse.setFaultString(
+ values.getFaultStringCwmp() + ": Error code: " + values.getCwmpFaultCode());
+
+ TR069OperationCode operationCode =
+ (TR069OperationCode) deviceOperationRequestDetails.getOpCode();
+ operationResponse = constructResponseForFault(operationCode);
+ if (operationResponse != null) {
+ operationResponse.setStatus(1);
+ operationResponse.setParameterDTOs(new ArrayList<>());
+ }
+ } else {
+ operationResponse = deviceRPCResponseBuilder.constructDeviceRPCResponse(msg);
+ }
+ deviceRPCResponse.setOperationResponse(operationResponse);
+
+ DeviceRPCRequest deviceRPCRequest =
+ tr069DeviceEventHandler.processDeviceRPCResponse(deviceRPCResponse);
+ if (null != deviceRPCRequest) {
+ return deviceRPCBuilder.constructDeviceRPC(deviceRPCRequest);
+ }
+ } catch (SessionManagerException e) {
+ logger.error("Error while getting device detail for the session id: {}", sessionId);
+ } catch (Exception e) {
+ throw new TR069EventProcessingException(ErrorCode.FAILED_PROCESSING_RPC_RESPONSE,
+ msg.getName(), e.getMessage());
+ } finally {
+ MDC.remove(CLIENT_STR);
+ }
+
+ return null;
+ }
+
+ /**
+ * @param sessionId
+ * @return
+ * @throws TR069EventProcessingException
+ */
+ public TR069RPC processEmptyRequest(String sessionId) throws TR069EventProcessingException {
+ try {
+ DeviceOperationRequestDetails deviceOperationRequestDetails =
+ tr069DeviceEventHandler.getOpRequestDetailsBySessionId(sessionId);
+ DeviceRPCRequest deviceRPCRequest = null;
+ String deviceId = deviceOperationRequestDetails.getDeviceDetails().getDeviceId();
+ MDC.put(CLIENT_STR, deviceId);
+ deviceRPCRequest = tr069DeviceEventHandler
+ .processEmptyDeviceRequest(deviceOperationRequestDetails.getDeviceDetails());
+ if (null == deviceRPCRequest) {
+ return null;
+ } else {
+ logger.debug("There exists a NBI request to process.");
+ return deviceRPCBuilder.constructDeviceRPC(deviceRPCRequest);
+ }
+ } catch (SessionManagerException e) {
+ logger.error("Error while processing empty request, reason: {}", e.getMessage());
+ } catch (Exception e) {
+ throw new TR069EventProcessingException(ErrorCode.EMPTY_REQUEST_PROCESSING_ERROR,
+ e.getMessage());
+ } finally {
+ MDC.remove(CLIENT_STR);
+ }
+ return null;
+ }
+
+ /**
+ * @param operationCode
+ * @return
+ */
+ private OperationResponse constructResponseForFault(TR069OperationCode operationCode) {
+ OperationResponse operationResponse = null;
+ if (operationCode.equals(TR069OperationCode.ADD_OBJECT)) {
+ operationResponse = new org.commscope.tr069adapter.acs.common.response.AddObjectResponse();
+ } else if (operationCode.equals(TR069OperationCode.DELETE_OBJECT)) {
+ operationResponse = new org.commscope.tr069adapter.acs.common.response.DeleteObjectResponse();
+ } else if (operationCode.equals(TR069OperationCode.SET_PARAMETER_VALUES)) {
+ operationResponse =
+ new org.commscope.tr069adapter.acs.common.response.SetParameterValueResponse();
+ } else if (operationCode.equals(TR069OperationCode.GET_PARAMETER_VALUES)) {
+ operationResponse =
+ new org.commscope.tr069adapter.acs.common.response.GetParameterValueResponse();
+ } else if (operationCode.equals(TR069OperationCode.GET_PARAMETER_ATTRIBUTES)) {
+ operationResponse =
+ new org.commscope.tr069adapter.acs.common.response.GetParameterAttributeResponse();
+ }
+ return operationResponse;
+ }
+
+ /**
+ * @param serialNumber
+ */
+ public void stopConnectionInitiatorTimer(String serialNumber) {
+ String timerId = serialNumber + SEPERATOR + CONNECTION_REQUEST;
+ try {
+ logger
+ .debug("Canceling the Connection initiation timer, as Inform is been sent by the device");
+ timerServiceManagerAPI.stopTimer(timerId);
+ } catch (TimerException e) {
+ logger.error(
+ "An exception occurred while stopping the connection initiator session timer, Reason: {}",
+ e.getMessage());
+ }
+ }
+
+ /**
+ * @param lastInform
+ * @return
+ */
+ private boolean validateInformParameters(Inform lastInform) {
+ boolean validate = false;
+ String root = lastInform.getRoot();
+ if (!informParameter.containsKey(root))
+ return validate;
+ List<String> params = informParameter.get(root);
+ Set<String> keySet = lastInform.getParams().keySet();
+ validate = true;
+ for (String param : params) {
+ if (!keySet.contains(param)) {
+ logger.warn("This param Not found in the inform {}", param);
+ validate = false;
+ break;
+ }
+ }
+ return validate;
+ }
+
+ /**
+ * @param tr069ex
+ * @return
+ */
+ public int handleException(TR069EventProcessingException tr069ex) {
+
+ int errorresponseCode = 0;
+
+ ErrorCode errorCode = tr069ex.getErrorCode();
+ switch (errorCode) {
+ case UNSUPPORTED_CHARACTER_ENCODING:
+ case INVALID_PARAMS_IN_INFORM:
+ case FAILED_PROCESSING_INFORM:
+ errorresponseCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+ break;
+ case UNAUTHORIZED_EVENT:
+ errorresponseCode = HttpServletResponse.SC_UNAUTHORIZED;
+ break;
+ default:
+ break;
+ }
+
+ return errorresponseCode;
+ }
+
+ /***************************************************************************************************************************/
+
+ public void setDeviceInformBuilder(DeviceInformBuilder deviceInformBuilder) {
+ this.deviceInformBuilder = deviceInformBuilder;
+ }
+
+ public void setDeviceRPCBuilder(DeviceRPCBuilder deviceRPCBuilder) {
+ this.deviceRPCBuilder = deviceRPCBuilder;
+ }
+
+ public void setDeviceRPCResponseBuilder(DeviceRPCResponseBuilder deviceRPCResponseBuilder) {
+ this.deviceRPCResponseBuilder = deviceRPCResponseBuilder;
+ }
+
+ public void setTr069DeviceEventHandler(TR069DeviceEventHandler tr069DeviceEventHandler) {
+ this.tr069DeviceEventHandler = tr069DeviceEventHandler;
+ }
+
+ public void setTimerServiceManagerAPI(TimerServiceManagerAPI timerServiceManagerAPI) {
+ this.timerServiceManagerAPI = timerServiceManagerAPI;
+ }
+
+ public void setDeviceAuthenticator(DeviceValidator deviceAuthenticator) {
+ this.deviceValidtor = deviceAuthenticator;
+ }
+
+}