Committed by
Gerrit Code Review
YANG Derived Data Type Support + Change in YANG Parser Grammar to
Support String values which are not in double quotes with UT case + Addition of Revision Date Validation with UT case + Removal of String.valueOf Change-Id: Ic152265a35c0d2b0f84473a94ca67681cf8efca8
Showing
21 changed files
with
434 additions
and
58 deletions
... | @@ -24,6 +24,7 @@ import org.onosproject.yangutils.parser.Parsable; | ... | @@ -24,6 +24,7 @@ import org.onosproject.yangutils.parser.Parsable; |
24 | import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangListener; | 24 | import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangListener; |
25 | import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | 25 | import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; |
26 | 26 | ||
27 | +import org.onosproject.yangutils.parser.impl.listeners.DefaultListener; | ||
27 | import org.onosproject.yangutils.parser.impl.listeners.KeyListener; | 28 | import org.onosproject.yangutils.parser.impl.listeners.KeyListener; |
28 | import org.onosproject.yangutils.parser.impl.listeners.LeafListListener; | 29 | import org.onosproject.yangutils.parser.impl.listeners.LeafListListener; |
29 | import org.onosproject.yangutils.parser.impl.listeners.LeafListener; | 30 | import org.onosproject.yangutils.parser.impl.listeners.LeafListener; |
... | @@ -49,6 +50,7 @@ import org.onosproject.yangutils.parser.impl.listeners.RevisionDateListener; | ... | @@ -49,6 +50,7 @@ import org.onosproject.yangutils.parser.impl.listeners.RevisionDateListener; |
49 | import org.onosproject.yangutils.parser.impl.listeners.RevisionListener; | 50 | import org.onosproject.yangutils.parser.impl.listeners.RevisionListener; |
50 | import org.onosproject.yangutils.parser.impl.listeners.StatusListener; | 51 | import org.onosproject.yangutils.parser.impl.listeners.StatusListener; |
51 | import org.onosproject.yangutils.parser.impl.listeners.SubModuleListener; | 52 | import org.onosproject.yangutils.parser.impl.listeners.SubModuleListener; |
53 | +import org.onosproject.yangutils.parser.impl.listeners.TypeDefListener; | ||
52 | import org.onosproject.yangutils.parser.impl.listeners.TypeListener; | 54 | import org.onosproject.yangutils.parser.impl.listeners.TypeListener; |
53 | import org.onosproject.yangutils.parser.impl.listeners.UnitsListener; | 55 | import org.onosproject.yangutils.parser.impl.listeners.UnitsListener; |
54 | import org.onosproject.yangutils.parser.impl.listeners.VersionListener; | 56 | import org.onosproject.yangutils.parser.impl.listeners.VersionListener; |
... | @@ -519,12 +521,12 @@ public class TreeWalkListener implements GeneratedYangListener { | ... | @@ -519,12 +521,12 @@ public class TreeWalkListener implements GeneratedYangListener { |
519 | 521 | ||
520 | @Override | 522 | @Override |
521 | public void enterTypedefStatement(GeneratedYangParser.TypedefStatementContext ctx) { | 523 | public void enterTypedefStatement(GeneratedYangParser.TypedefStatementContext ctx) { |
522 | - //TODO: implement the method. | 524 | + TypeDefListener.processTypeDefEntry(this, ctx); |
523 | } | 525 | } |
524 | 526 | ||
525 | @Override | 527 | @Override |
526 | public void exitTypedefStatement(GeneratedYangParser.TypedefStatementContext ctx) { | 528 | public void exitTypedefStatement(GeneratedYangParser.TypedefStatementContext ctx) { |
527 | - //TODO: implement the method. | 529 | + TypeDefListener.processTypeDefExit(this, ctx); |
528 | } | 530 | } |
529 | 531 | ||
530 | @Override | 532 | @Override |
... | @@ -609,7 +611,7 @@ public class TreeWalkListener implements GeneratedYangListener { | ... | @@ -609,7 +611,7 @@ public class TreeWalkListener implements GeneratedYangListener { |
609 | 611 | ||
610 | @Override | 612 | @Override |
611 | public void enterDefaultStatement(GeneratedYangParser.DefaultStatementContext ctx) { | 613 | public void enterDefaultStatement(GeneratedYangParser.DefaultStatementContext ctx) { |
612 | - //TODO: implement the method. | 614 | + DefaultListener.processDefaultEntry(this, ctx); |
613 | } | 615 | } |
614 | 616 | ||
615 | @Override | 617 | @Override | ... | ... |
... | @@ -78,8 +78,8 @@ public final class BaseFileListener { | ... | @@ -78,8 +78,8 @@ public final class BaseFileListener { |
78 | checkStackIsNotEmpty(listener, MISSING_HOLDER, YANGBASE_DATA, "", EXIT); | 78 | checkStackIsNotEmpty(listener, MISSING_HOLDER, YANGBASE_DATA, "", EXIT); |
79 | 79 | ||
80 | // Data Model tree root node is set. | 80 | // Data Model tree root node is set. |
81 | - if (listener.getParsedDataStack().peek() instanceof YangModule | 81 | + if ((listener.getParsedDataStack().peek() instanceof YangModule) |
82 | - || listener.getParsedDataStack().peek() instanceof YangSubModule) { | 82 | + || (listener.getParsedDataStack().peek() instanceof YangSubModule)) { |
83 | listener.setRootNode((YangNode) listener.getParsedDataStack().pop()); | 83 | listener.setRootNode((YangNode) listener.getParsedDataStack().pop()); |
84 | } else { | 84 | } else { |
85 | throw new ParserException(constructListenerErrorMessage(INVALID_CHILD, YANGBASE_DATA, "", EXIT)); | 85 | throw new ParserException(constructListenerErrorMessage(INVALID_CHILD, YANGBASE_DATA, "", EXIT)); | ... | ... |
utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BelongsToListener.java
... | @@ -77,11 +77,11 @@ public final class BelongsToListener { | ... | @@ -77,11 +77,11 @@ public final class BelongsToListener { |
77 | GeneratedYangParser.BelongstoStatementContext ctx) { | 77 | GeneratedYangParser.BelongstoStatementContext ctx) { |
78 | 78 | ||
79 | // Check for stack to be non empty. | 79 | // Check for stack to be non empty. |
80 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, BELONGS_TO_DATA, String.valueOf(ctx.IDENTIFIER().getText()), | 80 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, BELONGS_TO_DATA, ctx.IDENTIFIER().getText(), |
81 | ENTRY); | 81 | ENTRY); |
82 | 82 | ||
83 | YangBelongsTo belongstoNode = new YangBelongsTo(); | 83 | YangBelongsTo belongstoNode = new YangBelongsTo(); |
84 | - belongstoNode.setBelongsToModuleName(String.valueOf(ctx.IDENTIFIER().getText())); | 84 | + belongstoNode.setBelongsToModuleName(ctx.IDENTIFIER().getText()); |
85 | 85 | ||
86 | // Push belongsto into the stack. | 86 | // Push belongsto into the stack. |
87 | listener.getParsedDataStack().push(belongstoNode); | 87 | listener.getParsedDataStack().push(belongstoNode); |
... | @@ -98,7 +98,7 @@ public final class BelongsToListener { | ... | @@ -98,7 +98,7 @@ public final class BelongsToListener { |
98 | GeneratedYangParser.BelongstoStatementContext ctx) { | 98 | GeneratedYangParser.BelongstoStatementContext ctx) { |
99 | 99 | ||
100 | // Check for stack to be non empty. | 100 | // Check for stack to be non empty. |
101 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, BELONGS_TO_DATA, String.valueOf(ctx.IDENTIFIER().getText()), | 101 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, BELONGS_TO_DATA, ctx.IDENTIFIER().getText(), |
102 | EXIT); | 102 | EXIT); |
103 | 103 | ||
104 | Parsable tmpBelongstoNode = listener.getParsedDataStack().peek(); | 104 | Parsable tmpBelongstoNode = listener.getParsedDataStack().peek(); |
... | @@ -107,7 +107,7 @@ public final class BelongsToListener { | ... | @@ -107,7 +107,7 @@ public final class BelongsToListener { |
107 | 107 | ||
108 | // Check for stack to be empty. | 108 | // Check for stack to be empty. |
109 | checkStackIsNotEmpty(listener, MISSING_HOLDER, BELONGS_TO_DATA, | 109 | checkStackIsNotEmpty(listener, MISSING_HOLDER, BELONGS_TO_DATA, |
110 | - String.valueOf(ctx.IDENTIFIER().getText()), EXIT); | 110 | + ctx.IDENTIFIER().getText(), EXIT); |
111 | 111 | ||
112 | Parsable tmpNode = listener.getParsedDataStack().peek(); | 112 | Parsable tmpNode = listener.getParsedDataStack().peek(); |
113 | switch (tmpNode.getParsableDataType()) { | 113 | switch (tmpNode.getParsableDataType()) { |
... | @@ -118,12 +118,12 @@ public final class BelongsToListener { | ... | @@ -118,12 +118,12 @@ public final class BelongsToListener { |
118 | } | 118 | } |
119 | default: | 119 | default: |
120 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, BELONGS_TO_DATA, | 120 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, BELONGS_TO_DATA, |
121 | - String.valueOf(ctx.IDENTIFIER().getText()), | 121 | + ctx.IDENTIFIER().getText(), |
122 | EXIT)); | 122 | EXIT)); |
123 | } | 123 | } |
124 | } else { | 124 | } else { |
125 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, BELONGS_TO_DATA, | 125 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, BELONGS_TO_DATA, |
126 | - String.valueOf(ctx.IDENTIFIER().getText()), EXIT)); | 126 | + ctx.IDENTIFIER().getText(), EXIT)); |
127 | } | 127 | } |
128 | } | 128 | } |
129 | } | 129 | } | ... | ... |
... | @@ -92,24 +92,24 @@ public final class ContactListener { | ... | @@ -92,24 +92,24 @@ public final class ContactListener { |
92 | public static void processContactEntry(TreeWalkListener listener, GeneratedYangParser.ContactStatementContext ctx) { | 92 | public static void processContactEntry(TreeWalkListener listener, GeneratedYangParser.ContactStatementContext ctx) { |
93 | 93 | ||
94 | // Check for stack to be non empty. | 94 | // Check for stack to be non empty. |
95 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, CONTACT_DATA, String.valueOf(ctx.string().getText()), ENTRY); | 95 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, CONTACT_DATA, ctx.string().getText(), ENTRY); |
96 | 96 | ||
97 | // Obtain the node of the stack. | 97 | // Obtain the node of the stack. |
98 | Parsable tmpNode = listener.getParsedDataStack().peek(); | 98 | Parsable tmpNode = listener.getParsedDataStack().peek(); |
99 | switch (tmpNode.getParsableDataType()) { | 99 | switch (tmpNode.getParsableDataType()) { |
100 | case MODULE_DATA: { | 100 | case MODULE_DATA: { |
101 | YangModule module = (YangModule) tmpNode; | 101 | YangModule module = (YangModule) tmpNode; |
102 | - module.setContact(String.valueOf(ctx.string().getText())); | 102 | + module.setContact(ctx.string().getText()); |
103 | break; | 103 | break; |
104 | } | 104 | } |
105 | case SUB_MODULE_DATA: { | 105 | case SUB_MODULE_DATA: { |
106 | YangSubModule subModule = (YangSubModule) tmpNode; | 106 | YangSubModule subModule = (YangSubModule) tmpNode; |
107 | - subModule.setContact(String.valueOf(ctx.string().getText())); | 107 | + subModule.setContact(ctx.string().getText()); |
108 | break; | 108 | break; |
109 | } | 109 | } |
110 | default: | 110 | default: |
111 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, CONTACT_DATA, | 111 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, CONTACT_DATA, |
112 | - String.valueOf(ctx.string().getText()), ENTRY)); | 112 | + ctx.string().getText(), ENTRY)); |
113 | } | 113 | } |
114 | } | 114 | } |
115 | } | 115 | } | ... | ... |
utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/DefaultListener.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 2014-2016 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 | + * typedef-stmt = typedef-keyword sep identifier-arg-str optsep | ||
23 | + * "{" stmtsep | ||
24 | + * ;; these stmts can appear in any order | ||
25 | + * type-stmt stmtsep | ||
26 | + * [units-stmt stmtsep] | ||
27 | + * [default-stmt stmtsep] | ||
28 | + * [status-stmt stmtsep] | ||
29 | + * [description-stmt stmtsep] | ||
30 | + * [reference-stmt stmtsep] | ||
31 | + * "}" | ||
32 | + * default-stmt = default-keyword sep string stmtend | ||
33 | + | ||
34 | + * | ||
35 | + * ANTLR grammar rule | ||
36 | + * typedefStatement : TYPEDEF_KEYWORD IDENTIFIER LEFT_CURLY_BRACE | ||
37 | + * (typeStatement | unitsStatement | defaultStatement | statusStatement | ||
38 | + * | descriptionStatement | referenceStatement)* RIGHT_CURLY_BRACE; | ||
39 | + * defaultStatement : DEFAULT_KEYWORD string STMTEND; | ||
40 | + */ | ||
41 | + | ||
42 | +import org.onosproject.yangutils.datamodel.YangTypeDef; | ||
43 | +import org.onosproject.yangutils.parser.Parsable; | ||
44 | +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | ||
45 | +import org.onosproject.yangutils.parser.exceptions.ParserException; | ||
46 | +import org.onosproject.yangutils.parser.impl.TreeWalkListener; | ||
47 | + | ||
48 | +import static org.onosproject.yangutils.parser.ParsableDataType.DEFAULT_DATA; | ||
49 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; | ||
50 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; | ||
51 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; | ||
52 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; | ||
53 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; | ||
54 | + | ||
55 | +public final class DefaultListener { | ||
56 | + | ||
57 | + /** | ||
58 | + * Creates a new default listener. | ||
59 | + */ | ||
60 | + private DefaultListener() { | ||
61 | + } | ||
62 | + | ||
63 | + /** | ||
64 | + * It is called when parser enters grammar rule (default), it perform | ||
65 | + * validations and updates the data model tree. | ||
66 | + * | ||
67 | + * @param listener listener's object. | ||
68 | + * @param ctx context object of the grammar rule. | ||
69 | + */ | ||
70 | + public static void processDefaultEntry(TreeWalkListener listener, | ||
71 | + GeneratedYangParser.DefaultStatementContext ctx) { | ||
72 | + | ||
73 | + // Check for stack to be non empty. | ||
74 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, DEFAULT_DATA, ctx.string().getText(), ENTRY); | ||
75 | + | ||
76 | + Parsable tmpNode = listener.getParsedDataStack().peek(); | ||
77 | + switch (tmpNode.getParsableDataType()) { | ||
78 | + case TYPEDEF_DATA: { | ||
79 | + YangTypeDef typeDef = (YangTypeDef) tmpNode; | ||
80 | + typeDef.setDefaultValueInString(ctx.string().getText()); | ||
81 | + break; | ||
82 | + } | ||
83 | + default: | ||
84 | + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, | ||
85 | + DEFAULT_DATA, ctx.string().getText(), ENTRY)); | ||
86 | + } | ||
87 | + } | ||
88 | +} |
... | @@ -75,10 +75,10 @@ public final class ImportListener { | ... | @@ -75,10 +75,10 @@ public final class ImportListener { |
75 | public static void processImportEntry(TreeWalkListener listener, GeneratedYangParser.ImportStatementContext ctx) { | 75 | public static void processImportEntry(TreeWalkListener listener, GeneratedYangParser.ImportStatementContext ctx) { |
76 | 76 | ||
77 | // Check for stack to be non empty. | 77 | // Check for stack to be non empty. |
78 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, IMPORT_DATA, String.valueOf(ctx.IDENTIFIER().getText()), ENTRY); | 78 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, IMPORT_DATA, ctx.IDENTIFIER().getText(), ENTRY); |
79 | 79 | ||
80 | YangImport importNode = new YangImport(); | 80 | YangImport importNode = new YangImport(); |
81 | - importNode.setModuleName(String.valueOf(ctx.IDENTIFIER().getText())); | 81 | + importNode.setModuleName(ctx.IDENTIFIER().getText()); |
82 | 82 | ||
83 | // Push import node to the stack. | 83 | // Push import node to the stack. |
84 | listener.getParsedDataStack().push(importNode); | 84 | listener.getParsedDataStack().push(importNode); |
... | @@ -94,14 +94,14 @@ public final class ImportListener { | ... | @@ -94,14 +94,14 @@ public final class ImportListener { |
94 | public static void processImportExit(TreeWalkListener listener, GeneratedYangParser.ImportStatementContext ctx) { | 94 | public static void processImportExit(TreeWalkListener listener, GeneratedYangParser.ImportStatementContext ctx) { |
95 | 95 | ||
96 | // Check for stack to be non empty. | 96 | // Check for stack to be non empty. |
97 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, IMPORT_DATA, String.valueOf(ctx.IDENTIFIER().getText()), EXIT); | 97 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, IMPORT_DATA, ctx.IDENTIFIER().getText(), EXIT); |
98 | 98 | ||
99 | Parsable tmpImportNode = listener.getParsedDataStack().peek(); | 99 | Parsable tmpImportNode = listener.getParsedDataStack().peek(); |
100 | if (tmpImportNode instanceof YangImport) { | 100 | if (tmpImportNode instanceof YangImport) { |
101 | listener.getParsedDataStack().pop(); | 101 | listener.getParsedDataStack().pop(); |
102 | 102 | ||
103 | // Check for stack to be non empty. | 103 | // Check for stack to be non empty. |
104 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, IMPORT_DATA, String.valueOf(ctx.IDENTIFIER().getText()), | 104 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, IMPORT_DATA, ctx.IDENTIFIER().getText(), |
105 | EXIT); | 105 | EXIT); |
106 | 106 | ||
107 | Parsable tmpNode = listener.getParsedDataStack().peek(); | 107 | Parsable tmpNode = listener.getParsedDataStack().peek(); |
... | @@ -118,12 +118,12 @@ public final class ImportListener { | ... | @@ -118,12 +118,12 @@ public final class ImportListener { |
118 | } | 118 | } |
119 | default: | 119 | default: |
120 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, IMPORT_DATA, | 120 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, IMPORT_DATA, |
121 | - String.valueOf(ctx.IDENTIFIER().getText()), | 121 | + ctx.IDENTIFIER().getText(), |
122 | EXIT)); | 122 | EXIT)); |
123 | } | 123 | } |
124 | } else { | 124 | } else { |
125 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, IMPORT_DATA, | 125 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, IMPORT_DATA, |
126 | - String.valueOf(ctx.IDENTIFIER().getText()), EXIT)); | 126 | + ctx.IDENTIFIER().getText(), EXIT)); |
127 | } | 127 | } |
128 | } | 128 | } |
129 | } | 129 | } | ... | ... |
... | @@ -74,11 +74,11 @@ public final class IncludeListener { | ... | @@ -74,11 +74,11 @@ public final class IncludeListener { |
74 | public static void processIncludeEntry(TreeWalkListener listener, GeneratedYangParser.IncludeStatementContext ctx) { | 74 | public static void processIncludeEntry(TreeWalkListener listener, GeneratedYangParser.IncludeStatementContext ctx) { |
75 | 75 | ||
76 | // Check for stack to be non empty. | 76 | // Check for stack to be non empty. |
77 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, INCLUDE_DATA, String.valueOf(ctx.IDENTIFIER().getText()), | 77 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, INCLUDE_DATA, ctx.IDENTIFIER().getText(), |
78 | ENTRY); | 78 | ENTRY); |
79 | 79 | ||
80 | YangInclude includeNode = new YangInclude(); | 80 | YangInclude includeNode = new YangInclude(); |
81 | - includeNode.setSubModuleName(String.valueOf(ctx.IDENTIFIER().getText())); | 81 | + includeNode.setSubModuleName(ctx.IDENTIFIER().getText()); |
82 | 82 | ||
83 | listener.getParsedDataStack().push(includeNode); | 83 | listener.getParsedDataStack().push(includeNode); |
84 | } | 84 | } |
... | @@ -93,14 +93,14 @@ public final class IncludeListener { | ... | @@ -93,14 +93,14 @@ public final class IncludeListener { |
93 | public static void processIncludeExit(TreeWalkListener listener, GeneratedYangParser.IncludeStatementContext ctx) { | 93 | public static void processIncludeExit(TreeWalkListener listener, GeneratedYangParser.IncludeStatementContext ctx) { |
94 | 94 | ||
95 | // Check for stack to be non empty. | 95 | // Check for stack to be non empty. |
96 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, INCLUDE_DATA, String.valueOf(ctx.IDENTIFIER().getText()), EXIT); | 96 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, INCLUDE_DATA, ctx.IDENTIFIER().getText(), EXIT); |
97 | 97 | ||
98 | Parsable tmpIncludeNode = listener.getParsedDataStack().peek(); | 98 | Parsable tmpIncludeNode = listener.getParsedDataStack().peek(); |
99 | if (tmpIncludeNode instanceof YangInclude) { | 99 | if (tmpIncludeNode instanceof YangInclude) { |
100 | listener.getParsedDataStack().pop(); | 100 | listener.getParsedDataStack().pop(); |
101 | 101 | ||
102 | // Check for stack to be non empty. | 102 | // Check for stack to be non empty. |
103 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, INCLUDE_DATA, String.valueOf(ctx.IDENTIFIER().getText()), | 103 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, INCLUDE_DATA, ctx.IDENTIFIER().getText(), |
104 | EXIT); | 104 | EXIT); |
105 | 105 | ||
106 | Parsable tmpNode = listener.getParsedDataStack().peek(); | 106 | Parsable tmpNode = listener.getParsedDataStack().peek(); |
... | @@ -117,12 +117,12 @@ public final class IncludeListener { | ... | @@ -117,12 +117,12 @@ public final class IncludeListener { |
117 | } | 117 | } |
118 | default: | 118 | default: |
119 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, INCLUDE_DATA, | 119 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, INCLUDE_DATA, |
120 | - String.valueOf(ctx.IDENTIFIER().getText()), | 120 | + ctx.IDENTIFIER().getText(), |
121 | EXIT)); | 121 | EXIT)); |
122 | } | 122 | } |
123 | } else { | 123 | } else { |
124 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, INCLUDE_DATA, | 124 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, INCLUDE_DATA, |
125 | - String.valueOf(ctx.IDENTIFIER().getText()), EXIT)); | 125 | + ctx.IDENTIFIER().getText(), EXIT)); |
126 | } | 126 | } |
127 | } | 127 | } |
128 | } | 128 | } | ... | ... |
... | @@ -69,7 +69,7 @@ public final class ModuleListener { | ... | @@ -69,7 +69,7 @@ public final class ModuleListener { |
69 | public static void processModuleEntry(TreeWalkListener listener, GeneratedYangParser.ModuleStatementContext ctx) { | 69 | public static void processModuleEntry(TreeWalkListener listener, GeneratedYangParser.ModuleStatementContext ctx) { |
70 | 70 | ||
71 | // Check if stack is empty. | 71 | // Check if stack is empty. |
72 | - checkStackIsEmpty(listener, INVALID_HOLDER, MODULE_DATA, String.valueOf(ctx.IDENTIFIER().getText()), ENTRY); | 72 | + checkStackIsEmpty(listener, INVALID_HOLDER, MODULE_DATA, ctx.IDENTIFIER().getText(), ENTRY); |
73 | 73 | ||
74 | YangModule yangModule = new YangModule(); | 74 | YangModule yangModule = new YangModule(); |
75 | yangModule.setName(ctx.IDENTIFIER().getText()); | 75 | yangModule.setName(ctx.IDENTIFIER().getText()); |
... | @@ -87,11 +87,11 @@ public final class ModuleListener { | ... | @@ -87,11 +87,11 @@ public final class ModuleListener { |
87 | public static void processModuleExit(TreeWalkListener listener, GeneratedYangParser.ModuleStatementContext ctx) { | 87 | public static void processModuleExit(TreeWalkListener listener, GeneratedYangParser.ModuleStatementContext ctx) { |
88 | 88 | ||
89 | // Check for stack to be non empty. | 89 | // Check for stack to be non empty. |
90 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, MODULE_DATA, String.valueOf(ctx.IDENTIFIER().getText()), EXIT); | 90 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, MODULE_DATA, ctx.IDENTIFIER().getText(), EXIT); |
91 | 91 | ||
92 | if (!(listener.getParsedDataStack().peek() instanceof YangModule)) { | 92 | if (!(listener.getParsedDataStack().peek() instanceof YangModule)) { |
93 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, MODULE_DATA, | 93 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, MODULE_DATA, |
94 | - String.valueOf(ctx.IDENTIFIER().getText()), EXIT)); | 94 | + ctx.IDENTIFIER().getText(), EXIT)); |
95 | } | 95 | } |
96 | } | 96 | } |
97 | } | 97 | } | ... | ... |
utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/NamespaceListener.java
... | @@ -77,9 +77,9 @@ public final class NamespaceListener { | ... | @@ -77,9 +77,9 @@ public final class NamespaceListener { |
77 | GeneratedYangParser.NamespaceStatementContext ctx) { | 77 | GeneratedYangParser.NamespaceStatementContext ctx) { |
78 | 78 | ||
79 | // Check for stack to be non empty. | 79 | // Check for stack to be non empty. |
80 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, NAMESPACE_DATA, String.valueOf(ctx.string().getText()), ENTRY); | 80 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, NAMESPACE_DATA, ctx.string().getText(), ENTRY); |
81 | 81 | ||
82 | - if (!validateUriValue(String.valueOf(ctx.string().getText()))) { | 82 | + if (!validateUriValue(ctx.string().getText())) { |
83 | ParserException parserException = new ParserException("Invalid namespace URI"); | 83 | ParserException parserException = new ParserException("Invalid namespace URI"); |
84 | parserException.setLine(ctx.string().STRING(0).getSymbol().getLine()); | 84 | parserException.setLine(ctx.string().STRING(0).getSymbol().getLine()); |
85 | parserException.setCharPosition(ctx.string().STRING(0).getSymbol().getCharPositionInLine()); | 85 | parserException.setCharPosition(ctx.string().STRING(0).getSymbol().getCharPositionInLine()); |
... | @@ -92,13 +92,13 @@ public final class NamespaceListener { | ... | @@ -92,13 +92,13 @@ public final class NamespaceListener { |
92 | case MODULE_DATA: { | 92 | case MODULE_DATA: { |
93 | YangModule module = (YangModule) tmpNode; | 93 | YangModule module = (YangModule) tmpNode; |
94 | YangNameSpace uri = new YangNameSpace(); | 94 | YangNameSpace uri = new YangNameSpace(); |
95 | - uri.setUri(String.valueOf(ctx.string().getText())); | 95 | + uri.setUri(ctx.string().getText()); |
96 | module.setNameSpace(uri); | 96 | module.setNameSpace(uri); |
97 | break; | 97 | break; |
98 | } | 98 | } |
99 | default: | 99 | default: |
100 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, NAMESPACE_DATA, | 100 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, NAMESPACE_DATA, |
101 | - String.valueOf(ctx.string().getText()), ENTRY)); | 101 | + ctx.string().getText(), ENTRY)); |
102 | } | 102 | } |
103 | } | 103 | } |
104 | 104 | ... | ... |
... | @@ -95,7 +95,7 @@ public final class OrganizationListener { | ... | @@ -95,7 +95,7 @@ public final class OrganizationListener { |
95 | GeneratedYangParser.OrganizationStatementContext ctx) { | 95 | GeneratedYangParser.OrganizationStatementContext ctx) { |
96 | 96 | ||
97 | // Check for stack to be non empty. | 97 | // Check for stack to be non empty. |
98 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, ORGANIZATION_DATA, String.valueOf(ctx.string().getText()), | 98 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, ORGANIZATION_DATA, ctx.string().getText(), |
99 | ENTRY); | 99 | ENTRY); |
100 | 100 | ||
101 | // Obtain the node of the stack. | 101 | // Obtain the node of the stack. |
... | @@ -103,17 +103,17 @@ public final class OrganizationListener { | ... | @@ -103,17 +103,17 @@ public final class OrganizationListener { |
103 | switch (tmpNode.getParsableDataType()) { | 103 | switch (tmpNode.getParsableDataType()) { |
104 | case MODULE_DATA: { | 104 | case MODULE_DATA: { |
105 | YangModule module = (YangModule) tmpNode; | 105 | YangModule module = (YangModule) tmpNode; |
106 | - module.setOrganization(String.valueOf(ctx.string().getText())); | 106 | + module.setOrganization(ctx.string().getText()); |
107 | break; | 107 | break; |
108 | } | 108 | } |
109 | case SUB_MODULE_DATA: { | 109 | case SUB_MODULE_DATA: { |
110 | YangSubModule subModule = (YangSubModule) tmpNode; | 110 | YangSubModule subModule = (YangSubModule) tmpNode; |
111 | - subModule.setOrganization(String.valueOf(ctx.string().getText())); | 111 | + subModule.setOrganization(ctx.string().getText()); |
112 | break; | 112 | break; |
113 | } | 113 | } |
114 | default: | 114 | default: |
115 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, ORGANIZATION_DATA, | 115 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, ORGANIZATION_DATA, |
116 | - String.valueOf(ctx.string().getText()), ENTRY)); | 116 | + ctx.string().getText(), ENTRY)); |
117 | } | 117 | } |
118 | } | 118 | } |
119 | } | 119 | } | ... | ... |
... | @@ -76,7 +76,7 @@ public final class PrefixListener { | ... | @@ -76,7 +76,7 @@ public final class PrefixListener { |
76 | public static void processPrefixEntry(TreeWalkListener listener, GeneratedYangParser.PrefixStatementContext ctx) { | 76 | public static void processPrefixEntry(TreeWalkListener listener, GeneratedYangParser.PrefixStatementContext ctx) { |
77 | 77 | ||
78 | // Check for stack to be non empty. | 78 | // Check for stack to be non empty. |
79 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, PREFIX_DATA, String.valueOf(ctx.IDENTIFIER().getText()), ENTRY); | 79 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, PREFIX_DATA, ctx.IDENTIFIER().getText(), ENTRY); |
80 | 80 | ||
81 | // Obtain the node of the stack. | 81 | // Obtain the node of the stack. |
82 | Parsable tmpNode = listener.getParsedDataStack().peek(); | 82 | Parsable tmpNode = listener.getParsedDataStack().peek(); |
... | @@ -98,7 +98,7 @@ public final class PrefixListener { | ... | @@ -98,7 +98,7 @@ public final class PrefixListener { |
98 | } | 98 | } |
99 | default: | 99 | default: |
100 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, PREFIX_DATA, | 100 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, PREFIX_DATA, |
101 | - String.valueOf(ctx.IDENTIFIER().getText()), ENTRY)); | 101 | + ctx.IDENTIFIER().getText(), ENTRY)); |
102 | } | 102 | } |
103 | } | 103 | } |
104 | } | 104 | } | ... | ... |
... | @@ -23,6 +23,10 @@ import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | ... | @@ -23,6 +23,10 @@ import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; |
23 | import org.onosproject.yangutils.parser.exceptions.ParserException; | 23 | import org.onosproject.yangutils.parser.exceptions.ParserException; |
24 | import org.onosproject.yangutils.parser.impl.TreeWalkListener; | 24 | import org.onosproject.yangutils.parser.impl.TreeWalkListener; |
25 | 25 | ||
26 | +import java.text.ParseException; | ||
27 | +import java.text.SimpleDateFormat; | ||
28 | +import java.util.Date; | ||
29 | + | ||
26 | import static org.onosproject.yangutils.parser.ParsableDataType.REVISION_DATE_DATA; | 30 | import static org.onosproject.yangutils.parser.ParsableDataType.REVISION_DATE_DATA; |
27 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; | 31 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; |
28 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; | 32 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; |
... | @@ -82,26 +86,57 @@ public final class RevisionDateListener { | ... | @@ -82,26 +86,57 @@ public final class RevisionDateListener { |
82 | GeneratedYangParser.RevisionDateStatementContext ctx) { | 86 | GeneratedYangParser.RevisionDateStatementContext ctx) { |
83 | 87 | ||
84 | // Check for stack to be non empty. | 88 | // Check for stack to be non empty. |
85 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATE_DATA, String.valueOf(ctx.DATE_ARG().getText()), | 89 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATE_DATA, ctx.DATE_ARG().getText(), |
86 | ENTRY); | 90 | ENTRY); |
87 | 91 | ||
92 | + if (!isDateValid(ctx.DATE_ARG().getText())) { | ||
93 | + ParserException parserException = new ParserException("Input date is not correct"); | ||
94 | + parserException.setLine(ctx.DATE_ARG().getSymbol().getLine()); | ||
95 | + parserException.setCharPosition(ctx.DATE_ARG().getSymbol().getCharPositionInLine()); | ||
96 | + throw parserException; | ||
97 | + } | ||
98 | + | ||
88 | // Obtain the node of the stack. | 99 | // Obtain the node of the stack. |
89 | Parsable tmpNode = listener.getParsedDataStack().peek(); | 100 | Parsable tmpNode = listener.getParsedDataStack().peek(); |
90 | switch (tmpNode.getParsableDataType()) { | 101 | switch (tmpNode.getParsableDataType()) { |
91 | case IMPORT_DATA: { | 102 | case IMPORT_DATA: { |
92 | YangImport importNode = (YangImport) tmpNode; | 103 | YangImport importNode = (YangImport) tmpNode; |
93 | - importNode.setRevision(String.valueOf(ctx.DATE_ARG().getText())); | 104 | + importNode.setRevision(ctx.DATE_ARG().getText()); |
94 | break; | 105 | break; |
95 | } | 106 | } |
96 | case INCLUDE_DATA: { | 107 | case INCLUDE_DATA: { |
97 | YangInclude includeNode = (YangInclude) tmpNode; | 108 | YangInclude includeNode = (YangInclude) tmpNode; |
98 | - includeNode.setRevision(String.valueOf(ctx.DATE_ARG().getText())); | 109 | + includeNode.setRevision(ctx.DATE_ARG().getText()); |
99 | break; | 110 | break; |
100 | } | 111 | } |
101 | default: | 112 | default: |
102 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, REVISION_DATE_DATA, | 113 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, REVISION_DATE_DATA, |
103 | - String.valueOf(ctx.DATE_ARG().getText()), ENTRY)); | 114 | + ctx.DATE_ARG().getText(), ENTRY)); |
115 | + } | ||
116 | + } | ||
117 | + | ||
118 | + /** | ||
119 | + * Validates the revision date. | ||
120 | + * | ||
121 | + * @param dateToValidate input revision date. | ||
122 | + * @return validation result, true for success, false for failure. | ||
123 | + */ | ||
124 | + private static boolean isDateValid(String dateToValidate) { | ||
125 | + | ||
126 | + if (dateToValidate == null) { | ||
127 | + return false; | ||
128 | + } | ||
129 | + | ||
130 | + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); | ||
131 | + sdf.setLenient(false); | ||
132 | + | ||
133 | + try { | ||
134 | + //if not valid, it will throw ParseException | ||
135 | + Date date = sdf.parse(dateToValidate); | ||
136 | + System.out.println(date); | ||
137 | + } catch (ParseException e) { | ||
138 | + return false; | ||
104 | } | 139 | } |
140 | + return true; | ||
105 | } | 141 | } |
106 | - // TODO Implement the DATE_ARG validation as per RFC 6020. | ||
107 | } | 142 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -82,7 +82,7 @@ public final class RevisionListener { | ... | @@ -82,7 +82,7 @@ public final class RevisionListener { |
82 | GeneratedYangParser.RevisionStatementContext ctx) { | 82 | GeneratedYangParser.RevisionStatementContext ctx) { |
83 | 83 | ||
84 | // Check for stack to be non empty. | 84 | // Check for stack to be non empty. |
85 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATA, String.valueOf(ctx.DATE_ARG().getText()), ENTRY); | 85 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATA, ctx.DATE_ARG().getText(), ENTRY); |
86 | 86 | ||
87 | // Validate for reverse chronological order of revision & for revision | 87 | // Validate for reverse chronological order of revision & for revision |
88 | // value. | 88 | // value. |
... | @@ -92,7 +92,7 @@ public final class RevisionListener { | ... | @@ -92,7 +92,7 @@ public final class RevisionListener { |
92 | } | 92 | } |
93 | 93 | ||
94 | YangRevision revisionNode = new YangRevision(); | 94 | YangRevision revisionNode = new YangRevision(); |
95 | - revisionNode.setRevDate(String.valueOf(ctx.DATE_ARG().getText())); | 95 | + revisionNode.setRevDate(ctx.DATE_ARG().getText()); |
96 | 96 | ||
97 | listener.getParsedDataStack().push(revisionNode); | 97 | listener.getParsedDataStack().push(revisionNode); |
98 | } | 98 | } |
... | @@ -108,14 +108,14 @@ public final class RevisionListener { | ... | @@ -108,14 +108,14 @@ public final class RevisionListener { |
108 | ctx) { | 108 | ctx) { |
109 | 109 | ||
110 | // Check for stack to be non empty. | 110 | // Check for stack to be non empty. |
111 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATA, String.valueOf(ctx.DATE_ARG().getText()), EXIT); | 111 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATA, ctx.DATE_ARG().getText(), EXIT); |
112 | 112 | ||
113 | Parsable tmpRevisionNode = listener.getParsedDataStack().peek(); | 113 | Parsable tmpRevisionNode = listener.getParsedDataStack().peek(); |
114 | if (tmpRevisionNode instanceof YangRevision) { | 114 | if (tmpRevisionNode instanceof YangRevision) { |
115 | listener.getParsedDataStack().pop(); | 115 | listener.getParsedDataStack().pop(); |
116 | 116 | ||
117 | // Check for stack to be non empty. | 117 | // Check for stack to be non empty. |
118 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATA, String.valueOf(ctx.DATE_ARG().getText()), | 118 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, REVISION_DATA, ctx.DATE_ARG().getText(), |
119 | EXIT); | 119 | EXIT); |
120 | 120 | ||
121 | Parsable tmpNode = listener.getParsedDataStack().peek(); | 121 | Parsable tmpNode = listener.getParsedDataStack().peek(); |
... | @@ -132,12 +132,12 @@ public final class RevisionListener { | ... | @@ -132,12 +132,12 @@ public final class RevisionListener { |
132 | } | 132 | } |
133 | default: | 133 | default: |
134 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, REVISION_DATA, | 134 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, REVISION_DATA, |
135 | - String.valueOf(ctx.DATE_ARG().getText()), | 135 | + ctx.DATE_ARG().getText(), |
136 | EXIT)); | 136 | EXIT)); |
137 | } | 137 | } |
138 | } else { | 138 | } else { |
139 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, REVISION_DATA, | 139 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, REVISION_DATA, |
140 | - String.valueOf(ctx.DATE_ARG().getText()), EXIT)); | 140 | + ctx.DATE_ARG().getText(), EXIT)); |
141 | } | 141 | } |
142 | } | 142 | } |
143 | 143 | ... | ... |
utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/SubModuleListener.java
... | @@ -71,7 +71,7 @@ public final class SubModuleListener { | ... | @@ -71,7 +71,7 @@ public final class SubModuleListener { |
71 | GeneratedYangParser.SubModuleStatementContext ctx) { | 71 | GeneratedYangParser.SubModuleStatementContext ctx) { |
72 | 72 | ||
73 | // Check if stack is empty. | 73 | // Check if stack is empty. |
74 | - checkStackIsEmpty(listener, INVALID_HOLDER, SUB_MODULE_DATA, String.valueOf(ctx.IDENTIFIER().getText()), | 74 | + checkStackIsEmpty(listener, INVALID_HOLDER, SUB_MODULE_DATA, ctx.IDENTIFIER().getText(), |
75 | ENTRY); | 75 | ENTRY); |
76 | 76 | ||
77 | YangSubModule yangSubModule = new YangSubModule(); | 77 | YangSubModule yangSubModule = new YangSubModule(); |
... | @@ -91,12 +91,12 @@ public final class SubModuleListener { | ... | @@ -91,12 +91,12 @@ public final class SubModuleListener { |
91 | GeneratedYangParser.SubModuleStatementContext ctx) { | 91 | GeneratedYangParser.SubModuleStatementContext ctx) { |
92 | 92 | ||
93 | // Check for stack to be non empty. | 93 | // Check for stack to be non empty. |
94 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, SUB_MODULE_DATA, String.valueOf(ctx.IDENTIFIER().getText()), | 94 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, SUB_MODULE_DATA, ctx.IDENTIFIER().getText(), |
95 | EXIT); | 95 | EXIT); |
96 | 96 | ||
97 | if (!(listener.getParsedDataStack().peek() instanceof YangSubModule)) { | 97 | if (!(listener.getParsedDataStack().peek() instanceof YangSubModule)) { |
98 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, SUB_MODULE_DATA, | 98 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, SUB_MODULE_DATA, |
99 | - String.valueOf(ctx.IDENTIFIER().getText()), EXIT)); | 99 | + ctx.IDENTIFIER().getText(), EXIT)); |
100 | } | 100 | } |
101 | } | 101 | } |
102 | } | 102 | } | ... | ... |
utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 2014-2016 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 | + * body-stmts = *((extension-stmt / | ||
23 | + * feature-stmt / | ||
24 | + * identity-stmt / | ||
25 | + * typedef-stmt / | ||
26 | + * grouping-stmt / | ||
27 | + * data-def-stmt / | ||
28 | + * augment-stmt / | ||
29 | + * rpc-stmt / | ||
30 | + * notification-stmt / | ||
31 | + * deviation-stmt) stmtsep) | ||
32 | + * | ||
33 | + * typedef-stmt = typedef-keyword sep identifier-arg-str optsep | ||
34 | + * "{" stmtsep | ||
35 | + * ;; these stmts can appear in any order | ||
36 | + * type-stmt stmtsep | ||
37 | + * [units-stmt stmtsep] | ||
38 | + * [default-stmt stmtsep] | ||
39 | + * [status-stmt stmtsep] | ||
40 | + * [description-stmt stmtsep] | ||
41 | + * [reference-stmt stmtsep] | ||
42 | + * "}" | ||
43 | + * | ||
44 | + * ANTLR grammar rule | ||
45 | + * typedefStatement : TYPEDEF_KEYWORD IDENTIFIER LEFT_CURLY_BRACE | ||
46 | + * (typeStatement | unitsStatement | defaultStatement | statusStatement | ||
47 | + * | descriptionStatement | referenceStatement)* RIGHT_CURLY_BRACE; | ||
48 | + */ | ||
49 | + | ||
50 | +import org.onosproject.yangutils.datamodel.YangContainer; | ||
51 | +import org.onosproject.yangutils.datamodel.YangList; | ||
52 | +import org.onosproject.yangutils.datamodel.YangModule; | ||
53 | +import org.onosproject.yangutils.datamodel.YangNode; | ||
54 | +import org.onosproject.yangutils.datamodel.YangSubModule; | ||
55 | +import org.onosproject.yangutils.datamodel.YangTypeDef; | ||
56 | +import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | ||
57 | +import org.onosproject.yangutils.parser.Parsable; | ||
58 | +import org.onosproject.yangutils.parser.ParsableDataType; | ||
59 | +import static org.onosproject.yangutils.parser.ParsableDataType.TYPEDEF_DATA; | ||
60 | +import static org.onosproject.yangutils.parser.ParsableDataType.UNITS_DATA; | ||
61 | +import static org.onosproject.yangutils.parser.ParsableDataType.DEFAULT_DATA; | ||
62 | +import static org.onosproject.yangutils.parser.ParsableDataType.TYPE_DATA; | ||
63 | +import static org.onosproject.yangutils.parser.ParsableDataType.DESCRIPTION_DATA; | ||
64 | +import static org.onosproject.yangutils.parser.ParsableDataType.REFERENCE_DATA; | ||
65 | +import static org.onosproject.yangutils.parser.ParsableDataType.STATUS_DATA; | ||
66 | +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | ||
67 | +import org.onosproject.yangutils.parser.exceptions.ParserException; | ||
68 | +import org.onosproject.yangutils.parser.impl.TreeWalkListener; | ||
69 | +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; | ||
70 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; | ||
71 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT; | ||
72 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage; | ||
73 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; | ||
74 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; | ||
75 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_CARDINALITY; | ||
76 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; | ||
77 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA; | ||
78 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER; | ||
79 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; | ||
80 | + | ||
81 | +/** | ||
82 | + * Implements listener based call back function corresponding to the "typedef" | ||
83 | + * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020. | ||
84 | + */ | ||
85 | +public final class TypeDefListener { | ||
86 | + | ||
87 | + private static ParsableDataType yangConstruct; | ||
88 | + | ||
89 | + /** | ||
90 | + * Creates a new typedef listener. | ||
91 | + */ | ||
92 | + private TypeDefListener() { | ||
93 | + } | ||
94 | + | ||
95 | + /** | ||
96 | + * It is called when parser enters grammar rule (typedef), it perform | ||
97 | + * validations and updates the data model tree. | ||
98 | + * | ||
99 | + * @param listener listener's object. | ||
100 | + * @param ctx context object of the grammar rule. | ||
101 | + */ | ||
102 | + public static void processTypeDefEntry(TreeWalkListener listener, | ||
103 | + GeneratedYangParser.TypedefStatementContext ctx) { | ||
104 | + | ||
105 | + // Check for stack to be non empty. | ||
106 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPEDEF_DATA, ctx.IDENTIFIER().getText(), ENTRY); | ||
107 | + | ||
108 | + boolean result = validateSubStatementsCardinality(ctx); | ||
109 | + if (!result) { | ||
110 | + throw new ParserException(constructListenerErrorMessage(INVALID_CARDINALITY, yangConstruct, "", ENTRY)); | ||
111 | + } | ||
112 | + | ||
113 | + YangTypeDef typeDefNode = new YangTypeDef(); | ||
114 | + typeDefNode.setDerivedName(ctx.IDENTIFIER().getText()); | ||
115 | + | ||
116 | + Parsable curData = listener.getParsedDataStack().peek(); | ||
117 | + | ||
118 | + if (curData instanceof YangModule | curData instanceof YangSubModule | curData instanceof YangContainer | ||
119 | + | curData instanceof YangList) { | ||
120 | + /* | ||
121 | + * TODO YangGrouping, YangRpc, YangInput, YangOutput, Notification. | ||
122 | + */ | ||
123 | + YangNode curNode = (YangNode) curData; | ||
124 | + try { | ||
125 | + curNode.addChild(typeDefNode); | ||
126 | + } catch (DataModelException e) { | ||
127 | + throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA, | ||
128 | + TYPEDEF_DATA, ctx.IDENTIFIER().getText(), ENTRY, e.getMessage())); | ||
129 | + } | ||
130 | + listener.getParsedDataStack().push(typeDefNode); | ||
131 | + } else { | ||
132 | + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, | ||
133 | + TYPEDEF_DATA, ctx.IDENTIFIER().getText(), ENTRY)); | ||
134 | + } | ||
135 | + } | ||
136 | + | ||
137 | + /** | ||
138 | + * It is called when parser exits from grammar rule (typedef), it perform | ||
139 | + * validations and updates the data model tree. | ||
140 | + * | ||
141 | + * @param listener listener's object. | ||
142 | + * @param ctx context object of the grammar rule. | ||
143 | + */ | ||
144 | + public static void processTypeDefExit(TreeWalkListener listener, | ||
145 | + GeneratedYangParser.TypedefStatementContext ctx) { | ||
146 | + | ||
147 | + // Check for stack to be non empty. | ||
148 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPEDEF_DATA, ctx.IDENTIFIER().getText(), EXIT); | ||
149 | + | ||
150 | + if (listener.getParsedDataStack().peek() instanceof YangTypeDef) { | ||
151 | + listener.getParsedDataStack().pop(); | ||
152 | + } else { | ||
153 | + listener.getErrorInformation().setErrorFlag(true); | ||
154 | + throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, TYPEDEF_DATA, | ||
155 | + ctx.IDENTIFIER().getText(), EXIT)); | ||
156 | + } | ||
157 | + } | ||
158 | + | ||
159 | + /** | ||
160 | + * Validates the cardinality of typedef sub-statements as per grammar. | ||
161 | + * | ||
162 | + * @param ctx context object of the grammar rule. | ||
163 | + * @return true/false validation success or failure. | ||
164 | + */ | ||
165 | + private static boolean validateSubStatementsCardinality(GeneratedYangParser.TypedefStatementContext ctx) { | ||
166 | + | ||
167 | + if ((!ctx.unitsStatement().isEmpty()) | ||
168 | + && (ctx.unitsStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) { | ||
169 | + yangConstruct = UNITS_DATA; | ||
170 | + return false; | ||
171 | + } | ||
172 | + | ||
173 | + if ((!ctx.defaultStatement().isEmpty()) | ||
174 | + && (ctx.defaultStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) { | ||
175 | + yangConstruct = DEFAULT_DATA; | ||
176 | + return false; | ||
177 | + } | ||
178 | + | ||
179 | + if (ctx.typeStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY) { | ||
180 | + yangConstruct = TYPE_DATA; | ||
181 | + return false; | ||
182 | + } | ||
183 | + | ||
184 | + if ((!ctx.descriptionStatement().isEmpty()) | ||
185 | + && (ctx.descriptionStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) { | ||
186 | + yangConstruct = DESCRIPTION_DATA; | ||
187 | + return false; | ||
188 | + } | ||
189 | + | ||
190 | + if ((!ctx.referenceStatement().isEmpty()) | ||
191 | + && (ctx.referenceStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) { | ||
192 | + yangConstruct = REFERENCE_DATA; | ||
193 | + return false; | ||
194 | + } | ||
195 | + | ||
196 | + if ((!ctx.statusStatement().isEmpty()) | ||
197 | + && (ctx.statusStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) { | ||
198 | + yangConstruct = STATUS_DATA; | ||
199 | + return false; | ||
200 | + } | ||
201 | + return true; | ||
202 | + } | ||
203 | +} |
... | @@ -85,7 +85,7 @@ public final class VersionListener { | ... | @@ -85,7 +85,7 @@ public final class VersionListener { |
85 | GeneratedYangParser.YangVersionStatementContext ctx) { | 85 | GeneratedYangParser.YangVersionStatementContext ctx) { |
86 | 86 | ||
87 | // Check for stack to be non empty. | 87 | // Check for stack to be non empty. |
88 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, VERSION_DATA, String.valueOf(ctx.INTEGER().getText()), ENTRY); | 88 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, VERSION_DATA, ctx.INTEGER().getText(), ENTRY); |
89 | 89 | ||
90 | Integer version = Integer.valueOf(ctx.INTEGER().getText()); | 90 | Integer version = Integer.valueOf(ctx.INTEGER().getText()); |
91 | if (!isVersionValid(version)) { | 91 | if (!isVersionValid(version)) { |
... | @@ -110,7 +110,7 @@ public final class VersionListener { | ... | @@ -110,7 +110,7 @@ public final class VersionListener { |
110 | } | 110 | } |
111 | default: | 111 | default: |
112 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, VERSION_DATA, | 112 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, VERSION_DATA, |
113 | - String.valueOf(ctx.INTEGER().getText()), ENTRY)); | 113 | + ctx.INTEGER().getText(), ENTRY)); |
114 | } | 114 | } |
115 | } | 115 | } |
116 | 116 | ... | ... |
... | @@ -1220,4 +1220,6 @@ package org.onosproject.yangutils.parser.antlrgencode; | ... | @@ -1220,4 +1220,6 @@ package org.onosproject.yangutils.parser.antlrgencode; |
1220 | defaultStatement? configStatement? mandatoryStatement? minElementsStatement? | 1220 | defaultStatement? configStatement? mandatoryStatement? minElementsStatement? |
1221 | maxElementsStatement? RIGHT_CURLY_BRACE)); | 1221 | maxElementsStatement? RIGHT_CURLY_BRACE)); |
1222 | 1222 | ||
1223 | - string : STRING (PLUS STRING)*; | 1223 | + string : STRING (PLUS STRING)* |
1224 | + | IDENTIFIER | ||
1225 | + | INTEGER; | ... | ... |
... | @@ -47,7 +47,7 @@ public class ContactListenerTest { | ... | @@ -47,7 +47,7 @@ public class ContactListenerTest { |
47 | 47 | ||
48 | YangNode node = manager.getDataModel("src/test/resources/ContactValidEntry.yang"); | 48 | YangNode node = manager.getDataModel("src/test/resources/ContactValidEntry.yang"); |
49 | 49 | ||
50 | - // Checks for the version value in data model tree. | 50 | + // Checks for the contact value in data model tree. |
51 | assertThat(((YangModule) node).getContact(), is("\"WG List: <mailto:spring@ietf.org>\nEditor: " | 51 | assertThat(((YangModule) node).getContact(), is("\"WG List: <mailto:spring@ietf.org>\nEditor: " |
52 | + "Stephane Litkowski\n " + "<mailto:stephane.litkowski@orange.com>\"")); | 52 | + "Stephane Litkowski\n " + "<mailto:stephane.litkowski@orange.com>\"")); |
53 | } | 53 | } |
... | @@ -63,6 +63,18 @@ public class ContactListenerTest { | ... | @@ -63,6 +63,18 @@ public class ContactListenerTest { |
63 | } | 63 | } |
64 | 64 | ||
65 | /** | 65 | /** |
66 | + * Checks that contact can have a string value without double quotes. | ||
67 | + */ | ||
68 | + @Test | ||
69 | + public void processContactWithoutQuotes() throws IOException, ParserException { | ||
70 | + | ||
71 | + YangNode node = manager.getDataModel("src/test/resources/ContactWithoutQuotes.yang"); | ||
72 | + | ||
73 | + // Checks for the contact value in data model tree. | ||
74 | + assertThat(((YangModule) node).getContact(), is("WG")); | ||
75 | + } | ||
76 | + | ||
77 | + /** | ||
66 | * Checks if contact is not empty. | 78 | * Checks if contact is not empty. |
67 | */ | 79 | */ |
68 | @Test(expected = ParserException.class) | 80 | @Test(expected = ParserException.class) | ... | ... |
... | @@ -80,6 +80,15 @@ public class RevisionDateListenerTest { | ... | @@ -80,6 +80,15 @@ public class RevisionDateListenerTest { |
80 | } | 80 | } |
81 | 81 | ||
82 | /** | 82 | /** |
83 | + * Checks if revision date is correct. | ||
84 | + */ | ||
85 | + @Test(expected = ParserException.class) | ||
86 | + public void processRevisionDateInvalid() throws IOException, ParserException { | ||
87 | + | ||
88 | + YangNode node = manager.getDataModel("src/test/resources/RevisionDateInvalid.yang"); | ||
89 | + } | ||
90 | + | ||
91 | + /** | ||
83 | * Checks if revision date listener updates the data model tree. | 92 | * Checks if revision date listener updates the data model tree. |
84 | */ | 93 | */ |
85 | @Test | 94 | @Test | ... | ... |
1 | +module Test { | ||
2 | +yang-version 1; | ||
3 | +namespace urn:ietf:params:xml:ns:yang:ietf-ospf; | ||
4 | +prefix test; | ||
5 | +import ietf { | ||
6 | +prefix On2; | ||
7 | +revision-date 2015-02-30; | ||
8 | +} | ||
9 | +include itut { | ||
10 | +revision-date 2016-02-03; | ||
11 | +} | ||
12 | +include sdn { | ||
13 | +revision-date 2014-02-03; | ||
14 | +} | ||
15 | +contact "Test"; | ||
16 | +organization "ONOS"; | ||
17 | +} |
-
Please register or login to post a comment