You need to sign in or sign up before continuing.
Vidyashree Rama
Committed by Gerrit Code Review

[ONOS-4650][ONOS-4726][ONOS-4727] [ONOS-4728]Implement must parser + when parser…

… + feature + if-feature + revision defect fix

Change-Id: I0a3aee6c1c6b72ef7da7f7f565fd0f149fe3fd42
Showing 79 changed files with 3688 additions and 301 deletions
...@@ -29,5 +29,10 @@ public enum ResolvableType { ...@@ -29,5 +29,10 @@ public enum ResolvableType {
29 /** 29 /**
30 * Identifies the uses. 30 * Identifies the uses.
31 */ 31 */
32 - YANG_USES 32 + YANG_USES,
33 +
34 + /**
35 + * Identifies the if-feature.
36 + */
37 + YANG_IF_FEATURE
33 } 38 }
......
...@@ -65,14 +65,14 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol ...@@ -65,14 +65,14 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol
65 * | choice | 7.9 | 0..n |-child nodes | 65 * | choice | 7.9 | 0..n |-child nodes |
66 * | container | 7.5 | 0..n |-child nodes | 66 * | container | 7.5 | 0..n |-child nodes |
67 * | description | 7.19.3 | 0..1 |-string | 67 * | description | 7.19.3 | 0..1 |-string |
68 - * | if-feature | 7.18.2 | 0..n |-TODO | 68 + * | if-feature | 7.18.2 | 0..n |-YangIfFeature |
69 * | leaf | 7.6 | 0..n |-YangLeaf | 69 * | leaf | 7.6 | 0..n |-YangLeaf |
70 * | leaf-list | 7.7 | 0..n |-YangLeafList | 70 * | leaf-list | 7.7 | 0..n |-YangLeafList |
71 * | list | 7.8 | 0..n |-child nodes | 71 * | list | 7.8 | 0..n |-child nodes |
72 * | reference | 7.19.4 | 0..1 |-String | 72 * | reference | 7.19.4 | 0..1 |-String |
73 * | status | 7.19.2 | 0..1 |-YangStatus | 73 * | status | 7.19.2 | 0..1 |-YangStatus |
74 * | uses | 7.12 | 0..n |-child nodes | 74 * | uses | 7.12 | 0..n |-child nodes |
75 - * | when | 7.19.5 | 0..1 |-TODO | 75 + * | when | 7.19.5 | 0..1 |-YangWhen |
76 * +--------------+---------+-------------+------------------+ 76 * +--------------+---------+-------------+------------------+
77 */ 77 */
78 78
...@@ -81,7 +81,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol ...@@ -81,7 +81,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol
81 */ 81 */
82 public class YangAugment 82 public class YangAugment
83 extends YangNode 83 extends YangNode
84 - implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector { 84 + implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangWhenHolder, YangIfFeatureHolder {
85 85
86 private static final long serialVersionUID = 806201602L; 86 private static final long serialVersionUID = 806201602L;
87 87
...@@ -121,6 +121,16 @@ public class YangAugment ...@@ -121,6 +121,16 @@ public class YangAugment
121 private YangStatusType status; 121 private YangStatusType status;
122 122
123 /** 123 /**
124 + * 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 + /**
124 * Create a YANG augment node. 134 * Create a YANG augment node.
125 */ 135 */
126 public YangAugment() { 136 public YangAugment() {
...@@ -146,6 +156,26 @@ public class YangAugment ...@@ -146,6 +156,26 @@ public class YangAugment
146 } 156 }
147 157
148 /** 158 /**
159 + * 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 + /**
149 * Returns the description. 179 * Returns the description.
150 * 180 *
151 * @return the description 181 * @return the description
...@@ -341,4 +371,21 @@ public class YangAugment ...@@ -341,4 +371,21 @@ public class YangAugment
341 this.name = name; 371 this.name = name;
342 } 372 }
343 373
374 + @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 + }
344 } 391 }
......
...@@ -78,14 +78,14 @@ import static org.onosproject.yangutils.datamodel.utils.YangConstructType.CASE_D ...@@ -78,14 +78,14 @@ import static org.onosproject.yangutils.datamodel.utils.YangConstructType.CASE_D
78 * | choice | 7.9 | 0..n |-child nodes | 78 * | choice | 7.9 | 0..n |-child nodes |
79 * | container | 7.5 | 0..n |-child nodes | 79 * | container | 7.5 | 0..n |-child nodes |
80 * | description | 7.19.3 | 0..1 |-string | 80 * | description | 7.19.3 | 0..1 |-string |
81 - * | if-feature | 7.18.2 | 0..n |-TODO | 81 + * | if-feature | 7.18.2 | 0..n |-YangIfFeature |
82 * | leaf | 7.6 | 0..n |-YangLeaf | 82 * | leaf | 7.6 | 0..n |-YangLeaf |
83 * | leaf-list | 7.7 | 0..n |-YangLeafList | 83 * | leaf-list | 7.7 | 0..n |-YangLeafList |
84 * | list | 7.8 | 0..n |-child nodes | 84 * | list | 7.8 | 0..n |-child nodes |
85 * | reference | 7.19.4 | 0..1 |-string | 85 * | reference | 7.19.4 | 0..1 |-string |
86 * | status | 7.19.2 | 0..1 |-YangStatus | 86 * | status | 7.19.2 | 0..1 |-YangStatus |
87 * | uses | 7.12 | 0..n |-child node | 87 * | uses | 7.12 | 0..n |-child node |
88 - * | when | 7.19.5 | 0..1 |-TODO | 88 + * | when | 7.19.5 | 0..1 |-YangWhen |
89 * +--------------+---------+-------------+------------------+ 89 * +--------------+---------+-------------+------------------+
90 */ 90 */
91 91
...@@ -94,7 +94,8 @@ import static org.onosproject.yangutils.datamodel.utils.YangConstructType.CASE_D ...@@ -94,7 +94,8 @@ import static org.onosproject.yangutils.datamodel.utils.YangConstructType.CASE_D
94 */ 94 */
95 public class YangCase 95 public class YangCase
96 extends YangNode 96 extends YangNode
97 - implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder { 97 + implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder,
98 + YangWhenHolder, YangIfFeatureHolder {
98 99
99 private static final long serialVersionUID = 806201603L; 100 private static final long serialVersionUID = 806201603L;
100 101
...@@ -131,6 +132,16 @@ public class YangCase ...@@ -131,6 +132,16 @@ public class YangCase
131 private YangStatusType status; 132 private YangStatusType status;
132 133
133 /** 134 /**
135 + * When data of the node.
136 + */
137 + private YangWhen when;
138 +
139 + /**
140 + * List of if-feature.
141 + */
142 + private List<YangIfFeature> ifFeatureList;
143 +
144 + /**
134 * Creates a choice node. 145 * Creates a choice node.
135 */ 146 */
136 public YangCase() { 147 public YangCase() {
...@@ -138,6 +149,26 @@ public class YangCase ...@@ -138,6 +149,26 @@ public class YangCase
138 } 149 }
139 150
140 /** 151 /**
152 + * Returns the when.
153 + *
154 + * @return the when
155 + */
156 + @Override
157 + public YangWhen getWhen() {
158 + return when;
159 + }
160 +
161 + /**
162 + * Sets the when.
163 + *
164 + * @param when the when to set
165 + */
166 + @Override
167 + public void setWhen(YangWhen when) {
168 + this.when = when;
169 + }
170 +
171 + /**
141 * Returns the case name. 172 * Returns the case name.
142 * 173 *
143 * @return case name 174 * @return case name
...@@ -343,4 +374,22 @@ public class YangCase ...@@ -343,4 +374,22 @@ public class YangCase
343 // Asks helper to detect colliding child. 374 // Asks helper to detect colliding child.
344 detectCollidingChildUtil(identifierName, dataType, this); 375 detectCollidingChildUtil(identifierName, dataType, this);
345 } 376 }
377 +
378 + @Override
379 + public List<YangIfFeature> getIfFeatureList() {
380 + return ifFeatureList;
381 + }
382 +
383 + @Override
384 + public void addIfFeatureList(YangIfFeature ifFeature) {
385 + if (getIfFeatureList() == null) {
386 + setIfFeatureList(new LinkedList<>());
387 + }
388 + getIfFeatureList().add(ifFeature);
389 + }
390 +
391 + @Override
392 + public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
393 + this.ifFeatureList = ifFeatureList;
394 + }
346 } 395 }
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
15 */ 15 */
16 package org.onosproject.yangutils.datamodel; 16 package org.onosproject.yangutils.datamodel;
17 17
18 +import java.util.LinkedList;
19 +import java.util.List;
18 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 20 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
19 import org.onosproject.yangutils.datamodel.utils.Parsable; 21 import org.onosproject.yangutils.datamodel.utils.Parsable;
20 import org.onosproject.yangutils.datamodel.utils.YangConstructType; 22 import org.onosproject.yangutils.datamodel.utils.YangConstructType;
...@@ -46,21 +48,23 @@ import static org.onosproject.yangutils.datamodel.utils.YangConstructType.CHOICE ...@@ -46,21 +48,23 @@ import static org.onosproject.yangutils.datamodel.utils.YangConstructType.CHOICE
46 * | container | 7.5 | 0..n |-child case nodes | 48 * | container | 7.5 | 0..n |-child case nodes |
47 * | default | 7.9.3 | 0..1 |-string | 49 * | default | 7.9.3 | 0..1 |-string |
48 * | description | 7.19.3 | 0..1 |-string | 50 * | description | 7.19.3 | 0..1 |-string |
49 - * | if-feature | 7.18.2 | 0..n |-TODO | 51 + * | if-feature | 7.18.2 | 0..n |-YangIfFeature |
50 * | leaf | 7.6 | 0..n |-child case nodes | 52 * | leaf | 7.6 | 0..n |-child case nodes |
51 * | leaf-list | 7.7 | 0..n |-child case nodes | 53 * | leaf-list | 7.7 | 0..n |-child case nodes |
52 * | list | 7.8 | 0..n |-child case nodes | 54 * | list | 7.8 | 0..n |-child case nodes |
53 * | mandatory | 7.9.4 | 0..1 |-string | 55 * | mandatory | 7.9.4 | 0..1 |-string |
54 * | reference | 7.19.4 | 0..1 |-string | 56 * | reference | 7.19.4 | 0..1 |-string |
55 * | status | 7.19.2 | 0..1 |-string | 57 * | status | 7.19.2 | 0..1 |-string |
56 - * | when | 7.19.5 | 0..1 |-TODO | 58 + * | when | 7.19.5 | 0..1 |-YangWhen |
57 * +--------------+---------+-------------+------------------+ 59 * +--------------+---------+-------------+------------------+
58 */ 60 */
61 +
59 /** 62 /**
60 * Represents data model node to maintain information defined in YANG choice. 63 * Represents data model node to maintain information defined in YANG choice.
61 */ 64 */
62 public class YangChoice extends YangNode 65 public class YangChoice extends YangNode
63 - implements YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder { 66 + implements YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder, YangWhenHolder,
67 + YangIfFeatureHolder {
64 68
65 private static final long serialVersionUID = 806201604L; 69 private static final long serialVersionUID = 806201604L;
66 70
...@@ -143,6 +147,16 @@ public class YangChoice extends YangNode ...@@ -143,6 +147,16 @@ public class YangChoice extends YangNode
143 private String defaultValueInString; 147 private String defaultValueInString;
144 148
145 /** 149 /**
150 + * When data of the node.
151 + */
152 + private YangWhen when;
153 +
154 + /**
155 + * List of if-feature.
156 + */
157 + private List<YangIfFeature> ifFeatureList;
158 +
159 + /**
146 * Create a choice node. 160 * Create a choice node.
147 */ 161 */
148 public YangChoice() { 162 public YangChoice() {
...@@ -150,6 +164,26 @@ public class YangChoice extends YangNode ...@@ -150,6 +164,26 @@ public class YangChoice extends YangNode
150 } 164 }
151 165
152 /** 166 /**
167 + * Returns the when.
168 + *
169 + * @return the when
170 + */
171 + @Override
172 + public YangWhen getWhen() {
173 + return when;
174 + }
175 +
176 + /**
177 + * Sets the when.
178 + *
179 + * @param when the when to set
180 + */
181 + @Override
182 + public void setWhen(YangWhen when) {
183 + this.when = when;
184 + }
185 +
186 + /**
153 * Returns the choice name. 187 * Returns the choice name.
154 * 188 *
155 * @return choice name 189 * @return choice name
...@@ -365,4 +399,23 @@ public class YangChoice extends YangNode ...@@ -365,4 +399,23 @@ public class YangChoice extends YangNode
365 node = node.getNextSibling(); 399 node = node.getNextSibling();
366 } 400 }
367 } 401 }
402 +
403 + @Override
404 + public List<YangIfFeature> getIfFeatureList() {
405 + return ifFeatureList;
406 + }
407 +
408 + @Override
409 + public void addIfFeatureList(YangIfFeature ifFeature) {
410 + if (getIfFeatureList() == null) {
411 + setIfFeatureList(new LinkedList<>());
412 + }
413 + getIfFeatureList().add(ifFeature);
414 + }
415 +
416 + @Override
417 + public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
418 + this.ifFeatureList = ifFeatureList;
419 + }
420 +
368 } 421 }
......
...@@ -70,17 +70,17 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol ...@@ -70,17 +70,17 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol
70 * | container | 7.5 | 0..n | -child nodes | 70 * | container | 7.5 | 0..n | -child nodes |
71 * | description | 7.19.3 | 0..1 | -string | 71 * | description | 7.19.3 | 0..1 | -string |
72 * | grouping | 7.11 | 0..n | -child nodes | 72 * | grouping | 7.11 | 0..n | -child nodes |
73 - * | if-feature | 7.18.2 | 0..n | -TODO | 73 + * | if-feature | 7.18.2 | 0..n | -YangIfFeature |
74 * | leaf | 7.6 | 0..n | -YangLeaf | 74 * | leaf | 7.6 | 0..n | -YangLeaf |
75 * | leaf-list | 7.7 | 0..n | -YangLeafList | 75 * | leaf-list | 7.7 | 0..n | -YangLeafList |
76 * | list | 7.8 | 0..n | -child nodes | 76 * | list | 7.8 | 0..n | -child nodes |
77 - * | must | 7.5.3 | 0..n | -TODO | 77 + * | must | 7.5.3 | 0..n | -YangMust |
78 * | presence | 7.5.5 | 0..1 | -boolean | 78 * | presence | 7.5.5 | 0..1 | -boolean |
79 * | reference | 7.19.4 | 0..1 | -string | 79 * | reference | 7.19.4 | 0..1 | -string |
80 * | status | 7.19.2 | 0..1 | -YangStatus | 80 * | status | 7.19.2 | 0..1 | -YangStatus |
81 * | typedef | 7.3 | 0..n | -child nodes | 81 * | typedef | 7.3 | 0..n | -child nodes |
82 * | uses | 7.12 | 0..n | -child nodes | 82 * | uses | 7.12 | 0..n | -child nodes |
83 - * | when | 7.19.5 | 0..1 | -TODO | 83 + * | when | 7.19.5 | 0..1 | -YangWhen |
84 * +--------------+---------+-------------+------------------+ 84 * +--------------+---------+-------------+------------------+
85 */ 85 */
86 86
...@@ -89,7 +89,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol ...@@ -89,7 +89,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol
89 */ 89 */
90 public class YangContainer 90 public class YangContainer
91 extends YangNode 91 extends YangNode
92 - implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder { 92 + implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder,
93 + YangMustHolder, YangWhenHolder, YangIfFeatureHolder {
93 94
94 private static final long serialVersionUID = 806201605L; 95 private static final long serialVersionUID = 806201605L;
95 96
...@@ -135,6 +136,21 @@ public class YangContainer ...@@ -135,6 +136,21 @@ public class YangContainer
135 private YangStatusType status = YangStatusType.CURRENT; 136 private YangStatusType status = YangStatusType.CURRENT;
136 137
137 /** 138 /**
139 + * List of must statement constraints.
140 + */
141 + private List<YangMust> mustConstraintList;
142 +
143 + /**
144 + * When data of the node.
145 + */
146 + private YangWhen when;
147 +
148 + /**
149 + * List of if-feature.
150 + */
151 + private List<YangIfFeature> ifFeatureList;
152 +
153 + /**
138 * Create a container node. 154 * Create a container node.
139 */ 155 */
140 public YangContainer() { 156 public YangContainer() {
...@@ -142,6 +158,26 @@ public class YangContainer ...@@ -142,6 +158,26 @@ public class YangContainer
142 } 158 }
143 159
144 /** 160 /**
161 + * Returns the when.
162 + *
163 + * @return the when
164 + */
165 + @Override
166 + public YangWhen getWhen() {
167 + return when;
168 + }
169 +
170 + /**
171 + * Sets the when.
172 + *
173 + * @param when the when to set
174 + */
175 + @Override
176 + public void setWhen(YangWhen when) {
177 + this.when = when;
178 + }
179 +
180 + /**
145 * Returns the YANG name of container. 181 * Returns the YANG name of container.
146 * 182 *
147 * @return the name of container as defined in YANG file 183 * @return the name of container as defined in YANG file
...@@ -445,4 +481,41 @@ public class YangContainer ...@@ -445,4 +481,41 @@ public class YangContainer
445 + getName() + "\""); 481 + getName() + "\"");
446 } 482 }
447 } 483 }
484 +
485 + @Override
486 + public List<YangIfFeature> getIfFeatureList() {
487 + return ifFeatureList;
488 + }
489 +
490 + @Override
491 + public void addIfFeatureList(YangIfFeature ifFeature) {
492 + if (getIfFeatureList() == null) {
493 + setIfFeatureList(new LinkedList<>());
494 + }
495 + getIfFeatureList().add(ifFeature);
496 + }
497 +
498 + @Override
499 + public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
500 + this.ifFeatureList = ifFeatureList;
501 + }
502 +
503 + @Override
504 + public List<YangMust> getListOfMust() {
505 + return mustConstraintList;
506 + }
507 +
508 + @Override
509 + public void setListOfMust(List<YangMust> mustConstraintList) {
510 + this.mustConstraintList = mustConstraintList;
511 + }
512 +
513 + @Override
514 + public void addMust(YangMust must) {
515 + if (getListOfMust() == null) {
516 + setListOfMust(new LinkedList<>());
517 + }
518 + getListOfMust().add(must);
519 + }
520 +
448 } 521 }
......
1 +/*
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 +
17 +package org.onosproject.yangutils.datamodel;
18 +
19 +import java.io.Serializable;
20 +import java.util.LinkedList;
21 +import java.util.List;
22 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
23 +import org.onosproject.yangutils.datamodel.utils.Parsable;
24 +import org.onosproject.yangutils.datamodel.utils.YangConstructType;
25 +
26 +/*
27 + * Reference RFC 6020.
28 + *
29 + * The "feature" statement is used to define a mechanism by which
30 + * portions of the schema are marked as conditional. A feature name is
31 + * defined that can later be referenced using the "if-feature" statement.
32 + * Schema nodes tagged with a feature are ignored by the device unless
33 + * the device supports the given feature. This allows portions of the
34 + * YANG module to be conditional based on conditions on the device.
35 + * The model can represent the abilities of the device within the model,
36 + * giving a richer model that allows for differing device abilities and roles.
37 + *
38 + * The argument to the "feature" statement is the name of the new
39 + * feature, and follows the rules for identifiers. This name is used by the
40 + * "if-feature" statement to tie the schema nodes to the feature.
41 + *
42 + * The feature's Substatements
43 + *
44 + * +--------------+---------+-------------+------------------+
45 + * | substatement | section | cardinality |data model mapping|
46 + * +--------------+---------+-------------+------------------+
47 + * | description | 7.19.3 | 0..1 | -string |
48 + * | if-feature | 7.18.2 | 0..n | -YangIfFeature |
49 + * | reference | 7.19.4 | 0..1 | -string |
50 + * | status | 7.19.2 | 0..1 | -YangStatus |
51 + * +--------------+---------+-------------+------------------+
52 + */
53 +
54 +/**
55 + * Represents data model node to maintain information defined in YANG feature.
56 + */
57 +public class YangFeature implements YangCommonInfo, Parsable, YangIfFeatureHolder, Serializable {
58 +
59 + private static final long serialVersionUID = 806201635L;
60 +
61 + /**
62 + * Name of the feature.
63 + */
64 + private String name;
65 +
66 + /**
67 + * Description of feature.
68 + */
69 + private String description;
70 +
71 + /**
72 + * Reference of the feature.
73 + */
74 + private String reference;
75 +
76 + /**
77 + * Status of feature.
78 + */
79 + private YangStatusType statusType;
80 +
81 + /**
82 + * List of if-feature.
83 + */
84 + private List<YangIfFeature> ifFeatureList;
85 +
86 + @Override
87 + public String getDescription() {
88 + return description;
89 + }
90 +
91 + @Override
92 + public void setDescription(String description) {
93 + this.description = description;
94 + }
95 +
96 + @Override
97 + public String getReference() {
98 + return reference;
99 + }
100 +
101 + @Override
102 + public void setReference(String reference) {
103 + this.reference = reference;
104 + }
105 +
106 + @Override
107 + public YangStatusType getStatus() {
108 + return statusType;
109 + }
110 +
111 + @Override
112 + public void setStatus(YangStatusType status) {
113 + this.statusType = status;
114 + }
115 +
116 + public String getName() {
117 + return name;
118 + }
119 +
120 + public void setName(String name) {
121 + this.name = name;
122 + }
123 +
124 + @Override
125 + public YangConstructType getYangConstructType() {
126 + return YangConstructType.FEATURE_DATA;
127 + }
128 +
129 + @Override
130 + public void validateDataOnEntry() throws DataModelException {
131 + //TODO : To be implemented
132 + }
133 +
134 + @Override
135 + public void validateDataOnExit() throws DataModelException {
136 + //TODO : To be implemented
137 + }
138 +
139 + @Override
140 + public List<YangIfFeature> getIfFeatureList() {
141 + return ifFeatureList;
142 + }
143 +
144 + @Override
145 + public void addIfFeatureList(YangIfFeature ifFeature) {
146 + if (getIfFeatureList() == null) {
147 + setIfFeatureList(new LinkedList<>());
148 + }
149 + getIfFeatureList().add(ifFeature);
150 + }
151 +
152 + @Override
153 + public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
154 + this.ifFeatureList = ifFeatureList;
155 + }
156 +}
1 +/*Copyright 2016.year Open Networking Laboratory
2 +
3 +Licensed under the Apache License, Version 2.0 (the "License");
4 +you may not use this file except in compliance with the License.
5 +You may obtain a copy of the License at
6 +
7 + http://www.apache.org/licenses/LICENSE-2.0
8 +
9 +Unless required by applicable law or agreed to in writing, software
10 +distributed under the License is distributed on an "AS IS" BASIS,
11 +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 +See the License for the specific language governing permissions and
13 +limitations under the License.*/
14 +
15 +package org.onosproject.yangutils.datamodel;
16 +
17 +import java.util.List;
18 +
19 +/**
20 + * Abstraction of feature entity. It is used to abstract the data holders of feature.
21 + */
22 +public interface YangFeatureHolder {
23 +
24 + /**
25 + * Returns the list of feature from data holder like container / list.
26 + *
27 + * @return the list of feature
28 + */
29 + List<YangFeature> getFeatureList();
30 +
31 + /**
32 + * Adds feature in feature list.
33 + *
34 + * @param feature the feature to be added
35 + */
36 + void addFeatureList(YangFeature feature);
37 +
38 + /**
39 + * Sets the list of feature.
40 + *
41 + * @param listOfFeature the list of feature to set
42 + */
43 + void setListOfFeature(List<YangFeature> listOfFeature);
44 +}
1 +/*
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 +
17 +package org.onosproject.yangutils.datamodel;
18 +
19 +import java.io.Serializable;
20 +import java.util.Iterator;
21 +import java.util.List;
22 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
23 +import org.onosproject.yangutils.datamodel.utils.Parsable;
24 +import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
25 +import org.onosproject.yangutils.datamodel.utils.YangConstructType;
26 +
27 +/*
28 + * Reference RFC 6020.
29 + *
30 + * The "if-feature" statement makes its parent statement conditional.
31 + * The argument is the name of a feature, as defined by a "feature"
32 + * statement. The parent statement is implemented by servers that
33 + * support this feature. If a prefix is present on the feature name, it
34 + * refers to a feature defined in the module that was imported with that
35 + * prefix, or the local module if the prefix matches the local module's
36 + * prefix. Otherwise, a feature with the matching name MUST be defined
37 + * in the current module or an included submodule.
38 + *
39 + * Since submodules cannot include the parent module, any features in
40 + * the module that need to be exposed to submodules MUST be defined in a
41 + * submodule. Submodules can then include this submodule to find the
42 + * definition of the feature.
43 + */
44 +
45 +/**
46 + * Represents data model node to maintain information defined in YANG if-feature.
47 + */
48 +public class YangIfFeature implements Parsable, Resolvable, Serializable {
49 +
50 + private static final long serialVersionUID = 806201635L;
51 +
52 + /**
53 + * if-feature argument.
54 + */
55 + YangNodeIdentifier name;
56 +
57 + /**
58 + * Referred feature information.
59 + */
60 + YangFeature referredFeature;
61 +
62 + /**
63 + * Referred feature parent information.
64 + */
65 + YangNode referredFeatureHolder;
66 +
67 + /**
68 + * Status of resolution. If completely resolved enum value is "RESOLVED",
69 + * if not enum value is "UNRESOLVED", in case reference of grouping/typedef
70 + * is added to uses/type but it's not resolved value of enum should be
71 + * "INTRA_FILE_RESOLVED".
72 + */
73 + private ResolvableStatus resolvableStatus;
74 +
75 + /**
76 + * Returns referred feature holder.
77 + *
78 + * @return referred feature holder
79 + */
80 + public YangNode getReferredFeatureHolder() {
81 + return referredFeatureHolder;
82 + }
83 +
84 + /**
85 + * Sets the referred feature holder.
86 + *
87 + * @param referredFeatureHolder referred feature holder
88 + */
89 + public void setReferredFeatureHolder(YangNode referredFeatureHolder) {
90 + this.referredFeatureHolder = referredFeatureHolder;
91 + }
92 +
93 + /**
94 + * Returns prefix associated with identifier.
95 + *
96 + * @return prefix associated with identifier
97 + */
98 + public String getPrefix() {
99 + return name.getPrefix();
100 + }
101 +
102 + /**
103 + * Sets prefix associated with identifier.
104 + *
105 + * @param prefix prefix associated with identifier
106 + */
107 + public void setPrefix(String prefix) {
108 + name.setPrefix(prefix);
109 + }
110 +
111 + /**
112 + * Returns referred feature associated with if-feature.
113 + *
114 + * @return referred feature associated with if-feature
115 + */
116 + public YangFeature getReferredFeature() {
117 + return referredFeature;
118 + }
119 +
120 + /**
121 + * Sets referred feature associated with if-feature.
122 + *
123 + * @param referredFeature referred feature associated with if-feature
124 + */
125 + public void setReferredFeature(YangFeature referredFeature) {
126 + this.referredFeature = referredFeature;
127 + }
128 +
129 + /**
130 + * Returns the YANG name of if-feature.
131 + *
132 + * @return the name of if-feature as defined in YANG file
133 + */
134 + public YangNodeIdentifier getName() {
135 + return name;
136 + }
137 +
138 + /**
139 + * Sets the YANG name of if-feature.
140 + *
141 + * @param name the name of if-feature as defined in YANG file
142 + */
143 + public void setName(YangNodeIdentifier name) {
144 + this.name = name;
145 + }
146 +
147 + @Override
148 + public YangConstructType getYangConstructType() {
149 + return YangConstructType.IF_FEATURE_DATA;
150 + }
151 +
152 + @Override
153 + public void validateDataOnEntry() throws DataModelException {
154 + // do nothing, no validation required for if-feature
155 + }
156 +
157 + @Override
158 + public void validateDataOnExit() throws DataModelException {
159 + // do nothing, no validation required for if-feature
160 + }
161 +
162 + @Override
163 + public ResolvableStatus getResolvableStatus() {
164 + return resolvableStatus;
165 + }
166 +
167 + @Override
168 + public void setResolvableStatus(ResolvableStatus resolvableStatus) {
169 + this.resolvableStatus = resolvableStatus;
170 + }
171 +
172 + @Override
173 + public void resolve() throws DataModelException {
174 + YangFeature feature = getReferredFeature();
175 +
176 + // check whether feature has if-feature
177 + List<YangIfFeature> ifFeatureList = feature.getIfFeatureList();
178 + if (ifFeatureList != null && !ifFeatureList.isEmpty()) {
179 + Iterator<YangIfFeature> ifFeatureIterator = ifFeatureList.iterator();
180 + while (ifFeatureIterator.hasNext()) {
181 + YangIfFeature ifFeature = ifFeatureIterator.next();
182 + if (ifFeature.getResolvableStatus() != ResolvableStatus.RESOLVED) {
183 + setResolvableStatus(ResolvableStatus.INTRA_FILE_RESOLVED);
184 + return;
185 + }
186 + }
187 + }
188 + }
189 +}
1 +/*Copyright 2016.year Open Networking Laboratory
2 +
3 +Licensed under the Apache License, Version 2.0 (the "License");
4 +you may not use this file except in compliance with the License.
5 +You may obtain a copy of the License at
6 +
7 + http://www.apache.org/licenses/LICENSE-2.0
8 +
9 +Unless required by applicable law or agreed to in writing, software
10 +distributed under the License is distributed on an "AS IS" BASIS,
11 +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 +See the License for the specific language governing permissions and
13 +limitations under the License.*/
14 +
15 +package org.onosproject.yangutils.datamodel;
16 +
17 +import java.util.List;
18 +
19 +/**
20 + * Abstraction of if-feature entity. It is used to abstract the data holders of if-feature.
21 + */
22 +public interface YangIfFeatureHolder {
23 +
24 + /**
25 + * Returns the list of if-feature from data holder like container / list.
26 + *
27 + * @return the list of if-feature
28 + */
29 + List<YangIfFeature> getIfFeatureList();
30 +
31 + /**
32 + * Adds if-feature in if-feature list.
33 + *
34 + * @param ifFeature the if-feature to be added
35 + */
36 + void addIfFeatureList(YangIfFeature ifFeature);
37 +
38 + /**
39 + * Sets the list of if-feature.
40 + *
41 + * @param ifFeatureList the list of if-feature to set
42 + */
43 + void setIfFeatureList(List<YangIfFeature> ifFeatureList);
44 +}
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 package org.onosproject.yangutils.datamodel; 16 package org.onosproject.yangutils.datamodel;
17 17
18 import java.io.Serializable; 18 import java.io.Serializable;
19 +import java.util.Date;
19 import java.util.Set; 20 import java.util.Set;
20 21
21 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 22 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
...@@ -61,7 +62,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.findRefer ...@@ -61,7 +62,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.findRefer
61 * | substatement | section | cardinality |data model mapping| 62 * | substatement | section | cardinality |data model mapping|
62 * +---------------+---------+-------------+------------------+ 63 * +---------------+---------+-------------+------------------+
63 * | prefix | 7.1.4 | 1 | string | 64 * | prefix | 7.1.4 | 1 | string |
64 - * | revision-date | 7.1.5.1 | 0..1 | string | 65 + * | revision-date | 7.1.5.1 | 0..1 | Date |
65 * +---------------+---------+-------------+------------------+ 66 * +---------------+---------+-------------+------------------+
66 */ 67 */
67 68
...@@ -91,7 +92,7 @@ public class YangImport ...@@ -91,7 +92,7 @@ public class YangImport
91 * the most recent "revision" statement in the imported module. organization 92 * the most recent "revision" statement in the imported module. organization
92 * which defined the YANG module. 93 * which defined the YANG module.
93 */ 94 */
94 - private String revision; 95 + private Date revision;
95 96
96 /** 97 /**
97 * Reference to node which is imported. 98 * Reference to node which is imported.
...@@ -152,7 +153,7 @@ public class YangImport ...@@ -152,7 +153,7 @@ public class YangImport
152 * 153 *
153 * @return the revision of the imported module 154 * @return the revision of the imported module
154 */ 155 */
155 - public String getRevision() { 156 + public Date getRevision() {
156 return revision; 157 return revision;
157 } 158 }
158 159
...@@ -161,7 +162,7 @@ public class YangImport ...@@ -161,7 +162,7 @@ public class YangImport
161 * 162 *
162 * @param rev set the revision of the imported module 163 * @param rev set the revision of the imported module
163 */ 164 */
164 - public void setRevision(String rev) { 165 + public void setRevision(Date rev) {
165 revision = rev; 166 revision = rev;
166 } 167 }
167 168
...@@ -245,7 +246,7 @@ public class YangImport ...@@ -245,7 +246,7 @@ public class YangImport
245 */ 246 */
246 public void addReferenceToImport(Set<YangNode> yangNodeSet) throws DataModelException { 247 public void addReferenceToImport(Set<YangNode> yangNodeSet) throws DataModelException {
247 String importedModuleName = getModuleName(); 248 String importedModuleName = getModuleName();
248 - String importedModuleRevision = getRevision(); 249 + Date importedModuleRevision = getRevision();
249 YangNode moduleNode = null; 250 YangNode moduleNode = null;
250 /* 251 /*
251 * Find the imported module node for a given module name with a 252 * Find the imported module node for a given module name with a
...@@ -266,7 +267,7 @@ public class YangImport ...@@ -266,7 +267,7 @@ public class YangImport
266 267
267 if (moduleNode != null) { 268 if (moduleNode != null) {
268 if (moduleNode instanceof YangModule) { 269 if (moduleNode instanceof YangModule) {
269 - if (getRevision() == null || getRevision().isEmpty()) { 270 + if (getRevision() == null) {
270 setImportedNode(moduleNode); 271 setImportedNode(moduleNode);
271 return; 272 return;
272 } 273 }
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 package org.onosproject.yangutils.datamodel; 16 package org.onosproject.yangutils.datamodel;
17 17
18 import java.io.Serializable; 18 import java.io.Serializable;
19 +import java.util.Date;
19 import java.util.Set; 20 import java.util.Set;
20 21
21 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 22 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
...@@ -56,7 +57,7 @@ public class YangInclude ...@@ -56,7 +57,7 @@ public class YangInclude
56 * The include's "revision-date" statement is used to specify the exact 57 * The include's "revision-date" statement is used to specify the exact
57 * version of the submodule to import. 58 * version of the submodule to import.
58 */ 59 */
59 - private String revision; 60 + private Date revision;
60 61
61 /** 62 /**
62 * Reference to node which is included. 63 * Reference to node which is included.
...@@ -98,7 +99,7 @@ public class YangInclude ...@@ -98,7 +99,7 @@ public class YangInclude
98 * 99 *
99 * @return the revision 100 * @return the revision
100 */ 101 */
101 - public String getRevision() { 102 + public Date getRevision() {
102 return revision; 103 return revision;
103 } 104 }
104 105
...@@ -107,7 +108,7 @@ public class YangInclude ...@@ -107,7 +108,7 @@ public class YangInclude
107 * 108 *
108 * @param revision the revision to set 109 * @param revision the revision to set
109 */ 110 */
110 - public void setRevision(String revision) { 111 + public void setRevision(Date revision) {
111 this.revision = revision; 112 this.revision = revision;
112 } 113 }
113 114
...@@ -182,7 +183,7 @@ public class YangInclude ...@@ -182,7 +183,7 @@ public class YangInclude
182 */ 183 */
183 public YangSubModule addReferenceToInclude(Set<YangNode> yangNodeSet) throws DataModelException { 184 public YangSubModule addReferenceToInclude(Set<YangNode> yangNodeSet) throws DataModelException {
184 String includedSubModuleName = getSubModuleName(); 185 String includedSubModuleName = getSubModuleName();
185 - String includedSubModuleRevision = getRevision(); 186 + Date includedSubModuleRevision = getRevision();
186 YangNode subModuleNode = null; 187 YangNode subModuleNode = null;
187 188
188 /* 189 /*
...@@ -204,7 +205,7 @@ public class YangInclude ...@@ -204,7 +205,7 @@ public class YangInclude
204 205
205 if (subModuleNode != null) { 206 if (subModuleNode != null) {
206 if (subModuleNode instanceof YangSubModule) { 207 if (subModuleNode instanceof YangSubModule) {
207 - if (getRevision() == null || getRevision().isEmpty()) { 208 + if (getRevision() == null) {
208 setIncludedNode(subModuleNode); 209 setIncludedNode(subModuleNode);
209 return (YangSubModule) subModuleNode; 210 return (YangSubModule) subModuleNode;
210 } 211 }
......
...@@ -17,7 +17,8 @@ ...@@ -17,7 +17,8 @@
17 package org.onosproject.yangutils.datamodel; 17 package org.onosproject.yangutils.datamodel;
18 18
19 import java.io.Serializable; 19 import java.io.Serializable;
20 - 20 +import java.util.LinkedList;
21 +import java.util.List;
21 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 22 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
22 import org.onosproject.yangutils.datamodel.utils.Parsable; 23 import org.onosproject.yangutils.datamodel.utils.Parsable;
23 import org.onosproject.yangutils.datamodel.utils.YangConstructType; 24 import org.onosproject.yangutils.datamodel.utils.YangConstructType;
...@@ -43,16 +44,16 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType; ...@@ -43,16 +44,16 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType;
43 * | substatement | section | cardinality |data model mapping| 44 * | substatement | section | cardinality |data model mapping|
44 * +--------------+---------+-------------+------------------+ 45 * +--------------+---------+-------------+------------------+
45 * | config | 7.19.1 | 0..1 | - boolean | 46 * | config | 7.19.1 | 0..1 | - boolean |
46 - * | default | 7.6.4 | 0..1 | - TODO | 47 + * | default | 7.6.4 | 0..1 | - string |
47 * | description | 7.19.3 | 0..1 | - string | 48 * | description | 7.19.3 | 0..1 | - string |
48 - * | if-feature | 7.18.2 | 0..n | - TODO | 49 + * | if-feature | 7.18.2 | 0..n | - YangIfFeature |
49 * | mandatory | 7.6.5 | 0..1 | - boolean | 50 * | mandatory | 7.6.5 | 0..1 | - boolean |
50 - * | must | 7.5.3 | 0..n | - TODO | 51 + * | must | 7.5.3 | 0..n | - YangMust |
51 * | reference | 7.19.4 | 0..1 | - string | 52 * | reference | 7.19.4 | 0..1 | - string |
52 * | status | 7.19.2 | 0..1 | - YangStatus | 53 * | status | 7.19.2 | 0..1 | - YangStatus |
53 * | type | 7.6.3 | 1 | - YangType | 54 * | type | 7.6.3 | 1 | - YangType |
54 * | units | 7.3.3 | 0..1 | - String | 55 * | units | 7.3.3 | 0..1 | - String |
55 - * | when | 7.19.5 | 0..1 | - TODO | 56 + * | when | 7.19.5 | 0..1 | - YangWhen |
56 * +--------------+---------+-------------+------------------+ 57 * +--------------+---------+-------------+------------------+
57 */ 58 */
58 59
...@@ -60,7 +61,8 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType; ...@@ -60,7 +61,8 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType;
60 * Represents leaf data represented in YANG. 61 * Represents leaf data represented in YANG.
61 */ 62 */
62 public class YangLeaf 63 public class YangLeaf
63 - implements YangCommonInfo, Parsable, Cloneable, Serializable { 64 + implements YangCommonInfo, Parsable, Cloneable, Serializable,
65 + YangMustHolder, YangIfFeatureHolder, YangWhenHolder {
64 66
65 private static final long serialVersionUID = 806201635L; 67 private static final long serialVersionUID = 806201635L;
66 68
...@@ -111,11 +113,26 @@ public class YangLeaf ...@@ -111,11 +113,26 @@ public class YangLeaf
111 private String defaultValueInString; 113 private String defaultValueInString;
112 114
113 /** 115 /**
116 + * When data of the leaf.
117 + */
118 + private YangWhen when;
119 +
120 + /**
114 * YANG Node in which the leaf is contained. 121 * YANG Node in which the leaf is contained.
115 */ 122 */
116 private transient YangLeavesHolder containedIn; 123 private transient YangLeavesHolder containedIn;
117 124
118 /** 125 /**
126 + * List of must statement constraints.
127 + */
128 + private List<YangMust> mustConstraintList;
129 +
130 + /**
131 + * List of if-feature.
132 + */
133 + private List<YangIfFeature> ifFeatureList;
134 +
135 + /**
119 * Creates a YANG leaf. 136 * Creates a YANG leaf.
120 */ 137 */
121 public YangLeaf() { 138 public YangLeaf() {
...@@ -158,6 +175,26 @@ public class YangLeaf ...@@ -158,6 +175,26 @@ public class YangLeaf
158 } 175 }
159 176
160 /** 177 /**
178 + * Returns the when.
179 + *
180 + * @return the when
181 + */
182 + @Override
183 + public YangWhen getWhen() {
184 + return when;
185 + }
186 +
187 + /**
188 + * Sets the when.
189 + *
190 + * @param when the when to set
191 + */
192 + @Override
193 + public void setWhen(YangWhen when) {
194 + this.when = when;
195 + }
196 +
197 + /**
161 * Returns the description. 198 * Returns the description.
162 * 199 *
163 * @return the description 200 * @return the description
...@@ -346,4 +383,40 @@ public class YangLeaf ...@@ -346,4 +383,40 @@ public class YangLeaf
346 // TODO auto-generated method stub, to be implemented by parser 383 // TODO auto-generated method stub, to be implemented by parser
347 384
348 } 385 }
386 +
387 + @Override
388 + public List<YangMust> getListOfMust() {
389 + return mustConstraintList;
390 + }
391 +
392 + @Override
393 + public void setListOfMust(List<YangMust> mustConstraintList) {
394 + this.mustConstraintList = mustConstraintList;
395 + }
396 +
397 + @Override
398 + public void addMust(YangMust must) {
399 + if (getListOfMust() == null) {
400 + setListOfMust(new LinkedList<>());
401 + }
402 + getListOfMust().add(must);
403 + }
404 +
405 + @Override
406 + public List<YangIfFeature> getIfFeatureList() {
407 + return ifFeatureList;
408 + }
409 +
410 + @Override
411 + public void addIfFeatureList(YangIfFeature ifFeature) {
412 + if (getIfFeatureList() == null) {
413 + setIfFeatureList(new LinkedList<>());
414 + }
415 + getIfFeatureList().add(ifFeature);
416 + }
417 +
418 + @Override
419 + public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
420 + this.ifFeatureList = ifFeatureList;
421 + }
349 } 422 }
......
...@@ -17,7 +17,8 @@ ...@@ -17,7 +17,8 @@
17 package org.onosproject.yangutils.datamodel; 17 package org.onosproject.yangutils.datamodel;
18 18
19 import java.io.Serializable; 19 import java.io.Serializable;
20 - 20 +import java.util.LinkedList;
21 +import java.util.List;
21 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 22 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
22 import org.onosproject.yangutils.datamodel.utils.Parsable; 23 import org.onosproject.yangutils.datamodel.utils.Parsable;
23 import org.onosproject.yangutils.datamodel.utils.YangConstructType; 24 import org.onosproject.yangutils.datamodel.utils.YangConstructType;
...@@ -39,16 +40,16 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType; ...@@ -39,16 +40,16 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType;
39 * +--------------+---------+-------------+------------------+ 40 * +--------------+---------+-------------+------------------+
40 * | config | 7.19.1 | 0..1 | -boolean | 41 * | config | 7.19.1 | 0..1 | -boolean |
41 * | description | 7.19.3 | 0..1 | -string | 42 * | description | 7.19.3 | 0..1 | -string |
42 - * | if-feature | 7.18.2 | 0..n | -TODO | 43 + * | if-feature | 7.18.2 | 0..n | -YangIfFeature |
43 * | max-elements | 7.7.4 | 0..1 | -int | 44 * | max-elements | 7.7.4 | 0..1 | -int |
44 * | min-elements | 7.7.3 | 0..1 | -int | 45 * | min-elements | 7.7.3 | 0..1 | -int |
45 - * | must | 7.5.3 | 0..n | -TODO | 46 + * | must | 7.5.3 | 0..n | -YangMust |
46 * | ordered-by | 7.7.5 | 0..1 | -TODO | 47 * | ordered-by | 7.7.5 | 0..1 | -TODO |
47 * | reference | 7.19.4 | 0..1 | -string | 48 * | reference | 7.19.4 | 0..1 | -string |
48 * | status | 7.19.2 | 0..1 | -YangStatus | 49 * | status | 7.19.2 | 0..1 | -YangStatus |
49 * | type | 7.4 | 1 | -YangType | 50 * | type | 7.4 | 1 | -YangType |
50 * | units | 7.3.3 | 0..1 | -string | 51 * | units | 7.3.3 | 0..1 | -string |
51 - * | when | 7.19.5 | 0..1 | -TODO | 52 + * | when | 7.19.5 | 0..1 | -YangWhen |
52 * +--------------+---------+-------------+------------------+ 53 * +--------------+---------+-------------+------------------+
53 */ 54 */
54 55
...@@ -56,7 +57,8 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType; ...@@ -56,7 +57,8 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType;
56 * Represents leaf-list data represented in YANG. 57 * Represents leaf-list data represented in YANG.
57 */ 58 */
58 public class YangLeafList 59 public class YangLeafList
59 - implements YangCommonInfo, Parsable, Cloneable, Serializable { 60 + implements YangCommonInfo, Parsable, Cloneable, Serializable,
61 + YangMustHolder, YangWhenHolder, YangIfFeatureHolder {
60 62
61 private static final long serialVersionUID = 806201637L; 63 private static final long serialVersionUID = 806201637L;
62 64
...@@ -133,6 +135,21 @@ public class YangLeafList ...@@ -133,6 +135,21 @@ public class YangLeafList
133 private transient YangLeavesHolder containedIn; 135 private transient YangLeavesHolder containedIn;
134 136
135 /** 137 /**
138 + * List of must statement constraints.
139 + */
140 + private List<YangMust> mustConstraintList;
141 +
142 + /**
143 + * When data of the leaf.
144 + */
145 + private YangWhen when;
146 +
147 + /**
148 + * List of if-feature.
149 + */
150 + private List<YangIfFeature> ifFeatureList;
151 +
152 + /**
136 * Creates a YANG leaf-list. 153 * Creates a YANG leaf-list.
137 */ 154 */
138 public YangLeafList() { 155 public YangLeafList() {
...@@ -175,6 +192,26 @@ public class YangLeafList ...@@ -175,6 +192,26 @@ public class YangLeafList
175 } 192 }
176 193
177 /** 194 /**
195 + * Returns the when.
196 + *
197 + * @return the when
198 + */
199 + @Override
200 + public YangWhen getWhen() {
201 + return when;
202 + }
203 +
204 + /**
205 + * Sets the when.
206 + *
207 + * @param when the when to set
208 + */
209 + @Override
210 + public void setWhen(YangWhen when) {
211 + this.when = when;
212 + }
213 +
214 + /**
178 * Returns the description. 215 * Returns the description.
179 * 216 *
180 * @return the description 217 * @return the description
...@@ -363,4 +400,40 @@ public class YangLeafList ...@@ -363,4 +400,40 @@ public class YangLeafList
363 // TODO auto-generated method stub, to be implemented by parser 400 // TODO auto-generated method stub, to be implemented by parser
364 401
365 } 402 }
403 +
404 + @Override
405 + public List<YangIfFeature> getIfFeatureList() {
406 + return ifFeatureList;
407 + }
408 +
409 + @Override
410 + public void addIfFeatureList(YangIfFeature ifFeature) {
411 + if (getIfFeatureList() == null) {
412 + setIfFeatureList(new LinkedList<>());
413 + }
414 + getIfFeatureList().add(ifFeature);
415 + }
416 +
417 + @Override
418 + public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
419 + this.ifFeatureList = ifFeatureList;
420 + }
421 +
422 + @Override
423 + public List<YangMust> getListOfMust() {
424 + return mustConstraintList;
425 + }
426 +
427 + @Override
428 + public void setListOfMust(List<YangMust> mustConstraintList) {
429 + this.mustConstraintList = mustConstraintList;
430 + }
431 +
432 + @Override
433 + public void addMust(YangMust must) {
434 + if (getListOfMust() == null) {
435 + setListOfMust(new LinkedList<>());
436 + }
437 + getListOfMust().add(must);
438 + }
366 } 439 }
......
...@@ -46,21 +46,21 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol ...@@ -46,21 +46,21 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol
46 * | container | 7.5 | 0..n |-child nodes | 46 * | container | 7.5 | 0..n |-child nodes |
47 * | description | 7.19.3 | 0..1 |-string | 47 * | description | 7.19.3 | 0..1 |-string |
48 * | grouping | 7.11 | 0..n |-child nodes | 48 * | grouping | 7.11 | 0..n |-child nodes |
49 - * | if-feature | 7.18.2 | 0..n |-TODO | 49 + * | if-feature | 7.18.2 | 0..n |-YangIfFeature |
50 * | key | 7.8.2 | 0..1 |-String list | 50 * | key | 7.8.2 | 0..1 |-String list |
51 * | leaf | 7.6 | 0..n |-YangLeaf | 51 * | leaf | 7.6 | 0..n |-YangLeaf |
52 * | leaf-list | 7.7 | 0..n |-YangLeafList | 52 * | leaf-list | 7.7 | 0..n |-YangLeafList |
53 * | list | 7.8 | 0..n |-child nodes | 53 * | list | 7.8 | 0..n |-child nodes |
54 * | max-elements | 7.7.4 | 0..1 |-int | 54 * | max-elements | 7.7.4 | 0..1 |-int |
55 * | min-elements | 7.7.3 | 0..1 |-int | 55 * | min-elements | 7.7.3 | 0..1 |-int |
56 - * | must | 7.5.3 | 0..n |-TODO | 56 + * | must | 7.5.3 | 0..n |-YangMust |
57 * | ordered-by | 7.7.5 | 0..1 |-TODO | 57 * | ordered-by | 7.7.5 | 0..1 |-TODO |
58 * | reference | 7.19.4 | 0..1 |-string | 58 * | reference | 7.19.4 | 0..1 |-string |
59 * | status | 7.19.2 | 0..1 |-YangStatus | 59 * | status | 7.19.2 | 0..1 |-YangStatus |
60 * | typedef | 7.3 | 0..n |-child nodes | 60 * | typedef | 7.3 | 0..n |-child nodes |
61 * | unique | 7.8.3 | 0..n |-TODO | 61 * | unique | 7.8.3 | 0..n |-TODO |
62 - * | uses | 7.12 | 0..n |-child nodes(TODO)| 62 + * | uses | 7.12 | 0..n |-child nodes |
63 - * | when | 7.19.5 | 0..1 |-TODO | 63 + * | when | 7.19.5 | 0..1 |-YangWhen |
64 * +--------------+---------+-------------+------------------+ 64 * +--------------+---------+-------------+------------------+
65 */ 65 */
66 66
...@@ -69,7 +69,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol ...@@ -69,7 +69,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol
69 */ 69 */
70 public class YangList 70 public class YangList
71 extends YangNode 71 extends YangNode
72 - implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder { 72 + implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder,
73 + YangMustHolder, YangIfFeatureHolder {
73 74
74 private static final long serialVersionUID = 806201609L; 75 private static final long serialVersionUID = 806201609L;
75 76
...@@ -165,10 +166,24 @@ public class YangList ...@@ -165,10 +166,24 @@ public class YangList
165 /** 166 /**
166 * Status of the node. 167 * Status of the node.
167 */ 168 */
168 -
169 private YangStatusType status = YangStatusType.CURRENT; 169 private YangStatusType status = YangStatusType.CURRENT;
170 170
171 /** 171 /**
172 + * List of must statement constraints.
173 + */
174 + private List<YangMust> mustConstraintList;
175 +
176 + /**
177 + * When data of the node.
178 + */
179 + private YangWhen when;
180 +
181 + /**
182 + * List of if-feature.
183 + */
184 + private List<YangIfFeature> ifFeatureList;
185 +
186 + /**
172 * Creates a YANG list object. 187 * Creates a YANG list object.
173 */ 188 */
174 public YangList() { 189 public YangList() {
...@@ -176,6 +191,24 @@ public class YangList ...@@ -176,6 +191,24 @@ public class YangList
176 } 191 }
177 192
178 /** 193 /**
194 + * Returns the when.
195 + *
196 + * @return the when
197 + */
198 + public YangWhen getWhen() {
199 + return when;
200 + }
201 +
202 + /**
203 + * Sets the when.
204 + *
205 + * @param when the when to set
206 + */
207 + public void setWhen(YangWhen when) {
208 + this.when = when;
209 + }
210 +
211 + /**
179 * Returns the YANG list name. 212 * Returns the YANG list name.
180 * 213 *
181 * @return YANG list name 214 * @return YANG list name
...@@ -643,4 +676,40 @@ public class YangList ...@@ -643,4 +676,40 @@ public class YangList
643 return false; 676 return false;
644 // TODO When grouping linking is done this method has to be modified. 677 // TODO When grouping linking is done this method has to be modified.
645 } 678 }
679 +
680 + @Override
681 + public List<YangIfFeature> getIfFeatureList() {
682 + return ifFeatureList;
683 + }
684 +
685 + @Override
686 + public void addIfFeatureList(YangIfFeature ifFeature) {
687 + if (getIfFeatureList() == null) {
688 + setIfFeatureList(new LinkedList<>());
689 + }
690 + getIfFeatureList().add(ifFeature);
691 + }
692 +
693 + @Override
694 + public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
695 + this.ifFeatureList = ifFeatureList;
696 + }
697 +
698 + @Override
699 + public List<YangMust> getListOfMust() {
700 + return mustConstraintList;
701 + }
702 +
703 + @Override
704 + public void setListOfMust(List<YangMust> mustConstraintList) {
705 + this.mustConstraintList = mustConstraintList;
706 + }
707 +
708 + @Override
709 + public void addMust(YangMust must) {
710 + if (getListOfMust() == null) {
711 + setListOfMust(new LinkedList<>());
712 + }
713 + getListOfMust().add(must);
714 + }
646 } 715 }
......
...@@ -74,7 +74,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveLi ...@@ -74,7 +74,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveLi
74 public class YangModule 74 public class YangModule
75 extends YangNode 75 extends YangNode
76 implements YangLeavesHolder, YangDesc, YangReference, Parsable, CollisionDetector, YangReferenceResolver, 76 implements YangLeavesHolder, YangDesc, YangReference, Parsable, CollisionDetector, YangReferenceResolver,
77 - RpcNotificationContainer { 77 + RpcNotificationContainer, YangFeatureHolder {
78 78
79 private static final long serialVersionUID = 806201610L; 79 private static final long serialVersionUID = 806201610L;
80 80
...@@ -85,7 +85,7 @@ public class YangModule ...@@ -85,7 +85,7 @@ public class YangModule
85 85
86 /** 86 /**
87 * Reference:RFC 6020. 87 * Reference:RFC 6020.
88 - * <p> 88 + *
89 * The "contact" statement provides contact information for the module. The 89 * The "contact" statement provides contact information for the module. The
90 * argument is a string that is used to specify contact information for the 90 * argument is a string that is used to specify contact information for the
91 * person or persons to whom technical queries concerning this module should 91 * person or persons to whom technical queries concerning this module should
...@@ -96,7 +96,7 @@ public class YangModule ...@@ -96,7 +96,7 @@ public class YangModule
96 96
97 /** 97 /**
98 * Reference:RFC 6020. 98 * Reference:RFC 6020.
99 - * <p> 99 + *
100 * The "description" statement takes as an argument a string that contains a 100 * The "description" statement takes as an argument a string that contains a
101 * human-readable textual description of this definition. The text is 101 * human-readable textual description of this definition. The text is
102 * provided in a language (or languages) chosen by the module developer; for 102 * provided in a language (or languages) chosen by the module developer; for
...@@ -125,13 +125,18 @@ public class YangModule ...@@ -125,13 +125,18 @@ public class YangModule
125 private List<YangLeafList> listOfLeafList; 125 private List<YangLeafList> listOfLeafList;
126 126
127 /** 127 /**
128 + * List of feature at root level in the module.
129 + */
130 + private List<YangFeature> listOfFeature;
131 +
132 + /**
128 * Name space of the module. 133 * Name space of the module.
129 */ 134 */
130 private YangNameSpace nameSpace; 135 private YangNameSpace nameSpace;
131 136
132 /** 137 /**
133 * Reference:RFC 6020. 138 * Reference:RFC 6020.
134 - * <p> 139 + *
135 * The "organization" statement defines the party responsible for this 140 * The "organization" statement defines the party responsible for this
136 * module. The argument is a string that is used to specify a textual 141 * module. The argument is a string that is used to specify a textual
137 * description of the organization(s) under whose auspices this module was 142 * description of the organization(s) under whose auspices this module was
...@@ -201,6 +206,11 @@ public class YangModule ...@@ -201,6 +206,11 @@ public class YangModule
201 private List<YangResolutionInfo> usesResolutionList; 206 private List<YangResolutionInfo> usesResolutionList;
202 207
203 /** 208 /**
209 + * if-feature resolution list.
210 + */
211 + private List<YangResolutionInfo> ifFeatureResolutionList;
212 +
213 + /**
204 * Creates a YANG node of module type. 214 * Creates a YANG node of module type.
205 */ 215 */
206 public YangModule() { 216 public YangModule() {
...@@ -208,6 +218,7 @@ public class YangModule ...@@ -208,6 +218,7 @@ public class YangModule
208 super(YangNodeType.MODULE_NODE); 218 super(YangNodeType.MODULE_NODE);
209 derivedTypeResolutionList = new LinkedList<>(); 219 derivedTypeResolutionList = new LinkedList<>();
210 usesResolutionList = new LinkedList<>(); 220 usesResolutionList = new LinkedList<>();
221 + ifFeatureResolutionList = new LinkedList<>();
211 importList = new LinkedList<YangImport>(); 222 importList = new LinkedList<YangImport>();
212 includeList = new LinkedList<YangInclude>(); 223 includeList = new LinkedList<YangInclude>();
213 listOfLeaf = new LinkedList<YangLeaf>(); 224 listOfLeaf = new LinkedList<YangLeaf>();
...@@ -373,6 +384,24 @@ public class YangModule ...@@ -373,6 +384,24 @@ public class YangModule
373 getListOfLeafList().add(leafList); 384 getListOfLeafList().add(leafList);
374 } 385 }
375 386
387 + @Override
388 + public List<YangFeature> getFeatureList() {
389 + return listOfFeature;
390 + }
391 +
392 + @Override
393 + public void addFeatureList(YangFeature feature) {
394 + if (getFeatureList() == null) {
395 + setListOfFeature(new LinkedList<>());
396 + }
397 + getFeatureList().add(feature);
398 + }
399 +
400 + @Override
401 + public void setListOfFeature(List<YangFeature> listOfFeature) {
402 + this.listOfFeature = listOfFeature;
403 + }
404 +
376 /** 405 /**
377 * Returns the name space of module elements. 406 * Returns the name space of module elements.
378 * 407 *
...@@ -558,10 +587,11 @@ public class YangModule ...@@ -558,10 +587,11 @@ public class YangModule
558 public List<YangResolutionInfo> getUnresolvedResolutionList(ResolvableType type) { 587 public List<YangResolutionInfo> getUnresolvedResolutionList(ResolvableType type) {
559 if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) { 588 if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) {
560 return derivedTypeResolutionList; 589 return derivedTypeResolutionList;
561 - } else { 590 + } else if (type == ResolvableType.YANG_USES) {
562 return usesResolutionList; 591 return usesResolutionList;
592 + } else {
593 + return ifFeatureResolutionList;
563 } 594 }
564 -
565 } 595 }
566 596
567 @Override 597 @Override
...@@ -571,6 +601,8 @@ public class YangModule ...@@ -571,6 +601,8 @@ public class YangModule
571 derivedTypeResolutionList.add(resolutionInfo); 601 derivedTypeResolutionList.add(resolutionInfo);
572 } else if (type == ResolvableType.YANG_USES) { 602 } else if (type == ResolvableType.YANG_USES) {
573 usesResolutionList.add(resolutionInfo); 603 usesResolutionList.add(resolutionInfo);
604 + } else if (type == ResolvableType.YANG_IF_FEATURE) {
605 + ifFeatureResolutionList.add(resolutionInfo);
574 } 606 }
575 } 607 }
576 608
...@@ -581,6 +613,8 @@ public class YangModule ...@@ -581,6 +613,8 @@ public class YangModule
581 derivedTypeResolutionList = resolutionList; 613 derivedTypeResolutionList = resolutionList;
582 } else if (type == ResolvableType.YANG_USES) { 614 } else if (type == ResolvableType.YANG_USES) {
583 usesResolutionList = resolutionList; 615 usesResolutionList = resolutionList;
616 + } else if (type == ResolvableType.YANG_IF_FEATURE) {
617 + ifFeatureResolutionList.add((YangResolutionInfo) resolutionList);
584 } 618 }
585 619
586 } 620 }
......
...@@ -55,7 +55,7 @@ public class YangMust implements YangDesc, YangReference, Parsable, Serializable ...@@ -55,7 +55,7 @@ public class YangMust implements YangDesc, YangReference, Parsable, Serializable
55 /** 55 /**
56 * Constraint info. 56 * Constraint info.
57 */ 57 */
58 - private String constratint; 58 + private String constraint;
59 59
60 /** 60 /**
61 * Description string. 61 * Description string.
...@@ -78,17 +78,17 @@ public class YangMust implements YangDesc, YangReference, Parsable, Serializable ...@@ -78,17 +78,17 @@ public class YangMust implements YangDesc, YangReference, Parsable, Serializable
78 * 78 *
79 * @return the constraint 79 * @return the constraint
80 */ 80 */
81 - public String getConstratint() { 81 + public String getConstraint() {
82 - return constratint; 82 + return constraint;
83 } 83 }
84 84
85 /** 85 /**
86 * Sets the constraint. 86 * Sets the constraint.
87 * 87 *
88 - * @param constratint the constraint to set 88 + * @param constraint the constraint to set
89 */ 89 */
90 - public void setConstratint(String constratint) { 90 + public void setConstraint(String constraint) {
91 - this.constratint = constratint; 91 + this.constraint = constraint;
92 } 92 }
93 93
94 /** 94 /**
......
1 +/*
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 +
17 +package org.onosproject.yangutils.datamodel;
18 +
19 +import java.util.List;
20 +
21 +/**
22 + * Abstraction of must entity. It is used to abstract the data holders of must.
23 + */
24 +public interface YangMustHolder {
25 +
26 + /**
27 + * Returns the list of must from data holder like container / list.
28 + *
29 + * @return the list of must
30 + */
31 + List<YangMust> getListOfMust();
32 +
33 + /**
34 + * Sets the list of must.
35 + *
36 + * @param mustConstraintList the list of must to set
37 + */
38 + void setListOfMust(List<YangMust> mustConstraintList);
39 +
40 + /**
41 + * Adds must in data holder like container / list.
42 + *
43 + * @param must the must to be added
44 + */
45 + void addMust(YangMust must);
46 +}
...@@ -60,7 +60,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol ...@@ -60,7 +60,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol
60 * | container | 7.5 | 0..n | -child nodes | 60 * | container | 7.5 | 0..n | -child nodes |
61 * | description | 7.19.3 | 0..1 | -string | 61 * | description | 7.19.3 | 0..1 | -string |
62 * | grouping | 7.11 | 0..n | -child nodes | 62 * | grouping | 7.11 | 0..n | -child nodes |
63 - * | if-feature | 7.18.2 | 0..n | -TODO | 63 + * | if-feature | 7.18.2 | 0..n | -YangIfFeature |
64 * | leaf | 7.6 | 0..n | -YangLeaf | 64 * | leaf | 7.6 | 0..n | -YangLeaf |
65 * | leaf-list | 7.7 | 0..n | -YangLeafList | 65 * | leaf-list | 7.7 | 0..n | -YangLeafList |
66 * | list | 7.8 | 0..n | -child nodes | 66 * | list | 7.8 | 0..n | -child nodes |
...@@ -76,7 +76,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol ...@@ -76,7 +76,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol
76 */ 76 */
77 public class YangNotification 77 public class YangNotification
78 extends YangNode 78 extends YangNode
79 - implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder { 79 + implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder,
80 + YangIfFeatureHolder {
80 81
81 private static final long serialVersionUID = 806201611L; 82 private static final long serialVersionUID = 806201611L;
82 83
...@@ -111,6 +112,11 @@ public class YangNotification ...@@ -111,6 +112,11 @@ public class YangNotification
111 private YangStatusType status = YangStatusType.CURRENT; 112 private YangStatusType status = YangStatusType.CURRENT;
112 113
113 /** 114 /**
115 + * List of if-feature.
116 + */
117 + private List<YangIfFeature> ifFeatureList;
118 +
119 + /**
114 * Create a notification node. 120 * Create a notification node.
115 */ 121 */
116 public YangNotification() { 122 public YangNotification() {
...@@ -221,4 +227,22 @@ public class YangNotification ...@@ -221,4 +227,22 @@ public class YangNotification
221 public void setStatus(YangStatusType status) { 227 public void setStatus(YangStatusType status) {
222 this.status = status; 228 this.status = status;
223 } 229 }
230 +
231 + @Override
232 + public List<YangIfFeature> getIfFeatureList() {
233 + return ifFeatureList;
234 + }
235 +
236 + @Override
237 + public void addIfFeatureList(YangIfFeature ifFeature) {
238 + if (getIfFeatureList() == null) {
239 + setIfFeatureList(new LinkedList<>());
240 + }
241 + getIfFeatureList().add(ifFeature);
242 + }
243 +
244 + @Override
245 + public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
246 + this.ifFeatureList = ifFeatureList;
247 + }
224 } 248 }
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
16 package org.onosproject.yangutils.datamodel; 16 package org.onosproject.yangutils.datamodel;
17 17
18 import java.io.Serializable; 18 import java.io.Serializable;
19 - 19 +import java.util.Date;
20 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 20 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
21 import org.onosproject.yangutils.datamodel.utils.Parsable; 21 import org.onosproject.yangutils.datamodel.utils.Parsable;
22 import org.onosproject.yangutils.datamodel.utils.YangConstructType; 22 import org.onosproject.yangutils.datamodel.utils.YangConstructType;
...@@ -41,6 +41,7 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType; ...@@ -41,6 +41,7 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType;
41 * | reference | 7.19.4 | 0..1 |sring | 41 * | reference | 7.19.4 | 0..1 |sring |
42 * +--------------+---------+-------------+------------------+ 42 * +--------------+---------+-------------+------------------+
43 */ 43 */
44 +
44 /** 45 /**
45 * Represents the information about the revision. 46 * Represents the information about the revision.
46 */ 47 */
...@@ -51,7 +52,7 @@ public class YangRevision implements YangDesc, YangReference, Parsable, Serializ ...@@ -51,7 +52,7 @@ public class YangRevision implements YangDesc, YangReference, Parsable, Serializ
51 /** 52 /**
52 * Revision date. Date string in the format "YYYY-MM-DD" 53 * Revision date. Date string in the format "YYYY-MM-DD"
53 */ 54 */
54 - private String revDate; 55 + private Date revDate;
55 56
56 /** 57 /**
57 * Description of revision. 58 * Description of revision.
...@@ -74,7 +75,7 @@ public class YangRevision implements YangDesc, YangReference, Parsable, Serializ ...@@ -74,7 +75,7 @@ public class YangRevision implements YangDesc, YangReference, Parsable, Serializ
74 * 75 *
75 * @return the revision date 76 * @return the revision date
76 */ 77 */
77 - public String getRevDate() { 78 + public Date getRevDate() {
78 return revDate; 79 return revDate;
79 } 80 }
80 81
...@@ -83,7 +84,7 @@ public class YangRevision implements YangDesc, YangReference, Parsable, Serializ ...@@ -83,7 +84,7 @@ public class YangRevision implements YangDesc, YangReference, Parsable, Serializ
83 * 84 *
84 * @param revDate the revision date to set 85 * @param revDate the revision date to set
85 */ 86 */
86 - public void setRevDate(String revDate) { 87 + public void setRevDate(Date revDate) {
87 this.revDate = revDate; 88 this.revDate = revDate;
88 } 89 }
89 90
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
16 16
17 package org.onosproject.yangutils.datamodel; 17 package org.onosproject.yangutils.datamodel;
18 18
19 +import java.util.LinkedList;
20 +import java.util.List;
19 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 21 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
20 import org.onosproject.yangutils.datamodel.utils.Parsable; 22 import org.onosproject.yangutils.datamodel.utils.Parsable;
21 import org.onosproject.yangutils.datamodel.utils.YangConstructType; 23 import org.onosproject.yangutils.datamodel.utils.YangConstructType;
...@@ -44,7 +46,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol ...@@ -44,7 +46,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol
44 * +--------------+---------+-------------+------------------+ 46 * +--------------+---------+-------------+------------------+
45 * | description | 7.19.3 | 0..1 | -string | 47 * | description | 7.19.3 | 0..1 | -string |
46 * | grouping | 7.11 | 0..n | -child nodes | 48 * | grouping | 7.11 | 0..n | -child nodes |
47 - * | if-feature | 7.18.2 | 0..n | -TODO | 49 + * | if-feature | 7.18.2 | 0..n | -YangIfFeature |
48 * | input | 7.13.2 | 0..1 | -child nodes | 50 * | input | 7.13.2 | 0..1 | -child nodes |
49 * | output | 7.13.3 | 0..1 | -child nodes | 51 * | output | 7.13.3 | 0..1 | -child nodes |
50 * | reference | 7.19.4 | 0..1 | -string | 52 * | reference | 7.19.4 | 0..1 | -string |
...@@ -57,7 +59,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol ...@@ -57,7 +59,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCol
57 * Represents data model node to maintain information defined in YANG rpc. 59 * Represents data model node to maintain information defined in YANG rpc.
58 */ 60 */
59 public class YangRpc extends YangNode implements YangCommonInfo, Parsable, 61 public class YangRpc extends YangNode implements YangCommonInfo, Parsable,
60 - CollisionDetector { 62 + CollisionDetector, YangIfFeatureHolder {
61 63
62 private static final long serialVersionUID = 806201613L; 64 private static final long serialVersionUID = 806201613L;
63 65
...@@ -82,6 +84,11 @@ public class YangRpc extends YangNode implements YangCommonInfo, Parsable, ...@@ -82,6 +84,11 @@ public class YangRpc extends YangNode implements YangCommonInfo, Parsable,
82 private YangStatusType status = YangStatusType.CURRENT; 84 private YangStatusType status = YangStatusType.CURRENT;
83 85
84 /** 86 /**
87 + * List of if-feature.
88 + */
89 + private List<YangIfFeature> ifFeatureList;
90 +
91 + /**
85 * Create a rpc node. 92 * Create a rpc node.
86 */ 93 */
87 public YangRpc() { 94 public YangRpc() {
...@@ -156,4 +163,22 @@ public class YangRpc extends YangNode implements YangCommonInfo, Parsable, ...@@ -156,4 +163,22 @@ public class YangRpc extends YangNode implements YangCommonInfo, Parsable,
156 public void setStatus(YangStatusType status) { 163 public void setStatus(YangStatusType status) {
157 this.status = status; 164 this.status = status;
158 } 165 }
166 +
167 + @Override
168 + public List<YangIfFeature> getIfFeatureList() {
169 + return ifFeatureList;
170 + }
171 +
172 + @Override
173 + public void addIfFeatureList(YangIfFeature ifFeature) {
174 + if (getIfFeatureList() == null) {
175 + setIfFeatureList(new LinkedList<>());
176 + }
177 + getIfFeatureList().add(ifFeature);
178 + }
179 +
180 + @Override
181 + public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
182 + this.ifFeatureList = ifFeatureList;
183 + }
159 } 184 }
......
...@@ -57,7 +57,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveLi ...@@ -57,7 +57,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveLi
57 * | description | 7.19.3 | 0..1 | - string | 57 * | description | 7.19.3 | 0..1 | - string |
58 * | deviation | 7.18.3 | 0..n | - TODO | 58 * | deviation | 7.18.3 | 0..n | - TODO |
59 * | extension | 7.17 | 0..n | - TODO | 59 * | extension | 7.17 | 0..n | - TODO |
60 - * | feature | 7.18.1 | 0..n | - TODO | 60 + * | feature | 7.18.1 | 0..n | - YangFeature |
61 * | grouping | 7.11 | 0..n | - child nodes | 61 * | grouping | 7.11 | 0..n | - child nodes |
62 * | identity | 7.16 | 0..n | - TODO | 62 * | identity | 7.16 | 0..n | - TODO |
63 * | import | 7.1.5 | 0..n | - YangImport | 63 * | import | 7.1.5 | 0..n | - YangImport |
...@@ -82,7 +82,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveLi ...@@ -82,7 +82,7 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveLi
82 public class YangSubModule 82 public class YangSubModule
83 extends YangNode 83 extends YangNode
84 implements YangLeavesHolder, YangDesc, YangReference, Parsable, CollisionDetector, YangReferenceResolver, 84 implements YangLeavesHolder, YangDesc, YangReference, Parsable, CollisionDetector, YangReferenceResolver,
85 - RpcNotificationContainer { 85 + RpcNotificationContainer, YangFeatureHolder {
86 86
87 private static final long serialVersionUID = 806201614L; 87 private static final long serialVersionUID = 806201614L;
88 88
...@@ -133,6 +133,11 @@ public class YangSubModule ...@@ -133,6 +133,11 @@ public class YangSubModule
133 private List<YangLeafList> listOfLeafList; 133 private List<YangLeafList> listOfLeafList;
134 134
135 /** 135 /**
136 + * List of feature at root level in the module.
137 + */
138 + private List<YangFeature> listOfFeature;
139 +
140 + /**
136 * Organization owner of the sub-module. 141 * Organization owner of the sub-module.
137 */ 142 */
138 private String organization; 143 private String organization;
...@@ -199,12 +204,18 @@ public class YangSubModule ...@@ -199,12 +204,18 @@ public class YangSubModule
199 private List<YangResolutionInfo> usesResolutionList; 204 private List<YangResolutionInfo> usesResolutionList;
200 205
201 /** 206 /**
207 + * if-feature resolution list.
208 + */
209 + private List<YangResolutionInfo> ifFeatureResolutionList;
210 +
211 + /**
202 * Creates a sub module node. 212 * Creates a sub module node.
203 */ 213 */
204 public YangSubModule() { 214 public YangSubModule() {
205 super(YangNodeType.SUB_MODULE_NODE); 215 super(YangNodeType.SUB_MODULE_NODE);
206 derivedTypeResolutionList = new LinkedList<>(); 216 derivedTypeResolutionList = new LinkedList<>();
207 usesResolutionList = new LinkedList<>(); 217 usesResolutionList = new LinkedList<>();
218 + ifFeatureResolutionList = new LinkedList<>();
208 importList = new LinkedList<YangImport>(); 219 importList = new LinkedList<YangImport>();
209 includeList = new LinkedList<YangInclude>(); 220 includeList = new LinkedList<YangInclude>();
210 listOfLeaf = new LinkedList<YangLeaf>(); 221 listOfLeaf = new LinkedList<YangLeaf>();
...@@ -538,8 +549,10 @@ public class YangSubModule ...@@ -538,8 +549,10 @@ public class YangSubModule
538 public List<YangResolutionInfo> getUnresolvedResolutionList(ResolvableType type) { 549 public List<YangResolutionInfo> getUnresolvedResolutionList(ResolvableType type) {
539 if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) { 550 if (type == ResolvableType.YANG_DERIVED_DATA_TYPE) {
540 return derivedTypeResolutionList; 551 return derivedTypeResolutionList;
541 - } else { 552 + } else if (type == ResolvableType.YANG_USES) {
542 return usesResolutionList; 553 return usesResolutionList;
554 + } else {
555 + return ifFeatureResolutionList;
543 } 556 }
544 } 557 }
545 558
...@@ -550,6 +563,8 @@ public class YangSubModule ...@@ -550,6 +563,8 @@ public class YangSubModule
550 derivedTypeResolutionList.add(resolutionInfo); 563 derivedTypeResolutionList.add(resolutionInfo);
551 } else if (type == ResolvableType.YANG_USES) { 564 } else if (type == ResolvableType.YANG_USES) {
552 usesResolutionList.add(resolutionInfo); 565 usesResolutionList.add(resolutionInfo);
566 + } else if (type == ResolvableType.YANG_IF_FEATURE) {
567 + ifFeatureResolutionList.add(resolutionInfo);
553 } 568 }
554 } 569 }
555 570
...@@ -560,6 +575,8 @@ public class YangSubModule ...@@ -560,6 +575,8 @@ public class YangSubModule
560 derivedTypeResolutionList = resolutionList; 575 derivedTypeResolutionList = resolutionList;
561 } else if (type == ResolvableType.YANG_USES) { 576 } else if (type == ResolvableType.YANG_USES) {
562 usesResolutionList = resolutionList; 577 usesResolutionList = resolutionList;
578 + } else if (type == ResolvableType.YANG_IF_FEATURE) {
579 + ifFeatureResolutionList = resolutionList;
563 } 580 }
564 581
565 } 582 }
...@@ -601,4 +618,22 @@ public class YangSubModule ...@@ -601,4 +618,22 @@ public class YangSubModule
601 yangImport.addReferenceToImport(yangNodeSet); 618 yangImport.addReferenceToImport(yangNodeSet);
602 } 619 }
603 } 620 }
621 +
622 + @Override
623 + public List<YangFeature> getFeatureList() {
624 + return listOfFeature;
625 + }
626 +
627 + @Override
628 + public void addFeatureList(YangFeature feature) {
629 + if (getFeatureList() == null) {
630 + setListOfFeature(new LinkedList<>());
631 + }
632 + getFeatureList().add(feature);
633 + }
634 +
635 + @Override
636 + public void setListOfFeature(List<YangFeature> listOfFeature) {
637 + this.listOfFeature = listOfFeature;
638 + }
604 } 639 }
......
...@@ -48,11 +48,11 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParent ...@@ -48,11 +48,11 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParent
48 * +--------------+---------+-------------+------------------+ 48 * +--------------+---------+-------------+------------------+
49 * | augment | 7.15 | 0..1 | -child nodes | 49 * | augment | 7.15 | 0..1 | -child nodes |
50 * | description | 7.19.3 | 0..1 | -string | 50 * | description | 7.19.3 | 0..1 | -string |
51 - * | if-feature | 7.18.2 | 0..n | -TODO | 51 + * | if-feature | 7.18.2 | 0..n | -YangIfFeature |
52 * | refine | 7.12.2 | 0..1 | -TODO | 52 * | refine | 7.12.2 | 0..1 | -TODO |
53 * | reference | 7.19.4 | 0..1 | -string | 53 * | reference | 7.19.4 | 0..1 | -string |
54 * | status | 7.19.2 | 0..1 | -YangStatus | 54 * | status | 7.19.2 | 0..1 | -YangStatus |
55 - * | when | 7.19.5 | 0..1 | -TODO | 55 + * | when | 7.19.5 | 0..1 | -YangWhen |
56 * +--------------+---------+-------------+------------------+ 56 * +--------------+---------+-------------+------------------+
57 */ 57 */
58 58
...@@ -61,7 +61,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParent ...@@ -61,7 +61,8 @@ import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParent
61 */ 61 */
62 public class YangUses 62 public class YangUses
63 extends YangNode 63 extends YangNode
64 - implements YangCommonInfo, Parsable, Resolvable, CollisionDetector { 64 + implements YangCommonInfo, Parsable, Resolvable, CollisionDetector, YangWhenHolder,
65 + YangIfFeatureHolder {
65 66
66 private static final long serialVersionUID = 806201617L; 67 private static final long serialVersionUID = 806201617L;
67 68
...@@ -91,6 +92,16 @@ public class YangUses ...@@ -91,6 +92,16 @@ public class YangUses
91 private YangStatusType status; 92 private YangStatusType status;
92 93
93 /** 94 /**
95 + * When data of the node.
96 + */
97 + private YangWhen when;
98 +
99 + /**
100 + * List of if-feature.
101 + */
102 + private List<YangIfFeature> ifFeatureList;
103 +
104 + /**
94 * Status of resolution. If completely resolved enum value is "RESOLVED", 105 * Status of resolution. If completely resolved enum value is "RESOLVED",
95 * if not enum value is "UNRESOLVED", in case reference of grouping/typedef 106 * if not enum value is "UNRESOLVED", in case reference of grouping/typedef
96 * is added to uses/type but it's not resolved value of enum should be 107 * is added to uses/type but it's not resolved value of enum should be
...@@ -144,6 +155,26 @@ public class YangUses ...@@ -144,6 +155,26 @@ public class YangUses
144 } 155 }
145 156
146 /** 157 /**
158 + * Returns the when.
159 + *
160 + * @return the when
161 + */
162 + @Override
163 + public YangWhen getWhen() {
164 + return when;
165 + }
166 +
167 + /**
168 + * Sets the when.
169 + *
170 + * @param when the when to set
171 + */
172 + @Override
173 + public void setWhen(YangWhen when) {
174 + this.when = when;
175 + }
176 +
177 + /**
147 * Returns the description. 178 * Returns the description.
148 * 179 *
149 * @return the description 180 * @return the description
...@@ -503,4 +534,22 @@ public class YangUses ...@@ -503,4 +534,22 @@ public class YangUses
503 public List<List<YangLeafList>> getUsesResolvedListOfLeafList() { 534 public List<List<YangLeafList>> getUsesResolvedListOfLeafList() {
504 return resolvedGroupingLeafLists; 535 return resolvedGroupingLeafLists;
505 } 536 }
537 +
538 + @Override
539 + public List<YangIfFeature> getIfFeatureList() {
540 + return ifFeatureList;
541 + }
542 +
543 + @Override
544 + public void addIfFeatureList(YangIfFeature ifFeature) {
545 + if (getIfFeatureList() == null) {
546 + setIfFeatureList(new LinkedList<>());
547 + }
548 + getIfFeatureList().add(ifFeature);
549 + }
550 +
551 + @Override
552 + public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
553 + this.ifFeatureList = ifFeatureList;
554 + }
506 } 555 }
......
1 +/*
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 +package org.onosproject.yangutils.datamodel;
17 +
18 +import java.io.Serializable;
19 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
20 +import org.onosproject.yangutils.datamodel.utils.Parsable;
21 +import org.onosproject.yangutils.datamodel.utils.YangConstructType;
22 +
23 +/*
24 + * Reference RFC 6020.
25 + *
26 + * The "when" statement makes its parent data definition statement
27 + * conditional. The node defined by the parent data definition
28 + * statement is only valid when the condition specified by the "when"
29 + * statement is satisfied.
30 + *
31 + * The statement's argument is an XPath expression, which is used to formally
32 + * specify this condition. If the XPath expression conceptually evaluates to
33 + * "true" for a particular instance, then the node defined by the parent data
34 + * definition statement is valid; otherwise, it is not.
35 + *
36 + * The when's sub-statements
37 + *
38 + * +---------------+---------+-------------+------------------+
39 + * | substatement | section | cardinality |data model mapping|
40 + * +---------------+---------+-------------+------------------+
41 + * | description | 7.19.3 | 0..1 | -string |
42 + * | reference | 7.19.4 | 0..1 | -string |
43 + * +---------------+---------+-------------+------------------+
44 + */
45 +
46 +/**
47 + * Represents information defined in YANG when.
48 + */
49 +public class YangWhen implements YangDesc, YangReference, Parsable, Serializable {
50 +
51 + private static final long serialVersionUID = 806201646L;
52 +
53 + /**
54 + * When condition info.
55 + */
56 + private String condition;
57 +
58 + /**
59 + * Description string.
60 + */
61 + private String description;
62 +
63 + /**
64 + * Reference string.
65 + */
66 + private String reference;
67 +
68 + /**
69 + * Creates a YANG when restriction.
70 + */
71 + public YangWhen() {
72 + }
73 +
74 + /**
75 + * Returns the condition.
76 + *
77 + * @return the condition
78 + */
79 + public String getCondition() {
80 + return condition;
81 + }
82 +
83 + /**
84 + * Sets the condition.
85 + *
86 + * @param condition the condition to set
87 + */
88 + public void setCondition(String condition) {
89 + this.condition = condition;
90 + }
91 +
92 + /**
93 + * Returns the description.
94 + *
95 + * @return the description
96 + */
97 + @Override
98 + public String getDescription() {
99 + return description;
100 + }
101 +
102 + /**
103 + * Sets the description.
104 + *
105 + * @param description set the description
106 + */
107 + @Override
108 + public void setDescription(String description) {
109 + this.description = description;
110 + }
111 +
112 + /**
113 + * Returns the textual reference.
114 + *
115 + * @return the reference
116 + */
117 + @Override
118 + public String getReference() {
119 + return reference;
120 + }
121 +
122 + /**
123 + * Sets the textual reference.
124 + *
125 + * @param reference the reference to set
126 + */
127 + @Override
128 + public void setReference(String reference) {
129 + this.reference = reference;
130 + }
131 +
132 + /**
133 + * Returns the type of the parsed data.
134 + *
135 + * @return returns WHEN_DATA
136 + */
137 + @Override
138 + public YangConstructType getYangConstructType() {
139 + return YangConstructType.WHEN_DATA;
140 + }
141 +
142 + /**
143 + * Validates the data on entering the corresponding parse tree node.
144 + *
145 + * @throws DataModelException a violation of data model rules
146 + */
147 + @Override
148 + public void validateDataOnEntry() throws DataModelException {
149 + // TODO auto-generated method stub, to be implemented by parser
150 + }
151 +
152 + /**
153 + * Validates the data on exiting the corresponding parse tree node.
154 + *
155 + * @throws DataModelException a violation of data model rules
156 + */
157 + @Override
158 + public void validateDataOnExit() throws DataModelException {
159 + // TODO auto-generated method stub, to be implemented by parser
160 + }
161 +}
1 +/*
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 +
17 +package org.onosproject.yangutils.datamodel;
18 +
19 +/**
20 + * Abstraction of when entity. It is used to abstract the data holders of when.
21 + */
22 +public interface YangWhenHolder {
23 +
24 + /**
25 + * Returns the when.
26 + *
27 + * @return the when
28 + */
29 + YangWhen getWhen();
30 +
31 + /**
32 + * Sets the when.
33 + *
34 + * @param when the when to set
35 + */
36 + void setWhen(YangWhen when);
37 +}
...@@ -21,6 +21,7 @@ import java.util.Set; ...@@ -21,6 +21,7 @@ import java.util.Set;
21 21
22 import org.onosproject.yangutils.datamodel.CollisionDetector; 22 import org.onosproject.yangutils.datamodel.CollisionDetector;
23 import org.onosproject.yangutils.datamodel.ResolvableType; 23 import org.onosproject.yangutils.datamodel.ResolvableType;
24 +import org.onosproject.yangutils.datamodel.YangIfFeature;
24 import org.onosproject.yangutils.datamodel.YangLeaf; 25 import org.onosproject.yangutils.datamodel.YangLeaf;
25 import org.onosproject.yangutils.datamodel.YangLeafList; 26 import org.onosproject.yangutils.datamodel.YangLeafList;
26 import org.onosproject.yangutils.datamodel.YangLeavesHolder; 27 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
...@@ -29,13 +30,14 @@ import org.onosproject.yangutils.datamodel.YangReferenceResolver; ...@@ -29,13 +30,14 @@ import org.onosproject.yangutils.datamodel.YangReferenceResolver;
29 import org.onosproject.yangutils.datamodel.YangResolutionInfo; 30 import org.onosproject.yangutils.datamodel.YangResolutionInfo;
30 import org.onosproject.yangutils.datamodel.YangRpc; 31 import org.onosproject.yangutils.datamodel.YangRpc;
31 import org.onosproject.yangutils.datamodel.YangType; 32 import org.onosproject.yangutils.datamodel.YangType;
33 +import org.onosproject.yangutils.datamodel.YangUses;
32 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 34 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
33 35
34 -
35 /** 36 /**
36 * Represents utilities for data model tree. 37 * Represents utilities for data model tree.
37 */ 38 */
38 public final class DataModelUtils { 39 public final class DataModelUtils {
40 +
39 /** 41 /**
40 * Creates a new data model tree utility. 42 * Creates a new data model tree utility.
41 */ 43 */
...@@ -161,11 +163,15 @@ public final class DataModelUtils { ...@@ -161,11 +163,15 @@ public final class DataModelUtils {
161 .getEntityToResolve() instanceof YangType) { 163 .getEntityToResolve() instanceof YangType) {
162 resolutionNode.addToResolutionList(resolutionInfo, 164 resolutionNode.addToResolutionList(resolutionInfo,
163 ResolvableType.YANG_DERIVED_DATA_TYPE); 165 ResolvableType.YANG_DERIVED_DATA_TYPE);
164 - } else { 166 + } else if (resolutionInfo.getEntityToResolveInfo()
167 + .getEntityToResolve() instanceof YangUses) {
165 resolutionNode.addToResolutionList(resolutionInfo, 168 resolutionNode.addToResolutionList(resolutionInfo,
166 ResolvableType.YANG_USES); 169 ResolvableType.YANG_USES);
170 + } else if (resolutionInfo.getEntityToResolveInfo()
171 + .getEntityToResolve() instanceof YangIfFeature) {
172 + resolutionNode.addToResolutionList(resolutionInfo,
173 + ResolvableType.YANG_IF_FEATURE);
167 } 174 }
168 -
169 } 175 }
170 176
171 /** 177 /**
......
...@@ -46,6 +46,11 @@ public enum ResolvableStatus { ...@@ -46,6 +46,11 @@ public enum ResolvableStatus {
46 * Identifies that resolvable entity is inter file linked (i.e. complete 46 * Identifies that resolvable entity is inter file linked (i.e. complete
47 * linking with external files). 47 * linking with external files).
48 */ 48 */
49 - INTER_FILE_LINKED 49 + INTER_FILE_LINKED,
50 +
51 + /**
52 + * Identifies that resolvable entity is referred node is not defined.
53 + */
54 + UNDEFINED
50 55
51 } 56 }
......
...@@ -18,6 +18,7 @@ package org.onosproject.yangutils.linker.impl; ...@@ -18,6 +18,7 @@ package org.onosproject.yangutils.linker.impl;
18 import java.io.Serializable; 18 import java.io.Serializable;
19 19
20 import org.onosproject.yangutils.datamodel.YangEntityToResolveInfo; 20 import org.onosproject.yangutils.datamodel.YangEntityToResolveInfo;
21 +import org.onosproject.yangutils.datamodel.YangIfFeature;
21 import org.onosproject.yangutils.datamodel.YangNode; 22 import org.onosproject.yangutils.datamodel.YangNode;
22 import org.onosproject.yangutils.datamodel.YangType; 23 import org.onosproject.yangutils.datamodel.YangType;
23 import org.onosproject.yangutils.datamodel.YangUses; 24 import org.onosproject.yangutils.datamodel.YangUses;
...@@ -76,6 +77,8 @@ public class YangEntityToResolveInfoImpl<T> implements YangEntityToResolveInfo<T ...@@ -76,6 +77,8 @@ public class YangEntityToResolveInfoImpl<T> implements YangEntityToResolveInfo<T
76 prefix = ((YangType<?>) entityToBeResolved).getPrefix(); 77 prefix = ((YangType<?>) entityToBeResolved).getPrefix();
77 } else if (entityToBeResolved instanceof YangUses) { 78 } else if (entityToBeResolved instanceof YangUses) {
78 prefix = ((YangUses) entityToBeResolved).getPrefix(); 79 prefix = ((YangUses) entityToBeResolved).getPrefix();
80 + } else if (entityToBeResolved instanceof YangIfFeature) {
81 + prefix = ((YangIfFeature) entityToBeResolved).getPrefix();
79 } else { 82 } else {
80 throw new LinkerException("Linker Exception: Entity to resolved is other than type/uses"); 83 throw new LinkerException("Linker Exception: Entity to resolved is other than type/uses");
81 } 84 }
......
...@@ -156,6 +156,8 @@ public class YangLinkerManager ...@@ -156,6 +156,8 @@ public class YangLinkerManager
156 throws LinkerException { 156 throws LinkerException {
157 for (YangNode yangNode : yangNodeSet) { 157 for (YangNode yangNode : yangNodeSet) {
158 try { 158 try {
159 + ((YangReferenceResolver) yangNode)
160 + .resolveInterFileLinking(ResolvableType.YANG_IF_FEATURE);
159 ((YangReferenceResolver) yangNode).resolveInterFileLinking(ResolvableType.YANG_USES); 161 ((YangReferenceResolver) yangNode).resolveInterFileLinking(ResolvableType.YANG_USES);
160 ((YangReferenceResolver) yangNode) 162 ((YangReferenceResolver) yangNode)
161 .resolveInterFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE); 163 .resolveInterFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE);
......
...@@ -17,15 +17,22 @@ ...@@ -17,15 +17,22 @@
17 package org.onosproject.yangutils.linker.impl; 17 package org.onosproject.yangutils.linker.impl;
18 18
19 import java.io.Serializable; 19 import java.io.Serializable;
20 +import java.util.Iterator;
21 +import java.util.List;
20 import java.util.Stack; 22 import java.util.Stack;
21 23
22 import org.onosproject.yangutils.datamodel.Resolvable; 24 import org.onosproject.yangutils.datamodel.Resolvable;
23 import org.onosproject.yangutils.datamodel.YangDataTypes; 25 import org.onosproject.yangutils.datamodel.YangDataTypes;
24 import org.onosproject.yangutils.datamodel.YangDerivedInfo; 26 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
27 +import org.onosproject.yangutils.datamodel.YangEntityToResolveInfo;
28 +import org.onosproject.yangutils.datamodel.YangFeature;
29 +import org.onosproject.yangutils.datamodel.YangFeatureHolder;
25 import org.onosproject.yangutils.datamodel.YangGrouping; 30 import org.onosproject.yangutils.datamodel.YangGrouping;
31 +import org.onosproject.yangutils.datamodel.YangIfFeature;
26 import org.onosproject.yangutils.datamodel.YangImport; 32 import org.onosproject.yangutils.datamodel.YangImport;
27 import org.onosproject.yangutils.datamodel.YangInclude; 33 import org.onosproject.yangutils.datamodel.YangInclude;
28 import org.onosproject.yangutils.datamodel.YangNode; 34 import org.onosproject.yangutils.datamodel.YangNode;
35 +import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
29 import org.onosproject.yangutils.datamodel.YangReferenceResolver; 36 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
30 import org.onosproject.yangutils.datamodel.YangResolutionInfo; 37 import org.onosproject.yangutils.datamodel.YangResolutionInfo;
31 import org.onosproject.yangutils.datamodel.YangType; 38 import org.onosproject.yangutils.datamodel.YangType;
...@@ -39,9 +46,11 @@ import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTER_F ...@@ -39,9 +46,11 @@ import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTER_F
39 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTRA_FILE_RESOLVED; 46 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTRA_FILE_RESOLVED;
40 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.LINKED; 47 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.LINKED;
41 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.RESOLVED; 48 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.RESOLVED;
49 +import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.UNDEFINED;
42 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.UNRESOLVED; 50 import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.UNRESOLVED;
43 import static org.onosproject.yangutils.linker.YangLinkingPhase.INTER_FILE; 51 import static org.onosproject.yangutils.linker.YangLinkingPhase.INTER_FILE;
44 import static org.onosproject.yangutils.linker.YangLinkingPhase.INTRA_FILE; 52 import static org.onosproject.yangutils.linker.YangLinkingPhase.INTRA_FILE;
53 +import static org.onosproject.yangutils.utils.UtilConstants.FEATURE_LINKER_ERROR;
45 import static org.onosproject.yangutils.utils.UtilConstants.GROUPING_LINKER_ERROR; 54 import static org.onosproject.yangutils.utils.UtilConstants.GROUPING_LINKER_ERROR;
46 import static org.onosproject.yangutils.utils.UtilConstants.TYPEDEF_LINKER_ERROR; 55 import static org.onosproject.yangutils.utils.UtilConstants.TYPEDEF_LINKER_ERROR;
47 56
...@@ -64,7 +73,7 @@ public class YangResolutionInfoImpl<T> ...@@ -64,7 +73,7 @@ public class YangResolutionInfoImpl<T>
64 /** 73 /**
65 * Error line number. 74 * Error line number.
66 */ 75 */
67 - private transient int lineNumber; 76 + private transient int lineNumber;
68 77
69 /** 78 /**
70 * Error character position in number. 79 * Error character position in number.
...@@ -115,7 +124,7 @@ public class YangResolutionInfoImpl<T> ...@@ -115,7 +124,7 @@ public class YangResolutionInfoImpl<T>
115 124
116 setCurReferenceResolver(dataModelRootNode); 125 setCurReferenceResolver(dataModelRootNode);
117 126
118 - // Current node to resolve, it can be a YANG type or YANG uses. 127 + // Current node to resolve, it can be a YANG type, YANG uses or YANG if-feature.
119 T entityToResolve = getEntityToResolveInfo().getEntityToResolve(); 128 T entityToResolve = getEntityToResolveInfo().getEntityToResolve();
120 129
121 // Check if linking is already done 130 // Check if linking is already done
...@@ -128,7 +137,8 @@ public class YangResolutionInfoImpl<T> ...@@ -128,7 +137,8 @@ public class YangResolutionInfoImpl<T>
128 return; 137 return;
129 } 138 }
130 } else { 139 } else {
131 - throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 140 + throw new DataModelException("Data Model Exception: Entity to resolved is other than " +
141 + "type/uses/if-feature");
132 } 142 }
133 143
134 // Push the initial entity to resolve in stack. 144 // Push the initial entity to resolve in stack.
...@@ -154,57 +164,60 @@ public class YangResolutionInfoImpl<T> ...@@ -154,57 +164,60 @@ public class YangResolutionInfoImpl<T>
154 164
155 Resolvable resolvable = (Resolvable) entityToResolve; 165 Resolvable resolvable = (Resolvable) entityToResolve;
156 switch (resolvable.getResolvableStatus()) { 166 switch (resolvable.getResolvableStatus()) {
157 - case RESOLVED: { 167 + case RESOLVED: {
158 - /* 168 + /*
159 - * If the entity is already resolved in the stack, then pop 169 + * If the entity is already resolved in the stack, then pop
160 - * it and continue with the remaining stack elements to 170 + * it and continue with the remaining stack elements to
161 - * resolve 171 + * resolve
162 - */ 172 + */
163 - getPartialResolvedStack().pop(); 173 + getPartialResolvedStack().pop();
164 - break; 174 + break;
165 - } 175 + }
166 176
167 - case LINKED: { 177 + case LINKED: {
168 - /* 178 + /*
169 - * If the top of the stack is already linked then resolve 179 + * If the top of the stack is already linked then resolve
170 - * the references and pop the entity and continue with 180 + * the references and pop the entity and continue with
171 - * remaining stack elements to resolve. 181 + * remaining stack elements to resolve.
172 - */ 182 + */
173 - resolveTopOfStack(INTRA_FILE); 183 + resolveTopOfStack(INTRA_FILE);
174 - getPartialResolvedStack().pop(); 184 + getPartialResolvedStack().pop();
175 - break; 185 + break;
176 - } 186 + }
177 187
178 - case INTRA_FILE_RESOLVED: { 188 + case INTRA_FILE_RESOLVED: {
179 - /* 189 + /*
180 - * Pop the top of the stack. 190 + * Pop the top of the stack.
181 - */ 191 + */
182 - getPartialResolvedStack().pop(); 192 + getPartialResolvedStack().pop();
183 - break; 193 + break;
184 - } 194 + }
185 195
186 - case UNRESOLVED: { 196 + case UNRESOLVED: {
187 - linkTopOfStackReferenceUpdateStack(); 197 + linkTopOfStackReferenceUpdateStack();
188 - 198 +
189 - if (resolvable.getResolvableStatus() == UNRESOLVED) { 199 + if (resolvable.getResolvableStatus() == UNRESOLVED) {
190 - // If current entity is still not resolved, then 200 + // If current entity is still not resolved, then
191 - // linking/resolution has failed. 201 + // linking/resolution has failed.
192 - String errorInfo; 202 + String errorInfo;
193 - if (resolvable instanceof YangType) { 203 + if (resolvable instanceof YangType) {
194 - errorInfo = TYPEDEF_LINKER_ERROR; 204 + errorInfo = TYPEDEF_LINKER_ERROR;
195 - } else { 205 + } else if (resolvable instanceof YangUses) {
196 - errorInfo = GROUPING_LINKER_ERROR; 206 + errorInfo = GROUPING_LINKER_ERROR;
207 + } else {
208 + errorInfo = FEATURE_LINKER_ERROR;
209 + }
210 + DataModelException dataModelException =
211 + new DataModelException(errorInfo);
212 + dataModelException.setLine(getLineNumber());
213 + dataModelException.setCharPosition(getCharPosition());
214 + throw dataModelException;
197 } 215 }
198 - DataModelException dataModelException = new DataModelException(errorInfo); 216 + break;
199 - dataModelException.setLine(getLineNumber()); 217 + }
200 - dataModelException.setCharPosition(getCharPosition()); 218 + default: {
201 - throw dataModelException; 219 + throw new DataModelException("Data Model Exception: Unsupported, linker state");
202 } 220 }
203 - break;
204 - }
205 - default: {
206 - throw new DataModelException("Data Model Exception: Unsupported, linker state");
207 - }
208 221
209 } 222 }
210 223
...@@ -222,8 +235,9 @@ public class YangResolutionInfoImpl<T> ...@@ -222,8 +235,9 @@ public class YangResolutionInfoImpl<T>
222 private void resolveTopOfStack(YangLinkingPhase linkingPhase) 235 private void resolveTopOfStack(YangLinkingPhase linkingPhase)
223 throws DataModelException { 236 throws DataModelException {
224 ((Resolvable) getCurrentEntityToResolveFromStack()).resolve(); 237 ((Resolvable) getCurrentEntityToResolveFromStack()).resolve();
225 - if (((Resolvable) getCurrentEntityToResolveFromStack()).getResolvableStatus() != INTRA_FILE_RESOLVED) { 238 + if (((Resolvable) getCurrentEntityToResolveFromStack()).getResolvableStatus() != INTRA_FILE_RESOLVED
226 - // Sets the resolution status in inside the type/uses. 239 + && ((Resolvable) getCurrentEntityToResolveFromStack()).getResolvableStatus() != UNDEFINED) {
240 + // Sets the resolution status in inside the type/uses/if-feature.
227 ((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(RESOLVED); 241 ((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(RESOLVED);
228 } 242 }
229 } 243 }
...@@ -253,21 +267,61 @@ public class YangResolutionInfoImpl<T> ...@@ -253,21 +267,61 @@ public class YangResolutionInfoImpl<T>
253 YangNode potentialAncestorWithReferredNode = getPartialResolvedStack().peek() 267 YangNode potentialAncestorWithReferredNode = getPartialResolvedStack().peek()
254 .getHolderOfEntityToResolve(); 268 .getHolderOfEntityToResolve();
255 269
256 - /** 270 + if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
257 - * Traverse up in the ancestor tree to check if the referred node is 271 + resolveSelfFileLinkingForIfFeature(potentialAncestorWithReferredNode);
258 - * defined 272 + return;
259 - */ 273 + } else {
260 - while (potentialAncestorWithReferredNode != null) {
261 274
262 /** 275 /**
263 - * Check for the referred node defined in a ancestor scope 276 + * Traverse up in the ancestor tree to check if the referred node is
277 + * defined
264 */ 278 */
265 - YangNode potentialReferredNode = potentialAncestorWithReferredNode.getChild(); 279 + while (potentialAncestorWithReferredNode != null) {
266 - if (isReferredNodeInSiblingListProcessed(potentialReferredNode)) { 280 +
267 - return; 281 + /**
282 + * Check for the referred node defined in a ancestor scope
283 + */
284 + YangNode potentialReferredNode = potentialAncestorWithReferredNode.getChild();
285 + if (isReferredNodeInSiblingListProcessed(potentialReferredNode)) {
286 + return;
287 + }
288 +
289 + potentialAncestorWithReferredNode = potentialAncestorWithReferredNode.getParent();
268 } 290 }
291 + }
269 292
270 - potentialAncestorWithReferredNode = potentialAncestorWithReferredNode.getParent(); 293 + /*
294 + * In case prefix is not present it's a candidate for inter-file
295 + * resolution via include list.
296 + */
297 + if (getRefPrefix() == null) {
298 + ((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(INTRA_FILE_RESOLVED);
299 + }
300 + }
301 +
302 + /**
303 + * Resolves self file linking for if-feature.
304 + *
305 + * @param potentialAncestorWithReferredNode if-feature holder node
306 + * @throws DataModelException DataModelException a violation of data model
307 + * rules
308 + */
309 + private void resolveSelfFileLinkingForIfFeature(YangNode potentialAncestorWithReferredNode)
310 + throws DataModelException {
311 +
312 + YangFeatureHolder featureHolder = getFeatureHolder(potentialAncestorWithReferredNode);
313 + YangNode potentialReferredNode = (YangNode) featureHolder;
314 + if (isReferredNode(potentialReferredNode)) {
315 +
316 + // Adds reference link of entity to the node under resolution.
317 + addReferredEntityLink(potentialReferredNode, LINKED);
318 +
319 + /**
320 + * resolve the reference and update the partial resolution stack
321 + * with any further recursive references
322 + */
323 + addUnresolvedRecursiveReferenceToStack(potentialReferredNode);
324 + return;
271 } 325 }
272 326
273 /* 327 /*
...@@ -279,6 +333,22 @@ public class YangResolutionInfoImpl<T> ...@@ -279,6 +333,22 @@ public class YangResolutionInfoImpl<T>
279 } 333 }
280 } 334 }
281 335
336 +
337 + /**
338 + * Returns feature holder(module/sub-module node) .
339 + *
340 + * @param potentialAncestorWithReferredNode if-feature holder node
341 + */
342 + private YangFeatureHolder getFeatureHolder(YangNode potentialAncestorWithReferredNode) {
343 + while (potentialAncestorWithReferredNode != null) {
344 + if (potentialAncestorWithReferredNode instanceof YangFeatureHolder) {
345 + return (YangFeatureHolder) potentialAncestorWithReferredNode;
346 + }
347 + potentialAncestorWithReferredNode = potentialAncestorWithReferredNode.getParent();
348 + }
349 + return null;
350 + }
351 +
282 /** 352 /**
283 * Checks if the reference in self file or in external file. 353 * Checks if the reference in self file or in external file.
284 * 354 *
...@@ -352,6 +422,14 @@ public class YangResolutionInfoImpl<T> ...@@ -352,6 +422,14 @@ public class YangResolutionInfoImpl<T>
352 */ 422 */
353 return isNodeNameSameAsResolutionInfoName(potentialReferredNode); 423 return isNodeNameSameAsResolutionInfoName(potentialReferredNode);
354 } 424 }
425 + } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
426 + if (potentialReferredNode instanceof YangFeatureHolder) {
427 + /*
428 + * Check if name of node name matches with the entity being
429 + * resolved
430 + */
431 + return isNodeNameSameAsResolutionInfoName(potentialReferredNode);
432 + }
355 } else { 433 } else {
356 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 434 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
357 } 435 }
...@@ -381,12 +459,31 @@ public class YangResolutionInfoImpl<T> ...@@ -381,12 +459,31 @@ public class YangResolutionInfoImpl<T>
381 ((YangUses) getCurrentEntityToResolveFromStack()).getName())) { 459 ((YangUses) getCurrentEntityToResolveFromStack()).getName())) {
382 return true; 460 return true;
383 } 461 }
462 + } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
463 + return isFeatureDefinedInNode(node);
384 } else { 464 } else {
385 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 465 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
386 } 466 }
387 return false; 467 return false;
388 } 468 }
389 469
470 + private boolean isFeatureDefinedInNode(YangNode node) throws DataModelException {
471 + YangNodeIdentifier ifFeature = ((YangIfFeature) getCurrentEntityToResolveFromStack()).getName();
472 + List<YangFeature> featureList = ((YangFeatureHolder) node).getFeatureList();
473 + if (featureList != null && !featureList.isEmpty()) {
474 + Iterator<YangFeature> iterator = featureList.iterator();
475 + while (iterator.hasNext()) {
476 + YangFeature feature = iterator.next();
477 + if (ifFeature.getName().equals(feature.getName())) {
478 + ((YangIfFeature) getCurrentEntityToResolveFromStack()).setReferredFeature(feature);
479 + ((YangIfFeature) getCurrentEntityToResolveFromStack()).setReferredFeatureHolder(node);
480 + return true;
481 + }
482 + }
483 + }
484 + return false;
485 + }
486 +
390 /** 487 /**
391 * Adds reference of grouping/typedef in uses/type. 488 * Adds reference of grouping/typedef in uses/type.
392 * 489 *
...@@ -403,6 +500,8 @@ public class YangResolutionInfoImpl<T> ...@@ -403,6 +500,8 @@ public class YangResolutionInfoImpl<T>
403 } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) { 500 } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
404 ((YangUses) getCurrentEntityToResolveFromStack()) 501 ((YangUses) getCurrentEntityToResolveFromStack())
405 .setRefGroup((YangGrouping) referredNode); 502 .setRefGroup((YangGrouping) referredNode);
503 + } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
504 + // do nothing , referred node is already set
406 } else { 505 } else {
407 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 506 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
408 } 507 }
...@@ -440,6 +539,8 @@ public class YangResolutionInfoImpl<T> ...@@ -440,6 +539,8 @@ public class YangResolutionInfoImpl<T>
440 * return true, else return false. 539 * return true, else return false.
441 */ 540 */
442 addUnResolvedUsesToStack(referredNode); 541 addUnResolvedUsesToStack(referredNode);
542 + } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
543 + addUnResolvedIfFeatureToStack(referredNode);
443 } else { 544 } else {
444 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 545 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
445 } 546 }
...@@ -469,6 +570,26 @@ public class YangResolutionInfoImpl<T> ...@@ -469,6 +570,26 @@ public class YangResolutionInfoImpl<T>
469 } 570 }
470 571
471 /** 572 /**
573 + * Returns if there is any unresolved if-feature in feature.
574 + *
575 + * @param node module/submodule node
576 + */
577 + private void addUnResolvedIfFeatureToStack(YangNode node) {
578 + YangFeature refFeature = ((YangIfFeature) getCurrentEntityToResolveFromStack()).getReferredFeature();
579 + List<YangIfFeature> ifFeatureList = refFeature.getIfFeatureList();
580 + if (ifFeatureList != null && !ifFeatureList.isEmpty()) {
581 + Iterator<YangIfFeature> ifFeatureIterator = ifFeatureList.iterator();
582 + while (ifFeatureIterator.hasNext()) {
583 + YangIfFeature ifFeature = ifFeatureIterator.next();
584 + YangEntityToResolveInfo<YangIfFeature> unResolvedEntityInfo = new YangEntityToResolveInfoImpl<>();
585 + unResolvedEntityInfo.setEntityToResolve(ifFeature);
586 + unResolvedEntityInfo.setHolderOfEntityToResolve(node);
587 + addInPartialResolvedStack((YangEntityToResolveInfoImpl<T>) unResolvedEntityInfo);
588 + }
589 + }
590 + }
591 +
592 + /**
472 * Returns stack of YANG type with partially resolved YANG construct 593 * Returns stack of YANG type with partially resolved YANG construct
473 * hierarchy. 594 * hierarchy.
474 * 595 *
...@@ -600,6 +721,8 @@ public class YangResolutionInfoImpl<T> ...@@ -600,6 +721,8 @@ public class YangResolutionInfoImpl<T>
600 refPrefix = ((YangType<?>) getCurrentEntityToResolveFromStack()).getPrefix(); 721 refPrefix = ((YangType<?>) getCurrentEntityToResolveFromStack()).getPrefix();
601 } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) { 722 } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
602 refPrefix = ((YangUses) getCurrentEntityToResolveFromStack()).getPrefix(); 723 refPrefix = ((YangUses) getCurrentEntityToResolveFromStack()).getPrefix();
724 + } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
725 + refPrefix = ((YangIfFeature) getCurrentEntityToResolveFromStack()).getPrefix();
603 } else { 726 } else {
604 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 727 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
605 } 728 }
...@@ -623,41 +746,50 @@ public class YangResolutionInfoImpl<T> ...@@ -623,41 +746,50 @@ public class YangResolutionInfoImpl<T>
623 746
624 Resolvable resolvable = (Resolvable) entityToResolve; 747 Resolvable resolvable = (Resolvable) entityToResolve;
625 switch (resolvable.getResolvableStatus()) { 748 switch (resolvable.getResolvableStatus()) {
626 - case RESOLVED: { 749 + case RESOLVED: {
627 - /* 750 + /*
628 - * If the entity is already resolved in the stack, then pop 751 + * If the entity is already resolved in the stack, then pop
629 - * it and continue with the remaining stack elements to 752 + * it and continue with the remaining stack elements to
630 - * resolve 753 + * resolve
631 - */ 754 + */
632 - getPartialResolvedStack().pop(); 755 + getPartialResolvedStack().pop();
633 - break; 756 + break;
634 - } 757 + }
635 758
636 - case INTER_FILE_LINKED: { 759 + case INTER_FILE_LINKED: {
637 - /* 760 + /*
638 - * If the top of the stack is already linked then resolve 761 + * If the top of the stack is already linked then resolve
639 - * the references and pop the entity and continue with 762 + * the references and pop the entity and continue with
640 - * remaining stack elements to resolve 763 + * remaining stack elements to resolve
641 - */ 764 + */
642 - resolveTopOfStack(INTER_FILE); 765 + resolveTopOfStack(INTER_FILE);
643 - getPartialResolvedStack().pop(); 766 + getPartialResolvedStack().pop();
644 - break; 767 + break;
645 - } 768 + }
646 769
647 - case INTRA_FILE_RESOLVED: { 770 + case INTRA_FILE_RESOLVED: {
648 - /* 771 + /*
649 - * If the top of the stack is intra file resolved then check 772 + * If the top of the stack is intra file resolved then check
650 - * if top of stack is linked, if not link it using 773 + * if top of stack is linked, if not link it using
651 - * import/include list and push the linked referred entity 774 + * import/include list and push the linked referred entity
652 - * to the stack, otherwise only push it to the stack. 775 + * to the stack, otherwise only push it to the stack.
653 - */ 776 + */
654 - linkInterFileTopOfStackRefUpdateStack(); 777 + linkInterFileTopOfStackRefUpdateStack();
655 - break; 778 + break;
656 - } 779 + }
657 780
658 - default: { 781 + case UNDEFINED: {
659 - throw new DataModelException("Data Model Exception: Unsupported, linker state"); 782 + /*
660 - } 783 + * In case of if-feature resolution, if referred "feature" is not
784 + * defined then the resolvable status will be undefined.
785 + */
786 + getPartialResolvedStack().pop();
787 + break;
788 + }
789 +
790 + default: {
791 + throw new DataModelException("Data Model Exception: Unsupported, linker state");
792 + }
661 793
662 } 794 }
663 795
...@@ -701,6 +833,11 @@ public class YangResolutionInfoImpl<T> ...@@ -701,6 +833,11 @@ public class YangResolutionInfoImpl<T>
701 return; 833 return;
702 } 834 }
703 } 835 }
836 +
837 + if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
838 + ((YangIfFeature) getCurrentEntityToResolveFromStack()).setResolvableStatus(UNDEFINED);
839 + return;
840 + }
704 // Exception when referred typedef/grouping is not found. 841 // Exception when referred typedef/grouping is not found.
705 DataModelException dataModelException = new DataModelException("YANG file error: Referred " + 842 DataModelException dataModelException = new DataModelException("YANG file error: Referred " +
706 "typedef/grouping for a given type/uses can't be found."); 843 "typedef/grouping for a given type/uses can't be found.");
...@@ -735,6 +872,8 @@ public class YangResolutionInfoImpl<T> ...@@ -735,6 +872,8 @@ public class YangResolutionInfoImpl<T>
735 linkedNode = findRefTypedef(yangInclude.getIncludedNode()); 872 linkedNode = findRefTypedef(yangInclude.getIncludedNode());
736 } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) { 873 } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
737 linkedNode = findRefGrouping(yangInclude.getIncludedNode()); 874 linkedNode = findRefGrouping(yangInclude.getIncludedNode());
875 + } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
876 + linkedNode = findRefFeature(yangInclude.getIncludedNode());
738 } 877 }
739 if (linkedNode != null) { 878 if (linkedNode != null) {
740 // Add the link to external entity. 879 // Add the link to external entity.
...@@ -776,6 +915,8 @@ public class YangResolutionInfoImpl<T> ...@@ -776,6 +915,8 @@ public class YangResolutionInfoImpl<T>
776 linkedNode = findRefTypedef(yangImport.getImportedNode()); 915 linkedNode = findRefTypedef(yangImport.getImportedNode());
777 } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) { 916 } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
778 linkedNode = findRefGrouping(yangImport.getImportedNode()); 917 linkedNode = findRefGrouping(yangImport.getImportedNode());
918 + } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
919 + linkedNode = findRefFeature(yangImport.getImportedNode());
779 } 920 }
780 if (linkedNode != null) { 921 if (linkedNode != null) {
781 // Add the link to external entity. 922 // Add the link to external entity.
...@@ -816,6 +957,8 @@ public class YangResolutionInfoImpl<T> ...@@ -816,6 +957,8 @@ public class YangResolutionInfoImpl<T>
816 return (T) derivedInfo.getReferredTypeDef(); 957 return (T) derivedInfo.getReferredTypeDef();
817 } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) { 958 } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
818 return (T) ((YangUses) getCurrentEntityToResolveFromStack()).getRefGroup(); 959 return (T) ((YangUses) getCurrentEntityToResolveFromStack()).getRefGroup();
960 + } else if (getCurrentEntityToResolveFromStack() instanceof YangIfFeature) {
961 + return (T) ((YangIfFeature) getCurrentEntityToResolveFromStack()).getReferredFeatureHolder();
819 } else { 962 } else {
820 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses"); 963 throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
821 } 964 }
...@@ -842,6 +985,29 @@ public class YangResolutionInfoImpl<T> ...@@ -842,6 +985,29 @@ public class YangResolutionInfoImpl<T>
842 } 985 }
843 986
844 /** 987 /**
988 + * Finds the referred feature node at the root level of imported/included node.
989 + *
990 + * @param refNode module/sub-module node
991 + * @return referred feature
992 + */
993 + private YangNode findRefFeature(YangNode refNode) {
994 + YangNodeIdentifier ifFeature = ((YangIfFeature) getCurrentEntityToResolveFromStack()).getName();
995 + List<YangFeature> featureList = ((YangFeatureHolder) refNode).getFeatureList();
996 +
997 + if (featureList != null && !featureList.isEmpty()) {
998 + Iterator<YangFeature> iterator = featureList.iterator();
999 + while (iterator.hasNext()) {
1000 + YangFeature feature = iterator.next();
1001 + if (ifFeature.getName().equals(feature.getName())) {
1002 + ((YangIfFeature) getCurrentEntityToResolveFromStack()).setReferredFeature(feature);
1003 + return refNode;
1004 + }
1005 + }
1006 + }
1007 + return null;
1008 + }
1009 +
1010 + /**
845 * Finds the referred typedef node at the root level of imported/included node. 1011 * Finds the referred typedef node at the root level of imported/included node.
846 * 1012 *
847 * @param refNode module/sub-module node 1013 * @param refNode module/sub-module node
......
...@@ -40,7 +40,9 @@ import org.onosproject.yangutils.parser.impl.listeners.DefaultListener; ...@@ -40,7 +40,9 @@ import org.onosproject.yangutils.parser.impl.listeners.DefaultListener;
40 import org.onosproject.yangutils.parser.impl.listeners.DescriptionListener; 40 import org.onosproject.yangutils.parser.impl.listeners.DescriptionListener;
41 import org.onosproject.yangutils.parser.impl.listeners.EnumListener; 41 import org.onosproject.yangutils.parser.impl.listeners.EnumListener;
42 import org.onosproject.yangutils.parser.impl.listeners.EnumerationListener; 42 import org.onosproject.yangutils.parser.impl.listeners.EnumerationListener;
43 +import org.onosproject.yangutils.parser.impl.listeners.FeatureListener;
43 import org.onosproject.yangutils.parser.impl.listeners.GroupingListener; 44 import org.onosproject.yangutils.parser.impl.listeners.GroupingListener;
45 +import org.onosproject.yangutils.parser.impl.listeners.IfFeatureListener;
44 import org.onosproject.yangutils.parser.impl.listeners.ImportListener; 46 import org.onosproject.yangutils.parser.impl.listeners.ImportListener;
45 import org.onosproject.yangutils.parser.impl.listeners.IncludeListener; 47 import org.onosproject.yangutils.parser.impl.listeners.IncludeListener;
46 import org.onosproject.yangutils.parser.impl.listeners.InputListener; 48 import org.onosproject.yangutils.parser.impl.listeners.InputListener;
...@@ -53,6 +55,7 @@ import org.onosproject.yangutils.parser.impl.listeners.MandatoryListener; ...@@ -53,6 +55,7 @@ import org.onosproject.yangutils.parser.impl.listeners.MandatoryListener;
53 import org.onosproject.yangutils.parser.impl.listeners.MaxElementsListener; 55 import org.onosproject.yangutils.parser.impl.listeners.MaxElementsListener;
54 import org.onosproject.yangutils.parser.impl.listeners.MinElementsListener; 56 import org.onosproject.yangutils.parser.impl.listeners.MinElementsListener;
55 import org.onosproject.yangutils.parser.impl.listeners.ModuleListener; 57 import org.onosproject.yangutils.parser.impl.listeners.ModuleListener;
58 +import org.onosproject.yangutils.parser.impl.listeners.MustListener;
56 import org.onosproject.yangutils.parser.impl.listeners.NotificationListener; 59 import org.onosproject.yangutils.parser.impl.listeners.NotificationListener;
57 import org.onosproject.yangutils.parser.impl.listeners.NamespaceListener; 60 import org.onosproject.yangutils.parser.impl.listeners.NamespaceListener;
58 import org.onosproject.yangutils.parser.impl.listeners.OrganizationListener; 61 import org.onosproject.yangutils.parser.impl.listeners.OrganizationListener;
...@@ -76,6 +79,7 @@ import org.onosproject.yangutils.parser.impl.listeners.UnitsListener; ...@@ -76,6 +79,7 @@ import org.onosproject.yangutils.parser.impl.listeners.UnitsListener;
76 import org.onosproject.yangutils.parser.impl.listeners.UsesListener; 79 import org.onosproject.yangutils.parser.impl.listeners.UsesListener;
77 import org.onosproject.yangutils.parser.impl.listeners.ValueListener; 80 import org.onosproject.yangutils.parser.impl.listeners.ValueListener;
78 import org.onosproject.yangutils.parser.impl.listeners.VersionListener; 81 import org.onosproject.yangutils.parser.impl.listeners.VersionListener;
82 +import org.onosproject.yangutils.parser.impl.listeners.WhenListener;
79 83
80 import static org.onosproject.yangutils.utils.UtilConstants.UNSUPPORTED_YANG_CONSTRUCT; 84 import static org.onosproject.yangutils.utils.UtilConstants.UNSUPPORTED_YANG_CONSTRUCT;
81 import static org.onosproject.yangutils.utils.UtilConstants.CURRENTLY_UNSUPPORTED; 85 import static org.onosproject.yangutils.utils.UtilConstants.CURRENTLY_UNSUPPORTED;
...@@ -473,22 +477,22 @@ public class TreeWalkListener implements GeneratedYangListener { ...@@ -473,22 +477,22 @@ public class TreeWalkListener implements GeneratedYangListener {
473 477
474 @Override 478 @Override
475 public void enterFeatureStatement(GeneratedYangParser.FeatureStatementContext ctx) { 479 public void enterFeatureStatement(GeneratedYangParser.FeatureStatementContext ctx) {
476 - handleUnsupportedYangConstruct(YangConstructType.FEATURE_DATA, ctx, CURRENTLY_UNSUPPORTED); 480 + FeatureListener.processFeatureEntry(this, ctx);
477 } 481 }
478 482
479 @Override 483 @Override
480 public void exitFeatureStatement(GeneratedYangParser.FeatureStatementContext ctx) { 484 public void exitFeatureStatement(GeneratedYangParser.FeatureStatementContext ctx) {
481 - //TODO: to be implemented 485 + FeatureListener.processFeatureExit(this, ctx);
482 } 486 }
483 487
484 @Override 488 @Override
485 public void enterFeatureBody(GeneratedYangParser.FeatureBodyContext ctx) { 489 public void enterFeatureBody(GeneratedYangParser.FeatureBodyContext ctx) {
486 - //TODO : to be implemented 490 + // do nothing
487 } 491 }
488 492
489 @Override 493 @Override
490 public void exitFeatureBody(GeneratedYangParser.FeatureBodyContext ctx) { 494 public void exitFeatureBody(GeneratedYangParser.FeatureBodyContext ctx) {
491 - //TODO : to be implemented 495 + // do nothing.
492 } 496 }
493 497
494 @Override 498 @Override
...@@ -503,12 +507,12 @@ public class TreeWalkListener implements GeneratedYangListener { ...@@ -503,12 +507,12 @@ public class TreeWalkListener implements GeneratedYangListener {
503 507
504 @Override 508 @Override
505 public void enterIfFeatureStatement(GeneratedYangParser.IfFeatureStatementContext ctx) { 509 public void enterIfFeatureStatement(GeneratedYangParser.IfFeatureStatementContext ctx) {
506 - // TODO: to be implemented 510 + IfFeatureListener.processIfFeatureEntry(this, ctx);
507 } 511 }
508 512
509 @Override 513 @Override
510 public void exitIfFeatureStatement(GeneratedYangParser.IfFeatureStatementContext ctx) { 514 public void exitIfFeatureStatement(GeneratedYangParser.IfFeatureStatementContext ctx) {
511 - // TODO: to be implemented 515 + // do nothing.
512 } 516 }
513 517
514 @Override 518 @Override
...@@ -813,12 +817,12 @@ public class TreeWalkListener implements GeneratedYangListener { ...@@ -813,12 +817,12 @@ public class TreeWalkListener implements GeneratedYangListener {
813 817
814 @Override 818 @Override
815 public void enterMustStatement(GeneratedYangParser.MustStatementContext ctx) { 819 public void enterMustStatement(GeneratedYangParser.MustStatementContext ctx) {
816 - // TODO: to be implemented 820 + MustListener.processMustEntry(this, ctx);
817 } 821 }
818 822
819 @Override 823 @Override
820 public void exitMustStatement(GeneratedYangParser.MustStatementContext ctx) { 824 public void exitMustStatement(GeneratedYangParser.MustStatementContext ctx) {
821 - // TODO: to be implemented 825 + MustListener.processMustExit(this, ctx);
822 } 826 }
823 827
824 @Override 828 @Override
...@@ -1083,12 +1087,12 @@ public class TreeWalkListener implements GeneratedYangListener { ...@@ -1083,12 +1087,12 @@ public class TreeWalkListener implements GeneratedYangListener {
1083 1087
1084 @Override 1088 @Override
1085 public void enterWhenStatement(GeneratedYangParser.WhenStatementContext ctx) { 1089 public void enterWhenStatement(GeneratedYangParser.WhenStatementContext ctx) {
1086 - // TODO: to be implemented 1090 + WhenListener.processWhenEntry(this, ctx);
1087 } 1091 }
1088 1092
1089 @Override 1093 @Override
1090 public void exitWhenStatement(GeneratedYangParser.WhenStatementContext ctx) { 1094 public void exitWhenStatement(GeneratedYangParser.WhenStatementContext ctx) {
1091 - // TODO: to be implemented 1095 + WhenListener.processWhenExit(this, ctx);
1092 } 1096 }
1093 1097
1094 @Override 1098 @Override
......
1 +/*
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 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +/*
20 + * Reference: RFC6020 and YANG ANTLR Grammar
21 + *
22 + * ABNF grammar as per RFC6020
23 + * feature-stmt = feature-keyword sep identifier-arg-str optsep
24 + * (";" /
25 + * "{" stmtsep
26 + * ;; these stmts can appear in any order
27 + * *(if-feature-stmt stmtsep)
28 + * [status-stmt stmtsep]
29 + * [description-stmt stmtsep]
30 + * [reference-stmt stmtsep]
31 + * "}")
32 + *
33 + *
34 + *
35 + * ANTLR grammar rule
36 + * featureStatement : FEATURE_KEYWORD string (STMTEND | LEFT_CURLY_BRACE featureBody RIGHT_CURLY_BRACE);
37 + */
38 +
39 +import org.onosproject.yangutils.datamodel.YangFeature;
40 +import org.onosproject.yangutils.datamodel.YangFeatureHolder;
41 +import org.onosproject.yangutils.datamodel.utils.Parsable;
42 +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
43 +import org.onosproject.yangutils.parser.exceptions.ParserException;
44 +import org.onosproject.yangutils.parser.impl.TreeWalkListener;
45 +
46 +import static org.onosproject.yangutils.datamodel.utils.YangConstructType.FEATURE_DATA;
47 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
48 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
49 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
50 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
51 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
52 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
53 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidIdentifier;
54 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
55 +
56 +/**
57 + * Represents listener based call back function corresponding to the "feature"
58 + * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
59 + */
60 +public final class FeatureListener {
61 +
62 + /**
63 + * Creates a new feature listener.
64 + */
65 + private FeatureListener() {
66 + }
67 +
68 + /**
69 + * Performs validation and updates the data model tree.It is called when parser receives
70 + * an input matching the grammar rule (feature).
71 + *
72 + * @param listener listener's object
73 + * @param ctx context object of the grammar rule
74 + */
75 + public static void processFeatureEntry(TreeWalkListener listener,
76 + GeneratedYangParser.FeatureStatementContext ctx) {
77 +
78 + // Check for stack to be non empty.
79 + checkStackIsNotEmpty(listener, MISSING_HOLDER, FEATURE_DATA, ctx.string().getText(), ENTRY);
80 +
81 + String identifier = getValidIdentifier(ctx.string().getText(), FEATURE_DATA, ctx);
82 +
83 + // Obtain the node of the stack.
84 + Parsable tmpNode = listener.getParsedDataStack().peek();
85 + if (tmpNode instanceof YangFeatureHolder) {
86 + YangFeatureHolder featureHolder = (YangFeatureHolder) tmpNode;
87 +
88 + YangFeature feature = new YangFeature();
89 + feature.setName(identifier);
90 +
91 + featureHolder.addFeatureList(feature);
92 + listener.getParsedDataStack().push(feature);
93 + } else {
94 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, FEATURE_DATA,
95 + ctx.string().getText(), ENTRY));
96 + }
97 + }
98 +
99 + /**
100 + * Perform validations and updates the data model tree.It is called when parser exits from
101 + * grammar rule(feature).
102 + *
103 + * @param listener listener's object
104 + * @param ctx context object of the grammar rule
105 + */
106 + public static void processFeatureExit(TreeWalkListener listener,
107 + GeneratedYangParser.FeatureStatementContext ctx) {
108 +
109 + // Check for stack to be non empty.
110 + checkStackIsNotEmpty(listener, MISSING_HOLDER, FEATURE_DATA, ctx.string().getText(), EXIT);
111 +
112 + if (listener.getParsedDataStack().peek() instanceof YangFeature) {
113 + listener.getParsedDataStack().pop();
114 + } else {
115 + throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, FEATURE_DATA,
116 + ctx.string().getText(), EXIT));
117 + }
118 + }
119 +}
1 +/*
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 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +/*
20 + * Reference: RFC6020 and YANG ANTLR Grammar
21 + *
22 + * ABNF grammar as per RFC6020
23 + *
24 + * if-feature-stmt = if-feature-keyword sep identifier-ref-arg-str
25 + * optsep stmtend
26 + *
27 + * ANTLR grammar rule
28 + * ifFeatureStatement : IF_FEATURE_KEYWORD string STMTEND;
29 + */
30 +
31 +import org.onosproject.yangutils.datamodel.YangFeature;
32 +import org.onosproject.yangutils.datamodel.YangIfFeature;
33 +import org.onosproject.yangutils.datamodel.YangIfFeatureHolder;
34 +import org.onosproject.yangutils.datamodel.YangLeaf;
35 +import org.onosproject.yangutils.datamodel.YangLeafList;
36 +import org.onosproject.yangutils.datamodel.YangNode;
37 +import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
38 +import org.onosproject.yangutils.datamodel.YangResolutionInfo;
39 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
40 +import org.onosproject.yangutils.datamodel.utils.Parsable;
41 +import org.onosproject.yangutils.linker.impl.YangResolutionInfoImpl;
42 +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
43 +import org.onosproject.yangutils.parser.exceptions.ParserException;
44 +import org.onosproject.yangutils.parser.impl.TreeWalkListener;
45 +
46 +import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.addResolutionInfo;
47 +import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.UNRESOLVED;
48 +import static org.onosproject.yangutils.datamodel.utils.YangConstructType.IF_FEATURE_DATA;
49 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
50 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
51 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
52 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
53 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
54 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
55 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
56 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidNodeIdentifier;
57 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
58 +
59 +/**
60 + * Represents listener based call back function corresponding to the "if-feature"
61 + * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
62 + */
63 +public final class IfFeatureListener {
64 +
65 + /**
66 + * Creates a new IfFeature listener.
67 + */
68 + private IfFeatureListener() {
69 + }
70 +
71 + /**
72 + * Performs validation and updates the data model tree.It is called when parser receives
73 + * an input matching the grammar rule (if-feature).
74 + *
75 + * @param listener listener's object
76 + * @param ctx context object of the grammar rule
77 + */
78 + public static void processIfFeatureEntry(TreeWalkListener listener,
79 + GeneratedYangParser.IfFeatureStatementContext ctx) {
80 + // Check for stack to be non empty.
81 + checkStackIsNotEmpty(listener, MISSING_HOLDER, IF_FEATURE_DATA, ctx.string().getText(), ENTRY);
82 +
83 + // Validate if-feature argument string
84 + YangNodeIdentifier nodeIdentifier = getValidNodeIdentifier(ctx.string().getText(),
85 + IF_FEATURE_DATA, ctx);
86 +
87 + YangIfFeature ifFeature = new YangIfFeature();
88 + ifFeature.setName(nodeIdentifier);
89 + ifFeature.setResolvableStatus(UNRESOLVED);
90 + YangIfFeatureHolder ifFeatureHolder;
91 +
92 + // Obtain the node of the stack.
93 + Parsable tmpNode = listener.getParsedDataStack().peek();
94 + if (tmpNode instanceof YangIfFeatureHolder) {
95 + ifFeatureHolder = (YangIfFeatureHolder) tmpNode;
96 + ifFeatureHolder.addIfFeatureList(ifFeature);
97 + } else {
98 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, IF_FEATURE_DATA,
99 + ctx.string().getText(), ENTRY));
100 + }
101 +
102 + // Add resolution information to the list
103 + Parsable parentNode;
104 + if (tmpNode instanceof YangLeafList || tmpNode instanceof YangLeaf
105 + || tmpNode instanceof YangFeature) {
106 + Parsable leafData = listener.getParsedDataStack().pop();
107 + parentNode = listener.getParsedDataStack().peek();
108 + listener.getParsedDataStack().push(leafData);
109 + } else {
110 + parentNode = tmpNode;
111 + }
112 +
113 + // Verify parent node of leaf
114 + if (!(parentNode instanceof YangNode)) {
115 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, IF_FEATURE_DATA,
116 + ctx.string().getText(), EXIT));
117 + }
118 +
119 + int errorLine = ctx.getStart().getLine();
120 + int errorPosition = ctx.getStart().getCharPositionInLine();
121 + YangResolutionInfoImpl resolutionInfo = new YangResolutionInfoImpl<YangIfFeature>(ifFeature,
122 + (YangNode) parentNode, errorLine,
123 + errorPosition);
124 + addToResolutionList(resolutionInfo, ctx);
125 + }
126 +
127 + /**
128 + * Add to resolution list.
129 + *
130 + * @param resolutionInfo resolution information.
131 + * @param ctx context object of the grammar rule
132 + */
133 + private static void addToResolutionList(YangResolutionInfo<YangIfFeature> resolutionInfo,
134 + GeneratedYangParser.IfFeatureStatementContext ctx) {
135 +
136 + try {
137 + addResolutionInfo(resolutionInfo);
138 + } catch (DataModelException e) {
139 + throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
140 + IF_FEATURE_DATA, ctx.string().getText(), EXIT, e.getMessage()));
141 + }
142 + }
143 +}
...@@ -16,11 +16,13 @@ ...@@ -16,11 +16,13 @@
16 16
17 package org.onosproject.yangutils.parser.impl.listeners; 17 package org.onosproject.yangutils.parser.impl.listeners;
18 18
19 +import java.util.Date;
19 import org.onosproject.yangutils.datamodel.ResolvableType; 20 import org.onosproject.yangutils.datamodel.ResolvableType;
20 import org.onosproject.yangutils.datamodel.YangModule; 21 import org.onosproject.yangutils.datamodel.YangModule;
21 import org.onosproject.yangutils.datamodel.YangReferenceResolver; 22 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
22 import org.onosproject.yangutils.datamodel.YangRevision; 23 import org.onosproject.yangutils.datamodel.YangRevision;
23 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 24 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
25 +import org.onosproject.yangutils.datamodel.utils.Parsable;
24 import org.onosproject.yangutils.linker.exceptions.LinkerException; 26 import org.onosproject.yangutils.linker.exceptions.LinkerException;
25 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; 27 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
26 import org.onosproject.yangutils.parser.exceptions.ParserException; 28 import org.onosproject.yangutils.parser.exceptions.ParserException;
...@@ -34,8 +36,8 @@ import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMes ...@@ -34,8 +36,8 @@ import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMes
34 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; 36 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
35 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER; 37 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
36 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; 38 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
39 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getCurrentDateForRevision;
37 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidIdentifier; 40 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidIdentifier;
38 -import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.setCurrentDateForRevision;
39 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsEmpty; 41 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsEmpty;
40 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; 42 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
41 import static org.onosproject.yangutils.translator.tojava.YangDataModelFactory.getYangModuleNode; 43 import static org.onosproject.yangutils.translator.tojava.YangDataModelFactory.getYangModuleNode;
...@@ -91,13 +93,6 @@ public final class ModuleListener { ...@@ -91,13 +93,6 @@ public final class ModuleListener {
91 yangModule.setVersion((byte) 1); 93 yangModule.setVersion((byte) 1);
92 } 94 }
93 95
94 - if (ctx.moduleBody().revisionStatements().revisionStatement().isEmpty()) {
95 - String currentDate = setCurrentDateForRevision();
96 - YangRevision currentRevision = new YangRevision();
97 - currentRevision.setRevDate(currentDate);
98 - yangModule.setRevision(currentRevision);
99 - }
100 -
101 listener.getParsedDataStack().push(yangModule); 96 listener.getParsedDataStack().push(yangModule);
102 } 97 }
103 98
...@@ -113,12 +108,23 @@ public final class ModuleListener { ...@@ -113,12 +108,23 @@ public final class ModuleListener {
113 // Check for stack to be non empty. 108 // Check for stack to be non empty.
114 checkStackIsNotEmpty(listener, MISSING_HOLDER, MODULE_DATA, ctx.identifier().getText(), EXIT); 109 checkStackIsNotEmpty(listener, MISSING_HOLDER, MODULE_DATA, ctx.identifier().getText(), EXIT);
115 110
116 - if (!(listener.getParsedDataStack().peek() instanceof YangModule)) { 111 + Parsable tmpNode = listener.getParsedDataStack().peek();
112 + if (!(tmpNode instanceof YangModule)) {
117 throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, MODULE_DATA, 113 throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, MODULE_DATA,
118 ctx.identifier().getText(), EXIT)); 114 ctx.identifier().getText(), EXIT));
119 } 115 }
116 +
117 + if (((YangModule) tmpNode).getRevision() == null) {
118 + Date currentDate = getCurrentDateForRevision();
119 + YangRevision currentRevision = new YangRevision();
120 + currentRevision.setRevDate(currentDate);
121 + ((YangModule) tmpNode).setRevision(currentRevision);
122 + }
123 +
120 try { 124 try {
121 ((YangReferenceResolver) listener.getParsedDataStack() 125 ((YangReferenceResolver) listener.getParsedDataStack()
126 + .peek()).resolveSelfFileLinking(ResolvableType.YANG_IF_FEATURE);
127 + ((YangReferenceResolver) listener.getParsedDataStack()
122 .peek()).resolveSelfFileLinking(ResolvableType.YANG_USES); 128 .peek()).resolveSelfFileLinking(ResolvableType.YANG_USES);
123 ((YangReferenceResolver) listener.getParsedDataStack() 129 ((YangReferenceResolver) listener.getParsedDataStack()
124 .peek()).resolveSelfFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE); 130 .peek()).resolveSelfFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE);
......
1 +/*
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 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import org.onosproject.yangutils.datamodel.YangMust;
20 +import org.onosproject.yangutils.datamodel.YangMustHolder;
21 +import org.onosproject.yangutils.datamodel.utils.Parsable;
22 +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
23 +import org.onosproject.yangutils.parser.exceptions.ParserException;
24 +import org.onosproject.yangutils.parser.impl.TreeWalkListener;
25 +
26 +import static org.onosproject.yangutils.datamodel.utils.YangConstructType.MUST_DATA;
27 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
28 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
29 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
30 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
31 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
32 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
33 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat;
34 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
35 +
36 +/*
37 + * Reference: RFC6020 and YANG ANTLR Grammar
38 + *
39 + * ABNF grammar as per RFC6020
40 + *
41 + * must-stmt = must-keyword sep string optsep
42 + * (";" /
43 + * "{" stmtsep
44 + * ;; these stmts can appear in any order
45 + * [error-message-stmt stmtsep]
46 + * [error-app-tag-stmt stmtsep]
47 + * [description-stmt stmtsep]
48 + * [reference-stmt stmtsep]
49 + * "}")
50 + *
51 + * ANTLR grammar rule
52 + * mustStatement : MUST_KEYWORD string (STMTEND | LEFT_CURLY_BRACE commonStatements RIGHT_CURLY_BRACE);
53 + */
54 +
55 +/**
56 + * Represents listener based call back function corresponding to the
57 + * "must" rule defined in ANTLR grammar file for corresponding ABNF rule
58 + * in RFC 6020.
59 + */
60 +public final class MustListener {
61 +
62 + /**
63 + * Creates a new must listener.
64 + */
65 + private MustListener() {
66 + }
67 +
68 + /**
69 + * Perform validations and updates the data model tree.It is called when parser
70 + * receives an input matching the grammar rule (must).
71 + *
72 + * @param listener listener's object
73 + * @param ctx context object of the grammar rule
74 + */
75 + public static void processMustEntry(TreeWalkListener listener,
76 + GeneratedYangParser.MustStatementContext ctx) {
77 +
78 + // Check for stack to be non empty.
79 + checkStackIsNotEmpty(listener, MISSING_HOLDER, MUST_DATA, ctx.string().getText(), ENTRY);
80 + String constraint = removeQuotesAndHandleConcat(ctx.string().getText());
81 +
82 + // Obtain the node of the stack.
83 + Parsable tmpNode = listener.getParsedDataStack().peek();
84 + if (tmpNode instanceof YangMustHolder) {
85 +
86 + YangMust must = new YangMust();
87 + must.setConstraint(constraint);
88 +
89 + YangMustHolder mustHolder = (YangMustHolder) tmpNode;
90 + mustHolder.addMust(must);
91 +
92 + listener.getParsedDataStack().push(must);
93 + } else {
94 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, MUST_DATA,
95 + ctx.string().getText(), ENTRY));
96 + }
97 +
98 + }
99 +
100 + /**
101 + * Performs validation and updates the data model tree.It is called when parser
102 + * exits from grammar rule (must).
103 + *
104 + * @param listener listener's object
105 + * @param ctx context object of the grammar rule
106 + */
107 + public static void processMustExit(TreeWalkListener listener,
108 + GeneratedYangParser.MustStatementContext ctx) {
109 +
110 + // Check for stack to be non empty.
111 + checkStackIsNotEmpty(listener, MISSING_HOLDER, MUST_DATA, ctx.string().getText(), EXIT);
112 +
113 + if (listener.getParsedDataStack().peek() instanceof YangMust) {
114 + listener.getParsedDataStack().pop();
115 + } else {
116 + throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, MUST_DATA,
117 + ctx.string().getText(), EXIT));
118 + }
119 + }
120 +}
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.yangutils.parser.impl.listeners; 17 package org.onosproject.yangutils.parser.impl.listeners;
18 18
19 +import java.util.Date;
19 import org.onosproject.yangutils.datamodel.YangImport; 20 import org.onosproject.yangutils.datamodel.YangImport;
20 import org.onosproject.yangutils.datamodel.YangInclude; 21 import org.onosproject.yangutils.datamodel.YangInclude;
21 import org.onosproject.yangutils.datamodel.utils.Parsable; 22 import org.onosproject.yangutils.datamodel.utils.Parsable;
...@@ -28,8 +29,7 @@ import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLoc ...@@ -28,8 +29,7 @@ import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLoc
28 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; 29 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
29 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; 30 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
30 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; 31 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
31 -import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.isDateValid; 32 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidDateFromString;
32 -import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat;
33 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; 33 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
34 34
35 /* 35 /*
...@@ -87,13 +87,7 @@ public final class RevisionDateListener { ...@@ -87,13 +87,7 @@ public final class RevisionDateListener {
87 checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATE_DATA, ctx.dateArgumentString().getText(), 87 checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATE_DATA, ctx.dateArgumentString().getText(),
88 ENTRY); 88 ENTRY);
89 89
90 - String date = removeQuotesAndHandleConcat(ctx.dateArgumentString().getText()); 90 + Date date = getValidDateFromString(ctx.dateArgumentString().getText(), ctx);
91 - if (!isDateValid(date)) {
92 - ParserException parserException = new ParserException("YANG file error: Input date is not correct");
93 - parserException.setLine(ctx.getStart().getLine());
94 - parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
95 - throw parserException;
96 - }
97 91
98 // Obtain the node of the stack. 92 // Obtain the node of the stack.
99 Parsable tmpNode = listener.getParsedDataStack().peek(); 93 Parsable tmpNode = listener.getParsedDataStack().peek();
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.yangutils.parser.impl.listeners; 17 package org.onosproject.yangutils.parser.impl.listeners;
18 18
19 +import java.util.Date;
19 import org.onosproject.yangutils.datamodel.YangModule; 20 import org.onosproject.yangutils.datamodel.YangModule;
20 import org.onosproject.yangutils.datamodel.YangRevision; 21 import org.onosproject.yangutils.datamodel.YangRevision;
21 import org.onosproject.yangutils.datamodel.YangSubModule; 22 import org.onosproject.yangutils.datamodel.YangSubModule;
...@@ -31,8 +32,7 @@ import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMes ...@@ -31,8 +32,7 @@ import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMes
31 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; 32 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
32 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER; 33 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
33 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; 34 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
34 -import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.isDateValid; 35 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidDateFromString;
35 -import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat;
36 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; 36 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
37 37
38 /* 38 /*
...@@ -88,20 +88,7 @@ public final class RevisionListener { ...@@ -88,20 +88,7 @@ public final class RevisionListener {
88 // Check for stack to be non empty. 88 // Check for stack to be non empty.
89 checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATA, ctx.dateArgumentString().getText(), ENTRY); 89 checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATA, ctx.dateArgumentString().getText(), ENTRY);
90 90
91 - // Validate for reverse chronological order of revision & for revision 91 + Date date = getValidDateFromString(ctx.dateArgumentString().getText(), ctx);
92 - // value.
93 - if (!validateRevision(listener, ctx)) {
94 - return;
95 - // TODO to be implemented.
96 - }
97 -
98 - String date = removeQuotesAndHandleConcat(ctx.dateArgumentString().getText());
99 - if (!isDateValid(date)) {
100 - ParserException parserException = new ParserException("YANG file error: Input date is not correct");
101 - parserException.setLine(ctx.getStart().getLine());
102 - parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
103 - throw parserException;
104 - }
105 92
106 YangRevision revisionNode = new YangRevision(); 93 YangRevision revisionNode = new YangRevision();
107 revisionNode.setRevDate(date); 94 revisionNode.setRevDate(date);
...@@ -134,12 +121,26 @@ public final class RevisionListener { ...@@ -134,12 +121,26 @@ public final class RevisionListener {
134 switch (tmpNode.getYangConstructType()) { 121 switch (tmpNode.getYangConstructType()) {
135 case MODULE_DATA: { 122 case MODULE_DATA: {
136 YangModule module = (YangModule) tmpNode; 123 YangModule module = (YangModule) tmpNode;
137 - module.setRevision((YangRevision) tmpRevisionNode); 124 + if (module.getRevision() != null) {
125 + Date curRevisionDate = module.getRevision().getRevDate();
126 + if (curRevisionDate.before(((YangRevision) tmpRevisionNode).getRevDate())) {
127 + module.setRevision((YangRevision) tmpRevisionNode);
128 + }
129 + } else {
130 + module.setRevision((YangRevision) tmpRevisionNode);
131 + }
138 break; 132 break;
139 } 133 }
140 case SUB_MODULE_DATA: { 134 case SUB_MODULE_DATA: {
141 YangSubModule subModule = (YangSubModule) tmpNode; 135 YangSubModule subModule = (YangSubModule) tmpNode;
142 - subModule.setRevision((YangRevision) tmpRevisionNode); 136 + if (subModule.getRevision() != null) {
137 + Date curRevisionDate = subModule.getRevision().getRevDate();
138 + if (curRevisionDate.before(((YangRevision) tmpRevisionNode).getRevDate())) {
139 + subModule.setRevision((YangRevision) tmpRevisionNode);
140 + }
141 + } else {
142 + subModule.setRevision((YangRevision) tmpRevisionNode);
143 + }
143 break; 144 break;
144 } 145 }
145 default: 146 default:
......
...@@ -16,11 +16,13 @@ ...@@ -16,11 +16,13 @@
16 16
17 package org.onosproject.yangutils.parser.impl.listeners; 17 package org.onosproject.yangutils.parser.impl.listeners;
18 18
19 +import java.util.Date;
19 import org.onosproject.yangutils.datamodel.ResolvableType; 20 import org.onosproject.yangutils.datamodel.ResolvableType;
20 import org.onosproject.yangutils.datamodel.YangReferenceResolver; 21 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
21 import org.onosproject.yangutils.datamodel.YangRevision; 22 import org.onosproject.yangutils.datamodel.YangRevision;
22 import org.onosproject.yangutils.datamodel.YangSubModule; 23 import org.onosproject.yangutils.datamodel.YangSubModule;
23 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 24 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
25 +import org.onosproject.yangutils.datamodel.utils.Parsable;
24 import org.onosproject.yangutils.linker.exceptions.LinkerException; 26 import org.onosproject.yangutils.linker.exceptions.LinkerException;
25 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; 27 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
26 import org.onosproject.yangutils.parser.exceptions.ParserException; 28 import org.onosproject.yangutils.parser.exceptions.ParserException;
...@@ -34,8 +36,8 @@ import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMes ...@@ -34,8 +36,8 @@ import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMes
34 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; 36 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
35 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER; 37 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
36 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; 38 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
39 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getCurrentDateForRevision;
37 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidIdentifier; 40 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidIdentifier;
38 -import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.setCurrentDateForRevision;
39 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsEmpty; 41 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsEmpty;
40 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; 42 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
41 import static org.onosproject.yangutils.translator.tojava.YangDataModelFactory.getYangSubModuleNode; 43 import static org.onosproject.yangutils.translator.tojava.YangDataModelFactory.getYangSubModuleNode;
...@@ -94,13 +96,6 @@ public final class SubModuleListener { ...@@ -94,13 +96,6 @@ public final class SubModuleListener {
94 yangSubModule.setVersion((byte) 1); 96 yangSubModule.setVersion((byte) 1);
95 } 97 }
96 98
97 - if (ctx.submoduleBody().revisionStatements().revisionStatement().isEmpty()) {
98 - String currentDate = setCurrentDateForRevision();
99 - YangRevision currentRevision = new YangRevision();
100 - currentRevision.setRevDate(currentDate);
101 - yangSubModule.setRevision(currentRevision);
102 - }
103 -
104 listener.getParsedDataStack().push(yangSubModule); 99 listener.getParsedDataStack().push(yangSubModule);
105 } 100 }
106 101
...@@ -118,12 +113,23 @@ public final class SubModuleListener { ...@@ -118,12 +113,23 @@ public final class SubModuleListener {
118 checkStackIsNotEmpty(listener, MISSING_HOLDER, SUB_MODULE_DATA, ctx.identifier().getText(), 113 checkStackIsNotEmpty(listener, MISSING_HOLDER, SUB_MODULE_DATA, ctx.identifier().getText(),
119 EXIT); 114 EXIT);
120 115
121 - if (!(listener.getParsedDataStack().peek() instanceof YangSubModule)) { 116 + Parsable tmpNode = listener.getParsedDataStack().peek();
117 + if (!(tmpNode instanceof YangSubModule)) {
122 throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, SUB_MODULE_DATA, 118 throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, SUB_MODULE_DATA,
123 ctx.identifier().getText(), EXIT)); 119 ctx.identifier().getText(), EXIT));
124 } 120 }
121 +
122 + if (((YangSubModule) tmpNode).getRevision() == null) {
123 + Date currentDate = getCurrentDateForRevision();
124 + YangRevision currentRevision = new YangRevision();
125 + currentRevision.setRevDate(currentDate);
126 + ((YangSubModule) tmpNode).setRevision(currentRevision);
127 + }
128 +
125 try { 129 try {
126 ((YangReferenceResolver) listener.getParsedDataStack().peek()) 130 ((YangReferenceResolver) listener.getParsedDataStack().peek())
131 + .resolveSelfFileLinking(ResolvableType.YANG_IF_FEATURE);
132 + ((YangReferenceResolver) listener.getParsedDataStack().peek())
127 .resolveSelfFileLinking(ResolvableType.YANG_USES); 133 .resolveSelfFileLinking(ResolvableType.YANG_USES);
128 ((YangReferenceResolver) listener.getParsedDataStack().peek()) 134 ((YangReferenceResolver) listener.getParsedDataStack().peek())
129 .resolveSelfFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE); 135 .resolveSelfFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE);
......
1 +/*
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 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import org.onosproject.yangutils.datamodel.YangWhen;
20 +import org.onosproject.yangutils.datamodel.YangWhenHolder;
21 +import org.onosproject.yangutils.datamodel.utils.Parsable;
22 +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
23 +import org.onosproject.yangutils.parser.exceptions.ParserException;
24 +import org.onosproject.yangutils.parser.impl.TreeWalkListener;
25 +
26 +import static org.onosproject.yangutils.datamodel.utils.YangConstructType.WHEN_DATA;
27 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
28 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
29 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
30 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
31 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
32 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
33 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat;
34 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
35 +
36 +/*
37 + * Reference: RFC6020 and YANG ANTLR Grammar
38 + *
39 + * ABNF grammar as per RFC6020
40 + *
41 + * when-stmt = when-keyword sep string optsep
42 + * (";" /
43 + * "{" stmtsep
44 + * ;; these stmts can appear in any order
45 + * [description-stmt stmtsep]
46 + * [reference-stmt stmtsep]
47 + * "}")
48 + *
49 + * ANTLR grammar rule
50 + * whenStatement : WHEN_KEYWORD string (STMTEND | LEFT_CURLY_BRACE ((descriptionStatement? referenceStatement?)
51 + * | (referenceStatement? descriptionStatement?)) RIGHT_CURLY_BRACE);
52 + */
53 +
54 +/**
55 + * Represents listener based call back function corresponding to the
56 + * "when" rule defined in ANTLR grammar file for corresponding ABNF rule
57 + * in RFC 6020.
58 + */
59 +public final class WhenListener {
60 +
61 + /**
62 + * Creates a new when listener.
63 + */
64 + private WhenListener() {
65 + }
66 +
67 + /**
68 + * Perform validations and updates the data model tree.It is called when parser
69 + * receives an input matching the grammar rule (when).
70 + *
71 + * @param listener listener's object
72 + * @param ctx context object of the grammar rule
73 + */
74 + public static void processWhenEntry(TreeWalkListener listener,
75 + GeneratedYangParser.WhenStatementContext ctx) {
76 +
77 + // Check for stack to be non empty.
78 + checkStackIsNotEmpty(listener, MISSING_HOLDER, WHEN_DATA, ctx.string().getText(), ENTRY);
79 + String condition = removeQuotesAndHandleConcat(ctx.string().getText());
80 +
81 + YangWhenHolder whenHolder;
82 +
83 + // Obtain the node of the stack.
84 + Parsable tmpNode = listener.getParsedDataStack().peek();
85 + if (tmpNode instanceof YangWhenHolder) {
86 + whenHolder = (YangWhenHolder) tmpNode;
87 +
88 + YangWhen when = new YangWhen();
89 + when.setCondition(condition);
90 +
91 + whenHolder.setWhen(when);
92 + listener.getParsedDataStack().push(when);
93 + } else {
94 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
95 + WHEN_DATA, ctx.string().getText(), ENTRY));
96 + }
97 + }
98 +
99 + /**
100 + * Performs validation and updates the data model tree.It is called when parser
101 + * exits from grammar rule (when).
102 + *
103 + * @param listener listener's object
104 + * @param ctx context object of the grammar rule
105 + */
106 + public static void processWhenExit(TreeWalkListener listener,
107 + GeneratedYangParser.WhenStatementContext ctx) {
108 +
109 + // Check for stack to be non empty.
110 + checkStackIsNotEmpty(listener, MISSING_HOLDER, WHEN_DATA, ctx.string().getText(), EXIT);
111 +
112 + if (listener.getParsedDataStack().peek() instanceof YangWhen) {
113 + listener.getParsedDataStack().pop();
114 + } else {
115 + throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, WHEN_DATA,
116 + ctx.string().getText(), EXIT));
117 + }
118 + }
119 +}
...@@ -18,7 +18,7 @@ package org.onosproject.yangutils.parser.impl.parserutils; ...@@ -18,7 +18,7 @@ package org.onosproject.yangutils.parser.impl.parserutils;
18 18
19 import java.text.ParseException; 19 import java.text.ParseException;
20 import java.text.SimpleDateFormat; 20 import java.text.SimpleDateFormat;
21 -import java.util.Calendar; 21 +import java.util.Date;
22 import java.util.LinkedList; 22 import java.util.LinkedList;
23 import java.util.List; 23 import java.util.List;
24 import java.util.regex.Pattern; 24 import java.util.regex.Pattern;
...@@ -30,20 +30,18 @@ import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; ...@@ -30,20 +30,18 @@ import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
30 import org.onosproject.yangutils.parser.exceptions.ParserException; 30 import org.onosproject.yangutils.parser.exceptions.ParserException;
31 31
32 import static org.onosproject.yangutils.utils.UtilConstants.ADD; 32 import static org.onosproject.yangutils.utils.UtilConstants.ADD;
33 -import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
34 -import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
35 -import static org.onosproject.yangutils.utils.UtilConstants.COLON;
36 import static org.onosproject.yangutils.utils.UtilConstants.CARET; 33 import static org.onosproject.yangutils.utils.UtilConstants.CARET;
34 +import static org.onosproject.yangutils.utils.UtilConstants.COLON;
37 import static org.onosproject.yangutils.utils.UtilConstants.CURRENTLY_UNSUPPORTED; 35 import static org.onosproject.yangutils.utils.UtilConstants.CURRENTLY_UNSUPPORTED;
38 -import static org.onosproject.yangutils.utils.UtilConstants.QUOTES;
39 -import static org.onosproject.yangutils.utils.UtilConstants.HYPHEN;
40 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING; 36 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
41 -import static org.onosproject.yangutils.utils.UtilConstants.TRUE;
42 import static org.onosproject.yangutils.utils.UtilConstants.FALSE; 37 import static org.onosproject.yangutils.utils.UtilConstants.FALSE;
43 -import static org.onosproject.yangutils.utils.UtilConstants.YANG_FILE_ERROR;
44 import static org.onosproject.yangutils.utils.UtilConstants.IDENTITYREF; 38 import static org.onosproject.yangutils.utils.UtilConstants.IDENTITYREF;
45 -import static org.onosproject.yangutils.utils.UtilConstants.LEAFREF;
46 import static org.onosproject.yangutils.utils.UtilConstants.INSTANCE_IDENTIFIER; 39 import static org.onosproject.yangutils.utils.UtilConstants.INSTANCE_IDENTIFIER;
40 +import static org.onosproject.yangutils.utils.UtilConstants.LEAFREF;
41 +import static org.onosproject.yangutils.utils.UtilConstants.QUOTES;
42 +import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
43 +import static org.onosproject.yangutils.utils.UtilConstants.TRUE;
44 +import static org.onosproject.yangutils.utils.UtilConstants.YANG_FILE_ERROR;
47 45
48 /** 46 /**
49 * Represents an utility for listener. 47 * Represents an utility for listener.
...@@ -256,17 +254,24 @@ public final class ListenerUtil { ...@@ -256,17 +254,24 @@ public final class ListenerUtil {
256 } 254 }
257 255
258 /** 256 /**
259 - * Sets current date and makes it in usable format for revision. 257 + * Returns current date and makes it in usable format for revision.
260 * 258 *
261 * @return usable current date format for revision 259 * @return usable current date format for revision
262 */ 260 */
263 - public static String setCurrentDateForRevision() { 261 + public static Date getCurrentDateForRevision() {
264 262
265 - Calendar date = Calendar.getInstance();
266 SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); 263 SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
267 - String dateForRevision = dateFormat.format(date.getTime()).replaceAll(SLASH, HYPHEN).replaceAll(SPACE, 264 +
268 - EMPTY_STRING); 265 + Date date = new Date();
269 - return dateForRevision; 266 + String dateInString = dateFormat.format(date);
267 + try {
268 + //if not valid, it will throw ParseException
269 + Date now = dateFormat.parse(dateInString);
270 + return date;
271 + } catch (ParseException e) {
272 + ParserException parserException = new ParserException("YANG file error: Input date is not correct");
273 + throw parserException;
274 + }
270 } 275 }
271 276
272 /** 277 /**
...@@ -373,4 +378,35 @@ public final class ListenerUtil { ...@@ -373,4 +378,35 @@ public final class ListenerUtil {
373 parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); 378 parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
374 throw parserException; 379 throw parserException;
375 } 380 }
381 +
382 + /**
383 + * Returns date and makes it in usable format for revision.
384 + *
385 + * @param dateInString date argument string from yang file
386 + * @param ctx yang construct's context to get the line number and character position
387 + * @return date format for revision
388 + */
389 + public static Date getValidDateFromString(String dateInString, ParserRuleContext ctx) {
390 + String dateArgument = removeQuotesAndHandleConcat(dateInString);
391 + if (dateArgument == null || !dateArgument.matches(DATE_PATTERN)) {
392 + ParserException parserException = new ParserException("YANG file error: Input date is not correct");
393 + parserException.setLine(ctx.getStart().getLine());
394 + parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
395 + throw parserException;
396 + }
397 +
398 + SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
399 + sdf.setLenient(false);
400 +
401 + try {
402 + //if not valid, it will throw ParseException
403 + Date date = sdf.parse(dateArgument);
404 + return date;
405 + } catch (ParseException e) {
406 + ParserException parserException = new ParserException("YANG file error: Input date is not correct");
407 + parserException.setLine(ctx.getStart().getLine());
408 + parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
409 + throw parserException;
410 + }
411 + }
376 } 412 }
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -18,7 +18,9 @@ package org.onosproject.yangutils.translator.tojava.utils; ...@@ -18,7 +18,9 @@ package org.onosproject.yangutils.translator.tojava.utils;
18 18
19 import java.io.File; 19 import java.io.File;
20 import java.io.IOException; 20 import java.io.IOException;
21 +import java.text.SimpleDateFormat;
21 import java.util.ArrayList; 22 import java.util.ArrayList;
23 +import java.util.Date;
22 import java.util.List; 24 import java.util.List;
23 import org.onosproject.yangutils.datamodel.YangNode; 25 import org.onosproject.yangutils.datamodel.YangNode;
24 import org.onosproject.yangutils.translator.exception.TranslatorException; 26 import org.onosproject.yangutils.translator.exception.TranslatorException;
...@@ -59,6 +61,7 @@ public final class JavaIdentifierSyntax { ...@@ -59,6 +61,7 @@ public final class JavaIdentifierSyntax {
59 private static final int INDEX_TWO = 2; 61 private static final int INDEX_TWO = 2;
60 private static final int VALUE_CHECK = 10; 62 private static final int VALUE_CHECK = 10;
61 private static final String ZERO = "0"; 63 private static final String ZERO = "0";
64 + private static final String DATE_FORMAT = "yyyy-MM-dd";
62 65
63 /** 66 /**
64 * Create instance of java identifier syntax. 67 * Create instance of java identifier syntax.
...@@ -75,7 +78,7 @@ public final class JavaIdentifierSyntax { ...@@ -75,7 +78,7 @@ public final class JavaIdentifierSyntax {
75 * @param conflictResolver object of YANG to java naming conflict util 78 * @param conflictResolver object of YANG to java naming conflict util
76 * @return the root package string 79 * @return the root package string
77 */ 80 */
78 - public static String getRootPackage(byte version, String nameSpace, String revision, 81 + public static String getRootPackage(byte version, String nameSpace, Date revision,
79 YangToJavaNamingConflictUtil conflictResolver) { 82 YangToJavaNamingConflictUtil conflictResolver) {
80 83
81 String pkg; 84 String pkg;
...@@ -125,30 +128,23 @@ public final class JavaIdentifierSyntax { ...@@ -125,30 +128,23 @@ public final class JavaIdentifierSyntax {
125 * 128 *
126 * @param date YANG module revision 129 * @param date YANG module revision
127 * @return revision string 130 * @return revision string
128 - * @throws TranslatorException when date is invalid.
129 */ 131 */
130 - private static String getYangRevisionStr(String date) throws TranslatorException { 132 + private static String getYangRevisionStr(Date date) {
131 - 133 + SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
132 - String[] revisionArr = date.split(HYPHEN); 134 + String dateInString = sdf.format(date);
135 + String[] revisionArr = dateInString.split(HYPHEN);
133 136
134 String rev = REVISION_PREFIX; 137 String rev = REVISION_PREFIX;
135 rev = rev + revisionArr[INDEX_ZERO]; 138 rev = rev + revisionArr[INDEX_ZERO];
136 139
137 - if (Integer.parseInt(revisionArr[INDEX_ONE]) <= MAX_MONTHS 140 + for (int i = INDEX_ONE; i < revisionArr.length; i++) {
138 - && Integer.parseInt(revisionArr[INDEX_TWO]) <= MAX_DAYS) { 141 + Integer val = Integer.parseInt(revisionArr[i]);
139 - for (int i = INDEX_ONE; i < revisionArr.length; i++) { 142 + if (val < VALUE_CHECK) {
140 - 143 + rev = rev + ZERO;
141 - Integer val = Integer.parseInt(revisionArr[i]);
142 - if (val < VALUE_CHECK) {
143 - rev = rev + ZERO;
144 - }
145 - rev = rev + val;
146 } 144 }
147 - 145 + rev = rev + val;
148 - return rev;
149 - } else {
150 - throw new TranslatorException("Date in revision is not proper: " + date);
151 } 146 }
147 + return rev;
152 } 148 }
153 149
154 /** 150 /**
......
...@@ -1140,6 +1140,12 @@ public final class UtilConstants { ...@@ -1140,6 +1140,12 @@ public final class UtilConstants {
1140 + "grouping for given uses"; 1140 + "grouping for given uses";
1141 1141
1142 /** 1142 /**
1143 + * Static attribute for grouping linker error information.
1144 + */
1145 + public static final String FEATURE_LINKER_ERROR = "YANG file error: Unable to find feature "
1146 + + "for given if-feature";
1147 +
1148 + /**
1143 * Static attribute for reference. 1149 * Static attribute for reference.
1144 */ 1150 */
1145 public static final String REFERENCE = "Reference"; 1151 public static final String REFERENCE = "Reference";
......
...@@ -16,14 +16,15 @@ ...@@ -16,14 +16,15 @@
16 16
17 package org.onosproject.yangutils.parser.impl.listeners; 17 package org.onosproject.yangutils.parser.impl.listeners;
18 18
19 +import java.io.IOException;
20 +import java.text.ParseException;
21 +import java.text.SimpleDateFormat;
19 import org.junit.Test; 22 import org.junit.Test;
20 import org.onosproject.yangutils.datamodel.YangModule; 23 import org.onosproject.yangutils.datamodel.YangModule;
21 import org.onosproject.yangutils.datamodel.YangNode; 24 import org.onosproject.yangutils.datamodel.YangNode;
22 import org.onosproject.yangutils.parser.exceptions.ParserException; 25 import org.onosproject.yangutils.parser.exceptions.ParserException;
23 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; 26 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
24 27
25 -import java.io.IOException;
26 -
27 import static org.hamcrest.core.Is.is; 28 import static org.hamcrest.core.Is.is;
28 import static org.junit.Assert.assertThat; 29 import static org.junit.Assert.assertThat;
29 30
...@@ -33,6 +34,8 @@ import static org.junit.Assert.assertThat; ...@@ -33,6 +34,8 @@ import static org.junit.Assert.assertThat;
33 public class ImportListenerTest { 34 public class ImportListenerTest {
34 35
35 private final YangUtilsParserManager manager = new YangUtilsParserManager(); 36 private final YangUtilsParserManager manager = new YangUtilsParserManager();
37 + private static final String DATE_FORMAT = "yyyy-MM-dd";
38 + private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT);
36 39
37 /** 40 /**
38 * Checks if mandatory parameter prefix is present in import. 41 * Checks if mandatory parameter prefix is present in import.
...@@ -65,12 +68,12 @@ public class ImportListenerTest { ...@@ -65,12 +68,12 @@ public class ImportListenerTest {
65 * Checks if import listener updates the data model tree. 68 * Checks if import listener updates the data model tree.
66 */ 69 */
67 @Test 70 @Test
68 - public void processImportValidEntry() throws IOException, ParserException { 71 + public void processImportValidEntry() throws IOException, ParserException, ParseException {
69 72
70 YangNode node = manager.getDataModel("src/test/resources/ImportValidEntry.yang"); 73 YangNode node = manager.getDataModel("src/test/resources/ImportValidEntry.yang");
71 74
72 // Checks for the revision value in data model tree. 75 // Checks for the revision value in data model tree.
73 - assertThat(((YangModule) node).getImportList().get(0).getRevision(), is("2015-02-03")); 76 + assertThat(((YangModule) node).getImportList().get(0).getRevision(), is(simpleDateFormat.parse("2015-02-03")));
74 // Checks for the prefix id in data model tree. 77 // Checks for the prefix id in data model tree.
75 assertThat(((YangModule) node).getImportList().get(0).getPrefixId(), is("On2")); 78 assertThat(((YangModule) node).getImportList().get(0).getPrefixId(), is("On2"));
76 // Checks for the module name in data model tree. 79 // Checks for the module name in data model tree.
......
...@@ -16,14 +16,15 @@ ...@@ -16,14 +16,15 @@
16 16
17 package org.onosproject.yangutils.parser.impl.listeners; 17 package org.onosproject.yangutils.parser.impl.listeners;
18 18
19 +import java.io.IOException;
20 +import java.text.ParseException;
21 +import java.text.SimpleDateFormat;
19 import org.junit.Test; 22 import org.junit.Test;
20 import org.onosproject.yangutils.datamodel.YangModule; 23 import org.onosproject.yangutils.datamodel.YangModule;
21 import org.onosproject.yangutils.datamodel.YangNode; 24 import org.onosproject.yangutils.datamodel.YangNode;
22 import org.onosproject.yangutils.parser.exceptions.ParserException; 25 import org.onosproject.yangutils.parser.exceptions.ParserException;
23 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; 26 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
24 27
25 -import java.io.IOException;
26 -
27 import static org.hamcrest.core.Is.is; 28 import static org.hamcrest.core.Is.is;
28 import static org.junit.Assert.assertThat; 29 import static org.junit.Assert.assertThat;
29 30
...@@ -33,6 +34,8 @@ import static org.junit.Assert.assertThat; ...@@ -33,6 +34,8 @@ import static org.junit.Assert.assertThat;
33 public class IncludeListenerTest { 34 public class IncludeListenerTest {
34 35
35 private final YangUtilsParserManager manager = new YangUtilsParserManager(); 36 private final YangUtilsParserManager manager = new YangUtilsParserManager();
37 + private static final String DATE_FORMAT = "yyyy-MM-dd";
38 + private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT);
36 39
37 /** 40 /**
38 * Checks if include listener with ; is valid and updates the data 41 * Checks if include listener with ; is valid and updates the data
...@@ -65,43 +68,43 @@ public class IncludeListenerTest { ...@@ -65,43 +68,43 @@ public class IncludeListenerTest {
65 * and updates the data model tree. 68 * and updates the data model tree.
66 */ 69 */
67 @Test 70 @Test
68 - public void processIncludeWithDate() throws IOException, ParserException { 71 + public void processIncludeWithDate() throws IOException, ParserException, ParseException {
69 72
70 YangNode node = manager.getDataModel("src/test/resources/IncludeWithDate.yang"); 73 YangNode node = manager.getDataModel("src/test/resources/IncludeWithDate.yang");
71 74
72 // Checks for the sub module name in data model tree. 75 // Checks for the sub module name in data model tree.
73 assertThat(((YangModule) node).getIncludeList().get(0).getSubModuleName(), is("itut")); 76 assertThat(((YangModule) node).getIncludeList().get(0).getSubModuleName(), is("itut"));
74 - assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is("2016-02-03")); 77 + assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is(simpleDateFormat.parse("2016-02-03")));
75 } 78 }
76 79
77 /** 80 /**
78 * Checks if include has more than one occurrence. 81 * Checks if include has more than one occurrence.
79 */ 82 */
80 @Test 83 @Test
81 - public void processIncludeMultiInstance() throws IOException, ParserException { 84 + public void processIncludeMultiInstance() throws IOException, ParserException, ParseException {
82 85
83 YangNode node = manager.getDataModel("src/test/resources/IncludeMultiInstance.yang"); 86 YangNode node = manager.getDataModel("src/test/resources/IncludeMultiInstance.yang");
84 87
85 // Checks for the sub module name in data model tree. 88 // Checks for the sub module name in data model tree.
86 assertThat(((YangModule) node).getIncludeList().get(0).getSubModuleName(), is("itut")); 89 assertThat(((YangModule) node).getIncludeList().get(0).getSubModuleName(), is("itut"));
87 - assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is("2016-02-03")); 90 + assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is(simpleDateFormat.parse("2016-02-03")));
88 assertThat(((YangModule) node).getIncludeList().get(1).getSubModuleName(), is("sdn")); 91 assertThat(((YangModule) node).getIncludeList().get(1).getSubModuleName(), is("sdn"));
89 - assertThat(((YangModule) node).getIncludeList().get(1).getRevision(), is("2014-02-03")); 92 + assertThat(((YangModule) node).getIncludeList().get(1).getRevision(), is(simpleDateFormat.parse("2014-02-03")));
90 } 93 }
91 94
92 /** 95 /**
93 * Checks if include and import can come in any order. 96 * Checks if include and import can come in any order.
94 */ 97 */
95 @Test 98 @Test
96 - public void processIncludeImportAnyOrder() throws IOException, ParserException { 99 + public void processIncludeImportAnyOrder() throws IOException, ParserException, ParseException {
97 100
98 YangNode node = manager.getDataModel("src/test/resources/IncludeImportAnyOrder.yang"); 101 YangNode node = manager.getDataModel("src/test/resources/IncludeImportAnyOrder.yang");
99 102
100 // Checks for the sub module name in data model tree. 103 // Checks for the sub module name in data model tree.
101 assertThat(((YangModule) node).getIncludeList().get(0).getSubModuleName(), is("itut")); 104 assertThat(((YangModule) node).getIncludeList().get(0).getSubModuleName(), is("itut"));
102 - assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is("2016-02-03")); 105 + assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is(simpleDateFormat.parse("2016-02-03")));
103 assertThat(((YangModule) node).getIncludeList().get(1).getSubModuleName(), is("sdn")); 106 assertThat(((YangModule) node).getIncludeList().get(1).getSubModuleName(), is("sdn"));
104 - assertThat(((YangModule) node).getIncludeList().get(1).getRevision(), is("2014-02-03")); 107 + assertThat(((YangModule) node).getIncludeList().get(1).getRevision(), is(simpleDateFormat.parse("2014-02-03")));
105 } 108 }
106 109
107 /** 110 /**
......
1 +/*
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 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import org.junit.Test;
20 +import org.onosproject.yangutils.datamodel.YangMust;
21 +import org.onosproject.yangutils.datamodel.YangModule;
22 +import org.onosproject.yangutils.datamodel.YangNode;
23 +import org.onosproject.yangutils.datamodel.YangContainer;
24 +import org.onosproject.yangutils.datamodel.YangLeaf;
25 +import org.onosproject.yangutils.parser.exceptions.ParserException;
26 +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
27 +
28 +import java.io.IOException;
29 +import java.util.List;
30 +import java.util.ListIterator;
31 +
32 +import static org.hamcrest.core.Is.is;
33 +import static org.junit.Assert.assertThat;
34 +
35 +/**
36 + * Test cases for testing must listener functionality.
37 + */
38 +public class MustListenerTest {
39 +
40 + private final YangUtilsParserManager manager = new YangUtilsParserManager();
41 +
42 + /**
43 + * Checks if must listener updates the data model.
44 + */
45 + @Test
46 + public void processContainerSubStatementMust() throws IOException, ParserException {
47 + YangNode node = manager.getDataModel("src/test/resources/ContainerSubStatementMust.yang");
48 +
49 + YangModule yangNode = (YangModule) node;
50 + assertThat(yangNode.getName(), is("Test"));
51 +
52 + YangContainer yangContainer = (YangContainer) yangNode.getChild();
53 + assertThat(yangContainer.getName(), is("interface"));
54 +
55 + String expectedConstraint = "ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)";
56 + List<YangMust> mustConstraintList = yangContainer.getListOfMust();
57 + assertThat(mustConstraintList.iterator().next().getConstraint(), is(expectedConstraint));
58 + }
59 +
60 + /**
61 + * Checks if must listener updates the data model.
62 + */
63 + @Test
64 + public void processLeafSubStatementMust() throws IOException, ParserException {
65 + YangNode node = manager.getDataModel("src/test/resources/LeafSubStatementMust.yang");
66 +
67 + YangModule yangNode = (YangModule) node;
68 + assertThat(yangNode.getName(), is("Test"));
69 +
70 + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
71 + YangLeaf leafInfo = leafIterator.next();
72 +
73 + assertThat(leafInfo.getListOfMust().iterator().next().getConstraint(), is("ifType != 'ethernet'"));
74 + }
75 +}
...\ No newline at end of file ...\ No newline at end of file
...@@ -16,14 +16,15 @@ ...@@ -16,14 +16,15 @@
16 16
17 package org.onosproject.yangutils.parser.impl.listeners; 17 package org.onosproject.yangutils.parser.impl.listeners;
18 18
19 +import java.io.IOException;
20 +import java.text.ParseException;
21 +import java.text.SimpleDateFormat;
19 import org.junit.Test; 22 import org.junit.Test;
20 import org.onosproject.yangutils.datamodel.YangModule; 23 import org.onosproject.yangutils.datamodel.YangModule;
21 import org.onosproject.yangutils.datamodel.YangNode; 24 import org.onosproject.yangutils.datamodel.YangNode;
22 import org.onosproject.yangutils.parser.exceptions.ParserException; 25 import org.onosproject.yangutils.parser.exceptions.ParserException;
23 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; 26 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
24 27
25 -import java.io.IOException;
26 -
27 import static org.hamcrest.core.Is.is; 28 import static org.hamcrest.core.Is.is;
28 import static org.junit.Assert.assertThat; 29 import static org.junit.Assert.assertThat;
29 30
...@@ -33,6 +34,8 @@ import static org.junit.Assert.assertThat; ...@@ -33,6 +34,8 @@ import static org.junit.Assert.assertThat;
33 public class RevisionDateListenerTest { 34 public class RevisionDateListenerTest {
34 35
35 private final YangUtilsParserManager manager = new YangUtilsParserManager(); 36 private final YangUtilsParserManager manager = new YangUtilsParserManager();
37 + private static final String DATE_FORMAT = "yyyy-MM-dd";
38 + private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT);
36 39
37 /** 40 /**
38 * Checks if revision date syntax is correct in include. 41 * Checks if revision date syntax is correct in include.
...@@ -56,26 +59,26 @@ public class RevisionDateListenerTest { ...@@ -56,26 +59,26 @@ public class RevisionDateListenerTest {
56 * Checks revision date in quotes inside include. 59 * Checks revision date in quotes inside include.
57 */ 60 */
58 @Test 61 @Test
59 - public void processRevisionDateInQuotesAtInclude() throws IOException, ParserException { 62 + public void processRevisionDateInQuotesAtInclude() throws IOException, ParserException, ParseException {
60 63
61 YangNode node = manager.getDataModel("src/test/resources/RevisionDateInQuotesAtInclude.yang"); 64 YangNode node = manager.getDataModel("src/test/resources/RevisionDateInQuotesAtInclude.yang");
62 // Checks for the version value in data model tree. 65 // Checks for the version value in data model tree.
63 - assertThat(((YangModule) node).getImportList().get(0).getRevision(), is("2015-02-03")); 66 + assertThat(((YangModule) node).getImportList().get(0).getRevision(), is(simpleDateFormat.parse("2015-02-03")));
64 - assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is("2016-02-03")); 67 + assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is(simpleDateFormat.parse("2016-02-03")));
65 - assertThat(((YangModule) node).getIncludeList().get(1).getRevision(), is("2014-02-03")); 68 + assertThat(((YangModule) node).getIncludeList().get(1).getRevision(), is(simpleDateFormat.parse("2014-02-03")));
66 } 69 }
67 70
68 /** 71 /**
69 * Checks revision date in quotes inside import. 72 * Checks revision date in quotes inside import.
70 */ 73 */
71 @Test 74 @Test
72 - public void processRevisionDateInQuotesAtImport() throws IOException, ParserException { 75 + public void processRevisionDateInQuotesAtImport() throws IOException, ParserException, ParseException {
73 76
74 YangNode node = manager.getDataModel("src/test/resources/RevisionDateInQuotesAtImport.yang"); 77 YangNode node = manager.getDataModel("src/test/resources/RevisionDateInQuotesAtImport.yang");
75 // Checks for the version value in data model tree. 78 // Checks for the version value in data model tree.
76 - assertThat(((YangModule) node).getImportList().get(0).getRevision(), is("2015-02-03")); 79 + assertThat(((YangModule) node).getImportList().get(0).getRevision(), is(simpleDateFormat.parse("2015-02-03")));
77 - assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is("2016-02-03")); 80 + assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is(simpleDateFormat.parse("2016-02-03")));
78 - assertThat(((YangModule) node).getIncludeList().get(1).getRevision(), is("2014-02-03")); 81 + assertThat(((YangModule) node).getIncludeList().get(1).getRevision(), is(simpleDateFormat.parse("2014-02-03")));
79 } 82 }
80 83
81 /** 84 /**
...@@ -100,13 +103,13 @@ public class RevisionDateListenerTest { ...@@ -100,13 +103,13 @@ public class RevisionDateListenerTest {
100 * Checks if revision date listener updates the data model tree. 103 * Checks if revision date listener updates the data model tree.
101 */ 104 */
102 @Test 105 @Test
103 - public void processRevisionDateValidEntry() throws IOException, ParserException { 106 + public void processRevisionDateValidEntry() throws IOException, ParserException, ParseException {
104 107
105 YangNode node = manager.getDataModel("src/test/resources/RevisionDateValidEntry.yang"); 108 YangNode node = manager.getDataModel("src/test/resources/RevisionDateValidEntry.yang");
106 109
107 // Checks for the version value in data model tree. 110 // Checks for the version value in data model tree.
108 - assertThat(((YangModule) node).getImportList().get(0).getRevision(), is("2015-02-03")); 111 + assertThat(((YangModule) node).getImportList().get(0).getRevision(), is(simpleDateFormat.parse("2015-02-03")));
109 - assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is("2016-02-03")); 112 + assertThat(((YangModule) node).getIncludeList().get(0).getRevision(), is(simpleDateFormat.parse("2016-02-03")));
110 - assertThat(((YangModule) node).getIncludeList().get(1).getRevision(), is("2014-02-03")); 113 + assertThat(((YangModule) node).getIncludeList().get(1).getRevision(), is(simpleDateFormat.parse("2014-02-03")));
111 } 114 }
112 } 115 }
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -16,14 +16,15 @@ ...@@ -16,14 +16,15 @@
16 16
17 package org.onosproject.yangutils.parser.impl.listeners; 17 package org.onosproject.yangutils.parser.impl.listeners;
18 18
19 +import java.io.IOException;
20 +import java.text.ParseException;
21 +import java.text.SimpleDateFormat;
19 import org.junit.Test; 22 import org.junit.Test;
20 import org.onosproject.yangutils.datamodel.YangModule; 23 import org.onosproject.yangutils.datamodel.YangModule;
21 import org.onosproject.yangutils.datamodel.YangNode; 24 import org.onosproject.yangutils.datamodel.YangNode;
22 import org.onosproject.yangutils.parser.exceptions.ParserException; 25 import org.onosproject.yangutils.parser.exceptions.ParserException;
23 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; 26 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
24 27
25 -import java.io.IOException;
26 -
27 import static org.hamcrest.core.Is.is; 28 import static org.hamcrest.core.Is.is;
28 import static org.hamcrest.core.IsNull.notNullValue; 29 import static org.hamcrest.core.IsNull.notNullValue;
29 import static org.junit.Assert.assertThat; 30 import static org.junit.Assert.assertThat;
...@@ -34,18 +35,19 @@ import static org.junit.Assert.assertThat; ...@@ -34,18 +35,19 @@ import static org.junit.Assert.assertThat;
34 public class RevisionListenerTest { 35 public class RevisionListenerTest {
35 36
36 private final YangUtilsParserManager manager = new YangUtilsParserManager(); 37 private final YangUtilsParserManager manager = new YangUtilsParserManager();
38 + private static final String DATE_FORMAT = "yyyy-MM-dd";
39 + private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT);
37 40
38 /** 41 /**
39 * Checks if revision doesn't have optional parameters "revision and 42 * Checks if revision doesn't have optional parameters "revision and
40 * description". 43 * description".
41 */ 44 */
42 @Test 45 @Test
43 - public void processRevisionNoOptionalParameter() throws IOException, ParserException { 46 + public void processRevisionNoOptionalParameter() throws IOException, ParserException, ParseException {
44 47
45 YangNode node = manager.getDataModel("src/test/resources/RevisionNoOptionalParameter.yang"); 48 YangNode node = manager.getDataModel("src/test/resources/RevisionNoOptionalParameter.yang");
46 -
47 // Checks for the version value in data model tree. 49 // Checks for the version value in data model tree.
48 - assertThat(((YangModule) node).getRevision().getRevDate(), is("2016-02-03")); 50 + assertThat(((YangModule) node).getRevision().getRevDate(), is(simpleDateFormat.parse("2016-02-03")));
49 } 51 }
50 52
51 /** 53 /**
...@@ -75,4 +77,14 @@ public class RevisionListenerTest { ...@@ -75,4 +77,14 @@ public class RevisionListenerTest {
75 YangNode node = manager.getDataModel("src/test/resources/RevisionAbsence.yang"); 77 YangNode node = manager.getDataModel("src/test/resources/RevisionAbsence.yang");
76 assertThat(((YangModule) node).getRevision().getRevDate(), notNullValue()); 78 assertThat(((YangModule) node).getRevision().getRevDate(), notNullValue());
77 } 79 }
80 +
81 + /**
82 + * Checks latest date is stored when there are multiple revisions.
83 + */
84 + @Test
85 + public void processWithMultipleRevision() throws IOException, ParserException, ParseException {
86 +
87 + YangNode node = manager.getDataModel("src/test/resources/MultipleRevision.yang");
88 + assertThat(((YangModule) node).getRevision().getRevDate(), is(simpleDateFormat.parse("2013-07-15")));
89 + }
78 } 90 }
...\ No newline at end of file ...\ No newline at end of file
......
1 +/*
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 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import org.junit.Test;
20 +import org.onosproject.yangutils.datamodel.YangContainer;
21 +import org.onosproject.yangutils.datamodel.YangLeaf;
22 +import org.onosproject.yangutils.datamodel.YangList;
23 +import org.onosproject.yangutils.datamodel.YangModule;
24 +import org.onosproject.yangutils.datamodel.YangNode;
25 +import org.onosproject.yangutils.parser.exceptions.ParserException;
26 +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
27 +
28 +import java.io.IOException;
29 +import java.util.ListIterator;
30 +
31 +import static org.hamcrest.core.Is.is;
32 +import static org.junit.Assert.assertThat;
33 +
34 +/**
35 + * Test cases for testing when listener functionality.
36 + */
37 +public class WhenListenerTest {
38 +
39 + private final YangUtilsParserManager manager = new YangUtilsParserManager();
40 +
41 + /**
42 + * Checks if when listener updates the data model.
43 + */
44 + @Test
45 + public void processContainerSubStatementWhen() throws IOException, ParserException {
46 + YangNode node = manager.getDataModel("src/test/resources/ContainerSubStatementWhen.yang");
47 +
48 + YangModule yangNode = (YangModule) node;
49 + assertThat(yangNode.getName(), is("Test"));
50 +
51 + YangList yangList = (YangList) yangNode.getChild();
52 + assertThat(yangList.getName(), is("interface-switching-capability"));
53 +
54 + YangContainer container = (YangContainer) yangList.getNextSibling();
55 + assertThat(container.getName(), is("time-division-multiplex-capable"));
56 +
57 + String expectedConstraint = "../switching-capability = 'TDM'";
58 + assertThat(container.getWhen().getCondition(), is(expectedConstraint));
59 + }
60 +
61 + /**
62 + * Checks if when listener updates the data model.
63 + */
64 + @Test
65 + public void processLeafSubStatementWhen() throws IOException, ParserException {
66 + YangNode node = manager.getDataModel("src/test/resources/LeafSubStatementWhen.yang");
67 +
68 + YangModule yangNode = (YangModule) node;
69 + assertThat(yangNode.getName(), is("Test"));
70 +
71 + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
72 + YangLeaf leafInfo = leafIterator.next();
73 +
74 + assertThat(leafInfo.getWhen().getCondition(), is("ifType != 'ethernet'"));
75 + }
76 +}
...\ No newline at end of file ...\ No newline at end of file
1 +/*
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 +
17 +package org.onosproject.yangutils.plugin.manager;
18 +
19 +import java.io.IOException;
20 +import java.util.List;
21 +import java.util.ListIterator;
22 +import org.apache.maven.plugin.MojoExecutionException;
23 +import org.junit.Test;
24 +import org.onosproject.yangutils.datamodel.YangContainer;
25 +import org.onosproject.yangutils.datamodel.YangFeature;
26 +import org.onosproject.yangutils.datamodel.YangIfFeature;
27 +import org.onosproject.yangutils.datamodel.YangLeaf;
28 +import org.onosproject.yangutils.datamodel.YangModule;
29 +import org.onosproject.yangutils.datamodel.YangNode;
30 +import org.onosproject.yangutils.linker.impl.YangLinkerManager;
31 +import org.onosproject.yangutils.parser.exceptions.ParserException;
32 +import org.onosproject.yangutils.utils.io.impl.YangFileScanner;
33 +
34 +import static org.hamcrest.MatcherAssert.assertThat;
35 +import static org.hamcrest.core.Is.is;
36 +import static org.onosproject.yangutils.datamodel.YangNodeType.MODULE_NODE;
37 +import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.INTRA_FILE_RESOLVED;
38 +import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.RESOLVED;
39 +
40 +/**
41 + * Test cases for testing inter file linking.
42 + */
43 +public class InterFileIfFeatureLinkingTest {
44 +
45 + private final YangUtilManager utilManager = new YangUtilManager();
46 + private final YangLinkerManager yangLinkerManager = new YangLinkerManager();
47 +
48 + /**
49 + * Checks inter file feature linking with imported file.
50 + */
51 + @Test
52 + public void processFeatureInImportedFile()
53 + throws IOException, ParserException, MojoExecutionException {
54 +
55 + String searchDir = "src/test/resources/interfilefeatureimport";
56 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
57 + utilManager.parseYangFileInfoSet();
58 + utilManager.createYangNodeSet();
59 +
60 + YangNode selfNode = null;
61 + YangNode refNode1 = null;
62 + YangNode refNode2 = null;
63 +
64 + // Create YANG node set
65 + yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
66 +
67 + // Add references to import list.
68 + yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
69 +
70 + // Carry out inter-file linking.
71 + yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
72 +
73 + for (YangNode rootNode : utilManager.getYangNodeSet()) {
74 + if (rootNode.getName().equals("syslog1")) {
75 + selfNode = rootNode;
76 + } else if (rootNode.getName().equals("syslog2")) {
77 + refNode1 = rootNode;
78 + } else {
79 + refNode2 = rootNode;
80 + }
81 + }
82 + // Check whether the data model tree returned is of type module.
83 + assertThat(selfNode instanceof YangModule, is(true));
84 +
85 + // Check whether the node type is set properly to module.
86 + assertThat(selfNode.getNodeType(), is(MODULE_NODE));
87 +
88 + // Check whether the module name is set correctly.
89 + YangModule yangNode = (YangModule) selfNode;
90 + assertThat(yangNode.getName(), is("syslog1"));
91 +
92 + ListIterator<YangFeature> featureIterator = yangNode.getFeatureList().listIterator();
93 + YangFeature feature = featureIterator.next();
94 + assertThat(feature.getName(), is("frr-te"));
95 +
96 + YangIfFeature ifFeature = feature.getIfFeatureList().iterator().next();
97 + assertThat(ifFeature.getName().getName(), is("p2mp-te"));
98 + assertThat(ifFeature.getName().getPrefix(), is("sys2"));
99 + assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
100 +
101 + YangContainer container = (YangContainer) selfNode.getChild();
102 + assertThat(container.getName(), is("speed"));
103 + YangLeaf leaf = container.getListOfLeaf().iterator().next();
104 + assertThat(leaf.getName(), is("local-storage-limit"));
105 +
106 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
107 + ifFeature = ifFeatureList.iterator().next();
108 + assertThat(ifFeature.getName().getName(), is("frr-te"));
109 + assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
110 + }
111 +
112 + /**
113 + * Checks inter file feature linking with included file.
114 + */
115 + @Test
116 + public void processFeatureInIncludedFile()
117 + throws IOException, ParserException, MojoExecutionException {
118 +
119 + String searchDir = "src/test/resources/interfilefeatureinclude";
120 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
121 + utilManager.parseYangFileInfoSet();
122 + utilManager.createYangNodeSet();
123 +
124 + YangNode selfNode = null;
125 + YangNode refNode1 = null;
126 + YangNode refNode2 = null;
127 +
128 + // Create YANG node set
129 + yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
130 +
131 + // Carry out linking of sub module with module.
132 + yangLinkerManager.linkSubModulesToParentModule(utilManager.getYangNodeSet());
133 +
134 + // Add references to import list.
135 + yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
136 +
137 + // Add references to include list.
138 + yangLinkerManager.addRefToYangFilesIncludeList(utilManager.getYangNodeSet());
139 +
140 + // Carry out inter-file linking.
141 + yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
142 +
143 + for (YangNode rootNode : utilManager.getYangNodeSet()) {
144 + if (rootNode.getName().equals("syslog3")) {
145 + selfNode = rootNode;
146 + } else if (rootNode.getName().equals("syslog4")) {
147 + refNode1 = rootNode;
148 + } else {
149 + refNode2 = rootNode;
150 + }
151 + }
152 +
153 + // Check whether the data model tree returned is of type module.
154 + assertThat(selfNode instanceof YangModule, is(true));
155 +
156 + // Check whether the node type is set properly to module.
157 + assertThat(selfNode.getNodeType(), is(MODULE_NODE));
158 +
159 + // Check whether the module name is set correctly.
160 + YangModule yangNode = (YangModule) selfNode;
161 + assertThat(yangNode.getName(), is("syslog3"));
162 +
163 + ListIterator<YangFeature> featureIterator = yangNode.getFeatureList().listIterator();
164 + YangFeature feature = featureIterator.next();
165 + assertThat(feature.getName(), is("frr-te"));
166 +
167 + YangIfFeature ifFeature = feature.getIfFeatureList().iterator().next();
168 + assertThat(ifFeature.getName().getName(), is("p2mp-te"));
169 + assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
170 +
171 + YangContainer container = (YangContainer) selfNode.getChild();
172 + assertThat(container.getName(), is("speed"));
173 + YangLeaf leaf = container.getListOfLeaf().iterator().next();
174 + assertThat(leaf.getName(), is("local-storage-limit"));
175 +
176 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
177 + ifFeature = ifFeatureList.iterator().next();
178 + assertThat(ifFeature.getName().getName(), is("frr-te"));
179 + assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
180 + }
181 +
182 + /**
183 + * Checks inter file feature linking with imported file with dependency.
184 + */
185 + @Test
186 + public void processFeatureInImportedFileWithDependency()
187 + throws IOException, ParserException, MojoExecutionException {
188 +
189 + String searchDir = "src/test/resources/interfilefeatureimportdependency";
190 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
191 + utilManager.parseYangFileInfoSet();
192 + utilManager.createYangNodeSet();
193 +
194 + YangNode selfNode = null;
195 + YangNode refNode1 = null;
196 + YangNode refNode2 = null;
197 +
198 + // Create YANG node set
199 + yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
200 +
201 + // Add references to import list.
202 + yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
203 +
204 + // Carry out inter-file linking.
205 + yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
206 +
207 + for (YangNode rootNode : utilManager.getYangNodeSet()) {
208 + if (rootNode.getName().equals("syslog1")) {
209 + selfNode = rootNode;
210 + } else if (rootNode.getName().equals("syslog2")) {
211 + refNode1 = rootNode;
212 + } else {
213 + refNode2 = rootNode;
214 + }
215 + }
216 +
217 + // Check whether the data model tree returned is of type module.
218 + assertThat(selfNode instanceof YangModule, is(true));
219 +
220 + // Check whether the node type is set properly to module.
221 + assertThat(selfNode.getNodeType(), is(MODULE_NODE));
222 +
223 + // Check whether the module name is set correctly.
224 + YangModule yangNode = (YangModule) selfNode;
225 + assertThat(yangNode.getName(), is("syslog1"));
226 +
227 + ListIterator<YangFeature> featureIterator = yangNode.getFeatureList().listIterator();
228 + YangFeature feature = featureIterator.next();
229 + assertThat(feature.getName(), is("frr-te"));
230 +
231 + YangIfFeature ifFeature = feature.getIfFeatureList().iterator().next();
232 + assertThat(ifFeature.getName().getName(), is("p2mp-te"));
233 + assertThat(ifFeature.getName().getPrefix(), is("sys2"));
234 + assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
235 +
236 + YangContainer container = (YangContainer) selfNode.getChild();
237 + assertThat(container.getName(), is("speed"));
238 + YangLeaf leaf = container.getListOfLeaf().iterator().next();
239 + assertThat(leaf.getName(), is("local-storage-limit"));
240 +
241 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
242 + ifFeature = ifFeatureList.iterator().next();
243 + assertThat(ifFeature.getName().getName(), is("frr-te"));
244 + assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
245 + }
246 +
247 + /**
248 + * Checks inter file feature linking with included file with dependency.
249 + */
250 + @Test
251 + public void processFeatureInIncludedFileWithDependency()
252 + throws IOException, ParserException, MojoExecutionException {
253 +
254 + String searchDir = "src/test/resources/interfilefeatureincludedependency";
255 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
256 + utilManager.parseYangFileInfoSet();
257 + utilManager.createYangNodeSet();
258 +
259 + YangNode selfNode = null;
260 + YangNode refNode1 = null;
261 + YangNode refNode2 = null;
262 +
263 + // Create YANG node set
264 + yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
265 +
266 + // Carry out linking of sub module with module.
267 + yangLinkerManager.linkSubModulesToParentModule(utilManager.getYangNodeSet());
268 +
269 + // Add references to include list.
270 + yangLinkerManager.addRefToYangFilesIncludeList(utilManager.getYangNodeSet());
271 +
272 + // Add references to import list.
273 + yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
274 +
275 + // Carry out inter-file linking.
276 + yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
277 +
278 + for (YangNode rootNode : utilManager.getYangNodeSet()) {
279 + if (rootNode.getName().equals("syslog1")) {
280 + selfNode = rootNode;
281 + } else if (rootNode.getName().equals("syslog2")) {
282 + refNode1 = rootNode;
283 + } else {
284 + refNode2 = rootNode;
285 + }
286 + }
287 +
288 + // Check whether the data model tree returned is of type module.
289 + assertThat(selfNode instanceof YangModule, is(true));
290 +
291 + // Check whether the node type is set properly to module.
292 + assertThat(selfNode.getNodeType(), is(MODULE_NODE));
293 +
294 + // Check whether the module name is set correctly.
295 + YangModule yangNode = (YangModule) selfNode;
296 + assertThat(yangNode.getName(), is("syslog1"));
297 +
298 + ListIterator<YangFeature> featureIterator = yangNode.getFeatureList().listIterator();
299 + YangFeature feature = featureIterator.next();
300 + assertThat(feature.getName(), is("frr-te"));
301 +
302 + YangIfFeature ifFeature = feature.getIfFeatureList().iterator().next();
303 + assertThat(ifFeature.getName().getName(), is("p2mp-te"));
304 + assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
305 +
306 + YangContainer container = (YangContainer) selfNode.getChild();
307 + assertThat(container.getName(), is("speed"));
308 + YangLeaf leaf = container.getListOfLeaf().iterator().next();
309 + assertThat(leaf.getName(), is("local-storage-limit"));
310 +
311 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
312 + ifFeature = ifFeatureList.iterator().next();
313 + assertThat(ifFeature.getName().getName(), is("frr-te"));
314 + assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
315 + }
316 +
317 + /**
318 + * Checks inter file feature linking with imported file with dependency
319 + * feature undefined.
320 + */
321 + @Test
322 + public void processFeatureInImportedFileWithDependencyUndefined()
323 + throws IOException, ParserException, MojoExecutionException {
324 +
325 + String searchDir = "src/test/resources/interfilefeatureimportdependencyUndefined";
326 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
327 + utilManager.parseYangFileInfoSet();
328 + utilManager.createYangNodeSet();
329 +
330 + YangNode selfNode = null;
331 + YangNode refNode1 = null;
332 + YangNode refNode2 = null;
333 +
334 + // Create YANG node set
335 + yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
336 +
337 + // Add references to import list.
338 + yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
339 +
340 + // Carry out inter-file linking.
341 + yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
342 +
343 + for (YangNode rootNode : utilManager.getYangNodeSet()) {
344 + if (rootNode.getName().equals("syslog1")) {
345 + selfNode = rootNode;
346 + } else if (rootNode.getName().equals("syslog2")) {
347 + refNode1 = rootNode;
348 + } else {
349 + refNode2 = rootNode;
350 + }
351 + }
352 +
353 + // Check whether the data model tree returned is of type module.
354 + assertThat(selfNode instanceof YangModule, is(true));
355 +
356 + // Check whether the node type is set properly to module.
357 + assertThat(selfNode.getNodeType(), is(MODULE_NODE));
358 +
359 + // Check whether the module name is set correctly.
360 + YangModule yangNode = (YangModule) selfNode;
361 + assertThat(yangNode.getName(), is("syslog1"));
362 +
363 + ListIterator<YangFeature> featureIterator = yangNode.getFeatureList().listIterator();
364 + YangFeature feature = featureIterator.next();
365 + assertThat(feature.getName(), is("frr-te"));
366 +
367 + YangIfFeature ifFeature = feature.getIfFeatureList().iterator().next();
368 + assertThat(ifFeature.getName().getName(), is("p2mp-te"));
369 + assertThat(ifFeature.getName().getPrefix(), is("sys2"));
370 + assertThat(ifFeature.getResolvableStatus(), is(INTRA_FILE_RESOLVED));
371 +
372 + YangContainer container = (YangContainer) selfNode.getChild();
373 + assertThat(container.getName(), is("speed"));
374 + YangLeaf leaf = container.getListOfLeaf().iterator().next();
375 + assertThat(leaf.getName(), is("local-storage-limit"));
376 +
377 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
378 + ifFeature = ifFeatureList.iterator().next();
379 + assertThat(ifFeature.getName().getName(), is("frr-te"));
380 + assertThat(ifFeature.getResolvableStatus(), is(INTRA_FILE_RESOLVED));
381 + }
382 +
383 + /**
384 + * Checks inter file feature linking with included file with dependency
385 + * feature undefined.
386 + */
387 + @Test
388 + public void processFeatureInIncludedFileWithDependencyUndefined()
389 + throws IOException, ParserException, MojoExecutionException {
390 +
391 + String searchDir = "src/test/resources/interfilefeatureincludedependencyUndefined";
392 + utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
393 + utilManager.parseYangFileInfoSet();
394 + utilManager.createYangNodeSet();
395 +
396 + YangNode selfNode = null;
397 + YangNode refNode1 = null;
398 + YangNode refNode2 = null;
399 +
400 + // Create YANG node set
401 + yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
402 +
403 + // Carry out linking of sub module with module.
404 + yangLinkerManager.linkSubModulesToParentModule(utilManager.getYangNodeSet());
405 +
406 + // Add references to import list.
407 + yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
408 +
409 + // Add references to include list.
410 + yangLinkerManager.addRefToYangFilesIncludeList(utilManager.getYangNodeSet());
411 +
412 + // Carry out inter-file linking.
413 + yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
414 +
415 + for (YangNode rootNode : utilManager.getYangNodeSet()) {
416 + if (rootNode.getName().equals("syslog1")) {
417 + selfNode = rootNode;
418 + } else if (rootNode.getName().equals("syslog2")) {
419 + refNode1 = rootNode;
420 + } else {
421 + refNode2 = rootNode;
422 + }
423 + }
424 +
425 + // Check whether the data model tree returned is of type module.
426 + assertThat(selfNode instanceof YangModule, is(true));
427 +
428 + // Check whether the node type is set properly to module.
429 + assertThat(selfNode.getNodeType(), is(MODULE_NODE));
430 +
431 + // Check whether the module name is set correctly.
432 + YangModule yangNode = (YangModule) selfNode;
433 + assertThat(yangNode.getName(), is("syslog1"));
434 +
435 + ListIterator<YangFeature> featureIterator = yangNode.getFeatureList().listIterator();
436 + YangFeature feature = featureIterator.next();
437 + assertThat(feature.getName(), is("frr-te"));
438 +
439 + YangIfFeature ifFeature = feature.getIfFeatureList().iterator().next();
440 + assertThat(ifFeature.getName().getName(), is("p2mp-te"));
441 + assertThat(ifFeature.getResolvableStatus(), is(INTRA_FILE_RESOLVED));
442 +
443 + YangContainer container = (YangContainer) selfNode.getChild();
444 + assertThat(container.getName(), is("speed"));
445 + YangLeaf leaf = container.getListOfLeaf().iterator().next();
446 + assertThat(leaf.getName(), is("local-storage-limit"));
447 +
448 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
449 + ifFeature = ifFeatureList.iterator().next();
450 + assertThat(ifFeature.getName().getName(), is("frr-te"));
451 + assertThat(ifFeature.getResolvableStatus(), is(INTRA_FILE_RESOLVED));
452 + }
453 +}
454 +
1 +/*
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 +
17 +package org.onosproject.yangutils.plugin.manager;
18 +
19 +import java.io.IOException;
20 +import java.util.List;
21 +import org.junit.Test;
22 +import org.onosproject.yangutils.datamodel.YangContainer;
23 +import org.onosproject.yangutils.datamodel.YangFeature;
24 +import org.onosproject.yangutils.datamodel.YangIfFeature;
25 +import org.onosproject.yangutils.datamodel.YangLeaf;
26 +import org.onosproject.yangutils.datamodel.YangModule;
27 +import org.onosproject.yangutils.datamodel.YangNode;
28 +import org.onosproject.yangutils.datamodel.YangNodeType;
29 +import org.onosproject.yangutils.datamodel.YangSubModule;
30 +import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
31 +import org.onosproject.yangutils.parser.exceptions.ParserException;
32 +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
33 +
34 +import static org.hamcrest.MatcherAssert.assertThat;
35 +import static org.hamcrest.core.Is.is;
36 +
37 +/**
38 + * Test cases for testing if-feature intra file linking.
39 + */
40 +public class IntraFileIfFeatureLinkingTest {
41 +
42 + private final YangUtilsParserManager manager = new YangUtilsParserManager();
43 +
44 + /**
45 + * Checks self resolution when feature defined in same file.
46 + */
47 + @Test
48 + public void processSelfFileLinkingWithFeature()
49 + throws IOException, ParserException {
50 +
51 + YangNode node = manager
52 + .getDataModel("src/test/resources/SelfFileLinkingWithFeature.yang");
53 +
54 + // Check whether the data model tree returned is of type module.
55 + assertThat((node instanceof YangModule), is(true));
56 +
57 + // Check whether the node type is set properly to module.
58 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
59 +
60 + // Check whether the module name is set correctly.
61 + YangModule yangNode = (YangModule) node;
62 + assertThat(yangNode.getName(), is("syslog"));
63 +
64 + List<YangFeature> featureList = yangNode.getFeatureList();
65 + YangFeature feature = featureList.iterator().next();
66 + assertThat(feature.getName(), is("local-storage"));
67 +
68 + YangContainer container = (YangContainer) yangNode.getChild();
69 + assertThat(container.getName(), is("speed"));
70 +
71 + List<YangLeaf> listOfLeaf = container.getListOfLeaf();
72 + YangLeaf leaf = listOfLeaf.iterator().next();
73 + assertThat(leaf.getName(), is("local-storage-limit"));
74 +
75 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
76 + YangIfFeature ifFeature = ifFeatureList.iterator().next();
77 + assertThat(ifFeature.getName().getName(), is("local-storage"));
78 + assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
79 + }
80 +
81 + /**
82 + * Checks self resolution when feature is undefined.
83 + */
84 + @Test
85 + public void processSelfFileLinkingWithFeatureUndefined()
86 + throws IOException, ParserException {
87 +
88 + YangNode node = manager
89 + .getDataModel("src/test/resources/SelfFileLinkingWithFeatureUndefined.yang");
90 +
91 + // Check whether the data model tree returned is of type module.
92 + assertThat((node instanceof YangModule), is(true));
93 +
94 + // Check whether the node type is set properly to module.
95 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
96 +
97 + // Check whether the module name is set correctly.
98 + YangModule yangNode = (YangModule) node;
99 + assertThat(yangNode.getName(), is("syslog"));
100 +
101 + YangContainer container = (YangContainer) yangNode.getChild();
102 + assertThat(container.getName(), is("speed"));
103 +
104 + List<YangLeaf> listOfLeaf = container.getListOfLeaf();
105 + YangLeaf leaf = listOfLeaf.iterator().next();
106 + assertThat(leaf.getName(), is("local-storage-limit"));
107 +
108 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
109 + YangIfFeature ifFeature = ifFeatureList.iterator().next();
110 + assertThat(ifFeature.getName().getName(), is("local-storage"));
111 + assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.INTRA_FILE_RESOLVED));
112 + }
113 +
114 + /**
115 + * Checks self resolution of feature with multiple dependency.
116 + */
117 + @Test
118 + public void processSelfFileLinkingWithMultipleDependency() throws IOException, ParserException {
119 + YangNode node = manager
120 + .getDataModel("src/test/resources/SelfFileLinkingWithMultipleDependency.yang");
121 +
122 + // Check whether the data model tree returned is of type module.
123 + assertThat((node instanceof YangModule), is(true));
124 +
125 + // Check whether the node type is set properly to module.
126 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
127 +
128 + // Check whether the module name is set correctly.
129 + YangModule yangNode = (YangModule) node;
130 + assertThat(yangNode.getName(), is("syslog"));
131 +
132 + List<YangFeature> featureList = yangNode.getFeatureList();
133 + YangFeature feature = featureList.iterator().next();
134 + assertThat(feature.getName(), is("p2mp-te"));
135 +
136 + YangContainer container = (YangContainer) yangNode.getChild();
137 + assertThat(container.getName(), is("speed"));
138 +
139 + List<YangLeaf> listOfLeaf = container.getListOfLeaf();
140 + YangLeaf leaf = listOfLeaf.iterator().next();
141 + assertThat(leaf.getName(), is("local-storage-limit"));
142 +
143 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
144 + YangIfFeature ifFeature = ifFeatureList.iterator().next();
145 + assertThat(ifFeature.getName().getName(), is("frr-te"));
146 + assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
147 + }
148 +
149 + /**
150 + * Checks self resolution of feature with multiple dependency undefined.
151 + */
152 + @Test
153 + public void processSelfFileLinkingWithMultipleDependencyUnresolved() throws IOException, ParserException {
154 + YangNode node = manager
155 + .getDataModel("src/test/resources/SelfFileLinkingWithMultipleDependencyUnresolved.yang");
156 +
157 + // Check whether the data model tree returned is of type module.
158 + assertThat((node instanceof YangModule), is(true));
159 +
160 + // Check whether the node type is set properly to module.
161 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
162 +
163 + // Check whether the module name is set correctly.
164 + YangModule yangNode = (YangModule) node;
165 + assertThat(yangNode.getName(), is("syslog"));
166 +
167 + List<YangFeature> featureList = yangNode.getFeatureList();
168 + YangFeature feature = featureList.iterator().next();
169 + assertThat(feature.getName(), is("frr-te"));
170 +
171 + YangContainer container = (YangContainer) yangNode.getChild();
172 + assertThat(container.getName(), is("speed"));
173 +
174 + List<YangLeaf> listOfLeaf = container.getListOfLeaf();
175 + YangLeaf leaf = listOfLeaf.iterator().next();
176 + assertThat(leaf.getName(), is("local-storage-limit"));
177 +
178 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
179 + YangIfFeature ifFeature = ifFeatureList.iterator().next();
180 + assertThat(ifFeature.getName().getName(), is("frr-te"));
181 + assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.INTRA_FILE_RESOLVED));
182 + }
183 +
184 + /**
185 + * Checks self resolution when feature is defined in same file in submodule.
186 + */
187 + @Test
188 + public void processSelfFileLinkingWithFeatureInSubModule()
189 + throws IOException, ParserException {
190 +
191 + YangNode node = manager
192 + .getDataModel("src/test/resources/SelfFileLinkingWithFeatureInSubModule.yang");
193 +
194 + // Check whether the data model tree returned is of type module.
195 + assertThat((node instanceof YangSubModule), is(true));
196 +
197 + // Check whether the node type is set properly to module.
198 + assertThat(node.getNodeType(), is(YangNodeType.SUB_MODULE_NODE));
199 +
200 + // Check whether the module name is set correctly.
201 + YangSubModule yangNode = (YangSubModule) node;
202 + assertThat(yangNode.getName(), is("syslog"));
203 +
204 + List<YangFeature> featureList = yangNode.getFeatureList();
205 + YangFeature feature = featureList.iterator().next();
206 + assertThat(feature.getName(), is("local-storage"));
207 +
208 + YangContainer container = (YangContainer) yangNode.getChild();
209 + assertThat(container.getName(), is("speed"));
210 +
211 + List<YangLeaf> listOfLeaf = container.getListOfLeaf();
212 + YangLeaf leaf = listOfLeaf.iterator().next();
213 + assertThat(leaf.getName(), is("local-storage-limit"));
214 +
215 + List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
216 + YangIfFeature ifFeature = ifFeatureList.iterator().next();
217 + assertThat(ifFeature.getName().getName(), is("local-storage"));
218 + assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
219 + }
220 +}
...@@ -20,6 +20,9 @@ import java.io.File; ...@@ -20,6 +20,9 @@ import java.io.File;
20 import java.io.IOException; 20 import java.io.IOException;
21 import java.lang.reflect.Constructor; 21 import java.lang.reflect.Constructor;
22 import java.lang.reflect.InvocationTargetException; 22 import java.lang.reflect.InvocationTargetException;
23 +import java.text.ParseException;
24 +import java.text.SimpleDateFormat;
25 +import java.util.Date;
23 import org.junit.Rule; 26 import org.junit.Rule;
24 import org.junit.Test; 27 import org.junit.Test;
25 import org.junit.rules.ExpectedException; 28 import org.junit.rules.ExpectedException;
...@@ -104,6 +107,8 @@ public final class JavaIdentifierSyntaxTest { ...@@ -104,6 +107,8 @@ public final class JavaIdentifierSyntaxTest {
104 private static final String WITH_SMALL = "test_this"; 107 private static final String WITH_SMALL = "test_this";
105 private static final String WITH_CAMEL_CASE_WITH_PREFIX = "123addPrefixTry"; 108 private static final String WITH_CAMEL_CASE_WITH_PREFIX = "123addPrefixTry";
106 private static final String WITH_CAMEL_CASE_WITH_PREFIX1 = "abc1234567890Ss1123G123Gaa"; 109 private static final String WITH_CAMEL_CASE_WITH_PREFIX1 = "abc1234567890Ss1123G123Gaa";
110 + private static final String DATE_FORMAT = "yyyy-MM-dd";
111 + private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT);
107 private static YangToJavaNamingConflictUtil conflictResolver = new YangToJavaNamingConflictUtil(); 112 private static YangToJavaNamingConflictUtil conflictResolver = new YangToJavaNamingConflictUtil();
108 private static final String BASE_DIR_PKG = "target.UnitTestCase."; 113 private static final String BASE_DIR_PKG = "target.UnitTestCase.";
109 private static final String DIR_PATH = "exist1.exist2.exist3"; 114 private static final String DIR_PATH = "exist1.exist2.exist3";
...@@ -140,9 +145,10 @@ public final class JavaIdentifierSyntaxTest { ...@@ -140,9 +145,10 @@ public final class JavaIdentifierSyntaxTest {
140 * Unit test for root package generation with revision complexity. 145 * Unit test for root package generation with revision complexity.
141 */ 146 */
142 @Test 147 @Test
143 - public void getRootPackageTest() { 148 + public void getRootPackageTest() throws ParseException {
144 conflictResolver.setPrefixForIdentifier(null); 149 conflictResolver.setPrefixForIdentifier(null);
145 - String rootPackage = getRootPackage((byte) 1, CHILD_PACKAGE, DATE1, conflictResolver); 150 + Date date = simpleDateFormat.parse(DATE1);
151 + String rootPackage = getRootPackage((byte) 1, CHILD_PACKAGE, date, conflictResolver);
146 assertThat(rootPackage.equals(DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER 152 assertThat(rootPackage.equals(DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER
147 + PERIOD + CHILD_WITH_PERIOD + PERIOD + DATE_WITH_REV1), is(true)); 153 + PERIOD + CHILD_WITH_PERIOD + PERIOD + DATE_WITH_REV1), is(true));
148 } 154 }
...@@ -151,31 +157,34 @@ public final class JavaIdentifierSyntaxTest { ...@@ -151,31 +157,34 @@ public final class JavaIdentifierSyntaxTest {
151 * Unit test for root package generation with invalid prefix. 157 * Unit test for root package generation with invalid prefix.
152 */ 158 */
153 @Test 159 @Test
154 - public void getRootPackageWithInvalidPrefix() throws TranslatorException { 160 + public void getRootPackageWithInvalidPrefix() throws TranslatorException, ParseException {
155 thrown.expect(TranslatorException.class); 161 thrown.expect(TranslatorException.class);
156 thrown.expectMessage("The given prefix in pom.xml is invalid."); 162 thrown.expectMessage("The given prefix in pom.xml is invalid.");
157 conflictResolver.setPrefixForIdentifier(INVALID_PREFIX); 163 conflictResolver.setPrefixForIdentifier(INVALID_PREFIX);
158 - String rootPackage1 = getRootPackage((byte) 1, INVALID_NAME_SPACE_FOR_INVALID_PREFIX, DATE1, conflictResolver); 164 + Date date = simpleDateFormat.parse(DATE1);
165 + String rootPackage1 = getRootPackage((byte) 1, INVALID_NAME_SPACE_FOR_INVALID_PREFIX, date,
166 + conflictResolver);
159 } 167 }
160 168
161 /** 169 /**
162 * Unit test for root package generation with special characters presence. 170 * Unit test for root package generation with special characters presence.
163 */ 171 */
164 @Test 172 @Test
165 - public void getRootPackageWithSpecialCharactersTest() { 173 + public void getRootPackageWithSpecialCharactersTest() throws ParseException {
166 conflictResolver.setPrefixForIdentifier(VALID_PREFIX); 174 conflictResolver.setPrefixForIdentifier(VALID_PREFIX);
167 - String rootPackage = getRootPackage((byte) 1, INVALID_NAME_SPACE1, DATE1, conflictResolver); 175 + Date date = simpleDateFormat.parse(DATE1);
176 + String rootPackage = getRootPackage((byte) 1, INVALID_NAME_SPACE1, date, conflictResolver);
168 assertThat(rootPackage.equals(DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER 177 assertThat(rootPackage.equals(DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER
169 + PERIOD + VALID_NAME_SPACE1 + PERIOD + DATE_WITH_REV1), is(true)); 178 + PERIOD + VALID_NAME_SPACE1 + PERIOD + DATE_WITH_REV1), is(true));
170 conflictResolver.setPrefixForIdentifier(null); 179 conflictResolver.setPrefixForIdentifier(null);
171 - String rootPackage1 = getRootPackage((byte) 1, INVALID_NAME_SPACE2, DATE1, conflictResolver); 180 + String rootPackage1 = getRootPackage((byte) 1, INVALID_NAME_SPACE2, date, conflictResolver);
172 assertThat(rootPackage1.equals(DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER 181 assertThat(rootPackage1.equals(DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER
173 + PERIOD + VALID_NAME_SPACE2 + PERIOD + DATE_WITH_REV1), is(true)); 182 + PERIOD + VALID_NAME_SPACE2 + PERIOD + DATE_WITH_REV1), is(true));
174 - String rootPackage2 = getRootPackage((byte) 1, INVALID_NAME_SPACE3, DATE1, conflictResolver); 183 + String rootPackage2 = getRootPackage((byte) 1, INVALID_NAME_SPACE3, date, conflictResolver);
175 assertThat(rootPackage2.equals(DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER 184 assertThat(rootPackage2.equals(DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER
176 + PERIOD + VALID_NAME_SPACE4 + PERIOD + DATE_WITH_REV1), is(true)); 185 + PERIOD + VALID_NAME_SPACE4 + PERIOD + DATE_WITH_REV1), is(true));
177 conflictResolver.setPrefixForIdentifier(INVALID_PREFIX1); 186 conflictResolver.setPrefixForIdentifier(INVALID_PREFIX1);
178 - String rootPackage3 = getRootPackage((byte) 1, INVALID_NAME_SPACE2, DATE1, conflictResolver); 187 + String rootPackage3 = getRootPackage((byte) 1, INVALID_NAME_SPACE2, date, conflictResolver);
179 assertThat(rootPackage3.equals(DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER 188 assertThat(rootPackage3.equals(DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER
180 + PERIOD + VALID_NAME_SPACE3 + PERIOD + DATE_WITH_REV1), is(true)); 189 + PERIOD + VALID_NAME_SPACE3 + PERIOD + DATE_WITH_REV1), is(true));
181 190
...@@ -185,8 +194,9 @@ public final class JavaIdentifierSyntaxTest { ...@@ -185,8 +194,9 @@ public final class JavaIdentifierSyntaxTest {
185 * Unit test for root package generation without complexity in revision. 194 * Unit test for root package generation without complexity in revision.
186 */ 195 */
187 @Test 196 @Test
188 - public void getRootPackageWithRevTest() { 197 + public void getRootPackageWithRevTest() throws ParseException {
189 - String rootPkgWithRev = getRootPackage((byte) 1, CHILD_PACKAGE, DATE2, null); 198 + Date date = simpleDateFormat.parse(DATE2);
199 + String rootPkgWithRev = getRootPackage((byte) 1, CHILD_PACKAGE, date, null);
190 assertThat(rootPkgWithRev.equals( 200 assertThat(rootPkgWithRev.equals(
191 DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER + PERIOD + CHILD_WITH_PERIOD + PERIOD + DATE_WITH_REV2), 201 DEFAULT_BASE_PKG + PERIOD + VERSION_NUMBER + PERIOD + CHILD_WITH_PERIOD + PERIOD + DATE_WITH_REV2),
192 is(true)); 202 is(true));
......
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container interface {
6 + leaf ifType {
7 + type enumeration {
8 + enum ethernet;
9 + enum atm;
10 + }
11 + }
12 + leaf ifMTU {
13 + type uint32;
14 + }
15 + must "ifType != 'ethernet' or " +
16 + "(ifType = 'ethernet' and ifMTU = 1500)" {
17 + description "An ethernet MTU must be 1500";
18 + }
19 + must "ifType != 'atm' or " +
20 + "(ifType = 'atm' and ifMTU <= 17966 and ifMTU >= 64)" {
21 + description "An atm MTU must be 64 .. 17966";
22 + }
23 + }
24 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + list interface-switching-capability {
6 + key "switching-capability";
7 + description
8 + "List of Interface Switching Capabilities Descriptors (ISCD)
9 + for this link.";
10 + reference
11 + "RFC3471: Generalized Multi-Protocol Label Switching (GMPLS)
12 + Signaling Functional Description.
13 + RFC4203: OSPF Extensions in Support of Generalized
14 + Multi-Protocol Label Switching (GMPLS).";
15 + leaf switching-capability {
16 + type string;
17 + description
18 + "Switching Capability for this interface.";
19 + }
20 + }
21 + container time-division-multiplex-capable {
22 + when "../switching-capability = 'TDM'" {
23 + description "Valid only for TDM";
24 + }
25 + description
26 + "Interface has time-division multiplex capabilities.";
27 +
28 + leaf minimum-lsp-bandwidth {
29 + type decimal64;
30 + }
31 + }
32 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + leaf ifType {
6 + type enumeration {
7 + enum ethernet;
8 + enum atm;
9 + }
10 + must "ifType != 'ethernet'" {
11 + description "ifType is not ethernet";
12 + }
13 + }
14 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + leaf ifType {
6 + when "ifType != 'ethernet'" {
7 + description "ifType is not ethernet";
8 + }
9 + type enumeration {
10 + enum ethernet;
11 + enum atm;
12 + }
13 + }
14 +}
1 +module Test {
2 + yang-version 1;
3 + namespace urn:ietf:params:xml:ns:yang:ietf-ospf;
4 + prefix test;
5 +
6 + revision 2013-07-15 {
7 + description
8 + "This revision adds the following new data types:
9 + - yang-identifier
10 + - hex-string
11 + - uuid
12 + - dotted-quad";
13 + reference
14 + "RFC 6991: Common YANG Data Types";
15 + }
16 + revision 2013-07-14 {
17 + description
18 + "This revision adds the following new data types:
19 + - yang-identifier
20 + - hex-string
21 + - uuid
22 + - dotted-quad";
23 + reference
24 + "RFC 6991: Common YANG Data Types";
25 + }
26 +}
1 +module syslog {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix "sys";
5 + feature local-storage {
6 + description
7 + "This feature means the device supports local
8 + storage (memory, flash or disk) that can be used to
9 + store syslog messages.";
10 + }
11 +
12 + container speed {
13 + leaf local-storage-limit {
14 + if-feature local-storage;
15 + type uint64;
16 + units "kilobyte";
17 + config false;
18 + description
19 + "The amount of local storage that can be
20 + used to hold syslog messages.";
21 + }
22 + }
23 +}
1 +submodule syslog {
2 + yang-version 1;
3 + belongs-to "syslog1" {
4 + prefix "sys";
5 + }
6 + feature local-storage {
7 + description
8 + "This feature means the device supports local
9 + storage (memory, flash or disk) that can be used to
10 + store syslog messages.";
11 + }
12 +
13 + container speed {
14 + leaf local-storage-limit {
15 + if-feature local-storage;
16 + type uint64;
17 + units "kilobyte";
18 + config false;
19 + description
20 + "The amount of local storage that can be
21 + used to hold syslog messages.";
22 + }
23 + }
24 +}
1 +module syslog {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix "sys";
5 +
6 + container speed {
7 + leaf local-storage-limit {
8 + if-feature local-storage;
9 + type uint64;
10 + units "kilobyte";
11 + config false;
12 + description
13 + "The amount of local storage that can be
14 + used to hold syslog messages.";
15 + }
16 + }
17 +}
1 +module syslog {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix "sys";
5 +
6 + feature p2mp-te {
7 + description "Indicates support for P2MP-TE";
8 + }
9 +
10 + feature frr-te {
11 + description "Indicates support for TE FastReroute (FRR)";
12 + if-feature p2mp-te;
13 + }
14 +
15 + container speed {
16 + leaf local-storage-limit {
17 + if-feature frr-te;
18 + type uint64;
19 + units "kilobyte";
20 + config false;
21 + description
22 + "The amount of local storage that can be
23 + used to hold syslog messages.";
24 + }
25 + }
26 +}
1 +module syslog {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix "sys";
5 +
6 + feature frr-te {
7 + description "Indicates support for TE FastReroute (FRR)";
8 + if-feature p2mp-te;
9 + }
10 +
11 + container speed {
12 + leaf local-storage-limit {
13 + if-feature frr-te;
14 + type uint64;
15 + units "kilobyte";
16 + config false;
17 + description
18 + "The amount of local storage that can be
19 + used to hold syslog messages.";
20 + }
21 + }
22 +}
1 +module syslog {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix "sys";
5 +
6 + feature p2mp-te {
7 + description "Indicates support for P2MP-TE";
8 + }
9 +
10 + feature frr-te {
11 + description "Indicates support for TE FastReroute (FRR)";
12 + if-feature p2mp-te;
13 + }
14 +
15 + container speed {
16 + leaf local-storage-limit {
17 + if-feature local-storage;
18 + type uint64;
19 + units "kilobyte";
20 + config false;
21 + description
22 + "The amount of local storage that can be
23 + used to hold syslog messages.";
24 + }
25 + }
26 +}
1 +module syslog1 {
2 + yang-version 1;
3 + namespace "http://huawei1.com";
4 + prefix "sys1";
5 +
6 + import "syslog2" {
7 + prefix "sys2";
8 + }
9 +
10 + feature frr-te {
11 + description "Indicates support for TE FastReroute (FRR)";
12 + if-feature "sys2:p2mp-te";
13 + }
14 +
15 + container speed {
16 + leaf local-storage-limit {
17 + if-feature frr-te;
18 + type uint64;
19 + units "kilobyte";
20 + config false;
21 + description
22 + "The amount of local storage that can be
23 + used to hold syslog messages.";
24 + }
25 + }
26 +}
1 +module syslog2 {
2 + yang-version 1;
3 + namespace "http://huawei2.com";
4 + prefix "sys2";
5 +
6 + feature p2mp-te {
7 + description "Indicates support for P2MP-TE";
8 + }
9 +}
1 +module syslog1 {
2 + yang-version 1;
3 + namespace "http://huawei1.com";
4 + prefix "sys1";
5 +
6 + import "syslog2" {
7 + prefix "sys2";
8 + }
9 +
10 + feature frr-te {
11 + description "Indicates support for TE FastReroute (FRR)";
12 + if-feature "sys2:p2mp-te";
13 + }
14 +
15 + container speed {
16 + leaf local-storage-limit {
17 + if-feature frr-te;
18 + type uint64;
19 + units "kilobyte";
20 + config false;
21 + description
22 + "The amount of local storage that can be
23 + used to hold syslog messages.";
24 + }
25 + }
26 +}
1 +module syslog2 {
2 + yang-version 1;
3 + namespace "http://huawei2.com";
4 + prefix "sys2";
5 +
6 + import "syslog3" {
7 + prefix "sys3";
8 + }
9 +
10 + feature p2mp-te {
11 + description "Indicates support for P2MP-TE";
12 + if-feature "sys3:extended-admin-groups";
13 + }
14 +}
1 +module syslog3 {
2 + yang-version 1;
3 + namespace "http://huawei3.com";
4 + prefix "sys3";
5 +
6 + feature extended-admin-groups {
7 + description
8 + "Indicates support for TE link extended admin
9 + groups.";
10 + }
11 +}
1 +module syslog1 {
2 + yang-version 1;
3 + namespace "http://huawei1.com";
4 + prefix "sys1";
5 +
6 + import "syslog2" {
7 + prefix "sys2";
8 + }
9 +
10 + feature frr-te {
11 + description "Indicates support for TE FastReroute (FRR)";
12 + if-feature "sys2:p2mp-te";
13 + }
14 +
15 + container speed {
16 + leaf local-storage-limit {
17 + if-feature frr-te;
18 + type uint64;
19 + units "kilobyte";
20 + config false;
21 + description
22 + "The amount of local storage that can be
23 + used to hold syslog messages.";
24 + }
25 + }
26 +}
1 +module syslog2 {
2 + yang-version 1;
3 + namespace "http://huawei2.com";
4 + prefix "sys2";
5 +
6 + import "syslog3" {
7 + prefix "sys3";
8 + }
9 +
10 + feature p2mp-te {
11 + description "Indicates support for P2MP-TE";
12 + if-feature "sys3:extended-admin-groups";
13 + }
14 +}
15 +
1 +module syslog3 {
2 + yang-version 1;
3 + namespace "http://huawei3.com";
4 + prefix "sys3";
5 +}
1 +module syslog3 {
2 + yang-version 1;
3 + namespace "http://huawei3.com";
4 + prefix "sys3";
5 +
6 + include "syslog4";
7 +
8 + feature frr-te {
9 + description "Indicates support for TE FastReroute (FRR)";
10 + if-feature "p2mp-te";
11 + }
12 +
13 + container speed {
14 + leaf local-storage-limit {
15 + if-feature frr-te;
16 + type uint64;
17 + units "kilobyte";
18 + config false;
19 + description
20 + "The amount of local storage that can be
21 + used to hold syslog messages.";
22 + }
23 + }
24 +}
1 +submodule syslog4 {
2 + yang-version 1;
3 + belongs-to "syslog3" {
4 + prefix "sys3";
5 + }
6 +
7 + feature p2mp-te {
8 + description "Indicates support for P2MP-TE";
9 + }
10 +}
1 +module syslog1 {
2 + yang-version 1;
3 + namespace "http://huawei3.com";
4 + prefix "sys1";
5 +
6 + include "syslog2";
7 +
8 + feature frr-te {
9 + description "Indicates support for TE FastReroute (FRR)";
10 + if-feature "p2mp-te";
11 + }
12 +
13 + container speed {
14 + leaf local-storage-limit {
15 + if-feature frr-te;
16 + type uint64;
17 + units "kilobyte";
18 + config false;
19 + description
20 + "The amount of local storage that can be
21 + used to hold syslog messages.";
22 + }
23 + }
24 +}
1 +submodule syslog2 {
2 + yang-version 1;
3 + belongs-to "syslog1" {
4 + prefix "sys1";
5 + }
6 +
7 + import "syslog3" {
8 + prefix "sys3";
9 + }
10 +
11 + feature p2mp-te {
12 + description "Indicates support for P2MP-TE";
13 + if-feature "sys3:extended-admin-groups";
14 + }
15 +}
16 +
1 +module syslog3 {
2 + yang-version 1;
3 + namespace "http://huawei3.com";
4 + prefix "sys3";
5 +
6 + feature extended-admin-groups {
7 + description
8 + "Indicates support for TE link extended admin
9 + groups.";
10 + }
11 +}
1 +module syslog1 {
2 + yang-version 1;
3 + namespace "http://huawei3.com";
4 + prefix "sys1";
5 +
6 + include "syslog2";
7 +
8 + feature frr-te {
9 + description "Indicates support for TE FastReroute (FRR)";
10 + if-feature "p2mp-te";
11 + }
12 +
13 + container speed {
14 + leaf local-storage-limit {
15 + if-feature frr-te;
16 + type uint64;
17 + units "kilobyte";
18 + config false;
19 + description
20 + "The amount of local storage that can be
21 + used to hold syslog messages.";
22 + }
23 + }
24 +}
1 +submodule syslog2 {
2 + yang-version 1;
3 + belongs-to "syslog1" {
4 + prefix "sys1";
5 + }
6 +
7 + import "syslog3" {
8 + prefix "sys3";
9 + }
10 +
11 + feature p2mp-te {
12 + description "Indicates support for P2MP-TE";
13 + if-feature "sys3:extended-admin-groups";
14 + }
15 +}
16 +
1 +module syslog3 {
2 + yang-version 1;
3 + namespace "http://huawei3.com";
4 + prefix "sys3";
5 +}
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
68 * Features 68 * Features
69 */ 69 */
70 70
71 - /*feature configuration-schedule { 71 + feature configuration-schedule {
72 description 72 description
73 "This feature indicates that the system supports 73 "This feature indicates that the system supports
74 configuration scheduling."; 74 configuration scheduling.";
...@@ -91,7 +91,7 @@ ...@@ -91,7 +91,7 @@
91 description 91 description
92 "This feature indicates that the system supports 92 "This feature indicates that the system supports
93 template configuration."; 93 template configuration.";
94 - }*/ 94 + }
95 95
96 /* 96 /*
97 * Typedefs 97 * Typedefs
......
...@@ -257,7 +257,7 @@ ...@@ -257,7 +257,7 @@
257 }*/ 257 }*/
258 258
259 /* TE basic features */ 259 /* TE basic features */
260 - /*feature p2mp-te { 260 + feature p2mp-te {
261 description 261 description
262 "Indicates support for P2MP-TE"; 262 "Indicates support for P2MP-TE";
263 } 263 }
...@@ -291,7 +291,7 @@ ...@@ -291,7 +291,7 @@
291 feature named-path-constraints { 291 feature named-path-constraints {
292 description 292 description
293 "Indicates support for named path constraints"; 293 "Indicates support for named path constraints";
294 - }*/ 294 + }
295 295
296 grouping explicit-route-subobject { 296 grouping explicit-route-subobject {
297 description 297 description
......