Committed by
Ray Milkey
[ONOS-4348] Yang Bits, Binary and Decimal64
Change-Id: I8e4e54a19a8f9634cbc56a07579a1730174f53f6
Showing
44 changed files
with
2053 additions
and
580 deletions
1 | /*- | 1 | /*- |
2 | - * Copyright 2016 Open Networking Laboratory | 2 | + * Copyright 2016-present Open Networking Laboratory |
3 | * | 3 | * |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. | 5 | * you may not use this file except in compliance with the License. |
... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
16 | package org.onosproject.yangutils.datamodel; | 16 | package org.onosproject.yangutils.datamodel; |
17 | 17 | ||
18 | import java.io.Serializable; | 18 | import java.io.Serializable; |
19 | +import java.math.BigDecimal; | ||
19 | import org.onosproject.yangutils.datamodel.utils.builtindatatype.DataTypeException; | 20 | import org.onosproject.yangutils.datamodel.utils.builtindatatype.DataTypeException; |
20 | import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangBuiltInDataTypeInfo; | 21 | import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangBuiltInDataTypeInfo; |
21 | import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; | 22 | import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; |
... | @@ -78,11 +79,12 @@ public final class BuiltInTypeObjectFactory implements Serializable { | ... | @@ -78,11 +79,12 @@ public final class BuiltInTypeObjectFactory implements Serializable { |
78 | case UINT64: { | 79 | case UINT64: { |
79 | return (T) new YangUint64(valueInStr); | 80 | return (T) new YangUint64(valueInStr); |
80 | } | 81 | } |
82 | + case DECIMAL64: { | ||
83 | + return (T) new YangDecimal64(new BigDecimal(valueInStr)); | ||
84 | + } | ||
81 | default: { | 85 | default: { |
82 | throw new DataTypeException("YANG file error : Unsupported data type"); | 86 | throw new DataTypeException("YANG file error : Unsupported data type"); |
83 | } | 87 | } |
84 | } | 88 | } |
85 | - | ||
86 | } | 89 | } |
87 | - | ||
88 | } | 90 | } | ... | ... |
utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangBinary.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 2016-present Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | + | ||
17 | +package org.onosproject.yangutils.datamodel; | ||
18 | + | ||
19 | +import java.io.Serializable; | ||
20 | +import java.util.Base64; | ||
21 | + | ||
22 | +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangBuiltInDataTypeInfo; | ||
23 | +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; | ||
24 | + | ||
25 | +/* | ||
26 | + * Reference RFC 6020. | ||
27 | + * | ||
28 | + * The binary built-in type represents any binary data, | ||
29 | + * i.e., a sequence of octets. | ||
30 | + */ | ||
31 | +public class YangBinary implements YangBuiltInDataTypeInfo<YangBinary>, Serializable, Comparable<YangBinary> { | ||
32 | + | ||
33 | + private static final long serialVersionUID = 2106201608L; | ||
34 | + | ||
35 | + // Binary data is a decoded value by base64 decoding scheme from data input (jason) | ||
36 | + private byte[] binaryData; | ||
37 | + | ||
38 | + /** | ||
39 | + * Creates a binary object corresponding to the base 64 encoding value. | ||
40 | + * | ||
41 | + * @param strValue base64 encoded value | ||
42 | + */ | ||
43 | + public YangBinary(String strValue) { | ||
44 | + setBinaryData(Base64.getDecoder().decode(strValue)); | ||
45 | + } | ||
46 | + | ||
47 | + /** | ||
48 | + * Retrieves decoded binary data. | ||
49 | + * | ||
50 | + * @return binary data | ||
51 | + */ | ||
52 | + public byte[] getBinaryData() { | ||
53 | + return binaryData; | ||
54 | + } | ||
55 | + | ||
56 | + /** | ||
57 | + * Sets binary data. | ||
58 | + * | ||
59 | + * @param binaryData binary data | ||
60 | + */ | ||
61 | + public void setBinaryData(byte[] binaryData) { | ||
62 | + this.binaryData = binaryData; | ||
63 | + } | ||
64 | + | ||
65 | + /** | ||
66 | + * Encodes binary data by base64 encoding scheme. | ||
67 | + * | ||
68 | + * @return encoded binary data | ||
69 | + */ | ||
70 | + public String toString() { | ||
71 | + return Base64.getEncoder() | ||
72 | + .encodeToString(binaryData); | ||
73 | + } | ||
74 | + | ||
75 | + @Override | ||
76 | + public YangDataTypes getYangType() { | ||
77 | + return YangDataTypes.BINARY; | ||
78 | + } | ||
79 | + | ||
80 | + @Override | ||
81 | + public int compareTo(YangBinary o) { | ||
82 | + for (int i = 0, j = 0; i < this.binaryData.length && j < o.binaryData.length; i++, j++) { | ||
83 | + int a = (this.binaryData[i] & 0xff); | ||
84 | + int b = (o.binaryData[j] & 0xff); | ||
85 | + if (a != b) { | ||
86 | + return a - b; | ||
87 | + } | ||
88 | + } | ||
89 | + return this.binaryData.length - o.binaryData.length; | ||
90 | + } | ||
91 | +} |
... | @@ -17,8 +17,10 @@ | ... | @@ -17,8 +17,10 @@ |
17 | package org.onosproject.yangutils.datamodel; | 17 | package org.onosproject.yangutils.datamodel; |
18 | 18 | ||
19 | import java.io.Serializable; | 19 | import java.io.Serializable; |
20 | -import java.util.HashSet; | 20 | +import java.util.BitSet; |
21 | -import java.util.Set; | 21 | +import java.util.HashMap; |
22 | +import java.util.Map; | ||
23 | +import java.util.regex.Pattern; | ||
22 | 24 | ||
23 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | 25 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; |
24 | import org.onosproject.yangutils.datamodel.utils.Parsable; | 26 | import org.onosproject.yangutils.datamodel.utils.Parsable; |
... | @@ -38,36 +40,142 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType; | ... | @@ -38,36 +40,142 @@ import org.onosproject.yangutils.datamodel.utils.YangConstructType; |
38 | public class YangBits implements Parsable, Serializable { | 40 | public class YangBits implements Parsable, Serializable { |
39 | 41 | ||
40 | private static final long serialVersionUID = 806201641L; | 42 | private static final long serialVersionUID = 806201641L; |
43 | + private static final String SPACE = " "; | ||
41 | 44 | ||
42 | - // Bits information set. | 45 | + // Bits name |
43 | - private Set<YangBit> bitSet; | ||
44 | - | ||
45 | - // BITS name. | ||
46 | private String bitsName; | 46 | private String bitsName; |
47 | + // Bits data contains bit-positions will be used to send to ONOS application | ||
48 | + private BitSet bitDataSet; | ||
49 | + /** | ||
50 | + * Mapping bit name to YangBit. In data input (jason), only bit name will be received. | ||
51 | + * By using the bit name corresponding (yang) bit-position will be retrieved from bitNameMap map. | ||
52 | + */ | ||
53 | + private Map<String, YangBit> bitNameMap; | ||
54 | + /** | ||
55 | + * Mapping bit position to YangBit. The bit-position received from ONOS application | ||
56 | + * will be converted into bit-name by using bitPositionMap map to send (jason) output data as response. | ||
57 | + */ | ||
58 | + private Map<Integer, YangBit> bitPositionMap; | ||
47 | 59 | ||
48 | /** | 60 | /** |
49 | * Creates a YANG bits type object. | 61 | * Creates a YANG bits type object. |
50 | */ | 62 | */ |
51 | public YangBits() { | 63 | public YangBits() { |
52 | - setBitSet(new HashSet<YangBit>()); | 64 | + bitDataSet = new BitSet(); |
65 | + setBitNameMap(new HashMap<>()); | ||
66 | + setBitPositionMap(new HashMap<>()); | ||
67 | + } | ||
68 | + | ||
69 | + /** | ||
70 | + * Creates an instance of YANG bits. | ||
71 | + * | ||
72 | + * @param bits set of bit names | ||
73 | + * @throws DataModelException due to violation in data model rules | ||
74 | + */ | ||
75 | + public YangBits(String bits) throws DataModelException { | ||
76 | + String[] bitNames = bits.trim().split(Pattern.quote(SPACE)); | ||
77 | + setBitDataSet(bitNames); | ||
78 | + } | ||
79 | + | ||
80 | + /** | ||
81 | + * Returns the bits name. | ||
82 | + * | ||
83 | + * @return the bits name | ||
84 | + */ | ||
85 | + public String getBitsName() { | ||
86 | + return bitsName; | ||
87 | + } | ||
88 | + | ||
89 | + /** | ||
90 | + * Sets the bits name. | ||
91 | + * | ||
92 | + * @param bitsName the bits name | ||
93 | + */ | ||
94 | + public void setBitsName(String bitsName) { | ||
95 | + this.bitsName = bitsName; | ||
96 | + } | ||
97 | + | ||
98 | + /** | ||
99 | + * Returns the bit data set. | ||
100 | + * | ||
101 | + * @return the bit data set | ||
102 | + */ | ||
103 | + public BitSet getBitDataSet() { | ||
104 | + return bitDataSet; | ||
105 | + } | ||
106 | + | ||
107 | + /** | ||
108 | + * Sets the bit data set. | ||
109 | + * | ||
110 | + * @param bitNames the set of bit names | ||
111 | + * @throws DataModelException due to violation in data model rules | ||
112 | + */ | ||
113 | + public void setBitDataSet(String[] bitNames) throws DataModelException { | ||
114 | + YangBit bit; | ||
115 | + for (String bitName : bitNames) { | ||
116 | + bit = bitNameMap.get(bitName); | ||
117 | + if (bit == null) { | ||
118 | + throw new DataModelException("YANG file error: Unable to find " + | ||
119 | + "corresponding bit position for bit name: " + bitName); | ||
120 | + } | ||
121 | + bitDataSet.set(bit.getPosition()); | ||
122 | + } | ||
123 | + } | ||
124 | + | ||
125 | + /** | ||
126 | + * Returns the bit name map. | ||
127 | + * | ||
128 | + * @return the bit name map | ||
129 | + */ | ||
130 | + public Map<String, YangBit> getBitNameMap() { | ||
131 | + return bitNameMap; | ||
132 | + } | ||
133 | + | ||
134 | + /** | ||
135 | + * Sets the bit name map. | ||
136 | + * | ||
137 | + * @param bitNameMap the bit name map | ||
138 | + */ | ||
139 | + public void setBitNameMap(Map<String, YangBit> bitNameMap) { | ||
140 | + this.bitNameMap = bitNameMap; | ||
141 | + } | ||
142 | + | ||
143 | + /** | ||
144 | + * Checks whether bit name already available. | ||
145 | + * | ||
146 | + * @param bitName bit name | ||
147 | + * @return true if bit name already available otherwise returns false | ||
148 | + */ | ||
149 | + public boolean isBitNameExists(String bitName) { | ||
150 | + return bitNameMap.containsKey(bitName); | ||
53 | } | 151 | } |
54 | 152 | ||
55 | /** | 153 | /** |
56 | - * Returns the bit set. | 154 | + * Returns the bit position map. |
57 | * | 155 | * |
58 | - * @return the bit set | 156 | + * @return the bit position map |
59 | */ | 157 | */ |
60 | - public Set<YangBit> getBitSet() { | 158 | + public Map<Integer, YangBit> getBitPositionMap() { |
61 | - return bitSet; | 159 | + return bitPositionMap; |
62 | } | 160 | } |
63 | 161 | ||
64 | /** | 162 | /** |
65 | - * Sets the bit set. | 163 | + * Sets the bit position map. |
66 | * | 164 | * |
67 | - * @param bitSet the bit set | 165 | + * @param bitPositionMap the bit position map |
68 | */ | 166 | */ |
69 | - private void setBitSet(Set<YangBit> bitSet) { | 167 | + public void setBitPositionMap(Map<Integer, YangBit> bitPositionMap) { |
70 | - this.bitSet = bitSet; | 168 | + this.bitPositionMap = bitPositionMap; |
169 | + } | ||
170 | + | ||
171 | + /** | ||
172 | + * Checks whether bit position already available. | ||
173 | + * | ||
174 | + * @param bitPosition bit position | ||
175 | + * @return true if bit position already available otherwise returns false | ||
176 | + */ | ||
177 | + public boolean isBitPositionExists(Integer bitPosition) { | ||
178 | + return bitPositionMap.containsKey(bitPosition); | ||
71 | } | 179 | } |
72 | 180 | ||
73 | /** | 181 | /** |
... | @@ -77,9 +185,13 @@ public class YangBits implements Parsable, Serializable { | ... | @@ -77,9 +185,13 @@ public class YangBits implements Parsable, Serializable { |
77 | * @throws DataModelException due to violation in data model rules | 185 | * @throws DataModelException due to violation in data model rules |
78 | */ | 186 | */ |
79 | public void addBitInfo(YangBit bitInfo) throws DataModelException { | 187 | public void addBitInfo(YangBit bitInfo) throws DataModelException { |
80 | - if (!getBitSet().add(bitInfo)) { | 188 | + if (bitNameMap.put(bitInfo.getBitName(), bitInfo) != null) { |
81 | - throw new DataModelException("YANG file error: Duplicate identifier detected, same as bit \"" | 189 | + throw new DataModelException("YANG file error: Duplicate bit name detected, same as bit name \"" |
82 | - + bitInfo.getBitName() + "\""); | 190 | + + bitInfo.getBitName() + "\""); |
191 | + } | ||
192 | + if (bitPositionMap.put(bitInfo.getPosition(), bitInfo) != null) { | ||
193 | + throw new DataModelException("YANG file error: Duplicate bit position detected, same as bit position \"" | ||
194 | + + bitInfo.getPosition() + "\""); | ||
83 | } | 195 | } |
84 | } | 196 | } |
85 | 197 | ||
... | @@ -93,22 +205,36 @@ public class YangBits implements Parsable, Serializable { | ... | @@ -93,22 +205,36 @@ public class YangBits implements Parsable, Serializable { |
93 | return YangConstructType.BITS_DATA; | 205 | return YangConstructType.BITS_DATA; |
94 | } | 206 | } |
95 | 207 | ||
96 | - /** | 208 | + @Override |
97 | - * Returns the bits name. | 209 | + public String toString() { |
98 | - * | 210 | + YangBit bit; |
99 | - * @return name of the bits | 211 | + String bits = new String(); |
100 | - */ | 212 | + for (int i = bitDataSet.nextSetBit(0); i >= 0; i = bitDataSet.nextSetBit(i + 1)) { |
101 | - public String getBitsName() { | 213 | + bit = bitPositionMap.get(i); |
102 | - return bitsName; | 214 | + if (bit == null) { |
215 | + return null; | ||
216 | + } | ||
217 | + if (bits.isEmpty()) { | ||
218 | + bits = bit.getBitName(); | ||
219 | + } else { | ||
220 | + bits += " " + bit.getBitName(); | ||
221 | + } | ||
222 | + } | ||
223 | + return bits.trim(); | ||
103 | } | 224 | } |
104 | 225 | ||
105 | /** | 226 | /** |
106 | - * Sets bits name. | 227 | + * Returns the object of YANG bits based on specific set of bit names. |
107 | * | 228 | * |
108 | - * @param bitsName bit name to be set | 229 | + * @param bits set of bit names |
230 | + * @return Object of YANG bits | ||
109 | */ | 231 | */ |
110 | - public void setBitsName(String bitsName) { | 232 | + public static YangBits fromString(String bits) { |
111 | - this.bitsName = bitsName; | 233 | + try { |
234 | + return new YangBits(bits); | ||
235 | + } catch (Exception e) { | ||
236 | + } | ||
237 | + return null; | ||
112 | } | 238 | } |
113 | 239 | ||
114 | /** | 240 | /** | ... | ... |
utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangDecimal64.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 2016-present Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | + | ||
17 | +package org.onosproject.yangutils.datamodel; | ||
18 | + | ||
19 | +import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | ||
20 | +import org.onosproject.yangutils.datamodel.utils.FractionDigits; | ||
21 | +import org.onosproject.yangutils.datamodel.utils.Parsable; | ||
22 | +import org.onosproject.yangutils.datamodel.utils.YangConstructType; | ||
23 | +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangBuiltInDataTypeInfo; | ||
24 | +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; | ||
25 | + | ||
26 | +import java.io.Serializable; | ||
27 | +import java.math.BigDecimal; | ||
28 | +import java.util.ListIterator; | ||
29 | + | ||
30 | +/** | ||
31 | + * Represents YANG decimal 64. | ||
32 | + */ | ||
33 | +public class YangDecimal64<T> | ||
34 | + implements YangBuiltInDataTypeInfo<YangDecimal64>, Parsable, Serializable, Comparable<YangDecimal64> { | ||
35 | + | ||
36 | + private static final long serialVersionUID = 8006201668L; | ||
37 | + | ||
38 | + /** | ||
39 | + * YANG's min keyword. | ||
40 | + */ | ||
41 | + private static final String MIN_KEYWORD = "min"; | ||
42 | + | ||
43 | + /** | ||
44 | + * YANG's max keyword. | ||
45 | + */ | ||
46 | + private static final String MAX_KEYWORD = "max"; | ||
47 | + | ||
48 | + /** | ||
49 | + * Valid minimum value of YANG's fraction-digits. | ||
50 | + */ | ||
51 | + public static final int MIN_FRACTION_DIGITS_VALUE = 1; | ||
52 | + | ||
53 | + /** | ||
54 | + * Valid maximum value of YANG's fraction-digits. | ||
55 | + */ | ||
56 | + public static final int MAX_FRACTION_DIGITS_VALUE = 18; | ||
57 | + | ||
58 | + // Decimal64 value | ||
59 | + private BigDecimal value; | ||
60 | + | ||
61 | + // fraction-digits | ||
62 | + private int fractionDigit; | ||
63 | + | ||
64 | + /** | ||
65 | + * Additional information about range restriction. | ||
66 | + */ | ||
67 | + private T rangeRestrictedExtendedInfo; | ||
68 | + | ||
69 | + /** | ||
70 | + * Creates an instance of YANG decimal64. | ||
71 | + */ | ||
72 | + public YangDecimal64() { | ||
73 | + } | ||
74 | + | ||
75 | + /** | ||
76 | + * Creates an instance of YANG decimal64. | ||
77 | + * | ||
78 | + * @param value of decimal64 | ||
79 | + */ | ||
80 | + public YangDecimal64(BigDecimal value) { | ||
81 | + setValue(value); | ||
82 | + } | ||
83 | + | ||
84 | + /** | ||
85 | + * Creates an instance of YANG decimal64. | ||
86 | + * | ||
87 | + * @param value of decimal64 in string | ||
88 | + * @throws DataModelException a violation of data model rules | ||
89 | + */ | ||
90 | + public YangDecimal64(String value) throws DataModelException { | ||
91 | + fromString(value); | ||
92 | + } | ||
93 | + | ||
94 | + /** | ||
95 | + * Returns decimal64 value. | ||
96 | + * | ||
97 | + * @return value | ||
98 | + */ | ||
99 | + public BigDecimal getValue() { | ||
100 | + return value; | ||
101 | + } | ||
102 | + | ||
103 | + /** | ||
104 | + * Sets the decimal64 value. | ||
105 | + * | ||
106 | + * @param value of decimal64 | ||
107 | + */ | ||
108 | + public void setValue(BigDecimal value) { | ||
109 | + this.value = value; | ||
110 | + } | ||
111 | + | ||
112 | + /** | ||
113 | + * Returns fraction digit. | ||
114 | + * | ||
115 | + * @return the fractionDigit | ||
116 | + */ | ||
117 | + public int getFractionDigit() { | ||
118 | + return fractionDigit; | ||
119 | + } | ||
120 | + | ||
121 | + /** | ||
122 | + * Sets fraction digit. | ||
123 | + * | ||
124 | + * @param fractionDigit fraction digits. | ||
125 | + */ | ||
126 | + public void setFractionDigit(int fractionDigit) { | ||
127 | + this.fractionDigit = fractionDigit; | ||
128 | + } | ||
129 | + | ||
130 | + /** | ||
131 | + * Returns additional information about range restriction. | ||
132 | + * | ||
133 | + * @return resolved range restricted extended information | ||
134 | + */ | ||
135 | + public T getRangeRestrictedExtendedInfo() { | ||
136 | + return rangeRestrictedExtendedInfo; | ||
137 | + } | ||
138 | + | ||
139 | + /** | ||
140 | + * Sets additional information about range restriction. | ||
141 | + * | ||
142 | + * @param resolvedExtendedInfo resolved range restricted extended information | ||
143 | + */ | ||
144 | + public void setRangeRestrictedExtendedInfo(T resolvedExtendedInfo) { | ||
145 | + this.rangeRestrictedExtendedInfo = resolvedExtendedInfo; | ||
146 | + } | ||
147 | + | ||
148 | + /** | ||
149 | + * Returns object of YANG decimal64. | ||
150 | + * | ||
151 | + * @param value of decimal64 | ||
152 | + * @return YANG decimal64 object | ||
153 | + */ | ||
154 | + public static YangDecimal64 of(BigDecimal value) { | ||
155 | + return new YangDecimal64(value); | ||
156 | + } | ||
157 | + | ||
158 | + @Override | ||
159 | + public YangDataTypes getYangType() { | ||
160 | + return YangDataTypes.DECIMAL64; | ||
161 | + } | ||
162 | + | ||
163 | + @Override | ||
164 | + public YangConstructType getYangConstructType() { | ||
165 | + return YangConstructType.DECIMAL64_DATA; | ||
166 | + } | ||
167 | + | ||
168 | + @Override | ||
169 | + public String toString() { | ||
170 | + return value.toString(); | ||
171 | + } | ||
172 | + | ||
173 | + /** | ||
174 | + * Returns the object of YANG decimal64 from input string. | ||
175 | + * | ||
176 | + * @param valInString input String | ||
177 | + * @return Object of YANG decimal64 | ||
178 | + * @throws DataModelException a violation of data model rules | ||
179 | + */ | ||
180 | + public static YangDecimal64 fromString(String valInString) throws DataModelException { | ||
181 | + YangDecimal64 decimal64; | ||
182 | + decimal64 = of(new BigDecimal(valInString)); | ||
183 | + decimal64.validateValue(); | ||
184 | + return decimal64; | ||
185 | + } | ||
186 | + | ||
187 | + /** | ||
188 | + * Validate decimal64 value. | ||
189 | + * | ||
190 | + * @throws DataModelException a violation of data model rules | ||
191 | + */ | ||
192 | + public void validateValue() throws DataModelException { | ||
193 | + if (!(FractionDigits.isValidDecimal64(this.value, this.fractionDigit))) { | ||
194 | + throw new DataModelException("YANG file error : decimal64 validation failed."); | ||
195 | + } | ||
196 | + } | ||
197 | + | ||
198 | + /** | ||
199 | + * Validate range restriction values based on fraction-digits decimal64 range value. | ||
200 | + * | ||
201 | + * @throws DataModelException a violation of data model rules | ||
202 | + */ | ||
203 | + public void validateRange() throws DataModelException { | ||
204 | + YangRangeRestriction rangeRestriction = (YangRangeRestriction) getRangeRestrictedExtendedInfo(); | ||
205 | + if (rangeRestriction == null) { | ||
206 | + return; | ||
207 | + } | ||
208 | + | ||
209 | + ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals() | ||
210 | + .listIterator(); | ||
211 | + while (rangeListIterator.hasNext()) { | ||
212 | + YangRangeInterval rangeInterval = rangeListIterator.next(); | ||
213 | + if (!(FractionDigits.isValidDecimal64(((YangDecimal64) rangeInterval.getStartValue()).getValue(), | ||
214 | + getFractionDigit()))) { | ||
215 | + throw new DataModelException("YANG file error : decimal64 validation failed."); | ||
216 | + } | ||
217 | + | ||
218 | + if (!(FractionDigits.isValidDecimal64(((YangDecimal64) rangeInterval.getEndValue()).getValue(), | ||
219 | + getFractionDigit()))) { | ||
220 | + throw new DataModelException("YANG file error : decimal64 validation failed."); | ||
221 | + } | ||
222 | + } | ||
223 | + } | ||
224 | + | ||
225 | + @Override | ||
226 | + public int compareTo(YangDecimal64 o) { | ||
227 | + return Double.compare(value.doubleValue(), o.value.doubleValue()); | ||
228 | + } | ||
229 | + | ||
230 | + /** | ||
231 | + * Returns decimal64 default range restriction based on fraction-digits. | ||
232 | + * If range restriction is not provided then this default range value will be applicable. | ||
233 | + * | ||
234 | + * @return range restriction | ||
235 | + * @throws DataModelException a violation of data model rules | ||
236 | + */ | ||
237 | + public YangRangeRestriction getDefaultRangeRestriction() throws DataModelException { | ||
238 | + YangRangeRestriction refRangeRestriction = new YangRangeRestriction(); | ||
239 | + YangRangeInterval rangeInterval = new YangRangeInterval<>(); | ||
240 | + FractionDigits.Range range = FractionDigits.getRange(this.fractionDigit); | ||
241 | + rangeInterval.setStartValue(new YangDecimal64(new BigDecimal((range.getMin())))); | ||
242 | + rangeInterval.setEndValue(new YangDecimal64(new BigDecimal((range.getMax())))); | ||
243 | + refRangeRestriction.addRangeRestrictionInterval(rangeInterval); | ||
244 | + return refRangeRestriction; | ||
245 | + } | ||
246 | + | ||
247 | + /** | ||
248 | + * Validates the data on entering the corresponding parse tree node. | ||
249 | + * | ||
250 | + * @throws DataModelException a violation of data model rules | ||
251 | + */ | ||
252 | + @Override | ||
253 | + public void validateDataOnEntry() throws DataModelException { | ||
254 | + // TODO auto-generated method stub, to be implemented by parser | ||
255 | + } | ||
256 | + | ||
257 | + /** | ||
258 | + * Validates the data on exiting the corresponding parse tree node. | ||
259 | + * | ||
260 | + * @throws DataModelException a violation of data model rules | ||
261 | + */ | ||
262 | + @Override | ||
263 | + public void validateDataOnExit() throws DataModelException { | ||
264 | + // TODO auto-generated method stub, to be implemented by parser | ||
265 | + } | ||
266 | +} |
... | @@ -32,6 +32,7 @@ import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangData | ... | @@ -32,6 +32,7 @@ import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangData |
32 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BINARY; | 32 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BINARY; |
33 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BITS; | 33 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BITS; |
34 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BOOLEAN; | 34 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BOOLEAN; |
35 | +import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DECIMAL64; | ||
35 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DERIVED; | 36 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DERIVED; |
36 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.EMPTY; | 37 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.EMPTY; |
37 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.ENUMERATION; | 38 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.ENUMERATION; |
... | @@ -242,97 +243,9 @@ public class YangDerivedInfo<T> | ... | @@ -242,97 +243,9 @@ public class YangDerivedInfo<T> |
242 | * otherwise take from the base type of type itself. | 243 | * otherwise take from the base type of type itself. |
243 | */ | 244 | */ |
244 | if (baseType.getDataType() == DERIVED) { | 245 | if (baseType.getDataType() == DERIVED) { |
245 | - /* | 246 | + ResolvableStatus resolvableStatus = resolveTypeDerivedInfo(baseType); |
246 | - * Check whether the referred typedef is resolved. | 247 | + if (resolvableStatus != null) { |
247 | - */ | 248 | + return resolvableStatus; |
248 | - if (baseType.getResolvableStatus() != INTRA_FILE_RESOLVED && baseType.getResolvableStatus() != RESOLVED) { | ||
249 | - throw new DataModelException("Linker Error: Referred typedef is not resolved for type."); | ||
250 | - } | ||
251 | - | ||
252 | - /* | ||
253 | - * Check if the referred typedef is intra file resolved, if yes sets | ||
254 | - * current status also to intra file resolved . | ||
255 | - */ | ||
256 | - if (getReferredTypeDef().getTypeDefBaseType().getResolvableStatus() == INTRA_FILE_RESOLVED) { | ||
257 | - return INTRA_FILE_RESOLVED; | ||
258 | - } | ||
259 | - setEffectiveBuiltInType(((YangDerivedInfo<?>) baseType.getDataTypeExtendedInfo()) | ||
260 | - .getEffectiveBuiltInType()); | ||
261 | - YangDerivedInfo refDerivedInfo = (YangDerivedInfo<?>) baseType.getDataTypeExtendedInfo(); | ||
262 | - /* | ||
263 | - * Check whether the effective built-in type can have range | ||
264 | - * restrictions, if yes call resolution of range. | ||
265 | - */ | ||
266 | - if (isOfRangeRestrictedType(getEffectiveBuiltInType())) { | ||
267 | - if (refDerivedInfo.getResolvedExtendedInfo() == null) { | ||
268 | - resolveRangeRestriction(null); | ||
269 | - /* | ||
270 | - * Return the resolution status as resolved, if it's not | ||
271 | - * resolve range/string restriction will throw exception in | ||
272 | - * previous function. | ||
273 | - */ | ||
274 | - return RESOLVED; | ||
275 | - } else { | ||
276 | - if (!(refDerivedInfo.getResolvedExtendedInfo() instanceof YangRangeRestriction)) { | ||
277 | - throw new DataModelException("Linker error: Referred typedef restriction info is of invalid " + | ||
278 | - "type."); | ||
279 | - } | ||
280 | - resolveRangeRestriction((YangRangeRestriction) refDerivedInfo.getResolvedExtendedInfo()); | ||
281 | - /* | ||
282 | - * Return the resolution status as resolved, if it's not | ||
283 | - * resolve range/string restriction will throw exception in | ||
284 | - * previous function. | ||
285 | - */ | ||
286 | - return RESOLVED; | ||
287 | - } | ||
288 | - /* | ||
289 | - * If the effective built-in type is of type string calls for | ||
290 | - * string resolution. | ||
291 | - */ | ||
292 | - } else if (getEffectiveBuiltInType() == STRING) { | ||
293 | - if (refDerivedInfo.getResolvedExtendedInfo() == null) { | ||
294 | - resolveStringRestriction(null); | ||
295 | - /* | ||
296 | - * Return the resolution status as resolved, if it's not | ||
297 | - * resolve range/string restriction will throw exception in | ||
298 | - * previous function. | ||
299 | - */ | ||
300 | - return RESOLVED; | ||
301 | - } else { | ||
302 | - if (!(refDerivedInfo.getResolvedExtendedInfo() instanceof YangStringRestriction)) { | ||
303 | - throw new DataModelException("Linker error: Referred typedef restriction info is of invalid " + | ||
304 | - "type."); | ||
305 | - } | ||
306 | - resolveStringRestriction((YangStringRestriction) refDerivedInfo.getResolvedExtendedInfo()); | ||
307 | - /* | ||
308 | - * Return the resolution status as resolved, if it's not | ||
309 | - * resolve range/string restriction will throw exception in | ||
310 | - * previous function. | ||
311 | - */ | ||
312 | - return RESOLVED; | ||
313 | - } | ||
314 | - } else if (getEffectiveBuiltInType() == BINARY) { | ||
315 | - if (refDerivedInfo.getResolvedExtendedInfo() == null) { | ||
316 | - resolveLengthRestriction(null); | ||
317 | - /* | ||
318 | - * Return the resolution status as resolved, if it's not | ||
319 | - * resolve length restriction will throw exception in | ||
320 | - * previous function. | ||
321 | - */ | ||
322 | - return RESOLVED; | ||
323 | - } else { | ||
324 | - if (!(refDerivedInfo.getResolvedExtendedInfo() instanceof YangRangeRestriction)) { | ||
325 | - throw new DataModelException("Linker error: Referred typedef restriction info is of invalid " + | ||
326 | - "type."); | ||
327 | - } | ||
328 | - resolveLengthRestriction((YangRangeRestriction) refDerivedInfo.getResolvedExtendedInfo()); | ||
329 | - /* | ||
330 | - * Return the resolution status as resolved, if it's not | ||
331 | - * resolve length restriction will throw exception in | ||
332 | - * previous function. | ||
333 | - */ | ||
334 | - return RESOLVED; | ||
335 | - } | ||
336 | } | 249 | } |
337 | } else if ((baseType.getDataType() == LEAFREF) || (baseType.getDataType() == IDENTITYREF)) { | 250 | } else if ((baseType.getDataType() == LEAFREF) || (baseType.getDataType() == IDENTITYREF)) { |
338 | setEffectiveBuiltInType(baseType.getDataType()); | 251 | setEffectiveBuiltInType(baseType.getDataType()); |
... | @@ -393,7 +306,7 @@ public class YangDerivedInfo<T> | ... | @@ -393,7 +306,7 @@ public class YangDerivedInfo<T> |
393 | } | 306 | } |
394 | } else if (getEffectiveBuiltInType() == BINARY) { | 307 | } else if (getEffectiveBuiltInType() == BINARY) { |
395 | if (baseType.getDataTypeExtendedInfo() == null) { | 308 | if (baseType.getDataTypeExtendedInfo() == null) { |
396 | - resolveLengthRestriction(null); | 309 | + resolveBinaryRestriction(null); |
397 | /* | 310 | /* |
398 | * Return the resolution status as resolved, if it's not | 311 | * Return the resolution status as resolved, if it's not |
399 | * resolve length restriction will throw exception in | 312 | * resolve length restriction will throw exception in |
... | @@ -405,7 +318,7 @@ public class YangDerivedInfo<T> | ... | @@ -405,7 +318,7 @@ public class YangDerivedInfo<T> |
405 | throw new DataModelException("Linker error: Referred typedef restriction info is of invalid " + | 318 | throw new DataModelException("Linker error: Referred typedef restriction info is of invalid " + |
406 | "type."); | 319 | "type."); |
407 | } | 320 | } |
408 | - resolveLengthRestriction((YangRangeRestriction) baseType.getDataTypeExtendedInfo()); | 321 | + resolveBinaryRestriction((YangRangeRestriction) baseType.getDataTypeExtendedInfo()); |
409 | /* | 322 | /* |
410 | * Return the resolution status as resolved, if it's not | 323 | * Return the resolution status as resolved, if it's not |
411 | * resolve length restriction will throw exception in | 324 | * resolve length restriction will throw exception in |
... | @@ -413,8 +326,38 @@ public class YangDerivedInfo<T> | ... | @@ -413,8 +326,38 @@ public class YangDerivedInfo<T> |
413 | */ | 326 | */ |
414 | return RESOLVED; | 327 | return RESOLVED; |
415 | } | 328 | } |
329 | + } else if (getEffectiveBuiltInType() == DECIMAL64) { | ||
330 | + if (baseType.getDataTypeExtendedInfo() != null) { | ||
331 | + if (((YangDecimal64) baseType.getDataTypeExtendedInfo()).getRangeRestrictedExtendedInfo() == null) { | ||
332 | + resolveRangeRestriction(null); | ||
333 | + /* | ||
334 | + * Return the resolution status as resolved, if it's not; | ||
335 | + * resolve range restriction will throw exception in | ||
336 | + * previous function. | ||
337 | + */ | ||
338 | + return RESOLVED; | ||
339 | + } else { | ||
340 | + if (!(((YangDecimal64) baseType.getDataTypeExtendedInfo()) | ||
341 | + .getRangeRestrictedExtendedInfo() instanceof YangRangeRestriction)) { | ||
342 | + throw new DataModelException("Linker error: Referred typedef restriction info is" + | ||
343 | + " of invalid type."); | ||
344 | + } | ||
345 | + resolveRangeRestriction((YangRangeRestriction) ((YangDecimal64) baseType | ||
346 | + .getDataTypeExtendedInfo()).getRangeRestrictedExtendedInfo()); | ||
347 | + /* | ||
348 | + * Return the resolution status as resolved, if it's not | ||
349 | + * resolve range/string restriction will throw exception in | ||
350 | + * previous function. | ||
351 | + */ | ||
352 | + return RESOLVED; | ||
353 | + } | ||
354 | + | ||
355 | + } else { | ||
356 | + throw new DataModelException("Linker error: Unable to find type extended info for decimal64."); | ||
357 | + } | ||
416 | } | 358 | } |
417 | } | 359 | } |
360 | + | ||
418 | /* | 361 | /* |
419 | * Check if the data type is the one which can't be restricted, in this | 362 | * Check if the data type is the one which can't be restricted, in this |
420 | * case check whether no self restrictions should be present. | 363 | * case check whether no self restrictions should be present. |
... | @@ -428,11 +371,144 @@ public class YangDerivedInfo<T> | ... | @@ -428,11 +371,144 @@ public class YangDerivedInfo<T> |
428 | throw new DataModelException("YANG file error: Restrictions can't be applied to a given type"); | 371 | throw new DataModelException("YANG file error: Restrictions can't be applied to a given type"); |
429 | } | 372 | } |
430 | } | 373 | } |
374 | + | ||
431 | // Throw exception for unsupported types | 375 | // Throw exception for unsupported types |
432 | throw new DataModelException("Linker error: Unable to process the derived type."); | 376 | throw new DataModelException("Linker error: Unable to process the derived type."); |
433 | } | 377 | } |
434 | 378 | ||
435 | /** | 379 | /** |
380 | + * Resolves the type derived info, by obtaining the effective built-in type | ||
381 | + * and resolving the restrictions. | ||
382 | + * | ||
383 | + * @param baseType base type of typedef | ||
384 | + * @return resolution status | ||
385 | + * @throws DataModelException a violation in data mode rule | ||
386 | + */ | ||
387 | + public ResolvableStatus resolveTypeDerivedInfo(YangType<?> baseType) | ||
388 | + throws DataModelException { | ||
389 | + /* | ||
390 | + * Check whether the referred typedef is resolved. | ||
391 | + */ | ||
392 | + if (baseType.getResolvableStatus() != INTRA_FILE_RESOLVED && baseType.getResolvableStatus() != RESOLVED) { | ||
393 | + throw new DataModelException("Linker Error: Referred typedef is not resolved for type."); | ||
394 | + } | ||
395 | + | ||
396 | + /* | ||
397 | + * Check if the referred typedef is intra file resolved, if yes sets | ||
398 | + * current status also to intra file resolved . | ||
399 | + */ | ||
400 | + if (getReferredTypeDef().getTypeDefBaseType().getResolvableStatus() == INTRA_FILE_RESOLVED) { | ||
401 | + return INTRA_FILE_RESOLVED; | ||
402 | + } | ||
403 | + setEffectiveBuiltInType(((YangDerivedInfo<?>) baseType.getDataTypeExtendedInfo()) | ||
404 | + .getEffectiveBuiltInType()); | ||
405 | + YangDerivedInfo refDerivedInfo = (YangDerivedInfo<?>) baseType.getDataTypeExtendedInfo(); | ||
406 | + /* | ||
407 | + * Check whether the effective built-in type can have range | ||
408 | + * restrictions, if yes call resolution of range. | ||
409 | + */ | ||
410 | + if (isOfRangeRestrictedType(getEffectiveBuiltInType())) { | ||
411 | + if (refDerivedInfo.getResolvedExtendedInfo() == null) { | ||
412 | + resolveRangeRestriction(null); | ||
413 | + /* | ||
414 | + * Return the resolution status as resolved, if it's not | ||
415 | + * resolve range/string restriction will throw exception in | ||
416 | + * previous function. | ||
417 | + */ | ||
418 | + return RESOLVED; | ||
419 | + } else { | ||
420 | + if (!(refDerivedInfo.getResolvedExtendedInfo() instanceof YangRangeRestriction)) { | ||
421 | + throw new DataModelException("Linker error: Referred typedef restriction info is of invalid " + | ||
422 | + "type."); | ||
423 | + } | ||
424 | + resolveRangeRestriction((YangRangeRestriction) refDerivedInfo.getResolvedExtendedInfo()); | ||
425 | + /* | ||
426 | + * Return the resolution status as resolved, if it's not | ||
427 | + * resolve range/string restriction will throw exception in | ||
428 | + * previous function. | ||
429 | + */ | ||
430 | + return RESOLVED; | ||
431 | + } | ||
432 | + /* | ||
433 | + * If the effective built-in type is of type string calls for | ||
434 | + * string resolution. | ||
435 | + */ | ||
436 | + } else if (getEffectiveBuiltInType() == STRING) { | ||
437 | + if (refDerivedInfo.getResolvedExtendedInfo() == null) { | ||
438 | + resolveStringRestriction(null); | ||
439 | + /* | ||
440 | + * Return the resolution status as resolved, if it's not | ||
441 | + * resolve range/string restriction will throw exception in | ||
442 | + * previous function. | ||
443 | + */ | ||
444 | + return RESOLVED; | ||
445 | + } else { | ||
446 | + if (!(refDerivedInfo.getResolvedExtendedInfo() instanceof YangStringRestriction)) { | ||
447 | + throw new DataModelException("Linker error: Referred typedef restriction info is of invalid " + | ||
448 | + "type."); | ||
449 | + } | ||
450 | + resolveStringRestriction((YangStringRestriction) refDerivedInfo.getResolvedExtendedInfo()); | ||
451 | + /* | ||
452 | + * Return the resolution status as resolved, if it's not | ||
453 | + * resolve range/string restriction will throw exception in | ||
454 | + * previous function. | ||
455 | + */ | ||
456 | + return RESOLVED; | ||
457 | + } | ||
458 | + } else if (getEffectiveBuiltInType() == BINARY) { | ||
459 | + if (refDerivedInfo.getResolvedExtendedInfo() == null) { | ||
460 | + resolveBinaryRestriction(null); | ||
461 | + /* | ||
462 | + * Return the resolution status as resolved, if it's not | ||
463 | + * resolve length restriction will throw exception in | ||
464 | + * previous function. | ||
465 | + */ | ||
466 | + return RESOLVED; | ||
467 | + } else { | ||
468 | + if (!(refDerivedInfo.getResolvedExtendedInfo() instanceof YangRangeRestriction)) { | ||
469 | + throw new DataModelException("Linker error: Referred typedef restriction info is of invalid " + | ||
470 | + "type."); | ||
471 | + } | ||
472 | + resolveBinaryRestriction((YangRangeRestriction) refDerivedInfo.getResolvedExtendedInfo()); | ||
473 | + /* | ||
474 | + * Return the resolution status as resolved, if it's not | ||
475 | + * resolve length restriction will throw exception in | ||
476 | + * previous function. | ||
477 | + */ | ||
478 | + return RESOLVED; | ||
479 | + } | ||
480 | + } else if (getEffectiveBuiltInType() == DECIMAL64) { | ||
481 | + if ((refDerivedInfo.getResolvedExtendedInfo() == null) || | ||
482 | + (((YangDecimal64) refDerivedInfo.getResolvedExtendedInfo()) | ||
483 | + .getRangeRestrictedExtendedInfo() == null)) { | ||
484 | + resolveRangeRestriction(null); | ||
485 | + /* | ||
486 | + * Return the resolution status as resolved, if it's not; | ||
487 | + * resolve range restriction will throw exception in | ||
488 | + * previous function. | ||
489 | + */ | ||
490 | + return RESOLVED; | ||
491 | + } else { | ||
492 | + if (!(((YangDecimal64) refDerivedInfo.getResolvedExtendedInfo()) | ||
493 | + .getRangeRestrictedExtendedInfo() instanceof YangRangeRestriction)) { | ||
494 | + throw new DataModelException("Linker error: Referred typedef restriction info is of invalid " + | ||
495 | + "type."); | ||
496 | + } | ||
497 | + resolveRangeRestriction((YangRangeRestriction) ((YangDecimal64) refDerivedInfo | ||
498 | + .getResolvedExtendedInfo()).getRangeRestrictedExtendedInfo()); | ||
499 | + /* | ||
500 | + * Return the resolution status as resolved, if it's not | ||
501 | + * resolve range/string restriction will throw exception in | ||
502 | + * previous function. | ||
503 | + */ | ||
504 | + return RESOLVED; | ||
505 | + } | ||
506 | + } | ||
507 | + | ||
508 | + return null; | ||
509 | + } | ||
510 | + | ||
511 | + /** | ||
436 | * Resolves the string restrictions. | 512 | * Resolves the string restrictions. |
437 | * | 513 | * |
438 | * @param refStringRestriction referred string restriction of typedef | 514 | * @param refStringRestriction referred string restriction of typedef |
... | @@ -490,6 +566,30 @@ public class YangDerivedInfo<T> | ... | @@ -490,6 +566,30 @@ public class YangDerivedInfo<T> |
490 | } | 566 | } |
491 | 567 | ||
492 | /** | 568 | /** |
569 | + * Resolves the binary restrictions. | ||
570 | + * | ||
571 | + * @param refLengthRestriction referred length restriction of typedef | ||
572 | + * @throws DataModelException a violation in data model rule | ||
573 | + */ | ||
574 | + private void resolveBinaryRestriction(YangRangeRestriction refLengthRestriction) | ||
575 | + throws DataModelException { | ||
576 | + | ||
577 | + if (rangeRestrictionString != null || patternRestriction != null) { | ||
578 | + DataModelException dataModelException = | ||
579 | + new DataModelException("YANG file error: for binary " + | ||
580 | + "range restriction or pattern restriction is not allowed."); | ||
581 | + dataModelException.setLine(lineNumber); | ||
582 | + dataModelException.setCharPosition(charPositionInLine); | ||
583 | + throw dataModelException; | ||
584 | + } | ||
585 | + | ||
586 | + // Get the final resolved length restriction | ||
587 | + YangRangeRestriction lengthRestriction = resolveLengthRestriction(refLengthRestriction); | ||
588 | + // Set the lenght restriction. | ||
589 | + setResolvedExtendedInfo((T) lengthRestriction); | ||
590 | + } | ||
591 | + | ||
592 | + /** | ||
493 | * Resolves pattern restriction. | 593 | * Resolves pattern restriction. |
494 | * | 594 | * |
495 | * @param refPatternRestriction referred pattern restriction of typedef | 595 | * @param refPatternRestriction referred pattern restriction of typedef | ... | ... |
... | @@ -102,6 +102,7 @@ public class YangLengthRestriction implements YangDesc, YangReference, YangAppEr | ... | @@ -102,6 +102,7 @@ public class YangLengthRestriction implements YangDesc, YangReference, YangAppEr |
102 | * Creates a YANG length restriction object. | 102 | * Creates a YANG length restriction object. |
103 | */ | 103 | */ |
104 | public YangLengthRestriction() { | 104 | public YangLengthRestriction() { |
105 | + setLengthRestriction(new YangRangeRestriction<YangUint64>()); | ||
105 | } | 106 | } |
106 | 107 | ||
107 | /** | 108 | /** | ... | ... |
1 | +/* | ||
2 | + * Copyright 2016-present Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | + | ||
17 | +package org.onosproject.yangutils.datamodel.utils; | ||
18 | + | ||
19 | +import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | ||
20 | + | ||
21 | +import java.math.BigDecimal; | ||
22 | +import java.util.ArrayList; | ||
23 | + | ||
24 | +/** | ||
25 | + * The "fraction-digits" statement, which is a substatement to the | ||
26 | + * "type" statement, MUST be present if the type is "decimal64". It | ||
27 | + * takes as an argument an integer between 1 and 18, inclusively. It | ||
28 | + * controls the size of the minimum difference between values of a | ||
29 | + * decimal64 type, by restricting the value space to numbers that are | ||
30 | + * expressible as "i x 10^-n" where n is the fraction-digits argument. | ||
31 | + * | ||
32 | + * +----------------+-----------------------+----------------------+ | ||
33 | + * | fraction-digit | min | max | | ||
34 | + * +----------------+-----------------------+----------------------+ | ||
35 | + * | 1 | -922337203685477580.8 | 922337203685477580.7 | | ||
36 | + * | 2 | -92233720368547758.08 | 92233720368547758.07 | | ||
37 | + * | 3 | -9223372036854775.808 | 9223372036854775.807 | | ||
38 | + * | 4 | -922337203685477.5808 | 922337203685477.5807 | | ||
39 | + * | 5 | -92233720368547.75808 | 92233720368547.75807 | | ||
40 | + * | 6 | -9223372036854.775808 | 9223372036854.775807 | | ||
41 | + * | 7 | -922337203685.4775808 | 922337203685.4775807 | | ||
42 | + * | 8 | -92233720368.54775808 | 92233720368.54775807 | | ||
43 | + * | 9 | -9223372036.854775808 | 9223372036.854775807 | | ||
44 | + * | 10 | -922337203.6854775808 | 922337203.6854775807 | | ||
45 | + * | 11 | -92233720.36854775808 | 92233720.36854775807 | | ||
46 | + * | 12 | -9223372.036854775808 | 9223372.036854775807 | | ||
47 | + * | 13 | -922337.2036854775808 | 922337.2036854775807 | | ||
48 | + * | 14 | -92233.72036854775808 | 92233.72036854775807 | | ||
49 | + * | 15 | -9223.372036854775808 | 9223.372036854775807 | | ||
50 | + * | 16 | -922.3372036854775808 | 922.3372036854775807 | | ||
51 | + * | 17 | -92.23372036854775808 | 92.23372036854775807 | | ||
52 | + * | 18 | -9.223372036854775808 | 9.223372036854775807 | | ||
53 | + * +----------------+-----------------------+----------------------+ | ||
54 | + */ | ||
55 | + | ||
56 | +/** | ||
57 | + * Represents the decimal64 value range based on fraction-digits. | ||
58 | + */ | ||
59 | +public final class FractionDigits { | ||
60 | + | ||
61 | + public static class Range { | ||
62 | + private double min; | ||
63 | + private double max; | ||
64 | + | ||
65 | + /** | ||
66 | + * Creates an instance of range. | ||
67 | + * | ||
68 | + * @param min minimum value of decimal64 | ||
69 | + * @param max maximum value of decimal64 | ||
70 | + */ | ||
71 | + protected Range(double min, double max) { | ||
72 | + this.min = min; | ||
73 | + this.max = max; | ||
74 | + } | ||
75 | + | ||
76 | + /** | ||
77 | + * Retrieve minimum value range. | ||
78 | + * | ||
79 | + * @return minimum value range | ||
80 | + */ | ||
81 | + public double getMin() { | ||
82 | + return min; | ||
83 | + } | ||
84 | + | ||
85 | + /** | ||
86 | + * Retrieve maximum value range. | ||
87 | + * | ||
88 | + * @return maximum value range | ||
89 | + */ | ||
90 | + public double getMax() { | ||
91 | + return max; | ||
92 | + } | ||
93 | + } | ||
94 | + | ||
95 | + private static ArrayList<Range> decimal64ValueRange = null; | ||
96 | + | ||
97 | + /** | ||
98 | + * Creates a fraction-digits instance. | ||
99 | + */ | ||
100 | + private FractionDigits() { | ||
101 | + } | ||
102 | + | ||
103 | + /** | ||
104 | + * Generates decimal64 value range based on fraction-digits. | ||
105 | + * | ||
106 | + * @return decimal64 value range by fraction-digits as index | ||
107 | + */ | ||
108 | + private static ArrayList<Range> getDecimal64ValueRange() { | ||
109 | + if (decimal64ValueRange == null) { | ||
110 | + decimal64ValueRange = new ArrayList<>(); | ||
111 | + decimal64ValueRange.add(new Range(-922337203685477580.8, 922337203685477580.7)); // fraction-digit: 1 | ||
112 | + decimal64ValueRange.add(new Range(-92233720368547758.08, 92233720368547758.07)); // fraction-digit: 2 | ||
113 | + decimal64ValueRange.add(new Range(-9223372036854775.808, 9223372036854775.807)); // fraction-digit: 3 | ||
114 | + decimal64ValueRange.add(new Range(-922337203685477.5808, 922337203685477.5807)); // fraction-digit: 4 | ||
115 | + decimal64ValueRange.add(new Range(-92233720368547.75808, 92233720368547.75807)); // fraction-digit: 5 | ||
116 | + decimal64ValueRange.add(new Range(-9223372036854.775808, 9223372036854.775807)); // fraction-digit: 6 | ||
117 | + decimal64ValueRange.add(new Range(-922337203685.4775808, 922337203685.4775807)); // fraction-digit: 7 | ||
118 | + decimal64ValueRange.add(new Range(-92233720368.54775808, 92233720368.54775807)); // fraction-digit: 8 | ||
119 | + decimal64ValueRange.add(new Range(-9223372036.854775808, 9223372036.854775807)); // fraction-digit: 9 | ||
120 | + decimal64ValueRange.add(new Range(-922337203.6854775808, 922337203.6854775807)); // fraction-digit: 10 | ||
121 | + decimal64ValueRange.add(new Range(-92233720.36854775808, 92233720.36854775807)); // fraction-digit: 11 | ||
122 | + decimal64ValueRange.add(new Range(-9223372.036854775808, 9223372.036854775807)); // fraction-digit: 12 | ||
123 | + decimal64ValueRange.add(new Range(-922337.2036854775808, 922337.2036854775807)); // fraction-digit: 13 | ||
124 | + decimal64ValueRange.add(new Range(-92233.72036854775808, 92233.72036854775807)); // fraction-digit: 14 | ||
125 | + decimal64ValueRange.add(new Range(-9223.372036854775808, 9223.372036854775807)); // fraction-digit: 15 | ||
126 | + decimal64ValueRange.add(new Range(-922.3372036854775808, 922.3372036854775807)); // fraction-digit: 16 | ||
127 | + decimal64ValueRange.add(new Range(-92.23372036854775808, 92.23372036854775807)); // fraction-digit: 17 | ||
128 | + decimal64ValueRange.add(new Range(-9.223372036854775808, 9.223372036854775807)); // fraction-digit: 18 | ||
129 | + } | ||
130 | + return decimal64ValueRange; | ||
131 | + } | ||
132 | + | ||
133 | + /** | ||
134 | + * Checks given decimal64 value is in the specific range based on given fraction-digit. | ||
135 | + * | ||
136 | + * @param value decimal64 value | ||
137 | + * @param fractionDigit fraction-digits | ||
138 | + * @return success when it is in specific range otherwise false | ||
139 | + */ | ||
140 | + public static boolean isValidDecimal64(BigDecimal value, int fractionDigit) { | ||
141 | + if (!((fractionDigit >= 1) && (fractionDigit <= 18))) { | ||
142 | + return false; | ||
143 | + } | ||
144 | + | ||
145 | + // ArrayList index starts from 0. | ||
146 | + Range range = getDecimal64ValueRange().get(fractionDigit - 1); | ||
147 | + if ((value.doubleValue() >= range.min) && (value.doubleValue() <= range.max)) { | ||
148 | + return true; | ||
149 | + } | ||
150 | + return false; | ||
151 | + } | ||
152 | + | ||
153 | + /** | ||
154 | + * Retrieve range based on fraction-digits. | ||
155 | + * | ||
156 | + * @param fractionDigit fraction-digits | ||
157 | + * @return range | ||
158 | + * @throws DataModelException a violation of data model rules | ||
159 | + */ | ||
160 | + public static Range getRange(int fractionDigit) throws DataModelException { | ||
161 | + if (!((fractionDigit >= 1) && (fractionDigit <= 18))) { | ||
162 | + throw new DataModelException("YANG file error : given fraction-digit is not in its range (1..18)."); | ||
163 | + } | ||
164 | + | ||
165 | + return getDecimal64ValueRange().get(fractionDigit - 1); | ||
166 | + } | ||
167 | +} |
... | @@ -95,6 +95,16 @@ public enum YangConstructType { | ... | @@ -95,6 +95,16 @@ public enum YangConstructType { |
95 | BITS_DATA, | 95 | BITS_DATA, |
96 | 96 | ||
97 | /** | 97 | /** |
98 | + * Identifies the YANG decimal64 parsed data. | ||
99 | + */ | ||
100 | + DECIMAL64_DATA, | ||
101 | + | ||
102 | + /** | ||
103 | + * Identifies the YANG fraction-digits parsed data. | ||
104 | + */ | ||
105 | + FRACTION_DIGITS_DATA, | ||
106 | + | ||
107 | + /** | ||
98 | * Identifies the YANG enum parsed data. | 108 | * Identifies the YANG enum parsed data. |
99 | */ | 109 | */ |
100 | ENUM_DATA, | 110 | ENUM_DATA, |
... | @@ -413,6 +423,10 @@ public enum YangConstructType { | ... | @@ -413,6 +423,10 @@ public enum YangConstructType { |
413 | return "bit"; | 423 | return "bit"; |
414 | case BITS_DATA: | 424 | case BITS_DATA: |
415 | return "bits"; | 425 | return "bits"; |
426 | + case DECIMAL64_DATA: | ||
427 | + return "decimal64"; | ||
428 | + case FRACTION_DIGITS_DATA: | ||
429 | + return "fraction-digits"; | ||
416 | case ENUM_DATA: | 430 | case ENUM_DATA: |
417 | return "enum"; | 431 | return "enum"; |
418 | case IMPORT_DATA: | 432 | case IMPORT_DATA: | ... | ... |
1 | -/* | ||
2 | - * Copyright 2016-present Open Networking Laboratory | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | - | ||
17 | -package org.onosproject.yangutils.datamodel.utils.builtindatatype; | ||
18 | - | ||
19 | -import java.io.Serializable; | ||
20 | -import java.util.Objects; | ||
21 | - | ||
22 | -import com.google.common.base.MoreObjects; | ||
23 | - | ||
24 | -/** | ||
25 | - * Represents binary data type. | ||
26 | - */ | ||
27 | -public final class YangBinary implements Serializable { | ||
28 | - | ||
29 | - private static final long serialVersionUID = 8006201670L; | ||
30 | - | ||
31 | - private byte[] byteArray; | ||
32 | - | ||
33 | - /** | ||
34 | - * Creates an instance of YANG binary. | ||
35 | - */ | ||
36 | - private YangBinary() { | ||
37 | - } | ||
38 | - | ||
39 | - /** | ||
40 | - * Creates an instance of YANG binary. | ||
41 | - * | ||
42 | - * @param bytes byte array | ||
43 | - */ | ||
44 | - public YangBinary(byte[] bytes) { | ||
45 | - byteArray = bytes; | ||
46 | - } | ||
47 | - | ||
48 | - /** | ||
49 | - * Returns object of YANG binary. | ||
50 | - * | ||
51 | - * @param bytes byte array | ||
52 | - * @return object of YANG binary | ||
53 | - */ | ||
54 | - public static YangBinary of(byte[] bytes) { | ||
55 | - return new YangBinary(bytes); | ||
56 | - } | ||
57 | - | ||
58 | - /** | ||
59 | - * Returns byte array. | ||
60 | - * | ||
61 | - * @return byte array | ||
62 | - */ | ||
63 | - public byte[] byteArray() { | ||
64 | - return byteArray; | ||
65 | - } | ||
66 | - | ||
67 | - @Override | ||
68 | - public int hashCode() { | ||
69 | - return Objects.hash(byteArray); | ||
70 | - } | ||
71 | - | ||
72 | - @Override | ||
73 | - public boolean equals(Object obj) { | ||
74 | - if (this == obj) { | ||
75 | - return true; | ||
76 | - } | ||
77 | - if (obj instanceof YangBinary) { | ||
78 | - YangBinary other = (YangBinary) obj; | ||
79 | - return Objects.equals(byteArray, other.byteArray); | ||
80 | - } | ||
81 | - return false; | ||
82 | - } | ||
83 | - | ||
84 | - @Override | ||
85 | - public String toString() { | ||
86 | - return MoreObjects.toStringHelper(getClass()) | ||
87 | - .omitNullValues() | ||
88 | - .add("byteArray", byteArray) | ||
89 | - .toString(); | ||
90 | - } | ||
91 | - | ||
92 | - /** | ||
93 | - * Returns the object of YANG binary fromString input String. | ||
94 | - * | ||
95 | - * @param valInString input String | ||
96 | - * @return Object of YANG binary | ||
97 | - */ | ||
98 | - public static YangBinary fromString(String valInString) { | ||
99 | - try { | ||
100 | - byte[] tmpVal = valInString.getBytes(); | ||
101 | - return of(tmpVal); | ||
102 | - } catch (Exception e) { | ||
103 | - } | ||
104 | - return null; | ||
105 | - } | ||
106 | - | ||
107 | -} |
1 | -/* | ||
2 | - * Copyright 2016-present Open Networking Laboratory | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | - | ||
17 | -package org.onosproject.yangutils.datamodel.utils.builtindatatype; | ||
18 | - | ||
19 | -import java.io.Serializable; | ||
20 | -import java.util.Objects; | ||
21 | - | ||
22 | -import com.google.common.base.MoreObjects; | ||
23 | - | ||
24 | -/** | ||
25 | - * Represents bits data type. | ||
26 | - */ | ||
27 | -public class YangBits implements Serializable { | ||
28 | - | ||
29 | - private static final long serialVersionUID = 8006201669L; | ||
30 | - | ||
31 | - private byte[] byteArray; | ||
32 | - | ||
33 | - /** | ||
34 | - * Creates an instance of YANG bits. | ||
35 | - */ | ||
36 | - private YangBits() { | ||
37 | - } | ||
38 | - | ||
39 | - /** | ||
40 | - * Creates an instance of YANG bits. | ||
41 | - * | ||
42 | - * @param bytes byte array | ||
43 | - */ | ||
44 | - public YangBits(byte[] bytes) { | ||
45 | - byteArray = bytes; | ||
46 | - } | ||
47 | - | ||
48 | - /** | ||
49 | - * Returns object of YANG bits. | ||
50 | - * | ||
51 | - * @param bytes byte array | ||
52 | - * @return object of YANG bits | ||
53 | - */ | ||
54 | - public static YangBits of(byte[] bytes) { | ||
55 | - return new YangBits(bytes); | ||
56 | - } | ||
57 | - | ||
58 | - /** | ||
59 | - * Returns byte array. | ||
60 | - * | ||
61 | - * @return byte array | ||
62 | - */ | ||
63 | - public byte[] byteArray() { | ||
64 | - return byteArray; | ||
65 | - } | ||
66 | - | ||
67 | - @Override | ||
68 | - public int hashCode() { | ||
69 | - return Objects.hash(byteArray); | ||
70 | - } | ||
71 | - | ||
72 | - @Override | ||
73 | - public boolean equals(Object obj) { | ||
74 | - if (this == obj) { | ||
75 | - return true; | ||
76 | - } | ||
77 | - if (obj instanceof YangBits) { | ||
78 | - YangBits other = (YangBits) obj; | ||
79 | - return Objects.equals(byteArray, other.byteArray); | ||
80 | - } | ||
81 | - return false; | ||
82 | - } | ||
83 | - | ||
84 | - @Override | ||
85 | - public String toString() { | ||
86 | - return MoreObjects.toStringHelper(getClass()) | ||
87 | - .omitNullValues() | ||
88 | - .add("byteArray", byteArray) | ||
89 | - .toString(); | ||
90 | - } | ||
91 | - | ||
92 | - /** | ||
93 | - * Returns the object of YANG bits fromString input String. | ||
94 | - * | ||
95 | - * @param valInString input String | ||
96 | - * @return Object of YANG bits | ||
97 | - */ | ||
98 | - public static YangBits fromString(String valInString) { | ||
99 | - try { | ||
100 | - byte[] tmpVal = valInString.getBytes(); | ||
101 | - return of(tmpVal); | ||
102 | - } catch (Exception e) { | ||
103 | - } | ||
104 | - return null; | ||
105 | - } | ||
106 | - | ||
107 | -} |
... | @@ -16,7 +16,6 @@ | ... | @@ -16,7 +16,6 @@ |
16 | 16 | ||
17 | package org.onosproject.yangutils.datamodel.utils.builtindatatype; | 17 | package org.onosproject.yangutils.datamodel.utils.builtindatatype; |
18 | 18 | ||
19 | -import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DECIMAL64; | ||
20 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT16; | 19 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT16; |
21 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT32; | 20 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT32; |
22 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT64; | 21 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT64; |
... | @@ -51,7 +50,6 @@ public final class YangDataTypeUtils { | ... | @@ -51,7 +50,6 @@ public final class YangDataTypeUtils { |
51 | || dataType == UINT8 | 50 | || dataType == UINT8 |
52 | || dataType == UINT16 | 51 | || dataType == UINT16 |
53 | || dataType == UINT32 | 52 | || dataType == UINT32 |
54 | - || dataType == UINT64 | 53 | + || dataType == UINT64; |
55 | - || dataType == DECIMAL64; | ||
56 | } | 54 | } |
57 | } | 55 | } | ... | ... |
1 | -/* | ||
2 | - * Copyright 2016-present Open Networking Laboratory | ||
3 | - * | ||
4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | - * you may not use this file except in compliance with the License. | ||
6 | - * You may obtain a copy of the License at | ||
7 | - * | ||
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | - * | ||
10 | - * Unless required by applicable law or agreed to in writing, software | ||
11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | - * See the License for the specific language governing permissions and | ||
14 | - * limitations under the License. | ||
15 | - */ | ||
16 | - | ||
17 | -package org.onosproject.yangutils.datamodel.utils.builtindatatype; | ||
18 | - | ||
19 | -import java.io.Serializable; | ||
20 | -import java.util.Objects; | ||
21 | - | ||
22 | -import com.google.common.base.MoreObjects; | ||
23 | - | ||
24 | -/** | ||
25 | - * Represents YANG decimal 64. | ||
26 | - */ | ||
27 | -public class YangDecimal64 implements Serializable { | ||
28 | - | ||
29 | - private static final long serialVersionUID = 8006201668L; | ||
30 | - | ||
31 | - private int fractionDigit; | ||
32 | - | ||
33 | - /** | ||
34 | - * Creates an instance of YANG decimal64. | ||
35 | - */ | ||
36 | - public YangDecimal64() { | ||
37 | - } | ||
38 | - | ||
39 | - /** | ||
40 | - * Creates an instance of of YANG decimal64. | ||
41 | - * | ||
42 | - * @param fractionDigit fraction digit | ||
43 | - */ | ||
44 | - public YangDecimal64(int fractionDigit) { | ||
45 | - setFractionDigit(fractionDigit); | ||
46 | - } | ||
47 | - | ||
48 | - /** | ||
49 | - * Returns fraction digit. | ||
50 | - * | ||
51 | - * @return the fractionDigit | ||
52 | - */ | ||
53 | - public int getFractionDigit() { | ||
54 | - return fractionDigit; | ||
55 | - } | ||
56 | - | ||
57 | - /** | ||
58 | - * Sets fraction digit. | ||
59 | - * | ||
60 | - * @param fractionDigit fraction digits. | ||
61 | - */ | ||
62 | - public void setFractionDigit(int fractionDigit) { | ||
63 | - this.fractionDigit = fractionDigit; | ||
64 | - } | ||
65 | - | ||
66 | - /** | ||
67 | - * Returns object of YANG decimal64. | ||
68 | - * | ||
69 | - * @param value fraction digit | ||
70 | - * @return YANG decimal64 | ||
71 | - */ | ||
72 | - public static YangDecimal64 of(int value) { | ||
73 | - return new YangDecimal64(value); | ||
74 | - } | ||
75 | - | ||
76 | - @Override | ||
77 | - public int hashCode() { | ||
78 | - return Objects.hash(fractionDigit); | ||
79 | - } | ||
80 | - | ||
81 | - @Override | ||
82 | - public boolean equals(Object obj) { | ||
83 | - if (this == obj) { | ||
84 | - return true; | ||
85 | - } | ||
86 | - if (obj instanceof YangDecimal64) { | ||
87 | - YangDecimal64 other = (YangDecimal64) obj; | ||
88 | - return Objects.equals(fractionDigit, other.fractionDigit); | ||
89 | - } | ||
90 | - return false; | ||
91 | - } | ||
92 | - | ||
93 | - @Override | ||
94 | - public String toString() { | ||
95 | - return MoreObjects.toStringHelper(getClass()) | ||
96 | - .omitNullValues() | ||
97 | - .add("fractionDigit", fractionDigit) | ||
98 | - .toString(); | ||
99 | - } | ||
100 | - | ||
101 | - /** | ||
102 | - * Returns the object of YANG decimal64 fromString input String. | ||
103 | - * | ||
104 | - * @param valInString input String | ||
105 | - * @return Object of YANG decimal64 | ||
106 | - */ | ||
107 | - public static YangDecimal64 fromString(String valInString) { | ||
108 | - try { | ||
109 | - int tmpVal = Integer.parseInt(valInString); | ||
110 | - return of(tmpVal); | ||
111 | - } catch (Exception e) { | ||
112 | - } | ||
113 | - return null; | ||
114 | - } | ||
115 | -} |
... | @@ -632,6 +632,22 @@ public interface GeneratedYangListener extends ParseTreeListener { | ... | @@ -632,6 +632,22 @@ public interface GeneratedYangListener extends ParseTreeListener { |
632 | * | 632 | * |
633 | * @param currentContext current context in the parsed tree | 633 | * @param currentContext current context in the parsed tree |
634 | */ | 634 | */ |
635 | + void enterFractionDigitStatement(GeneratedYangParser.FractionDigitStatementContext currentContext); | ||
636 | + | ||
637 | + /** | ||
638 | + * Exits a parse tree produced by GeneratedYangParser for grammar rule | ||
639 | + * numericalRestrictions. | ||
640 | + * | ||
641 | + * @param currentContext current context in the parsed tree | ||
642 | + */ | ||
643 | + void exitFractionDigitStatement(GeneratedYangParser.FractionDigitStatementContext currentContext); | ||
644 | + | ||
645 | + /** | ||
646 | + * Enters a parse tree produced by GeneratedYangParser for grammar rule | ||
647 | + * numericalRestrictions. | ||
648 | + * | ||
649 | + * @param currentContext current context in the parsed tree | ||
650 | + */ | ||
635 | void enterNumericalRestrictions(GeneratedYangParser.NumericalRestrictionsContext currentContext); | 651 | void enterNumericalRestrictions(GeneratedYangParser.NumericalRestrictionsContext currentContext); |
636 | 652 | ||
637 | /** | 653 | /** | ... | ... |
... | @@ -37,11 +37,13 @@ import org.onosproject.yangutils.parser.impl.listeners.ChoiceListener; | ... | @@ -37,11 +37,13 @@ import org.onosproject.yangutils.parser.impl.listeners.ChoiceListener; |
37 | import org.onosproject.yangutils.parser.impl.listeners.ConfigListener; | 37 | import org.onosproject.yangutils.parser.impl.listeners.ConfigListener; |
38 | import org.onosproject.yangutils.parser.impl.listeners.ContactListener; | 38 | import org.onosproject.yangutils.parser.impl.listeners.ContactListener; |
39 | import org.onosproject.yangutils.parser.impl.listeners.ContainerListener; | 39 | import org.onosproject.yangutils.parser.impl.listeners.ContainerListener; |
40 | +import org.onosproject.yangutils.parser.impl.listeners.Decimal64Listener; | ||
40 | import org.onosproject.yangutils.parser.impl.listeners.DefaultListener; | 41 | import org.onosproject.yangutils.parser.impl.listeners.DefaultListener; |
41 | import org.onosproject.yangutils.parser.impl.listeners.DescriptionListener; | 42 | import org.onosproject.yangutils.parser.impl.listeners.DescriptionListener; |
42 | import org.onosproject.yangutils.parser.impl.listeners.EnumListener; | 43 | import org.onosproject.yangutils.parser.impl.listeners.EnumListener; |
43 | import org.onosproject.yangutils.parser.impl.listeners.EnumerationListener; | 44 | import org.onosproject.yangutils.parser.impl.listeners.EnumerationListener; |
44 | import org.onosproject.yangutils.parser.impl.listeners.FeatureListener; | 45 | import org.onosproject.yangutils.parser.impl.listeners.FeatureListener; |
46 | +import org.onosproject.yangutils.parser.impl.listeners.FractionDigitsListener; | ||
45 | import org.onosproject.yangutils.parser.impl.listeners.GroupingListener; | 47 | import org.onosproject.yangutils.parser.impl.listeners.GroupingListener; |
46 | import org.onosproject.yangutils.parser.impl.listeners.IdentityrefListener; | 48 | import org.onosproject.yangutils.parser.impl.listeners.IdentityrefListener; |
47 | import org.onosproject.yangutils.parser.impl.listeners.IfFeatureListener; | 49 | import org.onosproject.yangutils.parser.impl.listeners.IfFeatureListener; |
... | @@ -563,12 +565,22 @@ public class TreeWalkListener implements GeneratedYangListener { | ... | @@ -563,12 +565,22 @@ public class TreeWalkListener implements GeneratedYangListener { |
563 | 565 | ||
564 | @Override | 566 | @Override |
565 | public void enterDecimal64Specification(GeneratedYangParser.Decimal64SpecificationContext ctx) { | 567 | public void enterDecimal64Specification(GeneratedYangParser.Decimal64SpecificationContext ctx) { |
566 | - // TODO: implement the method. | 568 | + Decimal64Listener.processDecimal64Entry(this, ctx); |
567 | } | 569 | } |
568 | 570 | ||
569 | @Override | 571 | @Override |
570 | public void exitDecimal64Specification(GeneratedYangParser.Decimal64SpecificationContext ctx) { | 572 | public void exitDecimal64Specification(GeneratedYangParser.Decimal64SpecificationContext ctx) { |
571 | - // TODO: implement the method. | 573 | + Decimal64Listener.processDecimal64Exit(this, ctx); |
574 | + } | ||
575 | + | ||
576 | + @Override | ||
577 | + public void enterFractionDigitStatement(GeneratedYangParser.FractionDigitStatementContext ctx) { | ||
578 | + FractionDigitsListener.processFractionDigitsEntry(this, ctx); | ||
579 | + } | ||
580 | + | ||
581 | + @Override | ||
582 | + public void exitFractionDigitStatement(GeneratedYangParser.FractionDigitStatementContext currentContext) { | ||
583 | + // do nothing | ||
572 | } | 584 | } |
573 | 585 | ||
574 | @Override | 586 | @Override | ... | ... |
... | @@ -61,6 +61,8 @@ package org.onosproject.yangutils.parser.impl.listeners; | ... | @@ -61,6 +61,8 @@ package org.onosproject.yangutils.parser.impl.listeners; |
61 | * ; | 61 | * ; |
62 | */ | 62 | */ |
63 | 63 | ||
64 | +import java.util.Map; | ||
65 | + | ||
64 | import org.onosproject.yangutils.datamodel.YangBit; | 66 | import org.onosproject.yangutils.datamodel.YangBit; |
65 | import org.onosproject.yangutils.datamodel.YangBits; | 67 | import org.onosproject.yangutils.datamodel.YangBits; |
66 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | 68 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; |
... | @@ -141,12 +143,13 @@ public final class BitListener { | ... | @@ -141,12 +143,13 @@ public final class BitListener { |
141 | int maxPosition = 0; | 143 | int maxPosition = 0; |
142 | boolean isPositionPresent = false; | 144 | boolean isPositionPresent = false; |
143 | 145 | ||
144 | - for (YangBit curBit : yangBits.getBitSet()) { | 146 | + for (Map.Entry<Integer, YangBit> element : yangBits.getBitPositionMap().entrySet()) { |
145 | - if (maxPosition <= curBit.getPosition()) { | 147 | + if (maxPosition <= element.getKey()) { |
146 | - maxPosition = curBit.getPosition(); | 148 | + maxPosition = element.getKey(); |
147 | isPositionPresent = true; | 149 | isPositionPresent = true; |
148 | } | 150 | } |
149 | } | 151 | } |
152 | + | ||
150 | if (isPositionPresent) { | 153 | if (isPositionPresent) { |
151 | maxPosition++; | 154 | maxPosition++; |
152 | } | 155 | } | ... | ... |
1 | +/* | ||
2 | + * Copyright 2016-present Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | + | ||
17 | +package org.onosproject.yangutils.parser.impl.listeners; | ||
18 | + | ||
19 | +/* | ||
20 | + * Reference: RFC6020 and YANG ANTLR Grammar | ||
21 | + * | ||
22 | + * ABNF grammar as per RFC6020 | ||
23 | + * type-body-stmts = numerical-restrictions / | ||
24 | + * decimal64-specification / | ||
25 | + * string-restrictions / | ||
26 | + * enum-specification / | ||
27 | + * leafref-specification / | ||
28 | + * identityref-specification / | ||
29 | + * instance-identifier-specification / | ||
30 | + * bits-specification / | ||
31 | + * union-specification | ||
32 | + * | ||
33 | + * decimal64-specification = fraction-digits-stmt [range-stmt stmtsep] | ||
34 | + * | ||
35 | + * fraction-digits-stmt = fraction-digits-keyword sep | ||
36 | + * fraction-digits-arg-str stmtend | ||
37 | + * | ||
38 | + * fraction-digits-arg-str = < a string that matches the rule | ||
39 | + * fraction-digits-arg > | ||
40 | + * | ||
41 | + * fraction-digits-arg = ("1" ["0" / "1" / "2" / "3" / "4" / | ||
42 | + * "5" / "6" / "7" / "8"]) | ||
43 | + * / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" | ||
44 | + * | ||
45 | + * range-stmt = range-keyword sep range-arg-str optsep | ||
46 | + * (";" / | ||
47 | + * "{" stmtsep | ||
48 | + * ;; these stmts can appear in any order | ||
49 | + * [error-message-stmt stmtsep] | ||
50 | + * [error-app-tag-stmt stmtsep] | ||
51 | + * [description-stmt stmtsep] | ||
52 | + * [reference-stmt stmtsep] | ||
53 | + * "}") | ||
54 | + * ANTLR grammar rule | ||
55 | + * | ||
56 | + * typeBodyStatements : numericalRestrictions | decimal64Specification | stringRestrictions | enumSpecification | ||
57 | + * | leafrefSpecification | identityrefSpecification | instanceIdentifierSpecification | ||
58 | + * | bitsSpecification | unionSpecification; | ||
59 | + * | ||
60 | + * decimal64Specification : fractionDigitStatement rangeStatement?; | ||
61 | + * | ||
62 | + * fractionDigitStatement : FRACTION_DIGITS_KEYWORD fraction STMTEND; | ||
63 | + * | ||
64 | + * fraction : string; | ||
65 | + */ | ||
66 | + | ||
67 | +import org.onosproject.yangutils.datamodel.YangDecimal64; | ||
68 | +import org.onosproject.yangutils.datamodel.YangRangeRestriction; | ||
69 | +import org.onosproject.yangutils.datamodel.YangType; | ||
70 | +import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | ||
71 | +import org.onosproject.yangutils.datamodel.utils.Parsable; | ||
72 | +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | ||
73 | +import org.onosproject.yangutils.parser.exceptions.ParserException; | ||
74 | +import org.onosproject.yangutils.parser.impl.TreeWalkListener; | ||
75 | + | ||
76 | +import static org.onosproject.yangutils.datamodel.utils.YangConstructType.DECIMAL64_DATA; | ||
77 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; | ||
78 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT; | ||
79 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; | ||
80 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; | ||
81 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; | ||
82 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; | ||
83 | + | ||
84 | +/** | ||
85 | + * Represents listener based call back function corresponding to the "decimal64" rule | ||
86 | + * defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020. | ||
87 | + */ | ||
88 | +public final class Decimal64Listener { | ||
89 | + | ||
90 | + /** | ||
91 | + * Creates a new Decimal64 listener. | ||
92 | + */ | ||
93 | + private Decimal64Listener() { | ||
94 | + } | ||
95 | + | ||
96 | + /** | ||
97 | + * It is called when parser enters grammar rule (decimal64), it perform | ||
98 | + * validations and updates the data model tree. | ||
99 | + * | ||
100 | + * @param listener listener's object | ||
101 | + * @param ctx context object of the grammar rule | ||
102 | + */ | ||
103 | + public static void processDecimal64Entry(TreeWalkListener listener, | ||
104 | + GeneratedYangParser.Decimal64SpecificationContext ctx) { | ||
105 | + | ||
106 | + // Check for stack to be non empty. | ||
107 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, DECIMAL64_DATA, "", ENTRY); | ||
108 | + | ||
109 | + Parsable tmpNode = listener.getParsedDataStack().peek(); | ||
110 | + if (tmpNode instanceof YangType) { | ||
111 | + YangType<YangDecimal64<YangRangeRestriction>> typeNode = | ||
112 | + (YangType<YangDecimal64<YangRangeRestriction>>) tmpNode; | ||
113 | + YangDecimal64 decimal64Node = new YangDecimal64(); | ||
114 | + typeNode.setDataTypeExtendedInfo(decimal64Node); | ||
115 | + } else { | ||
116 | + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, DECIMAL64_DATA, "", ENTRY)); | ||
117 | + } | ||
118 | + } | ||
119 | + | ||
120 | + /** | ||
121 | + * Performs validation and updates the data model tree. | ||
122 | + * It is called when parser exits from grammar rule (decimal64). | ||
123 | + * | ||
124 | + * @param listener listener's object | ||
125 | + * @param ctx context object of the grammar rule | ||
126 | + */ | ||
127 | + public static void processDecimal64Exit(TreeWalkListener listener, | ||
128 | + GeneratedYangParser.Decimal64SpecificationContext ctx) { | ||
129 | + | ||
130 | + // Check for stack to be non empty. | ||
131 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, DECIMAL64_DATA, "", EXIT); | ||
132 | + | ||
133 | + Parsable tmpNode = listener.getParsedDataStack().peek(); | ||
134 | + if (tmpNode instanceof YangType) { | ||
135 | + YangType<YangDecimal64<YangRangeRestriction>> typeNode = | ||
136 | + (YangType<YangDecimal64<YangRangeRestriction>>) tmpNode; | ||
137 | + YangDecimal64<YangRangeRestriction> decimal64Node = typeNode.getDataTypeExtendedInfo(); | ||
138 | + try { | ||
139 | + decimal64Node.validateRange(); | ||
140 | + } catch (DataModelException e) { | ||
141 | + throw new ParserException(e); | ||
142 | + } | ||
143 | + } else { | ||
144 | + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, DECIMAL64_DATA, "", EXIT)); | ||
145 | + } | ||
146 | + } | ||
147 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +/* | ||
2 | + * Copyright 2016-present Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | + | ||
17 | +package org.onosproject.yangutils.parser.impl.listeners; | ||
18 | + | ||
19 | +/* | ||
20 | + * Reference: RFC6020 and YANG ANTLR Grammar | ||
21 | + * | ||
22 | + * ABNF grammar as per RFC6020 | ||
23 | + * decimal64-specification = fraction-digits-stmt | ||
24 | + * | ||
25 | + * fraction-digits-stmt = fraction-digits-keyword sep | ||
26 | + * fraction-digits-arg-str stmtend | ||
27 | + * | ||
28 | + * fraction-digits-arg-str = < a string that matches the rule | ||
29 | + * fraction-digits-arg > | ||
30 | + * | ||
31 | + * fraction-digits-arg = ("1" ["0" / "1" / "2" / "3" / "4" / | ||
32 | + * "5" / "6" / "7" / "8"]) | ||
33 | + * / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" | ||
34 | + * | ||
35 | + * ANTLR grammar rule | ||
36 | + * decimal64Specification : FRACTION_DIGITS_KEYWORD fraction STMTEND; | ||
37 | + * | ||
38 | + * fraction : string; | ||
39 | + */ | ||
40 | + | ||
41 | +import org.onosproject.yangutils.datamodel.YangDecimal64; | ||
42 | +import org.onosproject.yangutils.datamodel.YangRangeRestriction; | ||
43 | +import org.onosproject.yangutils.datamodel.YangType; | ||
44 | +import org.onosproject.yangutils.datamodel.utils.Parsable; | ||
45 | +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | ||
46 | +import org.onosproject.yangutils.parser.exceptions.ParserException; | ||
47 | +import org.onosproject.yangutils.parser.impl.TreeWalkListener; | ||
48 | + | ||
49 | +import static org.onosproject.yangutils.datamodel.utils.YangConstructType.FRACTION_DIGITS_DATA; | ||
50 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; | ||
51 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; | ||
52 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER; | ||
53 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER; | ||
54 | +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty; | ||
55 | + | ||
56 | +/** | ||
57 | + * Represents listener based call back function corresponding to the "fraction-digits" | ||
58 | + * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020. | ||
59 | + */ | ||
60 | +public final class FractionDigitsListener { | ||
61 | + | ||
62 | + /** | ||
63 | + * Creates a new bit listener. | ||
64 | + */ | ||
65 | + private FractionDigitsListener() { | ||
66 | + } | ||
67 | + | ||
68 | + /** | ||
69 | + * It is called when parser enters grammar rule (fraction-digits), it perform | ||
70 | + * validations and updates the data model tree. | ||
71 | + * | ||
72 | + * @param listener listener's object | ||
73 | + * @param ctx context object of the grammar rule | ||
74 | + */ | ||
75 | + public static void processFractionDigitsEntry(TreeWalkListener listener, | ||
76 | + GeneratedYangParser.FractionDigitStatementContext ctx) { | ||
77 | + | ||
78 | + // Check for stack to be non empty. | ||
79 | + checkStackIsNotEmpty(listener, MISSING_HOLDER, FRACTION_DIGITS_DATA, ctx.fraction().getText(), ENTRY); | ||
80 | + | ||
81 | + int value = getValidFractionDigits(ctx); | ||
82 | + | ||
83 | + Parsable tmpNode = listener.getParsedDataStack().peek(); | ||
84 | + if (tmpNode instanceof YangType) { | ||
85 | + YangType<YangDecimal64<YangRangeRestriction>> typeNode = | ||
86 | + (YangType<YangDecimal64<YangRangeRestriction>>) tmpNode; | ||
87 | + YangDecimal64 decimal64Node = typeNode.getDataTypeExtendedInfo(); | ||
88 | + decimal64Node.setFractionDigit(value); | ||
89 | + } else { | ||
90 | + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, FRACTION_DIGITS_DATA, | ||
91 | + ctx.fraction().getText(), ENTRY)); | ||
92 | + } | ||
93 | + } | ||
94 | + | ||
95 | + /** | ||
96 | + * Validate fraction digits. | ||
97 | + * | ||
98 | + * @param ctx context object of the grammar rule | ||
99 | + * @return validated fraction-digits | ||
100 | + */ | ||
101 | + public static int getValidFractionDigits(GeneratedYangParser.FractionDigitStatementContext ctx) { | ||
102 | + String value = ctx.fraction().getText().trim(); | ||
103 | + ParserException parserException; | ||
104 | + | ||
105 | + int fractionDigits = Integer.parseInt(value); | ||
106 | + if ((fractionDigits >= YangDecimal64.MIN_FRACTION_DIGITS_VALUE) && | ||
107 | + (fractionDigits <= YangDecimal64.MAX_FRACTION_DIGITS_VALUE)) { | ||
108 | + return fractionDigits; | ||
109 | + } else { | ||
110 | + parserException = | ||
111 | + new ParserException("YANG file error : fraction-digits value should be between 1 and 18."); | ||
112 | + parserException.setLine(ctx.getStart().getLine()); | ||
113 | + parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
114 | + throw parserException; | ||
115 | + } | ||
116 | + } | ||
117 | +} |
... | @@ -109,17 +109,14 @@ public final class PositionListener { | ... | @@ -109,17 +109,14 @@ public final class PositionListener { |
109 | switch (tmpNode.getYangConstructType()) { | 109 | switch (tmpNode.getYangConstructType()) { |
110 | case BITS_DATA: { | 110 | case BITS_DATA: { |
111 | YangBits yangBits = (YangBits) tmpNode; | 111 | YangBits yangBits = (YangBits) tmpNode; |
112 | - for (YangBit curBit : yangBits.getBitSet()) { | ||
113 | - if (positionValue == curBit.getPosition()) { | ||
114 | - listener.getParsedDataStack().push(bitNode); | ||
115 | - ParserException parserException = new ParserException("YANG file error: Duplicate value of " + | ||
116 | - "position is invalid."); | ||
117 | - parserException.setLine(ctx.getStart().getLine()); | ||
118 | - parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
119 | - throw parserException; | ||
120 | - } | ||
121 | - } | ||
122 | listener.getParsedDataStack().push(bitNode); | 112 | listener.getParsedDataStack().push(bitNode); |
113 | + if (yangBits.isBitPositionExists(positionValue)) { | ||
114 | + ParserException parserException = new ParserException("YANG file error: Duplicate value of " + | ||
115 | + "position is invalid."); | ||
116 | + parserException.setLine(ctx.getStart().getLine()); | ||
117 | + parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
118 | + throw parserException; | ||
119 | + } | ||
123 | return positionValue; | 120 | return positionValue; |
124 | } | 121 | } |
125 | default: | 122 | default: | ... | ... |
... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
16 | 16 | ||
17 | package org.onosproject.yangutils.parser.impl.listeners; | 17 | package org.onosproject.yangutils.parser.impl.listeners; |
18 | 18 | ||
19 | +import org.onosproject.yangutils.datamodel.YangDecimal64; | ||
19 | import org.onosproject.yangutils.datamodel.YangDerivedInfo; | 20 | import org.onosproject.yangutils.datamodel.YangDerivedInfo; |
20 | import org.onosproject.yangutils.datamodel.YangRangeRestriction; | 21 | import org.onosproject.yangutils.datamodel.YangRangeRestriction; |
21 | import org.onosproject.yangutils.datamodel.YangType; | 22 | import org.onosproject.yangutils.datamodel.YangType; |
... | @@ -25,6 +26,7 @@ import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | ... | @@ -25,6 +26,7 @@ import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; |
25 | import org.onosproject.yangutils.parser.exceptions.ParserException; | 26 | import org.onosproject.yangutils.parser.exceptions.ParserException; |
26 | import org.onosproject.yangutils.parser.impl.TreeWalkListener; | 27 | import org.onosproject.yangutils.parser.impl.TreeWalkListener; |
27 | 28 | ||
29 | +import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DECIMAL64; | ||
28 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DERIVED; | 30 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DERIVED; |
29 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypeUtils.isOfRangeRestrictedType; | 31 | import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypeUtils.isOfRangeRestrictedType; |
30 | import static org.onosproject.yangutils.datamodel.utils.RestrictionResolver.processRangeRestriction; | 32 | import static org.onosproject.yangutils.datamodel.utils.RestrictionResolver.processRangeRestriction; |
... | @@ -112,7 +114,7 @@ public final class RangeRestrictionListener { | ... | @@ -112,7 +114,7 @@ public final class RangeRestrictionListener { |
112 | return; | 114 | return; |
113 | } | 115 | } |
114 | 116 | ||
115 | - if (!(isOfRangeRestrictedType(type.getDataType()))) { | 117 | + if (!(isOfRangeRestrictedType(type.getDataType())) && (type.getDataType() != DECIMAL64)) { |
116 | ParserException parserException = new ParserException("YANG file error: Range restriction can't be " + | 118 | ParserException parserException = new ParserException("YANG file error: Range restriction can't be " + |
117 | "applied to a given type"); | 119 | "applied to a given type"); |
118 | parserException.setLine(ctx.getStart().getLine()); | 120 | parserException.setLine(ctx.getStart().getLine()); |
... | @@ -122,8 +124,17 @@ public final class RangeRestrictionListener { | ... | @@ -122,8 +124,17 @@ public final class RangeRestrictionListener { |
122 | 124 | ||
123 | YangRangeRestriction rangeRestriction = null; | 125 | YangRangeRestriction rangeRestriction = null; |
124 | try { | 126 | try { |
125 | - rangeRestriction = processRangeRestriction(null, ctx.getStart().getLine(), | 127 | + if (type.getDataType() == DECIMAL64) { |
126 | - ctx.getStart().getCharPositionInLine(), false, ctx.range().getText(), type.getDataType()); | 128 | + YangDecimal64 yangDecimal64 = (YangDecimal64) type.getDataTypeExtendedInfo(); |
129 | + rangeRestriction = processRangeRestriction(yangDecimal64.getDefaultRangeRestriction(), | ||
130 | + ctx.getStart().getLine(), | ||
131 | + ctx.getStart().getCharPositionInLine(), | ||
132 | + true, ctx.range().getText(), type.getDataType()); | ||
133 | + } else { | ||
134 | + rangeRestriction = processRangeRestriction(null, ctx.getStart().getLine(), | ||
135 | + ctx.getStart().getCharPositionInLine(), | ||
136 | + false, ctx.range().getText(), type.getDataType()); | ||
137 | + } | ||
127 | } catch (DataModelException e) { | 138 | } catch (DataModelException e) { |
128 | ParserException parserException = new ParserException(e.getMessage()); | 139 | ParserException parserException = new ParserException(e.getMessage()); |
129 | parserException.setCharPosition(e.getCharPositionInLine()); | 140 | parserException.setCharPosition(e.getCharPositionInLine()); |
... | @@ -132,7 +143,12 @@ public final class RangeRestrictionListener { | ... | @@ -132,7 +143,12 @@ public final class RangeRestrictionListener { |
132 | } | 143 | } |
133 | 144 | ||
134 | if (rangeRestriction != null) { | 145 | if (rangeRestriction != null) { |
135 | - type.setDataTypeExtendedInfo(rangeRestriction); | 146 | + if (type.getDataType() == DECIMAL64) { |
147 | + ((YangDecimal64<YangRangeRestriction>) type.getDataTypeExtendedInfo()) | ||
148 | + .setRangeRestrictedExtendedInfo(rangeRestriction); | ||
149 | + } else { | ||
150 | + type.setDataTypeExtendedInfo(rangeRestriction); | ||
151 | + } | ||
136 | } | 152 | } |
137 | listener.getParsedDataStack().push(rangeRestriction); | 153 | listener.getParsedDataStack().push(rangeRestriction); |
138 | } | 154 | } | ... | ... |
... | @@ -94,6 +94,7 @@ public final class TypeListener { | ... | @@ -94,6 +94,7 @@ public final class TypeListener { |
94 | // Obtain the YANG data type. | 94 | // Obtain the YANG data type. |
95 | YangDataTypes yangDataTypes = YangDataTypes.getType(ctx.string().getText()); | 95 | YangDataTypes yangDataTypes = YangDataTypes.getType(ctx.string().getText()); |
96 | 96 | ||
97 | + // validate type sub-statement cardinality | ||
97 | validateTypeSubStatementCardinality(ctx, yangDataTypes); | 98 | validateTypeSubStatementCardinality(ctx, yangDataTypes); |
98 | 99 | ||
99 | // Create YANG type object and fill the values. | 100 | // Create YANG type object and fill the values. |
... | @@ -306,6 +307,10 @@ public final class TypeListener { | ... | @@ -306,6 +307,10 @@ public final class TypeListener { |
306 | parserException = new ParserException("YANG file error : a type bits" + | 307 | parserException = new ParserException("YANG file error : a type bits" + |
307 | " must have atleast one bit statement."); | 308 | " must have atleast one bit statement."); |
308 | break; | 309 | break; |
310 | + case DECIMAL64: | ||
311 | + parserException = new ParserException("YANG file error : a type decimal64" + | ||
312 | + " must have fraction-digits statement."); | ||
313 | + break; | ||
309 | case LEAFREF: | 314 | case LEAFREF: |
310 | parserException = new ParserException("YANG file error : a type leafref" + | 315 | parserException = new ParserException("YANG file error : a type leafref" + |
311 | " must have one path statement."); | 316 | " must have one path statement."); |
... | @@ -314,7 +319,6 @@ public final class TypeListener { | ... | @@ -314,7 +319,6 @@ public final class TypeListener { |
314 | parserException = new ParserException("YANG file error : a type identityref" + | 319 | parserException = new ParserException("YANG file error : a type identityref" + |
315 | " must have base statement."); | 320 | " must have base statement."); |
316 | break; | 321 | break; |
317 | - // TODO : decimal64, | ||
318 | default: | 322 | default: |
319 | return; | 323 | return; |
320 | } | 324 | } | ... | ... |
... | @@ -37,10 +37,13 @@ import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil; | ... | @@ -37,10 +37,13 @@ import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil; |
37 | import static org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModelUtils.getCurNodePackage; | 37 | import static org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModelUtils.getCurNodePackage; |
38 | import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getRootPackage; | 38 | import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getRootPackage; |
39 | import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER; | 39 | import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER; |
40 | +import static org.onosproject.yangutils.utils.UtilConstants.BIG_DECIMAL; | ||
41 | +import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET; | ||
40 | import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE; | 42 | import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE; |
41 | import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_WRAPPER; | 43 | import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_WRAPPER; |
42 | import static org.onosproject.yangutils.utils.UtilConstants.BYTE; | 44 | import static org.onosproject.yangutils.utils.UtilConstants.BYTE; |
43 | import static org.onosproject.yangutils.utils.UtilConstants.BYTE_WRAPPER; | 45 | import static org.onosproject.yangutils.utils.UtilConstants.BYTE_WRAPPER; |
46 | +import static org.onosproject.yangutils.utils.UtilConstants.COLLECTION_IMPORTS; | ||
44 | import static org.onosproject.yangutils.utils.UtilConstants.INT; | 47 | import static org.onosproject.yangutils.utils.UtilConstants.INT; |
45 | import static org.onosproject.yangutils.utils.UtilConstants.INTEGER_WRAPPER; | 48 | import static org.onosproject.yangutils.utils.UtilConstants.INTEGER_WRAPPER; |
46 | import static org.onosproject.yangutils.utils.UtilConstants.JAVA_LANG; | 49 | import static org.onosproject.yangutils.utils.UtilConstants.JAVA_LANG; |
... | @@ -50,11 +53,8 @@ import static org.onosproject.yangutils.utils.UtilConstants.LONG_WRAPPER; | ... | @@ -50,11 +53,8 @@ import static org.onosproject.yangutils.utils.UtilConstants.LONG_WRAPPER; |
50 | import static org.onosproject.yangutils.utils.UtilConstants.PERIOD; | 53 | import static org.onosproject.yangutils.utils.UtilConstants.PERIOD; |
51 | import static org.onosproject.yangutils.utils.UtilConstants.SHORT; | 54 | import static org.onosproject.yangutils.utils.UtilConstants.SHORT; |
52 | import static org.onosproject.yangutils.utils.UtilConstants.SHORT_WRAPPER; | 55 | import static org.onosproject.yangutils.utils.UtilConstants.SHORT_WRAPPER; |
56 | +import static org.onosproject.yangutils.utils.UtilConstants.SQUARE_BRACKETS; | ||
53 | import static org.onosproject.yangutils.utils.UtilConstants.STRING_DATA_TYPE; | 57 | import static org.onosproject.yangutils.utils.UtilConstants.STRING_DATA_TYPE; |
54 | -import static org.onosproject.yangutils.utils.UtilConstants.YANG_BINARY_CLASS; | ||
55 | -import static org.onosproject.yangutils.utils.UtilConstants.YANG_BITS_CLASS; | ||
56 | -import static org.onosproject.yangutils.utils.UtilConstants.YANG_DECIMAL64_CLASS; | ||
57 | -import static org.onosproject.yangutils.utils.UtilConstants.YANG_TYPES_PKG; | ||
58 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase; | 58 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase; |
59 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase; | 59 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase; |
60 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getPackageDirPathFromJavaJPackage; | 60 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getPackageDirPathFromJavaJPackage; |
... | @@ -97,10 +97,12 @@ public final class AttributesJavaDataType { | ... | @@ -97,10 +97,12 @@ public final class AttributesJavaDataType { |
97 | return LONG; | 97 | return LONG; |
98 | case UINT64: | 98 | case UINT64: |
99 | return BIG_INTEGER; | 99 | return BIG_INTEGER; |
100 | + case BITS: | ||
101 | + return BIT_SET; | ||
100 | case BINARY: | 102 | case BINARY: |
101 | - return YANG_BINARY_CLASS; | 103 | + return BYTE + SQUARE_BRACKETS; |
102 | case DECIMAL64: | 104 | case DECIMAL64: |
103 | - return YANG_DECIMAL64_CLASS; | 105 | + return BIG_DECIMAL; |
104 | case STRING: | 106 | case STRING: |
105 | return STRING_DATA_TYPE; | 107 | return STRING_DATA_TYPE; |
106 | case BOOLEAN: | 108 | case BOOLEAN: |
... | @@ -146,7 +148,7 @@ public final class AttributesJavaDataType { | ... | @@ -146,7 +148,7 @@ public final class AttributesJavaDataType { |
146 | case UINT64: | 148 | case UINT64: |
147 | return BIG_INTEGER; | 149 | return BIG_INTEGER; |
148 | case DECIMAL64: | 150 | case DECIMAL64: |
149 | - return YANG_DECIMAL64_CLASS; | 151 | + return BIG_DECIMAL; |
150 | case STRING: | 152 | case STRING: |
151 | return STRING_DATA_TYPE; | 153 | return STRING_DATA_TYPE; |
152 | case BOOLEAN: | 154 | case BOOLEAN: |
... | @@ -156,9 +158,9 @@ public final class AttributesJavaDataType { | ... | @@ -156,9 +158,9 @@ public final class AttributesJavaDataType { |
156 | getCamelCase(((YangJavaEnumeration) yangType.getDataTypeExtendedInfo()).getName(), | 158 | getCamelCase(((YangJavaEnumeration) yangType.getDataTypeExtendedInfo()).getName(), |
157 | pluginConfig)); | 159 | pluginConfig)); |
158 | case BITS: | 160 | case BITS: |
159 | - return YANG_BITS_CLASS; | 161 | + return BIT_SET; |
160 | case BINARY: | 162 | case BINARY: |
161 | - return YANG_BINARY_CLASS; | 163 | + return BYTE + SQUARE_BRACKETS; |
162 | case LEAFREF: | 164 | case LEAFREF: |
163 | YangType<?> referredType = getReferredTypeFromLeafref(yangType); | 165 | YangType<?> referredType = getReferredTypeFromLeafref(yangType); |
164 | return getJavaImportClass(referredType, isListAttr, pluginConfig); | 166 | return getJavaImportClass(referredType, isListAttr, pluginConfig); |
... | @@ -184,8 +186,6 @@ public final class AttributesJavaDataType { | ... | @@ -184,8 +186,6 @@ public final class AttributesJavaDataType { |
184 | switch (type) { | 186 | switch (type) { |
185 | case UINT64: | 187 | case UINT64: |
186 | return BIG_INTEGER; | 188 | return BIG_INTEGER; |
187 | - case DECIMAL64: | ||
188 | - return YANG_DECIMAL64_CLASS; | ||
189 | case STRING: | 189 | case STRING: |
190 | return STRING_DATA_TYPE; | 190 | return STRING_DATA_TYPE; |
191 | case ENUMERATION: | 191 | case ENUMERATION: |
... | @@ -193,9 +193,9 @@ public final class AttributesJavaDataType { | ... | @@ -193,9 +193,9 @@ public final class AttributesJavaDataType { |
193 | getCamelCase(((YangJavaEnumeration) yangType.getDataTypeExtendedInfo()).getName(), | 193 | getCamelCase(((YangJavaEnumeration) yangType.getDataTypeExtendedInfo()).getName(), |
194 | pluginConfig)); | 194 | pluginConfig)); |
195 | case BITS: | 195 | case BITS: |
196 | - return YANG_BITS_CLASS; | 196 | + return BIT_SET; |
197 | - case BINARY: | 197 | + case DECIMAL64: |
198 | - return YANG_BINARY_CLASS; | 198 | + return BIG_DECIMAL; |
199 | case LEAFREF: | 199 | case LEAFREF: |
200 | YangType<?> referredType = getReferredTypeFromLeafref(yangType); | 200 | YangType<?> referredType = getReferredTypeFromLeafref(yangType); |
201 | return getJavaImportClass(referredType, isListAttr, pluginConfig); | 201 | return getJavaImportClass(referredType, isListAttr, pluginConfig); |
... | @@ -241,18 +241,18 @@ public final class AttributesJavaDataType { | ... | @@ -241,18 +241,18 @@ public final class AttributesJavaDataType { |
241 | case UINT8: | 241 | case UINT8: |
242 | case UINT16: | 242 | case UINT16: |
243 | case UINT32: | 243 | case UINT32: |
244 | + case BINARY: | ||
244 | case STRING: | 245 | case STRING: |
245 | case BOOLEAN: | 246 | case BOOLEAN: |
246 | case EMPTY: | 247 | case EMPTY: |
247 | return JAVA_LANG; | 248 | return JAVA_LANG; |
248 | case UINT64: | 249 | case UINT64: |
250 | + case DECIMAL64: | ||
249 | return JAVA_MATH; | 251 | return JAVA_MATH; |
250 | case ENUMERATION: | 252 | case ENUMERATION: |
251 | return getEnumsPackage(yangType, conflictResolver); | 253 | return getEnumsPackage(yangType, conflictResolver); |
252 | - case DECIMAL64: | ||
253 | case BITS: | 254 | case BITS: |
254 | - case BINARY: | 255 | + return COLLECTION_IMPORTS; |
255 | - return YANG_TYPES_PKG; | ||
256 | case LEAFREF: | 256 | case LEAFREF: |
257 | YangType<?> referredType = getReferredTypeFromLeafref(yangType); | 257 | YangType<?> referredType = getReferredTypeFromLeafref(yangType); |
258 | return getJavaImportPackage(referredType, isListAttr, conflictResolver); | 258 | return getJavaImportPackage(referredType, isListAttr, conflictResolver); |
... | @@ -270,22 +270,20 @@ public final class AttributesJavaDataType { | ... | @@ -270,22 +270,20 @@ public final class AttributesJavaDataType { |
270 | } else { | 270 | } else { |
271 | switch (type) { | 271 | switch (type) { |
272 | case UINT64: | 272 | case UINT64: |
273 | + case DECIMAL64: | ||
273 | return JAVA_MATH; | 274 | return JAVA_MATH; |
275 | + case EMPTY: | ||
274 | case STRING: | 276 | case STRING: |
275 | return JAVA_LANG; | 277 | return JAVA_LANG; |
276 | case ENUMERATION: | 278 | case ENUMERATION: |
277 | return getEnumsPackage(yangType, conflictResolver); | 279 | return getEnumsPackage(yangType, conflictResolver); |
278 | - case DECIMAL64: | ||
279 | case BITS: | 280 | case BITS: |
280 | - case BINARY: | 281 | + return COLLECTION_IMPORTS; |
281 | - return YANG_TYPES_PKG; | ||
282 | case LEAFREF: | 282 | case LEAFREF: |
283 | YangType<?> referredType = getReferredTypeFromLeafref(yangType); | 283 | YangType<?> referredType = getReferredTypeFromLeafref(yangType); |
284 | return getJavaImportPackage(referredType, isListAttr, conflictResolver); | 284 | return getJavaImportPackage(referredType, isListAttr, conflictResolver); |
285 | case IDENTITYREF: | 285 | case IDENTITYREF: |
286 | return getIdentityRefPackage(yangType, conflictResolver); | 286 | return getIdentityRefPackage(yangType, conflictResolver); |
287 | - case EMPTY: | ||
288 | - return JAVA_LANG; | ||
289 | case UNION: | 287 | case UNION: |
290 | return getUnionPackage(yangType, conflictResolver); | 288 | return getUnionPackage(yangType, conflictResolver); |
291 | case INSTANCE_IDENTIFIER: | 289 | case INSTANCE_IDENTIFIER: | ... | ... |
... | @@ -35,6 +35,7 @@ import static org.onosproject.yangutils.utils.UtilConstants.AND; | ... | @@ -35,6 +35,7 @@ import static org.onosproject.yangutils.utils.UtilConstants.AND; |
35 | import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTATION; | 35 | import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTATION; |
36 | import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTED_INFO; | 36 | import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTED_INFO; |
37 | import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER; | 37 | import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER; |
38 | +import static org.onosproject.yangutils.utils.UtilConstants.BIG_DECIMAL; | ||
38 | import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE; | 39 | import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE; |
39 | import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_WRAPPER; | 40 | import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_WRAPPER; |
40 | import static org.onosproject.yangutils.utils.UtilConstants.BUILD; | 41 | import static org.onosproject.yangutils.utils.UtilConstants.BUILD; |
... | @@ -54,6 +55,7 @@ import static org.onosproject.yangutils.utils.UtilConstants.DEACTIVATE_ANNOTATIO | ... | @@ -54,6 +55,7 @@ import static org.onosproject.yangutils.utils.UtilConstants.DEACTIVATE_ANNOTATIO |
54 | import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT; | 55 | import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT; |
55 | import static org.onosproject.yangutils.utils.UtilConstants.DIAMOND_CLOSE_BRACKET; | 56 | import static org.onosproject.yangutils.utils.UtilConstants.DIAMOND_CLOSE_BRACKET; |
56 | import static org.onosproject.yangutils.utils.UtilConstants.DIAMOND_OPEN_BRACKET; | 57 | import static org.onosproject.yangutils.utils.UtilConstants.DIAMOND_OPEN_BRACKET; |
58 | +import static org.onosproject.yangutils.utils.UtilConstants.DOUBLE; | ||
57 | import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION; | 59 | import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION; |
58 | import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING; | 60 | import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING; |
59 | import static org.onosproject.yangutils.utils.UtilConstants.EQUAL; | 61 | import static org.onosproject.yangutils.utils.UtilConstants.EQUAL; |
... | @@ -64,6 +66,7 @@ import static org.onosproject.yangutils.utils.UtilConstants.FALSE; | ... | @@ -64,6 +66,7 @@ import static org.onosproject.yangutils.utils.UtilConstants.FALSE; |
64 | import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION; | 66 | import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION; |
65 | import static org.onosproject.yangutils.utils.UtilConstants.FROM_STRING_METHOD_NAME; | 67 | import static org.onosproject.yangutils.utils.UtilConstants.FROM_STRING_METHOD_NAME; |
66 | import static org.onosproject.yangutils.utils.UtilConstants.FROM_STRING_PARAM_NAME; | 68 | import static org.onosproject.yangutils.utils.UtilConstants.FROM_STRING_PARAM_NAME; |
69 | +import static org.onosproject.yangutils.utils.UtilConstants.GET_BYTES; | ||
67 | import static org.onosproject.yangutils.utils.UtilConstants.GET_METHOD_PREFIX; | 70 | import static org.onosproject.yangutils.utils.UtilConstants.GET_METHOD_PREFIX; |
68 | import static org.onosproject.yangutils.utils.UtilConstants.GOOGLE_MORE_OBJECT_METHOD_STRING; | 71 | import static org.onosproject.yangutils.utils.UtilConstants.GOOGLE_MORE_OBJECT_METHOD_STRING; |
69 | import static org.onosproject.yangutils.utils.UtilConstants.HASH; | 72 | import static org.onosproject.yangutils.utils.UtilConstants.HASH; |
... | @@ -133,6 +136,7 @@ import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase; | ... | @@ -133,6 +136,7 @@ import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase; |
133 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase; | 136 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase; |
134 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getSmallCase; | 137 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getSmallCase; |
135 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.trimAtLast; | 138 | import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.trimAtLast; |
139 | +import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BINARY; | ||
136 | 140 | ||
137 | /** | 141 | /** |
138 | * Represents generator for methods of generated files based on the file type. | 142 | * Represents generator for methods of generated files based on the file type. |
... | @@ -296,6 +300,7 @@ public final class MethodsGenerator { | ... | @@ -296,6 +300,7 @@ public final class MethodsGenerator { |
296 | case INT: | 300 | case INT: |
297 | case SHORT: | 301 | case SHORT: |
298 | case LONG: | 302 | case LONG: |
303 | + case DOUBLE: | ||
299 | return "0"; | 304 | return "0"; |
300 | case BOOLEAN_DATA_TYPE: | 305 | case BOOLEAN_DATA_TYPE: |
301 | return FALSE; | 306 | return FALSE; |
... | @@ -748,10 +753,15 @@ public final class MethodsGenerator { | ... | @@ -748,10 +753,15 @@ public final class MethodsGenerator { |
748 | JavaAttributeInfo fromStringAttributeInfo) { | 753 | JavaAttributeInfo fromStringAttributeInfo) { |
749 | 754 | ||
750 | String targetDataType = getReturnType(attr); | 755 | String targetDataType = getReturnType(attr); |
751 | - String parseFromStringMethod = getParseFromStringMethod(targetDataType, | 756 | + if (fromStringAttributeInfo.getAttributeType().getDataType() == BINARY) { |
752 | - fromStringAttributeInfo.getAttributeType()); | 757 | + return targetDataType + SPACE + TMP_VAL + SPACE + EQUAL + SPACE + FROM_STRING_PARAM_NAME |
753 | - return targetDataType + SPACE + TMP_VAL + SPACE + EQUAL + SPACE + parseFromStringMethod | 758 | + + PERIOD + GET_BYTES + OPEN_PARENTHESIS + CLOSE_PARENTHESIS; |
754 | - + OPEN_PARENTHESIS + FROM_STRING_PARAM_NAME + CLOSE_PARENTHESIS; | 759 | + } else { |
760 | + String parseFromStringMethod = getParseFromStringMethod(targetDataType, | ||
761 | + fromStringAttributeInfo.getAttributeType()); | ||
762 | + return targetDataType + SPACE + TMP_VAL + SPACE + EQUAL + SPACE + parseFromStringMethod | ||
763 | + + OPEN_PARENTHESIS + FROM_STRING_PARAM_NAME + CLOSE_PARENTHESIS; | ||
764 | + } | ||
755 | } | 765 | } |
756 | 766 | ||
757 | /** | 767 | /** |
... | @@ -1092,14 +1102,14 @@ public final class MethodsGenerator { | ... | @@ -1092,14 +1102,14 @@ public final class MethodsGenerator { |
1092 | return LONG_WRAPPER + PERIOD + PARSE_LONG; | 1102 | return LONG_WRAPPER + PERIOD + PARSE_LONG; |
1093 | case UINT64: | 1103 | case UINT64: |
1094 | return NEW + SPACE + BIG_INTEGER; | 1104 | return NEW + SPACE + BIG_INTEGER; |
1105 | + case DECIMAL64: | ||
1106 | + return NEW + SPACE + BIG_DECIMAL; | ||
1095 | case STRING: | 1107 | case STRING: |
1096 | return EMPTY_STRING; | 1108 | return EMPTY_STRING; |
1097 | case EMPTY: | 1109 | case EMPTY: |
1098 | case BOOLEAN: | 1110 | case BOOLEAN: |
1099 | return BOOLEAN_WRAPPER + PERIOD + PARSE_BOOLEAN; | 1111 | return BOOLEAN_WRAPPER + PERIOD + PARSE_BOOLEAN; |
1100 | - case DECIMAL64: | ||
1101 | case BITS: | 1112 | case BITS: |
1102 | - case BINARY: | ||
1103 | case UNION: | 1113 | case UNION: |
1104 | case ENUMERATION: | 1114 | case ENUMERATION: |
1105 | case DERIVED: | 1115 | case DERIVED: | ... | ... |
... | @@ -197,6 +197,11 @@ public final class UtilConstants { | ... | @@ -197,6 +197,11 @@ public final class UtilConstants { |
197 | public static final String PARSE_BYTE = "parseByte"; | 197 | public static final String PARSE_BYTE = "parseByte"; |
198 | 198 | ||
199 | /** | 199 | /** |
200 | + * Static attribute for get bytes. | ||
201 | + */ | ||
202 | + public static final String GET_BYTES = "getBytes"; | ||
203 | + | ||
204 | + /** | ||
200 | * Static attribute for parse boolean. | 205 | * Static attribute for parse boolean. |
201 | */ | 206 | */ |
202 | public static final String PARSE_BOOLEAN = "parseBoolean"; | 207 | public static final String PARSE_BOOLEAN = "parseBoolean"; |
... | @@ -567,6 +572,11 @@ public final class UtilConstants { | ... | @@ -567,6 +572,11 @@ public final class UtilConstants { |
567 | public static final String CLOSE_CURLY_BRACKET = "}"; | 572 | public static final String CLOSE_CURLY_BRACKET = "}"; |
568 | 573 | ||
569 | /** | 574 | /** |
575 | + * Static attribute for square brackets syntax. | ||
576 | + */ | ||
577 | + public static final String SQUARE_BRACKETS = "[]"; | ||
578 | + | ||
579 | + /** | ||
570 | * Static attribute for getter method prefix. | 580 | * Static attribute for getter method prefix. |
571 | */ | 581 | */ |
572 | public static final String GET_METHOD_PREFIX = "get"; | 582 | public static final String GET_METHOD_PREFIX = "get"; |
... | @@ -687,6 +697,16 @@ public final class UtilConstants { | ... | @@ -687,6 +697,16 @@ public final class UtilConstants { |
687 | public static final String BIG_INTEGER = "BigInteger"; | 697 | public static final String BIG_INTEGER = "BigInteger"; |
688 | 698 | ||
689 | /** | 699 | /** |
700 | + * BigDecimal built in java type. | ||
701 | + */ | ||
702 | + public static final String BIG_DECIMAL = "BigDecimal"; | ||
703 | + | ||
704 | + /** | ||
705 | + * BitSet built in java type. | ||
706 | + */ | ||
707 | + public static final String BIT_SET = "BitSet"; | ||
708 | + | ||
709 | + /** | ||
690 | * Byte java built in type. | 710 | * Byte java built in type. |
691 | */ | 711 | */ |
692 | public static final String BYTE = "byte"; | 712 | public static final String BYTE = "byte"; |
... | @@ -747,6 +767,11 @@ public final class UtilConstants { | ... | @@ -747,6 +767,11 @@ public final class UtilConstants { |
747 | public static final String YANG_UINT64 = "YangUint64"; | 767 | public static final String YANG_UINT64 = "YangUint64"; |
748 | 768 | ||
749 | /** | 769 | /** |
770 | + * Double java built in wrapper type. | ||
771 | + */ | ||
772 | + public static final String DOUBLE_WRAPPER = "Double"; | ||
773 | + | ||
774 | + /** | ||
750 | * List of keywords in java, this is used for checking if the input does not contain these keywords. | 775 | * List of keywords in java, this is used for checking if the input does not contain these keywords. |
751 | */ | 776 | */ |
752 | public static final List<String> JAVA_KEY_WORDS = Arrays.asList( | 777 | public static final List<String> JAVA_KEY_WORDS = Arrays.asList( |
... | @@ -1136,16 +1161,6 @@ public final class UtilConstants { | ... | @@ -1136,16 +1161,6 @@ public final class UtilConstants { |
1136 | public static final String EVENT_LISTENER = "EventListener"; | 1161 | public static final String EVENT_LISTENER = "EventListener"; |
1137 | 1162 | ||
1138 | /** | 1163 | /** |
1139 | - * Static attribute for YangBinary class. | ||
1140 | - */ | ||
1141 | - public static final String YANG_BINARY_CLASS = "YangBinary"; | ||
1142 | - | ||
1143 | - /** | ||
1144 | - * Static attribute for YangBinary class. | ||
1145 | - */ | ||
1146 | - public static final String YANG_BITS_CLASS = "YangBits"; | ||
1147 | - | ||
1148 | - /** | ||
1149 | * Static attribute for YANG types package. | 1164 | * Static attribute for YANG types package. |
1150 | */ | 1165 | */ |
1151 | public static final String YANG_TYPES_PKG = "org.onosproject.yangutils.datamodel.utils.builtindatatype"; | 1166 | public static final String YANG_TYPES_PKG = "org.onosproject.yangutils.datamodel.utils.builtindatatype"; |
... | @@ -1156,11 +1171,6 @@ public final class UtilConstants { | ... | @@ -1156,11 +1171,6 @@ public final class UtilConstants { |
1156 | public static final String MATH_CONTEXT = "MathContext"; | 1171 | public static final String MATH_CONTEXT = "MathContext"; |
1157 | 1172 | ||
1158 | /** | 1173 | /** |
1159 | - * Static attribute for DECIMAL64 class. | ||
1160 | - */ | ||
1161 | - public static final String YANG_DECIMAL64_CLASS = "YangDecimal64"; | ||
1162 | - | ||
1163 | - /** | ||
1164 | * Static attribute for YANG file error. | 1174 | * Static attribute for YANG file error. |
1165 | */ | 1175 | */ |
1166 | public static final String YANG_FILE_ERROR = "YANG file error : "; | 1176 | public static final String YANG_FILE_ERROR = "YANG file error : "; | ... | ... |
... | @@ -375,6 +375,13 @@ package org.onosproject.yangutils.parser.antlrgencode; | ... | @@ -375,6 +375,13 @@ package org.onosproject.yangutils.parser.antlrgencode; |
375 | | bitsSpecification | unionSpecification; | 375 | | bitsSpecification | unionSpecification; |
376 | 376 | ||
377 | /** | 377 | /** |
378 | + * decimal64-specification = ;; these stmts can appear in any order | ||
379 | + * fraction-digits-stmt | ||
380 | + * [range-stmt] | ||
381 | + */ | ||
382 | + decimal64Specification : fractionDigitStatement rangeStatement?; | ||
383 | + | ||
384 | + /** | ||
378 | * fraction-digits-stmt = fraction-digits-keyword sep | 385 | * fraction-digits-stmt = fraction-digits-keyword sep |
379 | * fraction-digits-arg-str stmtend | 386 | * fraction-digits-arg-str stmtend |
380 | * | 387 | * |
... | @@ -385,7 +392,7 @@ package org.onosproject.yangutils.parser.antlrgencode; | ... | @@ -385,7 +392,7 @@ package org.onosproject.yangutils.parser.antlrgencode; |
385 | * "5" / "6" / "7" / "8"]) | 392 | * "5" / "6" / "7" / "8"]) |
386 | * / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" | 393 | * / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" |
387 | */ | 394 | */ |
388 | - decimal64Specification : FRACTION_DIGITS_KEYWORD fraction STMTEND; | 395 | + fractionDigitStatement : FRACTION_DIGITS_KEYWORD fraction STMTEND; |
389 | 396 | ||
390 | /** | 397 | /** |
391 | * numerical-restrictions = range-stmt stmtsep | 398 | * numerical-restrictions = range-stmt stmtsep | ... | ... |
... | @@ -35,7 +35,7 @@ import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; | ... | @@ -35,7 +35,7 @@ import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; |
35 | import java.io.IOException; | 35 | import java.io.IOException; |
36 | import java.util.List; | 36 | import java.util.List; |
37 | import java.util.ListIterator; | 37 | import java.util.ListIterator; |
38 | -import java.util.Set; | 38 | +import java.util.Map; |
39 | 39 | ||
40 | /** | 40 | /** |
41 | * Test cases for bit listener. | 41 | * Test cases for bit listener. |
... | @@ -71,14 +71,38 @@ public class BitListenerTest { | ... | @@ -71,14 +71,38 @@ public class BitListenerTest { |
71 | assertThat(((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitsName(), | 71 | assertThat(((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitsName(), |
72 | is("mybits")); | 72 | is("mybits")); |
73 | 73 | ||
74 | - Set<YangBit> bitSet = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitSet(); | 74 | + // Check bit name map |
75 | - for (YangBit tmp : bitSet) { | 75 | + Map<String, YangBit> bitNameMap = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitNameMap(); |
76 | - if (tmp.getBitName().equals("disable-nagle")) { | 76 | + assertThat(bitNameMap.size(), is(3)); |
77 | - assertThat(tmp.getPosition(), is(0)); | 77 | + for (Map.Entry<String, YangBit> element : bitNameMap.entrySet()) { |
78 | - } else if (tmp.getBitName().equals("auto-sense-speed")) { | 78 | + String bitName = element.getKey(); |
79 | - assertThat(tmp.getPosition(), is(1)); | 79 | + YangBit yangBit = element.getValue(); |
80 | - } else if (tmp.getBitName().equals("Ten-Mb-only")) { | 80 | + if (bitName.equals("disable-nagle")) { |
81 | - assertThat(tmp.getPosition(), is(2)); | 81 | + assertThat(yangBit.getPosition(), is(0)); |
82 | + } else if (bitName.equals("auto-sense-speed")) { | ||
83 | + assertThat(yangBit.getPosition(), is(1)); | ||
84 | + } else if (bitName.equals("Ten-Mb-only")) { | ||
85 | + assertThat(yangBit.getPosition(), is(2)); | ||
86 | + } else { | ||
87 | + throw new IOException("Invalid bit name: " + bitName); | ||
88 | + } | ||
89 | + } | ||
90 | + | ||
91 | + // Check bit position map | ||
92 | + Map<Integer, YangBit> bitPositionMap = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()) | ||
93 | + .getBitPositionMap(); | ||
94 | + assertThat(bitPositionMap.size(), is(3)); | ||
95 | + for (Map.Entry<Integer, YangBit> element : bitPositionMap.entrySet()) { | ||
96 | + int position = element.getKey(); | ||
97 | + YangBit yangBit = element.getValue(); | ||
98 | + if (position == 0) { | ||
99 | + assertThat(yangBit.getBitName(), is("disable-nagle")); | ||
100 | + } else if (position == 1) { | ||
101 | + assertThat(yangBit.getBitName(), is("auto-sense-speed")); | ||
102 | + } else if (position == 2) { | ||
103 | + assertThat(yangBit.getBitName(), is("Ten-Mb-only")); | ||
104 | + } else { | ||
105 | + throw new IOException("Invalid bit position: " + position); | ||
82 | } | 106 | } |
83 | } | 107 | } |
84 | } | 108 | } |
... | @@ -107,12 +131,38 @@ public class BitListenerTest { | ... | @@ -107,12 +131,38 @@ public class BitListenerTest { |
107 | YangType type = typedef.getTypeList().iterator().next(); | 131 | YangType type = typedef.getTypeList().iterator().next(); |
108 | assertThat(type.getDataType(), is(YangDataTypes.BITS)); | 132 | assertThat(type.getDataType(), is(YangDataTypes.BITS)); |
109 | assertThat(type.getDataTypeName(), is("bits")); | 133 | assertThat(type.getDataTypeName(), is("bits")); |
110 | - Set<YangBit> bitSet = ((YangBits) type.getDataTypeExtendedInfo()).getBitSet(); | 134 | + |
111 | - for (YangBit tmp : bitSet) { | 135 | + // Check bit name map |
112 | - if (tmp.getBitName().equals("disable-nagle")) { | 136 | + Map<String, YangBit> bitNameMap = ((YangBits) type.getDataTypeExtendedInfo()).getBitNameMap(); |
113 | - assertThat(tmp.getPosition(), is(0)); | 137 | + assertThat(bitNameMap.size(), is(3)); |
114 | - } else if (tmp.getBitName().equals("auto-sense-speed")) { | 138 | + for (Map.Entry<String, YangBit> element : bitNameMap.entrySet()) { |
115 | - assertThat(tmp.getPosition(), is(1)); | 139 | + String bitName = element.getKey(); |
140 | + YangBit yangBit = element.getValue(); | ||
141 | + if (bitName.equals("disable-nagle")) { | ||
142 | + assertThat(yangBit.getPosition(), is(0)); | ||
143 | + } else if (bitName.equals("auto-sense-speed")) { | ||
144 | + assertThat(yangBit.getPosition(), is(1)); | ||
145 | + } else if (bitName.equals("Mb-only")) { | ||
146 | + assertThat(yangBit.getPosition(), is(2)); | ||
147 | + } else { | ||
148 | + throw new IOException("Invalid bit name: " + bitName); | ||
149 | + } | ||
150 | + } | ||
151 | + | ||
152 | + // Check bit position map | ||
153 | + Map<Integer, YangBit> bitPositionMap = ((YangBits) type.getDataTypeExtendedInfo()).getBitPositionMap(); | ||
154 | + assertThat(bitPositionMap.size(), is(3)); | ||
155 | + for (Map.Entry<Integer, YangBit> element : bitPositionMap.entrySet()) { | ||
156 | + int position = element.getKey(); | ||
157 | + YangBit yangBit = element.getValue(); | ||
158 | + if (position == 0) { | ||
159 | + assertThat(yangBit.getBitName(), is("disable-nagle")); | ||
160 | + } else if (position == 1) { | ||
161 | + assertThat(yangBit.getBitName(), is("auto-sense-speed")); | ||
162 | + } else if (position == 2) { | ||
163 | + assertThat(yangBit.getBitName(), is("Mb-only")); | ||
164 | + } else { | ||
165 | + throw new IOException("Invalid bit position: " + position); | ||
116 | } | 166 | } |
117 | } | 167 | } |
118 | } | 168 | } |
... | @@ -151,12 +201,38 @@ public class BitListenerTest { | ... | @@ -151,12 +201,38 @@ public class BitListenerTest { |
151 | 201 | ||
152 | assertThat(yangType.getDataType(), is(YangDataTypes.BITS)); | 202 | assertThat(yangType.getDataType(), is(YangDataTypes.BITS)); |
153 | assertThat(yangType.getDataTypeName(), is("bits")); | 203 | assertThat(yangType.getDataTypeName(), is("bits")); |
154 | - Set<YangBit> bitSet = ((YangBits) yangType.getDataTypeExtendedInfo()).getBitSet(); | 204 | + |
155 | - for (YangBit tmp : bitSet) { | 205 | + // Check bit name map |
156 | - if (tmp.getBitName().equals("disable-nagle")) { | 206 | + Map<String, YangBit> bitNameMap = ((YangBits) yangType.getDataTypeExtendedInfo()).getBitNameMap(); |
157 | - assertThat(tmp.getPosition(), is(0)); | 207 | + assertThat(bitNameMap.size(), is(3)); |
158 | - } else if (tmp.getBitName().equals("auto-sense-speed")) { | 208 | + for (Map.Entry<String, YangBit> element : bitNameMap.entrySet()) { |
159 | - assertThat(tmp.getPosition(), is(1)); | 209 | + String bitName = element.getKey(); |
210 | + YangBit yangBit = element.getValue(); | ||
211 | + if (bitName.equals("disable-nagle")) { | ||
212 | + assertThat(yangBit.getPosition(), is(0)); | ||
213 | + } else if (bitName.equals("auto-sense-speed")) { | ||
214 | + assertThat(yangBit.getPosition(), is(1)); | ||
215 | + } else if (bitName.equals("Mb-only")) { | ||
216 | + assertThat(yangBit.getPosition(), is(2)); | ||
217 | + } else { | ||
218 | + throw new IOException("Invalid bit name: " + bitName); | ||
219 | + } | ||
220 | + } | ||
221 | + | ||
222 | + // Check bit position map | ||
223 | + Map<Integer, YangBit> bitPositionMap = ((YangBits) yangType.getDataTypeExtendedInfo()).getBitPositionMap(); | ||
224 | + assertThat(bitPositionMap.size(), is(3)); | ||
225 | + for (Map.Entry<Integer, YangBit> element : bitPositionMap.entrySet()) { | ||
226 | + int position = element.getKey(); | ||
227 | + YangBit yangBit = element.getValue(); | ||
228 | + if (position == 0) { | ||
229 | + assertThat(yangBit.getBitName(), is("disable-nagle")); | ||
230 | + } else if (position == 1) { | ||
231 | + assertThat(yangBit.getBitName(), is("auto-sense-speed")); | ||
232 | + } else if (position == 2) { | ||
233 | + assertThat(yangBit.getBitName(), is("Mb-only")); | ||
234 | + } else { | ||
235 | + throw new IOException("Invalid bit position: " + position); | ||
160 | } | 236 | } |
161 | } | 237 | } |
162 | } | 238 | } | ... | ... |
1 | +/* | ||
2 | + * Copyright 2016-present Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | + | ||
17 | +package org.onosproject.yangutils.parser.impl.listeners; | ||
18 | + | ||
19 | +import static org.hamcrest.MatcherAssert.assertThat; | ||
20 | +import static org.hamcrest.core.Is.is; | ||
21 | + | ||
22 | +import org.junit.Rule; | ||
23 | +import org.junit.Test; | ||
24 | +import org.junit.rules.ExpectedException; | ||
25 | +import org.onosproject.yangutils.datamodel.YangDecimal64; | ||
26 | +import org.onosproject.yangutils.datamodel.YangDerivedInfo; | ||
27 | +import org.onosproject.yangutils.datamodel.YangLeaf; | ||
28 | +import org.onosproject.yangutils.datamodel.YangModule; | ||
29 | +import org.onosproject.yangutils.datamodel.YangNode; | ||
30 | +import org.onosproject.yangutils.datamodel.YangNodeType; | ||
31 | +import org.onosproject.yangutils.datamodel.YangRangeRestriction; | ||
32 | +import org.onosproject.yangutils.datamodel.YangRangeInterval; | ||
33 | +import org.onosproject.yangutils.datamodel.YangType; | ||
34 | +import org.onosproject.yangutils.datamodel.YangTypeDef; | ||
35 | +import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | ||
36 | +import org.onosproject.yangutils.parser.exceptions.ParserException; | ||
37 | +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; | ||
38 | +import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes; | ||
39 | + | ||
40 | +import java.io.IOException; | ||
41 | +import java.math.BigDecimal; | ||
42 | +import java.util.ListIterator; | ||
43 | + | ||
44 | +/** | ||
45 | + * Test cases for decimal64 listener. | ||
46 | + */ | ||
47 | +public class Decimal64ListenerTest { | ||
48 | + @Rule | ||
49 | + public ExpectedException thrown = ExpectedException.none(); | ||
50 | + | ||
51 | + private final YangUtilsParserManager manager = new YangUtilsParserManager(); | ||
52 | + | ||
53 | + /** | ||
54 | + * Checks decimal64 statement with fraction-digits. | ||
55 | + */ | ||
56 | + @Test | ||
57 | + public void processDecimal64TypeStatement() throws IOException, ParserException { | ||
58 | + | ||
59 | + YangNode node = manager.getDataModel("src/test/resources/Decimal64TypeStatement.yang"); | ||
60 | + | ||
61 | + // Check whether the data model tree returned is of type module. | ||
62 | + assertThat((node instanceof YangModule), is(true)); | ||
63 | + | ||
64 | + // Check whether the node type is set properly to module. | ||
65 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
66 | + | ||
67 | + // Check whether the module name is set correctly. | ||
68 | + YangModule yangNode = (YangModule) node; | ||
69 | + assertThat(yangNode.getName(), is("Test")); | ||
70 | + | ||
71 | + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator(); | ||
72 | + YangLeaf leafInfo = leafIterator.next(); | ||
73 | + | ||
74 | + assertThat(leafInfo.getName(), is("validDecimal")); | ||
75 | + assertThat(leafInfo.getDataType().getDataTypeName(), is("decimal64")); | ||
76 | + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DECIMAL64)); | ||
77 | + assertThat(((YangDecimal64) leafInfo.getDataType().getDataTypeExtendedInfo()).getFractionDigit(), | ||
78 | + is(2)); | ||
79 | + } | ||
80 | + | ||
81 | + /** | ||
82 | + * Checks decimal64 statement with range statement. | ||
83 | + */ | ||
84 | + @Test | ||
85 | + public void processDecimal64TypeWithRangeStatement() throws IOException, ParserException { | ||
86 | + | ||
87 | + YangNode node = manager.getDataModel("src/test/resources/Decimal64TypeWithRangeStatement.yang"); | ||
88 | + | ||
89 | + // Check whether the data model tree returned is of type module. | ||
90 | + assertThat((node instanceof YangModule), is(true)); | ||
91 | + | ||
92 | + // Check whether the node type is set properly to module. | ||
93 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
94 | + | ||
95 | + // Check whether the module name is set correctly. | ||
96 | + YangModule yangNode = (YangModule) node; | ||
97 | + assertThat(yangNode.getName(), is("Test")); | ||
98 | + | ||
99 | + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator(); | ||
100 | + YangLeaf leafInfo = leafIterator.next(); | ||
101 | + | ||
102 | + assertThat(leafInfo.getName(), is("validDecimal")); | ||
103 | + assertThat(leafInfo.getDataType().getDataTypeName(), is("decimal64")); | ||
104 | + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DECIMAL64)); | ||
105 | + assertThat(((YangDecimal64) leafInfo.getDataType().getDataTypeExtendedInfo()).getFractionDigit(), | ||
106 | + is(8)); | ||
107 | + | ||
108 | + YangRangeRestriction rangeRestriction = ((YangDecimal64<YangRangeRestriction>) leafInfo.getDataType() | ||
109 | + .getDataTypeExtendedInfo()) | ||
110 | + .getRangeRestrictedExtendedInfo(); | ||
111 | + | ||
112 | + ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals() | ||
113 | + .listIterator(); | ||
114 | + YangRangeInterval rangeInterval = rangeListIterator.next(); | ||
115 | + assertThat(((YangDecimal64) rangeInterval.getStartValue()).getValue().doubleValue(), is(-92233720368.54775808)); | ||
116 | + assertThat(((YangDecimal64) rangeInterval.getEndValue()).getValue().doubleValue(), is(92233720368.54775807)); | ||
117 | + } | ||
118 | + | ||
119 | + /** | ||
120 | + * Successful validation of decimal64 statement. | ||
121 | + */ | ||
122 | + @Test | ||
123 | + public void processDecimal64ValueSuccessfulValidation() throws IOException, ParserException, DataModelException { | ||
124 | + | ||
125 | + YangNode node = manager.getDataModel("src/test/resources/Decimal64TypeValidation.yang"); | ||
126 | + | ||
127 | + // Check whether the data model tree returned is of type module. | ||
128 | + assertThat((node instanceof YangModule), is(true)); | ||
129 | + | ||
130 | + // Check whether the node type is set properly to module. | ||
131 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
132 | + | ||
133 | + // Check whether the module name is set correctly. | ||
134 | + YangModule yangNode = (YangModule) node; | ||
135 | + assertThat(yangNode.getName(), is("Test")); | ||
136 | + | ||
137 | + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator(); | ||
138 | + YangLeaf leafInfo = leafIterator.next(); | ||
139 | + YangDecimal64 decimal64 = (YangDecimal64) leafInfo.getDataType().getDataTypeExtendedInfo(); | ||
140 | + | ||
141 | + assertThat(leafInfo.getName(), is("validDecimal")); | ||
142 | + assertThat(leafInfo.getDataType().getDataTypeName(), is("decimal64")); | ||
143 | + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DECIMAL64)); | ||
144 | + assertThat(decimal64.getFractionDigit(), is(18)); | ||
145 | + | ||
146 | + decimal64.setValue(new BigDecimal(-9.223372036854775808)); | ||
147 | + decimal64.validateValue(); | ||
148 | + decimal64.setValue(new BigDecimal(9.223372036854775807)); | ||
149 | + decimal64.validateValue(); | ||
150 | + } | ||
151 | + | ||
152 | + /** | ||
153 | + * Failure validation of decimal64 statement. | ||
154 | + */ | ||
155 | + @Test | ||
156 | + public void processDecimal64ValueFailureValidation() throws IOException, ParserException, DataModelException { | ||
157 | + thrown.expect(DataModelException.class); | ||
158 | + thrown.expectMessage("YANG file error : decimal64 validation failed."); | ||
159 | + | ||
160 | + YangNode node = manager.getDataModel("src/test/resources/Decimal64TypeValidation.yang"); | ||
161 | + | ||
162 | + // Check whether the data model tree returned is of type module. | ||
163 | + assertThat((node instanceof YangModule), is(true)); | ||
164 | + | ||
165 | + // Check whether the node type is set properly to module. | ||
166 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
167 | + | ||
168 | + // Check whether the module name is set correctly. | ||
169 | + YangModule yangNode = (YangModule) node; | ||
170 | + assertThat(yangNode.getName(), is("Test")); | ||
171 | + | ||
172 | + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator(); | ||
173 | + YangLeaf leafInfo = leafIterator.next(); | ||
174 | + YangDecimal64 decimal64 = (YangDecimal64) leafInfo.getDataType().getDataTypeExtendedInfo(); | ||
175 | + | ||
176 | + assertThat(leafInfo.getName(), is("validDecimal")); | ||
177 | + assertThat(leafInfo.getDataType().getDataTypeName(), is("decimal64")); | ||
178 | + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DECIMAL64)); | ||
179 | + assertThat(decimal64.getFractionDigit(), is(18)); | ||
180 | + | ||
181 | + decimal64.setValue(new BigDecimal(-92233720368547758.08)); | ||
182 | + // validation should fail | ||
183 | + decimal64.validateValue(); | ||
184 | + } | ||
185 | + | ||
186 | + /** | ||
187 | + * Validation of invalid maximum value limit of fraction-digits. | ||
188 | + */ | ||
189 | + @Test | ||
190 | + public void processDecimal64InvalidMaxFraction() throws IOException, ParserException, DataModelException { | ||
191 | + thrown.expect(ParserException.class); | ||
192 | + thrown.expectMessage("YANG file error : fraction-digits value should be between 1 and 18."); | ||
193 | + | ||
194 | + manager.getDataModel("src/test/resources/Decimal64TypeInvalidMaxValueFraction.yang"); | ||
195 | + } | ||
196 | + | ||
197 | + /** | ||
198 | + * Validation of invalid (0) minimum value limit of fraction-digits. | ||
199 | + */ | ||
200 | + @Test | ||
201 | + public void processDecimal64InvalidMinFraction1() throws IOException, ParserException, DataModelException { | ||
202 | + thrown.expect(ParserException.class); | ||
203 | + thrown.expectMessage("YANG file error : fraction-digits value should be between 1 and 18."); | ||
204 | + | ||
205 | + manager.getDataModel("src/test/resources/Decimal64TypeInvalidMinValueFraction1.yang"); | ||
206 | + } | ||
207 | + | ||
208 | + /** | ||
209 | + * Validation of invalid (-1) minimum value limit of fraction-digits. | ||
210 | + */ | ||
211 | + @Test | ||
212 | + public void processDecimal64InvalidMinFraction2() throws IOException, ParserException, DataModelException { | ||
213 | + thrown.expect(ParserException.class); | ||
214 | + thrown.expectMessage("YANG file error : fraction-digits value should be between 1 and 18."); | ||
215 | + | ||
216 | + manager.getDataModel("src/test/resources/Decimal64TypeInvalidMinValueFraction2.yang"); | ||
217 | + } | ||
218 | + | ||
219 | + /** | ||
220 | + * Validation of decimal64 range statement. | ||
221 | + */ | ||
222 | + @Test | ||
223 | + public void processDecimal64TypeWithMultiValueRangeStatement() throws IOException, ParserException { | ||
224 | + | ||
225 | + YangNode node = manager.getDataModel("src/test/resources/Decimal64TypeWithMultiValueRangeStmnt.yang"); | ||
226 | + | ||
227 | + // Check whether the data model tree returned is of type module. | ||
228 | + assertThat((node instanceof YangModule), is(true)); | ||
229 | + | ||
230 | + // Check whether the node type is set properly to module. | ||
231 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
232 | + | ||
233 | + // Check whether the module name is set correctly. | ||
234 | + YangModule yangNode = (YangModule) node; | ||
235 | + assertThat(yangNode.getName(), is("Test")); | ||
236 | + | ||
237 | + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator(); | ||
238 | + YangLeaf leafInfo = leafIterator.next(); | ||
239 | + | ||
240 | + assertThat(leafInfo.getName(), is("validDecimal")); | ||
241 | + assertThat(leafInfo.getDataType().getDataTypeName(), is("decimal64")); | ||
242 | + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DECIMAL64)); | ||
243 | + assertThat(((YangDecimal64) leafInfo.getDataType().getDataTypeExtendedInfo()).getFractionDigit(), | ||
244 | + is(18)); | ||
245 | + | ||
246 | + YangRangeRestriction rangeRestriction = ((YangDecimal64<YangRangeRestriction>) leafInfo.getDataType() | ||
247 | + .getDataTypeExtendedInfo()) | ||
248 | + .getRangeRestrictedExtendedInfo(); | ||
249 | + | ||
250 | + ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals() | ||
251 | + .listIterator(); | ||
252 | + // range "1 .. 3.14 | 10 | 20..max"; | ||
253 | + // check first range 1 .. 3.14 | ||
254 | + YangRangeInterval rangeInterval = rangeListIterator.next(); | ||
255 | + assertThat(((YangDecimal64) rangeInterval.getStartValue()).getValue().doubleValue(), is(-9.22)); | ||
256 | + assertThat(((YangDecimal64) rangeInterval.getEndValue()).getValue().doubleValue(), is(7.22)); | ||
257 | + // check second range 10 | ||
258 | + rangeInterval = rangeListIterator.next(); | ||
259 | + assertThat(((YangDecimal64) rangeInterval.getStartValue()).getValue().doubleValue(), is(8.0)); | ||
260 | + assertThat(((YangDecimal64) rangeInterval.getEndValue()).getValue().doubleValue(), is(8.0)); | ||
261 | + // check third range 20..max | ||
262 | + rangeInterval = rangeListIterator.next(); | ||
263 | + assertThat(((YangDecimal64) rangeInterval.getStartValue()).getValue().doubleValue(), is(9.0)); | ||
264 | + assertThat(((YangDecimal64) rangeInterval.getEndValue()).getValue().doubleValue(), is(9.223372036854776)); | ||
265 | + } | ||
266 | + | ||
267 | + /** | ||
268 | + * Validation of decimal64 with invalid range. | ||
269 | + */ | ||
270 | + @Test | ||
271 | + public void processDecimal64InvalidRange() throws IOException, ParserException, DataModelException { | ||
272 | + thrown.expect(ParserException.class); | ||
273 | + thrown.expectMessage("YANG file error : decimal64 validation failed."); | ||
274 | + | ||
275 | + manager.getDataModel("src/test/resources/Decimal64TypeInvalidRangeStmnt.yang"); | ||
276 | + } | ||
277 | + | ||
278 | + /** | ||
279 | + * Validation of decimal64 without fraction-digits. Fraction-digits must be present for decimal64. | ||
280 | + */ | ||
281 | + @Test | ||
282 | + public void processDecimal64WithoutFraction() throws IOException, ParserException, DataModelException { | ||
283 | + thrown.expect(ParserException.class); | ||
284 | + thrown.expectMessage("YANG file error : a type decimal64 must have fraction-digits statement."); | ||
285 | + | ||
286 | + manager.getDataModel("src/test/resources/Decimal64TypeWithoutFraction.yang"); | ||
287 | + } | ||
288 | + | ||
289 | + /** | ||
290 | + * Checks decimal64 with typedef statement. | ||
291 | + */ | ||
292 | + @Test | ||
293 | + public void processDecimal64TypedefStatement() throws IOException, ParserException { | ||
294 | + | ||
295 | + YangNode node = manager.getDataModel("src/test/resources/Decimal64TypedefStatement.yang"); | ||
296 | + | ||
297 | + // Check whether the data model tree returned is of type module. | ||
298 | + assertThat((node instanceof YangModule), is(true)); | ||
299 | + | ||
300 | + // Check whether the node type is set properly to module. | ||
301 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
302 | + | ||
303 | + // Check whether the module name is set correctly. | ||
304 | + YangModule yangNode = (YangModule) node; | ||
305 | + assertThat(yangNode.getName(), is("Test")); | ||
306 | + | ||
307 | + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator(); | ||
308 | + YangLeaf leafInfo = leafIterator.next(); | ||
309 | + | ||
310 | + assertThat(leafInfo.getName(), is("setFourDecimal")); | ||
311 | + assertThat(leafInfo.getDataType().getDataTypeName(), is("validDecimal")); | ||
312 | + YangType<YangDerivedInfo> derivedInfoType = (YangType<YangDerivedInfo>) leafInfo.getDataType(); | ||
313 | + YangDerivedInfo derivedInfo = (YangDerivedInfo) derivedInfoType.getDataTypeExtendedInfo(); | ||
314 | + YangTypeDef typedef = (YangTypeDef) derivedInfo.getReferredTypeDef(); | ||
315 | + assertThat(typedef.getName(), is("validDecimal")); | ||
316 | + | ||
317 | + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED)); | ||
318 | + YangType type = typedef.getTypeList().iterator().next(); | ||
319 | + assertThat(type.getDataType(), is(YangDataTypes.DECIMAL64)); | ||
320 | + assertThat(type.getDataTypeName(), is("decimal64")); | ||
321 | + YangType<YangDecimal64> decimal64Type = (YangType<YangDecimal64>) typedef.getTypeList().iterator().next(); | ||
322 | + YangDecimal64 decimal64 = decimal64Type.getDataTypeExtendedInfo(); | ||
323 | + assertThat(decimal64.getFractionDigit(), is(4)); | ||
324 | + } | ||
325 | + | ||
326 | + /** | ||
327 | + * Checks decimal64 with multiple typedef statement. | ||
328 | + */ | ||
329 | + @Test | ||
330 | + public void processDecimal64MultiTypedefStatement() throws IOException, ParserException { | ||
331 | + | ||
332 | + YangNode node = manager.getDataModel("src/test/resources/Decimal64MultiTypedefStatement.yang"); | ||
333 | + | ||
334 | + // Check whether the data model tree returned is of type module. | ||
335 | + assertThat((node instanceof YangModule), is(true)); | ||
336 | + | ||
337 | + // Check whether the node type is set properly to module. | ||
338 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
339 | + | ||
340 | + // Check whether the module name is set correctly. | ||
341 | + YangModule yangNode = (YangModule) node; | ||
342 | + assertThat(yangNode.getName(), is("Test")); | ||
343 | + | ||
344 | + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator(); | ||
345 | + YangLeaf leafInfo = leafIterator.next(); | ||
346 | + | ||
347 | + // check leaf type | ||
348 | + assertThat(leafInfo.getName(), is("setFourDecimal")); | ||
349 | + assertThat(leafInfo.getDataType().getDataTypeName(), is("validDecimal")); | ||
350 | + YangType<YangDerivedInfo> derivedInfoType = (YangType<YangDerivedInfo>) leafInfo.getDataType(); | ||
351 | + assertThat(derivedInfoType.getDataType(), is(YangDataTypes.DERIVED)); | ||
352 | + YangDerivedInfo derivedInfo = (YangDerivedInfo) derivedInfoType.getDataTypeExtendedInfo(); | ||
353 | + | ||
354 | + // check previous typedef | ||
355 | + YangTypeDef prevTypedef = (YangTypeDef) derivedInfo.getReferredTypeDef(); | ||
356 | + assertThat(prevTypedef.getName(), is("validDecimal")); | ||
357 | + YangType type = prevTypedef.getTypeList().iterator().next(); | ||
358 | + assertThat(type.getDataType(), is(YangDataTypes.DERIVED)); | ||
359 | + derivedInfo = (YangDerivedInfo) type.getDataTypeExtendedInfo(); | ||
360 | + | ||
361 | + // check top typedef | ||
362 | + YangTypeDef topTypedef = (YangTypeDef) derivedInfo.getReferredTypeDef(); | ||
363 | + assertThat(topTypedef.getName(), is("topDecimal")); | ||
364 | + type = topTypedef.getTypeList().iterator().next(); | ||
365 | + assertThat(type.getDataType(), is(YangDataTypes.DECIMAL64)); | ||
366 | + assertThat(type.getDataTypeName(), is("decimal64")); | ||
367 | + YangType<YangDecimal64> decimal64Type = (YangType<YangDecimal64>) type; | ||
368 | + YangDecimal64 decimal64 = decimal64Type.getDataTypeExtendedInfo(); | ||
369 | + assertThat(decimal64.getFractionDigit(), is(4)); | ||
370 | + } | ||
371 | +} |
... | @@ -138,6 +138,37 @@ public class LengthRestrictionListenerTest { | ... | @@ -138,6 +138,37 @@ public class LengthRestrictionListenerTest { |
138 | } | 138 | } |
139 | 139 | ||
140 | /** | 140 | /** |
141 | + * Checks valid length statement as sub-statement of binary statement. | ||
142 | + */ | ||
143 | + @Test | ||
144 | + public void processValidBinaryLengthStatement() throws IOException, ParserException { | ||
145 | + | ||
146 | + YangNode node = manager.getDataModel("src/test/resources/ValidBinaryLengthStatement.yang"); | ||
147 | + | ||
148 | + assertThat((node instanceof YangModule), is(true)); | ||
149 | + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE)); | ||
150 | + YangModule yangNode = (YangModule) node; | ||
151 | + assertThat(yangNode.getName(), is("Test")); | ||
152 | + | ||
153 | + ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator(); | ||
154 | + YangLeaf leafInfo = leafIterator.next(); | ||
155 | + | ||
156 | + assertThat(leafInfo.getName(), is("message")); | ||
157 | + assertThat(leafInfo.getDataType().getDataTypeName(), is("binary")); | ||
158 | + assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.BINARY)); | ||
159 | + YangRangeRestriction lengthRestriction = (YangRangeRestriction) leafInfo | ||
160 | + .getDataType().getDataTypeExtendedInfo(); | ||
161 | + | ||
162 | + ListIterator<YangRangeInterval> lengthListIterator = lengthRestriction.getAscendingRangeIntervals() | ||
163 | + .listIterator(); | ||
164 | + | ||
165 | + YangRangeInterval rangeInterval = lengthListIterator.next(); | ||
166 | + | ||
167 | + assertThat(((YangUint64) rangeInterval.getStartValue()).getValue(), is(BigInteger.valueOf(4))); | ||
168 | + assertThat(((YangUint64) rangeInterval.getEndValue()).getValue(), is(BigInteger.valueOf(4))); | ||
169 | + } | ||
170 | + | ||
171 | + /** | ||
141 | * Checks length statement with invalid type. | 172 | * Checks length statement with invalid type. |
142 | */ | 173 | */ |
143 | @Test | 174 | @Test | ... | ... |
... | @@ -31,7 +31,7 @@ import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; | ... | @@ -31,7 +31,7 @@ import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; |
31 | 31 | ||
32 | import java.io.IOException; | 32 | import java.io.IOException; |
33 | import java.util.ListIterator; | 33 | import java.util.ListIterator; |
34 | -import java.util.Set; | 34 | +import java.util.Map; |
35 | 35 | ||
36 | /** | 36 | /** |
37 | * Test cases for position listener. | 37 | * Test cases for position listener. |
... | @@ -67,14 +67,38 @@ public class PositionListenerTest { | ... | @@ -67,14 +67,38 @@ public class PositionListenerTest { |
67 | assertThat(((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitsName(), | 67 | assertThat(((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitsName(), |
68 | is("mybits")); | 68 | is("mybits")); |
69 | 69 | ||
70 | - Set<YangBit> bitSet = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitSet(); | 70 | + // Check bit name map |
71 | - for (YangBit tmp : bitSet) { | 71 | + Map<String, YangBit> bitNameMap = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitNameMap(); |
72 | - if (tmp.getBitName().equals("disable-nagle")) { | 72 | + assertThat(bitNameMap.size(), is(3)); |
73 | - assertThat(tmp.getPosition(), is(0)); | 73 | + for (Map.Entry<String, YangBit> element : bitNameMap.entrySet()) { |
74 | - } else if (tmp.getBitName().equals("auto-sense-speed")) { | 74 | + String bitName = element.getKey(); |
75 | - assertThat(tmp.getPosition(), is(1)); | 75 | + YangBit yangBit = element.getValue(); |
76 | - } else if (tmp.getBitName().equals("Ten-Mb-only")) { | 76 | + if (bitName.equals("disable-nagle")) { |
77 | - assertThat(tmp.getPosition(), is(2)); | 77 | + assertThat(yangBit.getPosition(), is(0)); |
78 | + } else if (bitName.equals("auto-sense-speed")) { | ||
79 | + assertThat(yangBit.getPosition(), is(1)); | ||
80 | + } else if (bitName.equals("Ten-Mb-only")) { | ||
81 | + assertThat(yangBit.getPosition(), is(2)); | ||
82 | + } else { | ||
83 | + throw new IOException("Invalid bit name: " + bitName); | ||
84 | + } | ||
85 | + } | ||
86 | + | ||
87 | + // Check bit position map | ||
88 | + Map<Integer, YangBit> bitPositionMap = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()) | ||
89 | + .getBitPositionMap(); | ||
90 | + assertThat(bitPositionMap.size(), is(3)); | ||
91 | + for (Map.Entry<Integer, YangBit> element : bitPositionMap.entrySet()) { | ||
92 | + int position = element.getKey(); | ||
93 | + YangBit yangBit = element.getValue(); | ||
94 | + if (position == 0) { | ||
95 | + assertThat(yangBit.getBitName(), is("disable-nagle")); | ||
96 | + } else if (position == 1) { | ||
97 | + assertThat(yangBit.getBitName(), is("auto-sense-speed")); | ||
98 | + } else if (position == 2) { | ||
99 | + assertThat(yangBit.getBitName(), is("Ten-Mb-only")); | ||
100 | + } else { | ||
101 | + throw new IOException("Invalid bit position: " + position); | ||
78 | } | 102 | } |
79 | } | 103 | } |
80 | } | 104 | } |
... | @@ -106,14 +130,38 @@ public class PositionListenerTest { | ... | @@ -106,14 +130,38 @@ public class PositionListenerTest { |
106 | assertThat(((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitsName(), | 130 | assertThat(((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitsName(), |
107 | is("mybits")); | 131 | is("mybits")); |
108 | 132 | ||
109 | - Set<YangBit> bitSet = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitSet(); | 133 | + // Check bit name map |
110 | - for (YangBit tmp : bitSet) { | 134 | + Map<String, YangBit> bitNameMap = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitNameMap(); |
111 | - if (tmp.getBitName().equals("disable-nagle")) { | 135 | + assertThat(bitNameMap.size(), is(3)); |
112 | - assertThat(tmp.getPosition(), is(0)); | 136 | + for (Map.Entry<String, YangBit> element : bitNameMap.entrySet()) { |
113 | - } else if (tmp.getBitName().equals("auto-sense-speed")) { | 137 | + String bitName = element.getKey(); |
114 | - assertThat(tmp.getPosition(), is(1)); | 138 | + YangBit yangBit = element.getValue(); |
115 | - } else if (tmp.getBitName().equals("Ten-Mb-only")) { | 139 | + if (bitName.equals("disable-nagle")) { |
116 | - assertThat(tmp.getPosition(), is(2)); | 140 | + assertThat(yangBit.getPosition(), is(0)); |
141 | + } else if (bitName.equals("auto-sense-speed")) { | ||
142 | + assertThat(yangBit.getPosition(), is(1)); | ||
143 | + } else if (bitName.equals("Ten-Mb-only")) { | ||
144 | + assertThat(yangBit.getPosition(), is(2)); | ||
145 | + } else { | ||
146 | + throw new IOException("Invalid bit name: " + bitName); | ||
147 | + } | ||
148 | + } | ||
149 | + | ||
150 | + // Check bit position map | ||
151 | + Map<Integer, YangBit> bitPositionMap = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()) | ||
152 | + .getBitPositionMap(); | ||
153 | + assertThat(bitPositionMap.size(), is(3)); | ||
154 | + for (Map.Entry<Integer, YangBit> element : bitPositionMap.entrySet()) { | ||
155 | + int position = element.getKey(); | ||
156 | + YangBit yangBit = element.getValue(); | ||
157 | + if (position == 0) { | ||
158 | + assertThat(yangBit.getBitName(), is("disable-nagle")); | ||
159 | + } else if (position == 1) { | ||
160 | + assertThat(yangBit.getBitName(), is("auto-sense-speed")); | ||
161 | + } else if (position == 2) { | ||
162 | + assertThat(yangBit.getBitName(), is("Ten-Mb-only")); | ||
163 | + } else { | ||
164 | + throw new IOException("Invalid bit position: " + position); | ||
117 | } | 165 | } |
118 | } | 166 | } |
119 | } | 167 | } |
... | @@ -145,14 +193,38 @@ public class PositionListenerTest { | ... | @@ -145,14 +193,38 @@ public class PositionListenerTest { |
145 | assertThat(((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitsName(), | 193 | assertThat(((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitsName(), |
146 | is("mybits")); | 194 | is("mybits")); |
147 | 195 | ||
148 | - Set<YangBit> bitSet = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitSet(); | 196 | + // Check bit name map |
149 | - for (YangBit tmp : bitSet) { | 197 | + Map<String, YangBit> bitNameMap = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()).getBitNameMap(); |
150 | - if (tmp.getBitName().equals("disable-nagle")) { | 198 | + assertThat(bitNameMap.size(), is(3)); |
151 | - assertThat(tmp.getPosition(), is(0)); | 199 | + for (Map.Entry<String, YangBit> element : bitNameMap.entrySet()) { |
152 | - } else if (tmp.getBitName().equals("auto-sense-speed")) { | 200 | + String bitName = element.getKey(); |
153 | - assertThat(tmp.getPosition(), is(1)); | 201 | + YangBit yangBit = element.getValue(); |
154 | - } else if (tmp.getBitName().equals("Ten-Mb-only")) { | 202 | + if (bitName.equals("disable-nagle")) { |
155 | - assertThat(tmp.getPosition(), is(2)); | 203 | + assertThat(yangBit.getPosition(), is(0)); |
204 | + } else if (bitName.equals("auto-sense-speed")) { | ||
205 | + assertThat(yangBit.getPosition(), is(1)); | ||
206 | + } else if (bitName.equals("Ten-Mb-only")) { | ||
207 | + assertThat(yangBit.getPosition(), is(2)); | ||
208 | + } else { | ||
209 | + throw new IOException("Invalid bit name: " + bitName); | ||
210 | + } | ||
211 | + } | ||
212 | + | ||
213 | + // Check bit position map | ||
214 | + Map<Integer, YangBit> bitPositionMap = ((YangBits) leafInfo.getDataType().getDataTypeExtendedInfo()) | ||
215 | + .getBitPositionMap(); | ||
216 | + assertThat(bitPositionMap.size(), is(3)); | ||
217 | + for (Map.Entry<Integer, YangBit> element : bitPositionMap.entrySet()) { | ||
218 | + int position = element.getKey(); | ||
219 | + YangBit yangBit = element.getValue(); | ||
220 | + if (position == 0) { | ||
221 | + assertThat(yangBit.getBitName(), is("disable-nagle")); | ||
222 | + } else if (position == 1) { | ||
223 | + assertThat(yangBit.getBitName(), is("auto-sense-speed")); | ||
224 | + } else if (position == 2) { | ||
225 | + assertThat(yangBit.getBitName(), is("Ten-Mb-only")); | ||
226 | + } else { | ||
227 | + throw new IOException("Invalid bit position: " + position); | ||
156 | } | 228 | } |
157 | } | 229 | } |
158 | } | 230 | } | ... | ... |
... | @@ -26,7 +26,9 @@ module Test { | ... | @@ -26,7 +26,9 @@ module Test { |
26 | "Interface has time-division multiplex capabilities."; | 26 | "Interface has time-division multiplex capabilities."; |
27 | 27 | ||
28 | leaf minimum-lsp-bandwidth { | 28 | leaf minimum-lsp-bandwidth { |
29 | - type decimal64; | 29 | + type decimal64 { |
30 | + fraction-digits 4; | ||
31 | + } | ||
30 | } | 32 | } |
31 | } | 33 | } |
32 | } | 34 | } | ... | ... |
1 | +module Test { | ||
2 | + yang-version 1; | ||
3 | + namespace http://huawei.com; | ||
4 | + prefix Ant; | ||
5 | + | ||
6 | + typedef topDecimal { | ||
7 | + type decimal64 { | ||
8 | + fraction-digits 4; | ||
9 | + } | ||
10 | + } | ||
11 | + | ||
12 | + typedef validDecimal { | ||
13 | + type topDecimal; | ||
14 | + } | ||
15 | + | ||
16 | + leaf setFourDecimal { | ||
17 | + type validDecimal; | ||
18 | + } | ||
19 | +} |
... | @@ -430,8 +430,8 @@ | ... | @@ -430,8 +430,8 @@ |
430 | } | 430 | } |
431 | leaf unidirectional-packet-loss { | 431 | leaf unidirectional-packet-loss { |
432 | type decimal64 { | 432 | type decimal64 { |
433 | - /*fraction-digits 6; | 433 | + fraction-digits 6; |
434 | - range "0 .. 50.331642";*/ | 434 | + range "0 .. 50.331642"; |
435 | } | 435 | } |
436 | description | 436 | description |
437 | "Packet loss as a percentage of the total traffic sent | 437 | "Packet loss as a percentage of the total traffic sent |
... | @@ -440,7 +440,7 @@ | ... | @@ -440,7 +440,7 @@ |
440 | } | 440 | } |
441 | leaf unidirectional-residual-bandwidth { | 441 | leaf unidirectional-residual-bandwidth { |
442 | type decimal64 { | 442 | type decimal64 { |
443 | - /*fraction-digits 2;*/ | 443 | + fraction-digits 2; |
444 | } | 444 | } |
445 | description | 445 | description |
446 | "Residual bandwidth that subtracts tunnel | 446 | "Residual bandwidth that subtracts tunnel |
... | @@ -450,7 +450,7 @@ | ... | @@ -450,7 +450,7 @@ |
450 | } | 450 | } |
451 | leaf unidirectional-available-bandwidth { | 451 | leaf unidirectional-available-bandwidth { |
452 | type decimal64 { | 452 | type decimal64 { |
453 | - /*fraction-digits 2;*/ | 453 | + fraction-digits 2; |
454 | } | 454 | } |
455 | description | 455 | description |
456 | "Available bandwidth that is defined to be residual | 456 | "Available bandwidth that is defined to be residual |
... | @@ -461,7 +461,7 @@ | ... | @@ -461,7 +461,7 @@ |
461 | } | 461 | } |
462 | leaf unidirectional-utilized-bandwidth { | 462 | leaf unidirectional-utilized-bandwidth { |
463 | type decimal64 { | 463 | type decimal64 { |
464 | - /*fraction-digits 2;*/ | 464 | + fraction-digits 2; |
465 | } | 465 | } |
466 | description | 466 | description |
467 | "Bandwidth utilization that represents the actual | 467 | "Bandwidth utilization that represents the actual |
... | @@ -753,7 +753,7 @@ | ... | @@ -753,7 +753,7 @@ |
753 | } | 753 | } |
754 | leaf max-link-bandwidth { | 754 | leaf max-link-bandwidth { |
755 | type decimal64 { | 755 | type decimal64 { |
756 | - /*fraction-digits 2;*/ | 756 | + fraction-digits 2; |
757 | } | 757 | } |
758 | description | 758 | description |
759 | "Maximum bandwidth that can be seen on this link in this | 759 | "Maximum bandwidth that can be seen on this link in this |
... | @@ -765,7 +765,7 @@ | ... | @@ -765,7 +765,7 @@ |
765 | } | 765 | } |
766 | leaf max-resv-link-bandwidth { | 766 | leaf max-resv-link-bandwidth { |
767 | type decimal64 { | 767 | type decimal64 { |
768 | - /*fraction-digits 2;*/ | 768 | + fraction-digits 2; |
769 | } | 769 | } |
770 | description | 770 | description |
771 | "Maximum amount of bandwidth that can be reserved in this | 771 | "Maximum amount of bandwidth that can be reserved in this |
... | @@ -793,7 +793,7 @@ | ... | @@ -793,7 +793,7 @@ |
793 | } | 793 | } |
794 | leaf bandwidth { | 794 | leaf bandwidth { |
795 | type decimal64 { | 795 | type decimal64 { |
796 | - /*fraction-digits 2;*/ | 796 | + fraction-digits 2; |
797 | } | 797 | } |
798 | description | 798 | description |
799 | "Unreserved bandwidth for this level."; | 799 | "Unreserved bandwidth for this level."; |
... | @@ -884,7 +884,7 @@ | ... | @@ -884,7 +884,7 @@ |
884 | } | 884 | } |
885 | leaf bandwidth { | 885 | leaf bandwidth { |
886 | type decimal64 { | 886 | type decimal64 { |
887 | - /*fraction-digits 2;*/ | 887 | + fraction-digits 2; |
888 | } | 888 | } |
889 | description | 889 | description |
890 | "Max LSP Bandwidth for this level"; | 890 | "Max LSP Bandwidth for this level"; |
... | @@ -899,7 +899,7 @@ | ... | @@ -899,7 +899,7 @@ |
899 | 899 | ||
900 | leaf minimum-lsp-bandwidth { | 900 | leaf minimum-lsp-bandwidth { |
901 | type decimal64 { | 901 | type decimal64 { |
902 | - /*fraction-digits 2;*/ | 902 | + fraction-digits 2; |
903 | } | 903 | } |
904 | description | 904 | description |
905 | "Minimum LSP Bandwidth. Units in bytes per second."; | 905 | "Minimum LSP Bandwidth. Units in bytes per second."; |
... | @@ -951,7 +951,7 @@ | ... | @@ -951,7 +951,7 @@ |
951 | } | 951 | } |
952 | leaf bandwidth { | 952 | leaf bandwidth { |
953 | type decimal64 { | 953 | type decimal64 { |
954 | - /*fraction-digits 2;*/ | 954 | + fraction-digits 2; |
955 | } | 955 | } |
956 | description | 956 | description |
957 | "Max LSP Bandwidth for this level."; | 957 | "Max LSP Bandwidth for this level."; | ... | ... |
... | @@ -580,7 +580,7 @@ | ... | @@ -580,7 +580,7 @@ |
580 | 580 | ||
581 | typedef admin-group { | 581 | typedef admin-group { |
582 | type binary { | 582 | type binary { |
583 | -// length 32; | 583 | + length 32; |
584 | } | 584 | } |
585 | description | 585 | description |
586 | "Administrative group/Resource class/Color."; | 586 | "Administrative group/Resource class/Color."; | ... | ... |
-
Please register or login to post a comment