SPV is failing if Admin state
[oam/tr069-adapter.git] / mapper / src / main / java / org / commscope / tr069adapter / mapper / util / NetconfToTr069MapperUtil.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.util;\r
20 \r
21 import java.io.Serializable;\r
22 import java.io.StringReader;\r
23 import java.io.StringWriter;\r
24 import java.util.ArrayList;\r
25 import java.util.Collections;\r
26 import java.util.Comparator;\r
27 import java.util.HashMap;\r
28 import java.util.List;\r
29 import java.util.Map;\r
30 import java.util.StringTokenizer;\r
31 \r
32 import javax.xml.XMLConstants;\r
33 import javax.xml.parsers.DocumentBuilder;\r
34 import javax.xml.parsers.DocumentBuilderFactory;\r
35 import javax.xml.parsers.ParserConfigurationException;\r
36 import javax.xml.transform.Transformer;\r
37 import javax.xml.transform.TransformerFactory;\r
38 import javax.xml.transform.dom.DOMSource;\r
39 import javax.xml.transform.stream.StreamResult;\r
40 \r
41 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
42 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
43 import org.commscope.tr069adapter.acs.common.OperationOptions;\r
44 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
45 import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
46 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
47 import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
48 import org.commscope.tr069adapter.mapper.MapperConfigProperties;\r
49 import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails;\r
50 import org.commscope.tr069adapter.mapper.model.NetConfResponse;\r
51 import org.slf4j.Logger;\r
52 import org.slf4j.LoggerFactory;\r
53 import org.springframework.beans.factory.annotation.Autowired;\r
54 import org.springframework.stereotype.Component;\r
55 import org.w3c.dom.Document;\r
56 import org.w3c.dom.Element;\r
57 import org.w3c.dom.Node;\r
58 import org.w3c.dom.NodeList;\r
59 import org.xml.sax.InputSource;\r
60 \r
61 @Component\r
62 public class NetconfToTr069MapperUtil {\r
63 \r
64   @Autowired\r
65   MOMetaDataUtil metaDataUtil;\r
66   \r
67   @Autowired\r
68   MapperConfigProperties config;\r
69 \r
70   private static final Logger logger = LoggerFactory.getLogger(NetconfToTr069MapperUtil.class);\r
71   private static final String INDEX_STR = "index";\r
72   private static final String INDEX_REGEX = "[0-9]{1,}";\r
73 \r
74   @Autowired\r
75   private ErrorCodeUtil errorCodeUtil;\r
76 \r
77   public static Element convertStringToDocument(String xmlStr) {\r
78     try {\r
79       Document doc = convertStringToDocumentXml(xmlStr);\r
80       if (null != doc)\r
81         return doc.getDocumentElement();\r
82     } catch (Exception e) {\r
83       logger.error("Error while converting String to element {}", e.getMessage());\r
84     }\r
85     return null;\r
86   }\r
87 \r
88   public static Document convertStringToDocumentXml(String xmlStr) {\r
89     try {\r
90       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
91       factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");\r
92       factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");\r
93       DocumentBuilder builder;\r
94       builder = factory.newDocumentBuilder();\r
95       return builder.parse(new InputSource(new StringReader(xmlStr)));\r
96     } catch (Exception e) {\r
97       logger.error("Error while converting String to element {}", e.getMessage());\r
98     }\r
99     return null;\r
100   }\r
101 \r
102   public static Map<String, String> extractRequestParamters(Document operationElement,\r
103       String netconfTag, String filterElement) {\r
104     Node requestDataNode = getParameterDataNode(operationElement, netconfTag, filterElement);\r
105     Map<String, String> map = getParameterMapForNode(requestDataNode, -1);\r
106     return map;\r
107   }\r
108 \r
109   public static DeviceRPCRequest prepareTR069Request(String deviceId, Element operationElement,\r
110       String netconfTag, TR069OperationCode opCode) {\r
111     Node requestDataNode = getDeviceDataNode(operationElement, netconfTag);\r
112     if (requestDataNode == null) {\r
113       logger.debug("No matching device parameters found in the netconf request XML.");\r
114       return null;\r
115     }\r
116     Map<String, String> map = getParameterMapForNode(requestDataNode, -1);\r
117     List<ParameterDTO> params = new ArrayList<>();\r
118 \r
119     for (java.util.Map.Entry<String, String> entry : map.entrySet()) {\r
120       if (!entry.getKey().equalsIgnoreCase("filter")) {\r
121         String moName = entry.getKey();\r
122         String value = entry.getValue();\r
123         if (moName.endsWith("." + INDEX_STR)\r
124             && (TR069OperationCode.GET_PARAMETER_VALUES.equals(opCode)\r
125                 || TR069OperationCode.DELETE_OBJECT.equals(opCode))) {\r
126           logger.debug("Index node found : {}", moName);\r
127           moName = moName.replaceFirst("." + INDEX_STR, ".");\r
128           value = null;\r
129 \r
130         }\r
131 \r
132         ParameterDTO param = new ParameterDTO(moName, value);\r
133         params.add(param);\r
134       }\r
135     }\r
136 \r
137     TR069OperationDetails opDetails = new TR069OperationDetails();\r
138     opDetails.setOpCode(opCode);\r
139     return handleParamsOperation(params, opDetails, deviceId);\r
140   }\r
141 \r
142   public static DeviceRPCRequest handleParamsOperation(List<ParameterDTO> params,\r
143       TR069OperationDetails opDetails, String deviceId) {\r
144     opDetails.setParmeters(params);\r
145 \r
146     DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
147     TR069DeviceDetails tr069DeviceDetails = new TR069DeviceDetails();\r
148     tr069DeviceDetails.setDeviceId(deviceId);\r
149     deviceRPCRequest.setOpDetails(opDetails);\r
150     deviceRPCRequest.setDeviceDetails(tr069DeviceDetails);\r
151     OperationOptions options = new OperationOptions();\r
152     options.setExecutionTimeout(60l);\r
153     deviceRPCRequest.setOptions(options);\r
154     return deviceRPCRequest;\r
155   }\r
156 \r
157   public NetConfResponse getNetconfResponse(DeviceRPCResponse opResult, boolean isCustomparameter) {\r
158     NetConfResponse netConfResponse = new NetConfResponse();\r
159     ErrorCodeDetails errorCodeDetails = errorCodeUtil.getErrorCodeMetaData(opResult.getFaultKey());\r
160     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
161     if (errorCodeDetails != null) {\r
162       errorCode.setFaultCode(opResult.getFaultKey());\r
163       errorCode.setErrorMessage(errorCodeDetails.getErrorMessage());\r
164       errorCode.setErrorType(errorCodeDetails.getErrorType());\r
165       errorCode.setErrorTag(errorCodeDetails.getErrorTag());\r
166       errorCode.setErrorSeverity(errorCodeDetails.getErrorSeverity());\r
167       netConfResponse.setErrorCode(errorCode);\r
168       netConfResponse.setErrorMessage(opResult.getFaultString());\r
169     } else if (opResult.getFaultKey() != null && opResult.getFaultString() != null) {\r
170       errorCode.setFaultCode(opResult.getFaultKey());\r
171       errorCode.setErrorMessage(opResult.getFaultString());\r
172       errorCode.setErrorType("application");\r
173       errorCode.setErrorTag("operation-failed");\r
174       errorCode.setErrorSeverity("ERROR");\r
175       netConfResponse.setErrorCode(errorCode);\r
176       netConfResponse.setErrorMessage(opResult.getFaultString());\r
177     }\r
178     netConfResponse.setNetconfResponseXml(getNetconfResponseXML(\r
179         opResult.getOperationResponse().getParameterDTOs(), isCustomparameter));\r
180     return netConfResponse;\r
181   }\r
182 \r
183   public NetConfResponse getNetconfResponseForSoftwareInventory(DeviceRPCResponse opResult) {\r
184 \r
185     NetConfResponse netConfResponse = new NetConfResponse();\r
186     ErrorCodeDetails errorCodeDetails = errorCodeUtil.getErrorCodeMetaData(opResult.getFaultKey());\r
187     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
188     if (errorCodeDetails != null) {\r
189       errorCode.setFaultCode(opResult.getFaultKey());\r
190       errorCode.setErrorMessage(errorCodeDetails.getErrorMessage());\r
191       errorCode.setErrorType(errorCodeDetails.getErrorType());\r
192       errorCode.setErrorTag(errorCodeDetails.getErrorTag());\r
193       errorCode.setErrorSeverity(errorCodeDetails.getErrorSeverity());\r
194       netConfResponse.setErrorCode(errorCode);\r
195       netConfResponse.setErrorMessage(opResult.getFaultString());\r
196       return netConfResponse;\r
197     } else if (opResult.getFaultKey() != null && opResult.getFaultString() != null) {\r
198       errorCode.setFaultCode(opResult.getFaultKey());\r
199       errorCode.setErrorMessage(opResult.getFaultString());\r
200       errorCode.setErrorType("application");\r
201       errorCode.setErrorTag("operation-failed");\r
202       errorCode.setErrorSeverity("ERROR");\r
203       netConfResponse.setErrorCode(errorCode);\r
204       netConfResponse.setErrorMessage(opResult.getFaultString());\r
205       return netConfResponse;\r
206     }\r
207     List<ParameterDTO> paramDTOList = new ArrayList<>();\r
208 \r
209     String build = null;\r
210     String productClass = null;\r
211     for (ParameterDTO paramDto : opResult.getOperationResponse().getParameterDTOs()) {\r
212       if (paramDto.getParamName().equals("Device.DeviceInfo.SoftwareVersion"))\r
213         build = paramDto.getParamValue();\r
214       else if (paramDto.getParamName().equals("Device.DeviceInfo.ProductClass"))\r
215         productClass = paramDto.getParamValue();\r
216     }\r
217 \r
218     String[] arrOfBuild = build.split("\\.");\r
219     String buildId = arrOfBuild[arrOfBuild.length - 1];\r
220     StringBuilder buildVersion = new StringBuilder();\r
221     for (int i = 0; i < arrOfBuild.length - 1; i++) {\r
222       if (i == arrOfBuild.length - 2) {\r
223         buildVersion.append(arrOfBuild[i]);\r
224       } else {\r
225         buildVersion.append(arrOfBuild[i]);\r
226         buildVersion.append(".");\r
227       }\r
228     }\r
229 \r
230     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.name", "Active Partition"));\r
231     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.status", "VALID"));\r
232     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.active", "true"));\r
233     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.running", "true"));\r
234     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.access", "READ_ONLY"));\r
235     paramDTOList\r
236         .add(new ParameterDTO("software-inventory.software-slot.product-code", productClass));\r
237     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.vendor-code", config.getVendorName()));\r
238     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.build-id", buildId));\r
239     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.build-version",\r
240         buildVersion.toString()));\r
241     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.files.name", "BC_ONE"));\r
242     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.files.integrity", "OK"));\r
243 \r
244     String XmlStr = getNetconfResponseXML(paramDTOList, true);\r
245 \r
246     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
247     DocumentBuilder builder;\r
248     Document doc = null;\r
249     try {\r
250       builder = factory.newDocumentBuilder();\r
251       doc = builder.parse(new InputSource(new StringReader(XmlStr)));\r
252     } catch (Exception e) {\r
253       logger.error("Error while converting String to element" + e);\r
254       errorCode.setFaultCode("8002");\r
255       errorCode.setErrorMessage("Operation Aborted");\r
256       errorCode.setErrorType("application");\r
257       errorCode.setErrorTag("operation-failed");\r
258       errorCode.setErrorSeverity("ERROR");\r
259       netConfResponse.setErrorCode(errorCode);\r
260       netConfResponse.setErrorMessage("Operation Aborted");\r
261       return netConfResponse;\r
262     }\r
263 \r
264     Element originalDocumentElement = doc.getDocumentElement();\r
265     Element newDocumentElement = doc.createElementNS("urn:o-ran:software-management:1.0",\r
266         originalDocumentElement.getNodeName());\r
267     NodeList list = originalDocumentElement.getChildNodes();\r
268     while (list.getLength() != 0) {\r
269       newDocumentElement.appendChild(list.item(0));\r
270     }\r
271     // Replace the original element\r
272     doc.replaceChild(newDocumentElement, originalDocumentElement);\r
273 \r
274     String strxml = null;\r
275     try {\r
276       TransformerFactory transformerFactory = TransformerFactory.newInstance();\r
277       Transformer transformer = transformerFactory.newTransformer();\r
278       DOMSource source = new DOMSource(doc);\r
279       StreamResult result = new StreamResult(new StringWriter());\r
280       transformer.transform(source, result);\r
281       strxml = result.getWriter().toString();\r
282     } catch (Exception e) {\r
283       logger.error("Error while converting Element to String" + e);\r
284       errorCode.setFaultCode("8002");\r
285       errorCode.setErrorMessage("Operation Aborted");\r
286       errorCode.setErrorType("application");\r
287       errorCode.setErrorTag("operation-failed");\r
288       errorCode.setErrorSeverity("ERROR");\r
289       netConfResponse.setErrorCode(errorCode);\r
290       netConfResponse.setErrorMessage("Operation Aborted");\r
291       return netConfResponse;\r
292     }\r
293 \r
294     netConfResponse.setNetconfResponseXml(strxml);\r
295     logger.debug("NetConf Response XML String for software inventory: " + strxml);\r
296     return netConfResponse;\r
297   }\r
298 \r
299   private String getNetconfResponseXML(List<ParameterDTO> parameters, boolean isCustomparameter) {\r
300     if (null == parameters || parameters.isEmpty()) {\r
301 \r
302       return null;\r
303     }\r
304     Collections.sort(parameters, new SortByParamterName());\r
305 \r
306     String result = null;\r
307     try {\r
308       DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();\r
309       docFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");\r
310       docFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");\r
311       DocumentBuilder docBuilder = docFactory.newDocumentBuilder();\r
312       Document doc = docBuilder.newDocument();\r
313 \r
314       Map<String, Element> parentNodeMap = new HashMap<>();\r
315       Element dataNode = null; // root of all nodes\r
316 \r
317       for (ParameterDTO paramDto : parameters) {\r
318         String paramName =\r
319             metaDataUtil.getNetconfNameByTR69NameWithIndexes(paramDto.getParamName());\r
320         if (paramName == null && isCustomparameter) {\r
321           paramName = paramDto.getParamName();\r
322         }\r
323         String paramValue = paramDto.getParamValue();\r
324         if (paramValue == null || paramValue.trim().isEmpty()) {\r
325           logger.debug("Values is empty so skipping this parameter.");\r
326           continue;\r
327         }\r
328         StringTokenizer tokenizer = new StringTokenizer(paramName, ".");\r
329         String parentNodeName = null;\r
330         String parentNodeKey = null;\r
331         Element parentNode = null;\r
332         while (tokenizer.hasMoreElements()) {\r
333           String nodeName = (String) tokenizer.nextElement();\r
334           if (null == parentNodeName) { // construct first node or\r
335                                         // Device node\r
336             parentNodeName = nodeName;\r
337             parentNodeKey = nodeName;\r
338             // check if the node already exists in parentNodeMap\r
339             parentNode = parentNodeMap.get(parentNodeKey);\r
340             if (null == dataNode) {\r
341               dataNode = parentNode;\r
342             }\r
343 \r
344           } else if (nodeName.matches(INDEX_REGEX)) { // construct\r
345                                                       // tabular and\r
346                                                       // index nodes\r
347 \r
348             // get parent tabular node from parent MAP\r
349             StringBuilder bld = new StringBuilder(parentNodeKey);\r
350             bld.append(".");\r
351             bld.append(nodeName);\r
352             parentNodeKey = bld.toString();\r
353             Element node = parentNodeMap.computeIfPresent(parentNodeKey, (k, v) -> v);\r
354 \r
355             // create a tabular parent node if doesn't exit in MAP\r
356             if (null == node) {\r
357               if (metaDataUtil.getMetaDataByNetConfName(parentNodeKey + ".") != null\r
358                   && metaDataUtil.getMetaDataByNetConfName(parentNodeKey + ".").getURI() != null) {\r
359                 node = doc.createElementNS(\r
360                     metaDataUtil.getMetaDataByNetConfName(parentNodeKey + ".").getURI(),\r
361                     parentNodeName);\r
362               } else {\r
363                 node = doc.createElement(parentNodeName);\r
364               }\r
365               parentNodeMap.put(parentNodeKey, node);\r
366 \r
367               // update current tabular parent node.\r
368               if (null != parentNode)\r
369                 parentNode.appendChild(node);\r
370 \r
371               // prepare and add index node to tabular parent node\r
372               Element indexNode = doc.createElement(INDEX_STR);\r
373               indexNode.setTextContent(nodeName);\r
374               node.appendChild(indexNode);\r
375             }\r
376             parentNode = node; // move parent to child\r
377             parentNodeName = nodeName;\r
378           } else if (parentNodeName.matches(INDEX_REGEX)) { // move to\r
379                                                             // next\r
380                                                             // node\r
381                                                             // if\r
382                                                             // tabular\r
383                                                             // attribute\r
384                                                             // is\r
385                                                             // found\r
386             StringBuilder bld = new StringBuilder(parentNodeName);\r
387             bld.append(".");\r
388             bld.append(nodeName);\r
389             parentNodeKey = bld.toString();\r
390             parentNodeName = nodeName;\r
391           } else {\r
392             // construct intermediate nodes\r
393             Element node = parentNodeMap.get(parentNodeKey);\r
394             if (null == node) {\r
395               if (metaDataUtil.getMetaDataByNetConfName(parentNodeKey) != null\r
396                   && metaDataUtil.getMetaDataByNetConfName(parentNodeKey).getURI() != null) {\r
397                 node = doc.createElementNS(\r
398                     metaDataUtil.getMetaDataByNetConfName(parentNodeKey).getURI(), parentNodeName);\r
399                 if (dataNode == null)\r
400                   dataNode = node;\r
401               } else {\r
402                 node = doc.createElement(parentNodeName);\r
403               }\r
404               parentNodeMap.put(parentNodeKey, node);\r
405               if (null != parentNode)\r
406                 parentNode.appendChild(node);\r
407 \r
408             }\r
409             StringBuilder bld = new StringBuilder(parentNodeKey);\r
410             bld.append(".");\r
411             bld.append(nodeName);\r
412             parentNodeKey = bld.toString();\r
413             parentNodeName = nodeName;\r
414             parentNode = node;\r
415           }\r
416         }\r
417         // construct leaf node\r
418         Element leafNode = doc.createElement(parentNodeName);\r
419         leafNode.setTextContent(paramValue);\r
420         if (null != parentNode)\r
421           parentNode.appendChild(leafNode);\r
422       }\r
423 \r
424       if (null != dataNode) {\r
425         result = NetconfToTr069MapperUtil.convertDocumentToString(dataNode);\r
426       }\r
427     } catch (ParserConfigurationException pce) {\r
428       logger.error("Exception : {}", pce.getMessage());\r
429     }\r
430 \r
431     return result;\r
432   }\r
433 \r
434   public static String convertDocumentToString(Element element) {\r
435     String strxml = null;\r
436     try {\r
437       TransformerFactory transformerFactory = TransformerFactory.newInstance();\r
438       transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");\r
439       transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");\r
440       Transformer transformer = transformerFactory.newTransformer();\r
441       DOMSource source = new DOMSource(element);\r
442       StreamResult result = new StreamResult(new StringWriter());\r
443       transformer.transform(source, result);\r
444       strxml = result.getWriter().toString();\r
445     } catch (Exception e) {\r
446       logger.error("Error while converting Element to String {}", e.toString());\r
447     }\r
448     logger.debug("Converted XML is : {} ", strxml);\r
449     return strxml;\r
450   }\r
451 \r
452   // TODO: Need to optimize the Node element logic for better performance\r
453   private static Map<String, String> getParameterMapForNode(Node moRNode, int numberOfChilds) {\r
454     Map<String, String> result = new HashMap<>();\r
455     if (moRNode.getNodeType() == Node.ELEMENT_NODE) {\r
456       NodeList childs = moRNode.getChildNodes();\r
457       boolean hasChildElements = false;\r
458       hasChildElements = checkMoreElements(result, childs, hasChildElements);\r
459       if (!hasChildElements) {\r
460         String moName = getMOName(moRNode);\r
461         if (moName.equals("software-inventory")) {\r
462           result.put("device.device-info.software-version", moRNode.getTextContent());\r
463           result.put("device.device-info.product-class", moRNode.getTextContent());\r
464         } else if (!moName.endsWith("." + INDEX_STR)) {\r
465           result.put(moName, moRNode.getTextContent());\r
466         } else if (numberOfChilds == 1) {\r
467           result.put(moName, moRNode.getTextContent());\r
468         }\r
469       }\r
470     }\r
471 \r
472     return result;\r
473   }\r
474 \r
475   private static boolean checkMoreElements(Map<String, String> result, NodeList childs,\r
476       boolean hasChildElements) {\r
477     if (childs.getLength() > 0) {\r
478       int counter = 0;\r
479       for (int i = 0; i < childs.getLength(); i++) {\r
480         Node cNode = childs.item(i);\r
481         if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
482           counter++;\r
483         }\r
484       }\r
485 \r
486       for (int i = 0; i < childs.getLength(); i++) {\r
487         Node cNode = childs.item(i);\r
488         if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
489           hasChildElements = true;\r
490           Map<String, String> subResult = getParameterMapForNode(cNode, counter);\r
491           result.putAll(subResult);\r
492         }\r
493       }\r
494     }\r
495     return hasChildElements;\r
496   }\r
497 \r
498   private static String getMOName(Node moRNode) {\r
499     String result = removeNS(moRNode.getNodeName());\r
500     Node pNode = moRNode;\r
501     while (true) {\r
502       pNode = pNode.getParentNode();\r
503       if (pNode == null || pNode.getNodeType() != Node.ELEMENT_NODE\r
504           || pNode.getNodeName().equals("edit-config") || pNode.getNodeName().equals("config")\r
505           || pNode.getNodeName().equals("get-config") || pNode.getNodeName().equals("filter")\r
506           || pNode.getNodeName().equals("get")) {\r
507         return result;\r
508       } else {\r
509         String indexStr = getMOIndex(pNode);\r
510         StringBuilder bld = new StringBuilder(removeNS(pNode.getNodeName()));\r
511         bld.append(".");\r
512         if (indexStr == null) {\r
513           bld.append(result);\r
514           result = bld.toString();\r
515         } else {\r
516           bld.append(indexStr);\r
517           bld.append(".");\r
518           bld.append(result);\r
519           result = bld.toString();\r
520         }\r
521       }\r
522     }\r
523   }\r
524 \r
525   private static Node getParameterDataNode(Document el, String docStart, String filterElement) {\r
526     NodeList nodeList = el.getElementsByTagName(docStart);\r
527     if (nodeList.getLength() > 0) {\r
528       nodeList = nodeList.item(0).getChildNodes();\r
529       for (int i = 0; i < nodeList.getLength(); i++) {\r
530         Node node = nodeList.item(i);\r
531         String nodeName = removeNS(node.getNodeName());\r
532         if (nodeName.equals(filterElement)) {\r
533           return node;\r
534         }\r
535       }\r
536     }\r
537     return null;\r
538   }\r
539 \r
540   private static Node getDeviceDataNode(Element el, String filter) {\r
541     try {\r
542       NodeList nodeList = el.getElementsByTagName(filter);\r
543       if (nodeList.getLength() > 0) {\r
544         nodeList = nodeList.item(0).getChildNodes();\r
545         for (int i = 0; i < nodeList.getLength(); i++) {\r
546           Node node = nodeList.item(i);\r
547           if (node.getNodeType() == Node.ELEMENT_NODE) {\r
548             return node;\r
549           }\r
550         }\r
551       }\r
552     } catch (Exception e) {\r
553       logger.error("exception occured while parsing the request xml {}", e.getMessage());\r
554     }\r
555     return null;\r
556   }\r
557 \r
558   private static String removeNS(String nodeName) {\r
559     // remove name space\r
560     int li = nodeName.lastIndexOf(':');\r
561     nodeName = nodeName.substring(li + 1);\r
562     return nodeName;\r
563   }\r
564 \r
565   private static String getMOIndex(Node pNode) {\r
566     if (null != pNode) {\r
567       NodeList nodeList = pNode.getChildNodes();\r
568       for (int i = 0; i < nodeList.getLength(); i++) {\r
569         Node childNode = nodeList.item(i);\r
570         String nodeName = removeNS(childNode.getNodeName());\r
571         if (nodeName.equalsIgnoreCase(INDEX_STR)) {\r
572           return childNode.getTextContent();\r
573         }\r
574       }\r
575     }\r
576     return null;\r
577   }\r
578 \r
579 }\r
580 \r
581 \r
582 class SortByParamterName implements Comparator<ParameterDTO>, Serializable {\r
583   private static final long serialVersionUID = 3010693349267067945L;\r
584 \r
585   public int compare(ParameterDTO a, ParameterDTO b) {\r
586     return a.getParamName().compareTo(b.getParamName());\r
587   }\r
588 }\r