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