blob: 4e2925a2e0f035c6fca8fb33e91eddafc1cea944 [file] [log] [blame]
Brian O'Connor7cbbbb72016-04-09 02:13:23 -07001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Gaurav Agrawalbd804472016-03-25 11:25:36 +053016package org.onosproject.yangutils.parser.impl.listeners;
17
18import org.onosproject.yangutils.datamodel.YangAugment;
19import org.onosproject.yangutils.datamodel.YangCase;
20import org.onosproject.yangutils.datamodel.YangContainer;
21import org.onosproject.yangutils.datamodel.YangGrouping;
22import org.onosproject.yangutils.datamodel.YangInput;
23import org.onosproject.yangutils.datamodel.YangList;
24import org.onosproject.yangutils.datamodel.YangModule;
25import org.onosproject.yangutils.datamodel.YangNode;
26import org.onosproject.yangutils.datamodel.YangNotification;
27import org.onosproject.yangutils.datamodel.YangOutput;
28import org.onosproject.yangutils.datamodel.YangSubModule;
29import org.onosproject.yangutils.datamodel.YangUses;
30import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
31import org.onosproject.yangutils.parser.Parsable;
32import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
33import org.onosproject.yangutils.parser.exceptions.ParserException;
34import org.onosproject.yangutils.parser.impl.TreeWalkListener;
35
36import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
37import static org.onosproject.yangutils.datamodel.utils.YangDataModelFactory.getYangUsesNode;
38import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
39import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
40import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
41import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
42import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
43import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
44import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
45import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
46import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
47import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityMaxOne;
48import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA;
49import static org.onosproject.yangutils.utils.YangConstructType.REFERENCE_DATA;
50import static org.onosproject.yangutils.utils.YangConstructType.STATUS_DATA;
51import static org.onosproject.yangutils.utils.YangConstructType.USES_DATA;
52import static org.onosproject.yangutils.utils.YangConstructType.WHEN_DATA;
53
54/*
55 * Reference: RFC6020 and YANG ANTLR Grammar
56 *
57 * ABNF grammar as per RFC6020
58 * data-def-stmt = container-stmt /
59 * leaf-stmt /
60 * leaf-list-stmt /
61 * list-stmt /
62 * choice-stmt /
63 * anyxml-stmt /
64 * uses-stmt
65 *
66 * uses-stmt = uses-keyword sep identifier-ref-arg-str optsep
67 * (";" /
68 * "{" stmtsep
69 * ;; these stmts can appear in any order
70 * [when-stmt stmtsep]
71 * *(if-feature-stmt stmtsep)
72 * [status-stmt stmtsep]
73 * [description-stmt stmtsep]
74 * [reference-stmt stmtsep]
75 * *(refine-stmt stmtsep)
76 * *(uses-augment-stmt stmtsep)
77 * "}")
78 *
79 * ANTLR grammar rule
80 * dataDefStatement : containerStatement
81 * | leafStatement
82 * | leafListStatement
83 * | listStatement
84 * | choiceStatement
85 * | usesStatement;
86 *
87 * usesStatement : USES_KEYWORD string (STMTEND | LEFT_CURLY_BRACE (whenStatement | ifFeatureStatement
88 * | statusStatement | descriptionStatement | referenceStatement | refineStatement
89 * | usesAugmentStatement)* RIGHT_CURLY_BRACE);
90 */
91
92/**
Bharat saraswald9822e92016-04-05 15:13:44 +053093 * Represents listener based call back function corresponding to the "uses"
Gaurav Agrawalbd804472016-03-25 11:25:36 +053094 * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
95 */
96public final class UsesListener {
97
98 /**
99 * Creates a new uses listener.
100 */
101 private UsesListener() {
102 }
103
104 /**
105 * It is called when parser enters grammar rule (uses), it perform
106 * validations and updates the data model tree.
107 *
108 * @param listener listener's object
109 * @param ctx context object of the grammar rule
110 */
111 public static void processUsesEntry(TreeWalkListener listener, GeneratedYangParser.UsesStatementContext ctx) {
112
113 // Check for stack to be non empty.
114 checkStackIsNotEmpty(listener, MISSING_HOLDER, USES_DATA, ctx.string().getText(), ENTRY);
115
116 // Validate sub statement cardinality.
117 validateSubStatementsCardinality(ctx);
118
119 Parsable curData = listener.getParsedDataStack().peek();
120
121 if (curData instanceof YangModule || curData instanceof YangSubModule
122 || curData instanceof YangContainer || curData instanceof YangList
123 || curData instanceof YangUses || curData instanceof YangAugment
124 || curData instanceof YangCase || curData instanceof YangGrouping
125 || curData instanceof YangInput || curData instanceof YangOutput
126 || curData instanceof YangNotification) {
127
128 YangUses usesNode = getYangUsesNode(JAVA_GENERATION);
129 usesNode.setName(ctx.string().getText());
130
131 YangNode curNode = (YangNode) curData;
132
133 try {
134 curNode.addChild(usesNode);
135 } catch (DataModelException e) {
136 throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
137 USES_DATA, ctx.string().getText(), ENTRY, e.getMessage()));
138 }
139 listener.getParsedDataStack().push(usesNode);
140 } else {
141 throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
142 USES_DATA, ctx.string().getText(), ENTRY));
143 }
144 }
145
146 /**
147 * It is called when parser exits from grammar rule (uses), it perform
148 * validations and update the data model tree.
149 *
150 * @param listener Listener's object
151 * @param ctx context object of the grammar rule
152 */
153 public static void processUsesExit(TreeWalkListener listener,
154 GeneratedYangParser.UsesStatementContext ctx) {
155
156 // Check for stack to be non empty.
157 checkStackIsNotEmpty(listener, MISSING_HOLDER, USES_DATA, ctx.string().getText(), EXIT);
158
159 if (listener.getParsedDataStack().peek() instanceof YangUses) {
160 listener.getParsedDataStack().pop();
161 } else {
162 throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, USES_DATA,
163 ctx.string().getText(), EXIT));
164 }
165 }
166
167 // TODO linker to handle collision scenarios like leaf obtained by uses, conflicts with some existing leaf.
168
169 /**
170 * Validates the cardinality of case sub-statements as per grammar.
171 *
172 * @param ctx context object of the grammar rule
173 */
174 private static void validateSubStatementsCardinality(GeneratedYangParser.UsesStatementContext ctx) {
175 validateCardinalityMaxOne(ctx.whenStatement(), WHEN_DATA, USES_DATA, ctx.string().getText());
176 validateCardinalityMaxOne(ctx.statusStatement(), STATUS_DATA, USES_DATA, ctx.string().getText());
177 validateCardinalityMaxOne(ctx.descriptionStatement(), DESCRIPTION_DATA, USES_DATA, ctx.string().getText());
178 validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA, USES_DATA, ctx.string().getText()); }
179}