2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.controller.remote.rpc;
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;
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;
40 public class XmlUtils {
42 private static final Logger LOG = LoggerFactory.getLogger(XmlUtils.class);
44 public static String inputCompositeNodeToXml(CompositeNode cNode, SchemaContext schemaContext){
45 if (cNode == null) return new String();
47 //Document domTree = NodeUtils.buildShadowDomTree(cNode);
48 Document domTree = null;
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());
58 } catch (UnsupportedDataTypeException e) {
59 LOG.error("Error during translation of CompositeNode to Document", e);
61 return domTransformer(domTree);
64 public static String outputCompositeNodeToXml(CompositeNode cNode, SchemaContext schemaContext){
65 if (cNode == null) return new String();
67 //Document domTree = NodeUtils.buildShadowDomTree(cNode);
68 Document domTree = null;
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());
78 } catch (UnsupportedDataTypeException e) {
79 LOG.error("Error during translation of CompositeNode to Document", e);
81 return domTransformer(domTree);
84 private static String domTransformer(Document domTree) {
85 StringWriter writer = new StringWriter();
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) {
93 LOG.error("Error during translation of Document to OutputStream", e);
95 LOG.debug("compositeNodeToXml " + writer.toString());
97 return writer.toString();
100 public static CompositeNode xmlToCompositeNode(String xml){
101 if (xml==null || xml.length()==0) return null;
105 dataTree = XmlTreeBuilder.buildDataTree(new ByteArrayInputStream(xml.getBytes()));
106 } catch (XMLStreamException e) {
107 LOG.error("Error during building data tree from XML", e);
110 if (dataTree == null) {
111 LOG.error("data tree is null");
114 if (dataTree instanceof SimpleNode) {
115 LOG.error("RPC XML was resolved as SimpleNode");
118 return (CompositeNode) dataTree;
121 public static CompositeNode inputXmlToCompositeNode(QName rpc, String xml, SchemaContext schemaContext){
122 if (xml==null || xml.length()==0) return null;
124 Node<?> dataTree = null;
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()));
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);
142 LOG.debug("xmlToCompositeNode " + dataTree.toString());
143 return (CompositeNode) dataTree;