Vidyashree Rama
Committed by Gerrit Code Review

[ONOS-4762][ONOS-4601]Grammar for meta data + Union defect fix

Change-Id: I8f78127e5b292cca6a79b32d496c2602c9105acd
Showing 21 changed files with 156 additions and 162 deletions
...@@ -1376,6 +1376,99 @@ public class TreeWalkListener implements GeneratedYangListener { ...@@ -1376,6 +1376,99 @@ public class TreeWalkListener implements GeneratedYangListener {
1376 } 1376 }
1377 1377
1378 @Override 1378 @Override
1379 + public void enterCompilerAnnotationStatement(GeneratedYangParser.CompilerAnnotationStatementContext ctx) {
1380 + // TODO: implement the method.
1381 + }
1382 +
1383 + @Override
1384 + public void exitCompilerAnnotationStatement(GeneratedYangParser.CompilerAnnotationStatementContext ctx) {
1385 + // TODO: implement the method.
1386 + }
1387 +
1388 + @Override
1389 + public void enterAnnotationStatement(GeneratedYangParser.AnnotationStatementContext ctx) {
1390 + // TODO: implement the method.
1391 + }
1392 +
1393 + @Override
1394 + public void exitAnnotationStatement(GeneratedYangParser.AnnotationStatementContext ctx) {
1395 + // TODO: implement the method.
1396 + }
1397 +
1398 + @Override
1399 + public void enterAnnotationType(GeneratedYangParser.AnnotationTypeContext ctx) {
1400 + // TODO: implement the method.
1401 + }
1402 +
1403 + @Override
1404 + public void exitAnnotationType(GeneratedYangParser.AnnotationTypeContext ctx) {
1405 + // TODO: implement the method.
1406 + }
1407 +
1408 + @Override
1409 + public void enterAnnotationParameterSpecification(GeneratedYangParser.AnnotationParameterSpecificationContext
1410 + ctx) {
1411 + // TODO: implement the method.
1412 + }
1413 +
1414 + @Override
1415 + public void exitAnnotationParameterSpecification(GeneratedYangParser.AnnotationParameterSpecificationContext ctx) {
1416 + // TODO: implement the method.
1417 + }
1418 +
1419 + @Override
1420 + public void enterAnnotationParameterSpecificationArg(GeneratedYangParser.AnnotationParameterSpecificationArgContext
1421 + ctx) {
1422 + // TODO: implement the method.
1423 + }
1424 +
1425 + @Override
1426 + public void exitAnnotationParameterSpecificationArg(GeneratedYangParser.AnnotationParameterSpecificationArgContext
1427 + ctx) {
1428 + // TODO: implement the method.
1429 + }
1430 +
1431 + @Override
1432 + public void enterAnnotationParaInstance(GeneratedYangParser.AnnotationParaInstanceContext ctx) {
1433 + // TODO: implement the method.
1434 + }
1435 +
1436 + @Override
1437 + public void exitAnnotationParaInstance(GeneratedYangParser.AnnotationParaInstanceContext ctx) {
1438 + // TODO: implement the method.
1439 + }
1440 +
1441 + @Override
1442 + public void enterAnnotationParaTypeIdentifier(GeneratedYangParser.AnnotationParaTypeIdentifierContext ctx) {
1443 + // TODO: implement the method.
1444 + }
1445 +
1446 + @Override
1447 + public void exitAnnotationParaTypeIdentifier(GeneratedYangParser.AnnotationParaTypeIdentifierContext ctx) {
1448 + // TODO: implement the method.
1449 + }
1450 +
1451 + @Override
1452 + public void enterAnnotationParaTypeValue(GeneratedYangParser.AnnotationParaTypeValueContext ctx) {
1453 + // TODO: implement the method.
1454 + }
1455 +
1456 + @Override
1457 + public void exitAnnotationParaTypeValue(GeneratedYangParser.AnnotationParaTypeValueContext ctx) {
1458 + // TODO: implement the method.
1459 + }
1460 +
1461 + @Override
1462 + public void enterAnnotationIdentifier(GeneratedYangParser.AnnotationIdentifierContext ctx) {
1463 + // TODO: implement the method.
1464 + }
1465 +
1466 + @Override
1467 + public void exitAnnotationIdentifier(GeneratedYangParser.AnnotationIdentifierContext ctx) {
1468 + // TODO: implement the method.
1469 + }
1470 +
1471 + @Override
1379 public void enterVersion(GeneratedYangParser.VersionContext ctx) { 1472 public void enterVersion(GeneratedYangParser.VersionContext ctx) {
1380 // do nothing. 1473 // do nothing.
1381 } 1474 }
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
16 16
17 package org.onosproject.yangutils.parser.impl.listeners; 17 package org.onosproject.yangutils.parser.impl.listeners;
18 18
19 -import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
20 import org.onosproject.yangutils.datamodel.YangDerivedInfo; 19 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
21 import org.onosproject.yangutils.datamodel.YangLeaf; 20 import org.onosproject.yangutils.datamodel.YangLeaf;
22 import org.onosproject.yangutils.datamodel.YangLeafList; 21 import org.onosproject.yangutils.datamodel.YangLeafList;
...@@ -27,6 +26,7 @@ import org.onosproject.yangutils.datamodel.YangTypeDef; ...@@ -27,6 +26,7 @@ import org.onosproject.yangutils.datamodel.YangTypeDef;
27 import org.onosproject.yangutils.datamodel.YangUnion; 26 import org.onosproject.yangutils.datamodel.YangUnion;
28 import org.onosproject.yangutils.datamodel.exceptions.DataModelException; 27 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
29 import org.onosproject.yangutils.datamodel.utils.Parsable; 28 import org.onosproject.yangutils.datamodel.utils.Parsable;
29 +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
30 import org.onosproject.yangutils.linker.impl.YangResolutionInfoImpl; 30 import org.onosproject.yangutils.linker.impl.YangResolutionInfoImpl;
31 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; 31 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
32 import org.onosproject.yangutils.parser.exceptions.ParserException; 32 import org.onosproject.yangutils.parser.exceptions.ParserException;
...@@ -94,6 +94,8 @@ public final class TypeListener { ...@@ -94,6 +94,8 @@ public final class TypeListener {
94 // Obtain the YANG data type. 94 // Obtain the YANG data type.
95 YangDataTypes yangDataTypes = YangDataTypes.getType(ctx.string().getText()); 95 YangDataTypes yangDataTypes = YangDataTypes.getType(ctx.string().getText());
96 96
97 + validateTypeSubStatementCardinality(ctx, yangDataTypes);
98 +
97 // Create YANG type object and fill the values. 99 // Create YANG type object and fill the values.
98 YangType<?> type = getYangType(JAVA_GENERATION); 100 YangType<?> type = getYangType(JAVA_GENERATION);
99 type.setNodeIdentifier(nodeIdentifier); 101 type.setNodeIdentifier(nodeIdentifier);
...@@ -265,4 +267,37 @@ public final class TypeListener { ...@@ -265,4 +267,37 @@ public final class TypeListener {
265 TYPE_DATA, ctx.string().getText(), ENTRY, e.getMessage())); 267 TYPE_DATA, ctx.string().getText(), ENTRY, e.getMessage()));
266 } 268 }
267 } 269 }
270 +
271 + /**
272 + * Validates type body statements cardinality.
273 + *
274 + * @param ctx context object of the grammar rule
275 + * @param yangDataType yang data type
276 + */
277 + private static void validateTypeSubStatementCardinality(GeneratedYangParser.TypeStatementContext ctx,
278 + YangDataTypes yangDataType) {
279 + if (ctx.typeBodyStatements() == null || ctx.typeBodyStatements().isEmpty()) {
280 + ParserException parserException;
281 + switch (yangDataType) {
282 + case UNION:
283 + parserException = new ParserException("YANG file error : a type union" +
284 + " must have atleast one type statement.");
285 + break;
286 + case ENUMERATION:
287 + parserException = new ParserException("YANG file error : a type enumeration" +
288 + " must have atleast one enum statement.");
289 + break;
290 + case BITS:
291 + parserException = new ParserException("YANG file error : a type bits" +
292 + " must have atleast one bit statement.");
293 + break;
294 + // TODO : decimal64, identity ref, leafref
295 + default:
296 + return;
297 + }
298 + parserException.setLine(ctx.getStart().getLine());
299 + parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
300 + throw parserException;
301 + }
302 + }
268 } 303 }
......
...@@ -100,6 +100,7 @@ lexer grammar YangLexer; ...@@ -100,6 +100,7 @@ lexer grammar YangLexer;
100 TRUE_KEYWORD : 'true'; 100 TRUE_KEYWORD : 'true';
101 UNBOUNDED_KEYWORD : 'unbounded'; 101 UNBOUNDED_KEYWORD : 'unbounded';
102 USER_KEYWORD : 'user'; 102 USER_KEYWORD : 'user';
103 + COMPILER_ANNOTATION_KEYWORD : 'compiler-annotation';
103 104
104 // Lexer tokens to be skipped 105 // Lexer tokens to be skipped
105 COMMENT 106 COMMENT
...@@ -116,11 +117,18 @@ lexer grammar YangLexer; ...@@ -116,11 +117,18 @@ lexer grammar YangLexer;
116 DATE_ARG : DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT; 117 DATE_ARG : DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT;
117 LEFT_CURLY_BRACE : '{'; 118 LEFT_CURLY_BRACE : '{';
118 RIGHT_CURLY_BRACE : '}'; 119 RIGHT_CURLY_BRACE : '}';
120 + LEFT_ROUND_BRACE : '(';
121 + RIGHT_ROUND_BRACE : ')';
122 + ANNOTATION_START : '@';
123 + ANNOTATION_IDENTIFIER : ('@')(ALPHA | '_')
124 + (ALPHA | DIGIT | '_' | '-' | '.')*;
119 IDENTIFIER : (ALPHA | '_') 125 IDENTIFIER : (ALPHA | '_')
120 (ALPHA | DIGIT | '_' | '-' | '.')*; 126 (ALPHA | DIGIT | '_' | '-' | '.')*;
121 STMTEND : ';'; 127 STMTEND : ';';
122 DQUOTE : '"'; 128 DQUOTE : '"';
123 COLON : ':'; 129 COLON : ':';
130 + COMMA : ',';
131 + EQUAL : '=';
124 PLUS : '+'; 132 PLUS : '+';
125 MINUS: '-'; 133 MINUS: '-';
126 134
......
...@@ -129,19 +129,6 @@ public class ConfigListenerTest { ...@@ -129,19 +129,6 @@ public class ConfigListenerTest {
129 } 129 }
130 130
131 /** 131 /**
132 - * Checks config statement as sub-statement of module.
133 - */
134 - @Test
135 - public void processModuleSubStatementConfig() throws IOException, ParserException {
136 - thrown.expect(ParserException.class);
137 - thrown.expectMessage("mismatched input 'config' expecting {'anyxml', 'augment', 'choice', 'contact', "
138 - + "'container', 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import',"
139 - + " 'include', 'leaf', 'leaf-list', 'list', 'notification', 'organization', 'reference',"
140 - + " 'revision', 'rpc', 'typedef', 'uses', '}'}");
141 - YangNode node = manager.getDataModel("src/test/resources/ModuleSubStatementConfig.yang");
142 - }
143 -
144 - /**
145 * Checks config statement as sub-statement of container. 132 * Checks config statement as sub-statement of container.
146 */ 133 */
147 @Test 134 @Test
......
...@@ -91,13 +91,8 @@ public class LeafListListenerTest { ...@@ -91,13 +91,8 @@ public class LeafListListenerTest {
91 /** 91 /**
92 * Checks whether exception is thrown when leaf-list keyword is incorrect. 92 * Checks whether exception is thrown when leaf-list keyword is incorrect.
93 */ 93 */
94 - @Test 94 + @Test(expected = ParserException.class)
95 public void processLeafListInvalidStatement() throws IOException, ParserException { 95 public void processLeafListInvalidStatement() throws IOException, ParserException {
96 - thrown.expect(ParserException.class);
97 - thrown.expectMessage("mismatched input 'leaflist' expecting {'anyxml', 'augment', 'choice', 'contact', "
98 - + "'container', 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import',"
99 - + " 'include', 'leaf', 'leaf-list', 'list', 'notification', 'organization', 'reference',"
100 - + " 'revision', 'rpc', 'typedef', 'uses', '}'}");
101 YangNode node = manager.getDataModel("src/test/resources/LeafListInvalidStatement.yang"); 96 YangNode node = manager.getDataModel("src/test/resources/LeafListInvalidStatement.yang");
102 } 97 }
103 98
......
...@@ -90,19 +90,6 @@ public class LeafListenerTest { ...@@ -90,19 +90,6 @@ public class LeafListenerTest {
90 } 90 }
91 91
92 /** 92 /**
93 - * Checks whether exception is thrown when leaf keyword is incorrect.
94 - */
95 - @Test
96 - public void processLeafInvalidStatement() throws IOException, ParserException {
97 - thrown.expect(ParserException.class);
98 - thrown.expectMessage("mismatched input 'leafs' expecting {'anyxml', 'augment', 'choice', 'contact', "
99 - + "'container', 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import',"
100 - + " 'include', 'leaf', 'leaf-list', 'list', 'notification', 'organization', 'reference',"
101 - + " 'revision', 'rpc', 'typedef', 'uses', '}'}");
102 - YangNode node = manager.getDataModel("src/test/resources/LeafInvalidStatement.yang");
103 - }
104 -
105 - /**
106 * Checks whether exception is thrown when leaf keyword without Left brace 93 * Checks whether exception is thrown when leaf keyword without Left brace
107 * as per grammar. 94 * as per grammar.
108 */ 95 */
......
...@@ -140,18 +140,4 @@ public class MandatoryListenerTest { ...@@ -140,18 +140,4 @@ public class MandatoryListenerTest {
140 thrown.expectMessage("missing ';' at '}'"); 140 thrown.expectMessage("missing ';' at '}'");
141 YangNode node = manager.getDataModel("src/test/resources/MandatoryWithoutStatementEnd.yang"); 141 YangNode node = manager.getDataModel("src/test/resources/MandatoryWithoutStatementEnd.yang");
142 } 142 }
143 -
144 - /**
145 - * Checks mandatory statement as sub-statement of module and expects
146 - * exception.
147 - */
148 - @Test
149 - public void processModuleSubStatementMandatory() throws IOException, ParserException {
150 - thrown.expect(ParserException.class);
151 - thrown.expectMessage("mismatched input 'mandatory' expecting {'anyxml', 'augment', 'choice', 'contact',"
152 - + " 'container', 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import',"
153 - + " 'include', 'leaf', 'leaf-list', 'list', 'notification', 'organization', 'reference',"
154 - + " 'revision', 'rpc', 'typedef', 'uses', '}'}");
155 - YangNode node = manager.getDataModel("src/test/resources/ModuleSubStatementMandatory.yang");
156 - }
157 } 143 }
......
...@@ -92,19 +92,6 @@ public class MaxElementsListenerTest { ...@@ -92,19 +92,6 @@ public class MaxElementsListenerTest {
92 } 92 }
93 93
94 /** 94 /**
95 - * Checks whether exception is thrown when invalid max-elements keyword is
96 - * given as input.
97 - */
98 - @Test
99 - public void processMaxElementsInvalidStatement() throws IOException, ParserException {
100 - thrown.expect(ParserException.class);
101 - thrown.expectMessage("extraneous input 'max-element' expecting {'config', 'description', 'if-feature',"
102 - + " 'max-elements', 'min-elements', 'must', 'ordered-by', 'reference', 'status', 'type', 'units', "
103 - + "'when', '}'}");
104 - YangNode node = manager.getDataModel("src/test/resources/MaxElementsInvalidStatement.yang");
105 - }
106 -
107 - /**
108 * Checks whether exception is thrown when max-elements statement without 95 * Checks whether exception is thrown when max-elements statement without
109 * statement end is given as input. 96 * statement end is given as input.
110 */ 97 */
......
...@@ -92,19 +92,6 @@ public class MinElementsListenerTest { ...@@ -92,19 +92,6 @@ public class MinElementsListenerTest {
92 } 92 }
93 93
94 /** 94 /**
95 - * Checks whether exception is thrown when invalid min-elements keyword is
96 - * given as input.
97 - */
98 - @Test
99 - public void processMinElementsInvalidKeyword() throws IOException, ParserException {
100 - thrown.expect(ParserException.class);
101 - thrown.expectMessage("extraneous input 'min-element' expecting {'config', 'description', 'if-feature',"
102 - + " 'max-elements', 'min-elements', 'must', 'ordered-by', 'reference', 'status', 'type', 'units',"
103 - + " 'when', '}'}");
104 - YangNode node = manager.getDataModel("src/test/resources/MinElementsInvalidKeyword.yang");
105 - }
106 -
107 - /**
108 * Checks whether exception is thrown when invalid min-elements value is 95 * Checks whether exception is thrown when invalid min-elements value is
109 * given as input. 96 * given as input.
110 */ 97 */
......
...@@ -145,19 +145,6 @@ public class StatusListenerTest { ...@@ -145,19 +145,6 @@ public class StatusListenerTest {
145 } 145 }
146 146
147 /** 147 /**
148 - * Checks status statement as sub-statement of module.
149 - */
150 - @Test
151 - public void processModuleSubStatementStatus() throws IOException, ParserException {
152 - thrown.expect(ParserException.class);
153 - thrown.expectMessage("mismatched input 'status' expecting {'anyxml', 'augment', 'choice', 'contact', "
154 - + "'container', 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import',"
155 - + " 'include', 'leaf', 'leaf-list', 'list', 'notification', 'organization', 'reference', "
156 - + "'revision', 'rpc', 'typedef', 'uses', '}'}");
157 - YangNode node = manager.getDataModel("src/test/resources/ModuleSubStatementStatus.yang");
158 - }
159 -
160 - /**
161 * Checks status statement as sub-statement of container. 148 * Checks status statement as sub-statement of container.
162 */ 149 */
163 @Test 150 @Test
......
...@@ -138,4 +138,12 @@ public class UnionListenerTest { ...@@ -138,4 +138,12 @@ public class UnionListenerTest {
138 138
139 YangNode node = manager.getDataModel("src/test/resources/UnionWithEmptyType.yang"); 139 YangNode node = manager.getDataModel("src/test/resources/UnionWithEmptyType.yang");
140 } 140 }
141 +
142 + /**
143 + * Checks whether type union has atleast one type statement.
144 + */
145 + @Test (expected = ParserException.class)
146 + public void processUnionWithoutChild() throws IOException, ParserException {
147 + manager.getDataModel("src/test/resources/UnionWithoutChild.yang");
148 + }
141 } 149 }
......
...@@ -71,19 +71,6 @@ public class UnitsListenerTest { ...@@ -71,19 +71,6 @@ public class UnitsListenerTest {
71 } 71 }
72 72
73 /** 73 /**
74 - * Checks invalid units statement as sub-statement of module.
75 - */
76 - @Test
77 - public void processModuleSubStatementUnits() throws IOException, ParserException {
78 - thrown.expect(ParserException.class);
79 - thrown.expectMessage("mismatched input 'type' expecting {'anyxml', 'augment', 'choice', 'contact', "
80 - + "'container', 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity',"
81 - + " 'import', 'include', 'leaf', 'leaf-list', 'list', 'notification', 'organization', "
82 - + "'reference', 'revision', 'rpc', 'typedef', 'uses', '}'}");
83 - YangNode node = manager.getDataModel("src/test/resources/ModuleSubStatementUnits.yang");
84 - }
85 -
86 - /**
87 * Checks invalid units statement(without statement end). 74 * Checks invalid units statement(without statement end).
88 */ 75 */
89 @Test 76 @Test
......
1 -module Test {
2 - yang-version 1;
3 - namespace http://huawei.com;
4 - prefix Ant;
5 - leafs invalid-interval {
6 - type "uint16";
7 - units "seconds";
8 - description "Interval before a route is declared invalid";
9 - config true;
10 - mandatory true;
11 - status current;
12 - reference "RFC 6020";
13 - }
14 -}
...\ No newline at end of file ...\ No newline at end of file
1 -module Test {
2 - yang-version 1;
3 - namespace http://huawei.com;
4 - prefix Ant;
5 - leaf-list invalid-interval {
6 - type "uint16";
7 - units "seconds";
8 - max-element 3;
9 - description "Interval before a route is declared invalid;
10 - config true;
11 - status current;
12 - reference "RFC 6020";
13 - }
14 -}
1 -module Test {
2 - yang-version 1;
3 - namespace http://huawei.com;
4 - prefix Ant;
5 - leaf-list invalid-interval {
6 - type "uint16";
7 - units "seconds";
8 - min-element 3;
9 - description "Interval before a route is declared invalid";
10 - config true;
11 - status current;
12 - reference "RFC 6020";
13 - }
14 -}
...\ No newline at end of file ...\ No newline at end of file
1 -module Test {
2 - yang-version 1;
3 - namespace http://huawei.com;
4 - prefix Ant;
5 - mandatory false;
6 -}
...\ No newline at end of file ...\ No newline at end of file
1 -module Test {
2 - yang-version 1;
3 - namespace http://huawei.com;
4 - prefix Ant;
5 - status current;
6 -}
...\ No newline at end of file ...\ No newline at end of file
1 -module Test {
2 - yang-version 1;
3 - namespace http://huawei.com;
4 - prefix Ant;
5 - type "uint16";
6 - units "seconds";
7 -}
...\ No newline at end of file ...\ No newline at end of file
...@@ -2,5 +2,13 @@ module Test { ...@@ -2,5 +2,13 @@ module Test {
2 yang-version 1; 2 yang-version 1;
3 namespace http://huawei.com; 3 namespace http://huawei.com;
4 prefix Ant; 4 prefix Ant;
5 - config invalid;
6 -}
...\ No newline at end of file ...\ No newline at end of file
5 + list valid {
6 + key "invalid-interval";
7 + leaf invalid-interval {
8 + type union {
9 + type "union";
10 + }
11 + }
12 + }
13 +}
14 +
......