81245d0906140c30ec42a40e879c6ad7216b5cbd
[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 import javax.xml.XMLConstants;\r
32 import javax.xml.parsers.DocumentBuilder;\r
33 import javax.xml.parsers.DocumentBuilderFactory;\r
34 import javax.xml.parsers.ParserConfigurationException;\r
35 import javax.xml.transform.Transformer;\r
36 import javax.xml.transform.TransformerFactory;\r
37 import javax.xml.transform.dom.DOMSource;\r
38 import javax.xml.transform.stream.StreamResult;\r
39 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
40 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
41 import org.commscope.tr069adapter.acs.common.OperationOptions;\r
42 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
43 import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
44 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
45 import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
46 import org.commscope.tr069adapter.mapper.MapperConfigProperties;\r
47 import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails;\r
48 import org.commscope.tr069adapter.mapper.model.NetConfResponse;\r
49 import org.slf4j.Logger;\r
50 import org.slf4j.LoggerFactory;\r
51 import org.springframework.beans.factory.annotation.Autowired;\r
52 import org.springframework.stereotype.Component;\r
53 import org.w3c.dom.Document;\r
54 import org.w3c.dom.Element;\r
55 import org.w3c.dom.Node;\r
56 import org.w3c.dom.NodeList;\r
57 import org.xml.sax.InputSource;\r
58 \r
59 @Component\r
60 public class NetconfToTr069MapperUtil {\r
61 \r
62   @Autowired\r
63   MOMetaDataUtil metaDataUtil;\r
64 \r
65   @Autowired\r
66   MapperConfigProperties config;\r
67 \r
68   private static final Logger logger = LoggerFactory.getLogger(NetconfToTr069MapperUtil.class);\r
69   private static final String INDEX_STR = "index";\r
70   private static final String INDEX_REGEX = "[0-9]{1,}";\r
71 \r
72   @Autowired\r
73   private ErrorCodeUtil errorCodeUtil;\r
74 \r
75   public static Element convertStringToDocument(String xmlStr) {\r
76     try {\r
77       Document doc = convertStringToDocumentXml(xmlStr);\r
78       if (null != doc)\r
79         return doc.getDocumentElement();\r
80     } catch (Exception e) {\r
81       logger.error("Error while converting String to element {}", e.getMessage());\r
82     }\r
83     return null;\r
84   }\r
85 \r
86   public static Document convertStringToDocumentXml(String xmlStr) {\r
87     try {\r
88       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
89       factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");\r
90       factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");\r
91       DocumentBuilder builder;\r
92       builder = factory.newDocumentBuilder();\r
93       return builder.parse(new InputSource(new StringReader(xmlStr)));\r
94     } catch (Exception e) {\r
95       logger.error("Error while converting String to element {}", e.getMessage());\r
96     }\r
97     return null;\r
98   }\r
99 \r
100   public static Map<String, String> extractRequestParamters(Document operationElement,\r
101       String netconfTag, String filterElement) {\r
102     Node requestDataNode = getParameterDataNode(operationElement, netconfTag, filterElement);\r
103     Map<String, String> map = getParameterMapForNode(requestDataNode, -1);\r
104     return map;\r
105   }\r
106 \r
107   public static DeviceRPCRequest prepareTR069Request(String deviceId, Element operationElement,\r
108       String netconfTag, TR069OperationCode opCode) {\r
109     Node requestDataNode = getDeviceDataNode(operationElement, netconfTag);\r
110     if (requestDataNode == null) {\r
111       logger.debug("No matching device parameters found in the netconf request XML.");\r
112       return null;\r
113     }\r
114     Map<String, String> map = getParameterMapForNode(requestDataNode, -1);\r
115     List<ParameterDTO> params = new ArrayList<>();\r
116 \r
117     for (java.util.Map.Entry<String, String> entry : map.entrySet()) {\r
118       if (!entry.getKey().equalsIgnoreCase("filter")) {\r
119         String moName = entry.getKey();\r
120         String value = entry.getValue();\r
121         if (moName.endsWith("." + INDEX_STR)\r
122             && (TR069OperationCode.GET_PARAMETER_VALUES.equals(opCode)\r
123                 || TR069OperationCode.DELETE_OBJECT.equals(opCode))) {\r
124           logger.debug("Index node found : {}", moName);\r
125           moName = moName.replaceFirst("." + INDEX_STR, ".");\r
126           value = null;\r
127 \r
128         }\r
129 \r
130         ParameterDTO param = new ParameterDTO(moName, value);\r
131         params.add(param);\r
132       }\r
133     }\r
134 \r
135     TR069OperationDetails opDetails = new TR069OperationDetails();\r
136     opDetails.setOpCode(opCode);\r
137     return handleParamsOperation(params, opDetails, deviceId);\r
138   }\r
139 \r
140   public static DeviceRPCRequest handleParamsOperation(List<ParameterDTO> params,\r
141       TR069OperationDetails opDetails, String deviceId) {\r
142     opDetails.setParmeters(params);\r
143 \r
144     DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
145     TR069DeviceDetails tr069DeviceDetails = new TR069DeviceDetails();\r
146     tr069DeviceDetails.setDeviceId(deviceId);\r
147     deviceRPCRequest.setOpDetails(opDetails);\r
148     deviceRPCRequest.setDeviceDetails(tr069DeviceDetails);\r
149     OperationOptions options = new OperationOptions();\r
150     options.setExecutionTimeout(60l);\r
151     deviceRPCRequest.setOptions(options);\r
152     return deviceRPCRequest;\r
153   }\r
154 \r
155   public NetConfResponse getNetconfResponse(DeviceRPCResponse opResult, String swVersion,\r
156       String hwVersion, boolean isCustomparameter) {\r
157     NetConfResponse netConfResponse = new NetConfResponse();\r
158     ErrorCodeDetails errorCodeDetails = errorCodeUtil.getErrorCodeMetaData(opResult.getFaultKey());\r
159     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
160     if (errorCodeDetails != null) {\r
161       errorCode.setFaultCode(opResult.getFaultKey());\r
162       errorCode.setErrorMessage(errorCodeDetails.getErrorMessage());\r
163       errorCode.setErrorType(errorCodeDetails.getErrorType());\r
164       errorCode.setErrorTag(errorCodeDetails.getErrorTag());\r
165       errorCode.setErrorSeverity(errorCodeDetails.getErrorSeverity());\r
166       netConfResponse.setErrorCode(errorCode);\r
167       netConfResponse.setErrorMessage(opResult.getFaultString());\r
168     } else if (opResult.getFaultKey() != null && opResult.getFaultString() != null) {\r
169       errorCode.setFaultCode(opResult.getFaultKey());\r
170       errorCode.setErrorMessage(opResult.getFaultString());\r
171       errorCode.setErrorType("application");\r
172       errorCode.setErrorTag("operation-failed");\r
173       errorCode.setErrorSeverity("ERROR");\r
174       netConfResponse.setErrorCode(errorCode);\r
175       netConfResponse.setErrorMessage(opResult.getFaultString());\r
176     }\r
177     netConfResponse.setNetconfResponseXml(\r
178         getNetconfResponseXML(opResult.getOperationResponse().getParameterDTOs(), swVersion,\r
179             hwVersion, isCustomparameter));\r
180     return netConfResponse;\r
181   }\r
182 \r
183   public NetConfResponse getNetconfResponseForSoftwareInventory(DeviceRPCResponse opResult,\r
184       String swVersion, String hwVersion) {\r
185 \r
186     NetConfResponse netConfResponse = new NetConfResponse();\r
187     ErrorCodeDetails errorCodeDetails = errorCodeUtil.getErrorCodeMetaData(opResult.getFaultKey());\r
188     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
189     if (errorCodeDetails != null) {\r
190       errorCode.setFaultCode(opResult.getFaultKey());\r
191       errorCode.setErrorMessage(errorCodeDetails.getErrorMessage());\r
192       errorCode.setErrorType(errorCodeDetails.getErrorType());\r
193       errorCode.setErrorTag(errorCodeDetails.getErrorTag());\r
194       errorCode.setErrorSeverity(errorCodeDetails.getErrorSeverity());\r
195       netConfResponse.setErrorCode(errorCode);\r
196       netConfResponse.setErrorMessage(opResult.getFaultString());\r
197       return netConfResponse;\r
198     } else if (opResult.getFaultKey() != null && opResult.getFaultString() != null) {\r
199       errorCode.setFaultCode(opResult.getFaultKey());\r
200       errorCode.setErrorMessage(opResult.getFaultString());\r
201       errorCode.setErrorType("application");\r
202       errorCode.setErrorTag("operation-failed");\r
203       errorCode.setErrorSeverity("ERROR");\r
204       netConfResponse.setErrorCode(errorCode);\r
205       netConfResponse.setErrorMessage(opResult.getFaultString());\r
206       return netConfResponse;\r
207     }\r
208     List<ParameterDTO> paramDTOList = new ArrayList<>();\r
209 \r
210     String build = null;\r
211     String productClass = null;\r
212     for (ParameterDTO paramDto : opResult.getOperationResponse().getParameterDTOs()) {\r
213       if (paramDto.getParamName().equals("Device.DeviceInfo.SoftwareVersion"))\r
214         build = paramDto.getParamValue();\r
215       else if (paramDto.getParamName().equals("Device.DeviceInfo.ProductClass"))\r
216         productClass = paramDto.getParamValue();\r
217     }\r
218 \r
219     String[] arrOfBuild = build.split("\\.");\r
220     String buildId = arrOfBuild[arrOfBuild.length - 1];\r
221     StringBuilder buildVersion = new StringBuilder();\r
222     for (int i = 0; i < arrOfBuild.length - 1; i++) {\r
223       if (i == arrOfBuild.length - 2) {\r
224         buildVersion.append(arrOfBuild[i]);\r
225       } else {\r
226         buildVersion.append(arrOfBuild[i]);\r
227         buildVersion.append(".");\r
228       }\r
229     }\r
230 \r
231     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.name", "Active Partition"));\r
232     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.status", "VALID"));\r
233     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.active", "true"));\r
234     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.running", "true"));\r
235     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.access", "READ_ONLY"));\r
236     paramDTOList\r
237         .add(new ParameterDTO("software-inventory.software-slot.product-code", productClass));\r
238     paramDTOList.add(\r
239         new ParameterDTO("software-inventory.software-slot.vendor-code", config.getVendorName()));\r
240     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.build-id", buildId));\r
241     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.build-version",\r
242         buildVersion.toString()));\r
243     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.files.name", "BC_ONE"));\r
244     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.files.integrity", "OK"));\r
245 \r
246     String XmlStr = getNetconfResponseXML(paramDTOList, swVersion, hwVersion, true);\r
247 \r
248     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\r
249     DocumentBuilder builder;\r
250     Document doc = null;\r
251     try {\r
252       builder = factory.newDocumentBuilder();\r
253       doc = builder.parse(new InputSource(new StringReader(XmlStr)));\r
254     } catch (Exception e) {\r
255       logger.error("Error while converting String to element" + e);\r
256       errorCode.setFaultCode("8002");\r
257       errorCode.setErrorMessage("Operation Aborted");\r
258       errorCode.setErrorType("application");\r
259       errorCode.setErrorTag("operation-failed");\r
260       errorCode.setErrorSeverity("ERROR");\r
261       netConfResponse.setErrorCode(errorCode);\r
262       netConfResponse.setErrorMessage("Operation Aborted");\r
263       return netConfResponse;\r
264     }\r
265 \r
266     Element originalDocumentElement = doc.getDocumentElement();\r
267     Element newDocumentElement = doc.createElementNS("urn:o-ran:software-management:1.0",\r
268         originalDocumentElement.getNodeName());\r
269     NodeList list = originalDocumentElement.getChildNodes();\r
270     while (list.getLength() != 0) {\r
271       newDocumentElement.appendChild(list.item(0));\r
272     }\r
273     // Replace the original element\r
274     doc.replaceChild(newDocumentElement, originalDocumentElement);\r
275 \r
276     String strxml = null;\r
277     try {\r
278       TransformerFactory transformerFactory = TransformerFactory.newInstance();\r
279       Transformer transformer = transformerFactory.newTransformer();\r
280       DOMSource source = new DOMSource(doc);\r
281       StreamResult result = new StreamResult(new StringWriter());\r
282       transformer.transform(source, result);\r
283       strxml = result.getWriter().toString();\r
284     } catch (Exception e) {\r
285       logger.error("Error while converting Element to String" + e);\r
286       errorCode.setFaultCode("8002");\r
287       errorCode.setErrorMessage("Operation Aborted");\r
288       errorCode.setErrorType("application");\r
289       errorCode.setErrorTag("operation-failed");\r
290       errorCode.setErrorSeverity("ERROR");\r
291       netConfResponse.setErrorCode(errorCode);\r
292       netConfResponse.setErrorMessage("Operation Aborted");\r
293       return netConfResponse;\r
294     }\r
295 \r
296     netConfResponse.setNetconfResponseXml(strxml);\r
297     logger.debug("NetConf Response XML String for software inventory: " + strxml);\r
298     return netConfResponse;\r
299   }\r
300 \r
301   private String getNetconfResponseXML(List<ParameterDTO> parameters, String swVersion,\r
302       String hwVersion, boolean isCustomparameter) {\r
303     if (null == parameters || parameters.isEmpty()) {\r
304       // LOG.debug("There are no parameters found in the response.");\r
305       return null;\r
306     }\r
307     Collections.sort(parameters, new SortByParamterName());\r
308 \r
309     String result = null;\r
310     try {\r
311       DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();\r
312       DocumentBuilder docBuilder = docFactory.newDocumentBuilder();\r
313       Document doc = docBuilder.newDocument();\r
314 \r
315       Map<String, Element> parentNodeMap = new HashMap<>();\r
316       Element dataNode = null; // root of all nodes\r
317 \r
318       for (ParameterDTO paramDto : parameters) {\r
319         String paramName = metaDataUtil.getNetconfNameByTR69NameWithIndexes(paramDto.getParamName(),\r
320             swVersion, hwVersion);\r
321         if (paramName == null && isCustomparameter) {\r
322           paramName = paramDto.getParamName();\r
323         }\r
324         String paramValue = paramDto.getParamValue();\r
325         if (paramValue == null || paramValue.trim().isEmpty()) {\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             continue;\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             parentNodeKey = parentNodeKey + "." + nodeName;\r
350             Element node = parentNodeMap.get(parentNodeKey);\r
351 \r
352             // create a tabular parent node if doesn't exit in MAP\r
353             if (null == node) {\r
354               if (metaDataUtil.getMetaDataByNetConfName(parentNodeKey + ".", swVersion,\r
355                   hwVersion) != null\r
356                   && metaDataUtil\r
357                       .getMetaDataByNetConfName(parentNodeKey + ".", swVersion, hwVersion)\r
358                       .getURI() != null) {\r
359                 node = doc.createElementNS(metaDataUtil\r
360                     .getMetaDataByNetConfName(parentNodeKey + ".", swVersion, hwVersion).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             parentNodeKey = parentNodeKey + "." + nodeName;\r
387             parentNodeName = nodeName;\r
388           } else {\r
389             // construct intermediate nodes\r
390             Element node = parentNodeMap.get(parentNodeKey);\r
391             if (null == node) {\r
392               if (metaDataUtil.getMetaDataByNetConfName(parentNodeKey, swVersion, hwVersion) != null\r
393                   && metaDataUtil.getMetaDataByNetConfName(parentNodeKey, swVersion, hwVersion)\r
394                       .getURI() != null) {\r
395                 node = doc.createElementNS(metaDataUtil\r
396                     .getMetaDataByNetConfName(parentNodeKey, swVersion, hwVersion).getURI(),\r
397                     parentNodeName);\r
398                 if (dataNode == null)\r
399                   dataNode = node;\r
400               } else {\r
401                 node = doc.createElement(parentNodeName);\r
402               }\r
403               parentNodeMap.put(parentNodeKey, node);\r
404               if (null != parentNode)\r
405                 parentNode.appendChild(node);\r
406 \r
407             }\r
408             parentNodeKey = parentNodeKey + "." + nodeName;\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 (parentNode != null)\r
417           parentNode.appendChild(leafNode);\r
418       }\r
419 \r
420       if (null != dataNode) {\r
421         result = convertDocumentToString(dataNode);\r
422       }\r
423     } catch (ParserConfigurationException pce) {\r
424       logger.error("Response xml formatting is failed : {} ", pce.toString());\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