*/
package org.opendaylight.yangtools.yang.parser.util;
+import com.google.common.base.Optional;
+import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-
import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
/**
* Holder object for holding YANG type constraints.
+ *
+ * @deprecated Pre-Beryllium implementation, scheduled for removal.
*/
+@Deprecated
public final class TypeConstraints {
private final String moduleName;
private final int line;
- private final List<List<RangeConstraint>> ranges = new ArrayList<List<RangeConstraint>>();
- private final List<List<LengthConstraint>> lengths = new ArrayList<List<LengthConstraint>>();
- private final List<List<PatternConstraint>> patterns = new ArrayList<List<PatternConstraint>>();
- private final List<Integer> fractionDigits = new ArrayList<Integer>();
+ private final List<List<RangeConstraint>> ranges = new ArrayList<>();
+ private final List<List<LengthConstraint>> lengths = new ArrayList<>();
+ private final List<List<PatternConstraint>> patterns = new ArrayList<>();
+ private final List<Integer> fractionDigits = new ArrayList<>();
public TypeConstraints(final String moduleName, final int line) {
this.moduleName = moduleName;
this.line = line;
}
- List<List<RangeConstraint>> getAllRanges() {
- return ranges;
- }
-
public List<RangeConstraint> getRange() {
if (ranges.size() < 2) {
return Collections.emptyList();
if (max instanceof UnknownBoundaryNumber) {
max = resolveMaxRange(max);
}
- firstRange = BaseConstraints.rangeConstraint(min, max, firstRange.getDescription(),
- firstRange.getReference());
+ firstRange = BaseConstraints.newRangeConstraint(min, max,
+ Optional.fromNullable(firstRange.getDescription()),
+ Optional.fromNullable(firstRange.getReference()));
resolved.set(0, firstRange);
- lastRange = BaseConstraints.rangeConstraint(min, max, lastRange.getDescription(), lastRange.getReference());
+ lastRange = BaseConstraints.newRangeConstraint(min, max,
+ Optional.fromNullable(lastRange.getDescription()),
+ Optional.fromNullable(lastRange.getReference()));
resolved.set(resolved.size() - 1, lastRange);
} else {
if (min instanceof UnknownBoundaryNumber) {
min = resolveMinRange(min);
- firstRange = BaseConstraints.rangeConstraint(min, firstRange.getMax(), firstRange.getDescription(),
- firstRange.getReference());
+ firstRange = BaseConstraints.newRangeConstraint(min, firstRange.getMax(),
+ Optional.fromNullable(firstRange.getDescription()),
+ Optional.fromNullable(firstRange.getReference()));
resolved.set(0, firstRange);
}
if (max instanceof UnknownBoundaryNumber) {
max = resolveMaxRange(max);
- lastRange = BaseConstraints.rangeConstraint(lastRange.getMin(), max, lastRange.getDescription(),
- lastRange.getReference());
+ lastRange = BaseConstraints.newRangeConstraint(lastRange.getMin(), max,
+ Optional.fromNullable(lastRange.getDescription()),
+ Optional.fromNullable(lastRange.getReference()));
resolved.set(resolved.size() - 1, lastRange);
}
}
return resolved;
}
- private Number resolveMinRange(Number min) {
+ private Number resolveMinRange(final Number min) {
int i = 1;
- while (min instanceof UnknownBoundaryNumber) {
+ Number newMin = min;
+ while (newMin instanceof UnknownBoundaryNumber) {
final List<RangeConstraint> act = ranges.get(i);
- min = act.get(0).getMin();
+ newMin = act.get(0).getMin();
i++;
}
- return min;
+ return newMin;
}
- private Number resolveMaxRange(Number max) {
+ private Number resolveMaxRange(final Number max) {
int i = 1;
- while (max instanceof UnknownBoundaryNumber) {
+ Number newMax = max;
+ while (newMax instanceof UnknownBoundaryNumber) {
final List<RangeConstraint> act = ranges.get(i);
- max = act.get(act.size() - 1).getMax();
+ newMax = act.get(act.size() - 1).getMax();
i++;
}
- return max;
+ return newMax;
}
public void addRanges(final List<RangeConstraint> ranges) {
if (max instanceof UnknownBoundaryNumber) {
max = resolveMaxLength(max);
}
- firstLength = BaseConstraints.lengthConstraint(min, max, firstLength.getDescription(),
- firstLength.getReference());
+ firstLength = BaseConstraints.newLengthConstraint(min, max,
+ Optional.fromNullable(firstLength.getDescription()),
+ Optional.fromNullable(firstLength.getReference()));
resolved.set(0, firstLength);
- lastLength = BaseConstraints.lengthConstraint(min, max, lastLength.getDescription(),
- lastLength.getReference());
+ lastLength = BaseConstraints.newLengthConstraint(min, max,
+ Optional.fromNullable(lastLength.getDescription()),
+ Optional.fromNullable(lastLength.getReference()));
resolved.set(resolved.size() - 1, lastLength);
} else {
if (min instanceof UnknownBoundaryNumber) {
min = resolveMinLength(min);
- firstLength = BaseConstraints.lengthConstraint(min, firstLength.getMax(), firstLength.getDescription(),
- firstLength.getReference());
+ firstLength = BaseConstraints.newLengthConstraint(min, firstLength.getMax(),
+ Optional.fromNullable(firstLength.getDescription()),
+ Optional.fromNullable(firstLength.getReference()));
resolved.set(0, firstLength);
}
if (max instanceof UnknownBoundaryNumber) {
max = resolveMaxLength(max);
- lastLength = BaseConstraints.lengthConstraint(lastLength.getMin(), max, lastLength.getDescription(),
- lastLength.getReference());
+ lastLength = BaseConstraints.newLengthConstraint(lastLength.getMin(), max,
+ Optional.fromNullable(lastLength.getDescription()),
+ Optional.fromNullable(lastLength.getReference()));
resolved.set(resolved.size() - 1, lastLength);
}
}
return resolved;
}
- private Number resolveMinLength(Number min) {
+ private Number resolveMinLength(final Number min) {
int i = 1;
- while (min instanceof UnknownBoundaryNumber) {
+ Number newMin = min;
+ while (newMin instanceof UnknownBoundaryNumber) {
final List<LengthConstraint> act = lengths.get(i);
- min = act.get(0).getMin();
+ newMin = act.get(0).getMin();
i++;
}
- return min;
+ return newMin;
}
- private Number resolveMaxLength(Number max) {
+ private Number resolveMaxLength(final Number max) {
int i = 1;
- while (max instanceof UnknownBoundaryNumber) {
+ Number newMax = max;
+ while (newMax instanceof UnknownBoundaryNumber) {
final List<LengthConstraint> act = lengths.get(i);
- max = act.get(act.size() - 1).getMax();
+ newMax = act.get(act.size() - 1).getMax();
i++;
}
- return max;
+ return newMax;
}
public void addLengths(final List<LengthConstraint> lengths) {
}
public List<PatternConstraint> getPatterns() {
- if(patterns.isEmpty()) {
+ if (patterns.isEmpty()) {
return Collections.emptyList();
}
return patterns.get(0);
}
private void validateRange() {
+ validateRange(getRange());
+ }
+
+ private void validateRange(final List<RangeConstraint> typeRange) {
if (ranges.size() < 2) {
return;
}
- List<RangeConstraint> typeRange = getRange();
for (RangeConstraint range : typeRange) {
if (range.getMin() instanceof UnknownBoundaryNumber || range.getMax() instanceof UnknownBoundaryNumber) {
throw new YangParseException(moduleName, line, "Unresolved range constraints");
}
- final long min = range.getMin().longValue();
- final long max = range.getMax().longValue();
+ final BigDecimal min = new BigDecimal(range.getMin().toString());
+ final BigDecimal max = new BigDecimal(range.getMax().toString());
List<RangeConstraint> parentRanges = ranges.get(1);
- boolean check = false;
- for (RangeConstraint r : parentRanges) {
- Number parentMinNumber = r.getMin();
- if (parentMinNumber instanceof UnknownBoundaryNumber) {
- parentMinNumber = resolveMinRange(parentMinNumber);
- }
- long parentMin = parentMinNumber.longValue();
-
- Number parentMaxNumber = r.getMax();
- if (parentMaxNumber instanceof UnknownBoundaryNumber) {
- parentMaxNumber = resolveMaxRange(parentMaxNumber);
- }
- long parentMax = parentMaxNumber.longValue();
-
- if (parentMin <= min && parentMax >= max) {
- check = true;
- break;
- }
- }
- if (!check) {
+ if (!areRangesSubintervalsOfParentRanges(parentRanges, min, max)) {
throw new YangParseException(moduleName, line, "Invalid range constraint: <" + min + ", " + max
+ "> (parent: " + parentRanges + ").");
}
}
}
- private void validateRange(List<RangeConstraint> typeRange) {
- if (ranges.size() < 2) {
- return;
- }
-
- for (RangeConstraint range : typeRange) {
- if (range.getMin() instanceof UnknownBoundaryNumber || range.getMax() instanceof UnknownBoundaryNumber) {
- throw new YangParseException(moduleName, line, "Unresolved range constraints");
+ private boolean areRangesSubintervalsOfParentRanges(final List<RangeConstraint> parentRanges, final BigDecimal min,
+ final BigDecimal max) {
+ boolean check = false;
+ for (RangeConstraint r : parentRanges) {
+ Number parentMinNumber = r.getMin();
+ if (parentMinNumber instanceof UnknownBoundaryNumber) {
+ parentMinNumber = resolveMinRange(parentMinNumber);
}
- final long min = range.getMin().longValue();
- final long max = range.getMax().longValue();
+ BigDecimal parentMin = new BigDecimal(parentMinNumber.toString());
- List<RangeConstraint> parentRanges = ranges.get(1);
- boolean check = false;
- for (RangeConstraint r : parentRanges) {
- Number parentMinNumber = r.getMin();
- if (parentMinNumber instanceof UnknownBoundaryNumber) {
- parentMinNumber = resolveMinRange(parentMinNumber);
- }
- long parentMin = parentMinNumber.longValue();
-
- Number parentMaxNumber = r.getMax();
- if (parentMaxNumber instanceof UnknownBoundaryNumber) {
- parentMaxNumber = resolveMaxRange(parentMaxNumber);
- }
- long parentMax = parentMaxNumber.longValue();
-
- if (parentMin <= min && parentMax >= max) {
- check = true;
- break;
- }
+ Number parentMaxNumber = r.getMax();
+ if (parentMaxNumber instanceof UnknownBoundaryNumber) {
+ parentMaxNumber = resolveMaxRange(parentMaxNumber);
}
- if (!check) {
- throw new YangParseException(moduleName, line, "Invalid range constraint: <" + min + ", " + max
- + "> (parent: " + parentRanges + ").");
+ BigDecimal parentMax = new BigDecimal(parentMaxNumber.toString());
+
+ if (parentMin.compareTo(min) <= 0 && parentMax.compareTo(max) >= 0) {
+ check = true;
+ break;
}
}
+ return check;
}
private void validateLength() {
+ validateLength(getLength());
+ }
+
+ private void validateLength(final List<LengthConstraint> typeLength) {
if (lengths.size() < 2) {
return;
}
- List<LengthConstraint> typeLength = getLength();
for (LengthConstraint length : typeLength) {
if (length.getMin() instanceof UnknownBoundaryNumber || length.getMax() instanceof UnknownBoundaryNumber) {
final long max = length.getMax().longValue();
List<LengthConstraint> parentLengths = lengths.get(1);
- boolean check = false;
- for (LengthConstraint lc : parentLengths) {
- Number parentMinNumber = lc.getMin();
- if (parentMinNumber instanceof UnknownBoundaryNumber) {
- parentMinNumber = resolveMinLength(parentMinNumber);
- }
- long parentMin = parentMinNumber.longValue();
-
- Number parentMaxNumber = lc.getMax();
- if (parentMaxNumber instanceof UnknownBoundaryNumber) {
- parentMaxNumber = resolveMaxLength(parentMaxNumber);
- }
- long parentMax = parentMaxNumber.longValue();
-
- if (parentMin <= min && parentMax >= max) {
- check = true;
- break;
- }
- }
- if (!check) {
+ if (!areLengthRangesSubintervalsOfParentLengthRanges(parentLengths, min, max)) {
throw new YangParseException(moduleName, line, "Invalid length constraint: <" + min + ", " + max
+ "> (parent: " + parentLengths + ").");
}
}
}
- private void validateLength(List<LengthConstraint> typeLength) {
- if (lengths.size() < 2) {
- return;
- }
-
- for (LengthConstraint length : typeLength) {
- if (length.getMin() instanceof UnknownBoundaryNumber || length.getMax() instanceof UnknownBoundaryNumber) {
- throw new YangParseException(moduleName, line, "Unresolved length constraints");
+ private boolean areLengthRangesSubintervalsOfParentLengthRanges(final List<LengthConstraint> parentLengths,
+ final long min, final long max) {
+ boolean check = false;
+ for (LengthConstraint lc : parentLengths) {
+ Number parentMinNumber = lc.getMin();
+ if (parentMinNumber instanceof UnknownBoundaryNumber) {
+ parentMinNumber = resolveMinLength(parentMinNumber);
}
- final long min = length.getMin().longValue();
- final long max = length.getMax().longValue();
+ long parentMin = parentMinNumber.longValue();
- List<LengthConstraint> parentLengths = lengths.get(1);
- boolean check = false;
- for (LengthConstraint lc : parentLengths) {
- Number parentMinNumber = lc.getMin();
- if (parentMinNumber instanceof UnknownBoundaryNumber) {
- parentMinNumber = resolveMinLength(parentMinNumber);
- }
- long parentMin = parentMinNumber.longValue();
-
- Number parentMaxNumber = lc.getMax();
- if (parentMaxNumber instanceof UnknownBoundaryNumber) {
- parentMaxNumber = resolveMaxLength(parentMaxNumber);
- }
- long parentMax = parentMaxNumber.longValue();
-
- if (parentMin <= min && parentMax >= max) {
- check = true;
- break;
- }
+ Number parentMaxNumber = lc.getMax();
+ if (parentMaxNumber instanceof UnknownBoundaryNumber) {
+ parentMaxNumber = resolveMaxLength(parentMaxNumber);
}
- if (!check) {
- throw new YangParseException(moduleName, line, "Invalid length constraint: <" + min + ", " + max
- + "> (parent: " + parentLengths + ").");
+ long parentMax = parentMaxNumber.longValue();
+
+ if (parentMin <= min && parentMax >= max) {
+ check = true;
+ break;
}
}
+ return check;
}
}