416df8f5dfb14a3c2e7d0673f87fd2df9e823cf0
[oam/tr069-adapter.git] / netconf-server / src / main / java / org / commscope / tr069adapter / netconf / notification / NetConfSessionUtil.java
1 package org.commscope.tr069adapter.netconf.notification;\r
2 \r
3 import java.io.IOException;\r
4 import java.io.StringWriter;\r
5 import java.text.SimpleDateFormat;\r
6 import java.util.Date;\r
7 import java.util.HashMap;\r
8 import java.util.List;\r
9 import java.util.Map;\r
10 import java.util.StringTokenizer;\r
11 \r
12 import javax.xml.parsers.DocumentBuilder;\r
13 import javax.xml.parsers.DocumentBuilderFactory;\r
14 import javax.xml.parsers.ParserConfigurationException;\r
15 import javax.xml.transform.Transformer;\r
16 import javax.xml.transform.TransformerFactory;\r
17 import javax.xml.transform.dom.DOMSource;\r
18 import javax.xml.transform.stream.StreamResult;\r
19 \r
20 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
21 import org.commscope.tr069adapter.mapper.model.NetConfNotificationDTO;\r
22 import org.commscope.tr069adapter.netconf.rpc.CreateSubscription;\r
23 import org.opendaylight.netconf.api.NetconfMessage;\r
24 import org.opendaylight.netconf.api.xml.XmlNetconfConstants;\r
25 import org.opendaylight.netconf.api.xml.XmlUtil;\r
26 import org.slf4j.Logger;\r
27 import org.slf4j.LoggerFactory;\r
28 import org.springframework.stereotype.Component;\r
29 import org.w3c.dom.Document;\r
30 import org.w3c.dom.Element;\r
31 import org.xml.sax.SAXException;\r
32 \r
33 @Component\r
34 public class NetConfSessionUtil {\r
35 \r
36   private static final Logger LOG = LoggerFactory.getLogger(NetConfSessionUtil.class);\r
37 \r
38   private static final String INDEX_STR = "index";\r
39   private static final String INDEX_REGEX = "[0-9]{1,}";\r
40   private static final String NS_URI = "urn:onf:otcc:wireless:yang:tr069-notification";\r
41 \r
42   public void sendNetConfNotification(NetConfNotificationDTO netConNotifDTO) {\r
43     NetconfMessage netconfMessage = convertToNetConfMessage(netConNotifDTO);\r
44     LOG.debug("Notification converted to NetConf format" + netconfMessage);\r
45     CreateSubscription.sendNotification(netconfMessage, netConNotifDTO.getDeviceID());\r
46   }\r
47 \r
48   private NetconfMessage convertToNetConfMessage(NetConfNotificationDTO netConNotifDTO) {\r
49     try {\r
50       String nameSpace = "";\r
51       if (netConNotifDTO.getUri() != null) {\r
52         nameSpace = netConNotifDTO.getUri();\r
53       } else {\r
54         nameSpace = NS_URI;\r
55       }\r
56       return new NetconfMessage(\r
57           XmlUtil.readXmlToDocument(getNetconfResponseXML(netConNotifDTO, nameSpace)));\r
58     } catch (SAXException | IOException e) {\r
59       throw new IllegalArgumentException("Cannot parse notifications", e);\r
60     }\r
61   }\r
62 \r
63   private static String getNetconfResponseXML(NetConfNotificationDTO netConNotifDTO,\r
64       String nameSpace) {\r
65     if (netConNotifDTO == null || netConNotifDTO.getParameters().isEmpty()) {\r
66       LOG.debug("There are no parameters found in the response.");\r
67       return null;\r
68     }\r
69 \r
70     List<ParameterDTO> parameters = netConNotifDTO.getParameters();\r
71 \r
72     String result = null;\r
73     try {\r
74       DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();\r
75       DocumentBuilder docBuilder = docFactory.newDocumentBuilder();\r
76       Document doc = docBuilder.newDocument();\r
77 \r
78       Map<String, Element> parentNodeMap = new HashMap<>();\r
79       Element dataNode = null; // root of all nodes\r
80 \r
81       for (ParameterDTO paramDto : parameters) {\r
82         String paramName = paramDto.getParamName();\r
83         String paramValue = paramDto.getParamValue();\r
84         StringTokenizer tokenizer = new StringTokenizer(paramName, ".");\r
85         String parentNodeName = null;\r
86         String parentNodeKey = null;\r
87         Element parentNode = null;\r
88         while (tokenizer.hasMoreElements()) {\r
89           String nodeName = (String) tokenizer.nextElement();\r
90           if (null == parentNodeName) { // construct first node or\r
91                                         // Device node\r
92             parentNodeName = nodeName;\r
93             parentNodeKey = nodeName;\r
94             // check if the node already exists in parentNodeMap\r
95             parentNode = parentNodeMap.get(parentNodeKey);\r
96             if (null == dataNode) {\r
97               dataNode = parentNode;\r
98             }\r
99             continue;\r
100           } else if (nodeName.matches(INDEX_REGEX)) { // construct\r
101                                                       // tabular and\r
102                                                       // index nodes\r
103 \r
104             // get parent tabular node from parent MAP\r
105             parentNodeKey = parentNodeKey + "." + nodeName;\r
106             Element node = parentNodeMap.get(parentNodeKey);\r
107 \r
108             // create a tabular parent node if doesn't exit in MAP\r
109             if (null == node) {\r
110               node = doc.createElement(parentNodeName);\r
111               parentNodeMap.put(parentNodeKey, node);\r
112 \r
113               // update current tabular parent node.\r
114               if (null != parentNode)\r
115                 parentNode.appendChild(node);\r
116               else\r
117                 parentNode = node;\r
118 \r
119               // prepare and add index node to tabular parent node\r
120               Element indexNode = doc.createElement(INDEX_STR);\r
121               indexNode.setTextContent(nodeName);\r
122               node.appendChild(indexNode);\r
123             }\r
124             parentNode = node; // move parent to child\r
125             parentNodeName = nodeName;\r
126           } else if (parentNodeName.matches(INDEX_REGEX)) { // move to\r
127                                                             // next\r
128                                                             // node\r
129                                                             // if\r
130                                                             // tabular\r
131                                                             // attribute\r
132                                                             // is\r
133                                                             // found\r
134             parentNodeKey = parentNodeKey + "." + nodeName;\r
135             parentNodeName = nodeName;\r
136           } else {\r
137             // construct intermediate nodes\r
138             Element node = parentNodeMap.get(parentNodeKey);\r
139             if (null == node) {\r
140               if (null == dataNode) {\r
141                 node = doc.createElementNS(nameSpace, parentNodeName);\r
142                 dataNode = node;\r
143               } else {\r
144                 node = doc.createElement(parentNodeName);\r
145               }\r
146               parentNodeMap.put(parentNodeKey, node);\r
147               if (null != parentNode)\r
148                 parentNode.appendChild(node);\r
149             }\r
150             parentNodeKey = parentNodeKey + "." + nodeName;\r
151             parentNodeName = nodeName;\r
152             parentNode = node;\r
153           }\r
154         }\r
155         // construct leaf node\r
156         Element leafNode = doc.createElement(parentNodeName);\r
157         leafNode.setTextContent(paramValue);\r
158         parentNode.appendChild(leafNode);\r
159       }\r
160 \r
161       if (null != dataNode) {\r
162         final Element element = doc.createElement(XmlNetconfConstants.NOTIFICATION_ELEMENT_NAME);\r
163         final Element eventTime = doc.createElement(XmlNetconfConstants.EVENT_TIME);\r
164         eventTime\r
165             .setTextContent(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX").format(new Date()));\r
166         element.appendChild(element.getOwnerDocument().importNode(eventTime, true));\r
167 \r
168         if (netConNotifDTO.getNotificationType() != null) {\r
169           final Element evtTypeElement =\r
170               doc.createElementNS(nameSpace, netConNotifDTO.getNotificationType());\r
171           evtTypeElement.appendChild(dataNode);\r
172           element.appendChild(element.getOwnerDocument().importNode(evtTypeElement, true));\r
173         } else {\r
174           element.appendChild(element.getOwnerDocument().importNode(dataNode, true));\r
175         }\r
176 \r
177         result = convertDocumentToString(element);\r
178       }\r
179     } catch (ParserConfigurationException pce) {\r
180       pce.printStackTrace();\r
181     }\r
182 \r
183     return result;\r
184   }\r
185 \r
186   public static String convertDocumentToString(Element element) {\r
187     String strxml = null;\r
188     try {\r
189       TransformerFactory transformerFactory = TransformerFactory.newInstance();\r
190       Transformer transformer = transformerFactory.newTransformer();\r
191       DOMSource source = new DOMSource(element);\r
192       StreamResult result = new StreamResult(new StringWriter());\r
193       transformer.transform(source, result);\r
194       strxml = result.getWriter().toString();\r
195     } catch (Exception e) {\r
196       LOG.error("Error while converting Element to String" + e);\r
197     }\r
198     LOG.debug("Converted XML is : " + strxml);\r
199     return strxml;\r
200   }\r
201 \r
202 }\r