VES Heartbeat and Software Management Feature
[oam/tr069-adapter.git] / acs / requestprocessor / src / main / java / org / commscope / tr069adapter / acs / requestprocessor / util / TR069RequestProcessorUtility.java
1 /*\r
2  * ============LICENSE_START========================================================================\r
3  * ONAP : tr-069-adapter\r
4  * =================================================================================================\r
5  * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
6  * =================================================================================================\r
7  * This tr-069-adapter software file is distributed by CommScope Inc under the Apache License,\r
8  * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You\r
9  * may obtain a copy of the License at\r
10  *\r
11  * http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\r
14  * either express or implied. See the License for the specific language governing permissions and\r
15  * limitations under the License.\r
16  * ===============LICENSE_END=======================================================================\r
17  */\r
18 \r
19 \r
20 package org.commscope.tr069adapter.acs.requestprocessor.util;\r
21 \r
22 import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.DEVICE_RPC_EXECUTION_TIMEOUT_SECONDS;\r
23 \r
24 import com.google.gson.Gson;\r
25 import com.google.gson.reflect.TypeToken;\r
26 \r
27 import java.lang.reflect.Type;\r
28 import java.util.ArrayList;\r
29 import java.util.Date;\r
30 import java.util.List;\r
31 \r
32 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
33 import org.commscope.tr069adapter.acs.common.OperationCode;\r
34 import org.commscope.tr069adapter.acs.common.OperationDetails;\r
35 import org.commscope.tr069adapter.acs.common.OperationOptions;\r
36 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
37 import org.commscope.tr069adapter.acs.common.dto.CustomOperationCode;\r
38 import org.commscope.tr069adapter.acs.common.dto.ParameterAttributeDTO;\r
39 import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
40 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
41 import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
42 import org.commscope.tr069adapter.acs.common.exception.TR069EventProcessingException;\r
43 import org.commscope.tr069adapter.acs.common.utils.ErrorCode;\r
44 import org.commscope.tr069adapter.acs.requestprocessor.entity.TR069DeviceRPCRequestEntity;\r
45 \r
46 public class TR069RequestProcessorUtility {\r
47 \r
48   protected static final int BLOCK_SIZE = 3999;\r
49   protected static final int MAX_SIZE = 11998;\r
50   public static final int DEVICE_REACHABLE_STATUS_CODE = 100;\r
51 \r
52 \r
53   private TR069RequestProcessorUtility() {\r
54     super();\r
55   }\r
56 \r
57   /**\r
58    * Converts entity object to DTO\r
59    * \r
60    * @param entityList\r
61    * @return\r
62    */\r
63   public static DeviceRPCRequest convertToDTO(List<TR069DeviceRPCRequestEntity> entityList) {\r
64     DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
65     OperationDetails operationDetails = new TR069OperationDetails();\r
66 \r
67     boolean isCustomOperation = true;\r
68     OperationCode opCode = null;\r
69 \r
70     TR069DeviceRPCRequestEntity entity = entityList.get(0);\r
71     if (CustomOperationCode.getByOperationCode(entity.getOpCode()) != null) {\r
72       opCode = CustomOperationCode.getByOperationCode(entity.getOpCode());\r
73     } else {\r
74       opCode = TR069OperationCode.getByOperationCode(entity.getOpCode());\r
75       isCustomOperation = false;\r
76     }\r
77 \r
78     operationDetails.setOpCode(opCode);\r
79     dtoFromEntityJson(operationDetails, entityList, isCustomOperation);\r
80     deviceRPCRequest.setOpDetails(operationDetails);\r
81 \r
82     OperationOptions opOptions = new OperationOptions();\r
83     opOptions.setExecutionTimeout(entity.getRequestTimeOut());\r
84     deviceRPCRequest.setOptions(opOptions);\r
85 \r
86     TR069DeviceDetails deviceDetails = new TR069DeviceDetails();\r
87     deviceDetails.setDeviceId(entity.getDeviceId());\r
88 \r
89     deviceRPCRequest.setDeviceDetails(deviceDetails);\r
90     deviceRPCRequest.setOperationId(entity.getOperationId());\r
91     return deviceRPCRequest;\r
92   }\r
93 \r
94   /**\r
95    * Converts DTO to entity object\r
96    * \r
97    * @param deviceRPCRequest\r
98    * @return\r
99    * @throws TR069EventProcessingException\r
100    */\r
101   public static List<TR069DeviceRPCRequestEntity> convertToEntity(DeviceRPCRequest deviceRPCRequest)\r
102       throws TR069EventProcessingException {\r
103 \r
104     if (deviceRPCRequest.getOpDetails() == null\r
105         || deviceRPCRequest.getOpDetails().getOpCode() == null) {\r
106       throw new TR069EventProcessingException(ErrorCode.MISSING_OPERATION_DETAILS);\r
107     }\r
108 \r
109     Integer opCode = null;\r
110     boolean isCustomOperation = true;\r
111     OperationCode operationCode = deviceRPCRequest.getOpDetails().getOpCode();\r
112     if (CustomOperationCode.getByOperationCode(operationCode.getOperationCode()) != null) {\r
113       CustomOperationCode customOperationCode =\r
114           CustomOperationCode.getByOperationCode(operationCode.getOperationCode());\r
115       opCode = customOperationCode.getOperationCode();\r
116     } else {\r
117       TR069OperationCode tr069OperationCode =\r
118           (TR069OperationCode) deviceRPCRequest.getOpDetails().getOpCode();\r
119       opCode = tr069OperationCode.getOperationCode();\r
120       isCustomOperation = false;\r
121     }\r
122 \r
123     String paramListJSON = paramListToJson(deviceRPCRequest, isCustomOperation);\r
124     List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntities =\r
125         getTR069DeviceRPCRequestEntities(paramListJSON);\r
126 \r
127     for (TR069DeviceRPCRequestEntity entity : tr069DeviceRPCRequestEntities) {\r
128       entity.setOpCode(opCode);\r
129       entity.setCreateTime(new Date());\r
130       entity.setDeviceId(deviceRPCRequest.getDeviceDetails().getDeviceId());\r
131       entity.setOperationId(deviceRPCRequest.getOperationId());\r
132       entity.setIsProcessed(0);\r
133       if (deviceRPCRequest.getOptions() != null\r
134           && deviceRPCRequest.getOptions().getExecutionTimeout() != 0L) {\r
135         entity.setRequestTimeOut(deviceRPCRequest.getOptions().getExecutionTimeout());\r
136       } else {\r
137         entity.setRequestTimeOut(DEVICE_RPC_EXECUTION_TIMEOUT_SECONDS);\r
138         OperationOptions options = new OperationOptions();\r
139         options.setExecutionTimeout(DEVICE_RPC_EXECUTION_TIMEOUT_SECONDS);\r
140         deviceRPCRequest.setOptions(options);\r
141       }\r
142     }\r
143 \r
144     return tr069DeviceRPCRequestEntities;\r
145   }\r
146 \r
147   /**\r
148    * @param entity\r
149    * @param dto\r
150    * @param isCustomOperation\r
151    */\r
152   private static String paramListToJson(DeviceRPCRequest dto, boolean isCustomOperation) {\r
153     String attrJsonString = null;\r
154     if (isCustomOperation) {\r
155       TR069OperationDetails operationDetails = (TR069OperationDetails) dto.getOpDetails();\r
156       StringBuilder buffer = new StringBuilder();\r
157 \r
158       List<ParameterDTO> deletParamList = operationDetails.getDeleteParamList();\r
159       List<ParameterDTO> modifyParamList = operationDetails.getModifyParamList();\r
160       List<ParameterDTO> setParamList = operationDetails.getSetParamList();\r
161 \r
162       if (deletParamList != null && !deletParamList.isEmpty()) {\r
163         convertBooleanValues(deletParamList);\r
164         buffer.append(toJson(deletParamList));\r
165       } else {\r
166         buffer.append(toJson(new ArrayList<>()));\r
167       }\r
168 \r
169       if (modifyParamList != null && !modifyParamList.isEmpty()) {\r
170         convertBooleanValues(modifyParamList);\r
171         buffer.append(toJson(modifyParamList));\r
172       } else {\r
173         buffer.append(toJson(new ArrayList<>()));\r
174       }\r
175 \r
176       if (setParamList != null && !setParamList.isEmpty()) {\r
177         convertBooleanValues(setParamList);\r
178         buffer.append(toJson(setParamList));\r
179       } else {\r
180         buffer.append(toJson(new ArrayList<>()));\r
181       }\r
182 \r
183       attrJsonString = buffer.toString();\r
184     } else {\r
185       List<ParameterDTO> parameterDTOs = dto.getOpDetails().getParmeters();\r
186       attrJsonString = toJson(parameterDTOs);\r
187     }\r
188 \r
189     return attrJsonString;\r
190   }\r
191 \r
192   /**\r
193    * @param paramListJSON\r
194    * @return\r
195    */\r
196   private static List<TR069DeviceRPCRequestEntity> getTR069DeviceRPCRequestEntities(\r
197       String paramListJSON) {\r
198     List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntities = new ArrayList<>();\r
199 \r
200     if (paramListJSON.length() < MAX_SIZE) {\r
201       TR069DeviceRPCRequestEntity entity = new TR069DeviceRPCRequestEntity();\r
202       entity.setAttributeJson1(getAttriuteJsonData(paramListJSON, 0));\r
203       entity.setAttributeJson2(getAttriuteJsonData(paramListJSON, 1));\r
204       entity.setAttributeJson3(getAttriuteJsonData(paramListJSON, 2));\r
205 \r
206       tr069DeviceRPCRequestEntities.add(entity);\r
207     } else {\r
208       int noOfEntities = 0;\r
209       while (true) {\r
210         int i = 3 * noOfEntities;\r
211         TR069DeviceRPCRequestEntity entity = new TR069DeviceRPCRequestEntity();\r
212         entity.setAttributeJson1(getAttriuteJsonData(paramListJSON, i));\r
213         entity.setAttributeJson2(getAttriuteJsonData(paramListJSON, ++i));\r
214         entity.setAttributeJson3(getAttriuteJsonData(paramListJSON, ++i));\r
215 \r
216         if (entity.getAttributeJson1() != null) {\r
217           tr069DeviceRPCRequestEntities.add(entity);\r
218         }\r
219 \r
220         if (entity.getAttributeJson1() == null || entity.getAttributeJson2() == null\r
221             || entity.getAttributeJson3() == null) {\r
222           break;\r
223         }\r
224 \r
225         noOfEntities++;\r
226       }\r
227 \r
228     }\r
229     return tr069DeviceRPCRequestEntities;\r
230   }\r
231 \r
232   /**\r
233    * @param eventData\r
234    * @param blockNum\r
235    * @return\r
236    */\r
237   private static String getAttriuteJsonData(String eventData, int blockNum) {\r
238     int eventDataSize = eventData.length();\r
239     int startIndex = blockNum * BLOCK_SIZE;\r
240     if (startIndex > eventDataSize) {\r
241       return null;\r
242     }\r
243     int endIndex = startIndex + BLOCK_SIZE;\r
244     endIndex = endIndex < eventDataSize ? endIndex : eventDataSize;\r
245     return eventData.substring(startIndex, endIndex);\r
246   }\r
247 \r
248   /**\r
249    * @param opDetails\r
250    * @param entity\r
251    * @param isCustomOperation\r
252    */\r
253   private static void dtoFromEntityJson(OperationDetails opDetails,\r
254       List<TR069DeviceRPCRequestEntity> entityList, boolean isCustomOperation) {\r
255     StringBuilder sb = new StringBuilder();\r
256     for (TR069DeviceRPCRequestEntity entity : entityList) {\r
257       append(sb, entity.getAttributeJson1());\r
258       append(sb, entity.getAttributeJson2());\r
259       append(sb, entity.getAttributeJson3());\r
260     }\r
261 \r
262     if (isCustomOperation) {\r
263       String[] splitStringArray = sb.toString().split("]\\[");\r
264       List<ParameterDTO> deleteParamList = new ArrayList<>();\r
265       List<ParameterDTO> modifyParamList = new ArrayList<>();\r
266       List<ParameterDTO> setParamList = new ArrayList<>();\r
267       for (int i = 0; i < splitStringArray.length; i++) {\r
268         String data = splitStringArray[i];\r
269         if (i == 0) {\r
270           data = data + "]";\r
271           deleteParamList.addAll(fromJson(data));\r
272         } else if ((i + 1) == splitStringArray.length) {\r
273           data = "[" + data;\r
274           setParamList.addAll(fromJson(data));\r
275         } else {\r
276           data = "[" + data + "]";\r
277           modifyParamList.addAll(fromJson(data));\r
278         }\r
279       }\r
280       TR069OperationDetails tr069OperationDetails = (TR069OperationDetails) opDetails;\r
281       tr069OperationDetails.setDeleteParamList(deleteParamList);\r
282       tr069OperationDetails.setModifyParamList(modifyParamList);\r
283       tr069OperationDetails.setSetParamList(setParamList);\r
284     } else {\r
285       if (TR069OperationCode.SET_PARAMETER_ATTRIBUTES.equals(opDetails.getOpCode())) {\r
286         List<ParameterDTO> list = fromJsonToParameterAttribute(sb.toString());\r
287         opDetails.setParmeters(list);\r
288       } else {\r
289         List<ParameterDTO> list = fromJson(sb.toString());\r
290         opDetails.setParmeters(list);\r
291       }\r
292     }\r
293   }\r
294 \r
295   /**\r
296    * @param sb\r
297    * @param temp\r
298    */\r
299   private static void append(StringBuilder sb, String temp) {\r
300     if (temp != null && !temp.isEmpty()) {\r
301       sb.append(temp);\r
302     }\r
303   }\r
304 \r
305   /**\r
306    * @param jsonString\r
307    * @return\r
308    */\r
309   private static List<ParameterDTO> fromJson(String jsonString) {\r
310     Gson gson = new Gson();\r
311     Type collectionType = new TypeToken<List<ParameterDTO>>() {}.getType();\r
312     return gson.fromJson(jsonString, collectionType);\r
313   }\r
314 \r
315   /**\r
316    * @param jsonString\r
317    * @return\r
318    */\r
319   private static List<ParameterDTO> fromJsonToParameterAttribute(String jsonString) {\r
320     Gson gson = new Gson();\r
321     Type collectionType = new TypeToken<List<ParameterAttributeDTO>>() {}.getType();\r
322     return gson.fromJson(jsonString, collectionType);\r
323   }\r
324 \r
325   /**\r
326    * @param entity\r
327    * @return\r
328    */\r
329   private static <T> String toJson(T entity) {\r
330     Gson gson = new Gson();\r
331     return gson.toJson(entity);\r
332   }\r
333 \r
334   /**\r
335    * @param parameterDTOs\r
336    */\r
337   private static void convertBooleanValues(List<ParameterDTO> parameterDTOs) {\r
338     for (ParameterDTO param : parameterDTOs) {\r
339       if (param.getDataType() != null && param.getDataType().equalsIgnoreCase("boolean")) {\r
340         if (param.getParamValue() != null && (param.getParamValue().equalsIgnoreCase("true")\r
341             || param.getParamValue().equalsIgnoreCase("1"))) {\r
342           param.setParamValue("1");\r
343         } else {\r
344           param.setParamValue("0");\r
345         }\r
346       }\r
347     }\r
348   }\r
349 \r
350 }\r