X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fsal%2Fyang-prototype%2Fcode-generator%2Fyang-model-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fyang%2Fparser%2Futil%2FTypeConstraints.java;h=17307b46ee29f8aedc8a8dcc58e4113a1d9c84f2;hb=d067191495a9515e157eed95b02cd32e63e74cf3;hp=18e4c31ab93856826251748abde40e73e30bf33e;hpb=06aa5ce746e29a3760688b2ef2817f50bec5ea7a;p=controller.git diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/TypeConstraints.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/TypeConstraints.java index 18e4c31ab9..17307b46ee 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/TypeConstraints.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/TypeConstraints.java @@ -20,17 +20,24 @@ import org.opendaylight.controller.yang.model.util.BaseConstraints; * Holder object for holding YANG type constraints. */ public final class TypeConstraints { + private final String moduleName; + private final int line; private final List> ranges = new ArrayList>(); private final List> lengths = new ArrayList>(); private final List patterns = new ArrayList(); - private Integer fractionDigits; + private final List fractionDigits = new ArrayList(); + + public TypeConstraints(final String moduleName, final int line) { + this.moduleName = moduleName; + this.line = line; + } List> getAllRanges() { return ranges; } public List getRange() { - if(ranges.isEmpty()) { + if (ranges.size() < 2) { return Collections.emptyList(); } @@ -40,8 +47,10 @@ public final class TypeConstraints { Number min = firstRange.getMin(); Number max = lastRange.getMax(); - if (!(min instanceof UnknownBoundaryNumber) - && !(max instanceof UnknownBoundaryNumber)) { + if (!(min instanceof UnknownBoundaryNumber) && !(max instanceof UnknownBoundaryNumber)) { + if (ranges.size() > 1) { + validateRange(resolved); + } return resolved; } @@ -52,28 +61,28 @@ public final class TypeConstraints { if (max instanceof UnknownBoundaryNumber) { max = resolveMaxRange(max); } - firstRange = BaseConstraints.rangeConstraint(min, max, - firstRange.getDescription(), firstRange.getReference()); + firstRange = BaseConstraints.rangeConstraint(min, max, firstRange.getDescription(), + firstRange.getReference()); resolved.set(0, firstRange); - lastRange = BaseConstraints.rangeConstraint(min, max, - lastRange.getDescription(), lastRange.getReference()); + lastRange = BaseConstraints.rangeConstraint(min, max, lastRange.getDescription(), 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 = BaseConstraints.rangeConstraint(min, firstRange.getMax(), firstRange.getDescription(), firstRange.getReference()); resolved.set(0, firstRange); } if (max instanceof UnknownBoundaryNumber) { max = resolveMaxRange(max); - lastRange = BaseConstraints.rangeConstraint(lastRange.getMin(), - max, lastRange.getDescription(), + lastRange = BaseConstraints.rangeConstraint(lastRange.getMin(), max, lastRange.getDescription(), lastRange.getReference()); resolved.set(resolved.size() - 1, lastRange); } } + if (this.ranges.size() > 1) { + validateRange(resolved); + } return resolved; } @@ -108,7 +117,7 @@ public final class TypeConstraints { } public List getLength() { - if(lengths.isEmpty()) { + if (lengths.size() < 2) { return Collections.emptyList(); } @@ -118,8 +127,10 @@ public final class TypeConstraints { Number min = firstLength.getMin(); Number max = lastLength.getMax(); - if (!(min instanceof UnknownBoundaryNumber) - && !(max instanceof UnknownBoundaryNumber)) { + if (!(min instanceof UnknownBoundaryNumber) && !(max instanceof UnknownBoundaryNumber)) { + if (lengths.size() > 1) { + validateLength(resolved); + } return resolved; } @@ -130,28 +141,30 @@ public final class TypeConstraints { if (max instanceof UnknownBoundaryNumber) { max = resolveMaxLength(max); } - firstLength = BaseConstraints.lengthConstraint(min, max, - firstLength.getDescription(), firstLength.getReference()); + firstLength = BaseConstraints.lengthConstraint(min, max, firstLength.getDescription(), + firstLength.getReference()); resolved.set(0, firstLength); - lastLength = BaseConstraints.lengthConstraint(min, max, - lastLength.getDescription(), lastLength.getReference()); + lastLength = BaseConstraints.lengthConstraint(min, max, lastLength.getDescription(), + 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 = BaseConstraints.lengthConstraint(min, firstLength.getMax(), firstLength.getDescription(), firstLength.getReference()); resolved.set(0, firstLength); } if (max instanceof UnknownBoundaryNumber) { max = resolveMaxLength(max); - lastLength = BaseConstraints.lengthConstraint( - lastLength.getMin(), max, lastLength.getDescription(), + lastLength = BaseConstraints.lengthConstraint(lastLength.getMin(), max, lastLength.getDescription(), lastLength.getReference()); resolved.set(resolved.size() - 1, lastLength); } } + + if (lengths.size() > 1) { + validateLength(resolved); + } return resolved; } @@ -190,12 +203,176 @@ public final class TypeConstraints { } public Integer getFractionDigits() { - return fractionDigits; + if (fractionDigits.isEmpty()) { + return null; + } + return fractionDigits.get(0); + } + + public void addFractionDigits(final Integer fractionDigits) { + this.fractionDigits.add(fractionDigits); } - public void setFractionDigits(final Integer fractionDigits) { - if (this.fractionDigits == null) { - this.fractionDigits = fractionDigits; + public void validateConstraints() { + validateLength(); + validateRange(); + } + + private void validateRange() { + if (ranges.size() < 2) { + return; + } + List typeRange = getRange(); + + for (RangeConstraint range : typeRange) { + if (range.getMin() instanceof UnknownBoundaryNumber || range.getMax() instanceof UnknownBoundaryNumber) { + throw new YangParseException(line, "Unresolved range constraints"); + } + final long min = range.getMin().longValue(); + final long max = range.getMax().longValue(); + + List 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) { + throw new YangParseException(moduleName, line, "Invalid range constraint: <" + min + ", " + max + + "> (parent: " + parentRanges + ")."); + } + } + } + + private void validateRange(List typeRange) { + if (ranges.size() < 2) { + return; + } + + for (RangeConstraint range : typeRange) { + if (range.getMin() instanceof UnknownBoundaryNumber || range.getMax() instanceof UnknownBoundaryNumber) { + throw new YangParseException(line, "Unresolved range constraints"); + } + final long min = range.getMin().longValue(); + final long max = range.getMax().longValue(); + + List 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) { + throw new YangParseException(moduleName, line, "Invalid range constraint: <" + min + ", " + max + + "> (parent: " + parentRanges + ")."); + } + } + } + + private void validateLength() { + if (lengths.size() < 2) { + return; + } + List typeLength = getLength(); + + for (LengthConstraint length : typeLength) { + if (length.getMin() instanceof UnknownBoundaryNumber || length.getMax() instanceof UnknownBoundaryNumber) { + throw new YangParseException(line, "Unresolved length constraints"); + } + final long min = length.getMin().longValue(); + final long max = length.getMax().longValue(); + + List 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) { + throw new YangParseException(moduleName, line, "Invalid length constraint: <" + min + ", " + max + + "> (parent: " + parentLengths + ")."); + } + } + } + + private void validateLength(List typeLength) { + if (lengths.size() < 2) { + return; + } + + for (LengthConstraint length : typeLength) { + if (length.getMin() instanceof UnknownBoundaryNumber || length.getMax() instanceof UnknownBoundaryNumber) { + throw new YangParseException(line, "Unresolved length constraints"); + } + final long min = length.getMin().longValue(); + final long max = length.getMax().longValue(); + + List 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) { + throw new YangParseException(moduleName, line, "Invalid length constraint: <" + min + ", " + max + + "> (parent: " + parentLengths + ")."); + } } }