-/*\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.custom;\r
-\r
-import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.NUMBER_REGEX;\r
-import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.SUCCESS;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.regex.Matcher;\r
-import java.util.regex.Pattern;\r
-\r
-import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
-import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
-import org.commscope.tr069adapter.acs.common.OperationDetails;\r
-import org.commscope.tr069adapter.acs.common.OperationResponse;\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.TR069OperationCode;\r
-import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
-import org.commscope.tr069adapter.acs.common.exception.TR069EventProcessingException;\r
-import org.commscope.tr069adapter.acs.common.response.AddObjectResponse;\r
-import org.commscope.tr069adapter.acs.common.response.DeleteObjectResponse;\r
-import org.commscope.tr069adapter.acs.common.response.GetParameterValueResponse;\r
-import org.commscope.tr069adapter.acs.common.response.SetParameterValueResponse;\r
-import org.commscope.tr069adapter.acs.requestprocessor.dao.DeviceRPCRequestRepositoryHelper;\r
-import org.commscope.tr069adapter.acs.requestprocessor.dto.CustomOperationData;\r
-import org.commscope.tr069adapter.acs.requestprocessor.entity.TR069DeviceRPCRequestEntity;\r
-import org.commscope.tr069adapter.acs.requestprocessor.impl.TR069RequestProcessEngine;\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("ConfigureMultipleObject")\r
-public class ConfigureMultipleObject implements CustomOperation {\r
-\r
- private static final Logger logger = LoggerFactory.getLogger(ConfigureMultipleObject.class);\r
-\r
- @Autowired\r
- TR069RequestProcessEngine tr069ProcessEngine;\r
-\r
- @Autowired\r
- protected DeviceRPCRequestRepositoryHelper deviceRPCRequestRepositoryHelper;\r
-\r
- public CustomOperationData executeCustomLogic(CustomOperationData customOperationData)\r
- throws TR069EventProcessingException {\r
-\r
- TR069DeviceDetails deviceDetails = customOperationData.getDeviceDetails();\r
- DeviceRPCResponse deviceRPCResponse = customOperationData.getDeviceRPCResponse();\r
- DeviceRPCRequest nbiDeviceOperationRequest = customOperationData.getDeviceRPCRequest();\r
-\r
- logger.debug("Started processing Configure multiple object");\r
- DeviceRPCRequest operRequest = null;\r
- Long responseOperationId = null;\r
- if (deviceRPCResponse != null && deviceRPCResponse.getOperationId() != null) {\r
- responseOperationId = deviceRPCResponse.getOperationId();\r
- if (deviceRPCResponse.getFaultKey() != null && responseOperationId != null\r
- && responseOperationId.equals(nbiDeviceOperationRequest.getOperationId())) {\r
- logger.error("The Configure Multiple Object operation has failed, Reason: {}",\r
- deviceRPCResponse.getFaultString());\r
-\r
- logger.debug(\r
- "Deleting the NBI operation request for custom operation configureMultipleObjects with operation ID: {}",\r
- responseOperationId);\r
- List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =\r
- deviceRPCRequestRepositoryHelper\r
- .findByDeviceIdAndOperationId(deviceDetails.getDeviceId(), responseOperationId);\r
- for (TR069DeviceRPCRequestEntity tr069DeviceRPCRequestEntity : tr069DeviceRPCRequestEntityList) {\r
- tr069DeviceRPCRequestEntity.setIsProcessed(Integer.valueOf(1));\r
- }\r
- deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);\r
-\r
- OperationResponse operationResponse = new GetParameterValueResponse();\r
- operationResponse.setParameterDTOs(new ArrayList<ParameterDTO>());\r
- operationResponse.setStatus(1);\r
- deviceRPCResponse.setOperationResponse(operationResponse);\r
-\r
- customOperationData.setDeviceRPCResponse(deviceRPCResponse);\r
- customOperationData.setDeviceRPCRequest(null);\r
- logger.debug("Finished processing Configure multiple object");\r
- return customOperationData;\r
- }\r
- }\r
-\r
- TR069OperationDetails tr069OperationDetails =\r
- (TR069OperationDetails) nbiDeviceOperationRequest.getOpDetails();\r
- List<ParameterDTO> tr069deleteParamList = tr069OperationDetails.getDeleteParamList();\r
- List<ParameterDTO> tr069modifyParamList = tr069OperationDetails.getModifyParamList();\r
- List<ParameterDTO> tr069setParamList = tr069OperationDetails.getSetParamList();\r
-\r
- OperationOrder nextOperation = null;\r
- boolean isPendingOperationExists = true;\r
- final String NXT_OPERATION = "Next operation to be executed is : ";\r
-\r
- if ((responseOperationId == null) || (responseOperationId != null\r
- && !responseOperationId.equals(nbiDeviceOperationRequest.getOperationId()))) {\r
- // Must be called from Empty HTTP request, First operation to be called\r
-\r
- // Must be called from a different user operation, First operation to be called\r
- // if response operation id is different from current\r
- // nbiDevOperRequest operation id then first step is deleteObject\r
-\r
- nextOperation = OperationOrder.DELETE_OBJECT;\r
- logger.debug(NXT_OPERATION, nextOperation);\r
- } else {\r
- // Since the responseOperation is not null and equivalent, find the\r
- // response type and the take next action\r
- OperationResponse opResponse = deviceRPCResponse.getOperationResponse();\r
- if (opResponse instanceof DeleteObjectResponse) {\r
- logger.debug("Received delete object response");\r
- if (null != tr069deleteParamList && !tr069deleteParamList.isEmpty()) {\r
- int i = 0;\r
- for (ParameterDTO deleteParam : tr069deleteParamList) {\r
- i++;\r
- if (!deleteParam.isProcessed()) {\r
- deleteParam.setProcessed(true);\r
- } else {\r
- continue;\r
- }\r
- logger.debug("Persisting the NBI request for deleteObject");\r
- // Update the existing NBI request\r
- List<TR069DeviceRPCRequestEntity> entityList =\r
- deviceRPCRequestRepositoryHelper.findByDeviceIdAndOperationId(\r
- deviceDetails.getDeviceId(), nbiDeviceOperationRequest.getOperationId());\r
- List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =\r
- TR069RequestProcessorUtility.convertToEntity(nbiDeviceOperationRequest);\r
- for (int j = 0; j < entityList.size(); j++) {\r
- tr069DeviceRPCRequestEntityList.get(j).setId(entityList.get(j).getId());\r
- }\r
- deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);\r
-\r
- if (tr069deleteParamList.size() > i) {\r
- nextOperation = OperationOrder.DELETE_OBJECT;\r
- logger.debug(NXT_OPERATION, nextOperation);\r
- break;\r
- } else {\r
- nextOperation = OperationOrder.ADD_OBJECT;\r
- logger.debug(NXT_OPERATION, nextOperation);\r
- }\r
- }\r
- } else {\r
- nextOperation = OperationOrder.ADD_OBJECT;\r
- logger.debug(NXT_OPERATION, nextOperation);\r
- }\r
- } else if (opResponse instanceof AddObjectResponse) {\r
- logger.debug("Received Add object response");\r
- if (null != tr069setParamList && !tr069setParamList.isEmpty()) {\r
- long instanceNumber;\r
- boolean addParamExist = false;\r
- AddObjectResponse addObjResponse =\r
- (AddObjectResponse) deviceRPCResponse.getOperationResponse();\r
- List<ParameterDTO> modifyParamList = new ArrayList<>();\r
- List<ParameterDTO> removeParamList = new ArrayList<>();\r
- ParameterDTO addParam = null;\r
-\r
- if (null != addObjResponse) {\r
- instanceNumber = addObjResponse.getInstanceNumber();\r
- String replaceIndex = null;\r
- String replaceParam = null;\r
-\r
- for (ParameterDTO setParam : tr069setParamList) {\r
- if (!setParam.isProcessed()) {\r
- String paramName = setParam.getParamName();\r
- final Matcher matcher = Pattern.compile(NUMBER_REGEX).matcher(paramName);\r
- String index = null;\r
- String modifyParamName = null;\r
- String subString = null;\r
- while (matcher.find()) {\r
- index = matcher.group().substring(1, matcher.group().length() - 1);\r
- StringBuilder sb = new StringBuilder(paramName);\r
- int lastIndex = paramName.lastIndexOf(matcher.group());\r
- modifyParamName = (sb.replace(lastIndex, lastIndex + matcher.group().length(),\r
- "." + instanceNumber + ".")).toString();\r
- subString = paramName.substring(0, matcher.start()) + ".";\r
- }\r
- if (null == replaceIndex)\r
- replaceIndex = index;\r
- if (null == replaceParam)\r
- replaceParam = subString;\r
- if (null != replaceIndex && null != index && replaceIndex.equals(index)\r
- && replaceParam.equalsIgnoreCase(subString)) {\r
- setParam.setProcessed(true);\r
- modifyParamList.add(prepareParamDTO(modifyParamName, null, setParam));\r
- removeParamList.add(prepareParamDTO(null, null, setParam));\r
- } else {\r
- addParamExist = true;\r
- }\r
- if (null == addParam) {\r
- logger.debug(\r
- "The device index chosen is {} for adding the NBI tab parameter with index {}",\r
- instanceNumber, replaceIndex);\r
- addParam = prepareParamDTO(subString + replaceIndex,\r
- String.valueOf(instanceNumber), setParam);\r
- }\r
- }\r
- }\r
- }\r
- // Replace index with instance number and add in modify param list\r
- if (!modifyParamList.isEmpty()) {\r
- tr069modifyParamList.addAll(modifyParamList);\r
- }\r
- // Prepare add object param and add in set param list\r
- if (null != addParam) {\r
- addParam.setDataType("1");\r
- tr069setParamList.add(addParam);\r
- }\r
- // Remove all processed set params from set param list\r
- if (!removeParamList.isEmpty()) {\r
- tr069setParamList.removeAll(removeParamList);\r
- }\r
-\r
- logger.debug("Persisting the NBI request for addObject");\r
- List<TR069DeviceRPCRequestEntity> entityList =\r
- deviceRPCRequestRepositoryHelper.findByDeviceIdAndOperationId(\r
- deviceDetails.getDeviceId(), nbiDeviceOperationRequest.getOperationId());\r
- List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =\r
- TR069RequestProcessorUtility.convertToEntity(nbiDeviceOperationRequest);\r
- for (int i = 0; i < entityList.size(); i++) {\r
- tr069DeviceRPCRequestEntityList.get(i).setId(entityList.get(i).getId());\r
- }\r
- deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);\r
-\r
- if (addParamExist) {\r
- nextOperation = OperationOrder.ADD_OBJECT;\r
- logger.debug(NXT_OPERATION, nextOperation);\r
- } else {\r
- nextOperation = OperationOrder.SET_PARAMETER_VALUE;\r
- logger.debug(NXT_OPERATION, nextOperation);\r
- }\r
- } else {\r
- nextOperation = OperationOrder.SET_PARAMETER_VALUE;\r
- logger.debug(NXT_OPERATION, nextOperation);\r
- }\r
- } else if (opResponse instanceof SetParameterValueResponse) {\r
- logger.debug("Received Set parameter value response");\r
- isPendingOperationExists = false;\r
- }\r
- }\r
-\r
- if (isPendingOperationExists) {\r
- boolean checkForNextoperation = true;\r
- while (checkForNextoperation) {\r
- switch (nextOperation) {\r
- case DELETE_OBJECT:\r
- if (null != tr069deleteParamList && !tr069deleteParamList.isEmpty()) {\r
- logger.debug("Started executing delete object request");\r
- checkForNextoperation = false;\r
- DeviceRPCRequest clonedOpRequest = cloneNBIRequest(nbiDeviceOperationRequest);\r
- List<ParameterDTO> deleteParamList = new ArrayList<>();\r
- // Just take the first not processed delete object from the list\r
- for (ParameterDTO deleteParam : tr069deleteParamList) {\r
- if (!deleteParam.isProcessed()) {\r
- deleteParamList.add(deleteParam);\r
- break;\r
- }\r
- }\r
- clonedOpRequest.setOpDetails(null);\r
- OperationDetails opDetails = new OperationDetails();\r
- opDetails.setOpCode(TR069OperationCode.DELETE_OBJECT);\r
- opDetails.setParmeters(deleteParamList);\r
- clonedOpRequest.setOpDetails(opDetails);\r
- operRequest = clonedOpRequest;\r
- } else {\r
- nextOperation = OperationOrder.ADD_OBJECT;\r
- logger.debug(NXT_OPERATION, nextOperation);\r
- }\r
- break;\r
- case ADD_OBJECT:\r
- if (null != tr069setParamList && !tr069setParamList.isEmpty()) {\r
- logger.debug("Started executing Add object request");\r
- checkForNextoperation = false;\r
- DeviceRPCRequest clonedOpRequest = cloneNBIRequest(nbiDeviceOperationRequest);\r
- List<ParameterDTO> addParamList = new ArrayList<>();\r
- // Just take the first not processed delete object from the list\r
- for (ParameterDTO addParam : tr069setParamList) {\r
- if (!addParam.isProcessed()) {\r
- String addParamMO = null;\r
- final Matcher matcher =\r
- Pattern.compile(NUMBER_REGEX).matcher(addParam.getParamName());\r
- while (matcher.find()) {\r
- addParamMO = addParam.getParamName().substring(0, matcher.start()) + ".";\r
- }\r
- if (null != addParamMO) {\r
- addParamList.add(prepareParamDTO(addParamMO, null, addParam));\r
- }\r
- break;\r
- }\r
- }\r
- clonedOpRequest.setOpDetails(null);\r
- OperationDetails opDetails = new OperationDetails();\r
- opDetails.setOpCode(TR069OperationCode.ADD_OBJECT);\r
- opDetails.setParmeters(addParamList);\r
- clonedOpRequest.setOpDetails(opDetails);\r
- operRequest = clonedOpRequest;\r
- } else {\r
- nextOperation = OperationOrder.SET_PARAMETER_VALUE;\r
- logger.debug(NXT_OPERATION, nextOperation);\r
- }\r
- break;\r
- case SET_PARAMETER_VALUE:\r
- checkForNextoperation = false;\r
- if (null != tr069modifyParamList && !tr069modifyParamList.isEmpty()) {\r
- logger.debug("Started executing SPV request");\r
- DeviceRPCRequest clonedOpRequest = cloneNBIRequest(nbiDeviceOperationRequest);\r
- clonedOpRequest.setOpDetails(null);\r
- OperationDetails opDetails = new OperationDetails();\r
- opDetails.setOpCode(TR069OperationCode.SET_PARAMETER_VALUES);\r
- opDetails.setParmeters(tr069modifyParamList);\r
- clonedOpRequest.setOpDetails(opDetails);\r
- operRequest = clonedOpRequest;\r
- } else {\r
- isPendingOperationExists = false;\r
- operRequest = null;\r
- }\r
- break;\r
- default:\r
- isPendingOperationExists = false;\r
- operRequest = null;\r
- }\r
- }\r
- }\r
-\r
- if (!isPendingOperationExists) {\r
- logger.debug(\r
- "No pending operation exists, hence marking the operation as processed with id {} "\r
- + "and sending GetParameterValueResponse for ConfigureMultipleObjects",\r
- responseOperationId);\r
- List<ParameterDTO> responseParamList = new ArrayList<>();\r
-\r
- if (tr069deleteParamList != null) {\r
- for (ParameterDTO delete : tr069deleteParamList) {\r
- delete.setParamValue(SUCCESS);\r
- delete.setDataType("2");\r
- responseParamList.add(delete);\r
- }\r
- }\r
-\r
- if (tr069modifyParamList != null) {\r
- for (ParameterDTO modify : tr069modifyParamList) {\r
- modify.setParamValue(SUCCESS);\r
- modify.setDataType("4");\r
- responseParamList.add(modify);\r
- }\r
- }\r
-\r
- responseParamList.addAll(tr069setParamList);\r
-\r
- OperationResponse operationResponse = new GetParameterValueResponse();\r
- operationResponse.setParameterDTOs(responseParamList);\r
- if (deviceRPCResponse != null) {\r
- deviceRPCResponse.setDeviceDetails(deviceDetails);\r
- deviceRPCResponse.setOperationResponse(operationResponse);\r
- deviceRPCResponse.setOperationId(responseOperationId);\r
- }\r
-\r
- logger.debug(\r
- "Prepared operation result for custom operation Configure Multiple Objects, hence marking as processed the corresponding NBI Operation request record");\r
- deviceRPCRequestRepositoryHelper.markDeviceRPCRequestAsProcessed(deviceDetails.getDeviceId(),\r
- responseOperationId);\r
- }\r
-\r
- customOperationData.setDeviceRPCResponse(deviceRPCResponse);\r
- customOperationData.setDeviceRPCRequest(operRequest);\r
- logger.debug("Finished processing Configure multiple object");\r
- return customOperationData;\r
- }\r
-\r
- enum OperationOrder {\r
-\r
- SET_PARAMETER_VALUE(null), ADD_OBJECT(SET_PARAMETER_VALUE), DELETE_OBJECT(ADD_OBJECT);\r
-\r
- OperationOrder nextOperation;\r
-\r
- OperationOrder(OperationOrder nextOperation) {\r
- this.nextOperation = nextOperation;\r
- }\r
-\r
- public OperationOrder getNextOperation() {\r
- return nextOperation;\r
- }\r
-\r
- }\r
-\r
- private DeviceRPCRequest cloneNBIRequest(DeviceRPCRequest nbiDeviceOperationRequest) {\r
- return new DeviceRPCRequest(nbiDeviceOperationRequest);\r
- }\r
-\r
- private ParameterDTO prepareParamDTO(String name, String value, ParameterDTO paramDTO) {\r
- ParameterDTO parameterDTO = new ParameterDTO();\r
- if (null != name) {\r
- parameterDTO.setParamName(name);\r
- } else {\r
- parameterDTO.setParamName(paramDTO.getParamName());\r
- }\r
- if (null != value) {\r
- parameterDTO.setParamValue(value);\r
- } else {\r
- parameterDTO.setParamValue(paramDTO.getParamValue());\r
- }\r
- parameterDTO.setDataType(paramDTO.getDataType());\r
- parameterDTO.setProcessed(paramDTO.isProcessed());\r
-\r
- return parameterDTO;\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.requestprocessor.custom;
+
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.NUMBER_REGEX;
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.SUCCESS;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;
+import org.commscope.tr069adapter.acs.common.OperationDetails;
+import org.commscope.tr069adapter.acs.common.OperationResponse;
+import org.commscope.tr069adapter.acs.common.ParameterDTO;
+import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;
+import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;
+import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;
+import org.commscope.tr069adapter.acs.common.exception.TR069EventProcessingException;
+import org.commscope.tr069adapter.acs.common.response.AddObjectResponse;
+import org.commscope.tr069adapter.acs.common.response.DeleteObjectResponse;
+import org.commscope.tr069adapter.acs.common.response.GetParameterValueResponse;
+import org.commscope.tr069adapter.acs.common.response.SetParameterValueResponse;
+import org.commscope.tr069adapter.acs.requestprocessor.dao.DeviceRPCRequestRepositoryHelper;
+import org.commscope.tr069adapter.acs.requestprocessor.dto.CustomOperationData;
+import org.commscope.tr069adapter.acs.requestprocessor.entity.TR069DeviceRPCRequestEntity;
+import org.commscope.tr069adapter.acs.requestprocessor.impl.TR069RequestProcessEngine;
+import org.commscope.tr069adapter.acs.requestprocessor.util.TR069RequestProcessorUtility;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component("ConfigureMultipleObject")
+public class ConfigureMultipleObject implements CustomOperation {
+
+ private static final Logger logger = LoggerFactory.getLogger(ConfigureMultipleObject.class);
+
+ @Autowired
+ TR069RequestProcessEngine tr069ProcessEngine;
+
+ @Autowired
+ protected DeviceRPCRequestRepositoryHelper deviceRPCRequestRepositoryHelper;
+
+ public CustomOperationData executeCustomLogic(CustomOperationData customOperationData)
+ throws TR069EventProcessingException {
+
+ TR069DeviceDetails deviceDetails = customOperationData.getDeviceDetails();
+ DeviceRPCResponse deviceRPCResponse = customOperationData.getDeviceRPCResponse();
+ DeviceRPCRequest nbiDeviceOperationRequest = customOperationData.getDeviceRPCRequest();
+
+ logger.debug("Started processing Configure multiple object");
+ DeviceRPCRequest operRequest = null;
+ Long responseOperationId = null;
+ if (deviceRPCResponse != null && deviceRPCResponse.getOperationId() != null) {
+ responseOperationId = deviceRPCResponse.getOperationId();
+ if (deviceRPCResponse.getFaultKey() != null && responseOperationId != null
+ && responseOperationId.equals(nbiDeviceOperationRequest.getOperationId())) {
+ logger.error("The Configure Multiple Object operation has failed, Reason: {}",
+ deviceRPCResponse.getFaultString());
+
+ logger.debug(
+ "Deleting the NBI operation request for custom operation configureMultipleObjects with operation ID: {}",
+ responseOperationId);
+ List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =
+ deviceRPCRequestRepositoryHelper
+ .findByDeviceIdAndOperationId(deviceDetails.getDeviceId(), responseOperationId);
+ for (TR069DeviceRPCRequestEntity tr069DeviceRPCRequestEntity : tr069DeviceRPCRequestEntityList) {
+ tr069DeviceRPCRequestEntity.setIsProcessed(Integer.valueOf(1));
+ }
+ deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);
+
+ OperationResponse operationResponse = new GetParameterValueResponse();
+ operationResponse.setParameterDTOs(new ArrayList<>());
+ operationResponse.setStatus(1);
+ deviceRPCResponse.setOperationResponse(operationResponse);
+
+ customOperationData.setDeviceRPCResponse(deviceRPCResponse);
+ customOperationData.setDeviceRPCRequest(null);
+ logger.debug("Finished processing Configure multiple object");
+ return customOperationData;
+ }
+ }
+
+ TR069OperationDetails tr069OperationDetails =
+ (TR069OperationDetails) nbiDeviceOperationRequest.getOpDetails();
+ List<ParameterDTO> tr069deleteParamList = tr069OperationDetails.getDeleteParamList();
+ List<ParameterDTO> tr069modifyParamList = tr069OperationDetails.getModifyParamList();
+ List<ParameterDTO> tr069setParamList = tr069OperationDetails.getSetParamList();
+
+ OperationOrder nextOperation = null;
+ boolean isPendingOperationExists = true;
+ final String NXT_OPERATION = "Next operation to be executed is : ";
+
+ if ((responseOperationId == null) || (responseOperationId != null
+ && !responseOperationId.equals(nbiDeviceOperationRequest.getOperationId()))) {
+ // Must be called from Empty HTTP request, First operation to be called
+
+ // Must be called from a different user operation, First operation to be called
+ // if response operation id is different from current
+ // nbiDevOperRequest operation id then first step is deleteObject
+
+ nextOperation = OperationOrder.DELETE_OBJECT;
+ logger.debug(NXT_OPERATION, nextOperation);
+ } else {
+ // Since the responseOperation is not null and equivalent, find the
+ // response type and the take next action
+ OperationResponse opResponse = deviceRPCResponse.getOperationResponse();
+ if (opResponse instanceof DeleteObjectResponse) {
+ logger.debug("Received delete object response");
+ if (null != tr069deleteParamList && !tr069deleteParamList.isEmpty()) {
+ int i = 0;
+ for (ParameterDTO deleteParam : tr069deleteParamList) {
+ i++;
+ if (!deleteParam.isProcessed()) {
+ deleteParam.setProcessed(true);
+ } else {
+ continue;
+ }
+ logger.debug("Persisting the NBI request for deleteObject");
+ // Update the existing NBI request
+ List<TR069DeviceRPCRequestEntity> entityList =
+ deviceRPCRequestRepositoryHelper.findByDeviceIdAndOperationId(
+ deviceDetails.getDeviceId(), nbiDeviceOperationRequest.getOperationId());
+ List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =
+ TR069RequestProcessorUtility.convertToEntity(nbiDeviceOperationRequest);
+ for (int j = 0; j < entityList.size(); j++) {
+ tr069DeviceRPCRequestEntityList.get(j).setId(entityList.get(j).getId());
+ }
+ deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);
+
+ if (tr069deleteParamList.size() > i) {
+ nextOperation = OperationOrder.DELETE_OBJECT;
+ logger.debug(NXT_OPERATION, nextOperation);
+ break;
+ } else {
+ nextOperation = OperationOrder.ADD_OBJECT;
+ logger.debug(NXT_OPERATION, nextOperation);
+ }
+ }
+ } else {
+ nextOperation = OperationOrder.ADD_OBJECT;
+ logger.debug(NXT_OPERATION, nextOperation);
+ }
+ } else if (opResponse instanceof AddObjectResponse) {
+ logger.debug("Received Add object response");
+ if (null != tr069setParamList && !tr069setParamList.isEmpty()) {
+ long instanceNumber;
+ boolean addParamExist = false;
+ AddObjectResponse addObjResponse =
+ (AddObjectResponse) deviceRPCResponse.getOperationResponse();
+ List<ParameterDTO> modifyParamList = new ArrayList<>();
+ List<ParameterDTO> removeParamList = new ArrayList<>();
+ ParameterDTO addParam = null;
+
+ if (null != addObjResponse) {
+ instanceNumber = addObjResponse.getInstanceNumber();
+ String replaceIndex = null;
+ String replaceParam = null;
+
+ for (ParameterDTO setParam : tr069setParamList) {
+ if (!setParam.isProcessed()) {
+ String paramName = setParam.getParamName();
+ final Matcher matcher = Pattern.compile(NUMBER_REGEX).matcher(paramName);
+ String index = null;
+ String modifyParamName = null;
+ String subString = null;
+ while (matcher.find()) {
+ index = matcher.group().substring(1, matcher.group().length() - 1);
+ StringBuilder sb = new StringBuilder(paramName);
+ int lastIndex = paramName.lastIndexOf(matcher.group());
+ modifyParamName = (sb.replace(lastIndex, lastIndex + matcher.group().length(),
+ "." + instanceNumber + ".")).toString();
+ subString = paramName.substring(0, matcher.start()) + ".";
+ }
+ if (null == replaceIndex)
+ replaceIndex = index;
+ if (null == replaceParam)
+ replaceParam = subString;
+ if (null != replaceIndex && null != index && replaceIndex.equals(index)
+ && replaceParam.equalsIgnoreCase(subString)) {
+ setParam.setProcessed(true);
+ modifyParamList.add(prepareParamDTO(modifyParamName, null, setParam));
+ removeParamList.add(prepareParamDTO(null, null, setParam));
+ } else {
+ addParamExist = true;
+ }
+ if (null == addParam) {
+ logger.debug(
+ "The device index chosen is {} for adding the NBI tab parameter with index {}",
+ instanceNumber, replaceIndex);
+ addParam = prepareParamDTO(subString + replaceIndex,
+ String.valueOf(instanceNumber), setParam);
+ }
+ }
+ }
+ }
+ // Replace index with instance number and add in modify param list
+ if (!modifyParamList.isEmpty()) {
+ tr069modifyParamList.addAll(modifyParamList);
+ }
+ // Prepare add object param and add in set param list
+ if (null != addParam) {
+ addParam.setDataType("1");
+ tr069setParamList.add(addParam);
+ }
+ // Remove all processed set params from set param list
+ if (!removeParamList.isEmpty()) {
+ tr069setParamList.removeAll(removeParamList);
+ }
+
+ logger.debug("Persisting the NBI request for addObject");
+ List<TR069DeviceRPCRequestEntity> entityList =
+ deviceRPCRequestRepositoryHelper.findByDeviceIdAndOperationId(
+ deviceDetails.getDeviceId(), nbiDeviceOperationRequest.getOperationId());
+ List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =
+ TR069RequestProcessorUtility.convertToEntity(nbiDeviceOperationRequest);
+ for (int i = 0; i < entityList.size(); i++) {
+ tr069DeviceRPCRequestEntityList.get(i).setId(entityList.get(i).getId());
+ }
+ deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);
+
+ if (addParamExist) {
+ nextOperation = OperationOrder.ADD_OBJECT;
+ logger.debug(NXT_OPERATION, nextOperation);
+ } else {
+ nextOperation = OperationOrder.SET_PARAMETER_VALUE;
+ logger.debug(NXT_OPERATION, nextOperation);
+ }
+ } else {
+ nextOperation = OperationOrder.SET_PARAMETER_VALUE;
+ logger.debug(NXT_OPERATION, nextOperation);
+ }
+ } else if (opResponse instanceof SetParameterValueResponse) {
+ logger.debug("Received Set parameter value response");
+ isPendingOperationExists = false;
+ for (ParameterDTO setParam : tr069modifyParamList) {
+ if (Boolean.TRUE.equals(setParam.isInitiated())
+ && Boolean.FALSE.equals(setParam.isProcessed())) {
+ setParam.setInitiated(Boolean.FALSE);
+ setParam.setProcessed(Boolean.TRUE);
+ } else if (Boolean.FALSE.equals(setParam.isInitiated())
+ && Boolean.FALSE.equals(setParam.isProcessed())) {
+ isPendingOperationExists = true;
+ nextOperation = OperationOrder.SET_PARAMETER_VALUE;
+ }
+ }
+
+ updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);
+ logger.debug("Next operation to be executed is : {}", nextOperation);
+ }
+ }
+
+ if (isPendingOperationExists) {
+ boolean checkForNextoperation = true;
+ while (checkForNextoperation) {
+ switch (nextOperation) {
+ case DELETE_OBJECT:
+ if (null != tr069deleteParamList && !tr069deleteParamList.isEmpty()) {
+ logger.debug("Started executing delete object request");
+ checkForNextoperation = false;
+ DeviceRPCRequest clonedOpRequest = cloneNBIRequest(nbiDeviceOperationRequest);
+ List<ParameterDTO> deleteParamList = new ArrayList<>();
+ // Just take the first not processed delete object from the list
+ for (ParameterDTO deleteParam : tr069deleteParamList) {
+ if (!deleteParam.isProcessed()) {
+ deleteParamList.add(deleteParam);
+ break;
+ }
+ }
+ clonedOpRequest.setOpDetails(null);
+ OperationDetails opDetails = new OperationDetails();
+ opDetails.setOpCode(TR069OperationCode.DELETE_OBJECT);
+ opDetails.setParmeters(deleteParamList);
+ clonedOpRequest.setOpDetails(opDetails);
+ operRequest = clonedOpRequest;
+ } else {
+ nextOperation = OperationOrder.ADD_OBJECT;
+ logger.debug(NXT_OPERATION, nextOperation);
+ }
+ break;
+ case ADD_OBJECT:
+ if (null != tr069setParamList && !tr069setParamList.isEmpty()) {
+ logger.debug("Started executing Add object request");
+ checkForNextoperation = false;
+ DeviceRPCRequest clonedOpRequest = cloneNBIRequest(nbiDeviceOperationRequest);
+ List<ParameterDTO> addParamList = new ArrayList<>();
+ // Just take the first not processed delete object from the list
+ for (ParameterDTO addParam : tr069setParamList) {
+ if (!addParam.isProcessed()) {
+ String addParamMO = null;
+ final Matcher matcher =
+ Pattern.compile(NUMBER_REGEX).matcher(addParam.getParamName());
+ while (matcher.find()) {
+ addParamMO = addParam.getParamName().substring(0, matcher.start()) + ".";
+ }
+ if (null != addParamMO) {
+ addParamList.add(prepareParamDTO(addParamMO, null, addParam));
+ }
+ break;
+ }
+ }
+ clonedOpRequest.setOpDetails(null);
+ OperationDetails opDetails = new OperationDetails();
+ opDetails.setOpCode(TR069OperationCode.ADD_OBJECT);
+ opDetails.setParmeters(addParamList);
+ clonedOpRequest.setOpDetails(opDetails);
+ operRequest = clonedOpRequest;
+ } else {
+ nextOperation = OperationOrder.SET_PARAMETER_VALUE;
+ logger.debug(NXT_OPERATION, nextOperation);
+ }
+ break;
+ case SET_PARAMETER_VALUE:
+ checkForNextoperation = false;
+ if (null != tr069modifyParamList && !tr069modifyParamList.isEmpty()) {
+ logger.debug("Started executing SPV request");
+ DeviceRPCRequest clonedOpRequest = cloneNBIRequest(nbiDeviceOperationRequest);
+ clonedOpRequest.setOpDetails(null);
+ OperationDetails opDetails = new OperationDetails();
+ opDetails.setOpCode(TR069OperationCode.SET_PARAMETER_VALUES);
+ List<ParameterDTO> unprocessedParamList = new ArrayList<>();
+ ParameterDTO adminStateParam = null;
+ for (ParameterDTO paramDTO : tr069modifyParamList) {
+ if (!paramDTO.isProcessed()) {
+ if (isAdminStateExists(paramDTO)) {
+ adminStateParam = paramDTO;
+ } else {
+ unprocessedParamList.add(paramDTO);
+ }
+ }
+ }
+
+ if (null != adminStateParam && isAdminStateFalse(adminStateParam.getParamValue())) {
+ List<ParameterDTO> adminStateParamList = new ArrayList<>();
+ adminStateParam.setInitiated(Boolean.TRUE);
+ adminStateParamList.add(adminStateParam);
+ opDetails.setParmeters(adminStateParamList);
+ updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);
+ } else if (!unprocessedParamList.isEmpty()) {
+ setInititedFlagTrue(unprocessedParamList);
+ opDetails.setParmeters(unprocessedParamList);
+ updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);
+ } else if (null != adminStateParam
+ && isAdminStateTrue(adminStateParam.getParamValue())) {
+ List<ParameterDTO> paramList = new ArrayList<>();
+ adminStateParam.setInitiated(Boolean.TRUE);
+ paramList.add(adminStateParam);
+ opDetails.setParmeters(paramList);
+ updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);
+ } else {
+ isPendingOperationExists = false;
+ }
+
+ clonedOpRequest.setOpDetails(opDetails);
+ operRequest = clonedOpRequest;
+ } else {
+ isPendingOperationExists = false;
+ operRequest = null;
+ }
+ break;
+ default:
+ isPendingOperationExists = false;
+ operRequest = null;
+ }
+ }
+ }
+
+ if (!isPendingOperationExists) {
+ logger.debug(
+ "No pending operation exists, hence marking the operation as processed with id {} "
+ + "and sending GetParameterValueResponse for ConfigureMultipleObjects",
+ responseOperationId);
+ List<ParameterDTO> responseParamList = new ArrayList<>();
+
+ if (tr069deleteParamList != null) {
+ for (ParameterDTO delete : tr069deleteParamList) {
+ delete.setParamValue(SUCCESS);
+ delete.setDataType("2");
+ responseParamList.add(delete);
+ }
+ }
+
+ if (tr069modifyParamList != null) {
+ for (ParameterDTO modify : tr069modifyParamList) {
+ modify.setParamValue(SUCCESS);
+ modify.setDataType("4");
+ responseParamList.add(modify);
+ }
+ }
+
+ responseParamList.addAll(tr069setParamList);
+
+ OperationResponse operationResponse = new GetParameterValueResponse();
+ operationResponse.setParameterDTOs(responseParamList);
+ if (deviceRPCResponse != null) {
+ deviceRPCResponse.setDeviceDetails(deviceDetails);
+ deviceRPCResponse.setOperationResponse(operationResponse);
+ deviceRPCResponse.setOperationId(responseOperationId);
+ }
+
+ logger.debug(
+ "Prepared operation result for custom operation Configure Multiple Objects, hence marking as processed the corresponding NBI Operation request record");
+ deviceRPCRequestRepositoryHelper.markDeviceRPCRequestAsProcessed(deviceDetails.getDeviceId(),
+ responseOperationId);
+ }
+
+ customOperationData.setDeviceRPCResponse(deviceRPCResponse);
+ customOperationData.setDeviceRPCRequest(operRequest);
+ logger.debug("Finished processing Configure multiple object");
+ return customOperationData;
+ }
+
+
+ enum OperationOrder {
+
+ SET_PARAMETER_VALUE(null), ADD_OBJECT(SET_PARAMETER_VALUE), DELETE_OBJECT(ADD_OBJECT);
+
+ OperationOrder nextOperation;
+
+ OperationOrder(OperationOrder nextOperation) {
+ this.nextOperation = nextOperation;
+ }
+
+ public OperationOrder getNextOperation() {
+ return nextOperation;
+ }
+
+ }
+
+ private DeviceRPCRequest cloneNBIRequest(DeviceRPCRequest nbiDeviceOperationRequest) {
+ return new DeviceRPCRequest(nbiDeviceOperationRequest);
+ }
+
+ private ParameterDTO prepareParamDTO(String name, String value, ParameterDTO paramDTO) {
+ ParameterDTO parameterDTO = new ParameterDTO();
+ if (null != name) {
+ parameterDTO.setParamName(name);
+ } else {
+ parameterDTO.setParamName(paramDTO.getParamName());
+ }
+ if (null != value) {
+ parameterDTO.setParamValue(value);
+ } else {
+ parameterDTO.setParamValue(paramDTO.getParamValue());
+ }
+ parameterDTO.setDataType(paramDTO.getDataType());
+ parameterDTO.setProcessed(paramDTO.isProcessed());
+
+ return parameterDTO;
+ }
+
+ private boolean isAdminStateExists(ParameterDTO paramDTO) {
+ return (paramDTO.getParamName().contains(TR069RequestProcessorUtility.ADMIN_STATE)
+ || paramDTO.getParamName().contains(TR069RequestProcessorUtility.ADMIN_STATUS));
+ }
+
+ private void updateParamChangedFlagInDb(String deviceId,
+ DeviceRPCRequest nbiDeviceOperationRequest) throws TR069EventProcessingException {
+ List<TR069DeviceRPCRequestEntity> entityList = deviceRPCRequestRepositoryHelper
+ .findByDeviceIdAndOperationId(deviceId, nbiDeviceOperationRequest.getOperationId());
+ List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =
+ TR069RequestProcessorUtility.convertToEntity(nbiDeviceOperationRequest);
+ for (int i = 0; i < entityList.size(); i++) {
+ tr069DeviceRPCRequestEntityList.get(i).setId(entityList.get(i).getId());
+ }
+ deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);
+ }
+
+ private void setInititedFlagTrue(List<ParameterDTO> unprocessedParamList) {
+ for (ParameterDTO paramDTO : unprocessedParamList) {
+ paramDTO.setInitiated(Boolean.TRUE);
+ }
+ }
+
+ private boolean isAdminStateFalse(String adminState) {
+ return (null != adminState && (adminState.equalsIgnoreCase(Boolean.FALSE.toString())
+ || adminState.equalsIgnoreCase("0")));
+ }
+
+ private boolean isAdminStateTrue(String adminState) {
+ return (null != adminState && (adminState.equalsIgnoreCase(Boolean.TRUE.toString())
+ || adminState.equalsIgnoreCase("1")));
+ }
+
+}