blob: d2af63e3a2219093fed8c1c50cf989b65b6fe3de [file] [log] [blame]
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +05301/*
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
17package 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
50import org.onosproject.yangutils.datamodel.YangContainer;
Vinod Kumar S71cba682016-02-25 15:52:16 +053051import org.onosproject.yangutils.datamodel.YangDataTypes;
52import org.onosproject.yangutils.datamodel.YangDerivedType;
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +053053import org.onosproject.yangutils.datamodel.YangList;
54import org.onosproject.yangutils.datamodel.YangModule;
55import org.onosproject.yangutils.datamodel.YangNode;
56import org.onosproject.yangutils.datamodel.YangSubModule;
Vinod Kumar S71cba682016-02-25 15:52:16 +053057import org.onosproject.yangutils.datamodel.YangType;
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +053058import org.onosproject.yangutils.datamodel.YangTypeDef;
59import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
60import org.onosproject.yangutils.parser.Parsable;
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +053061import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
62import org.onosproject.yangutils.parser.exceptions.ParserException;
63import org.onosproject.yangutils.parser.impl.TreeWalkListener;
Vinod Kumar S0c330cd2016-02-23 22:36:57 +053064
Vinod Kumar Sc4216002016-03-03 19:55:30 +053065import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
66import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
67import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
68import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
69import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_CONTENT;
70import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
71import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
72import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
73import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
74import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
75import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinality;
76import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityEqualsOne;
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +053077import static org.onosproject.yangutils.utils.YangConstructType.DEFAULT_DATA;
78import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA;
79import static org.onosproject.yangutils.utils.YangConstructType.REFERENCE_DATA;
80import static org.onosproject.yangutils.utils.YangConstructType.STATUS_DATA;
81import static org.onosproject.yangutils.utils.YangConstructType.TYPEDEF_DATA;
82import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
83import static org.onosproject.yangutils.utils.YangConstructType.UNITS_DATA;
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +053084
85/**
86 * Implements listener based call back function corresponding to the "typedef"
87 * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
88 */
89public final class TypeDefListener {
90
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +053091 /**
92 * Creates a new typedef listener.
93 */
94 private TypeDefListener() {
95 }
96
97 /**
98 * It is called when parser enters grammar rule (typedef), it perform
99 * validations and updates the data model tree.
100 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530101 * @param listener listener's object
102 * @param ctx context object of the grammar rule
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +0530103 */
104 public static void processTypeDefEntry(TreeWalkListener listener,
105 GeneratedYangParser.TypedefStatementContext ctx) {
106
107 // Check for stack to be non empty.
108 checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPEDEF_DATA, ctx.IDENTIFIER().getText(), ENTRY);
109
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530110 // Validate sub statement cardinality.
111 validateSubStatementsCardinality(ctx);
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +0530112
Vinod Kumar S71cba682016-02-25 15:52:16 +0530113 /*
114 * Create a derived type information, the base type must be set in type
115 * listener.
116 */
117 YangType<YangDerivedType> derivedType = new YangType<YangDerivedType>();
118 derivedType.setDataType(YangDataTypes.DERIVED);
119 derivedType.setDataTypeName(ctx.IDENTIFIER().getText());
120
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +0530121 YangTypeDef typeDefNode = new YangTypeDef();
Vinod Kumar S71cba682016-02-25 15:52:16 +0530122 typeDefNode.setDerivedType(derivedType);
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +0530123
124 Parsable curData = listener.getParsedDataStack().peek();
125
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530126 if (curData instanceof YangModule || curData instanceof YangSubModule || curData instanceof YangContainer
127 || curData instanceof YangList) {
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +0530128 /*
129 * TODO YangGrouping, YangRpc, YangInput, YangOutput, Notification.
130 */
131 YangNode curNode = (YangNode) curData;
132 try {
133 curNode.addChild(typeDefNode);
134 } catch (DataModelException e) {
135 throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
136 TYPEDEF_DATA, ctx.IDENTIFIER().getText(), ENTRY, e.getMessage()));
137 }
138 listener.getParsedDataStack().push(typeDefNode);
139 } else {
140 throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
141 TYPEDEF_DATA, ctx.IDENTIFIER().getText(), ENTRY));
142 }
143 }
144
145 /**
146 * It is called when parser exits from grammar rule (typedef), it perform
147 * validations and updates the data model tree.
148 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530149 * @param listener listener's object
150 * @param ctx context object of the grammar rule
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +0530151 */
152 public static void processTypeDefExit(TreeWalkListener listener,
153 GeneratedYangParser.TypedefStatementContext ctx) {
154
155 // Check for stack to be non empty.
156 checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPEDEF_DATA, ctx.IDENTIFIER().getText(), EXIT);
157
158 if (listener.getParsedDataStack().peek() instanceof YangTypeDef) {
Vinod Kumar S71cba682016-02-25 15:52:16 +0530159 YangTypeDef typeDefNode = (YangTypeDef) listener.getParsedDataStack().peek();
160 try {
161 typeDefNode.validateDataOnExit();
162 } catch (DataModelException e) {
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530163 throw new ParserException(constructListenerErrorMessage(INVALID_CONTENT, TYPEDEF_DATA,
164 ctx.IDENTIFIER().getText(), EXIT));
Vinod Kumar S71cba682016-02-25 15:52:16 +0530165 }
166
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +0530167 listener.getParsedDataStack().pop();
168 } else {
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +0530169 throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, TYPEDEF_DATA,
170 ctx.IDENTIFIER().getText(), EXIT));
171 }
172 }
173
174 /**
175 * Validates the cardinality of typedef sub-statements as per grammar.
176 *
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530177 * @param ctx context object of the grammar rule
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +0530178 */
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530179 private static void validateSubStatementsCardinality(GeneratedYangParser.TypedefStatementContext ctx) {
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +0530180
Gaurav Agrawal8e8770a2016-02-27 03:57:50 +0530181 validateCardinality(ctx.unitsStatement(), UNITS_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
182 validateCardinality(ctx.defaultStatement(), DEFAULT_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
183 validateCardinalityEqualsOne(ctx.typeStatement(), TYPE_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
184 validateCardinality(ctx.descriptionStatement(), DESCRIPTION_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
185 validateCardinality(ctx.referenceStatement(), REFERENCE_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
186 validateCardinality(ctx.statusStatement(), STATUS_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
Gaurav Agrawalb5a1c132016-02-21 02:56:46 +0530187 }
188}