blob: ca36525082ecad3e062faa95441793f92a8631bc [file] [log] [blame]
Vidyashree Ramaa2f73982016-04-12 23:33:33 +05301/*
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +05302 * Copyright 2016-present Open Networking Laboratory
Vidyashree Ramaa2f73982016-04-12 23:33:33 +05303 *
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
Vidyashree Ramaa2f73982016-04-12 23:33:33 +053019import org.onosproject.yangutils.datamodel.YangDataTypes;
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053020import org.onosproject.yangutils.datamodel.YangDerivedInfo;
21import org.onosproject.yangutils.datamodel.YangPatternRestriction;
22import org.onosproject.yangutils.datamodel.YangStringRestriction;
23import org.onosproject.yangutils.datamodel.YangType;
Vidyashree Ramaa2f73982016-04-12 23:33:33 +053024import org.onosproject.yangutils.parser.Parsable;
25import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
26import org.onosproject.yangutils.parser.exceptions.ParserException;
27import org.onosproject.yangutils.parser.impl.TreeWalkListener;
28import org.onosproject.yangutils.utils.YangConstructType;
29
Vidyashree Rama1db15562016-05-17 16:16:15 +053030import static org.onosproject.yangutils.datamodel.YangDataTypes.DERIVED;
Vidyashree Ramaa2f73982016-04-12 23:33:33 +053031import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
Vidyashree Rama1db15562016-05-17 16:16:15 +053032import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
Vidyashree Ramaa2f73982016-04-12 23:33:33 +053033import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
34import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
Vidyashree Rama1db15562016-05-17 16:16:15 +053035import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
Vidyashree Ramaa2f73982016-04-12 23:33:33 +053036import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
37import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053038import static org.onosproject.yangutils.utils.YangConstructType.PATTERN_DATA;
39import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
Vidyashree Ramaa2f73982016-04-12 23:33:33 +053040
41/*
42 * Reference: RFC6020 and YANG ANTLR Grammar
43 *
44 * ABNF grammar as per RFC6020
45 * pattern-stmt = pattern-keyword sep string optsep
46 * (";" /
47 * "{" stmtsep
48 * ;; these stmts can appear in any order
49 * [error-message-stmt stmtsep]
50 * [error-app-tag-stmt stmtsep]
51 * [description-stmt stmtsep]
52 * [reference-stmt stmtsep]
53 * "}")
54 *
55 * ANTLR grammar rule
56 * patternStatement : PATTERN_KEYWORD string (STMTEND | LEFT_CURLY_BRACE commonStatements RIGHT_CURLY_BRACE);
57 */
58
59/**
60 * Represents listener based call back function corresponding to the "pattern"
61 * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
62 */
63public final class PatternRestrictionListener {
64
65 private static final String EMPTY_STRING = "";
66
67 /**
68 * Creates a new pattern restriction listener.
69 */
70 private PatternRestrictionListener() {
71 }
72
73 /**
74 * It is called when parser receives an input matching the grammar
75 * rule (pattern), performs validation and updates the data model
76 * tree.
77 *
78 * @param listener listener's object
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053079 * @param ctx context object of the grammar rule
Vidyashree Ramaa2f73982016-04-12 23:33:33 +053080 */
81 public static void processPatternRestrictionEntry(TreeWalkListener listener,
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053082 GeneratedYangParser.PatternStatementContext ctx) {
Vidyashree Ramaa2f73982016-04-12 23:33:33 +053083
84 // Check for stack to be non empty.
85 checkStackIsNotEmpty(listener, MISSING_HOLDER, PATTERN_DATA, ctx.string().getText(), ENTRY);
86
87 Parsable tmpData = listener.getParsedDataStack().peek();
88 if (tmpData.getYangConstructType() == TYPE_DATA) {
89 YangType type = (YangType) tmpData;
Vidyashree Rama1db15562016-05-17 16:16:15 +053090 setPatternRestriction(listener, type, ctx);
Vidyashree Ramaa2f73982016-04-12 23:33:33 +053091 } else {
92 throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, PATTERN_DATA,
93 ctx.string().getText(), ENTRY));
94 }
95 }
96
97 /**
98 * Sets the pattern restriction to type.
99 *
Vidyashree Rama1db15562016-05-17 16:16:15 +0530100 * @param listener listener's object
Vidyashree Ramaa2f73982016-04-12 23:33:33 +0530101 * @param type Yang type for which pattern restriction to be set
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530102 * @param ctx context object of the grammar rule
Vidyashree Ramaa2f73982016-04-12 23:33:33 +0530103 */
Vidyashree Rama1db15562016-05-17 16:16:15 +0530104 private static void setPatternRestriction(TreeWalkListener listener, YangType type,
Vidyashree Ramaa2f73982016-04-12 23:33:33 +0530105 GeneratedYangParser.PatternStatementContext ctx) {
106
Vidyashree Ramaa2f73982016-04-12 23:33:33 +0530107 if (type.getDataType() != YangDataTypes.STRING && type.getDataType() != YangDataTypes.DERIVED) {
108
109 ParserException parserException = new ParserException("YANG file error : " +
110 YangConstructType.getYangConstructType(PATTERN_DATA) + " name " + ctx.string().getText() +
111 " can be used to restrict the built-in type string or types derived from string.");
112 parserException.setLine(ctx.getStart().getLine());
113 parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
114 throw parserException;
115 }
116
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530117 String patternArgument = ctx.string().getText().replace("\"", EMPTY_STRING);
Vidyashree Ramaa2f73982016-04-12 23:33:33 +0530118
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530119 if (type.getDataType() == YangDataTypes.STRING) {
120 YangStringRestriction stringRestriction = (YangStringRestriction) type.getDataTypeExtendedInfo();
121 if (stringRestriction == null) {
122 stringRestriction = new YangStringRestriction();
Vidyashree Ramaa2f73982016-04-12 23:33:33 +0530123 type.setDataTypeExtendedInfo(stringRestriction);
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530124 stringRestriction.addPattern(patternArgument);
Vidyashree Ramaa2f73982016-04-12 23:33:33 +0530125 } else {
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530126 stringRestriction.addPattern(patternArgument);
127 }
Vidyashree Rama1db15562016-05-17 16:16:15 +0530128 listener.getParsedDataStack().push(stringRestriction);
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530129 } else {
130 YangPatternRestriction patternRestriction = (YangPatternRestriction) ((YangDerivedInfo<?>) type
131 .getDataTypeExtendedInfo()).getPatternRestriction();
132 if (patternRestriction == null) {
133 patternRestriction = new YangPatternRestriction();
134 ((YangDerivedInfo<?>) type.getDataTypeExtendedInfo()).setPatternRestriction(patternRestriction);
135 patternRestriction.addPattern(patternArgument);
136 } else {
137 ((YangDerivedInfo<?>) type.getDataTypeExtendedInfo()).setPatternRestriction(patternRestriction);
138 patternRestriction.addPattern(patternArgument);
Vidyashree Ramaa2f73982016-04-12 23:33:33 +0530139 }
140 }
Vidyashree Ramaa2f73982016-04-12 23:33:33 +0530141 }
Vidyashree Rama1db15562016-05-17 16:16:15 +0530142
143 /**
144 * Performs validation and updates the data model tree.
145 * It is called when parser exits from grammar rule (pattern).
146 *
147 * @param listener listener's object
148 * @param ctx context object of the grammar rule
149 */
150 public static void processPatternRestrictionExit(TreeWalkListener listener,
151 GeneratedYangParser.PatternStatementContext ctx) {
152
153 // Check for stack to be non empty.
154 checkStackIsNotEmpty(listener, MISSING_HOLDER, PATTERN_DATA, ctx.string().getText(), EXIT);
155
156 Parsable tmpData = listener.getParsedDataStack().peek();
157 if (tmpData instanceof YangStringRestriction) {
158 listener.getParsedDataStack().pop();
159 } else if (tmpData instanceof YangType
160 && ((YangType) tmpData).getDataType() == DERIVED) {
161 // TODO : need to handle in linker
162 } else {
163 throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, PATTERN_DATA,
164 ctx.string().getText(), EXIT));
165 }
166 }
Vidyashree Ramaa2f73982016-04-12 23:33:33 +0530167}