blob: 7a44d1fb273ea793d23a7508537c7e668d141c0b [file] [log] [blame]
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +05301/*
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 */
16
Gaurav Agrawal95b416c2016-06-07 14:00:26 +053017package org.onosproject.yangutils.datamodel.utils;
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053018
Bharat saraswal96dfef02016-06-16 00:29:12 +053019import java.util.regex.Pattern;
Bharat saraswal96dfef02016-06-16 00:29:12 +053020import org.onosproject.yangutils.datamodel.YangRangeInterval;
21import org.onosproject.yangutils.datamodel.YangRangeRestriction;
22import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
23import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangBuiltInDataTypeInfo;
Gaurav Agrawal72cd1b72016-06-30 13:28:14 +053024import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
25
26import static org.onosproject.yangutils.datamodel.BuiltInTypeObjectFactory.getDataObjectFromString;
27import static org.onosproject.yangutils.datamodel.utils.YangConstructType.LENGTH_DATA;
28import static org.onosproject.yangutils.datamodel.utils.YangConstructType.RANGE_DATA;
Bharat saraswal96dfef02016-06-16 00:29:12 +053029
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053030/**
31 * Represents restriction resolver which provide common utility used by parser
32 * and during linking for restriction resolution.
33 */
34public final class RestrictionResolver {
35
36 private static final String PIPE = "|";
Bharat saraswal96dfef02016-06-16 00:29:12 +053037 private static final String ADD = "+";
38 private static final String EMPTY_STRING = "";
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053039 private static final String INTERVAL = "..";
40 private static final int MAX_RANGE_BOUNDARY = 2;
41 private static final int MIN_RANGE_BOUNDARY = 1;
42 private static final String MIN_KEYWORD = "min";
43 private static final String MAX_KEYWORD = "max";
44
45 /**
46 * Creates a restriction resolver.
47 */
48 private RestrictionResolver() {
49 }
50
51 /**
52 * Processes the range restriction for parser and linker.
53 *
54 * @param refRangeRestriction range restriction of referred typedef
55 * @param lineNumber error line number
56 * @param charPositionInLine error character position in line
57 * @param hasReferredRestriction whether has referred restriction
58 * @param curRangeString caller type's range string
59 * @param effectiveType effective type, when called from linker
60 * @return YANG range restriction
Gaurav Agrawal95b416c2016-06-07 14:00:26 +053061 * @throws DataModelException a violation in data model rule
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053062 */
63 public static YangRangeRestriction processRangeRestriction(YangRangeRestriction refRangeRestriction,
Gaurav Agrawal72cd1b72016-06-30 13:28:14 +053064 int lineNumber, int charPositionInLine,
65 boolean hasReferredRestriction,
66 String curRangeString, YangDataTypes effectiveType)
Gaurav Agrawal95b416c2016-06-07 14:00:26 +053067 throws DataModelException {
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053068 YangBuiltInDataTypeInfo<?> startValue;
69 YangBuiltInDataTypeInfo<?> endValue;
70 YangRangeRestriction rangeRestriction = new YangRangeRestriction();
71
72 String rangeArgument = removeQuotesAndHandleConcat(curRangeString);
73 String[] rangeArguments = rangeArgument.trim().split(Pattern.quote(PIPE));
74
75 for (String rangePart : rangeArguments) {
76 String startInterval;
77 String endInterval;
78 YangRangeInterval rangeInterval = new YangRangeInterval();
79 String[] rangeBoundary = rangePart.trim().split(Pattern.quote(INTERVAL));
80
81 if (rangeBoundary.length > MAX_RANGE_BOUNDARY) {
Gaurav Agrawal95b416c2016-06-07 14:00:26 +053082 DataModelException dataModelException = new DataModelException("YANG file error : " +
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053083 YangConstructType.getYangConstructType(RANGE_DATA) + " " + rangeArgument +
84 " is not valid.");
Gaurav Agrawal95b416c2016-06-07 14:00:26 +053085 dataModelException.setLine(lineNumber);
86 dataModelException.setCharPosition(charPositionInLine);
87 throw dataModelException;
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053088 }
89
90 if (rangeBoundary.length == MIN_RANGE_BOUNDARY) {
janani bdd1314f2016-05-19 17:39:50 +053091 startInterval = rangeBoundary[0].trim();
92 endInterval = rangeBoundary[0].trim();
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053093 } else {
janani bdd1314f2016-05-19 17:39:50 +053094 startInterval = rangeBoundary[0].trim();
95 endInterval = rangeBoundary[1].trim();
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +053096 }
97
98 try {
99 if (hasReferredRestriction && startInterval.equals(MIN_KEYWORD)
100 && refRangeRestriction.getMinRestrictedvalue() != null) {
101 startValue = refRangeRestriction.getMinRestrictedvalue();
102 } else if (hasReferredRestriction && startInterval.equals(MAX_KEYWORD)
103 && refRangeRestriction.getMaxRestrictedvalue() != null) {
104 startValue = refRangeRestriction.getMaxRestrictedvalue();
105 } else {
106 startValue = getDataObjectFromString(startInterval, effectiveType);
107 }
108 if (hasReferredRestriction && endInterval.equals(MIN_KEYWORD)
109 && refRangeRestriction.getMinRestrictedvalue() != null) {
110 endValue = refRangeRestriction.getMinRestrictedvalue();
111 } else if (hasReferredRestriction && endInterval.equals(MAX_KEYWORD)
112 && refRangeRestriction.getMaxRestrictedvalue() != null) {
113 endValue = refRangeRestriction.getMaxRestrictedvalue();
114 } else {
115 endValue = getDataObjectFromString(endInterval, effectiveType);
116 }
Gaurav Agrawal95b416c2016-06-07 14:00:26 +0530117 } catch (Exception e) {
118 DataModelException dataModelException = new DataModelException(e.getMessage());
119 dataModelException.setLine(lineNumber);
120 dataModelException.setCharPosition(charPositionInLine);
121 throw dataModelException;
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530122 }
123
124 rangeInterval.setStartValue(startValue);
125 rangeInterval.setEndValue(endValue);
126
127 try {
128 rangeRestriction.addRangeRestrictionInterval(rangeInterval);
Gaurav Agrawal95b416c2016-06-07 14:00:26 +0530129 } catch (DataModelException dataModelException) {
130 dataModelException.setLine(lineNumber);
131 dataModelException.setCharPosition(charPositionInLine);
132 throw dataModelException;
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530133 }
134 }
135 return rangeRestriction;
136 }
137
138 /**
139 * Processes the length restriction for parser and linker.
140 *
141 * @param refLengthRestriction length restriction of referred typedef
142 * @param lineNumber error line number
143 * @param charPositionInLine error character position in line
144 * @param hasReferredRestriction whether has referred restriction
145 * @param curLengthString caller type's length string
146 * @return YANG range restriction
Gaurav Agrawal95b416c2016-06-07 14:00:26 +0530147 * @throws DataModelException a violation in data model rule
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530148 */
149 public static YangRangeRestriction processLengthRestriction(YangRangeRestriction refLengthRestriction,
Gaurav Agrawal72cd1b72016-06-30 13:28:14 +0530150 int lineNumber, int charPositionInLine,
151 boolean hasReferredRestriction,
152 String curLengthString) throws DataModelException {
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530153
154 YangBuiltInDataTypeInfo<?> startValue;
155 YangBuiltInDataTypeInfo<?> endValue;
156 YangRangeRestriction lengthRestriction = new YangRangeRestriction<>();
157
158 String rangeArgument = removeQuotesAndHandleConcat(curLengthString);
159 String[] rangeArguments = rangeArgument.trim().split(Pattern.quote(PIPE));
160
161 for (String rangePart : rangeArguments) {
162 String startInterval;
163 String endInterval;
164 YangRangeInterval rangeInterval = new YangRangeInterval<>();
165 String[] rangeBoundary = rangePart.trim().split(Pattern.quote(INTERVAL));
166
167 if (rangeBoundary.length > MAX_RANGE_BOUNDARY) {
Gaurav Agrawal95b416c2016-06-07 14:00:26 +0530168 DataModelException dataModelException = new DataModelException("YANG file error : " +
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530169 YangConstructType.getYangConstructType(LENGTH_DATA) + " " + rangeArgument +
170 " is not valid.");
Gaurav Agrawal95b416c2016-06-07 14:00:26 +0530171 dataModelException.setLine(lineNumber);
172 dataModelException.setCharPosition(charPositionInLine);
173 throw dataModelException;
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530174 }
175
176 if (rangeBoundary.length == MIN_RANGE_BOUNDARY) {
janani bdd1314f2016-05-19 17:39:50 +0530177 startInterval = rangeBoundary[0].trim();
178 endInterval = rangeBoundary[0].trim();
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530179 } else {
janani bdd1314f2016-05-19 17:39:50 +0530180 startInterval = rangeBoundary[0].trim();
181 endInterval = rangeBoundary[1].trim();
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530182 }
183
184 try {
185 if (hasReferredRestriction && startInterval.equals(MIN_KEYWORD)
186 && refLengthRestriction.getMinRestrictedvalue() != null) {
187 startValue = refLengthRestriction.getMinRestrictedvalue();
188 } else if (hasReferredRestriction && startInterval.equals(MAX_KEYWORD)
189 && refLengthRestriction.getMaxRestrictedvalue() != null) {
190 startValue = refLengthRestriction.getMaxRestrictedvalue();
191 } else {
192 startValue = getDataObjectFromString(startInterval, YangDataTypes.UINT64);
193 }
194 if (hasReferredRestriction && endInterval.equals(MIN_KEYWORD)
195 && refLengthRestriction.getMinRestrictedvalue() != null) {
196 endValue = refLengthRestriction.getMinRestrictedvalue();
197 } else if (hasReferredRestriction && endInterval.equals(MAX_KEYWORD)
198 && refLengthRestriction.getMaxRestrictedvalue() != null) {
199 endValue = refLengthRestriction.getMaxRestrictedvalue();
200 } else {
201 endValue = getDataObjectFromString(endInterval, YangDataTypes.UINT64);
202 }
Gaurav Agrawal95b416c2016-06-07 14:00:26 +0530203 } catch (Exception e) {
204 DataModelException dataModelException = new DataModelException(e.getMessage());
205 dataModelException.setLine(lineNumber);
206 dataModelException.setCharPosition(charPositionInLine);
207 throw dataModelException;
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530208 }
209
210 rangeInterval.setStartValue(startValue);
211 rangeInterval.setEndValue(endValue);
212
213 try {
214 lengthRestriction.addRangeRestrictionInterval(rangeInterval);
Gaurav Agrawal95b416c2016-06-07 14:00:26 +0530215 } catch (DataModelException dataModelException) {
216 dataModelException.setLine(lineNumber);
217 dataModelException.setCharPosition(charPositionInLine);
218 throw dataModelException;
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530219 }
220 }
221 return lengthRestriction;
222 }
223
224 /**
Gaurav Agrawal95b416c2016-06-07 14:00:26 +0530225 * Removes doubles quotes and concatenates if string has plus symbol.
226 *
227 * @param yangStringData string from yang file
228 * @return concatenated string after removing double quotes
229 */
230 private static String removeQuotesAndHandleConcat(String yangStringData) {
231
232 yangStringData = yangStringData.replace("\"", EMPTY_STRING);
233 String[] tmpData = yangStringData.split(Pattern.quote(ADD));
234 StringBuilder builder = new StringBuilder();
235 for (String yangString : tmpData) {
236 builder.append(yangString);
237 }
238 return builder.toString();
239 }
Gaurav Agrawalcfa1c412016-05-03 00:41:48 +0530240}