2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.yang.parser.util;
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.List;
14 import org.opendaylight.controller.yang.model.api.type.LengthConstraint;
15 import org.opendaylight.controller.yang.model.api.type.PatternConstraint;
16 import org.opendaylight.controller.yang.model.api.type.RangeConstraint;
17 import org.opendaylight.controller.yang.model.util.BaseConstraints;
20 * Holder object for holding YANG type constraints.
22 public final class TypeConstraints {
23 private final String moduleName;
24 private final int line;
25 private final List<List<RangeConstraint>> ranges = new ArrayList<List<RangeConstraint>>();
26 private final List<List<LengthConstraint>> lengths = new ArrayList<List<LengthConstraint>>();
27 private final List<PatternConstraint> patterns = new ArrayList<PatternConstraint>();
28 private final List<Integer> fractionDigits = new ArrayList<Integer>();
30 public TypeConstraints(final String moduleName, final int line) {
31 this.moduleName = moduleName;
35 List<List<RangeConstraint>> getAllRanges() {
39 public List<RangeConstraint> getRange() {
40 if (ranges.size() < 2) {
41 return Collections.emptyList();
44 final List<RangeConstraint> resolved = ranges.get(0);
45 RangeConstraint firstRange = resolved.get(0);
46 RangeConstraint lastRange = resolved.get(resolved.size() - 1);
47 Number min = firstRange.getMin();
48 Number max = lastRange.getMax();
50 if (!(min instanceof UnknownBoundaryNumber) && !(max instanceof UnknownBoundaryNumber)) {
51 if (ranges.size() > 1) {
52 validateRange(resolved);
57 if (firstRange.equals(lastRange)) {
58 if (min instanceof UnknownBoundaryNumber) {
59 min = resolveMinRange(min);
61 if (max instanceof UnknownBoundaryNumber) {
62 max = resolveMaxRange(max);
64 firstRange = BaseConstraints.rangeConstraint(min, max, firstRange.getDescription(),
65 firstRange.getReference());
66 resolved.set(0, firstRange);
67 lastRange = BaseConstraints.rangeConstraint(min, max, lastRange.getDescription(), lastRange.getReference());
68 resolved.set(resolved.size() - 1, lastRange);
70 if (min instanceof UnknownBoundaryNumber) {
71 min = resolveMinRange(min);
72 firstRange = BaseConstraints.rangeConstraint(min, firstRange.getMax(), firstRange.getDescription(),
73 firstRange.getReference());
74 resolved.set(0, firstRange);
76 if (max instanceof UnknownBoundaryNumber) {
77 max = resolveMaxRange(max);
78 lastRange = BaseConstraints.rangeConstraint(lastRange.getMin(), max, lastRange.getDescription(),
79 lastRange.getReference());
80 resolved.set(resolved.size() - 1, lastRange);
83 if (this.ranges.size() > 1) {
84 validateRange(resolved);
89 private Number resolveMinRange(Number min) {
91 while (min instanceof UnknownBoundaryNumber) {
92 final List<RangeConstraint> act = ranges.get(i);
93 min = act.get(0).getMin();
99 private Number resolveMaxRange(Number max) {
101 while (max instanceof UnknownBoundaryNumber) {
102 final List<RangeConstraint> act = ranges.get(i);
103 max = act.get(act.size() - 1).getMax();
109 public void addRanges(final List<RangeConstraint> ranges) {
110 if (ranges != null && !(ranges.isEmpty())) {
111 this.ranges.add(ranges);
115 public List<List<LengthConstraint>> getAllLengths() {
119 public List<LengthConstraint> getLength() {
120 if (lengths.size() < 2) {
121 return Collections.emptyList();
124 final List<LengthConstraint> resolved = lengths.get(0);
125 LengthConstraint firstLength = resolved.get(0);
126 LengthConstraint lastLength = resolved.get(resolved.size() - 1);
127 Number min = firstLength.getMin();
128 Number max = lastLength.getMax();
130 if (!(min instanceof UnknownBoundaryNumber) && !(max instanceof UnknownBoundaryNumber)) {
131 if (lengths.size() > 1) {
132 validateLength(resolved);
137 if (firstLength.equals(lastLength)) {
138 if (min instanceof UnknownBoundaryNumber) {
139 min = resolveMinLength(min);
141 if (max instanceof UnknownBoundaryNumber) {
142 max = resolveMaxLength(max);
144 firstLength = BaseConstraints.lengthConstraint(min, max, firstLength.getDescription(),
145 firstLength.getReference());
146 resolved.set(0, firstLength);
147 lastLength = BaseConstraints.lengthConstraint(min, max, lastLength.getDescription(),
148 lastLength.getReference());
149 resolved.set(resolved.size() - 1, lastLength);
151 if (min instanceof UnknownBoundaryNumber) {
152 min = resolveMinLength(min);
153 firstLength = BaseConstraints.lengthConstraint(min, firstLength.getMax(), firstLength.getDescription(),
154 firstLength.getReference());
155 resolved.set(0, firstLength);
157 if (max instanceof UnknownBoundaryNumber) {
158 max = resolveMaxLength(max);
159 lastLength = BaseConstraints.lengthConstraint(lastLength.getMin(), max, lastLength.getDescription(),
160 lastLength.getReference());
161 resolved.set(resolved.size() - 1, lastLength);
165 if (lengths.size() > 1) {
166 validateLength(resolved);
171 private Number resolveMinLength(Number min) {
173 while (min instanceof UnknownBoundaryNumber) {
174 final List<LengthConstraint> act = lengths.get(i);
175 min = act.get(0).getMin();
181 private Number resolveMaxLength(Number max) {
183 while (max instanceof UnknownBoundaryNumber) {
184 final List<LengthConstraint> act = lengths.get(i);
185 max = act.get(act.size() - 1).getMax();
191 public void addLengths(final List<LengthConstraint> lengths) {
192 if (lengths != null && !(lengths.isEmpty())) {
193 this.lengths.add(lengths);
197 public List<PatternConstraint> getPatterns() {
201 public void addPatterns(final List<PatternConstraint> patterns) {
202 this.patterns.addAll(patterns);
205 public Integer getFractionDigits() {
206 if (fractionDigits.isEmpty()) {
209 return fractionDigits.get(0);
212 public void addFractionDigits(final Integer fractionDigits) {
213 this.fractionDigits.add(fractionDigits);
216 public void validateConstraints() {
221 private void validateRange() {
222 if (ranges.size() < 2) {
225 List<RangeConstraint> typeRange = getRange();
227 for (RangeConstraint range : typeRange) {
228 if (range.getMin() instanceof UnknownBoundaryNumber || range.getMax() instanceof UnknownBoundaryNumber) {
229 throw new YangParseException(line, "Unresolved range constraints");
231 final long min = range.getMin().longValue();
232 final long max = range.getMax().longValue();
234 List<RangeConstraint> parentRanges = ranges.get(1);
235 boolean check = false;
236 for (RangeConstraint r : parentRanges) {
237 Number parentMinNumber = r.getMin();
238 if (parentMinNumber instanceof UnknownBoundaryNumber) {
239 parentMinNumber = resolveMinRange(parentMinNumber);
241 long parentMin = parentMinNumber.longValue();
243 Number parentMaxNumber = r.getMax();
244 if (parentMaxNumber instanceof UnknownBoundaryNumber) {
245 parentMaxNumber = resolveMaxRange(parentMaxNumber);
247 long parentMax = parentMaxNumber.longValue();
249 if (parentMin <= min && parentMax >= max) {
255 throw new YangParseException(moduleName, line, "Invalid range constraint: <" + min + ", " + max
256 + "> (parent: " + parentRanges + ").");
261 private void validateRange(List<RangeConstraint> typeRange) {
262 if (ranges.size() < 2) {
266 for (RangeConstraint range : typeRange) {
267 if (range.getMin() instanceof UnknownBoundaryNumber || range.getMax() instanceof UnknownBoundaryNumber) {
268 throw new YangParseException(line, "Unresolved range constraints");
270 final long min = range.getMin().longValue();
271 final long max = range.getMax().longValue();
273 List<RangeConstraint> parentRanges = ranges.get(1);
274 boolean check = false;
275 for (RangeConstraint r : parentRanges) {
276 Number parentMinNumber = r.getMin();
277 if (parentMinNumber instanceof UnknownBoundaryNumber) {
278 parentMinNumber = resolveMinRange(parentMinNumber);
280 long parentMin = parentMinNumber.longValue();
282 Number parentMaxNumber = r.getMax();
283 if (parentMaxNumber instanceof UnknownBoundaryNumber) {
284 parentMaxNumber = resolveMaxRange(parentMaxNumber);
286 long parentMax = parentMaxNumber.longValue();
288 if (parentMin <= min && parentMax >= max) {
294 throw new YangParseException(moduleName, line, "Invalid range constraint: <" + min + ", " + max
295 + "> (parent: " + parentRanges + ").");
300 private void validateLength() {
301 if (lengths.size() < 2) {
304 List<LengthConstraint> typeLength = getLength();
306 for (LengthConstraint length : typeLength) {
307 if (length.getMin() instanceof UnknownBoundaryNumber || length.getMax() instanceof UnknownBoundaryNumber) {
308 throw new YangParseException(line, "Unresolved length constraints");
310 final long min = length.getMin().longValue();
311 final long max = length.getMax().longValue();
313 List<LengthConstraint> parentLengths = lengths.get(1);
314 boolean check = false;
315 for (LengthConstraint lc : parentLengths) {
316 Number parentMinNumber = lc.getMin();
317 if (parentMinNumber instanceof UnknownBoundaryNumber) {
318 parentMinNumber = resolveMinLength(parentMinNumber);
320 long parentMin = parentMinNumber.longValue();
322 Number parentMaxNumber = lc.getMax();
323 if (parentMaxNumber instanceof UnknownBoundaryNumber) {
324 parentMaxNumber = resolveMaxLength(parentMaxNumber);
326 long parentMax = parentMaxNumber.longValue();
328 if (parentMin <= min && parentMax >= max) {
334 throw new YangParseException(moduleName, line, "Invalid length constraint: <" + min + ", " + max
335 + "> (parent: " + parentLengths + ").");
340 private void validateLength(List<LengthConstraint> typeLength) {
341 if (lengths.size() < 2) {
345 for (LengthConstraint length : typeLength) {
346 if (length.getMin() instanceof UnknownBoundaryNumber || length.getMax() instanceof UnknownBoundaryNumber) {
347 throw new YangParseException(line, "Unresolved length constraints");
349 final long min = length.getMin().longValue();
350 final long max = length.getMax().longValue();
352 List<LengthConstraint> parentLengths = lengths.get(1);
353 boolean check = false;
354 for (LengthConstraint lc : parentLengths) {
355 Number parentMinNumber = lc.getMin();
356 if (parentMinNumber instanceof UnknownBoundaryNumber) {
357 parentMinNumber = resolveMinLength(parentMinNumber);
359 long parentMin = parentMinNumber.longValue();
361 Number parentMaxNumber = lc.getMax();
362 if (parentMaxNumber instanceof UnknownBoundaryNumber) {
363 parentMaxNumber = resolveMaxLength(parentMaxNumber);
365 long parentMax = parentMaxNumber.longValue();
367 if (parentMin <= min && parentMax >= max) {
373 throw new YangParseException(moduleName, line, "Invalid length constraint: <" + min + ", " + max
374 + "> (parent: " + parentLengths + ").");