blob: ae9ff3a10505c0f868b66113f553341ae5fc773c [file] [log] [blame]
Vinod Kumar S2ff139c2016-02-16 01:37:16 +05301/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Vinod Kumar S2ff139c2016-02-16 01:37:16 +05303 *
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 */
16package org.onosproject.yangutils.datamodel;
17
18import java.util.LinkedList;
19import java.util.List;
20
21import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
Bharat saraswal96dfef02016-06-16 00:29:12 +053022import org.onosproject.yangutils.datamodel.utils.Parsable;
23import org.onosproject.yangutils.datamodel.utils.YangConstructType;
Vinod Kumar S2ff139c2016-02-16 01:37:16 +053024
Vidyashree Rama25bf4d02016-03-29 14:37:02 +053025import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
26
Vinod Kumar S2ff139c2016-02-16 01:37:16 +053027/*-
28 * Reference RFC 6020.
29 *
30 * The "augment" statement allows a module or submodule to add to the
31 * schema tree defined in an external module, or the current module and
32 * its submodules, and to add to the nodes from a grouping in a "uses"
33 * statement. The argument is a string that identifies a node in the
34 * schema tree. This node is called the augment's target node. The
35 * target node MUST be either a container, list, choice, case, input,
36 * output, or notification node. It is augmented with the nodes defined
37 * in the sub-statements that follow the "augment" statement.
38 *
39 * The argument string is a schema node identifier.
40 * If the "augment" statement is on the top level in a module or
41 * submodule, the absolute form of a schema node identifier
42 * MUST be used. If the "augment" statement is a sub-statement to the
43 * "uses" statement, the descendant form MUST be used.
44 *
45 * If the target node is a container, list, case, input, output, or
46 * notification node, the "container", "leaf", "list", "leaf-list",
47 * "uses", and "choice" statements can be used within the "augment"
48 * statement.
49 *
50 * If the target node is a choice node, the "case" statement, or a case
51 * shorthand statement can be used within the "augment" statement.
52 *
53 * If the target node is in another module, then nodes added by the
54 * augmentation MUST NOT be mandatory nodes.
55 *
56 * The "augment" statement MUST NOT add multiple nodes with the same
57 * name from the same module to the target node.
58 * The augment's sub-statements
59 *
60 * +--------------+---------+-------------+------------------+
61 * | substatement | section | cardinality |data model mapping|
62 * +--------------+---------+-------------+------------------+
63 * | anyxml | 7.10 | 0..n |-not supported |
64 * | case | 7.9.2 | 0..n |-child nodes |
65 * | choice | 7.9 | 0..n |-child nodes |
66 * | container | 7.5 | 0..n |-child nodes |
67 * | description | 7.19.3 | 0..1 |-string |
Vidyashree Ramadeac28b2016-06-20 15:12:43 +053068 * | if-feature | 7.18.2 | 0..n |-YangIfFeature |
Vinod Kumar S2ff139c2016-02-16 01:37:16 +053069 * | leaf | 7.6 | 0..n |-YangLeaf |
70 * | leaf-list | 7.7 | 0..n |-YangLeafList |
71 * | list | 7.8 | 0..n |-child nodes |
72 * | reference | 7.19.4 | 0..1 |-String |
73 * | status | 7.19.2 | 0..1 |-YangStatus |
74 * | uses | 7.12 | 0..n |-child nodes |
Vidyashree Ramadeac28b2016-06-20 15:12:43 +053075 * | when | 7.19.5 | 0..1 |-YangWhen |
Vinod Kumar S2ff139c2016-02-16 01:37:16 +053076 * +--------------+---------+-------------+------------------+
77 */
Vinod Kumar Sd4deb062016-04-15 18:08:57 +053078
Vinod Kumar S2ff139c2016-02-16 01:37:16 +053079/**
Bharat saraswald9822e92016-04-05 15:13:44 +053080 * Representation of data model node to maintain information defined in YANG augment.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +053081 */
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +053082public class YangAugment
83 extends YangNode
Vidyashree Ramadeac28b2016-06-20 15:12:43 +053084 implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangWhenHolder, YangIfFeatureHolder {
Vinod Kumar S2ff139c2016-02-16 01:37:16 +053085
Bharat saraswal96dfef02016-06-16 00:29:12 +053086 private static final long serialVersionUID = 806201602L;
87
Vinod Kumar S2ff139c2016-02-16 01:37:16 +053088 /**
89 * Augment target node.
90 */
Vidyashree Rama25bf4d02016-03-29 14:37:02 +053091 private String name;
Vinod Kumar S2ff139c2016-02-16 01:37:16 +053092
93 /**
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +053094 * Description of augment.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +053095 */
96 private String description;
97
98 /**
99 * List of leaves.
100 */
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530101 private List<YangLeaf> listOfLeaf;
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530102
103 /**
104 * List of leaf-lists.
105 */
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530106 private List<YangLeafList> listOfLeafList;
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530107
108 /**
Vidyashree Rama25bf4d02016-03-29 14:37:02 +0530109 * List of node identifiers.
110 */
111 private List<YangNodeIdentifier> targetNode;
112
113 /**
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530114 * Reference of the YANG augment.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530115 */
116 private String reference;
117
118 /**
119 * Status of the node.
120 */
121 private YangStatusType status;
122
123 /**
Vidyashree Ramadeac28b2016-06-20 15:12:43 +0530124 * When data of the node.
125 */
126 private YangWhen when;
127
128 /**
129 * List of if-feature.
130 */
131 private List<YangIfFeature> ifFeatureList;
132
133 /**
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530134 * Create a YANG augment node.
135 */
136 public YangAugment() {
137 super(YangNodeType.AUGMENT_NODE);
138 }
139
140 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530141 * Returns the augmented node.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530142 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530143 * @return the augmented node
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530144 */
Vidyashree Rama25bf4d02016-03-29 14:37:02 +0530145 public List<YangNodeIdentifier> getTargetNode() {
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530146 return targetNode;
147 }
148
149 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530150 * Sets the augmented node.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530151 *
Vidyashree Rama25bf4d02016-03-29 14:37:02 +0530152 * @param nodeIdentifiers the augmented node
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530153 */
Vidyashree Rama25bf4d02016-03-29 14:37:02 +0530154 public void setTargetNode(List<YangNodeIdentifier> nodeIdentifiers) {
Bharat saraswal96dfef02016-06-16 00:29:12 +0530155 targetNode = nodeIdentifiers;
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530156 }
157
158 /**
Vidyashree Ramadeac28b2016-06-20 15:12:43 +0530159 * Returns the when.
160 *
161 * @return the when
162 */
163 @Override
164 public YangWhen getWhen() {
165 return when;
166 }
167
168 /**
169 * Sets the when.
170 *
171 * @param when the when to set
172 */
173 @Override
174 public void setWhen(YangWhen when) {
175 this.when = when;
176 }
177
178 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530179 * Returns the description.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530180 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530181 * @return the description
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530182 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530183 @Override
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530184 public String getDescription() {
185 return description;
186 }
187
188 /**
189 * Set the description.
190 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530191 * @param description set the description
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530192 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530193 @Override
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530194 public void setDescription(String description) {
195 this.description = description;
196 }
197
Vidyashree Rama25bf4d02016-03-29 14:37:02 +0530198 @Override
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530199 public void detectCollidingChild(String identifierName, YangConstructType dataType)
200 throws DataModelException {
Vidyashree Rama25bf4d02016-03-29 14:37:02 +0530201 // Detect colliding child.
202 detectCollidingChildUtil(identifierName, dataType, this);
203 }
204
205 @Override
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530206 public void detectSelfCollision(String identifierName, YangConstructType dataType)
207 throws DataModelException {
Bharat saraswal96dfef02016-06-16 00:29:12 +0530208 if (getName().equals(identifierName)) {
Vidyashree Rama25bf4d02016-03-29 14:37:02 +0530209 throw new DataModelException("YANG file error: Duplicate input identifier detected, same as input \""
Bharat saraswal96dfef02016-06-16 00:29:12 +0530210 + getName() + "\"");
Vidyashree Rama25bf4d02016-03-29 14:37:02 +0530211 }
212 }
213
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530214 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530215 * Returns the list of leaves.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530216 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530217 * @return the list of leaves
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530218 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530219 @Override
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530220 public List<YangLeaf> getListOfLeaf() {
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530221 return listOfLeaf;
222 }
223
224 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530225 * Sets the list of leaves.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530226 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530227 * @param leafsList the list of leaf to set
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530228 */
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530229 @Override
230 public void setListOfLeaf(List<YangLeaf> leafsList) {
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530231 listOfLeaf = leafsList;
232 }
233
234 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530235 * Adds a leaf.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530236 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530237 * @param leaf the leaf to be added
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530238 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530239 @Override
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530240 public void addLeaf(YangLeaf leaf) {
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530241 if (getListOfLeaf() == null) {
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530242 setListOfLeaf(new LinkedList<YangLeaf>());
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530243 }
244
245 getListOfLeaf().add(leaf);
246 }
247
248 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530249 * Returns the list of leaf-list.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530250 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530251 * @return the list of leaf-list
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530252 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530253 @Override
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530254 public List<YangLeafList> getListOfLeafList() {
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530255 return listOfLeafList;
256 }
257
258 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530259 * Sets the list of leaf-list.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530260 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530261 * @param listOfLeafList the list of leaf-list to set
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530262 */
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530263 @Override
264 public void setListOfLeafList(List<YangLeafList> listOfLeafList) {
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530265 this.listOfLeafList = listOfLeafList;
266 }
267
268 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530269 * Adds a leaf-list.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530270 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530271 * @param leafList the leaf-list to be added
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530272 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530273 @Override
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530274 public void addLeafList(YangLeafList leafList) {
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530275 if (getListOfLeafList() == null) {
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530276 setListOfLeafList(new LinkedList<YangLeafList>());
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530277 }
278
279 getListOfLeafList().add(leafList);
280 }
281
282 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530283 * Returns the textual reference.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530284 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530285 * @return the reference
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530286 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530287 @Override
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530288 public String getReference() {
289 return reference;
290 }
291
292 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530293 * Sets the textual reference.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530294 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530295 * @param reference the reference to set
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530296 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530297 @Override
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530298 public void setReference(String reference) {
299 this.reference = reference;
300 }
301
302 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530303 * Returns the status.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530304 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530305 * @return the status
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530306 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530307 @Override
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530308 public YangStatusType getStatus() {
309 return status;
310 }
311
312 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530313 * Sets the status.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530314 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530315 * @param status the status to set
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530316 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530317 @Override
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530318 public void setStatus(YangStatusType status) {
319 this.status = status;
320 }
321
322 /**
323 * Returns the type of the data as belongs-to.
324 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530325 * @return returns AUGMENT_DATA
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530326 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530327 @Override
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530328 public YangConstructType getYangConstructType() {
329 return YangConstructType.AUGMENT_DATA;
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530330 }
331
332 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530333 * Validates the data on entering the corresponding parse tree node.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530334 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530335 * @throws DataModelException a violation of data model rules
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530336 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530337 @Override
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530338 public void validateDataOnEntry()
339 throws DataModelException {
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530340 // TODO auto-generated method stub, to be implemented by parser
341 }
342
343 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530344 * Validates the data on exiting the corresponding parse tree node.
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530345 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530346 * @throws DataModelException a violation of data model rules
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530347 */
Bharat saraswal870c56f2016-02-20 21:57:16 +0530348 @Override
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530349 public void validateDataOnExit()
350 throws DataModelException {
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530351 // TODO auto-generated method stub, to be implemented by parser
352 }
353
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530354 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530355 * Returns the target nodes name where the augmentation is being done.
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530356 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530357 * @return target nodes name where the augmentation is being done
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530358 */
359 @Override
360 public String getName() {
Vidyashree Rama25bf4d02016-03-29 14:37:02 +0530361 return name;
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530362 }
363
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530364 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530365 * Sets the target nodes name where the augmentation is being done.
Vinod Kumar S0c330cd2016-02-23 22:36:57 +0530366 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530367 * @param name target nodes name where the augmentation is being done
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530368 */
369 @Override
370 public void setName(String name) {
Vidyashree Rama25bf4d02016-03-29 14:37:02 +0530371 this.name = name;
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530372 }
373
Vidyashree Ramadeac28b2016-06-20 15:12:43 +0530374 @Override
375 public List<YangIfFeature> getIfFeatureList() {
376 return ifFeatureList;
377 }
378
379 @Override
380 public void addIfFeatureList(YangIfFeature ifFeature) {
381 if (getIfFeatureList() == null) {
382 setIfFeatureList(new LinkedList<>());
383 }
384 getIfFeatureList().add(ifFeature);
385 }
386
387 @Override
388 public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
389 this.ifFeatureList = ifFeatureList;
390 }
Vinod Kumar S2ff139c2016-02-16 01:37:16 +0530391}