blob: 8847c41f85dbe5a0bf8d46273cd9d4298fc87427 [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;
18
19import org.onosproject.yms.app.ych.defaultcodecs.YangCodecRegistry;
20import org.onosproject.yms.app.ydt.YdtExtendedBuilder;
21import org.onosproject.yms.app.ydt.YdtExtendedContext;
22import org.onosproject.yms.app.yob.DefaultYobBuilder;
23import org.onosproject.yms.app.ysr.YangSchemaRegistry;
24import org.onosproject.yms.app.ytb.DefaultYangTreeBuilder;
25import org.onosproject.yms.app.ytb.YtbException;
26import org.onosproject.yms.ych.YangCodecHandler;
27import org.onosproject.yms.ych.YangCompositeEncoding;
28import org.onosproject.yms.ych.YangDataTreeCodec;
29import org.onosproject.yms.ych.YangProtocolEncodingFormat;
30import org.onosproject.yms.ydt.YdtBuilder;
31import org.onosproject.yms.ydt.YdtContext;
32import org.onosproject.yms.ydt.YmsOperationType;
sonu guptaeff184b2016-11-24 12:43:49 +053033import org.onosproject.yms.ysr.YangModuleLibrary;
Shankara-Huaweid5823ab2016-11-22 10:14:52 +053034
35import java.util.ArrayList;
36import java.util.HashMap;
37import java.util.List;
38import java.util.Map;
39
Shankara-Huaweid5823ab2016-11-22 10:14:52 +053040
41/**
42 * Represents implementation of YANG SBI broker interfaces.
43 * YCH acts as a broker between YMS and driver/provider.
44 */
45public class DefaultYangCodecHandler implements YangCodecHandler {
46
47 private static final String E_MODULE_LIST = "The input module or " +
48 "sub-module object list cannot be null.";
49 private static final String E_DATA_TREE_CODEC = "data tree codec handler" +
50 " is null.";
51
52 /**
53 * Schema registry for driver.
54 */
55 private final YangSchemaRegistry schemaRegistry;
sonu guptaeff184b2016-11-24 12:43:49 +053056 private YangModuleLibrary library;
Shankara-Huaweid5823ab2016-11-22 10:14:52 +053057
58 /**
59 * Default codecs.
60 */
61 private final Map<YangProtocolEncodingFormat, YangDataTreeCodec>
62 defaultCodecs = new HashMap<>();
63
64 /**
65 * Override codec handler.
66 */
67 private final Map<YangProtocolEncodingFormat, YangDataTreeCodec>
68 overrideCodecs = new HashMap<>();
69
70 /**
71 * Creates a new YANG codec handler.
72 *
73 * @param registry YANG schema registry
74 */
75 public DefaultYangCodecHandler(YangSchemaRegistry registry) {
76 schemaRegistry = registry;
77
78 // update the default codecs from codec registry
79 Map<YangProtocolEncodingFormat, YangDataTreeCodec> recvCodec =
80 YangCodecRegistry.getDefaultCodecs();
81 if (!recvCodec.isEmpty()) {
82 for (Map.Entry<YangProtocolEncodingFormat, YangDataTreeCodec>
83 codecEntry : recvCodec.entrySet()) {
84 defaultCodecs.put(codecEntry.getKey(), codecEntry.getValue());
85 }
86 }
87 }
88
89 private YangDataTreeCodec getAppropriateCodec(
90 YangProtocolEncodingFormat dataFormat) {
91 YangDataTreeCodec codec = defaultCodecs.get(dataFormat);
92
sonu guptaeff184b2016-11-24 12:43:49 +053093 int size = overrideCodecs.size();
Shankara-Huaweid5823ab2016-11-22 10:14:52 +053094 // Check over ridden codec handler is exist or not.
sonu guptaeff184b2016-11-24 12:43:49 +053095 if (size != 0) {
Shankara-Huaweid5823ab2016-11-22 10:14:52 +053096 YangDataTreeCodec overrideCodec = overrideCodecs.get(dataFormat);
97 if (overrideCodec != null) {
98 codec = overrideCodec;
99 }
100 }
101 return codec;
102 }
103
104 @Override
105 public void addDeviceSchema(Class<?> yangModule) {
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +0530106 schemaRegistry.registerApplication(null, yangModule);
sonu guptaeff184b2016-11-24 12:43:49 +0530107 schemaRegistry.processModuleLibrary(yangModule.getName(), library);
Shankara-Huaweid5823ab2016-11-22 10:14:52 +0530108 }
109
110 @Override
111 public String encodeOperation(String rootName,
112 String rootNamespace,
113 Map<String, String> tagAttrMap,
114 List<Object> moduleList,
115 YangProtocolEncodingFormat dataFormat,
116 YmsOperationType opType) {
117
118 if (moduleList == null || moduleList.isEmpty()) {
119 throw new YchException(E_MODULE_LIST);
120 }
121
122 // Get the default codec handler.
123 YangDataTreeCodec codec = getAppropriateCodec(dataFormat);
124 if (codec == null) {
125 throw new YchException(E_DATA_TREE_CODEC);
126 }
127
128 // Get yang data tree from YTB for the received objects.
129 DefaultYangTreeBuilder builder = new DefaultYangTreeBuilder();
130 YdtExtendedBuilder encodedYdt =
131 builder.getYdtBuilderForYo(moduleList, rootName,
132 rootNamespace, opType,
133 schemaRegistry);
134
135 encodedYdt.setRootTagAttributeMap(tagAttrMap);
136
137 // Get the xml string form codec handler.
138 return codec.encodeYdtToProtocolFormat(encodedYdt);
139 }
140
141 @Override
142 public YangCompositeEncoding encodeCompositeOperation(
143 String rootName,
144 String rootNamespace,
145 Object moduleObject,
146 YangProtocolEncodingFormat dataFormat,
147 YmsOperationType opType) {
148
149 if (moduleObject == null) {
150 throw new YtbException(E_MODULE_LIST);
151 }
152
153 // Get the default codec handler.
154 YangDataTreeCodec codec = getAppropriateCodec(dataFormat);
155 if (codec == null) {
156 throw new YchException(E_DATA_TREE_CODEC);
157 }
158
159 List<Object> yangModuleList = new ArrayList<>();
160 yangModuleList.add(moduleObject);
161
162 // Get yang data tree from YTB for the received objects.
163 DefaultYangTreeBuilder builder = new DefaultYangTreeBuilder();
164 YdtExtendedBuilder extBuilder =
165 builder.getYdtBuilderForYo(yangModuleList,
166 rootName,
167 rootNamespace,
168 opType,
169 schemaRegistry);
170
Shankara-Huaweid5823ab2016-11-22 10:14:52 +0530171 // Get the composite response from codec handler.
172 return codec.encodeYdtToCompositeProtocolFormat(extBuilder);
173 }
174
175 @Override
176 public List<Object> decode(String inputString,
177 YangProtocolEncodingFormat dataFormat,
178 YmsOperationType opType) {
179
sonu guptaeff184b2016-11-24 12:43:49 +0530180 YdtBuilder ydtBuilder;
Shankara-Huaweid5823ab2016-11-22 10:14:52 +0530181 YangDataTreeCodec codec = getAppropriateCodec(dataFormat);
182 if (codec == null) {
183 throw new YchException(E_DATA_TREE_CODEC);
184 }
185
sonu guptaeff184b2016-11-24 12:43:49 +0530186 try {
187 // Get the YANG data tree
188 ydtBuilder = codec.decodeProtocolDataToYdt(inputString,
189 schemaRegistry,
190 opType);
191 } catch (Exception e) {
192 throw new YchException(e.getLocalizedMessage());
193 }
Shankara-Huaweid5823ab2016-11-22 10:14:52 +0530194
195 if (ydtBuilder != null) {
196 return getObjectList(ydtBuilder.getRootNode());
197 }
198
199 return null;
200 }
201
202 @Override
203 public Object decode(YangCompositeEncoding protoData,
204 YangProtocolEncodingFormat dataFormat,
205 YmsOperationType opType) {
206
207 YangDataTreeCodec codec = getAppropriateCodec(dataFormat);
208 if (codec == null) {
209 throw new YchException(E_DATA_TREE_CODEC);
210 }
211
212 YdtBuilder ydtBuilder =
213 codec.decodeCompositeProtocolDataToYdt(protoData,
214 schemaRegistry,
215 opType);
216
217 // Get the module object by using YANG data tree
218 if (ydtBuilder != null) {
sonu guptaeff184b2016-11-24 12:43:49 +0530219 return getObjectList(ydtBuilder.getRootNode());
Shankara-Huaweid5823ab2016-11-22 10:14:52 +0530220 }
221
222 return null;
223 }
224
225 @Override
226 public void registerOverriddenCodec(YangDataTreeCodec overrideCodec,
227 YangProtocolEncodingFormat dataFormat) {
228 overrideCodecs.put(dataFormat, overrideCodec);
229 }
230
231 /**
232 * Returns the list of objects from YDT data tree.
233 *
234 * @param rootNode YDT root node
235 * @return returns list of objects
236 */
237 private List<Object> getObjectList(YdtContext rootNode) {
238
239 if (rootNode == null) {
240 // TODO
241 return null;
242 }
243
244 if (rootNode.getFirstChild() == null) {
245 // TODO
246 return null;
247 }
248
249 YdtContext curNode = rootNode.getFirstChild();
250 DefaultYobBuilder builder = new DefaultYobBuilder();
251 Object object = builder.getYangObject((YdtExtendedContext) curNode,
252 schemaRegistry);
253 List<Object> objectList = new ArrayList<>();
254 objectList.add(object);
255
256 // Check next module is exit or not. If exist get the object for that.
257 while (curNode.getNextSibling() != null) {
258 curNode = curNode.getNextSibling();
259 object = builder.getYangObject((YdtExtendedContext) curNode,
260 schemaRegistry);
261 objectList.add(object);
262 }
263
264 return objectList;
265 }
sonu guptaeff184b2016-11-24 12:43:49 +0530266
267 /**
268 * Returns module library for YSR.
269 *
270 * @return module library for YSR
271 */
272 public YangModuleLibrary getLibrary() {
273 return library;
274 }
275
276 /**
277 * Sets module library for YSR.
278 *
279 * @param library module library for YSR
280 */
281 public void setLibrary(YangModuleLibrary library) {
282 this.library = library;
283 }
Shankara-Huaweid5823ab2016-11-22 10:14:52 +0530284}