1 package org.commscope.tr069adapter.netconf.notification;
\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
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
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
34 public class NetConfSessionUtil {
\r
36 private static final Logger LOG = LoggerFactory.getLogger(NetConfSessionUtil.class);
\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
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
48 private NetconfMessage convertToNetConfMessage(NetConfNotificationDTO netConNotifDTO) {
\r
50 String nameSpace = "";
\r
51 if (netConNotifDTO.getUri() != null) {
\r
52 nameSpace = netConNotifDTO.getUri();
\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
63 private static String getNetconfResponseXML(NetConfNotificationDTO netConNotifDTO,
\r
65 if (netConNotifDTO == null || netConNotifDTO.getParameters().isEmpty()) {
\r
66 LOG.debug("There are no parameters found in the response.");
\r
70 List<ParameterDTO> parameters = netConNotifDTO.getParameters();
\r
72 String result = null;
\r
74 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
\r
75 DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
\r
76 Document doc = docBuilder.newDocument();
\r
78 Map<String, Element> parentNodeMap = new HashMap<>();
\r
79 Element dataNode = null; // root of all nodes
\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
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
100 } else if (nodeName.matches(INDEX_REGEX)) { // construct
\r
104 // get parent tabular node from parent MAP
\r
105 parentNodeKey = parentNodeKey + "." + nodeName;
\r
106 Element node = parentNodeMap.get(parentNodeKey);
\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
113 // update current tabular parent node.
\r
114 if (null != parentNode)
\r
115 parentNode.appendChild(node);
\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
124 parentNode = node; // move parent to child
\r
125 parentNodeName = nodeName;
\r
126 } else if (parentNodeName.matches(INDEX_REGEX)) { // move to
\r
134 parentNodeKey = parentNodeKey + "." + nodeName;
\r
135 parentNodeName = nodeName;
\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
144 node = doc.createElement(parentNodeName);
\r
146 parentNodeMap.put(parentNodeKey, node);
\r
147 if (null != parentNode)
\r
148 parentNode.appendChild(node);
\r
150 parentNodeKey = parentNodeKey + "." + nodeName;
\r
151 parentNodeName = nodeName;
\r
155 // construct leaf node
\r
156 Element leafNode = doc.createElement(parentNodeName);
\r
157 leafNode.setTextContent(paramValue);
\r
158 parentNode.appendChild(leafNode);
\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
165 .setTextContent(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX").format(new Date()));
\r
166 element.appendChild(element.getOwnerDocument().importNode(eventTime, true));
\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
174 element.appendChild(element.getOwnerDocument().importNode(dataNode, true));
\r
177 result = convertDocumentToString(element);
\r
179 } catch (ParserConfigurationException pce) {
\r
180 pce.printStackTrace();
\r
186 public static String convertDocumentToString(Element element) {
\r
187 String strxml = null;
\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
198 LOG.debug("Converted XML is : " + strxml);
\r