Initial source code
[oam/tr069-adapter.git] / mapper / src / main / java / org / commscope / tr069adapter / mapper / netconf / impl / NetConfRequestHandlerImpl.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 package org.commscope.tr069adapter.mapper.netconf.impl;\r
20 \r
21 import java.util.ArrayList;\r
22 import java.util.List;\r
23 \r
24 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
25 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
26 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
27 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
28 import org.commscope.tr069adapter.mapper.ErrorCodeMetaData;\r
29 import org.commscope.tr069adapter.mapper.MOMetaData;\r
30 import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails;\r
31 import org.commscope.tr069adapter.mapper.model.NetConfRequest;\r
32 import org.commscope.tr069adapter.mapper.model.NetConfResponse;\r
33 import org.commscope.tr069adapter.mapper.model.NetConfServerDetails;\r
34 import org.commscope.tr069adapter.mapper.netconf.NetConfRequestHandler;\r
35 import org.commscope.tr069adapter.mapper.sync.SynchronizedRequestHandler;\r
36 import org.commscope.tr069adapter.mapper.util.ErrorCodeUtil;\r
37 import org.commscope.tr069adapter.mapper.util.MOMetaDataUtil;\r
38 import org.commscope.tr069adapter.mapper.util.NetconfToTr069MapperUtil;\r
39 import org.commscope.tr069adapter.mapper.ves.VESNotificationSender;\r
40 import org.slf4j.Logger;\r
41 import org.slf4j.LoggerFactory;\r
42 import org.springframework.beans.factory.annotation.Autowired;\r
43 import org.springframework.stereotype.Component;\r
44 import org.springframework.util.StringUtils;\r
45 import org.w3c.dom.Element;\r
46 \r
47 @Component\r
48 public class NetConfRequestHandlerImpl implements NetConfRequestHandler {\r
49 \r
50   private static final Logger LOG = LoggerFactory.getLogger(NetConfRequestHandlerImpl.class);\r
51   private static final String BOOLEAN_TRUE_VALUE = "1";\r
52   private static final String BOOLEAN_FALSE_VALUE = "0";\r
53   private static final String BOOLEAN_DATA_TYPE = "boolean";\r
54 \r
55   @Autowired\r
56   SynchronizedRequestHandler syncHandler;\r
57 \r
58   @Autowired\r
59   NetconfToTr069MapperUtil mapperUtil;\r
60 \r
61   @Autowired\r
62   MOMetaDataUtil metaDataUtil;\r
63 \r
64   @Autowired\r
65   private ErrorCodeUtil errorCodeUtil;\r
66 \r
67   @Autowired\r
68   VESNotificationSender vesnotiSender;\r
69 \r
70   @Override\r
71   public NetConfResponse handleSetConfigRequest(NetConfRequest netConfRequest) {\r
72     Element el = NetconfToTr069MapperUtil.convertStringToDocument(netConfRequest.getRequestXml());\r
73     NetConfResponse response = null;\r
74     DeviceRPCRequest deviceRPCRequest = NetconfToTr069MapperUtil.prepareTR069Request(\r
75         netConfRequest.getDeviceId(), el, "config", TR069OperationCode.SET_PARAMETER_VALUES);\r
76 \r
77     if (deviceRPCRequest == null) {\r
78       LOG.debug("There are no supported device parameters found for edit-config.");\r
79       return getEmptyResponse();\r
80     }\r
81     List<ParameterDTO> requestParams = deviceRPCRequest.getOpDetails().getParmeters();\r
82     List<ParameterDTO> filteredParams = new ArrayList<>();\r
83     if (null != requestParams) {\r
84       for (ParameterDTO param : requestParams) {\r
85         if (null == param.getParamValue() || StringUtils.isEmpty(param.getParamValue())) {\r
86           continue;\r
87         }\r
88         filteredParams.add(param);\r
89       }\r
90       deviceRPCRequest.getOpDetails().setParmeters(filteredParams);\r
91     }\r
92 \r
93     if (deviceRPCRequest.getOpDetails() == null\r
94         || deviceRPCRequest.getOpDetails().getParmeters().isEmpty()) {\r
95       LOG.debug("There are no device parameters found for edit-config.");\r
96       return getEmptyResponse();\r
97     } else if (deviceRPCRequest.getOpDetails() != null) {\r
98       deviceRPCRequest.getOpDetails()\r
99           .setParmeters(filteredSetParameters(deviceRPCRequest.getOpDetails().getParmeters()));\r
100       if (deviceRPCRequest.getOpDetails().getParmeters().isEmpty()) {\r
101         LOG.debug("There are no supported device parameters found for edit-config.");\r
102         return getEmptyResponse();\r
103       }\r
104     }\r
105 \r
106     handleBooleanParametersReverse(deviceRPCRequest.getOpDetails().getParmeters());\r
107     LOG.debug("Prepared NBI request for edit-config {}", deviceRPCRequest);\r
108 \r
109     DeviceRPCResponse deviceRPCResponse;\r
110     deviceRPCResponse = syncHandler.performDeviceOperation(deviceRPCRequest);\r
111     if (null == deviceRPCResponse) {\r
112       return getTimeOutResponse();\r
113     }\r
114     response = mapperUtil.getNetconfResponse(deviceRPCResponse);\r
115     return response;\r
116   }\r
117 \r
118   @Override\r
119   public NetConfResponse handleDelConfigRequest(NetConfRequest netConfRequest) {\r
120     Element el = NetconfToTr069MapperUtil.convertStringToDocument(netConfRequest.getRequestXml());\r
121     NetConfResponse response = null;\r
122     DeviceRPCRequest request = NetconfToTr069MapperUtil.prepareTR069Request(\r
123         netConfRequest.getDeviceId(), el, "config", TR069OperationCode.DELETE_OBJECT);\r
124 \r
125     if (request == null) {\r
126       LOG.debug("There are no supported device parameters found for delete-config.");\r
127       return getEmptyResponse();\r
128     }\r
129 \r
130     List<ParameterDTO> requestParams = request.getOpDetails().getParmeters();\r
131     List<ParameterDTO> filteredParams = new ArrayList<>();\r
132     if (null != requestParams) {\r
133       for (ParameterDTO param : requestParams) {\r
134         filteredParams.add(param);\r
135       }\r
136       request.getOpDetails().setParmeters(filteredParams);\r
137     }\r
138 \r
139     if (request.getOpDetails() == null || request.getOpDetails().getParmeters().isEmpty()) {\r
140       LOG.debug("There are no device parameters found for delete-config.");\r
141       return getEmptyResponse();\r
142     } else if (request.getOpDetails() != null) {\r
143       request.getOpDetails()\r
144           .setParmeters(filteredSetParameters(request.getOpDetails().getParmeters()));\r
145       if (request.getOpDetails().getParmeters().isEmpty()) {\r
146         LOG.debug("There are no supported device parameters found for delete-config.");\r
147         return getEmptyResponse();\r
148       }\r
149     }\r
150     LOG.debug("Prepared NBI request for delete-config {}", request);\r
151 \r
152     DeviceRPCResponse opResult;\r
153     opResult = syncHandler.performDeviceOperation(request);\r
154     if (null == opResult) {\r
155       return getTimeOutResponse();\r
156     }\r
157     response = mapperUtil.getNetconfResponse(opResult);\r
158     return response;\r
159   }\r
160 \r
161   @Override\r
162   public NetConfResponse handleGetRequest(NetConfRequest netConfRequest) {\r
163     Element el = NetconfToTr069MapperUtil.convertStringToDocument(netConfRequest.getRequestXml());\r
164     NetConfResponse response = null;\r
165     DeviceRPCRequest request = NetconfToTr069MapperUtil.prepareTR069Request(\r
166         netConfRequest.getDeviceId(), el, "filter", TR069OperationCode.GET_PARAMETER_VALUES);\r
167 \r
168     if (request == null || request.getOpDetails() == null\r
169         || request.getOpDetails().getParmeters().isEmpty()) {\r
170       LOG.debug("There are no device parameters found for get.");\r
171       return getEmptyResponse();\r
172     } else if (request.getOpDetails() != null) {\r
173 \r
174       request.getOpDetails()\r
175           .setParmeters(filteredGetParameters(request.getOpDetails().getParmeters()));\r
176 \r
177       if (request.getOpDetails().getParmeters().isEmpty()) {\r
178         LOG.debug("There are no supported device parameters found for get.");\r
179         return getEmptyResponse();\r
180       }\r
181     }\r
182     LOG.debug("Prepared NBI request for get {}", request);\r
183 \r
184     DeviceRPCResponse opResult;\r
185     opResult = syncHandler.performDeviceOperation(request);\r
186     if (null == opResult) {\r
187       return getTimeOutResponse();\r
188     }\r
189     response = mapperUtil.getNetconfResponse(opResult);\r
190     return response;\r
191   }\r
192 \r
193   @Override\r
194   public NetConfResponse handleGetConfigRequest(NetConfRequest netConfRequest) {\r
195     Element el = NetconfToTr069MapperUtil.convertStringToDocument(netConfRequest.getRequestXml());\r
196     NetConfResponse response = null;\r
197     DeviceRPCRequest request = NetconfToTr069MapperUtil.prepareTR069Request(\r
198         netConfRequest.getDeviceId(), el, "filter", TR069OperationCode.GET_PARAMETER_VALUES);\r
199 \r
200     if (request == null || request.getOpDetails() == null\r
201         || request.getOpDetails().getParmeters().isEmpty()) {\r
202       LOG.debug("There are no device parameters found for get-config.");\r
203       return getEmptyResponse();\r
204     } else if (request.getOpDetails() != null) {\r
205       request.getOpDetails()\r
206           .setParmeters(filteredGetParameters(request.getOpDetails().getParmeters()));\r
207 \r
208       if (request.getOpDetails().getParmeters().isEmpty()) {\r
209         LOG.debug("There are no supported device parameters found for get-config.");\r
210         return getEmptyResponse();\r
211       }\r
212     }\r
213     LOG.debug("Prepared NBI request for get-config {}", request);\r
214 \r
215     DeviceRPCResponse opResult;\r
216     opResult = syncHandler.performDeviceOperation(request);\r
217     if (null == opResult) {\r
218       return getTimeOutResponse();\r
219     }\r
220     LOG.debug("Received GPV response : FaultKey = {} FaultString = {} Parameters : {}",\r
221         opResult.getFaultKey(), opResult.getFaultString(),\r
222         opResult.getOperationResponse().getParameterDTOs());\r
223     if (null != opResult.getOperationResponse().getParameterDTOs())\r
224       handleBooleanParameters(opResult.getOperationResponse().getParameterDTOs());\r
225     response = mapperUtil.getNetconfResponse(opResult);\r
226 \r
227     if (opResult.getFaultKey() != null && opResult.getFaultKey().equalsIgnoreCase("9005")) {\r
228       // check for tabular\r
229       LOG.debug("Tabular Entry not exist in the device; we need to add it now");\r
230       MOMetaData data = metaDataUtil\r
231           .getMetaDataByTR69Name(request.getOpDetails().getParmeters().get(0).getParamName());\r
232       if (data.isTabluarObj()) {\r
233         return getEmptyResponse();\r
234       }\r
235     }\r
236 \r
237     return response;\r
238   }\r
239 \r
240   private void handleBooleanParameters(List<ParameterDTO> parameterDTOs) {\r
241 \r
242     for (ParameterDTO param : parameterDTOs) {\r
243       MOMetaData metaData = metaDataUtil.getMetaDataByTR69Name(param.getParamName());\r
244       if (null != metaData && BOOLEAN_DATA_TYPE.equalsIgnoreCase(metaData.getDataType())) {\r
245         if (BOOLEAN_TRUE_VALUE.equalsIgnoreCase(param.getParamValue().trim())) {\r
246           param.setParamValue(Boolean.TRUE.toString());\r
247         } else if (BOOLEAN_FALSE_VALUE.equalsIgnoreCase(param.getParamValue().trim())) {\r
248           param.setParamValue(Boolean.FALSE.toString());\r
249         }\r
250       }\r
251     }\r
252   }\r
253 \r
254   private void handleBooleanParametersReverse(List<ParameterDTO> parameterDTOs) {\r
255 \r
256     for (ParameterDTO param : parameterDTOs) {\r
257       MOMetaData metaData = metaDataUtil.getMetaDataByTR69Name(param.getParamName());\r
258       if (null != metaData && BOOLEAN_DATA_TYPE.equalsIgnoreCase(metaData.getDataType())) {\r
259         if (Boolean.TRUE.toString().equalsIgnoreCase(param.getParamValue().trim())) {\r
260           param.setParamValue(BOOLEAN_TRUE_VALUE);\r
261         } else if (Boolean.FALSE.toString().equalsIgnoreCase(param.getParamValue().trim())) {\r
262           param.setParamValue(BOOLEAN_FALSE_VALUE);\r
263         }\r
264       }\r
265     }\r
266   }\r
267 \r
268   private NetConfResponse getEmptyResponse() {\r
269     NetConfResponse response = new NetConfResponse();\r
270     ErrorCodeMetaData errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("0");\r
271     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
272     errorCode.setFaultCode("0");\r
273     errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
274     errorCode.setErrorType(errorCodeMetaData.getErrorType());\r
275     errorCode.setErrorTag(errorCodeMetaData.getErrorTag());\r
276     errorCode.setErrorSeverity(errorCodeMetaData.getErrorSeverity());\r
277     response.setErrorCode(errorCode);\r
278     return response;\r
279   }\r
280 \r
281   private NetConfResponse getTimeOutResponse() {\r
282     // prepare timeout error response\r
283     NetConfResponse timeOutErrorResponse = new NetConfResponse();\r
284     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
285     ErrorCodeMetaData errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("8006");\r
286 \r
287     errorCode.setFaultCode("8006");\r
288     errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
289     errorCode.setErrorType(errorCodeMetaData.getErrorType());\r
290     errorCode.setErrorTag(errorCodeMetaData.getErrorTag());\r
291     errorCode.setErrorSeverity(errorCodeMetaData.getErrorSeverity());\r
292     timeOutErrorResponse.setErrorCode(errorCode);\r
293     timeOutErrorResponse.setErrorMessage("TR069 device request has been timed out.");\r
294     return timeOutErrorResponse;\r
295   }\r
296 \r
297   public List<ParameterDTO> filteredSetParameters(List<ParameterDTO> parameters) {\r
298     List<ParameterDTO> result = new ArrayList<>();\r
299     for (ParameterDTO param : parameters) {\r
300       MOMetaData metaData = metaDataUtil.getMetaDataByNetConfName(param.getParamName());\r
301       if (null != metaData && !metaData.isReadOnly()) {\r
302         String tr069MoName =\r
303             MOMetaDataUtil.getTR69MOByReplacingIndexes(param.getParamName(), metaData.getMoName());\r
304         param.setDataType(metaData.getDataType());\r
305         param.setParamName(tr069MoName);\r
306         result.add(param);\r
307       }\r
308     }\r
309     return result;\r
310   }\r
311 \r
312   private List<ParameterDTO> filteredGetParameters(List<ParameterDTO> parameters) {\r
313 \r
314     return metaDataUtil.getSupportedChildParameters(parameters);\r
315   }\r
316 \r
317   @Override\r
318   public boolean handelRegisterEvent(NetConfServerDetails request) {\r
319     LOG.debug("processing the handelRegisterEvent started");\r
320     boolean result = false;\r
321     try {\r
322       vesnotiSender.sendNotification(null, request);\r
323     } catch (Exception e) {\r
324       LOG.error("processing the handelRegisterEvent exception occurred");\r
325       result = false;\r
326     }\r
327     LOG.debug("processing the handelRegisterEvent completed");\r
328     return result;\r
329   }\r
330 }\r