Added hosttracker shell for karaf (rebased)
[controller.git] / opendaylight / md-sal / sal-remoterpc-connector / src / main / java / org / opendaylight / controller / remote / rpc / XmlUtils.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.controller.remote.rpc;
10
11 import com.google.common.base.Optional;
12 import org.opendaylight.yangtools.yang.common.QName;
13 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
14 import org.opendaylight.yangtools.yang.data.api.Node;
15 import org.opendaylight.yangtools.yang.data.api.SimpleNode;
16 import org.opendaylight.yangtools.yang.data.impl.XmlTreeBuilder;
17 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils;
18 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
19 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
20 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
21 import org.opendaylight.controller.netconf.util.xml.XmlUtil;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24 import org.w3c.dom.Document;
25 import org.xml.sax.SAXException;
26
27 import javax.activation.UnsupportedDataTypeException;
28 import javax.xml.stream.XMLStreamException;
29 import javax.xml.transform.OutputKeys;
30 import javax.xml.transform.Transformer;
31 import javax.xml.transform.TransformerException;
32 import javax.xml.transform.TransformerFactory;
33 import javax.xml.transform.dom.DOMSource;
34 import javax.xml.transform.stream.StreamResult;
35 import java.io.ByteArrayInputStream;
36 import java.io.IOException;
37 import java.io.StringWriter;
38 import java.util.Set;
39
40 public class XmlUtils {
41
42   private static final Logger LOG = LoggerFactory.getLogger(XmlUtils.class);
43
44   public static String inputCompositeNodeToXml(CompositeNode cNode, SchemaContext schemaContext){
45     if (cNode == null) return new String();
46
47     //Document domTree = NodeUtils.buildShadowDomTree(cNode);
48     Document domTree = null;
49     try {
50       Set<RpcDefinition> rpcs =  schemaContext.getOperations();
51       for(RpcDefinition rpc : rpcs) {
52         if(rpc.getQName().equals(cNode.getNodeType())){
53           domTree = XmlDocumentUtils.toDocument(cNode, rpc.getInput(), XmlDocumentUtils.defaultValueCodecProvider());
54           break;
55         }
56       }
57
58     } catch (UnsupportedDataTypeException e) {
59       LOG.error("Error during translation of CompositeNode to Document", e);
60     }
61     return domTransformer(domTree);
62   }
63
64   public static String outputCompositeNodeToXml(CompositeNode cNode, SchemaContext schemaContext){
65     if (cNode == null) return new String();
66
67     //Document domTree = NodeUtils.buildShadowDomTree(cNode);
68     Document domTree = null;
69     try {
70       Set<RpcDefinition> rpcs =  schemaContext.getOperations();
71       for(RpcDefinition rpc : rpcs) {
72         if(rpc.getQName().equals(cNode.getNodeType())){
73           domTree = XmlDocumentUtils.toDocument(cNode, rpc.getInput(), XmlDocumentUtils.defaultValueCodecProvider());
74           break;
75         }
76       }
77
78     } catch (UnsupportedDataTypeException e) {
79       LOG.error("Error during translation of CompositeNode to Document", e);
80     }
81     return domTransformer(domTree);
82   }
83
84   private static String domTransformer(Document domTree) {
85     StringWriter writer = new StringWriter();
86     try {
87       TransformerFactory tf = TransformerFactory.newInstance();
88       Transformer transformer = tf.newTransformer();
89       transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
90       transformer.transform(new DOMSource(domTree), new StreamResult(writer));
91     } catch (TransformerException e) {
92
93       LOG.error("Error during translation of Document to OutputStream", e);
94     }
95     LOG.debug("compositeNodeToXml " + writer.toString());
96
97     return writer.toString();
98   }
99
100   public static CompositeNode xmlToCompositeNode(String xml){
101     if (xml==null || xml.length()==0) return null;
102
103     Node<?> dataTree;
104     try {
105       dataTree = XmlTreeBuilder.buildDataTree(new ByteArrayInputStream(xml.getBytes()));
106     } catch (XMLStreamException e) {
107       LOG.error("Error during building data tree from XML", e);
108       return null;
109     }
110     if (dataTree == null) {
111       LOG.error("data tree is null");
112       return null;
113     }
114     if (dataTree instanceof SimpleNode) {
115       LOG.error("RPC XML was resolved as SimpleNode");
116       return null;
117     }
118     return (CompositeNode) dataTree;
119   }
120
121   public static CompositeNode inputXmlToCompositeNode(QName rpc, String xml,  SchemaContext schemaContext){
122     if (xml==null || xml.length()==0) return null;
123
124     Node<?> dataTree = null;
125     try {
126
127       Document doc = XmlUtil.readXmlToDocument(xml);
128       LOG.debug("xmlToCompositeNode Document is " + xml );
129       Set<RpcDefinition> rpcs =  schemaContext.getOperations();
130       for(RpcDefinition rpcDef : rpcs) {
131         if(rpcDef.getQName().equals(rpc)){
132           dataTree = XmlDocumentUtils.toDomNode(doc.getDocumentElement(), Optional.<DataSchemaNode>of(rpcDef.getInput()), Optional.of(XmlDocumentUtils.defaultValueCodecProvider()));
133           break;
134         }
135       }
136     } catch (SAXException e) {
137       LOG.error("Error during building data tree from XML", e);
138     } catch (IOException e) {
139       LOG.error("Error during building data tree from XML", e);
140     }
141
142     LOG.debug("xmlToCompositeNode " + dataTree.toString());
143     return (CompositeNode) dataTree;
144   }
145 }