4f5f9cff62ddd34cba94728423948bcc4b991e89
[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 \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       docFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");\r
313       docFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");\r
314       DocumentBuilder docBuilder = docFactory.newDocumentBuilder();\r
315       Document doc = docBuilder.newDocument();\r
316 \r
317       Map<String, Element> parentNodeMap = new HashMap<>();\r
318       Element dataNode = null; // root of all nodes\r
319 \r
320       for (ParameterDTO paramDto : parameters) {\r
321         String paramName = metaDataUtil.getNetconfNameByTR69NameWithIndexes(paramDto.getParamName(),\r
322             swVersion, hwVersion);\r
323         if (paramName == null && isCustomparameter) {\r
324           paramName = paramDto.getParamName();\r
325         }\r
326         String paramValue = paramDto.getParamValue();\r
327         if (paramValue == null || paramValue.trim().isEmpty()) {\r
328           logger.debug("Values is empty so skipping this parameter.");\r
329           continue;\r
330         }\r
331         StringTokenizer tokenizer = new StringTokenizer(paramName, ".");\r
332         String parentNodeName = null;\r
333         String parentNodeKey = null;\r
334         Element parentNode = null;\r
335         while (tokenizer.hasMoreElements()) {\r
336           String nodeName = (String) tokenizer.nextElement();\r
337           if (null == parentNodeName) { // construct first node or\r
338                                         // Device node\r
339             parentNodeName = nodeName;\r
340             parentNodeKey = nodeName;\r
341             // check if the node already exists in parentNodeMap\r
342             parentNode = parentNodeMap.get(parentNodeKey);\r
343             if (null == dataNode) {\r
344               dataNode = parentNode;\r
345             }\r
346 \r
347           } else if (nodeName.matches(INDEX_REGEX)) { // construct\r
348                                                       // tabular and\r
349                                                       // index nodes\r
350 \r
351             // get parent tabular node from parent MAP\r
352             StringBuilder bld = new StringBuilder(parentNodeKey);\r
353             bld.append(".");\r
354             bld.append(nodeName);\r
355             parentNodeKey = bld.toString();\r
356             Element node = parentNodeMap.computeIfPresent(parentNodeKey, (k, v) -> v);\r
357 \r
358             // create a tabular parent node if doesn't exit in MAP\r
359             if (null == node) {\r
360               if (metaDataUtil.getMetaDataByNetConfName(parentNodeKey + ".", swVersion,\r
361                   hwVersion) != null\r
362                   && metaDataUtil\r
363                       .getMetaDataByNetConfName(parentNodeKey + ".", swVersion, hwVersion)\r
364                       .getURI() != null) {\r
365                 node = doc.createElementNS(metaDataUtil\r
366                     .getMetaDataByNetConfName(parentNodeKey + ".", swVersion, hwVersion).getURI(),\r
367                     parentNodeName);\r
368               } else {\r
369                 node = doc.createElement(parentNodeName);\r
370               }\r
371               parentNodeMap.put(parentNodeKey, node);\r
372 \r
373               // update current tabular parent node.\r
374               if (null != parentNode)\r
375                 parentNode.appendChild(node);\r
376 \r
377               // prepare and add index node to tabular parent node\r
378               Element indexNode = doc.createElement(INDEX_STR);\r
379               indexNode.setTextContent(nodeName);\r
380               node.appendChild(indexNode);\r
381             }\r
382             parentNode = node; // move parent to child\r
383             parentNodeName = nodeName;\r
384           } else if (parentNodeName.matches(INDEX_REGEX)) { // move to\r
385                                                             // next\r
386                                                             // node\r
387                                                             // if\r
388                                                             // tabular\r
389                                                             // attribute\r
390                                                             // is\r
391                                                             // found\r
392             StringBuilder bld = new StringBuilder(parentNodeName);\r
393             bld.append(".");\r
394             bld.append(nodeName);\r
395             parentNodeKey = bld.toString();\r
396             parentNodeName = nodeName;\r
397           } else {\r
398             // construct intermediate nodes\r
399             Element node = parentNodeMap.get(parentNodeKey);\r
400             if (null == node) {\r
401               if (metaDataUtil.getMetaDataByNetConfName(parentNodeKey, swVersion, hwVersion) != null\r
402                   && metaDataUtil.getMetaDataByNetConfName(parentNodeKey, swVersion, hwVersion)\r
403                       .getURI() != null) {\r
404                 node = doc.createElementNS(metaDataUtil\r
405                     .getMetaDataByNetConfName(parentNodeKey, swVersion, hwVersion).getURI(),\r
406                     parentNodeName);\r
407                 if (dataNode == null)\r
408                   dataNode = node;\r
409               } else {\r
410                 node = doc.createElement(parentNodeName);\r
411               }\r
412               parentNodeMap.put(parentNodeKey, node);\r
413               if (null != parentNode)\r
414                 parentNode.appendChild(node);\r
415 \r
416             }\r
417             StringBuilder bld = new StringBuilder(parentNodeKey);\r
418             bld.append(".");\r
419             bld.append(nodeName);\r
420             parentNodeKey = bld.toString();\r
421             parentNodeName = nodeName;\r
422             parentNode = node;\r
423           }\r
424         }\r
425         // construct leaf node\r
426         Element leafNode = doc.createElement(parentNodeName);\r
427         leafNode.setTextContent(paramValue);\r
428         if (null != parentNode)\r
429           parentNode.appendChild(leafNode);\r
430       }\r
431 \r
432       if (null != dataNode) {\r
433         result = NetconfToTr069MapperUtil.convertDocumentToString(dataNode);\r
434       }\r
435     } catch (ParserConfigurationException pce) {\r
436       logger.error("Exception : {}", pce.getMessage());\r
437     }\r
438 \r
439     return result;\r
440   }\r
441 \r
442   public static String convertDocumentToString(Element element) {\r
443     String strxml = null;\r
444     try {\r
445       TransformerFactory transformerFactory = TransformerFactory.newInstance();\r
446       transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");\r
447       transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");\r
448       Transformer transformer = transformerFactory.newTransformer();\r
449       DOMSource source = new DOMSource(element);\r
450       StreamResult result = new StreamResult(new StringWriter());\r
451       transformer.transform(source, result);\r
452       strxml = result.getWriter().toString();\r
453     } catch (Exception e) {\r
454       logger.error("Error while converting Element to String {}", e.toString());\r
455     }\r
456     logger.debug("Converted XML is : {} ", strxml);\r
457     return strxml;\r
458   }\r
459 \r
460   // TODO: Need to optimize the Node element logic for better performance\r
461   private static Map<String, String> getParameterMapForNode(Node moRNode, int numberOfChilds) {\r
462     Map<String, String> result = new HashMap<>();\r
463     if (moRNode.getNodeType() == Node.ELEMENT_NODE) {\r
464       NodeList childs = moRNode.getChildNodes();\r
465       boolean hasChildElements = false;\r
466       hasChildElements = checkMoreElements(result, childs, hasChildElements);\r
467       if (!hasChildElements) {\r
468         String moName = getMOName(moRNode);\r
469         if (moName.equals("software-inventory")) {\r
470           result.put("device.device-info.software-version", moRNode.getTextContent());\r
471           result.put("device.device-info.product-class", moRNode.getTextContent());\r
472         } else if (!moName.endsWith("." + INDEX_STR)) {\r
473           result.put(moName, moRNode.getTextContent());\r
474         } else if (numberOfChilds == 1) {\r
475           result.put(moName, moRNode.getTextContent());\r
476         }\r
477       }\r
478     }\r
479 \r
480     return result;\r
481   }\r
482 \r
483   private static boolean checkMoreElements(Map<String, String> result, NodeList childs,\r
484       boolean hasChildElements) {\r
485     if (childs.getLength() > 0) {\r
486       int counter = 0;\r
487       for (int i = 0; i < childs.getLength(); i++) {\r
488         Node cNode = childs.item(i);\r
489         if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
490           counter++;\r
491         }\r
492       }\r
493 \r
494       for (int i = 0; i < childs.getLength(); i++) {\r
495         Node cNode = childs.item(i);\r
496         if (cNode != null && cNode.getNodeType() == Node.ELEMENT_NODE) {\r
497           hasChildElements = true;\r
498           Map<String, String> subResult = getParameterMapForNode(cNode, counter);\r
499           result.putAll(subResult);\r
500         }\r
501       }\r
502     }\r
503     return hasChildElements;\r
504   }\r
505 \r
506   private static String getMOName(Node moRNode) {\r
507     String result = removeNS(moRNode.getNodeName());\r
508     Node pNode = moRNode;\r
509     while (true) {\r
510       pNode = pNode.getParentNode();\r
511       if (pNode == null || pNode.getNodeType() != Node.ELEMENT_NODE\r
512           || pNode.getNodeName().equals("edit-config") || pNode.getNodeName().equals("config")\r
513           || pNode.getNodeName().equals("get-config") || pNode.getNodeName().equals("filter")\r
514           || pNode.getNodeName().equals("get")) {\r
515         return result;\r
516       } else {\r
517         String indexStr = getMOIndex(pNode);\r
518         StringBuilder bld = new StringBuilder(removeNS(pNode.getNodeName()));\r
519         bld.append(".");\r
520         if (indexStr == null) {\r
521           bld.append(result);\r
522           result = bld.toString();\r
523         } else {\r
524           bld.append(indexStr);\r
525           bld.append(".");\r
526           bld.append(result);\r
527           result = bld.toString();\r
528         }\r
529       }\r
530     }\r
531   }\r
532 \r
533   private static Node getParameterDataNode(Document el, String docStart, String filterElement) {\r
534     NodeList nodeList = el.getElementsByTagName(docStart);\r
535     if (nodeList.getLength() > 0) {\r
536       nodeList = nodeList.item(0).getChildNodes();\r
537       for (int i = 0; i < nodeList.getLength(); i++) {\r
538         Node node = nodeList.item(i);\r
539         String nodeName = removeNS(node.getNodeName());\r
540         if (nodeName.equals(filterElement)) {\r
541           return node;\r
542         }\r
543       }\r
544     }\r
545     return null;\r
546   }\r
547 \r
548   private static Node getDeviceDataNode(Element el, String filter) {\r
549     try {\r
550       NodeList nodeList = el.getElementsByTagName(filter);\r
551       if (nodeList.getLength() > 0) {\r
552         nodeList = nodeList.item(0).getChildNodes();\r
553         for (int i = 0; i < nodeList.getLength(); i++) {\r
554           Node node = nodeList.item(i);\r
555           if (node.getNodeType() == Node.ELEMENT_NODE) {\r
556             return node;\r
557           }\r
558         }\r
559       }\r
560     } catch (Exception e) {\r
561       logger.error("exception occured while parsing the request xml {}", e.getMessage());\r
562     }\r
563     return null;\r
564   }\r
565 \r
566   private static String removeNS(String nodeName) {\r
567     // remove name space\r
568     int li = nodeName.lastIndexOf(':');\r
569     nodeName = nodeName.substring(li + 1);\r
570     return nodeName;\r
571   }\r
572 \r
573   private static String getMOIndex(Node pNode) {\r
574     if (null != pNode) {\r
575       NodeList nodeList = pNode.getChildNodes();\r
576       for (int i = 0; i < nodeList.getLength(); i++) {\r
577         Node childNode = nodeList.item(i);\r
578         String nodeName = removeNS(childNode.getNodeName());\r
579         if (nodeName.equalsIgnoreCase(INDEX_STR)) {\r
580           return childNode.getTextContent();\r
581         }\r
582       }\r
583     }\r
584     return null;\r
585   }\r
586 \r
587 }\r
588 \r
589 \r
590 class SortByParamterName implements Comparator<ParameterDTO>, Serializable {\r
591   private static final long serialVersionUID = 3010693349267067945L;\r
592 \r
593   public int compare(ParameterDTO a, ParameterDTO b) {\r
594     return a.getParamName().compareTo(b.getParamName());\r
595   }\r
596 }\r