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