--- /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
+\r
+package org.commscope.tr069adapter.acs.requestprocessor.util;\r
+\r
+import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.DEVICE_RPC_EXECUTION_TIMEOUT_SECONDS;\r
+\r
+import com.google.gson.Gson;\r
+import com.google.gson.reflect.TypeToken;\r
+\r
+import java.lang.reflect.Type;\r
+import java.util.ArrayList;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
+import org.commscope.tr069adapter.acs.common.OperationCode;\r
+import org.commscope.tr069adapter.acs.common.OperationDetails;\r
+import org.commscope.tr069adapter.acs.common.OperationOptions;\r
+import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+import org.commscope.tr069adapter.acs.common.dto.CustomOperationCode;\r
+import org.commscope.tr069adapter.acs.common.dto.ParameterAttributeDTO;\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.utils.ErrorCode;\r
+import org.commscope.tr069adapter.acs.requestprocessor.entity.TR069DeviceRPCRequestEntity;\r
+\r
+public class TR069RequestProcessorUtility {\r
+\r
+ protected static final int BLOCK_SIZE = 3999;\r
+ protected static final int MAX_SIZE = 11998;\r
+\r
+ private TR069RequestProcessorUtility() {\r
+ super();\r
+ }\r
+\r
+ /**\r
+ * Converts entity object to DTO\r
+ * \r
+ * @param entityList\r
+ * @return\r
+ */\r
+ public static DeviceRPCRequest convertToDTO(List<TR069DeviceRPCRequestEntity> entityList) {\r
+ DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
+ OperationDetails operationDetails = new TR069OperationDetails();\r
+\r
+ boolean isCustomOperation = true;\r
+ OperationCode opCode = null;\r
+\r
+ TR069DeviceRPCRequestEntity entity = entityList.get(0);\r
+ if (CustomOperationCode.getByOperationCode(entity.getOpCode()) != null) {\r
+ opCode = CustomOperationCode.getByOperationCode(entity.getOpCode());\r
+ } else {\r
+ opCode = TR069OperationCode.getByOperationCode(entity.getOpCode());\r
+ isCustomOperation = false;\r
+ }\r
+\r
+ operationDetails.setOpCode(opCode);\r
+ dtoFromEntityJson(operationDetails, entityList, isCustomOperation);\r
+ deviceRPCRequest.setOpDetails(operationDetails);\r
+\r
+ OperationOptions opOptions = new OperationOptions();\r
+ opOptions.setExecutionTimeout(entity.getRequestTimeOut());\r
+ deviceRPCRequest.setOptions(opOptions);\r
+\r
+ TR069DeviceDetails deviceDetails = new TR069DeviceDetails();\r
+ deviceDetails.setDeviceId(entity.getDeviceId());\r
+\r
+ deviceRPCRequest.setDeviceDetails(deviceDetails);\r
+ deviceRPCRequest.setOperationId(entity.getOperationId());\r
+ return deviceRPCRequest;\r
+ }\r
+\r
+ /**\r
+ * Converts DTO to entity object\r
+ * \r
+ * @param deviceRPCRequest\r
+ * @return\r
+ * @throws TR069EventProcessingException\r
+ */\r
+ public static List<TR069DeviceRPCRequestEntity> convertToEntity(DeviceRPCRequest deviceRPCRequest)\r
+ throws TR069EventProcessingException {\r
+\r
+ if (deviceRPCRequest.getOpDetails() == null\r
+ || deviceRPCRequest.getOpDetails().getOpCode() == null) {\r
+ throw new TR069EventProcessingException(ErrorCode.MISSING_OPERATION_DETAILS);\r
+ }\r
+\r
+ Integer opCode = null;\r
+ boolean isCustomOperation = true;\r
+ OperationCode operationCode = deviceRPCRequest.getOpDetails().getOpCode();\r
+ if (CustomOperationCode.getByOperationCode(operationCode.getOperationCode()) != null) {\r
+ CustomOperationCode customOperationCode =\r
+ CustomOperationCode.getByOperationCode(operationCode.getOperationCode());\r
+ opCode = customOperationCode.getOperationCode();\r
+ } else {\r
+ TR069OperationCode tr069OperationCode =\r
+ (TR069OperationCode) deviceRPCRequest.getOpDetails().getOpCode();\r
+ opCode = tr069OperationCode.getOperationCode();\r
+ isCustomOperation = false;\r
+ }\r
+\r
+ String paramListJSON = paramListToJson(deviceRPCRequest, isCustomOperation);\r
+ List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntities =\r
+ getTR069DeviceRPCRequestEntities(paramListJSON);\r
+\r
+ for (TR069DeviceRPCRequestEntity entity : tr069DeviceRPCRequestEntities) {\r
+ entity.setOpCode(opCode);\r
+ entity.setCreateTime(new Date());\r
+ entity.setDeviceId(deviceRPCRequest.getDeviceDetails().getDeviceId());\r
+ entity.setOperationId(deviceRPCRequest.getOperationId());\r
+ entity.setIsProcessed(0);\r
+ if (deviceRPCRequest.getOptions() != null\r
+ && deviceRPCRequest.getOptions().getExecutionTimeout() != 0L) {\r
+ entity.setRequestTimeOut(deviceRPCRequest.getOptions().getExecutionTimeout());\r
+ } else {\r
+ entity.setRequestTimeOut(DEVICE_RPC_EXECUTION_TIMEOUT_SECONDS);\r
+ OperationOptions options = new OperationOptions();\r
+ options.setExecutionTimeout(DEVICE_RPC_EXECUTION_TIMEOUT_SECONDS);\r
+ deviceRPCRequest.setOptions(options);\r
+ }\r
+ }\r
+\r
+ return tr069DeviceRPCRequestEntities;\r
+ }\r
+\r
+ /**\r
+ * @param entity\r
+ * @param dto\r
+ * @param isCustomOperation\r
+ */\r
+ private static String paramListToJson(DeviceRPCRequest dto, boolean isCustomOperation) {\r
+ String attrJsonString = null;\r
+ if (isCustomOperation) {\r
+ TR069OperationDetails operationDetails = (TR069OperationDetails) dto.getOpDetails();\r
+ StringBuilder buffer = new StringBuilder();\r
+\r
+ List<ParameterDTO> deletParamList = operationDetails.getDeleteParamList();\r
+ List<ParameterDTO> modifyParamList = operationDetails.getModifyParamList();\r
+ List<ParameterDTO> setParamList = operationDetails.getSetParamList();\r
+\r
+ if (deletParamList != null && !deletParamList.isEmpty()) {\r
+ convertBooleanValues(deletParamList);\r
+ buffer.append(toJson(deletParamList));\r
+ } else {\r
+ buffer.append(toJson(new ArrayList<>()));\r
+ }\r
+\r
+ if (modifyParamList != null && !modifyParamList.isEmpty()) {\r
+ convertBooleanValues(modifyParamList);\r
+ buffer.append(toJson(modifyParamList));\r
+ } else {\r
+ buffer.append(toJson(new ArrayList<>()));\r
+ }\r
+\r
+ if (setParamList != null && !setParamList.isEmpty()) {\r
+ convertBooleanValues(setParamList);\r
+ buffer.append(toJson(setParamList));\r
+ } else {\r
+ buffer.append(toJson(new ArrayList<>()));\r
+ }\r
+\r
+ attrJsonString = buffer.toString();\r
+ } else {\r
+ List<ParameterDTO> parameterDTOs = dto.getOpDetails().getParmeters();\r
+ attrJsonString = toJson(parameterDTOs);\r
+ }\r
+\r
+ return attrJsonString;\r
+ }\r
+\r
+ /**\r
+ * @param paramListJSON\r
+ * @return\r
+ */\r
+ private static List<TR069DeviceRPCRequestEntity> getTR069DeviceRPCRequestEntities(\r
+ String paramListJSON) {\r
+ List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntities = new ArrayList<>();\r
+\r
+ if (paramListJSON.length() < MAX_SIZE) {\r
+ TR069DeviceRPCRequestEntity entity = new TR069DeviceRPCRequestEntity();\r
+ entity.setAttributeJson1(getAttriuteJsonData(paramListJSON, 0));\r
+ entity.setAttributeJson2(getAttriuteJsonData(paramListJSON, 1));\r
+ entity.setAttributeJson3(getAttriuteJsonData(paramListJSON, 2));\r
+\r
+ tr069DeviceRPCRequestEntities.add(entity);\r
+ } else {\r
+ int noOfEntities = 0;\r
+ while (true) {\r
+ int i = 3 * noOfEntities;\r
+ TR069DeviceRPCRequestEntity entity = new TR069DeviceRPCRequestEntity();\r
+ entity.setAttributeJson1(getAttriuteJsonData(paramListJSON, i));\r
+ entity.setAttributeJson2(getAttriuteJsonData(paramListJSON, ++i));\r
+ entity.setAttributeJson3(getAttriuteJsonData(paramListJSON, ++i));\r
+\r
+ if (entity.getAttributeJson1() != null) {\r
+ tr069DeviceRPCRequestEntities.add(entity);\r
+ }\r
+\r
+ if (entity.getAttributeJson1() == null || entity.getAttributeJson2() == null\r
+ || entity.getAttributeJson3() == null) {\r
+ break;\r
+ }\r
+\r
+ noOfEntities++;\r
+ }\r
+\r
+ }\r
+ return tr069DeviceRPCRequestEntities;\r
+ }\r
+\r
+ /**\r
+ * @param eventData\r
+ * @param blockNum\r
+ * @return\r
+ */\r
+ private static String getAttriuteJsonData(String eventData, int blockNum) {\r
+ int eventDataSize = eventData.length();\r
+ int startIndex = blockNum * BLOCK_SIZE;\r
+ if (startIndex > eventDataSize) {\r
+ return null;\r
+ }\r
+ int endIndex = startIndex + BLOCK_SIZE;\r
+ endIndex = endIndex < eventDataSize ? endIndex : eventDataSize;\r
+ return eventData.substring(startIndex, endIndex);\r
+ }\r
+\r
+ /**\r
+ * @param opDetails\r
+ * @param entity\r
+ * @param isCustomOperation\r
+ */\r
+ private static void dtoFromEntityJson(OperationDetails opDetails,\r
+ List<TR069DeviceRPCRequestEntity> entityList, boolean isCustomOperation) {\r
+ StringBuilder sb = new StringBuilder();\r
+ for (TR069DeviceRPCRequestEntity entity : entityList) {\r
+ append(sb, entity.getAttributeJson1());\r
+ append(sb, entity.getAttributeJson2());\r
+ append(sb, entity.getAttributeJson3());\r
+ }\r
+\r
+ if (isCustomOperation) {\r
+ String[] splitStringArray = sb.toString().split("]\\[");\r
+ List<ParameterDTO> deleteParamList = new ArrayList<>();\r
+ List<ParameterDTO> modifyParamList = new ArrayList<>();\r
+ List<ParameterDTO> setParamList = new ArrayList<>();\r
+ for (int i = 0; i < splitStringArray.length; i++) {\r
+ String data = splitStringArray[i];\r
+ if (i == 0) {\r
+ data = data + "]";\r
+ deleteParamList.addAll(fromJson(data));\r
+ } else if ((i + 1) == splitStringArray.length) {\r
+ data = "[" + data;\r
+ setParamList.addAll(fromJson(data));\r
+ } else {\r
+ data = "[" + data + "]";\r
+ modifyParamList.addAll(fromJson(data));\r
+ }\r
+ }\r
+ TR069OperationDetails tr069OperationDetails = (TR069OperationDetails) opDetails;\r
+ tr069OperationDetails.setDeleteParamList(deleteParamList);\r
+ tr069OperationDetails.setModifyParamList(modifyParamList);\r
+ tr069OperationDetails.setSetParamList(setParamList);\r
+ } else {\r
+ if (TR069OperationCode.SET_PARAMETER_ATTRIBUTES.equals(opDetails.getOpCode())) {\r
+ List<ParameterDTO> list = fromJsonToParameterAttribute(sb.toString());\r
+ opDetails.setParmeters(list);\r
+ } else {\r
+ List<ParameterDTO> list = fromJson(sb.toString());\r
+ opDetails.setParmeters(list);\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @param sb\r
+ * @param temp\r
+ */\r
+ private static void append(StringBuilder sb, String temp) {\r
+ if (temp != null && !temp.isEmpty()) {\r
+ sb.append(temp);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @param jsonString\r
+ * @return\r
+ */\r
+ private static List<ParameterDTO> fromJson(String jsonString) {\r
+ Gson gson = new Gson();\r
+ Type collectionType = new TypeToken<List<ParameterDTO>>() {}.getType();\r
+ return gson.fromJson(jsonString, collectionType);\r
+ }\r
+\r
+ /**\r
+ * @param jsonString\r
+ * @return\r
+ */\r
+ private static List<ParameterDTO> fromJsonToParameterAttribute(String jsonString) {\r
+ Gson gson = new Gson();\r
+ Type collectionType = new TypeToken<List<ParameterAttributeDTO>>() {}.getType();\r
+ return gson.fromJson(jsonString, collectionType);\r
+ }\r
+\r
+ /**\r
+ * @param entity\r
+ * @return\r
+ */\r
+ private static <T> String toJson(T entity) {\r
+ Gson gson = new Gson();\r
+ return gson.toJson(entity);\r
+ }\r
+\r
+ /**\r
+ * @param parameterDTOs\r
+ */\r
+ private static void convertBooleanValues(List<ParameterDTO> parameterDTOs) {\r
+ for (ParameterDTO param : parameterDTOs) {\r
+ if (param.getDataType() != null && param.getDataType().equalsIgnoreCase("boolean")) {\r
+ if (param.getParamValue() != null && (param.getParamValue().equalsIgnoreCase("true")\r
+ || param.getParamValue().equalsIgnoreCase("1"))) {\r
+ param.setParamValue("1");\r
+ } else {\r
+ param.setParamValue("0");\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+}\r