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
435 additions
and
59 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. | 142 | +} |
| 107 | -} | ||
| ... | \ 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