Initial source code
[oam/tr069-adapter.git] / acs / requestprocessor / src / main / java / org / commscope / tr069adapter / acs / requestprocessor / util / TR069RequestProcessorUtility.java
diff --git a/acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/util/TR069RequestProcessorUtility.java b/acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/util/TR069RequestProcessorUtility.java
new file mode 100644 (file)
index 0000000..3c80090
--- /dev/null
@@ -0,0 +1,348 @@
+/*\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