blob: 915863ed2e1e5cf4f7a9f0a95d68e87366ad57d7 [file] [log] [blame]
Shankara-Huaweid5823ab2016-11-22 10:14:52 +05301/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.yms.app.ych.defaultcodecs.xml;
18
19import org.dom4j.Document;
20import org.dom4j.DocumentException;
21import org.dom4j.DocumentHelper;
22import org.dom4j.Element;
23import org.dom4j.Namespace;
24import org.onosproject.yms.app.ych.YchException;
25import org.onosproject.yms.app.ych.defaultcodecs.netconf.NetconfCodec;
26import org.onosproject.yms.app.ych.defaultcodecs.utils.DefaultCodecUtils;
27import org.onosproject.yms.app.ydt.DefaultYdtWalker;
28import org.onosproject.yms.app.ydt.YangRequestWorkBench;
29import org.onosproject.yms.app.ydt.YdtExtendedBuilder;
30import org.onosproject.yms.app.ydt.YdtExtendedContext;
31import org.onosproject.yms.app.ydt.YdtExtendedWalker;
32import org.onosproject.yms.app.ysr.YangSchemaRegistry;
33import org.onosproject.yms.ych.YangCompositeEncoding;
34import org.onosproject.yms.ych.YangDataTreeCodec;
35import org.onosproject.yms.ydt.YdtBuilder;
36import org.onosproject.yms.ydt.YmsOperationType;
37
38import java.util.Map;
39
40import static org.onosproject.yms.ych.YangProtocolEncodingFormat.XML;
41import static org.onosproject.yms.ydt.YdtContextOperationType.CREATE;
42
43/**
44 * Represents an implementation of YCH data tree codec interface.
45 */
46public class DefaultXmlCodec implements YangDataTreeCodec {
47
48 private static final String E_RESTCONF_ROOT = "/onos/restconf";
49 private static final String E_YDT_ROOT_NODE = "YDT extended root node " +
50 "is null.";
51 private static final String E_ROOT_ELEMENT = "Root element in XML " +
52 "input string is not well-formed.";
53 private static final String E_ROOT_KEY_ELEMENT = "Root element " +
54 "(filter, config, data) in XML input string is not found.";
55
56
57 /**
58 * Creates a new YANG xml codec.
59 */
60 public DefaultXmlCodec() {
61 }
62
63 /**
64 * Returns the xml string from YDT.
65 *
66 * @param ydtBuilder YDT builder
67 * @return the xml string from YDT
68 */
69 private String buildXmlForYdt(YdtBuilder ydtBuilder) {
70
71 YdtExtendedBuilder extBuilder = (YdtExtendedBuilder) ydtBuilder;
72 YdtExtendedContext rootNode = extBuilder.getRootNode();
73
74 if (rootNode == null) {
75 throw new YchException(E_YDT_ROOT_NODE);
76 }
77
78 // Creating the root element for xml.
79 Element rootElement =
80 DocumentHelper.createDocument().addElement(rootNode.getName());
81
82 // Adding the name space if exist for root name.
83 if (rootNode.getNamespace() != null) {
84 rootElement.add(Namespace.get(rootNode.getNamespace()));
85 }
86
87 // Adding the attribute if exist
88 Map<String, String> tagAttrMap = extBuilder.getRootTagAttributeMap();
89 if (tagAttrMap != null && !tagAttrMap.isEmpty()) {
90 for (Map.Entry<String, String> attr : tagAttrMap.entrySet()) {
91 rootElement.addAttribute(attr.getKey(), attr.getValue());
92 }
93 }
94
95 XmlCodecYdtListener listener = new XmlCodecYdtListener(XML, rootNode);
96 listener.getElementStack().push(rootElement);
97
98 // Walk through YDT and build the xml.
99 YdtExtendedWalker extWalker = new DefaultYdtWalker();
100 extWalker.walk(listener, rootNode);
101
102 return rootElement.asXML();
103 }
104
105 @Override
106 public String encodeYdtToProtocolFormat(YdtBuilder ydtBuilder) {
107 return buildXmlForYdt(ydtBuilder);
108 }
109
110 @Override
111 public YangCompositeEncoding encodeYdtToCompositeProtocolFormat(
112 YdtBuilder ydtBuilder) {
113
114 YangCompositeEncodingImpl encoding = new YangCompositeEncodingImpl();
115 encoding.setResourceIdentifier(null);
116 encoding.setResourceInformation(buildXmlForYdt(ydtBuilder));
117 return encoding;
118 }
119
120 @Override
121 public YdtBuilder decodeCompositeProtocolDataToYdt(
122 YangCompositeEncoding protoData,
123 Object schemaReg,
124 YmsOperationType opType) {
125
126 YdtExtendedBuilder extBuilder =
127 new YangRequestWorkBench(E_RESTCONF_ROOT, null,
128 opType,
129 (YangSchemaRegistry) schemaReg,
130 false);
131
132 DefaultCodecUtils.convertUriToYdt(protoData.getResourceIdentifier(),
133 extBuilder,
134 CREATE);
135 Document document;
136
137 try {
138 document = DocumentHelper
139 .parseText(protoData.getResourceInformation());
140 } catch (DocumentException e) {
141 throw new YchException(E_ROOT_ELEMENT);
142 }
143
144 XmlCodecListener listener = new XmlCodecListener();
145 listener.setYdtExtBuilder(extBuilder);
146
147 // Walk through xml and build the yang data tree.
148 XmlWalker walker = new DefaultXmlCodecWalker();
149 walker.walk(listener, document.getRootElement(),
150 document.getRootElement());
151 return extBuilder;
152 }
153
154 @Override
155 public YdtBuilder decodeProtocolDataToYdt(String protoData,
156 Object schemaReg,
157 YmsOperationType opType) {
158 Document document;
159
160 try {
161 document = DocumentHelper.parseText(protoData);
162 } catch (DocumentException e) {
163 throw new YchException(E_ROOT_ELEMENT);
164 }
165
166 NetconfCodec codec = new NetconfCodec();
167 // Find the root element in xml string
168 Element rootElement =
169 codec.getDataRootElement(document.getRootElement(), opType);
170
171 if (rootElement == null) {
172 throw new YchException(E_ROOT_KEY_ELEMENT);
173 }
174
175 // Get the YDT builder for the logical root name.
176 YdtExtendedBuilder extBuilder =
177 new YangRequestWorkBench(rootElement.getName(),
178 rootElement.getNamespaceURI(),
179 opType,
180 (YangSchemaRegistry) schemaReg,
181 false);
182
183 XmlCodecListener listener = new XmlCodecListener();
184 listener.setYdtExtBuilder(extBuilder);
185 // Walk through xml and build the yang data tree.
186 XmlWalker walker = new DefaultXmlCodecWalker();
187 walker.walk(listener, rootElement, rootElement);
188 return extBuilder;
189 }
190}