blob: 45eb37fd15eff3b2c4f07f509b4c042d74ce0f8c [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;
33
34import java.util.ArrayList;
35import java.util.HashMap;
36import java.util.List;
37import java.util.Map;
38
39import static org.onosproject.yms.app.ych.defaultcodecs.utils.DefaultCodecUtils.isNonEmpty;
40
41
42/**
43 * Represents implementation of YANG SBI broker interfaces.
44 * YCH acts as a broker between YMS and driver/provider.
45 */
46public class DefaultYangCodecHandler implements YangCodecHandler {
47
48 private static final String E_MODULE_LIST = "The input module or " +
49 "sub-module object list cannot be null.";
50 private static final String E_DATA_TREE_CODEC = "data tree codec handler" +
51 " is null.";
52
53 /**
54 * Schema registry for driver.
55 */
56 private final YangSchemaRegistry schemaRegistry;
57
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
93 // Check over ridden codec handler is exist or not.
94 if (overrideCodecs != null) {
95 YangDataTreeCodec overrideCodec = overrideCodecs.get(dataFormat);
96 if (overrideCodec != null) {
97 codec = overrideCodec;
98 }
99 }
100 return codec;
101 }
102
103 @Override
104 public void addDeviceSchema(Class<?> yangModule) {
Gaurav Agrawalfcc6c192016-09-20 14:29:15 +0530105 schemaRegistry.registerApplication(null, yangModule);
Shankara-Huaweid5823ab2016-11-22 10:14:52 +0530106 }
107
108 @Override
109 public String encodeOperation(String rootName,
110 String rootNamespace,
111 Map<String, String> tagAttrMap,
112 List<Object> moduleList,
113 YangProtocolEncodingFormat dataFormat,
114 YmsOperationType opType) {
115
116 if (moduleList == null || moduleList.isEmpty()) {
117 throw new YchException(E_MODULE_LIST);
118 }
119
120 // Get the default codec handler.
121 YangDataTreeCodec codec = getAppropriateCodec(dataFormat);
122 if (codec == null) {
123 throw new YchException(E_DATA_TREE_CODEC);
124 }
125
126 // Get yang data tree from YTB for the received objects.
127 DefaultYangTreeBuilder builder = new DefaultYangTreeBuilder();
128 YdtExtendedBuilder encodedYdt =
129 builder.getYdtBuilderForYo(moduleList, rootName,
130 rootNamespace, opType,
131 schemaRegistry);
132
133 encodedYdt.setRootTagAttributeMap(tagAttrMap);
134
135 // Get the xml string form codec handler.
136 return codec.encodeYdtToProtocolFormat(encodedYdt);
137 }
138
139 @Override
140 public YangCompositeEncoding encodeCompositeOperation(
141 String rootName,
142 String rootNamespace,
143 Object moduleObject,
144 YangProtocolEncodingFormat dataFormat,
145 YmsOperationType opType) {
146
147 if (moduleObject == null) {
148 throw new YtbException(E_MODULE_LIST);
149 }
150
151 // Get the default codec handler.
152 YangDataTreeCodec codec = getAppropriateCodec(dataFormat);
153 if (codec == null) {
154 throw new YchException(E_DATA_TREE_CODEC);
155 }
156
157 List<Object> yangModuleList = new ArrayList<>();
158 yangModuleList.add(moduleObject);
159
160 // Get yang data tree from YTB for the received objects.
161 DefaultYangTreeBuilder builder = new DefaultYangTreeBuilder();
162 YdtExtendedBuilder extBuilder =
163 builder.getYdtBuilderForYo(yangModuleList,
164 rootName,
165 rootNamespace,
166 opType,
167 schemaRegistry);
168
169
170 // Get the composite response from codec handler.
171 return codec.encodeYdtToCompositeProtocolFormat(extBuilder);
172 }
173
174 @Override
175 public List<Object> decode(String inputString,
176 YangProtocolEncodingFormat dataFormat,
177 YmsOperationType opType) {
178
179 YangDataTreeCodec codec = getAppropriateCodec(dataFormat);
180 if (codec == null) {
181 throw new YchException(E_DATA_TREE_CODEC);
182 }
183
184 // Get the YANG data tree
185 YdtBuilder ydtBuilder = codec.decodeProtocolDataToYdt(inputString,
186 schemaRegistry,
187 opType);
188
189 if (ydtBuilder != null) {
190 return getObjectList(ydtBuilder.getRootNode());
191 }
192
193 return null;
194 }
195
196 @Override
197 public Object decode(YangCompositeEncoding protoData,
198 YangProtocolEncodingFormat dataFormat,
199 YmsOperationType opType) {
200
201 YangDataTreeCodec codec = getAppropriateCodec(dataFormat);
202 if (codec == null) {
203 throw new YchException(E_DATA_TREE_CODEC);
204 }
205
206 YdtBuilder ydtBuilder =
207 codec.decodeCompositeProtocolDataToYdt(protoData,
208 schemaRegistry,
209 opType);
210
211 // Get the module object by using YANG data tree
212 if (ydtBuilder != null) {
213 List<Object> objectList = getObjectList(ydtBuilder.getRootNode());
214 if (isNonEmpty(objectList)) {
215 return objectList.get(0);
216 }
217 }
218
219 return null;
220 }
221
222 @Override
223 public void registerOverriddenCodec(YangDataTreeCodec overrideCodec,
224 YangProtocolEncodingFormat dataFormat) {
225 overrideCodecs.put(dataFormat, overrideCodec);
226 }
227
228 /**
229 * Returns the list of objects from YDT data tree.
230 *
231 * @param rootNode YDT root node
232 * @return returns list of objects
233 */
234 private List<Object> getObjectList(YdtContext rootNode) {
235
236 if (rootNode == null) {
237 // TODO
238 return null;
239 }
240
241 if (rootNode.getFirstChild() == null) {
242 // TODO
243 return null;
244 }
245
246 YdtContext curNode = rootNode.getFirstChild();
247 DefaultYobBuilder builder = new DefaultYobBuilder();
248 Object object = builder.getYangObject((YdtExtendedContext) curNode,
249 schemaRegistry);
250 List<Object> objectList = new ArrayList<>();
251 objectList.add(object);
252
253 // Check next module is exit or not. If exist get the object for that.
254 while (curNode.getNextSibling() != null) {
255 curNode = curNode.getNextSibling();
256 object = builder.getYangObject((YdtExtendedContext) curNode,
257 schemaRegistry);
258 objectList.add(object);
259 }
260
261 return objectList;
262 }
263}