1ce4a44a54b38d05a5af0c67e10762b31c8d0d75
[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   public static final String ADMIN_STATE = "FAPControl.LTE.AdminState";\r
52   public static final String ADMIN_STATUS = "FAPControl.LTE.AdminStatus";\r
53 \r
54 \r
55   private TR069RequestProcessorUtility() {\r
56     super();\r
57   }\r
58 \r
59   /**\r
60    * Converts entity object to DTO\r
61    * \r
62    * @param entityList\r
63    * @return\r
64    */\r
65   public static DeviceRPCRequest convertToDTO(List<TR069DeviceRPCRequestEntity> entityList) {\r
66     DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
67     OperationDetails operationDetails = new TR069OperationDetails();\r
68 \r
69     boolean isCustomOperation = true;\r
70     OperationCode opCode = null;\r
71 \r
72     TR069DeviceRPCRequestEntity entity = entityList.get(0);\r
73     if (CustomOperationCode.getByOperationCode(entity.getOpCode()) != null) {\r
74       opCode = CustomOperationCode.getByOperationCode(entity.getOpCode());\r
75     } else {\r
76       opCode = TR069OperationCode.getByOperationCode(entity.getOpCode());\r
77       isCustomOperation = false;\r
78     }\r
79 \r
80     operationDetails.setOpCode(opCode);\r
81     dtoFromEntityJson(operationDetails, entityList, isCustomOperation);\r
82     deviceRPCRequest.setOpDetails(operationDetails);\r
83 \r
84     OperationOptions opOptions = new OperationOptions();\r
85     opOptions.setExecutionTimeout(entity.getRequestTimeOut());\r
86     deviceRPCRequest.setOptions(opOptions);\r
87 \r
88     TR069DeviceDetails deviceDetails = new TR069DeviceDetails();\r
89     deviceDetails.setDeviceId(entity.getDeviceId());\r
90 \r
91     deviceRPCRequest.setDeviceDetails(deviceDetails);\r
92     deviceRPCRequest.setOperationId(entity.getOperationId());\r
93     return deviceRPCRequest;\r
94   }\r
95 \r
96   /**\r
97    * Converts DTO to entity object\r
98    * \r
99    * @param deviceRPCRequest\r
100    * @return\r
101    * @throws TR069EventProcessingException\r
102    */\r
103   public static List<TR069DeviceRPCRequestEntity> convertToEntity(DeviceRPCRequest deviceRPCRequest)\r
104       throws TR069EventProcessingException {\r
105 \r
106     if (deviceRPCRequest.getOpDetails() == null\r
107         || deviceRPCRequest.getOpDetails().getOpCode() == null) {\r
108       throw new TR069EventProcessingException(ErrorCode.MISSING_OPERATION_DETAILS);\r
109     }\r
110 \r
111     Integer opCode = null;\r
112     boolean isCustomOperation = true;\r
113     OperationCode operationCode = deviceRPCRequest.getOpDetails().getOpCode();\r
114     if (CustomOperationCode.getByOperationCode(operationCode.getOperationCode()) != null) {\r
115       CustomOperationCode customOperationCode =\r
116           CustomOperationCode.getByOperationCode(operationCode.getOperationCode());\r
117       opCode = customOperationCode.getOperationCode();\r
118     } else {\r
119       TR069OperationCode tr069OperationCode =\r
120           (TR069OperationCode) deviceRPCRequest.getOpDetails().getOpCode();\r
121       opCode = tr069OperationCode.getOperationCode();\r
122       isCustomOperation = false;\r
123     }\r
124 \r
125     String paramListJSON = paramListToJson(deviceRPCRequest, isCustomOperation);\r
126     List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntities =\r
127         getTR069DeviceRPCRequestEntities(paramListJSON);\r
128 \r
129     for (TR069DeviceRPCRequestEntity entity : tr069DeviceRPCRequestEntities) {\r
130       entity.setOpCode(opCode);\r
131       entity.setCreateTime(new Date());\r
132       entity.setDeviceId(deviceRPCRequest.getDeviceDetails().getDeviceId());\r
133       entity.setOperationId(deviceRPCRequest.getOperationId());\r
134       entity.setIsProcessed(0);\r
135       if (deviceRPCRequest.getOptions() != null\r
136           && deviceRPCRequest.getOptions().getExecutionTimeout() != 0L) {\r
137         entity.setRequestTimeOut(deviceRPCRequest.getOptions().getExecutionTimeout());\r
138       } else {\r
139         entity.setRequestTimeOut(DEVICE_RPC_EXECUTION_TIMEOUT_SECONDS);\r
140         OperationOptions options = new OperationOptions();\r
141         options.setExecutionTimeout(DEVICE_RPC_EXECUTION_TIMEOUT_SECONDS);\r
142         deviceRPCRequest.setOptions(options);\r
143       }\r
144     }\r
145 \r
146     return tr069DeviceRPCRequestEntities;\r
147   }\r
148 \r
149   /**\r
150    * @param entity\r
151    * @param dto\r
152    * @param isCustomOperation\r
153    */\r
154   private static String paramListToJson(DeviceRPCRequest dto, boolean isCustomOperation) {\r
155     String attrJsonString = null;\r
156     if (isCustomOperation) {\r
157       TR069OperationDetails operationDetails = (TR069OperationDetails) dto.getOpDetails();\r
158       StringBuilder buffer = new StringBuilder();\r
159 \r
160       List<ParameterDTO> deletParamList = operationDetails.getDeleteParamList();\r
161       List<ParameterDTO> modifyParamList = operationDetails.getModifyParamList();\r
162       List<ParameterDTO> setParamList = operationDetails.getSetParamList();\r
163 \r
164       if (deletParamList != null && !deletParamList.isEmpty()) {\r
165         convertBooleanValues(deletParamList);\r
166         buffer.append(toJson(deletParamList));\r
167       } else {\r
168         buffer.append(toJson(new ArrayList<>()));\r
169       }\r
170 \r
171       if (modifyParamList != null && !modifyParamList.isEmpty()) {\r
172         convertBooleanValues(modifyParamList);\r
173         buffer.append(toJson(modifyParamList));\r
174       } else {\r
175         buffer.append(toJson(new ArrayList<>()));\r
176       }\r
177 \r
178       if (setParamList != null && !setParamList.isEmpty()) {\r
179         convertBooleanValues(setParamList);\r
180         buffer.append(toJson(setParamList));\r
181       } else {\r
182         buffer.append(toJson(new ArrayList<>()));\r
183       }\r
184 \r
185       attrJsonString = buffer.toString();\r
186     } else {\r
187       List<ParameterDTO> parameterDTOs = dto.getOpDetails().getParmeters();\r
188       attrJsonString = toJson(parameterDTOs);\r
189     }\r
190 \r
191     return attrJsonString;\r
192   }\r
193 \r
194   /**\r
195    * @param paramListJSON\r
196    * @return\r
197    */\r
198   private static List<TR069DeviceRPCRequestEntity> getTR069DeviceRPCRequestEntities(\r
199       String paramListJSON) {\r
200     List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntities = new ArrayList<>();\r
201 \r
202     if (paramListJSON.length() < MAX_SIZE) {\r
203       TR069DeviceRPCRequestEntity entity = new TR069DeviceRPCRequestEntity();\r
204       entity.setAttributeJson1(getAttriuteJsonData(paramListJSON, 0));\r
205       entity.setAttributeJson2(getAttriuteJsonData(paramListJSON, 1));\r
206       entity.setAttributeJson3(getAttriuteJsonData(paramListJSON, 2));\r
207 \r
208       tr069DeviceRPCRequestEntities.add(entity);\r
209     } else {\r
210       int noOfEntities = 0;\r
211       while (true) {\r
212         int i = 3 * noOfEntities;\r
213         TR069DeviceRPCRequestEntity entity = new TR069DeviceRPCRequestEntity();\r
214         entity.setAttributeJson1(getAttriuteJsonData(paramListJSON, i));\r
215         entity.setAttributeJson2(getAttriuteJsonData(paramListJSON, ++i));\r
216         entity.setAttributeJson3(getAttriuteJsonData(paramListJSON, ++i));\r
217 \r
218         if (entity.getAttributeJson1() != null) {\r
219           tr069DeviceRPCRequestEntities.add(entity);\r
220         }\r
221 \r
222         if (entity.getAttributeJson1() == null || entity.getAttributeJson2() == null\r
223             || entity.getAttributeJson3() == null) {\r
224           break;\r
225         }\r
226 \r
227         noOfEntities++;\r
228       }\r
229 \r
230     }\r
231     return tr069DeviceRPCRequestEntities;\r
232   }\r
233 \r
234   /**\r
235    * @param eventData\r
236    * @param blockNum\r
237    * @return\r
238    */\r
239   private static String getAttriuteJsonData(String eventData, int blockNum) {\r
240     int eventDataSize = eventData.length();\r
241     int startIndex = blockNum * BLOCK_SIZE;\r
242     if (startIndex > eventDataSize) {\r
243       return null;\r
244     }\r
245     int endIndex = startIndex + BLOCK_SIZE;\r
246     endIndex = endIndex < eventDataSize ? endIndex : eventDataSize;\r
247     return eventData.substring(startIndex, endIndex);\r
248   }\r
249 \r
250   /**\r
251    * @param opDetails\r
252    * @param entity\r
253    * @param isCustomOperation\r
254    */\r
255   private static void dtoFromEntityJson(OperationDetails opDetails,\r
256       List<TR069DeviceRPCRequestEntity> entityList, boolean isCustomOperation) {\r
257     StringBuilder sb = new StringBuilder();\r
258     for (TR069DeviceRPCRequestEntity entity : entityList) {\r
259       append(sb, entity.getAttributeJson1());\r
260       append(sb, entity.getAttributeJson2());\r
261       append(sb, entity.getAttributeJson3());\r
262     }\r
263 \r
264     if (isCustomOperation) {\r
265       String[] splitStringArray = sb.toString().split("]\\[");\r
266       List<ParameterDTO> deleteParamList = new ArrayList<>();\r
267       List<ParameterDTO> modifyParamList = new ArrayList<>();\r
268       List<ParameterDTO> setParamList = new ArrayList<>();\r
269       for (int i = 0; i < splitStringArray.length; i++) {\r
270         String data = splitStringArray[i];\r
271         if (i == 0) {\r
272           data = data + "]";\r
273           deleteParamList.addAll(fromJson(data));\r
274         } else if ((i + 1) == splitStringArray.length) {\r
275           data = "[" + data;\r
276           setParamList.addAll(fromJson(data));\r
277         } else {\r
278           data = "[" + data + "]";\r
279           modifyParamList.addAll(fromJson(data));\r
280         }\r
281       }\r
282       TR069OperationDetails tr069OperationDetails = (TR069OperationDetails) opDetails;\r
283       tr069OperationDetails.setDeleteParamList(deleteParamList);\r
284       tr069OperationDetails.setModifyParamList(modifyParamList);\r
285       tr069OperationDetails.setSetParamList(setParamList);\r
286     } else {\r
287       if (TR069OperationCode.SET_PARAMETER_ATTRIBUTES.equals(opDetails.getOpCode())) {\r
288         List<ParameterDTO> list = fromJsonToParameterAttribute(sb.toString());\r
289         opDetails.setParmeters(list);\r
290       } else {\r
291         List<ParameterDTO> list = fromJson(sb.toString());\r
292         opDetails.setParmeters(list);\r
293       }\r
294     }\r
295   }\r
296 \r
297   /**\r
298    * @param sb\r
299    * @param temp\r
300    */\r
301   private static void append(StringBuilder sb, String temp) {\r
302     if (temp != null && !temp.isEmpty()) {\r
303       sb.append(temp);\r
304     }\r
305   }\r
306 \r
307   /**\r
308    * @param jsonString\r
309    * @return\r
310    */\r
311   private static List<ParameterDTO> fromJson(String jsonString) {\r
312     Gson gson = new Gson();\r
313     Type collectionType = new TypeToken<List<ParameterDTO>>() {}.getType();\r
314     return gson.fromJson(jsonString, collectionType);\r
315   }\r
316 \r
317   /**\r
318    * @param jsonString\r
319    * @return\r
320    */\r
321   private static List<ParameterDTO> fromJsonToParameterAttribute(String jsonString) {\r
322     Gson gson = new Gson();\r
323     Type collectionType = new TypeToken<List<ParameterAttributeDTO>>() {}.getType();\r
324     return gson.fromJson(jsonString, collectionType);\r
325   }\r
326 \r
327   /**\r
328    * @param entity\r
329    * @return\r
330    */\r
331   private static <T> String toJson(T entity) {\r
332     Gson gson = new Gson();\r
333     return gson.toJson(entity);\r
334   }\r
335 \r
336   /**\r
337    * @param parameterDTOs\r
338    */\r
339   private static void convertBooleanValues(List<ParameterDTO> parameterDTOs) {\r
340     for (ParameterDTO param : parameterDTOs) {\r
341       if (param.getDataType() != null && param.getDataType().equalsIgnoreCase("boolean")) {\r
342         if (param.getParamValue() != null && (param.getParamValue().equalsIgnoreCase("true")\r
343             || param.getParamValue().equalsIgnoreCase("1"))) {\r
344           param.setParamValue("1");\r
345         } else {\r
346           param.setParamValue("0");\r
347         }\r
348       }\r
349     }\r
350   }\r
351 \r
352 }\r