Committed by
Gerrit Code Review
YANG string restriction listener + YANG Range restriction listener review comment fix
Change-Id: I9e7af9c67f8fbf918d4e0d8ff147a560889ff264
Showing
40 changed files
with
1860 additions
and
99 deletions
... | @@ -13,12 +13,14 @@ See the License for the specific language governing permissions and | ... | @@ -13,12 +13,14 @@ See the License for the specific language governing permissions and |
13 | limitations under the License.*/ | 13 | limitations under the License.*/ |
14 | package org.onosproject.yangutils.datamodel; | 14 | package org.onosproject.yangutils.datamodel; |
15 | 15 | ||
16 | +import org.onosproject.yangutils.utils.builtindatatype.YangBuiltInDataTypeInfo; | ||
17 | + | ||
16 | /** | 18 | /** |
17 | * Represents single interval information of a range. | 19 | * Represents single interval information of a range. |
18 | * | 20 | * |
19 | - * @param <T> range type based on the data type. | 21 | + * @param <T> range type based on the data type |
20 | */ | 22 | */ |
21 | -public class YangRangeInterval<T extends Comparable<T>> { | 23 | +public class YangRangeInterval<T extends YangBuiltInDataTypeInfo<T>> { |
22 | 24 | ||
23 | /** | 25 | /** |
24 | * Starting value of the range interval. | 26 | * Starting value of the range interval. |
... | @@ -39,7 +41,7 @@ public class YangRangeInterval<T extends Comparable<T>> { | ... | @@ -39,7 +41,7 @@ public class YangRangeInterval<T extends Comparable<T>> { |
39 | /** | 41 | /** |
40 | * Returns the starting value of the range interval. | 42 | * Returns the starting value of the range interval. |
41 | * | 43 | * |
42 | - * @return the starting value of the range interval. | 44 | + * @return the starting value of the range interval |
43 | */ | 45 | */ |
44 | public T getStartValue() { | 46 | public T getStartValue() { |
45 | return startValue; | 47 | return startValue; |
... | @@ -48,7 +50,7 @@ public class YangRangeInterval<T extends Comparable<T>> { | ... | @@ -48,7 +50,7 @@ public class YangRangeInterval<T extends Comparable<T>> { |
48 | /** | 50 | /** |
49 | * Sets the starting value of the range interval. | 51 | * Sets the starting value of the range interval. |
50 | * | 52 | * |
51 | - * @param startValue the starting value of the range interval. | 53 | + * @param startValue the starting value of the range interval |
52 | */ | 54 | */ |
53 | public void setStartValue(T startValue) { | 55 | public void setStartValue(T startValue) { |
54 | this.startValue = startValue; | 56 | this.startValue = startValue; |
... | @@ -57,7 +59,7 @@ public class YangRangeInterval<T extends Comparable<T>> { | ... | @@ -57,7 +59,7 @@ public class YangRangeInterval<T extends Comparable<T>> { |
57 | /** | 59 | /** |
58 | * Returns the last value of the range interval. | 60 | * Returns the last value of the range interval. |
59 | * | 61 | * |
60 | - * @return last value of the range interval. | 62 | + * @return last value of the range interval |
61 | */ | 63 | */ |
62 | public T getEndValue() { | 64 | public T getEndValue() { |
63 | return endValue; | 65 | return endValue; |
... | @@ -66,7 +68,7 @@ public class YangRangeInterval<T extends Comparable<T>> { | ... | @@ -66,7 +68,7 @@ public class YangRangeInterval<T extends Comparable<T>> { |
66 | /** | 68 | /** |
67 | * Sets the last value of the range interval. | 69 | * Sets the last value of the range interval. |
68 | * | 70 | * |
69 | - * @param endValue last value of the range interval. | 71 | + * @param endValue last value of the range interval |
70 | */ | 72 | */ |
71 | public void setEndValue(T endValue) { | 73 | public void setEndValue(T endValue) { |
72 | this.endValue = endValue; | 74 | this.endValue = endValue; | ... | ... |
... | @@ -20,7 +20,9 @@ import java.util.LinkedList; | ... | @@ -20,7 +20,9 @@ import java.util.LinkedList; |
20 | import java.util.List; | 20 | import java.util.List; |
21 | 21 | ||
22 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | 22 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; |
23 | +import org.onosproject.yangutils.utils.builtindatatype.YangBuiltInDataTypeInfo; | ||
23 | 24 | ||
25 | +import static org.onosproject.yangutils.utils.builtindatatype.BuiltInTypeObjectFactory.getDataObjectFromString; | ||
24 | import static com.google.common.base.Preconditions.checkNotNull; | 26 | import static com.google.common.base.Preconditions.checkNotNull; |
25 | 27 | ||
26 | /*- | 28 | /*- |
... | @@ -47,12 +49,14 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -47,12 +49,14 @@ import static com.google.common.base.Preconditions.checkNotNull; |
47 | * "max". "min" and "max" mean the minimum and maximum value accepted | 49 | * "max". "min" and "max" mean the minimum and maximum value accepted |
48 | * for the type being restricted, respectively. | 50 | * for the type being restricted, respectively. |
49 | */ | 51 | */ |
52 | + | ||
50 | /** | 53 | /** |
51 | * Represents ascending range restriction information. | 54 | * Represents ascending range restriction information. |
52 | * | 55 | * |
53 | * @param <T> range type (data type) | 56 | * @param <T> range type (data type) |
54 | */ | 57 | */ |
55 | -public class YangRangeRestriction<T extends Comparable<T>> implements YangDesc, YangReference, YangAppErrorInfo { | 58 | +public class YangRangeRestriction<T extends YangBuiltInDataTypeInfo<T>> |
59 | + implements YangDesc, YangReference, YangAppErrorInfo { | ||
56 | 60 | ||
57 | /** | 61 | /** |
58 | * Ascending list of range interval restriction. If the restriction is a | 62 | * Ascending list of range interval restriction. If the restriction is a |
... | @@ -171,6 +175,37 @@ public class YangRangeRestriction<T extends Comparable<T>> implements YangDesc, | ... | @@ -171,6 +175,37 @@ public class YangRangeRestriction<T extends Comparable<T>> implements YangDesc, |
171 | } | 175 | } |
172 | 176 | ||
173 | /** | 177 | /** |
178 | + * Check if the given value is correct as per the restriction. | ||
179 | + * | ||
180 | + * @param valueInString value | ||
181 | + * @return true, if the value is confirming to restriction, false otherwise | ||
182 | + * @throws DataModelException data model error | ||
183 | + */ | ||
184 | + public boolean isValidValueString(String valueInString) throws DataModelException { | ||
185 | + | ||
186 | + if (getAscendingRangeIntervals() == null | ||
187 | + || getAscendingRangeIntervals().size() == 0) { | ||
188 | + // Throw exception, At least one default range needs to be set in constructor or in linker. | ||
189 | + throw new DataModelException("Range interval missing in range restriction."); | ||
190 | + | ||
191 | + } | ||
192 | + | ||
193 | + YangDataTypes type = getAscendingRangeIntervals().get(0).getStartValue().getYangType(); | ||
194 | + YangBuiltInDataTypeInfo<?> value = getDataObjectFromString(valueInString, type); | ||
195 | + | ||
196 | + for (YangRangeInterval<T> interval : getAscendingRangeIntervals()) { | ||
197 | + int rangeStartCompareRes = interval.getStartValue().compareTo((T) value); | ||
198 | + int rangeEndCompareRes = interval.getEndValue().compareTo((T) value); | ||
199 | + | ||
200 | + if (rangeStartCompareRes <= 0 && rangeEndCompareRes >= 0) { | ||
201 | + return true; | ||
202 | + } | ||
203 | + } | ||
204 | + | ||
205 | + return false; | ||
206 | + } | ||
207 | + | ||
208 | + /** | ||
174 | * Returns the textual reference of the length restriction. | 209 | * Returns the textual reference of the length restriction. |
175 | * | 210 | * |
176 | * @return textual reference of the length restriction | 211 | * @return textual reference of the length restriction | ... | ... |
... | @@ -16,7 +16,7 @@ | ... | @@ -16,7 +16,7 @@ |
16 | 16 | ||
17 | package org.onosproject.yangutils.datamodel; | 17 | package org.onosproject.yangutils.datamodel; |
18 | 18 | ||
19 | -import java.math.BigInteger; | 19 | +import org.onosproject.yangutils.utils.builtindatatype.YangUint64; |
20 | 20 | ||
21 | /*- | 21 | /*- |
22 | * Reference RFC 6020. | 22 | * Reference RFC 6020. |
... | @@ -64,10 +64,11 @@ public class YangStringRestriction { | ... | @@ -64,10 +64,11 @@ public class YangStringRestriction { |
64 | * | reference | 7.19.4 | 0..1 | string | | 64 | * | reference | 7.19.4 | 0..1 | string | |
65 | * +---------------+---------+-------------+-----------------+ | 65 | * +---------------+---------+-------------+-----------------+ |
66 | */ | 66 | */ |
67 | + | ||
67 | /** | 68 | /** |
68 | * Length restriction information. | 69 | * Length restriction information. |
69 | */ | 70 | */ |
70 | - private YangRangeRestriction<BigInteger> lengthRestriction; | 71 | + private YangRangeRestriction<YangUint64> lengthRestriction; |
71 | 72 | ||
72 | /** | 73 | /** |
73 | * Effective pattern restriction for the type. | 74 | * Effective pattern restriction for the type. |
... | @@ -85,7 +86,7 @@ public class YangStringRestriction { | ... | @@ -85,7 +86,7 @@ public class YangStringRestriction { |
85 | * | 86 | * |
86 | * @return length restriction on the string data | 87 | * @return length restriction on the string data |
87 | */ | 88 | */ |
88 | - public YangRangeRestriction<BigInteger> getLengthRestriction() { | 89 | + public YangRangeRestriction<YangUint64> getLengthRestriction() { |
89 | return lengthRestriction; | 90 | return lengthRestriction; |
90 | } | 91 | } |
91 | 92 | ||
... | @@ -94,7 +95,7 @@ public class YangStringRestriction { | ... | @@ -94,7 +95,7 @@ public class YangStringRestriction { |
94 | * | 95 | * |
95 | * @param lengthRestriction length restriction on the string data | 96 | * @param lengthRestriction length restriction on the string data |
96 | */ | 97 | */ |
97 | - public void setLengthRestriction(YangRangeRestriction<BigInteger> lengthRestriction) { | 98 | + public void setLengthRestriction(YangRangeRestriction<YangUint64> lengthRestriction) { |
98 | this.lengthRestriction = lengthRestriction; | 99 | this.lengthRestriction = lengthRestriction; |
99 | } | 100 | } |
100 | 101 | ... | ... |
... | @@ -46,6 +46,7 @@ import org.onosproject.yangutils.parser.impl.listeners.InputListener; | ... | @@ -46,6 +46,7 @@ import org.onosproject.yangutils.parser.impl.listeners.InputListener; |
46 | import org.onosproject.yangutils.parser.impl.listeners.KeyListener; | 46 | import org.onosproject.yangutils.parser.impl.listeners.KeyListener; |
47 | import org.onosproject.yangutils.parser.impl.listeners.LeafListListener; | 47 | import org.onosproject.yangutils.parser.impl.listeners.LeafListListener; |
48 | import org.onosproject.yangutils.parser.impl.listeners.LeafListener; | 48 | import org.onosproject.yangutils.parser.impl.listeners.LeafListener; |
49 | +import org.onosproject.yangutils.parser.impl.listeners.LengthRestrictionListener; | ||
49 | import org.onosproject.yangutils.parser.impl.listeners.ListListener; | 50 | import org.onosproject.yangutils.parser.impl.listeners.ListListener; |
50 | import org.onosproject.yangutils.parser.impl.listeners.MandatoryListener; | 51 | import org.onosproject.yangutils.parser.impl.listeners.MandatoryListener; |
51 | import org.onosproject.yangutils.parser.impl.listeners.MaxElementsListener; | 52 | import org.onosproject.yangutils.parser.impl.listeners.MaxElementsListener; |
... | @@ -55,6 +56,7 @@ import org.onosproject.yangutils.parser.impl.listeners.NotificationListener; | ... | @@ -55,6 +56,7 @@ import org.onosproject.yangutils.parser.impl.listeners.NotificationListener; |
55 | import org.onosproject.yangutils.parser.impl.listeners.NamespaceListener; | 56 | import org.onosproject.yangutils.parser.impl.listeners.NamespaceListener; |
56 | import org.onosproject.yangutils.parser.impl.listeners.OrganizationListener; | 57 | import org.onosproject.yangutils.parser.impl.listeners.OrganizationListener; |
57 | import org.onosproject.yangutils.parser.impl.listeners.OutputListener; | 58 | import org.onosproject.yangutils.parser.impl.listeners.OutputListener; |
59 | +import org.onosproject.yangutils.parser.impl.listeners.PatternRestrictionListener; | ||
58 | import org.onosproject.yangutils.parser.impl.listeners.PositionListener; | 60 | import org.onosproject.yangutils.parser.impl.listeners.PositionListener; |
59 | import org.onosproject.yangutils.parser.impl.listeners.PrefixListener; | 61 | import org.onosproject.yangutils.parser.impl.listeners.PrefixListener; |
60 | import org.onosproject.yangutils.parser.impl.listeners.PresenceListener; | 62 | import org.onosproject.yangutils.parser.impl.listeners.PresenceListener; |
... | @@ -586,7 +588,7 @@ public class TreeWalkListener implements GeneratedYangListener { | ... | @@ -586,7 +588,7 @@ public class TreeWalkListener implements GeneratedYangListener { |
586 | 588 | ||
587 | @Override | 589 | @Override |
588 | public void enterLengthStatement(GeneratedYangParser.LengthStatementContext ctx) { | 590 | public void enterLengthStatement(GeneratedYangParser.LengthStatementContext ctx) { |
589 | - // TODO: implement the method. | 591 | + LengthRestrictionListener.processLengthRestrictionEntry(this, ctx); |
590 | } | 592 | } |
591 | 593 | ||
592 | @Override | 594 | @Override |
... | @@ -596,7 +598,7 @@ public class TreeWalkListener implements GeneratedYangListener { | ... | @@ -596,7 +598,7 @@ public class TreeWalkListener implements GeneratedYangListener { |
596 | 598 | ||
597 | @Override | 599 | @Override |
598 | public void enterPatternStatement(GeneratedYangParser.PatternStatementContext ctx) { | 600 | public void enterPatternStatement(GeneratedYangParser.PatternStatementContext ctx) { |
599 | - // TODO: implement the method. | 601 | + PatternRestrictionListener.processPatternRestrictionEntry(this, ctx); |
600 | } | 602 | } |
601 | 603 | ||
602 | @Override | 604 | @Override | ... | ... |
1 | +/* | ||
2 | + * Copyright 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 | +import java.util.regex.Pattern; | ||
20 | + | ||
21 | +import org.onosproject.yangutils.datamodel.YangRangeRestriction; | ||
22 | +import org.onosproject.yangutils.datamodel.YangRangeInterval; | ||
23 | +import org.onosproject.yangutils.datamodel.YangStringRestriction; | ||
24 | +import org.onosproject.yangutils.datamodel.YangType; | ||
25 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
26 | +import org.onosproject.yangutils.datamodel.YangDerivedInfo; | ||
27 | +import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | ||
28 | +import org.onosproject.yangutils.parser.Parsable; | ||
29 | +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | ||
30 | +import org.onosproject.yangutils.parser.exceptions.ParserException; | ||
31 | +import org.onosproject.yangutils.parser.impl.TreeWalkListener; | ||
32 | +import org.onosproject.yangutils.utils.YangConstructType; | ||
33 | +import org.onosproject.yangutils.utils.builtindatatype.DataTypeException; | ||
34 | +import org.onosproject.yangutils.utils.builtindatatype.YangBuiltInDataTypeInfo; | ||
35 | + | ||
36 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat; | ||
37 | +import static org.onosproject.yangutils.utils.YangConstructType.LENGTH_DATA; | ||
38 | +import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA; | ||
39 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; | ||
40 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage; | ||
41 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; | ||
42 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; | ||
43 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; | ||
44 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA; | ||
45 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; | ||
46 | +import static org.onosproject.yangutils.utils.builtindatatype.BuiltInTypeObjectFactory.getDataObjectFromString; | ||
47 | + | ||
48 | +/* | ||
49 | + * Reference: RFC6020 and YANG ANTLR Grammar | ||
50 | + * | ||
51 | + * ABNF grammar as per RFC6020 | ||
52 | + * length-stmt = length-keyword sep length-arg-str optsep | ||
53 | + * (";" / | ||
54 | + * "{" stmtsep | ||
55 | + * ;; these stmts can appear in any order | ||
56 | + * [error-message-stmt stmtsep] | ||
57 | + * [error-app-tag-stmt stmtsep] | ||
58 | + * [description-stmt stmtsep] | ||
59 | + * [reference-stmt stmtsep] | ||
60 | + * "}") | ||
61 | + * | ||
62 | + * | ||
63 | + * ANTLR grammar rule | ||
64 | + * lengthStatement : LENGTH_KEYWORD length | ||
65 | + * (STMTEND | LEFT_CURLY_BRACE commonStatements RIGHT_CURLY_BRACE); | ||
66 | + */ | ||
67 | + | ||
68 | +/** | ||
69 | + * Represents listener based call back function corresponding to the "length" | ||
70 | + * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020. | ||
71 | + */ | ||
72 | +public final class LengthRestrictionListener { | ||
73 | + | ||
74 | + private static final String PIPE = "|"; | ||
75 | + private static final String LENGTH_INTERVAL = ".."; | ||
76 | + | ||
77 | + /** | ||
78 | + * Creates a new length restriction listener. | ||
79 | + */ | ||
80 | + private LengthRestrictionListener() { | ||
81 | + } | ||
82 | + | ||
83 | + /** | ||
84 | + * It is called when parser receives an input matching the grammar | ||
85 | + * rule (length), performs validation and updates the data model | ||
86 | + * tree. | ||
87 | + * | ||
88 | + * @param listener listener's object | ||
89 | + * @param ctx context object of the grammar rule | ||
90 | + */ | ||
91 | + public static void processLengthRestrictionEntry(TreeWalkListener listener, | ||
92 | + GeneratedYangParser.LengthStatementContext ctx) { | ||
93 | + | ||
94 | + // Check for stack to be non empty. | ||
95 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, LENGTH_DATA, ctx.length().getText(), ENTRY); | ||
96 | + | ||
97 | + Parsable tmpData = listener.getParsedDataStack().peek(); | ||
98 | + if (tmpData.getYangConstructType() == TYPE_DATA) { | ||
99 | + YangType type = (YangType) tmpData; | ||
100 | + setLengthRestriction(type, ctx); | ||
101 | + } else { | ||
102 | + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LENGTH_DATA, | ||
103 | + ctx.length().getText(), ENTRY)); | ||
104 | + } | ||
105 | + } | ||
106 | + | ||
107 | + /** | ||
108 | + * Sets the length restriction to type. | ||
109 | + * | ||
110 | + * @param type Yang type for which length restriction to be set | ||
111 | + * @param ctx context object of the grammar rule | ||
112 | + */ | ||
113 | + private static void setLengthRestriction(YangType type, | ||
114 | + GeneratedYangParser.LengthStatementContext ctx) { | ||
115 | + | ||
116 | + YangStringRestriction stringRestriction; | ||
117 | + YangBuiltInDataTypeInfo<?> startValue, endValue; | ||
118 | + YangRangeRestriction lengthRestriction = new YangRangeRestriction<>(); | ||
119 | + | ||
120 | + if (type.getDataType() != YangDataTypes.STRING && type.getDataType() != YangDataTypes.DERIVED) { | ||
121 | + | ||
122 | + ParserException parserException = new ParserException("YANG file error : " + | ||
123 | + YangConstructType.getYangConstructType(LENGTH_DATA) + " name " + ctx.length().getText() + | ||
124 | + " can be used to restrict the built-in type string or types derived from string."); | ||
125 | + parserException.setLine(ctx.getStart().getLine()); | ||
126 | + parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
127 | + throw parserException; | ||
128 | + } | ||
129 | + | ||
130 | + if (type.getDataType() == YangDataTypes.STRING) { | ||
131 | + stringRestriction = (YangStringRestriction) type.getDataTypeExtendedInfo(); | ||
132 | + } else { | ||
133 | + stringRestriction = (YangStringRestriction) ((YangDerivedInfo<?>) type | ||
134 | + .getDataTypeExtendedInfo()).getExtendedInfo(); | ||
135 | + } | ||
136 | + | ||
137 | + if (stringRestriction == null) { | ||
138 | + stringRestriction = new YangStringRestriction(); | ||
139 | + if (type.getDataType() == YangDataTypes.STRING) { | ||
140 | + type.setDataTypeExtendedInfo(stringRestriction); | ||
141 | + } else { | ||
142 | + ((YangDerivedInfo<YangStringRestriction>) type.getDataTypeExtendedInfo()) | ||
143 | + .setExtendedInfo(stringRestriction); | ||
144 | + } | ||
145 | + } | ||
146 | + | ||
147 | + String rangeArgument = removeQuotesAndHandleConcat(ctx.length().getText()); | ||
148 | + String[] rangeArguments = rangeArgument.trim().split(Pattern.quote(PIPE)); | ||
149 | + | ||
150 | + for (String rangePart : rangeArguments) { | ||
151 | + String startInterval, endInterval; | ||
152 | + YangRangeInterval rangeInterval = new YangRangeInterval<>(); | ||
153 | + String[] rangeBoundary = rangePart.trim().split(Pattern.quote(LENGTH_INTERVAL)); | ||
154 | + | ||
155 | + if (rangeBoundary.length > 2) { | ||
156 | + ParserException parserException = new ParserException("YANG file error : " + | ||
157 | + YangConstructType.getYangConstructType(LENGTH_DATA) + " " + rangeArgument + | ||
158 | + " is not valid."); | ||
159 | + parserException.setLine(ctx.getStart().getLine()); | ||
160 | + parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
161 | + throw parserException; | ||
162 | + } | ||
163 | + | ||
164 | + if (rangeBoundary.length == 1) { | ||
165 | + startInterval = rangeBoundary[0]; | ||
166 | + endInterval = rangeBoundary[0]; | ||
167 | + } else { | ||
168 | + startInterval = rangeBoundary[0]; | ||
169 | + endInterval = rangeBoundary[1]; | ||
170 | + } | ||
171 | + | ||
172 | + try { | ||
173 | + startValue = getDataObjectFromString(startInterval, YangDataTypes.UINT64); | ||
174 | + endValue = getDataObjectFromString(endInterval, YangDataTypes.UINT64); | ||
175 | + } catch (DataTypeException e) { | ||
176 | + ParserException parserException = new ParserException(e.getMessage()); | ||
177 | + parserException.setLine(ctx.getStart().getLine()); | ||
178 | + parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
179 | + throw parserException; | ||
180 | + } | ||
181 | + | ||
182 | + rangeInterval.setStartValue(startValue); | ||
183 | + rangeInterval.setEndValue(endValue); | ||
184 | + | ||
185 | + try { | ||
186 | + lengthRestriction.addRangeRestrictionInterval(rangeInterval); | ||
187 | + } catch (DataModelException e) { | ||
188 | + ParserException parserException = new ParserException(constructExtendedListenerErrorMessage( | ||
189 | + UNHANDLED_PARSED_DATA, LENGTH_DATA, rangeArgument, ENTRY, e.getMessage())); | ||
190 | + parserException.setLine(ctx.getStart().getLine()); | ||
191 | + parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
192 | + throw parserException; | ||
193 | + } | ||
194 | + } | ||
195 | + | ||
196 | + stringRestriction.setLengthRestriction(lengthRestriction); | ||
197 | + } | ||
198 | +} |
1 | +/* | ||
2 | + * Copyright 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 | +import org.onosproject.yangutils.datamodel.YangDerivedInfo; | ||
20 | +import org.onosproject.yangutils.datamodel.YangType; | ||
21 | +import org.onosproject.yangutils.datamodel.YangStringRestriction; | ||
22 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
23 | +import org.onosproject.yangutils.parser.Parsable; | ||
24 | +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | ||
25 | +import org.onosproject.yangutils.parser.exceptions.ParserException; | ||
26 | +import org.onosproject.yangutils.parser.impl.TreeWalkListener; | ||
27 | +import org.onosproject.yangutils.utils.YangConstructType; | ||
28 | + | ||
29 | +import static org.onosproject.yangutils.utils.YangConstructType.PATTERN_DATA; | ||
30 | +import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA; | ||
31 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; | ||
32 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; | ||
33 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; | ||
34 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; | ||
35 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; | ||
36 | + | ||
37 | +/* | ||
38 | + * Reference: RFC6020 and YANG ANTLR Grammar | ||
39 | + * | ||
40 | + * ABNF grammar as per RFC6020 | ||
41 | + * pattern-stmt = pattern-keyword sep string optsep | ||
42 | + * (";" / | ||
43 | + * "{" stmtsep | ||
44 | + * ;; these stmts can appear in any order | ||
45 | + * [error-message-stmt stmtsep] | ||
46 | + * [error-app-tag-stmt stmtsep] | ||
47 | + * [description-stmt stmtsep] | ||
48 | + * [reference-stmt stmtsep] | ||
49 | + * "}") | ||
50 | + * | ||
51 | + * ANTLR grammar rule | ||
52 | + * patternStatement : PATTERN_KEYWORD string (STMTEND | LEFT_CURLY_BRACE commonStatements RIGHT_CURLY_BRACE); | ||
53 | + */ | ||
54 | + | ||
55 | +/** | ||
56 | + * Represents listener based call back function corresponding to the "pattern" | ||
57 | + * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020. | ||
58 | + */ | ||
59 | +public final class PatternRestrictionListener { | ||
60 | + | ||
61 | + private static final String EMPTY_STRING = ""; | ||
62 | + | ||
63 | + /** | ||
64 | + * Creates a new pattern restriction listener. | ||
65 | + */ | ||
66 | + private PatternRestrictionListener() { | ||
67 | + } | ||
68 | + | ||
69 | + /** | ||
70 | + * It is called when parser receives an input matching the grammar | ||
71 | + * rule (pattern), performs validation and updates the data model | ||
72 | + * tree. | ||
73 | + * | ||
74 | + * @param listener listener's object | ||
75 | + * @param ctx context object of the grammar rule | ||
76 | + */ | ||
77 | + public static void processPatternRestrictionEntry(TreeWalkListener listener, | ||
78 | + GeneratedYangParser.PatternStatementContext ctx) { | ||
79 | + | ||
80 | + // Check for stack to be non empty. | ||
81 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, PATTERN_DATA, ctx.string().getText(), ENTRY); | ||
82 | + | ||
83 | + Parsable tmpData = listener.getParsedDataStack().peek(); | ||
84 | + if (tmpData.getYangConstructType() == TYPE_DATA) { | ||
85 | + YangType type = (YangType) tmpData; | ||
86 | + setPatternRestriction(type, ctx); | ||
87 | + } else { | ||
88 | + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, PATTERN_DATA, | ||
89 | + ctx.string().getText(), ENTRY)); | ||
90 | + } | ||
91 | + } | ||
92 | + | ||
93 | + /** | ||
94 | + * Sets the pattern restriction to type. | ||
95 | + * | ||
96 | + * @param type Yang type for which pattern restriction to be set | ||
97 | + * @param ctx context object of the grammar rule | ||
98 | + */ | ||
99 | + private static void setPatternRestriction(YangType type, | ||
100 | + GeneratedYangParser.PatternStatementContext ctx) { | ||
101 | + | ||
102 | + YangStringRestriction stringRestriction; | ||
103 | + | ||
104 | + if (type.getDataType() != YangDataTypes.STRING && type.getDataType() != YangDataTypes.DERIVED) { | ||
105 | + | ||
106 | + ParserException parserException = new ParserException("YANG file error : " + | ||
107 | + YangConstructType.getYangConstructType(PATTERN_DATA) + " name " + ctx.string().getText() + | ||
108 | + " can be used to restrict the built-in type string or types derived from string."); | ||
109 | + parserException.setLine(ctx.getStart().getLine()); | ||
110 | + parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
111 | + throw parserException; | ||
112 | + } | ||
113 | + | ||
114 | + if (type.getDataType() == YangDataTypes.STRING) { | ||
115 | + stringRestriction = (YangStringRestriction) type.getDataTypeExtendedInfo(); | ||
116 | + } else { | ||
117 | + stringRestriction = (YangStringRestriction) ((YangDerivedInfo<?>) type | ||
118 | + .getDataTypeExtendedInfo()).getExtendedInfo(); | ||
119 | + } | ||
120 | + | ||
121 | + if (stringRestriction == null) { | ||
122 | + stringRestriction = new YangStringRestriction(); | ||
123 | + if (type.getDataType() == YangDataTypes.STRING) { | ||
124 | + type.setDataTypeExtendedInfo(stringRestriction); | ||
125 | + } else { | ||
126 | + ((YangDerivedInfo<YangStringRestriction>) type.getDataTypeExtendedInfo()) | ||
127 | + .setExtendedInfo(stringRestriction); | ||
128 | + } | ||
129 | + } | ||
130 | + | ||
131 | + String patternArgument = ctx.string().getText().replace("\"", EMPTY_STRING); | ||
132 | + stringRestriction.addPattern(patternArgument); | ||
133 | + } | ||
134 | +} |
... | @@ -16,29 +16,33 @@ | ... | @@ -16,29 +16,33 @@ |
16 | 16 | ||
17 | package org.onosproject.yangutils.parser.impl.listeners; | 17 | package org.onosproject.yangutils.parser.impl.listeners; |
18 | 18 | ||
19 | -import java.math.BigInteger; | ||
20 | import java.util.regex.Pattern; | 19 | import java.util.regex.Pattern; |
21 | 20 | ||
22 | -import org.onosproject.yangutils.datamodel.YangType; | ||
23 | -import org.onosproject.yangutils.datamodel.YangRangeRestriction; | ||
24 | import org.onosproject.yangutils.datamodel.YangRangeInterval; | 21 | import org.onosproject.yangutils.datamodel.YangRangeInterval; |
25 | -import org.onosproject.yangutils.datamodel.YangDataTypes; | 22 | +import org.onosproject.yangutils.datamodel.YangRangeRestriction; |
23 | +import org.onosproject.yangutils.datamodel.YangType; | ||
24 | +import org.onosproject.yangutils.datamodel.YangDerivedInfo; | ||
26 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | 25 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; |
26 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
27 | import org.onosproject.yangutils.parser.Parsable; | 27 | import org.onosproject.yangutils.parser.Parsable; |
28 | import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | 28 | import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; |
29 | import org.onosproject.yangutils.parser.exceptions.ParserException; | 29 | import org.onosproject.yangutils.parser.exceptions.ParserException; |
30 | import org.onosproject.yangutils.parser.impl.TreeWalkListener; | 30 | import org.onosproject.yangutils.parser.impl.TreeWalkListener; |
31 | +import org.onosproject.yangutils.utils.YangConstructType; | ||
32 | +import org.onosproject.yangutils.utils.builtindatatype.DataTypeException; | ||
33 | +import org.onosproject.yangutils.utils.builtindatatype.YangBuiltInDataTypeInfo; | ||
31 | 34 | ||
32 | -import static org.onosproject.yangutils.utils.YangConstructType.RANGE_DATA; | ||
33 | -import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA; | ||
34 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; | 35 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; |
35 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage; | 36 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage; |
36 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; | 37 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; |
37 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; | 38 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; |
38 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; | 39 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; |
39 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA; | 40 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA; |
40 | -import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; | ||
41 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat; | 41 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat; |
42 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; | ||
43 | +import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA; | ||
44 | +import static org.onosproject.yangutils.utils.YangConstructType.RANGE_DATA; | ||
45 | +import static org.onosproject.yangutils.utils.builtindatatype.BuiltInTypeObjectFactory.getDataObjectFromString; | ||
42 | 46 | ||
43 | /* | 47 | /* |
44 | * Reference: RFC6020 and YANG ANTLR Grammar | 48 | * Reference: RFC6020 and YANG ANTLR Grammar |
... | @@ -78,8 +82,8 @@ public final class RangeRestrictionListener { | ... | @@ -78,8 +82,8 @@ public final class RangeRestrictionListener { |
78 | * rule (range), performs validation and updates the data model | 82 | * rule (range), performs validation and updates the data model |
79 | * tree. | 83 | * tree. |
80 | * | 84 | * |
81 | - * @param listener listener's object. | 85 | + * @param listener listener's object |
82 | - * @param ctx context object of the grammar rule. | 86 | + * @param ctx context object of the grammar rule |
83 | */ | 87 | */ |
84 | public static void processRangeRestrictionEntry(TreeWalkListener listener, | 88 | public static void processRangeRestrictionEntry(TreeWalkListener listener, |
85 | GeneratedYangParser.RangeStatementContext ctx) { | 89 | GeneratedYangParser.RangeStatementContext ctx) { |
... | @@ -100,69 +104,72 @@ public final class RangeRestrictionListener { | ... | @@ -100,69 +104,72 @@ public final class RangeRestrictionListener { |
100 | /** | 104 | /** |
101 | * Sets the range restriction to type. | 105 | * Sets the range restriction to type. |
102 | * | 106 | * |
103 | - * @param type YANG type for which range restriction to be added. | 107 | + * @param type YANG type for which range restriction to be added |
104 | - * @param ctx context object of the grammar rule. | 108 | + * @param ctx context object of the grammar rule |
105 | */ | 109 | */ |
106 | private static void setRangeRestriction(YangType type, | 110 | private static void setRangeRestriction(YangType type, |
107 | GeneratedYangParser.RangeStatementContext ctx) { | 111 | GeneratedYangParser.RangeStatementContext ctx) { |
108 | - YangRangeRestriction<?> rangeRestriction = null; | 112 | + |
109 | - YangRangeInterval rangeInterval; | 113 | + YangBuiltInDataTypeInfo<?> startValue, endValue; |
114 | + YangRangeRestriction rangeRestriction = new YangRangeRestriction(); | ||
110 | 115 | ||
111 | String rangeArgument = removeQuotesAndHandleConcat(ctx.range().getText()); | 116 | String rangeArgument = removeQuotesAndHandleConcat(ctx.range().getText()); |
112 | String[] rangeArguments = rangeArgument.trim().split(Pattern.quote(PIPE)); | 117 | String[] rangeArguments = rangeArgument.trim().split(Pattern.quote(PIPE)); |
113 | 118 | ||
114 | for (String rangePart : rangeArguments) { | 119 | for (String rangePart : rangeArguments) { |
120 | + String startInterval, endInterval; | ||
121 | + YangRangeInterval rangeInterval = new YangRangeInterval(); | ||
115 | String[] rangeBoundary = rangePart.trim().split(Pattern.quote(RANGE_INTERVAL)); | 122 | String[] rangeBoundary = rangePart.trim().split(Pattern.quote(RANGE_INTERVAL)); |
116 | 123 | ||
117 | - if (rangeBoundary.length == 1) { | 124 | + if (rangeBoundary.length > 2) { |
118 | - rangeBoundary[1] = rangeBoundary[0]; | 125 | + ParserException parserException = new ParserException("YANG file error : " + |
126 | + YangConstructType.getYangConstructType(RANGE_DATA) + " " + rangeArgument + | ||
127 | + " is not valid."); | ||
128 | + parserException.setLine(ctx.getStart().getLine()); | ||
129 | + parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
130 | + throw parserException; | ||
119 | } | 131 | } |
120 | 132 | ||
121 | - if (type.getDataType() == YangDataTypes.INT8) { | 133 | + if (rangeBoundary.length == 1) { |
122 | - rangeRestriction = new YangRangeRestriction<Byte>(); | 134 | + startInterval = rangeBoundary[0]; |
123 | - rangeInterval = new YangRangeInterval<Byte>(); | 135 | + endInterval = rangeBoundary[0]; |
124 | - rangeInterval.setStartValue(Byte.parseByte(rangeBoundary[0])); | ||
125 | - rangeInterval.setEndValue(Byte.parseByte(rangeBoundary[1])); | ||
126 | - } else if ((type.getDataType() == YangDataTypes.INT16) | ||
127 | - || (type.getDataType() == YangDataTypes.UINT8)) { | ||
128 | - rangeRestriction = new YangRangeRestriction<Short>(); | ||
129 | - rangeInterval = new YangRangeInterval<Short>(); | ||
130 | - rangeInterval.setStartValue(Short.parseShort(rangeBoundary[0])); | ||
131 | - rangeInterval.setEndValue(Short.parseShort(rangeBoundary[1])); | ||
132 | - } else if ((type.getDataType() == YangDataTypes.INT32) | ||
133 | - || (type.getDataType() == YangDataTypes.UINT16)) { | ||
134 | - rangeRestriction = new YangRangeRestriction<Integer>(); | ||
135 | - rangeInterval = new YangRangeInterval<Integer>(); | ||
136 | - rangeInterval.setStartValue(Integer.parseInt(rangeBoundary[0])); | ||
137 | - rangeInterval.setEndValue(Integer.parseInt(rangeBoundary[1])); | ||
138 | - } else if ((type.getDataType() == YangDataTypes.INT64) | ||
139 | - || (type.getDataType() == YangDataTypes.UINT32)) { | ||
140 | - rangeRestriction = new YangRangeRestriction<Long>(); | ||
141 | - rangeInterval = new YangRangeInterval<Long>(); | ||
142 | - rangeInterval.setStartValue(Long.parseLong(rangeBoundary[0])); | ||
143 | - rangeInterval.setEndValue(Long.parseLong(rangeBoundary[1])); | ||
144 | - } else if (type.getDataType() == YangDataTypes.UINT64) { | ||
145 | - rangeRestriction = new YangRangeRestriction<BigInteger>(); | ||
146 | - rangeInterval = new YangRangeInterval<BigInteger>(); | ||
147 | - rangeInterval.setStartValue(new BigInteger(rangeBoundary[0])); | ||
148 | - rangeInterval.setEndValue(new BigInteger(rangeBoundary[0])); | ||
149 | } else { | 136 | } else { |
150 | - //TODO: support derived for base built in type of string | 137 | + startInterval = rangeBoundary[0]; |
151 | - throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, RANGE_DATA, | 138 | + endInterval = rangeBoundary[1]; |
152 | - rangeArgument, ENTRY)); | ||
153 | } | 139 | } |
154 | 140 | ||
155 | try { | 141 | try { |
142 | + startValue = getDataObjectFromString(startInterval, type.getDataType()); | ||
143 | + endValue = getDataObjectFromString(endInterval, type.getDataType()); | ||
144 | + } catch (DataTypeException e) { | ||
145 | + ParserException parserException = new ParserException(e.getMessage()); | ||
146 | + parserException.setLine(ctx.getStart().getLine()); | ||
147 | + parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
148 | + throw parserException; | ||
149 | + } | ||
150 | + | ||
151 | + rangeInterval.setStartValue(startValue); | ||
152 | + rangeInterval.setEndValue(endValue); | ||
153 | + | ||
154 | + try { | ||
156 | rangeRestriction.addRangeRestrictionInterval(rangeInterval); | 155 | rangeRestriction.addRangeRestrictionInterval(rangeInterval); |
157 | } catch (DataModelException e) { | 156 | } catch (DataModelException e) { |
158 | - throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA, RANGE_DATA, | 157 | + ParserException parserException = new ParserException(constructExtendedListenerErrorMessage( |
159 | - rangeArgument, ENTRY, e.getMessage())); | 158 | + UNHANDLED_PARSED_DATA, RANGE_DATA, rangeArgument, ENTRY, e.getMessage())); |
159 | + parserException.setLine(ctx.getStart().getLine()); | ||
160 | + parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
161 | + throw parserException; | ||
160 | } | 162 | } |
161 | } | 163 | } |
162 | 164 | ||
163 | if (rangeRestriction != null) { | 165 | if (rangeRestriction != null) { |
166 | + if (type.getDataType() == YangDataTypes.DERIVED) { | ||
167 | + ((YangDerivedInfo<YangRangeRestriction>) type.getDataTypeExtendedInfo()) | ||
168 | + .setExtendedInfo(rangeRestriction); | ||
169 | + } else { | ||
164 | type.setDataTypeExtendedInfo(rangeRestriction); | 170 | type.setDataTypeExtendedInfo(rangeRestriction); |
165 | } | 171 | } |
172 | + } | ||
166 | 173 | ||
167 | } | 174 | } |
168 | } | 175 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -98,36 +98,6 @@ public final class TypeListener { | ... | @@ -98,36 +98,6 @@ public final class TypeListener { |
98 | type.setNodeIdentifier(nodeIdentifier); | 98 | type.setNodeIdentifier(nodeIdentifier); |
99 | type.setDataType(yangDataTypes); | 99 | type.setDataType(yangDataTypes); |
100 | 100 | ||
101 | - // Push the type to the stack. | ||
102 | - listener.getParsedDataStack().push(type); | ||
103 | - } | ||
104 | - | ||
105 | - /** | ||
106 | - * It is called when parser exits from grammar rule (type), it perform | ||
107 | - * validations and update the data model tree. | ||
108 | - * | ||
109 | - * @param listener Listener's object | ||
110 | - * @param ctx context object of the grammar rule | ||
111 | - */ | ||
112 | - public static void processTypeExit(TreeWalkListener listener, | ||
113 | - GeneratedYangParser.TypeStatementContext ctx) { | ||
114 | - | ||
115 | - // Check for stack to be non empty. | ||
116 | - checkStackIsNotEmpty(listener, MISSING_CURRENT_HOLDER, TYPE_DATA, ctx.string().getText(), EXIT); | ||
117 | - | ||
118 | - Parsable parsableType = listener.getParsedDataStack().pop(); | ||
119 | - if (!(parsableType instanceof YangType)) { | ||
120 | - throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA, | ||
121 | - ctx.string().getText(), EXIT)); | ||
122 | - } | ||
123 | - | ||
124 | - YangType<?> type = (YangType<?>) parsableType; | ||
125 | - | ||
126 | - // Check for stack to be non empty. | ||
127 | - checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPE_DATA, ctx.string().getText(), EXIT); | ||
128 | - | ||
129 | - YangDataTypes yangDataTypes = YangDataTypes.getType(ctx.string().getText()); | ||
130 | - | ||
131 | int errorLine = ctx.getStart().getLine(); | 101 | int errorLine = ctx.getStart().getLine(); |
132 | int errorPosition = ctx.getStart().getCharPositionInLine(); | 102 | int errorPosition = ctx.getStart().getCharPositionInLine(); |
133 | 103 | ||
... | @@ -242,12 +212,35 @@ public final class TypeListener { | ... | @@ -242,12 +212,35 @@ public final class TypeListener { |
242 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA, | 212 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA, |
243 | ctx.string().getText(), EXIT)); | 213 | ctx.string().getText(), EXIT)); |
244 | } | 214 | } |
215 | + | ||
216 | + // Push the type to the stack. | ||
217 | + listener.getParsedDataStack().push(type); | ||
218 | + } | ||
219 | + | ||
220 | + /** | ||
221 | + * It is called when parser exits from grammar rule (type), it perform | ||
222 | + * validations and update the data model tree. | ||
223 | + * | ||
224 | + * @param listener Listener's object | ||
225 | + * @param ctx context object of the grammar rule | ||
226 | + */ | ||
227 | + public static void processTypeExit(TreeWalkListener listener, | ||
228 | + GeneratedYangParser.TypeStatementContext ctx) { | ||
229 | + | ||
230 | + // Check for stack to be non empty. | ||
231 | + checkStackIsNotEmpty(listener, MISSING_CURRENT_HOLDER, TYPE_DATA, ctx.string().getText(), EXIT); | ||
232 | + | ||
233 | + Parsable parsableType = listener.getParsedDataStack().pop(); | ||
234 | + if (!(parsableType instanceof YangType)) { | ||
235 | + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA, | ||
236 | + ctx.string().getText(), EXIT)); | ||
237 | + } | ||
245 | } | 238 | } |
246 | 239 | ||
247 | /** | 240 | /** |
248 | - * Add to resolution list. | 241 | + * Adds to resolution list. |
249 | * | 242 | * |
250 | - * @param resolutionInfo resolution information. | 243 | + * @param resolutionInfo resolution information |
251 | * @param ctx context object of the grammar rule | 244 | * @param ctx context object of the grammar rule |
252 | */ | 245 | */ |
253 | private static void addToResolutionList(YangResolutionInfo<YangType> resolutionInfo, | 246 | private static void addToResolutionList(YangResolutionInfo<YangType> resolutionInfo, | ... | ... |
... | @@ -277,7 +277,17 @@ public enum YangConstructType { | ... | @@ -277,7 +277,17 @@ public enum YangConstructType { |
277 | /** | 277 | /** |
278 | * Identifies the YANG range element parsed data. | 278 | * Identifies the YANG range element parsed data. |
279 | */ | 279 | */ |
280 | - RANGE_DATA; | 280 | + RANGE_DATA, |
281 | + | ||
282 | + /** | ||
283 | + * Identifies the YANG length element parsed data. | ||
284 | + */ | ||
285 | + LENGTH_DATA, | ||
286 | + | ||
287 | + /** | ||
288 | + * Identifies the YANG pattern element parsed data. | ||
289 | + */ | ||
290 | + PATTERN_DATA; | ||
281 | 291 | ||
282 | /** | 292 | /** |
283 | * Returns the YANG construct keyword corresponding to enum values. | 293 | * Returns the YANG construct keyword corresponding to enum values. |
... | @@ -392,6 +402,10 @@ public enum YangConstructType { | ... | @@ -392,6 +402,10 @@ public enum YangConstructType { |
392 | return "union"; | 402 | return "union"; |
393 | case RANGE_DATA: | 403 | case RANGE_DATA: |
394 | return "range"; | 404 | return "range"; |
405 | + case LENGTH_DATA: | ||
406 | + return "length"; | ||
407 | + case PATTERN_DATA: | ||
408 | + return "pattern"; | ||
395 | default: | 409 | default: |
396 | return "yang"; | 410 | return "yang"; |
397 | } | 411 | } | ... | ... |
1 | +/*- | ||
2 | + * Copyright 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 | +package org.onosproject.yangutils.utils.builtindatatype; | ||
17 | + | ||
18 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
19 | + | ||
20 | +/** | ||
21 | + * Factory to create an object of required type. | ||
22 | + */ | ||
23 | +public final class BuiltInTypeObjectFactory { | ||
24 | + | ||
25 | + /** | ||
26 | + * Utility factory class, hence the object creation is forbidden. | ||
27 | + */ | ||
28 | + private BuiltInTypeObjectFactory() { | ||
29 | + } | ||
30 | + | ||
31 | + /** | ||
32 | + * Given the value represented in string return the corresponding types | ||
33 | + * object with the value initialized. | ||
34 | + * | ||
35 | + * @param valueInStr value represented in string | ||
36 | + * @param builtInType built in data type | ||
37 | + * @return the target data type object with the value initialized | ||
38 | + * @param <T> the data type of the target object | ||
39 | + */ | ||
40 | + public static <T extends YangBuiltInDataTypeInfo<?>> T getDataObjectFromString(String valueInStr, | ||
41 | + YangDataTypes builtInType) { | ||
42 | + | ||
43 | + switch (builtInType) { | ||
44 | + case INT8: { | ||
45 | + return (T) new YangInt8(valueInStr); | ||
46 | + } | ||
47 | + case INT16: { | ||
48 | + return (T) new YangInt16(valueInStr); | ||
49 | + } | ||
50 | + case INT32: { | ||
51 | + return (T) new YangInt32(valueInStr); | ||
52 | + } | ||
53 | + case INT64: { | ||
54 | + return (T) new YangInt64(valueInStr); | ||
55 | + } | ||
56 | + case UINT8: { | ||
57 | + return (T) new YangUint8(valueInStr); | ||
58 | + } | ||
59 | + case UINT16: { | ||
60 | + return (T) new YangUint16(valueInStr); | ||
61 | + } | ||
62 | + case UINT32: { | ||
63 | + return (T) new YangUint32(valueInStr); | ||
64 | + } | ||
65 | + case UINT64: { | ||
66 | + return (T) new YangUint64(valueInStr); | ||
67 | + } | ||
68 | + default: { | ||
69 | + throw new DataTypeException("YANG file error : Unsupported data type"); | ||
70 | + } | ||
71 | + } | ||
72 | + | ||
73 | + } | ||
74 | + | ||
75 | +} |
utils/yangutils/src/main/java/org/onosproject/yangutils/utils/builtindatatype/DataTypeException.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 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.utils.builtindatatype; | ||
18 | + | ||
19 | +/** | ||
20 | + * Base class for exceptions in data type. | ||
21 | + */ | ||
22 | +public class DataTypeException extends RuntimeException { | ||
23 | + | ||
24 | + private static final long serialVersionUID = 20160211L; | ||
25 | + | ||
26 | + /** | ||
27 | + * Create a new data type exception. | ||
28 | + */ | ||
29 | + public DataTypeException() { | ||
30 | + super(); | ||
31 | + } | ||
32 | + | ||
33 | + /** | ||
34 | + * Creates a new data type exception with given message. | ||
35 | + * | ||
36 | + * @param message the detail of exception in string | ||
37 | + */ | ||
38 | + public DataTypeException(String message) { | ||
39 | + super(message); | ||
40 | + } | ||
41 | + | ||
42 | + /** | ||
43 | + * Creates a new data type exception from given message and cause. | ||
44 | + * | ||
45 | + * @param message the detail of exception in string | ||
46 | + * @param cause underlying cause of the error | ||
47 | + */ | ||
48 | + public DataTypeException(final String message, final Throwable cause) { | ||
49 | + super(message, cause); | ||
50 | + } | ||
51 | + | ||
52 | + /** | ||
53 | + * Creates a new data type exception from cause. | ||
54 | + * | ||
55 | + * @param cause underlying cause of the error | ||
56 | + */ | ||
57 | + public DataTypeException(final Throwable cause) { | ||
58 | + super(cause); | ||
59 | + } | ||
60 | + | ||
61 | +} |
1 | +/* | ||
2 | + * Copyright 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 | +package org.onosproject.yangutils.utils.builtindatatype; | ||
17 | + | ||
18 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
19 | + | ||
20 | +/** | ||
21 | + * Represents the list of utility functions to be supported by YANG built in | ||
22 | + * data type implementations. | ||
23 | + * | ||
24 | + * @param <T> The target data type | ||
25 | + */ | ||
26 | +public interface YangBuiltInDataTypeInfo<T> extends Comparable<T> { | ||
27 | + | ||
28 | + /** | ||
29 | + * Returns the YANG built in type. | ||
30 | + * | ||
31 | + * @return the YANG built in type | ||
32 | + */ | ||
33 | + YangDataTypes getYangType(); | ||
34 | +} |
utils/yangutils/src/main/java/org/onosproject/yangutils/utils/builtindatatype/YangInt16.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 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 | +package org.onosproject.yangutils.utils.builtindatatype; | ||
17 | + | ||
18 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
19 | + | ||
20 | + | ||
21 | +/** | ||
22 | + * Handles the YANG's int16 data type processing. | ||
23 | + * | ||
24 | + * int16 represents integer values between -32768 and 32767, inclusively. | ||
25 | + */ | ||
26 | +public class YangInt16 implements YangBuiltInDataTypeInfo<YangInt16> { | ||
27 | + | ||
28 | + /** | ||
29 | + * YANG's min keyword. | ||
30 | + */ | ||
31 | + private static final String MIN_KEYWORD = "min"; | ||
32 | + | ||
33 | + /** | ||
34 | + * YANG's max keyword. | ||
35 | + */ | ||
36 | + private static final String MAX_KEYWORD = "max"; | ||
37 | + | ||
38 | + /** | ||
39 | + * Valid minimum value of YANG's int16. | ||
40 | + */ | ||
41 | + public static final short MIN_VALUE = -32768; | ||
42 | + | ||
43 | + /** | ||
44 | + * Valid maximum value of YANG's int16. | ||
45 | + */ | ||
46 | + public static final short MAX_VALUE = 32767; | ||
47 | + | ||
48 | + /** | ||
49 | + * The value of YANG's int16. | ||
50 | + */ | ||
51 | + private final short value; | ||
52 | + | ||
53 | + /** | ||
54 | + * Creates an object with the value initialized with value represented in | ||
55 | + * string. | ||
56 | + * | ||
57 | + * @param valueInString value of the object in string | ||
58 | + */ | ||
59 | + public YangInt16(String valueInString) { | ||
60 | + | ||
61 | + if (valueInString.matches(MIN_KEYWORD)) { | ||
62 | + value = MIN_VALUE; | ||
63 | + } else if (valueInString.matches(MAX_KEYWORD)) { | ||
64 | + value = MAX_VALUE; | ||
65 | + } else { | ||
66 | + try { | ||
67 | + value = Short.parseShort(valueInString); | ||
68 | + } catch (Exception e) { | ||
69 | + throw new DataTypeException("YANG file error : " + valueInString + " is not valid."); | ||
70 | + } | ||
71 | + } | ||
72 | + } | ||
73 | + | ||
74 | + /** | ||
75 | + * Returns YANG's int16 value. | ||
76 | + * | ||
77 | + * @return value of YANG's int16 | ||
78 | + */ | ||
79 | + public short getValue() { | ||
80 | + return value; | ||
81 | + } | ||
82 | + | ||
83 | + @Override | ||
84 | + public int compareTo(YangInt16 anotherYangInt16) { | ||
85 | + return Short.compare(value, anotherYangInt16.value); | ||
86 | + } | ||
87 | + | ||
88 | + @Override | ||
89 | + public YangDataTypes getYangType() { | ||
90 | + return YangDataTypes.INT16; | ||
91 | + } | ||
92 | + | ||
93 | +} |
utils/yangutils/src/main/java/org/onosproject/yangutils/utils/builtindatatype/YangInt32.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 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 | +package org.onosproject.yangutils.utils.builtindatatype; | ||
17 | + | ||
18 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
19 | + | ||
20 | +/** | ||
21 | + * Handles the YANG's int32 data type processing. | ||
22 | + * | ||
23 | + * int32 represents integer values between -2147483648 and 2147483647, inclusively. | ||
24 | + */ | ||
25 | +public class YangInt32 implements YangBuiltInDataTypeInfo<YangInt32> { | ||
26 | + | ||
27 | + /** | ||
28 | + * YANG's min keyword. | ||
29 | + */ | ||
30 | + private static final String MIN_KEYWORD = "min"; | ||
31 | + | ||
32 | + /** | ||
33 | + * YANG's max keyword. | ||
34 | + */ | ||
35 | + private static final String MAX_KEYWORD = "max"; | ||
36 | + | ||
37 | + /** | ||
38 | + * Valid minimum value of YANG's int32. | ||
39 | + */ | ||
40 | + public static final int MIN_VALUE = -2147483648; | ||
41 | + | ||
42 | + /** | ||
43 | + * Valid maximum value of YANG's int32. | ||
44 | + */ | ||
45 | + public static final int MAX_VALUE = 2147483647; | ||
46 | + | ||
47 | + /** | ||
48 | + * The value of YANG's int32. | ||
49 | + */ | ||
50 | + private final int value; | ||
51 | + | ||
52 | + /** | ||
53 | + * Creates an object with the value initialized with value represented in | ||
54 | + * string. | ||
55 | + * | ||
56 | + * @param valueInString value of the object in string | ||
57 | + */ | ||
58 | + public YangInt32(String valueInString) { | ||
59 | + | ||
60 | + if (valueInString.matches(MIN_KEYWORD)) { | ||
61 | + value = MIN_VALUE; | ||
62 | + } else if (valueInString.matches(MAX_KEYWORD)) { | ||
63 | + value = MAX_VALUE; | ||
64 | + } else { | ||
65 | + try { | ||
66 | + value = Integer.parseInt(valueInString); | ||
67 | + } catch (Exception e) { | ||
68 | + throw new DataTypeException("YANG file error : " + valueInString + " is not valid."); | ||
69 | + } | ||
70 | + } | ||
71 | + } | ||
72 | + | ||
73 | + | ||
74 | + /** | ||
75 | + * Returns YANG's int32 value. | ||
76 | + * | ||
77 | + * @return value of YANG's int32 | ||
78 | + */ | ||
79 | + public int getValue() { | ||
80 | + return value; | ||
81 | + } | ||
82 | + | ||
83 | + @Override | ||
84 | + public int compareTo(YangInt32 anotherYangInt32) { | ||
85 | + return Integer.compare(value, anotherYangInt32.value); | ||
86 | + } | ||
87 | + | ||
88 | + @Override | ||
89 | + public YangDataTypes getYangType() { | ||
90 | + return YangDataTypes.INT32; | ||
91 | + } | ||
92 | + | ||
93 | +} |
utils/yangutils/src/main/java/org/onosproject/yangutils/utils/builtindatatype/YangInt64.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 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 | +package org.onosproject.yangutils.utils.builtindatatype; | ||
17 | + | ||
18 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
19 | + | ||
20 | +/** | ||
21 | + * Handles the YANG's int8 data type processing. | ||
22 | + * | ||
23 | + * int8 represents integer values between -9223372036854775808 and 9223372036854775807, inclusively. | ||
24 | + */ | ||
25 | +public class YangInt64 implements YangBuiltInDataTypeInfo<YangInt64> { | ||
26 | + | ||
27 | + /** | ||
28 | + * YANG's min keyword. | ||
29 | + */ | ||
30 | + private static final String MIN_KEYWORD = "min"; | ||
31 | + | ||
32 | + /** | ||
33 | + * YANG's max keyword. | ||
34 | + */ | ||
35 | + private static final String MAX_KEYWORD = "max"; | ||
36 | + | ||
37 | + /** | ||
38 | + * Valid minimum value of YANG's int64. | ||
39 | + */ | ||
40 | + public static final Long MIN_VALUE = 0x8000000000000000L; | ||
41 | + | ||
42 | + /** | ||
43 | + * Valid maximum value of YANG's int64. | ||
44 | + */ | ||
45 | + public static final long MAX_VALUE = 0x7fffffffffffffffL; | ||
46 | + | ||
47 | + /** | ||
48 | + * The value of YANG's int64. | ||
49 | + */ | ||
50 | + private final long value; | ||
51 | + | ||
52 | + /** | ||
53 | + * Creates an object with the value initialized with value represented in | ||
54 | + * string. | ||
55 | + * | ||
56 | + * @param valueInString value of the object in string | ||
57 | + */ | ||
58 | + public YangInt64(String valueInString) { | ||
59 | + | ||
60 | + if (valueInString.matches(MIN_KEYWORD)) { | ||
61 | + value = MIN_VALUE; | ||
62 | + } else if (valueInString.matches(MAX_KEYWORD)) { | ||
63 | + value = MAX_VALUE; | ||
64 | + } else { | ||
65 | + try { | ||
66 | + value = Long.parseLong(valueInString); | ||
67 | + } catch (Exception e) { | ||
68 | + throw new DataTypeException("YANG file error : " + valueInString + " is not valid."); | ||
69 | + } | ||
70 | + } | ||
71 | + } | ||
72 | + | ||
73 | + | ||
74 | + /** | ||
75 | + * Returns YANG's int64 value. | ||
76 | + * | ||
77 | + * @return value of YANG's int64 | ||
78 | + */ | ||
79 | + public long getValue() { | ||
80 | + return value; | ||
81 | + } | ||
82 | + | ||
83 | + @Override | ||
84 | + public int compareTo(YangInt64 anotherYangInt64) { | ||
85 | + return Long.compare(value, anotherYangInt64.value); | ||
86 | + } | ||
87 | + | ||
88 | + @Override | ||
89 | + public YangDataTypes getYangType() { | ||
90 | + return YangDataTypes.INT64; | ||
91 | + } | ||
92 | + | ||
93 | +} |
utils/yangutils/src/main/java/org/onosproject/yangutils/utils/builtindatatype/YangInt8.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 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 | +package org.onosproject.yangutils.utils.builtindatatype; | ||
17 | + | ||
18 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
19 | + | ||
20 | +/** | ||
21 | + * Handles the YANG's int8 data type processing. | ||
22 | + * | ||
23 | + * int8 represents integer values between -128 and 127, inclusively. | ||
24 | + */ | ||
25 | +public class YangInt8 implements YangBuiltInDataTypeInfo<YangInt8> { | ||
26 | + | ||
27 | + /** | ||
28 | + * YANG's min keyword. | ||
29 | + */ | ||
30 | + private static final String MIN_KEYWORD = "min"; | ||
31 | + | ||
32 | + /** | ||
33 | + * YANG's max keyword. | ||
34 | + */ | ||
35 | + private static final String MAX_KEYWORD = "max"; | ||
36 | + | ||
37 | + /** | ||
38 | + * Valid minimum value of YANG's int8. | ||
39 | + */ | ||
40 | + public static final byte MIN_VALUE = -128; | ||
41 | + | ||
42 | + /** | ||
43 | + * Valid maximum value of YANG's int8. | ||
44 | + */ | ||
45 | + public static final byte MAX_VALUE = 127; | ||
46 | + | ||
47 | + /** | ||
48 | + * The value of YANG's int8. | ||
49 | + */ | ||
50 | + private final byte value; | ||
51 | + | ||
52 | + /** | ||
53 | + * Creates an object with the value initialized with value represented in | ||
54 | + * string. | ||
55 | + * | ||
56 | + * @param valueInString value of the object in string | ||
57 | + */ | ||
58 | + public YangInt8(String valueInString) { | ||
59 | + | ||
60 | + if (valueInString.matches(MIN_KEYWORD)) { | ||
61 | + value = MIN_VALUE; | ||
62 | + } else if (valueInString.matches(MAX_KEYWORD)) { | ||
63 | + value = MAX_VALUE; | ||
64 | + } else { | ||
65 | + try { | ||
66 | + value = Byte.parseByte(valueInString); | ||
67 | + } catch (Exception e) { | ||
68 | + throw new DataTypeException("YANG file error : " + valueInString + " is not valid."); | ||
69 | + } | ||
70 | + } | ||
71 | + } | ||
72 | + | ||
73 | + /** | ||
74 | + * Returns YANG's int8 value. | ||
75 | + * | ||
76 | + * @return value of YANG's int8 | ||
77 | + */ | ||
78 | + public byte getValue() { | ||
79 | + return value; | ||
80 | + } | ||
81 | + | ||
82 | + @Override | ||
83 | + public int compareTo(YangInt8 anotherYangInt8) { | ||
84 | + return Byte.compare(value, anotherYangInt8.value); | ||
85 | + } | ||
86 | + | ||
87 | + @Override | ||
88 | + public YangDataTypes getYangType() { | ||
89 | + return YangDataTypes.INT8; | ||
90 | + } | ||
91 | + | ||
92 | +} |
utils/yangutils/src/main/java/org/onosproject/yangutils/utils/builtindatatype/YangUint16.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 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 | +package org.onosproject.yangutils.utils.builtindatatype; | ||
17 | + | ||
18 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
19 | + | ||
20 | +/** | ||
21 | + * Handles the YANG's Uint16 data type processing. | ||
22 | + * | ||
23 | + * Uint16 represents integer values between 0 and 65535, inclusively. | ||
24 | + */ | ||
25 | +public class YangUint16 implements YangBuiltInDataTypeInfo<YangUint16> { | ||
26 | + | ||
27 | + /** | ||
28 | + * YANG's min keyword. | ||
29 | + */ | ||
30 | + private static final String MIN_KEYWORD = "min"; | ||
31 | + | ||
32 | + /** | ||
33 | + * YANG's max keyword. | ||
34 | + */ | ||
35 | + private static final String MAX_KEYWORD = "max"; | ||
36 | + | ||
37 | + /** | ||
38 | + * Valid minimum value of YANG's Uint16. | ||
39 | + */ | ||
40 | + public static final int MIN_VALUE = 0; | ||
41 | + | ||
42 | + /** | ||
43 | + * Valid maximum value of YANG's Uint16. | ||
44 | + */ | ||
45 | + public static final int MAX_VALUE = 65535; | ||
46 | + | ||
47 | + /** | ||
48 | + * Value of the object. | ||
49 | + */ | ||
50 | + private int value; | ||
51 | + | ||
52 | + /** | ||
53 | + * Creates an object with the value initialized with value represented in | ||
54 | + * string. | ||
55 | + * | ||
56 | + * @param valueInString value of the object in string | ||
57 | + */ | ||
58 | + YangUint16(String valueInString) { | ||
59 | + | ||
60 | + if (valueInString.matches(MIN_KEYWORD)) { | ||
61 | + value = MIN_VALUE; | ||
62 | + } else if (valueInString.matches(MAX_KEYWORD)) { | ||
63 | + value = MAX_VALUE; | ||
64 | + } else { | ||
65 | + try { | ||
66 | + value = Integer.parseInt(valueInString); | ||
67 | + } catch (Exception e) { | ||
68 | + throw new DataTypeException("YANG file error : " + valueInString + " is not valid."); | ||
69 | + } | ||
70 | + } | ||
71 | + | ||
72 | + if (value < MIN_VALUE) { | ||
73 | + throw new DataTypeException("YANG file error : " + valueInString + " is lesser than minimum value " | ||
74 | + + MIN_VALUE + "."); | ||
75 | + } else if (value > MAX_VALUE) { | ||
76 | + throw new DataTypeException("YANG file error : " + valueInString + " is greater than maximum value " | ||
77 | + + MAX_VALUE + "."); | ||
78 | + } | ||
79 | + } | ||
80 | + | ||
81 | + /** | ||
82 | + * Returns YANG's uint16 value. | ||
83 | + * | ||
84 | + * @return value of YANG's uint16 | ||
85 | + */ | ||
86 | + public int getValue() { | ||
87 | + return value; | ||
88 | + } | ||
89 | + | ||
90 | + @Override | ||
91 | + public int compareTo(YangUint16 another) { | ||
92 | + return Integer.compare(value, another.value); | ||
93 | + } | ||
94 | + | ||
95 | + @Override | ||
96 | + public YangDataTypes getYangType() { | ||
97 | + return YangDataTypes.UINT16; | ||
98 | + } | ||
99 | + | ||
100 | +} | ||
101 | + |
utils/yangutils/src/main/java/org/onosproject/yangutils/utils/builtindatatype/YangUint32.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 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 | +package org.onosproject.yangutils.utils.builtindatatype; | ||
17 | + | ||
18 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
19 | + | ||
20 | +/** | ||
21 | + * Handles the YANG's Uint32 data type processing. | ||
22 | + * | ||
23 | + * Uint32 represents integer values between 0 and 4294967295, inclusively. | ||
24 | + */ | ||
25 | +public class YangUint32 implements YangBuiltInDataTypeInfo<YangUint32> { | ||
26 | + | ||
27 | + private static final String MIN_KEYWORD = "min"; | ||
28 | + private static final String MAX_KEYWORD = "max"; | ||
29 | + | ||
30 | + /** | ||
31 | + * Valid minimum value of YANG's Uint32. | ||
32 | + */ | ||
33 | + public static final long MIN_VALUE = 0; | ||
34 | + | ||
35 | + /** | ||
36 | + * Valid maximum value of YANG's Uint32. | ||
37 | + */ | ||
38 | + public static final long MAX_VALUE = 4294967295L; | ||
39 | + | ||
40 | + /** | ||
41 | + * Value of the object. | ||
42 | + */ | ||
43 | + private long value; | ||
44 | + | ||
45 | + /** | ||
46 | + * Creates an object with the value initialized with value represented in | ||
47 | + * string. | ||
48 | + * | ||
49 | + * @param valueInString value of the object in string | ||
50 | + */ | ||
51 | + YangUint32(String valueInString) { | ||
52 | + | ||
53 | + if (valueInString.matches(MIN_KEYWORD)) { | ||
54 | + value = MIN_VALUE; | ||
55 | + } else if (valueInString.matches(MAX_KEYWORD)) { | ||
56 | + value = MAX_VALUE; | ||
57 | + } else { | ||
58 | + try { | ||
59 | + value = Long.parseLong(valueInString); | ||
60 | + } catch (Exception e) { | ||
61 | + throw new DataTypeException("YANG file error : " + valueInString + " is not valid."); | ||
62 | + } | ||
63 | + } | ||
64 | + | ||
65 | + if (value < MIN_VALUE) { | ||
66 | + throw new DataTypeException("YANG file error : " + valueInString + " is lesser than minimum value " | ||
67 | + + MIN_VALUE + "."); | ||
68 | + } else if (value > MAX_VALUE) { | ||
69 | + throw new DataTypeException("YANG file error : " + valueInString + " is greater than maximum value " | ||
70 | + + MAX_VALUE + "."); | ||
71 | + } | ||
72 | + } | ||
73 | + | ||
74 | + /** | ||
75 | + * Returns YANG's uint32 value. | ||
76 | + * | ||
77 | + * @return value of YANG's uint32 | ||
78 | + */ | ||
79 | + public long getValue() { | ||
80 | + return value; | ||
81 | + } | ||
82 | + | ||
83 | + @Override | ||
84 | + public int compareTo(YangUint32 another) { | ||
85 | + return Long.compare(value, another.value); | ||
86 | + } | ||
87 | + | ||
88 | + @Override | ||
89 | + public YangDataTypes getYangType() { | ||
90 | + return YangDataTypes.UINT32; | ||
91 | + } | ||
92 | + | ||
93 | +} |
utils/yangutils/src/main/java/org/onosproject/yangutils/utils/builtindatatype/YangUint64.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 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 | +package org.onosproject.yangutils.utils.builtindatatype; | ||
17 | + | ||
18 | +import java.math.BigInteger; | ||
19 | +import java.util.regex.Pattern; | ||
20 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
21 | + | ||
22 | +/** | ||
23 | + * Handles the YANG's Uint16 data type processing. | ||
24 | + * | ||
25 | + * Uint64 represents integer values between 0 and 18446744073709551615, inclusively. | ||
26 | + */ | ||
27 | +public class YangUint64 implements YangBuiltInDataTypeInfo<YangUint64> { | ||
28 | + | ||
29 | + /** | ||
30 | + * YANG's min keyword. | ||
31 | + */ | ||
32 | + private static final String MIN_KEYWORD = "min"; | ||
33 | + | ||
34 | + /** | ||
35 | + * YANG's max keyword. | ||
36 | + */ | ||
37 | + private static final String MAX_KEYWORD = "max"; | ||
38 | + | ||
39 | + /** | ||
40 | + * YANG's Integer value pattern. | ||
41 | + */ | ||
42 | + private static final Pattern NON_NEGATIVE_INTEGER_PATTERN = Pattern.compile("[0-9]+"); | ||
43 | + | ||
44 | + /** | ||
45 | + * Valid minimum value of YANG's Uint64. | ||
46 | + */ | ||
47 | + public static final BigInteger MIN_VALUE = BigInteger.valueOf(0); | ||
48 | + | ||
49 | + /** | ||
50 | + * Valid maximum value of YANG's Uint64. | ||
51 | + */ | ||
52 | + public static final BigInteger MAX_VALUE = new BigInteger("18446744073709551615"); | ||
53 | + | ||
54 | + /** | ||
55 | + * Value of the object. | ||
56 | + */ | ||
57 | + private BigInteger value; | ||
58 | + | ||
59 | + /** | ||
60 | + * Creates an object with the value initialized with value represented in | ||
61 | + * string. | ||
62 | + * | ||
63 | + * @param valueInString value of the object in string | ||
64 | + */ | ||
65 | + YangUint64(String valueInString) { | ||
66 | + | ||
67 | + if (valueInString.matches(MIN_KEYWORD)) { | ||
68 | + value = MIN_VALUE; | ||
69 | + } else if (valueInString.matches(MAX_KEYWORD)) { | ||
70 | + value = MAX_VALUE; | ||
71 | + } else if (NON_NEGATIVE_INTEGER_PATTERN.matcher(valueInString).matches()) { | ||
72 | + value = new BigInteger(valueInString); | ||
73 | + } else { | ||
74 | + throw new DataTypeException("YANG file error : " + valueInString + " is not valid."); | ||
75 | + } | ||
76 | + | ||
77 | + if (value.compareTo(MIN_VALUE) < 0) { | ||
78 | + throw new DataTypeException("YANG file error : " + valueInString + " is lesser than minimum value " | ||
79 | + + MIN_VALUE + "."); | ||
80 | + } else if (value.compareTo(MAX_VALUE) > 0) { | ||
81 | + throw new DataTypeException("YANG file error : " + valueInString + " is greater than maximum value " | ||
82 | + + MAX_VALUE + "."); | ||
83 | + } | ||
84 | + } | ||
85 | + | ||
86 | + /** | ||
87 | + * Returns YANG's uint64 value. | ||
88 | + * | ||
89 | + * @return value of YANG's uint64 | ||
90 | + */ | ||
91 | + public BigInteger getValue() { | ||
92 | + return value; | ||
93 | + } | ||
94 | + | ||
95 | + @Override | ||
96 | + public int compareTo(YangUint64 another) { | ||
97 | + return value.compareTo(another.value); | ||
98 | + } | ||
99 | + | ||
100 | + @Override | ||
101 | + public YangDataTypes getYangType() { | ||
102 | + return YangDataTypes.UINT64; | ||
103 | + } | ||
104 | + | ||
105 | +} |
utils/yangutils/src/main/java/org/onosproject/yangutils/utils/builtindatatype/YangUint8.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 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 | +package org.onosproject.yangutils.utils.builtindatatype; | ||
17 | + | ||
18 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
19 | + | ||
20 | +/** | ||
21 | + * Handles the YANG's Uint8 data type processing. | ||
22 | + * | ||
23 | + * Uint8 represents integer values between 0 and 255, inclusively. | ||
24 | + */ | ||
25 | +public class YangUint8 implements YangBuiltInDataTypeInfo<YangUint8> { | ||
26 | + | ||
27 | + /** | ||
28 | + * YANG's min keyword. | ||
29 | + */ | ||
30 | + private static final String MIN_KEYWORD = "min"; | ||
31 | + | ||
32 | + /** | ||
33 | + * YANG's max keyword. | ||
34 | + */ | ||
35 | + private static final String MAX_KEYWORD = "max"; | ||
36 | + | ||
37 | + /** | ||
38 | + * Valid minimum value of YANG's Uint8. | ||
39 | + */ | ||
40 | + public static final short MIN_VALUE = 0; | ||
41 | + | ||
42 | + /** | ||
43 | + * Valid maximum value of YANG's Uint8. | ||
44 | + */ | ||
45 | + public static final short MAX_VALUE = 255; | ||
46 | + | ||
47 | + /** | ||
48 | + * Value of the object. | ||
49 | + */ | ||
50 | + private short value; | ||
51 | + | ||
52 | + /** | ||
53 | + * Creates an object with the value initialized with value represented in | ||
54 | + * string. | ||
55 | + * | ||
56 | + * @param valueInString value of the object in string | ||
57 | + */ | ||
58 | + YangUint8(String valueInString) { | ||
59 | + | ||
60 | + if (valueInString.matches(MIN_KEYWORD)) { | ||
61 | + value = MIN_VALUE; | ||
62 | + } else if (valueInString.matches(MAX_KEYWORD)) { | ||
63 | + value = MAX_VALUE; | ||
64 | + } else { | ||
65 | + try { | ||
66 | + value = Short.parseShort(valueInString); | ||
67 | + } catch (Exception e) { | ||
68 | + throw new DataTypeException("YANG file error : " + valueInString + " is not valid."); | ||
69 | + } | ||
70 | + } | ||
71 | + | ||
72 | + if (value < MIN_VALUE) { | ||
73 | + throw new DataTypeException("YANG file error : " + valueInString + " is lesser than minimum value " | ||
74 | + + MIN_VALUE + "."); | ||
75 | + } else if (value > MAX_VALUE) { | ||
76 | + throw new DataTypeException("YANG file error : " + valueInString + " is greater than maximum value " | ||
77 | + + MAX_VALUE + "."); | ||
78 | + } | ||
79 | + } | ||
80 | + | ||
81 | + /** | ||
82 | + * Returns YANG's uint8 value. | ||
83 | + * | ||
84 | + * @return value of YANG's uint8 | ||
85 | + */ | ||
86 | + public short getValue() { | ||
87 | + return value; | ||
88 | + } | ||
89 | + | ||
90 | + @Override | ||
91 | + public int compareTo(YangUint8 another) { | ||
92 | + return Short.compare(value, another.value); | ||
93 | + } | ||
94 | + | ||
95 | + @Override | ||
96 | + public YangDataTypes getYangType() { | ||
97 | + return YangDataTypes.UINT8; | ||
98 | + } | ||
99 | + | ||
100 | +} |
utils/yangutils/src/main/java/org/onosproject/yangutils/utils/builtindatatype/package-info.java
0 → 100644
1 | +/*- | ||
2 | + * Copyright 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 | +/** | ||
18 | + * Utilities for YANG built in data types. | ||
19 | + */ | ||
20 | +package org.onosproject.yangutils.utils.builtindatatype; |
This diff is collapsed. Click to expand it.
1 | +/* | ||
2 | + * Copyright 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 | +import java.io.IOException; | ||
20 | +import java.util.ListIterator; | ||
21 | + | ||
22 | +import org.junit.Test; | ||
23 | +import org.onosproject.yangutils.datamodel.YangNode; | ||
24 | +import org.onosproject.yangutils.datamodel.YangNodeType; | ||
25 | +import org.onosproject.yangutils.datamodel.YangModule; | ||
26 | +import org.onosproject.yangutils.datamodel.YangLeaf; | ||
27 | +import org.onosproject.yangutils.datamodel.YangLeafList; | ||
28 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
29 | +import org.onosproject.yangutils.datamodel.YangTypeDef; | ||
30 | +import org.onosproject.yangutils.datamodel.YangPatternRestriction; | ||
31 | +import org.onosproject.yangutils.datamodel.YangStringRestriction; | ||
32 | +import org.onosproject.yangutils.parser.exceptions.ParserException; | ||
33 | +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; | ||
34 | + | ||
35 | +import static org.hamcrest.MatcherAssert.assertThat; | ||
36 | +import static org.hamcrest.core.Is.is; | ||
37 | + | ||
38 | +/** | ||
39 | + * Test cases for pattern restriction listener. | ||
40 | + */ | ||
41 | +public class PatternRestrictionListenerTest { | ||
42 | + | ||
43 | + private final YangUtilsParserManager manager = new YangUtilsParserManager(); | ||
44 | + | ||
45 | + /** | ||
46 | + * Checks valid pattern statement as sub-statement of leaf statement. | ||
47 | + */ | ||
48 | + @Test | ||
49 | + public void processValidPatternStatement() throws IOException, ParserException { | ||
50 | + | ||
51 | + YangNode node = manager.getDataModel("src/test/resources/ValidPatternStatement.yang"); | ||
52 | + | ||
53 | + assertThat((node instanceof YangModule), is(true)); | ||
54 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
55 | + YangModule yangNode = (YangModule) node; | ||
56 | + assertThat(yangNode.getName(), is("Test")); | ||
57 | + | ||
58 | + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator(); | ||
59 | + YangLeaf leafInfo = leafIterator.next(); | ||
60 | + | ||
61 | + assertThat(leafInfo.getLeafName(), is("invalid-interval")); | ||
62 | + assertThat(leafInfo.getDataType().getDataTypeName(), is("string")); | ||
63 | + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); | ||
64 | + YangStringRestriction stringRestriction = (YangStringRestriction) leafInfo | ||
65 | + .getDataType().getDataTypeExtendedInfo(); | ||
66 | + ListIterator<String> patternListIterator = stringRestriction.getPatternRestriction() | ||
67 | + .getPatternList().listIterator(); | ||
68 | + assertThat(patternListIterator.next(), is("[a-zA-Z]")); | ||
69 | + } | ||
70 | + | ||
71 | + /** | ||
72 | + * Checks valid pattern statement as sub-statement of leaf-list. | ||
73 | + */ | ||
74 | + @Test | ||
75 | + public void processPatternStatementInsideLeafList() throws IOException, ParserException { | ||
76 | + | ||
77 | + YangNode node = manager.getDataModel("src/test/resources/PatternStatementInsideLeafList.yang"); | ||
78 | + | ||
79 | + assertThat((node instanceof YangModule), is(true)); | ||
80 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
81 | + YangModule yangNode = (YangModule) node; | ||
82 | + assertThat(yangNode.getName(), is("Test")); | ||
83 | + | ||
84 | + ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator(); | ||
85 | + YangLeafList leafListInfo = leafListIterator.next(); | ||
86 | + | ||
87 | + assertThat(leafListInfo.getLeafName(), is("invalid-interval")); | ||
88 | + assertThat(leafListInfo.getDataType().getDataTypeName(), is("string")); | ||
89 | + assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); | ||
90 | + YangStringRestriction stringRestriction = (YangStringRestriction) leafListInfo | ||
91 | + .getDataType().getDataTypeExtendedInfo(); | ||
92 | + ListIterator<String> patternListIterator = stringRestriction.getPatternRestriction() | ||
93 | + .getPatternList().listIterator(); | ||
94 | + assertThat(patternListIterator.next(), is("[a-zA-Z]")); | ||
95 | + } | ||
96 | + | ||
97 | + /** | ||
98 | + * Checks valid pattern statement as sub-statement of typedef. | ||
99 | + */ | ||
100 | + @Test | ||
101 | + public void processPatternStatementInsideTypeDef() throws IOException, ParserException { | ||
102 | + | ||
103 | + YangNode node = manager.getDataModel("src/test/resources/PatternStatementInsideTypeDef.yang"); | ||
104 | + | ||
105 | + assertThat((node instanceof YangModule), is(true)); | ||
106 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
107 | + YangModule yangNode = (YangModule) node; | ||
108 | + assertThat(yangNode.getName(), is("Test")); | ||
109 | + | ||
110 | + YangTypeDef typedef = (YangTypeDef) yangNode.getChild(); | ||
111 | + YangStringRestriction stringRestriction = (YangStringRestriction) typedef.getDataType() | ||
112 | + .getDataTypeExtendedInfo(); | ||
113 | + | ||
114 | + YangPatternRestriction yangPatternRestriction = stringRestriction.getPatternRestriction(); | ||
115 | + assertThat(yangPatternRestriction.getPatternList().listIterator().next(), is("[a-zA-Z]")); | ||
116 | + } | ||
117 | + | ||
118 | + /** | ||
119 | + * Checks valid multiple pattern statements. | ||
120 | + */ | ||
121 | + @Test | ||
122 | + public void processMultiplePatternStatement() throws IOException, ParserException { | ||
123 | + | ||
124 | + YangNode node = manager.getDataModel("src/test/resources/MultiplePatternStatement.yang"); | ||
125 | + | ||
126 | + assertThat((node instanceof YangModule), is(true)); | ||
127 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
128 | + YangModule yangNode = (YangModule) node; | ||
129 | + assertThat(yangNode.getName(), is("Test")); | ||
130 | + | ||
131 | + ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator(); | ||
132 | + YangLeafList leafListInfo = leafListIterator.next(); | ||
133 | + | ||
134 | + assertThat(leafListInfo.getLeafName(), is("invalid-interval")); | ||
135 | + assertThat(leafListInfo.getDataType().getDataTypeName(), is("string")); | ||
136 | + assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); | ||
137 | + YangStringRestriction stringRestriction = (YangStringRestriction) leafListInfo | ||
138 | + .getDataType().getDataTypeExtendedInfo(); | ||
139 | + ListIterator<String> patternListIterator = stringRestriction.getPatternRestriction() | ||
140 | + .getPatternList().listIterator(); | ||
141 | + assertThat(patternListIterator.next(), is("[a-zA-Z]")); | ||
142 | + } | ||
143 | + | ||
144 | + /** | ||
145 | + * Checks valid pattern statement with plus symbol in pattern. | ||
146 | + */ | ||
147 | + @Test | ||
148 | + public void processPatternStatementWithPlus() throws IOException, ParserException { | ||
149 | + | ||
150 | + YangNode node = manager.getDataModel("src/test/resources/PatternStatementWithPlus.yang"); | ||
151 | + | ||
152 | + assertThat((node instanceof YangModule), is(true)); | ||
153 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
154 | + YangModule yangNode = (YangModule) node; | ||
155 | + assertThat(yangNode.getName(), is("Test")); | ||
156 | + | ||
157 | + ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator(); | ||
158 | + YangLeafList leafListInfo = leafListIterator.next(); | ||
159 | + | ||
160 | + assertThat(leafListInfo.getLeafName(), is("invalid-interval")); | ||
161 | + assertThat(leafListInfo.getDataType().getDataTypeName(), is("string")); | ||
162 | + assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.STRING)); | ||
163 | + YangStringRestriction stringRestriction = (YangStringRestriction) leafListInfo | ||
164 | + .getDataType().getDataTypeExtendedInfo(); | ||
165 | + ListIterator<String> patternListIterator = stringRestriction.getPatternRestriction() | ||
166 | + .getPatternList().listIterator(); | ||
167 | + assertThat(patternListIterator.next(), is("-[0-9]+|[0-9]+")); | ||
168 | + } | ||
169 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
... | @@ -16,11 +16,12 @@ | ... | @@ -16,11 +16,12 @@ |
16 | 16 | ||
17 | package org.onosproject.yangutils.parser.impl.listeners; | 17 | package org.onosproject.yangutils.parser.impl.listeners; |
18 | 18 | ||
19 | - | ||
20 | import java.io.IOException; | 19 | import java.io.IOException; |
21 | import java.util.ListIterator; | 20 | import java.util.ListIterator; |
22 | 21 | ||
22 | +import org.junit.Rule; | ||
23 | import org.junit.Test; | 23 | import org.junit.Test; |
24 | +import org.junit.rules.ExpectedException; | ||
24 | import org.onosproject.yangutils.datamodel.YangNode; | 25 | import org.onosproject.yangutils.datamodel.YangNode; |
25 | import org.onosproject.yangutils.datamodel.YangLeaf; | 26 | import org.onosproject.yangutils.datamodel.YangLeaf; |
26 | import org.onosproject.yangutils.datamodel.YangLeafList; | 27 | import org.onosproject.yangutils.datamodel.YangLeafList; |
... | @@ -31,6 +32,7 @@ import org.onosproject.yangutils.datamodel.YangNodeType; | ... | @@ -31,6 +32,7 @@ import org.onosproject.yangutils.datamodel.YangNodeType; |
31 | import org.onosproject.yangutils.datamodel.YangDataTypes; | 32 | import org.onosproject.yangutils.datamodel.YangDataTypes; |
32 | import org.onosproject.yangutils.parser.exceptions.ParserException; | 33 | import org.onosproject.yangutils.parser.exceptions.ParserException; |
33 | import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; | 34 | import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; |
35 | +import org.onosproject.yangutils.utils.builtindatatype.YangInt32; | ||
34 | 36 | ||
35 | import static org.hamcrest.MatcherAssert.assertThat; | 37 | import static org.hamcrest.MatcherAssert.assertThat; |
36 | import static org.hamcrest.core.Is.is; | 38 | import static org.hamcrest.core.Is.is; |
... | @@ -40,6 +42,9 @@ import static org.hamcrest.core.Is.is; | ... | @@ -40,6 +42,9 @@ import static org.hamcrest.core.Is.is; |
40 | */ | 42 | */ |
41 | public class RangeRestrictionListenerTest { | 43 | public class RangeRestrictionListenerTest { |
42 | 44 | ||
45 | + @Rule | ||
46 | + public ExpectedException thrown = ExpectedException.none(); | ||
47 | + | ||
43 | private final YangUtilsParserManager manager = new YangUtilsParserManager(); | 48 | private final YangUtilsParserManager manager = new YangUtilsParserManager(); |
44 | 49 | ||
45 | /** | 50 | /** |
... | @@ -67,8 +72,8 @@ public class RangeRestrictionListenerTest { | ... | @@ -67,8 +72,8 @@ public class RangeRestrictionListenerTest { |
67 | ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals() | 72 | ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals() |
68 | .listIterator(); | 73 | .listIterator(); |
69 | YangRangeInterval rangeInterval = rangeListIterator.next(); | 74 | YangRangeInterval rangeInterval = rangeListIterator.next(); |
70 | - assertThat(rangeInterval.getStartValue(), is(10)); | 75 | + assertThat(((YangInt32) rangeInterval.getStartValue()).getValue(), is(1)); |
71 | - assertThat(rangeInterval.getEndValue(), is(20)); | 76 | + assertThat(((YangInt32) rangeInterval.getEndValue()).getValue(), is(4)); |
72 | } | 77 | } |
73 | 78 | ||
74 | /** | 79 | /** |
... | @@ -97,7 +102,77 @@ public class RangeRestrictionListenerTest { | ... | @@ -97,7 +102,77 @@ public class RangeRestrictionListenerTest { |
97 | .listIterator(); | 102 | .listIterator(); |
98 | YangRangeInterval rangeInterval = rangeListIterator.next(); | 103 | YangRangeInterval rangeInterval = rangeListIterator.next(); |
99 | 104 | ||
100 | - assertThat(rangeInterval.getStartValue(), is(10)); | 105 | + assertThat(((YangInt32) rangeInterval.getStartValue()).getValue(), is(1)); |
101 | - assertThat(rangeInterval.getEndValue(), is(20)); | 106 | + assertThat(((YangInt32) rangeInterval.getEndValue()).getValue(), is(4)); |
107 | + } | ||
108 | + | ||
109 | + /** | ||
110 | + * Checks valid range statement with one interval. | ||
111 | + */ | ||
112 | + @Test | ||
113 | + public void processRangeWithOneInterval() throws IOException, ParserException { | ||
114 | + | ||
115 | + YangNode node = manager.getDataModel("src/test/resources/RangeWithOneInterval.yang"); | ||
116 | + | ||
117 | + assertThat((node instanceof YangModule), is(true)); | ||
118 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
119 | + YangModule yangNode = (YangModule) node; | ||
120 | + assertThat(yangNode.getName(), is("Test")); | ||
121 | + | ||
122 | + ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator(); | ||
123 | + YangLeafList leafListInfo = leafListIterator.next(); | ||
124 | + | ||
125 | + assertThat(leafListInfo.getLeafName(), is("invalid-interval")); | ||
126 | + assertThat(leafListInfo.getDataType().getDataTypeName(), is("int32")); | ||
127 | + assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.INT32)); | ||
128 | + YangRangeRestriction rangeRestriction = (YangRangeRestriction) leafListInfo | ||
129 | + .getDataType().getDataTypeExtendedInfo(); | ||
130 | + | ||
131 | + ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals() | ||
132 | + .listIterator(); | ||
133 | + YangRangeInterval rangeInterval = rangeListIterator.next(); | ||
134 | + | ||
135 | + assertThat(((YangInt32) rangeInterval.getStartValue()).getValue(), is(1)); | ||
136 | + assertThat(((YangInt32) rangeInterval.getEndValue()).getValue(), is(1)); | ||
137 | + } | ||
138 | + | ||
139 | + /** | ||
140 | + * Checks valid range statement with min and max. | ||
141 | + */ | ||
142 | + @Test | ||
143 | + public void processRangeWithMinMax() throws IOException, ParserException { | ||
144 | + | ||
145 | + YangNode node = manager.getDataModel("src/test/resources/RangeWithMinMax.yang"); | ||
146 | + | ||
147 | + assertThat((node instanceof YangModule), is(true)); | ||
148 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
149 | + YangModule yangNode = (YangModule) node; | ||
150 | + assertThat(yangNode.getName(), is("Test")); | ||
151 | + | ||
152 | + ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator(); | ||
153 | + YangLeafList leafListInfo = leafListIterator.next(); | ||
154 | + | ||
155 | + assertThat(leafListInfo.getLeafName(), is("invalid-interval")); | ||
156 | + assertThat(leafListInfo.getDataType().getDataTypeName(), is("int32")); | ||
157 | + assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.INT32)); | ||
158 | + YangRangeRestriction rangeRestriction = (YangRangeRestriction) leafListInfo | ||
159 | + .getDataType().getDataTypeExtendedInfo(); | ||
160 | + | ||
161 | + ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals() | ||
162 | + .listIterator(); | ||
163 | + YangRangeInterval rangeInterval = rangeListIterator.next(); | ||
164 | + | ||
165 | + assertThat(((YangInt32) rangeInterval.getStartValue()).getValue(), is(-2147483648)); | ||
166 | + assertThat(((YangInt32) rangeInterval.getEndValue()).getValue(), is(2147483647)); | ||
167 | + } | ||
168 | + | ||
169 | + /** | ||
170 | + * Checks valid range statement with invalid integer pattern. | ||
171 | + */ | ||
172 | + @Test | ||
173 | + public void processRangeWithInvalidIntegerPattern() throws IOException, ParserException { | ||
174 | + thrown.expect(ParserException.class); | ||
175 | + thrown.expectMessage("YANG file error : a is not valid."); | ||
176 | + YangNode node = manager.getDataModel("src/test/resources/RangeWithInvalidIntegerPattern.yang"); | ||
102 | } | 177 | } |
103 | } | 178 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment