From b246beeb2931748a264f188b914039a3ad3d5096 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 29 Aug 2017 17:36:34 +0200 Subject: [PATCH] BUG-8043: correct RangeConstraint definition Each type has at most one range constraint attached to it, reflect that fact in yang-model-api hiearchy. This has implications on RangeStatement: it should not be exposing RangeConstraints, as that is not what the argument holds. Reuse ValueRange from previous work on LengthConstraint and model ranges in a similar fashion. Change-Id: Ia3d13ce2e27b37c579bf40b30032451996c59914 Signed-off-by: Robert Varga --- .../codec/AbstractIntegerStringCodec.java | 52 ++--- .../data/impl/codec/Int16StringCodec.java | 5 - .../data/impl/codec/Int32StringCodec.java | 5 - .../data/impl/codec/Int64StringCodec.java | 5 - .../yang/data/impl/codec/Int8StringCodec.java | 5 - .../data/impl/codec/Uint16StringCodec.java | 5 - .../data/impl/codec/Uint32StringCodec.java | 5 - .../data/impl/codec/Uint64StringCodec.java | 8 - .../data/impl/codec/Uint8StringCodec.java | 5 - .../yang/model/api/package-info.java | 4 +- .../yang/model/api/stmt/RangeStatement.java | 9 +- .../yang/model/api/stmt/UnresolvedNumber.java | 18 +- .../yang/model/api/type/RangeConstraint.java | 35 +--- .../type/RangeRestrictedTypeDefinition.java | 13 +- .../model/export/SchemaContextEmitter.java | 36 ++-- .../yang/model/util/BaseConstraints.java | 57 ------ .../yang/model/util/RangeConstraintImpl.java | 116 ----------- .../util/type/AbstractIntegerBaseType.java | 6 +- .../type/AbstractRangeRestrictedBaseType.java | 50 +++-- .../AbstractRangeRestrictedDerivedType.java | 6 +- .../type/AbstractRangeRestrictedType.java | 14 +- .../util/type/AbstractUnsignedBaseType.java | 5 +- .../yang/model/util/type/BaseDecimalType.java | 89 +++++---- .../yang/model/util/type/BaseInt16Type.java | 2 +- .../yang/model/util/type/BaseInt32Type.java | 2 +- .../yang/model/util/type/BaseInt64Type.java | 2 +- .../yang/model/util/type/BaseInt8Type.java | 2 +- .../yang/model/util/type/BaseUint16Type.java | 2 +- .../yang/model/util/type/BaseUint32Type.java | 2 +- .../yang/model/util/type/BaseUint64Type.java | 2 +- .../yang/model/util/type/BaseUint8Type.java | 2 +- .../yang/model/util/type/CompatUtils.java | 21 +- .../model/util/type/DecimalTypeBuilder.java | 2 +- .../type/InvalidRangeConstraintException.java | 16 +- .../type/LengthRestrictedTypeBuilder.java | 3 +- .../util/type/RangeRestrictedTypeBuilder.java | 183 ++++++++++-------- .../RangeRestrictedTypeBuilderWithBase.java | 5 +- .../util/type/ResolvedRangeConstraint.java | 52 +++++ .../util/type/RestrictedDecimalType.java | 5 +- .../util/type/RestrictedIntegerType.java | 5 +- .../yang/model/util/type/RestrictedTypes.java | 13 +- .../util/type/RestrictedUnsignedType.java | 5 +- .../yang/model/util/type/TypeDefinitions.java | 18 +- .../yang/model/util/type/TypeTest.java | 19 +- .../stmt/rfc6020/RangeStatementImpl.java | 25 +-- .../yang/parser/stmt/rfc6020/TypeUtils.java | 35 ++-- ...tractListConstraintEffectiveStatement.java | 13 +- ...64SpecificationEffectiveStatementImpl.java | 3 +- .../DecimalTypeEffectiveStatementImpl.java | 3 +- .../IntegerTypeEffectiveStatementImpl.java | 9 +- .../type/LengthEffectiveStatementImpl.java | 6 - .../type/RangeConstraintEffectiveImpl.java | 121 ------------ .../type/RangeEffectiveStatementImpl.java | 14 +- ...gnedIntegerTypeEffectiveStatementImpl.java | 3 +- .../yang/stmt/EffectiveStatementTypeTest.java | 2 +- .../yang/stmt/TypedefConstraintsTest.java | 16 +- .../yang/stmt/YangParserNegativeTest.java | 2 +- .../yangtools/yang/stmt/YangParserTest.java | 89 +++++---- .../yang/stmt/YangParserWithContextTest.java | 10 +- .../yangtools/yang/stmt/test/Bug5200Test.java | 5 +- 60 files changed, 481 insertions(+), 791 deletions(-) delete mode 100644 yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/RangeConstraintImpl.java create mode 100644 yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/ResolvedRangeConstraint.java delete mode 100644 yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/RangeConstraintEffectiveImpl.java diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/AbstractIntegerStringCodec.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/AbstractIntegerStringCodec.java index 9e837b6f9b..159a28f3b4 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/AbstractIntegerStringCodec.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/AbstractIntegerStringCodec.java @@ -19,10 +19,7 @@ import static org.opendaylight.yangtools.yang.model.util.BaseTypes.UINT8_QNAME; import com.google.common.annotations.Beta; import com.google.common.base.CharMatcher; -import com.google.common.collect.Range; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import com.google.common.collect.RangeSet; import java.util.Optional; import java.util.regex.Pattern; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; @@ -51,20 +48,12 @@ public abstract class AbstractIntegerStringCodec> rangeConstraints; + private final RangeSet rangeConstraints; - AbstractIntegerStringCodec(final Optional typeDefinition, final List constraints, + AbstractIntegerStringCodec(final Optional typeDefinition, final Optional> constraint, final Class outputClass) { super(typeDefinition, outputClass); - if (constraints.isEmpty()) { - rangeConstraints = Collections.emptyList(); - } else { - final List> builder = new ArrayList<>(constraints.size()); - for (final RangeConstraint yangConstraint : constraints) { - builder.add(createRange(yangConstraint.getMin(), yangConstraint.getMax())); - } - rangeConstraints = builder; - } + rangeConstraints = (RangeSet) constraint.map(RangeConstraint::getAllowedRanges).orElse(null); } public static AbstractIntegerStringCodec from(final IntegerTypeDefinition type) { @@ -114,12 +103,6 @@ public abstract class AbstractIntegerStringCodec createRange(final Number yangMin, final Number yangMax) { - final N min = convertValue(yangMin); - final N max = convertValue(yangMax); - return Range.closed(min, max); - } - @Override public final N deserialize(final String stringRepresentation) { final int base = provideBase(stringRepresentation); @@ -143,32 +126,19 @@ public abstract class AbstractIntegerStringCodec constraint : rangeConstraints) { - if (constraint.contains(value)) { - return; - } + if (rangeConstraints != null) { + checkArgument(rangeConstraints.contains(value), "Value '%s' is not in required ranges %s", + value, rangeConstraints); } - throw new IllegalArgumentException("Value '" + value + "' is not in required range " + rangeConstraints); } - protected static List extractRange(final IntegerTypeDefinition type) { - if (type == null) { - return Collections.emptyList(); - } - return type.getRangeConstraints(); + protected static Optional> extractRange(final IntegerTypeDefinition type) { + return type == null ? Optional.empty() : type.getRangeConstraint(); } - protected static List extractRange(final UnsignedIntegerTypeDefinition type) { - if (type == null) { - return Collections.emptyList(); - } - return type.getRangeConstraints(); + protected static Optional> extractRange(final UnsignedIntegerTypeDefinition type) { + return type == null ? Optional.empty() : type.getRangeConstraint(); } private static int provideBase(final String integer) { diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/Int16StringCodec.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/Int16StringCodec.java index 31b63c0380..9a6dcd7ccd 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/Int16StringCodec.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/Int16StringCodec.java @@ -28,9 +28,4 @@ final class Int16StringCodec extends AbstractIntegerStringCodecrange *
{@link org.opendaylight.yangtools.yang.model.api.type.RangeConstraint} - *
{@link org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition#getRangeConstraints()} - *
{@link org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition#getRangeConstraints()} + *
{@link org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition#getRangeConstraint()} + *
{@link org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition#getRangeConstraint()} * *
reference *
{@link org.opendaylight.yangtools.yang.model.api.SchemaNode#getReference()} diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RangeStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RangeStatement.java index 0c13727523..28c03217e4 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RangeStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RangeStatement.java @@ -8,14 +8,11 @@ package org.opendaylight.yangtools.yang.model.api.stmt; import java.util.List; - import javax.annotation.Nonnull; - import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; - -public interface RangeStatement extends DeclaredStatement>, DocumentedConstraintGroup { +public interface RangeStatement extends DeclaredStatement>, DocumentedConstraintGroup { @Nonnull - List getRange(); + @Override + List argument(); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UnresolvedNumber.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UnresolvedNumber.java index 987a6466a8..abe91ac1cb 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UnresolvedNumber.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UnresolvedNumber.java @@ -11,9 +11,7 @@ import static com.google.common.base.Preconditions.checkArgument; import com.google.common.annotations.Beta; import com.google.common.collect.Range; -import java.util.List; import org.opendaylight.yangtools.concepts.Immutable; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; @Beta public abstract class UnresolvedNumber extends Number implements Immutable { @@ -22,13 +20,13 @@ public abstract class UnresolvedNumber extends Number implements Immutable { private static final long serialVersionUID = 1L; @Override - public > T resolveLength(final Range span) { + public > T resolveLength(final Range span) { return resolve(span.upperEndpoint()); } @Override - public Number resolveRange(final List constraints) { - return resolve(constraints.get(constraints.size() - 1).getMax()); + public > T resolveRange(final Range span) { + return resolve(span.upperEndpoint()); } @Override @@ -45,13 +43,13 @@ public abstract class UnresolvedNumber extends Number implements Immutable { private static final long serialVersionUID = 1L; @Override - public > T resolveLength(final Range span) { + public > T resolveLength(final Range span) { return resolve(span.lowerEndpoint()); } @Override - public Number resolveRange(final List constraints) { - return resolve(constraints.get(0).getMin()); + public > T resolveRange(final Range span) { + return resolve(span.lowerEndpoint()); } @Override @@ -97,9 +95,9 @@ public abstract class UnresolvedNumber extends Number implements Immutable { return number; } - public abstract > T resolveLength(Range span); + public abstract > T resolveLength(Range span); - public abstract Number resolveRange(List constraints); + public abstract > T resolveRange(Range span); @Override public abstract String toString(); diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RangeConstraint.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RangeConstraint.java index 0c4b1d49d6..7d8da64e1a 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RangeConstraint.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RangeConstraint.java @@ -7,39 +7,18 @@ */ package org.opendaylight.yangtools.yang.model.api.type; +import com.google.common.collect.RangeSet; import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition; /** - * The Range Constraint interface is used to restrict integer and decimal - * built-in types, or types derived from those. - *
- * A range consists of an explicit value consists of an explicit value, or a lower bound - * returned by {@link #getMin()} and an upper bound returned by - * {@link #getMax()}.
- *
- * Each explicit value and range boundary value given in - * the range expression MUST match the type being restricted, or be one of the - * special values "min" or "max". "min" and "max" mean the minimum and maximum - * value accepted for the type being restricted, respectively - *
- *
- * This interface was modeled according to definition in [RFC-6020] The - * range Statement. + * A single value range restriction, as expressed by a range statement, as specified by + * [RFC-6020] The range Statement. */ -public interface RangeConstraint extends ConstraintMetaDefinition { - - /** - * Returns the length-restricting lower bound value. - * - * @return the length-restricting lower bound value. - */ - Number getMin(); - +public interface RangeConstraint> extends ConstraintMetaDefinition { /** - * Returns the length-restricting upper bound value. + * Return allowed length ranges. Returned RangeSet must not be empty. * - * @return the length-restricting upper bound value. + * @return Set of allowed lengths. */ - Number getMax(); + RangeSet getAllowedRanges(); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RangeRestrictedTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RangeRestrictedTypeDefinition.java index fe433c8dcd..cb5efac9d4 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RangeRestrictedTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RangeRestrictedTypeDefinition.java @@ -7,8 +7,7 @@ */ package org.opendaylight.yangtools.yang.model.api.type; -import java.util.List; -import javax.annotation.Nonnull; +import java.util.Optional; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; /** @@ -18,11 +17,11 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition; */ public interface RangeRestrictedTypeDefinition> extends TypeDefinition { /** - * Returns range constraints for instance of this type. These are the effective constraints, e.g. they include - * any range constraints imposed by base types. + * Returns range constraint of this type, if applicable. This is the effective constraint, e.g. it includes any + * range constraints implied by base type hierarchy. * - * @return list of range constraints which are specified as the argument of the range which is - * a substatement of the type statement + * @return range constraint which are specified in the range substatement of the type + * statement. */ - @Nonnull List getRangeConstraints(); + Optional> getRangeConstraint(); } diff --git a/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/SchemaContextEmitter.java b/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/SchemaContextEmitter.java index aedcb8f716..0ce5c2464b 100644 --- a/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/SchemaContextEmitter.java +++ b/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/SchemaContextEmitter.java @@ -1479,32 +1479,24 @@ abstract class SchemaContextEmitter { } private void emitIntegerSpefication(final IntegerTypeDefinition typeDef) { - emitRangeNodeOptional(typeDef.getRangeConstraints()); + typeDef.getRangeConstraint().ifPresent(this::emitRangeNode); } private void emitUnsignedIntegerSpecification(final UnsignedIntegerTypeDefinition typeDef) { - emitRangeNodeOptional(typeDef.getRangeConstraints()); - + typeDef.getRangeConstraint().ifPresent(this::emitRangeNode); } - private void emitRangeNodeOptional(final List list) { - // FIXME: BUG-2444: Wrong decomposition in API, should be - // LenghtConstraint - // which contains ranges. - if (!list.isEmpty()) { - super.writer.startRangeNode(toRangeString(list)); - final RangeConstraint first = list.iterator().next(); - first.getErrorMessage().ifPresent(this::emitErrorMessageNode); - first.getErrorAppTag().ifPresent(this::emitErrorAppTagNode); - emitDocumentedNode(first); - super.writer.endNode(); - } - + private void emitRangeNode(final RangeConstraint constraint) { + super.writer.startRangeNode(toRangeString(constraint.getAllowedRanges())); + constraint.getErrorMessage().ifPresent(this::emitErrorMessageNode); + constraint.getErrorAppTag().ifPresent(this::emitErrorAppTagNode); + emitDocumentedNode(constraint); + super.writer.endNode(); } private void emitDecimal64Specification(final DecimalTypeDefinition typeDefinition) { emitFranctionDigitsNode(typeDefinition.getFractionDigits()); - emitRangeNodeOptional(typeDefinition.getRangeConstraints()); + typeDefinition.getRangeConstraint().ifPresent(this::emitRangeNode); } private void emitFranctionDigitsNode(final Integer fractionDigits) { @@ -1545,8 +1537,8 @@ abstract class SchemaContextEmitter { return sb.toString(); } - private static String toRangeString(final List list) { - final Iterator it = list.iterator(); + private static String toRangeString(final RangeSet ranges) { + final Iterator> it = ranges.asRanges().iterator(); if (!it.hasNext()) { return ""; } @@ -1554,15 +1546,15 @@ abstract class SchemaContextEmitter { final StringBuilder sb = new StringBuilder(); boolean haveNext; do { - final RangeConstraint current = it.next(); + final Range current = it.next(); haveNext = it.hasNext(); - appendRange(sb, current.getMin(), current.getMax(), haveNext); + appendRange(sb, current.lowerEndpoint(), current.upperEndpoint(), haveNext); } while (haveNext); return sb.toString(); } - private static void appendRange(final StringBuilder sb, final Number min, final Number max, + private static void appendRange(final StringBuilder sb, final Object min, final Object max, final boolean haveNext) { sb.append(min); if (!min.equals(max)) { diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/BaseConstraints.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/BaseConstraints.java index cda1b56fc9..020c3b10d4 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/BaseConstraints.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/BaseConstraints.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.model.util; import java.util.Optional; import org.opendaylight.yangtools.yang.model.api.type.ModifierKind; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; /** * Utility class which provides factory methods to construct Constraints. @@ -18,7 +17,6 @@ import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; *

* Provides static factory methods which constructs instances of *

    - *
  • {@link RangeConstraint} - {@link #newRangeConstraint(Number, Number, Optional, Optional)} *
  • {@link PatternConstraint} - {@link #newPatternConstraint(String, Optional, Optional)} *
*/ @@ -27,61 +25,6 @@ public final class BaseConstraints { throw new UnsupportedOperationException(); } - /** - * Creates a {@link RangeConstraint}. - * - *

- * Creates an instance of Range constraint based on supplied parameters - * with additional behaviour: - *

    - *
  • {@link RangeConstraint#getErrorAppTag()} returns range-out-of-specified-bounds - *
  • {@link RangeConstraint#getErrorMessage()} returns The argument is out of bounds - * <min, max > - *
- * - * @see RangeConstraint - * - * @param Type of constraint - * @param min value-restricting lower bound value. The value MUST NOT Be null. - * @param max value-restricting upper bound value. The value MUST NOT Be null. - * @param description Description associated with constraint. {@link Optional#empty()} if description is undefined. - * @param reference Reference associated with constraint. {@link Optional#empty()} if reference is undefined. - * @return Instance of {@link RangeConstraint} - */ - public static RangeConstraint newRangeConstraint(final T min, final T max, - final Optional description, final Optional reference) { - return new RangeConstraintImpl(min, max, description, reference); - } - - /** - * Creates a {@link RangeConstraint}. - * - *

- * Creates an instance of Range constraint based on supplied parameters - * with additional behaviour: - *

    - *
  • {@link RangeConstraint#getErrorAppTag()} returns range-out-of-specified-bounds - *
  • {@link RangeConstraint#getErrorMessage()} returns The argument is out of bounds - * <min, max > - *
- * - * @see RangeConstraint - * - * @param Type of constraint - * @param min value-restricting lower bound value. The value MUST NOT Be null. - * @param max value-restricting upper bound value. The value MUST NOT Be null. - * @param description Description associated with constraint. {@link Optional#empty()} if description is undefined. - * @param reference Reference associated with constraint. {@link Optional#empty()} if reference is undefined. - * @param errorAppTag error-app-tag associated with constraint. - * @param errorMessage error message associated with constraint. - * @return Instance of {@link RangeConstraint} - */ - public static RangeConstraint newRangeConstraint(final T min, final T max, - final Optional description, final Optional reference, final String errorAppTag, - final String errorMessage) { - return new RangeConstraintImpl(min, max, description, reference, errorAppTag, errorMessage); - } - /** * Creates a {@link PatternConstraint}. * diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/RangeConstraintImpl.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/RangeConstraintImpl.java deleted file mode 100644 index ce06bfed82..0000000000 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/RangeConstraintImpl.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.yangtools.yang.model.util; - -import com.google.common.base.Preconditions; -import java.util.Objects; -import java.util.Optional; -import org.opendaylight.yangtools.concepts.Immutable; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; - -/** - * {@link Immutable} implementation of {@link RangeConstraint}. - * - *

- * Range constraint based on supplied parameters with additional behavior: - *

    - *
  • {@link RangeConstraint#getErrorAppTag()} returns - * range-out-of-specified-bounds - *
  • {@link RangeConstraint#getErrorMessage()} returns The argument is - * out of bounds <min, max > - *
- */ -final class RangeConstraintImpl implements RangeConstraint, Immutable { - private final Number min; - private final Number max; - - private final String description; - private final String reference; - - private final String errorAppTag; - private final String errorMessage; - - RangeConstraintImpl(final Number min, final Number max, final Optional description, - final Optional reference) { - this(min, max, description, reference, "range-out-of-specified-bounds", "The argument is out of bounds <" + min - + ", " + max + ">"); - } - - RangeConstraintImpl(final Number min, final Number max, final Optional description, - final Optional reference, final String errorAppTag, final String errorMessage) { - this.min = Preconditions.checkNotNull(min, "min must not be null."); - this.max = Preconditions.checkNotNull(max, "max must not be null."); - this.description = description.orElse(null); - this.reference = reference.orElse(null); - this.errorAppTag = errorAppTag != null ? errorAppTag : "range-out-of-specified-bounds"; - this.errorMessage = errorMessage != null ? errorMessage : "The argument is out of bounds <" + min + ", " + max - + ">"; - } - - @Override - public Optional getDescription() { - return Optional.ofNullable(description); - } - - @Override - public Optional getErrorAppTag() { - return Optional.ofNullable(errorAppTag); - } - - @Override - public Optional getErrorMessage() { - return Optional.ofNullable(errorMessage); - } - - @Override - public Optional getReference() { - return Optional.ofNullable(reference); - } - - @Override - public Number getMin() { - return min; - } - - @Override - public Number getMax() { - return max; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Objects.hashCode(description); - result = prime * result + errorAppTag.hashCode(); - result = prime * result + errorMessage.hashCode(); - result = prime * result + max.hashCode(); - result = prime * result + min.hashCode(); - result = prime * result + Objects.hashCode(reference); - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof RangeConstraintImpl)) { - return false; - } - final RangeConstraintImpl other = (RangeConstraintImpl) obj; - return Objects.equals(description, other.description) && Objects.equals(max, other.max) - && Objects.equals(min, other.min) && Objects.equals(reference, other.reference); - } - - @Override - public String toString() { - return "RangeConstraintImpl [min=" + min + ", max=" + max + ", description=" + description - + ", reference=" + reference + ", errorAppTag=" + errorAppTag + ", errorMessage=" + errorMessage + "]"; - } -} diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractIntegerBaseType.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractIntegerBaseType.java index 78435e7be4..1a7636d16a 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractIntegerBaseType.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractIntegerBaseType.java @@ -10,9 +10,9 @@ package org.opendaylight.yangtools.yang.model.util.type; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition; -abstract class AbstractIntegerBaseType extends AbstractRangeRestrictedBaseType - implements IntegerTypeDefinition { - AbstractIntegerBaseType(final QName qname, final Number minValue, final Number maxValue) { +abstract class AbstractIntegerBaseType> + extends AbstractRangeRestrictedBaseType implements IntegerTypeDefinition { + AbstractIntegerBaseType(final QName qname, final C minValue, final C maxValue) { super(qname, minValue, maxValue); } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedBaseType.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedBaseType.java index 0badaf2501..895400b9be 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedBaseType.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedBaseType.java @@ -7,36 +7,62 @@ */ package org.opendaylight.yangtools.yang.model.util.type; -import com.google.common.collect.ImmutableList; +import static java.util.Objects.requireNonNull; + +import com.google.common.collect.ImmutableRangeSet; +import com.google.common.collect.Range; import java.util.List; import java.util.Optional; import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; import org.opendaylight.yangtools.yang.model.api.type.RangeRestrictedTypeDefinition; -import org.opendaylight.yangtools.yang.model.util.BaseConstraints; -abstract class AbstractRangeRestrictedBaseType> extends AbstractBaseType - implements RangeRestrictedTypeDefinition { - private final List rangeConstraints; +abstract class AbstractRangeRestrictedBaseType, + C extends Number & Comparable> extends AbstractBaseType implements RangeRestrictedTypeDefinition { + private static final ConstraintMetaDefinition BUILTIN_CONSTRAINT = new ConstraintMetaDefinition() { + + @Override + public Optional getReference() { + return Optional.empty(); + } + + @Override + public Optional getDescription() { + return Optional.empty(); + } + + @Override + public Optional getErrorMessage() { + return Optional.empty(); + } + + @Override + public Optional getErrorAppTag() { + return Optional.empty(); + } + }; + + private final RangeConstraint rangeConstraint; - AbstractRangeRestrictedBaseType(final QName qname, final Number minValue, final Number maxValue) { + AbstractRangeRestrictedBaseType(final QName qname, final C minValue, final C maxValue) { super(qname); - this.rangeConstraints = ImmutableList.of(BaseConstraints.newRangeConstraint( - minValue, maxValue, Optional.empty(), Optional.empty())); + this.rangeConstraint = new ResolvedRangeConstraint<>(BUILTIN_CONSTRAINT, ImmutableRangeSet.of( + Range.closed(minValue, maxValue))); } AbstractRangeRestrictedBaseType(final SchemaPath path, final List unknownSchemaNodes, - final List rangeConstraints) { + final RangeConstraint rangeConstraint) { super(path, unknownSchemaNodes); - this.rangeConstraints = ImmutableList.copyOf(rangeConstraints); + this.rangeConstraint = requireNonNull(rangeConstraint); } @Override @Nonnull - public final List getRangeConstraints() { - return rangeConstraints; + public final Optional> getRangeConstraint() { + return Optional.of(rangeConstraint); } } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedDerivedType.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedDerivedType.java index bbbdb61643..2237f0220c 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedDerivedType.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedDerivedType.java @@ -8,7 +8,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import java.util.Collection; -import java.util.List; +import java.util.Optional; import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; @@ -27,7 +27,7 @@ abstract class AbstractRangeRestrictedDerivedType getRangeConstraints() { - return baseType().getRangeConstraints(); + public final Optional> getRangeConstraint() { + return baseType().getRangeConstraint(); } } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedType.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedType.java index 7538041b4f..bd1af45b0b 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedType.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedType.java @@ -7,10 +7,10 @@ */ package org.opendaylight.yangtools.yang.model.util.type; -import com.google.common.collect.ImmutableList; import java.util.Collection; -import java.util.List; +import java.util.Optional; import javax.annotation.Nonnull; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; @@ -18,17 +18,17 @@ import org.opendaylight.yangtools.yang.model.api.type.RangeRestrictedTypeDefinit abstract class AbstractRangeRestrictedType> extends AbstractRestrictedType implements RangeRestrictedTypeDefinition { - private final List rangeConstraints; + private final @Nullable RangeConstraint rangeConstraint; AbstractRangeRestrictedType(final T baseType, final SchemaPath path, - final Collection unknownSchemaNodes, final Collection rangeConstraints) { + final Collection unknownSchemaNodes, final @Nullable RangeConstraint rangeConstraint) { super(baseType, path, unknownSchemaNodes); - this.rangeConstraints = ImmutableList.copyOf(rangeConstraints); + this.rangeConstraint = rangeConstraint; } @Override @Nonnull - public final List getRangeConstraints() { - return rangeConstraints; + public final Optional> getRangeConstraint() { + return Optional.ofNullable(rangeConstraint); } } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractUnsignedBaseType.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractUnsignedBaseType.java index f840127997..8cd15c8c44 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractUnsignedBaseType.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractUnsignedBaseType.java @@ -10,9 +10,10 @@ package org.opendaylight.yangtools.yang.model.util.type; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition; -abstract class AbstractUnsignedBaseType extends AbstractRangeRestrictedBaseType +abstract class AbstractUnsignedBaseType> + extends AbstractRangeRestrictedBaseType implements UnsignedIntegerTypeDefinition { - AbstractUnsignedBaseType(final QName qname, final Number minValue, final Number maxValue) { + AbstractUnsignedBaseType(final QName qname, final C minValue, final C maxValue) { super(qname, minValue, maxValue); } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseDecimalType.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseDecimalType.java index c42451ef9b..04e961fbf1 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseDecimalType.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseDecimalType.java @@ -7,59 +7,80 @@ */ package org.opendaylight.yangtools.yang.model.util.type; +import static com.google.common.base.Verify.verifyNotNull; + import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableList.Builder; +import com.google.common.collect.ImmutableRangeSet; +import com.google.common.collect.Range; import java.math.BigDecimal; import java.util.List; import java.util.Optional; import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; -import org.opendaylight.yangtools.yang.model.util.BaseConstraints; -final class BaseDecimalType extends AbstractRangeRestrictedBaseType +final class BaseDecimalType extends AbstractRangeRestrictedBaseType implements DecimalTypeDefinition { - private static final List> IMPLICIT_RANGE_STATEMENTS; - - static { - final Builder> b = ImmutableList.builder(); - b.add(createRangeConstraint("-922337203685477580.8", "922337203685477580.7")); - b.add(createRangeConstraint("-92233720368547758.08", "92233720368547758.07")); - b.add(createRangeConstraint("-9223372036854775.808", "9223372036854775.807")); - b.add(createRangeConstraint("-922337203685477.5808", "922337203685477.5807")); - b.add(createRangeConstraint("-92233720368547.75808", "92233720368547.75807")); - b.add(createRangeConstraint("-9223372036854.775808", "9223372036854.775807")); - b.add(createRangeConstraint("-922337203685.4775808", "922337203685.4775807")); - b.add(createRangeConstraint("-92233720368.54775808", "92233720368.54775807")); - b.add(createRangeConstraint("-9223372036.854775808", "9223372036.854775807")); - b.add(createRangeConstraint("-922337203.6854775808", "922337203.6854775807")); - b.add(createRangeConstraint("-92233720.36854775808", "92233720.36854775807")); - b.add(createRangeConstraint("-9223372.036854775808", "9223372.036854775807")); - b.add(createRangeConstraint("-922337.2036854775808", "922337.2036854775807")); - b.add(createRangeConstraint("-92233.72036854775808", "92233.72036854775807")); - b.add(createRangeConstraint("-9223.372036854775808", "9223.372036854775807")); - b.add(createRangeConstraint("-922.3372036854775808", "922.3372036854775807")); - b.add(createRangeConstraint("-92.23372036854775808", "92.23372036854775807")); - b.add(createRangeConstraint("-9.223372036854775808", "9.223372036854775807")); - IMPLICIT_RANGE_STATEMENTS = b.build(); - } + private static final ConstraintMetaDefinition BUILTIN_CONSTRAINT = new ConstraintMetaDefinition() { + + @Override + public Optional getReference() { + return Optional.of("https://tools.ietf.org/html/rfc6020#section-9.3.4"); + } + + @Override + public Optional getDescription() { + return Optional.empty(); + } + + @Override + public Optional getErrorMessage() { + return Optional.empty(); + } + + @Override + public Optional getErrorAppTag() { + return Optional.empty(); + } + }; + + private static final ImmutableList> IMPLICIT_RANGE_STATEMENTS = ImmutableList.of( + createRangeConstraint("-922337203685477580.8", "922337203685477580.7"), + createRangeConstraint("-92233720368547758.08", "92233720368547758.07"), + createRangeConstraint("-9223372036854775.808", "9223372036854775.807"), + createRangeConstraint("-922337203685477.5808", "922337203685477.5807"), + createRangeConstraint("-92233720368547.75808", "92233720368547.75807"), + createRangeConstraint("-9223372036854.775808", "9223372036854.775807"), + createRangeConstraint("-922337203685.4775808", "922337203685.4775807"), + createRangeConstraint("-92233720368.54775808", "92233720368.54775807"), + createRangeConstraint("-9223372036.854775808", "9223372036.854775807"), + createRangeConstraint("-922337203.6854775808", "922337203.6854775807"), + createRangeConstraint("-92233720.36854775808", "92233720.36854775807"), + createRangeConstraint("-9223372.036854775808", "9223372.036854775807"), + createRangeConstraint("-922337.2036854775808", "922337.2036854775807"), + createRangeConstraint("-92233.72036854775808", "92233.72036854775807"), + createRangeConstraint("-9223.372036854775808", "9223.372036854775807"), + createRangeConstraint("-922.3372036854775808", "922.3372036854775807"), + createRangeConstraint("-92.23372036854775808", "92.23372036854775807"), + createRangeConstraint("-9.223372036854775808", "9.223372036854775807")); - private static List createRangeConstraint(final String min, final String max) { - return ImmutableList.of(BaseConstraints.newRangeConstraint(new BigDecimal(min), new BigDecimal(max), - Optional.empty(), Optional.of("https://tools.ietf.org/html/rfc6020#section-9.3.4"))); + private static RangeConstraint createRangeConstraint(final String min, final String max) { + return new ResolvedRangeConstraint<>(BUILTIN_CONSTRAINT, ImmutableRangeSet.of( + Range.closed(new BigDecimal(min), new BigDecimal(max)))); } - static List constraintsForDigits(final int fractionDigits) { - return IMPLICIT_RANGE_STATEMENTS.get(fractionDigits - 1); + static RangeConstraint constraintsForDigits(final int fractionDigits) { + return verifyNotNull(IMPLICIT_RANGE_STATEMENTS.get(fractionDigits - 1)); } private final Integer fractionDigits; BaseDecimalType(final SchemaPath path, final List unknownSchemaNodes, - final Integer fractionDigits, final List rangeConstraints) { - super(path, unknownSchemaNodes, rangeConstraints); + final Integer fractionDigits, final RangeConstraint rangeConstraint) { + super(path, unknownSchemaNodes, rangeConstraint); this.fractionDigits = fractionDigits; } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt16Type.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt16Type.java index dfc749af15..51a481fa12 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt16Type.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt16Type.java @@ -9,7 +9,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import org.opendaylight.yangtools.yang.model.util.BaseTypes; -final class BaseInt16Type extends AbstractIntegerBaseType { +final class BaseInt16Type extends AbstractIntegerBaseType { static final BaseInt16Type INSTANCE = new BaseInt16Type(); private BaseInt16Type() { diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt32Type.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt32Type.java index defb85d7f8..1559dea1bd 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt32Type.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt32Type.java @@ -9,7 +9,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import org.opendaylight.yangtools.yang.model.util.BaseTypes; -final class BaseInt32Type extends AbstractIntegerBaseType { +final class BaseInt32Type extends AbstractIntegerBaseType { static final BaseInt32Type INSTANCE = new BaseInt32Type(); private BaseInt32Type() { diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt64Type.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt64Type.java index 1b92d90fe9..7adff9e85c 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt64Type.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt64Type.java @@ -9,7 +9,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import org.opendaylight.yangtools.yang.model.util.BaseTypes; -final class BaseInt64Type extends AbstractIntegerBaseType { +final class BaseInt64Type extends AbstractIntegerBaseType { static final BaseInt64Type INSTANCE = new BaseInt64Type(); private BaseInt64Type() { diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt8Type.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt8Type.java index 748fb4e085..d9bef9fa13 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt8Type.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt8Type.java @@ -9,7 +9,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import org.opendaylight.yangtools.yang.model.util.BaseTypes; -final class BaseInt8Type extends AbstractIntegerBaseType { +final class BaseInt8Type extends AbstractIntegerBaseType { static final BaseInt8Type INSTANCE = new BaseInt8Type(); private BaseInt8Type() { diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint16Type.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint16Type.java index 79e23507c7..1148be33ef 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint16Type.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint16Type.java @@ -9,7 +9,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import org.opendaylight.yangtools.yang.model.util.BaseTypes; -final class BaseUint16Type extends AbstractUnsignedBaseType { +final class BaseUint16Type extends AbstractUnsignedBaseType { static final BaseUint16Type INSTANCE = new BaseUint16Type(); private BaseUint16Type() { diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint32Type.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint32Type.java index 898ebd539f..56b0b2ef4d 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint32Type.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint32Type.java @@ -9,7 +9,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import org.opendaylight.yangtools.yang.model.util.BaseTypes; -final class BaseUint32Type extends AbstractUnsignedBaseType { +final class BaseUint32Type extends AbstractUnsignedBaseType { static final BaseUint32Type INSTANCE = new BaseUint32Type(); private BaseUint32Type() { diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint64Type.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint64Type.java index 12db4b15a6..d68fd5d809 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint64Type.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint64Type.java @@ -10,7 +10,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import java.math.BigInteger; import org.opendaylight.yangtools.yang.model.util.BaseTypes; -final class BaseUint64Type extends AbstractUnsignedBaseType { +final class BaseUint64Type extends AbstractUnsignedBaseType { static final BaseUint64Type INSTANCE = new BaseUint64Type(); private BaseUint64Type() { diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint8Type.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint8Type.java index 02532baa43..b3b9379c86 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint8Type.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUint8Type.java @@ -9,7 +9,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import org.opendaylight.yangtools.yang.model.util.BaseTypes; -final class BaseUint8Type extends AbstractUnsignedBaseType { +final class BaseUint8Type extends AbstractUnsignedBaseType { static final BaseUint8Type INSTANCE = new BaseUint8Type(); private BaseUint8Type() { diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/CompatUtils.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/CompatUtils.java index 923a728c2b..251b628de8 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/CompatUtils.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/CompatUtils.java @@ -20,6 +20,8 @@ import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint; import org.opendaylight.yangtools.yang.model.api.type.LengthRestrictedTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; +import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; +import org.opendaylight.yangtools.yang.model.api.type.RangeRestrictedTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition; @@ -154,8 +156,7 @@ public final class CompatUtils { } private static TypeDefinition baseTypeIfNotConstrained(final DecimalTypeDefinition type) { - final DecimalTypeDefinition base = type.getBaseType(); - return baseTypeIfNotConstrained(type, type.getRangeConstraints(), base, base.getRangeConstraints()); + return baseTypeIfNotConstrained(type, type.getBaseType()); } private static TypeDefinition baseTypeIfNotConstrained(final InstanceIdentifierTypeDefinition type) { @@ -164,8 +165,7 @@ public final class CompatUtils { } private static TypeDefinition baseTypeIfNotConstrained(final IntegerTypeDefinition type) { - final IntegerTypeDefinition base = type.getBaseType(); - return baseTypeIfNotConstrained(type, type.getRangeConstraints(), base, base.getRangeConstraints()); + return baseTypeIfNotConstrained(type, type.getBaseType()); } private static TypeDefinition baseTypeIfNotConstrained(final StringTypeDefinition type) { @@ -182,13 +182,16 @@ public final class CompatUtils { } private static TypeDefinition baseTypeIfNotConstrained(final UnsignedIntegerTypeDefinition type) { - final UnsignedIntegerTypeDefinition base = type.getBaseType(); - return baseTypeIfNotConstrained(type, type.getRangeConstraints(), base, base.getRangeConstraints()); + return baseTypeIfNotConstrained(type, type.getBaseType()); } - private static TypeDefinition baseTypeIfNotConstrained(final TypeDefinition type, - final List typeConstraints, final TypeDefinition base, final List baseConstraints) { - return typeConstraints.isEmpty() || typeConstraints.equals(baseConstraints) ? base : type; + private static > T baseTypeIfNotConstrained(final T type, + final T base) { + final Optional> optConstraint = type.getRangeConstraint(); + if (!optConstraint.isPresent()) { + return base; + } + return optConstraint.equals(base.getRangeConstraint()) ? base : type; } private static > T baseTypeIfNotConstrained(final T type, diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DecimalTypeBuilder.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DecimalTypeBuilder.java index 40790b63a3..f71cdf10a9 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DecimalTypeBuilder.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DecimalTypeBuilder.java @@ -30,6 +30,6 @@ public final class DecimalTypeBuilder extends RangeRestrictedTypeBuilder offendingRangeConstraint; + + protected InvalidRangeConstraintException(final RangeSet offendingConstraint, final String message) { super(message); - this.offendingRangeConstraint = Preconditions.checkNotNull(offendingConstraint); + this.offendingRangeConstraint = requireNonNull(offendingConstraint); } - public InvalidRangeConstraintException(final RangeConstraint offendingConstraint, final String format, + public InvalidRangeConstraintException(final RangeSet offendingConstraint, final String format, final Object... args) { this(offendingConstraint, String.format(format, args)); } - public RangeConstraint getOffendingConstraint() { + public RangeSet getOffendingRanges() { return offendingRangeConstraint; } } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/LengthRestrictedTypeBuilder.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/LengthRestrictedTypeBuilder.java index 7789f5d1d0..29fe0a98ef 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/LengthRestrictedTypeBuilder.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/LengthRestrictedTypeBuilder.java @@ -44,8 +44,7 @@ public abstract class LengthRestrictedTypeBuilder ranges) throws InvalidLengthConstraintException { - Preconditions.checkState(lengthConstraint == null, "Length alternatives already defined as %s", - lengthConstraint); + Preconditions.checkState(lengthConstraint == null, "Length constraint already defined as %s", lengthConstraint); final LengthConstraint baseLengths = findLenghts(); if (ranges.isEmpty()) { lengthConstraint = baseLengths; diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RangeRestrictedTypeBuilder.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RangeRestrictedTypeBuilder.java index 7fa9863e89..ab15278af1 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RangeRestrictedTypeBuilder.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RangeRestrictedTypeBuilder.java @@ -7,41 +7,102 @@ */ package org.opendaylight.yangtools.yang.model.util.type; +import static com.google.common.base.Preconditions.checkState; +import static java.util.Objects.requireNonNull; + import com.google.common.base.Preconditions; import com.google.common.base.Verify; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableList.Builder; -import java.util.Collection; +import com.google.common.collect.ImmutableRangeSet; +import com.google.common.collect.ImmutableRangeSet.Builder; +import com.google.common.collect.Range; +import com.google.common.collect.RangeSet; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.function.Function; -import javax.annotation.Nonnull; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.stmt.UnresolvedNumber; +import org.opendaylight.yangtools.yang.model.api.stmt.ValueRange; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; import org.opendaylight.yangtools.yang.model.api.type.RangeRestrictedTypeDefinition; -import org.opendaylight.yangtools.yang.model.util.BaseConstraints; public abstract class RangeRestrictedTypeBuilder> extends AbstractRestrictedTypeBuilder { - private List rangeAlternatives; + private ConstraintMetaDefinition constraint; + private List ranges; RangeRestrictedTypeBuilder(final T baseType, final SchemaPath path) { super(baseType, path); } - public final void setRangeAlternatives(@Nonnull final Collection rangeAlternatives) { - Preconditions.checkState(this.rangeAlternatives == null, "Range alternatives already defined as %s", - this.rangeAlternatives); - this.rangeAlternatives = ImmutableList.copyOf(rangeAlternatives); + public final void setRangeConstraint(final @NonNull ConstraintMetaDefinition constraint, + final @NonNull List ranges) { + checkState(this.ranges == null, "Range constraint already defined as %s %s", this.ranges, this.constraint); + + this.constraint = requireNonNull(constraint); + this.ranges = ImmutableList.copyOf(ranges); touch(); } - private static List ensureResolvedRanges(final List unresolved, - final List baseRangeConstraints) { + final > RangeConstraint calculateRangeConstraint( + final RangeConstraint baseRangeConstraint) { + if (ranges == null) { + return baseRangeConstraint; + } + + // Run through alternatives and resolve them against the base type + final RangeSet baseRangeSet = (RangeSet) baseRangeConstraint.getAllowedRanges(); + Verify.verify(!baseRangeSet.isEmpty(), "Base type %s does not define constraints", getBaseType()); + + final Range baseRange = baseRangeSet.span(); + final List resolvedRanges = ensureResolvedRanges(ranges, baseRange); + + // Next up, ensure the of boundaries match base constraints + final RangeSet typedRanges = ensureTypedRanges(resolvedRanges, baseRange.lowerEndpoint().getClass()); + + // Now verify if new ranges are strict subset of base ranges + if (!baseRangeSet.enclosesAll(typedRanges)) { + throw new InvalidRangeConstraintException(typedRanges, + "Range constraints %s is not a subset of parent constraints %s", typedRanges, baseRangeSet); + } + + return new RangeConstraint() { + @Override + public Optional getErrorAppTag() { + return constraint.getErrorAppTag(); + } + + @Override + public Optional getErrorMessage() { + return constraint.getErrorMessage(); + } + + @Override + public Optional getDescription() { + return constraint.getDescription(); + } + + @Override + public Optional getReference() { + return constraint.getReference(); + } + + @Override + public RangeSet getAllowedRanges() { + return typedRanges; + } + }; + } + + private static > List ensureResolvedRanges( + final List unresolved, final Range baseRange) { // First check if we need to resolve anything at all - for (RangeConstraint c : unresolved) { - if (c.getMax() instanceof UnresolvedNumber || c.getMin() instanceof UnresolvedNumber) { - return resolveRanges(unresolved, baseRangeConstraints); + for (ValueRange c : unresolved) { + if (c.lowerBound() instanceof UnresolvedNumber || c.upperBound() instanceof UnresolvedNumber) { + return resolveRanges(unresolved, baseRange); } } @@ -49,103 +110,67 @@ public abstract class RangeRestrictedTypeBuilder resolveRanges(final List unresolved, - final List baseRangeConstraints) { - final Builder builder = ImmutableList.builder(); - - for (RangeConstraint c : unresolved) { - final Number max = c.getMax(); - final Number min = c.getMin(); + private static > List resolveRanges(final List unresolved, + final Range baseRange) { + final List ret = new ArrayList<>(unresolved.size()); + for (ValueRange range : unresolved) { + final Number min = range.lowerBound(); + final Number max = range.upperBound(); if (max instanceof UnresolvedNumber || min instanceof UnresolvedNumber) { - final Number rMax = max instanceof UnresolvedNumber - ? ((UnresolvedNumber)max).resolveRange(baseRangeConstraints) : max; final Number rMin = min instanceof UnresolvedNumber - ? ((UnresolvedNumber)min).resolveRange(baseRangeConstraints) : min; - - builder.add(BaseConstraints.newRangeConstraint(rMin, rMax, c.getDescription(), - c.getReference(), c.getErrorAppTag().orElse(null), c.getErrorMessage().orElse(null))); + ? ((UnresolvedNumber)min).resolveRange(baseRange) : min; + final Number rMax = max instanceof UnresolvedNumber + ? ((UnresolvedNumber)max).resolveRange(baseRange) : max; + ret.add(ValueRange.of((@NonNull Number)rMin, (@NonNull Number)rMax)); } else { - builder.add(c); + ret.add(range); } - } - return builder.build(); + return ret; } - private static List ensureTypedRanges(final List ranges, + private static > RangeSet ensureTypedRanges(final List ranges, final Class clazz) { - for (RangeConstraint c : ranges) { - if (!clazz.isInstance(c.getMin()) || !clazz.isInstance(c.getMax())) { + final Builder builder = ImmutableRangeSet.builder(); + for (ValueRange range : ranges) { + if (!clazz.isInstance(range.lowerBound()) || !clazz.isInstance(range.upperBound())) { return typedRanges(ranges, clazz); } + + builder.add(Range.closed((T) range.lowerBound(), (T)range.upperBound())); } - return ranges; + return builder.build(); } - private static List typedRanges(final List ranges, + private static > RangeSet typedRanges(final List ranges, final Class clazz) { final Function function = NumberUtil.converterTo(clazz); Preconditions.checkArgument(function != null, "Unsupported range class %s", clazz); - final Builder builder = ImmutableList.builder(); + final Builder builder = ImmutableRangeSet.builder(); - for (RangeConstraint c : ranges) { - if (!clazz.isInstance(c.getMin()) || !clazz.isInstance(c.getMax())) { + for (ValueRange range : ranges) { + if (!clazz.isInstance(range.lowerBound()) || !clazz.isInstance(range.upperBound())) { final Number min; final Number max; try { - min = function.apply(c.getMin()); - max = function.apply(c.getMax()); + min = function.apply(range.lowerBound()); + max = function.apply(range.upperBound()); } catch (NumberFormatException e) { throw new IllegalArgumentException(String.format("Constraint %s does not fit into range of %s", - c, clazz.getSimpleName()), e); + range, clazz.getSimpleName()), e); } - builder.add(BaseConstraints.newRangeConstraint(min, max, c.getDescription(), c.getReference(), - c.getErrorAppTag().orElse(null), c.getErrorMessage().orElse(null))); + + builder.add(Range.closed((T)min, (T)max)); } else { - builder.add(c); + builder.add(Range.closed((T) range.lowerBound(), (T)range.upperBound())); } } return builder.build(); } - - private static boolean rangeCovered(final List where, - final RangeConstraint what) { - for (RangeConstraint c : where) { - if (NumberUtil.isRangeCovered(what.getMin(), what.getMax(), c.getMin(), c.getMax())) { - return true; - } - } - - return false; - } - - final List calculateRangeConstraints(final List baseRangeConstraints) { - if (rangeAlternatives == null || rangeAlternatives.isEmpty()) { - return baseRangeConstraints; - } - - // Run through alternatives and resolve them against the base type - Verify.verify(!baseRangeConstraints.isEmpty(), "Base type %s does not define constraints", getBaseType()); - final List resolvedRanges = ensureResolvedRanges(rangeAlternatives, baseRangeConstraints); - - // Next up, ensure the of boundaries match base constraints - final Class clazz = baseRangeConstraints.get(0).getMin().getClass(); - final List typedRanges = ensureTypedRanges(resolvedRanges, clazz); - - // Now verify if new ranges are strict subset of base ranges - for (RangeConstraint c : typedRanges) { - if (!rangeCovered(baseRangeConstraints, c)) { - throw new InvalidRangeConstraintException(c, - "Range constraint %s is not a subset of parent constraints %s", c, baseRangeConstraints); - } - } - - return typedRanges; - } } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RangeRestrictedTypeBuilderWithBase.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RangeRestrictedTypeBuilderWithBase.java index bf03f1ba3b..8492e94f23 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RangeRestrictedTypeBuilderWithBase.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RangeRestrictedTypeBuilderWithBase.java @@ -9,7 +9,6 @@ package org.opendaylight.yangtools.yang.model.util.type; import static java.util.Objects.requireNonNull; -import java.util.List; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; import org.opendaylight.yangtools.yang.model.api.type.RangeRestrictedTypeDefinition; @@ -23,8 +22,8 @@ abstract class RangeRestrictedTypeBuilderWithBase rangeConstraints); + abstract T buildType(RangeConstraint rangeConstraints); } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/ResolvedRangeConstraint.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/ResolvedRangeConstraint.java new file mode 100644 index 0000000000..f74cf95ebf --- /dev/null +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/ResolvedRangeConstraint.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.model.util.type; + +import static java.util.Objects.requireNonNull; + +import com.google.common.collect.ImmutableRangeSet; +import com.google.common.collect.RangeSet; +import java.util.Optional; +import org.opendaylight.yangtools.concepts.Immutable; +import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition; +import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; + +final class ResolvedRangeConstraint> implements RangeConstraint, Immutable { + private final ConstraintMetaDefinition meta; + private final RangeSet ranges; + + ResolvedRangeConstraint(final ConstraintMetaDefinition meta, final RangeSet ranges) { + this.meta = requireNonNull(meta); + this.ranges = ImmutableRangeSet.copyOf(ranges); + } + + @Override + public Optional getDescription() { + return meta.getDescription(); + } + + @Override + public Optional getErrorAppTag() { + return meta.getErrorAppTag(); + } + + @Override + public Optional getErrorMessage() { + return meta.getErrorMessage(); + } + + @Override + public Optional getReference() { + return meta.getReference(); + } + + @Override + public RangeSet getAllowedRanges() { + return ranges; + } +} diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedDecimalType.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedDecimalType.java index ecd6e14baa..a8bb33ebc2 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedDecimalType.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedDecimalType.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import java.util.Collection; import javax.annotation.Nonnull; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition; @@ -17,8 +18,8 @@ import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; final class RestrictedDecimalType extends AbstractRangeRestrictedType implements DecimalTypeDefinition { RestrictedDecimalType(final DecimalTypeDefinition baseType, final SchemaPath path, - final Collection unknownSchemaNodes, final Collection rangeConstraints) { - super(baseType, path, unknownSchemaNodes, rangeConstraints); + final Collection unknownSchemaNodes, final @Nullable RangeConstraint rangeConstraint) { + super(baseType, path, unknownSchemaNodes, rangeConstraint); } @Nonnull diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedIntegerType.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedIntegerType.java index 5e92d0ad67..d4c22a6bfd 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedIntegerType.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedIntegerType.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import java.util.Collection; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition; @@ -16,8 +17,8 @@ import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; final class RestrictedIntegerType extends AbstractRangeRestrictedType implements IntegerTypeDefinition { RestrictedIntegerType(final IntegerTypeDefinition baseType, final SchemaPath path, - final Collection unknownSchemaNodes, final Collection rangeConstraints) { - super(baseType, path, unknownSchemaNodes, rangeConstraints); + final Collection unknownSchemaNodes, final @Nullable RangeConstraint rangeConstraint) { + super(baseType, path, unknownSchemaNodes, rangeConstraint); } @Override diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedTypes.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedTypes.java index 71fcc36c88..1bba04d09a 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedTypes.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedTypes.java @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.model.util.type; import com.google.common.annotations.Beta; -import java.util.List; import javax.annotation.Nonnull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.model.api.SchemaPath; @@ -104,8 +103,8 @@ public final class RestrictedTypes { final DecimalTypeDefinition baseType, final SchemaPath path) { return new RangeRestrictedTypeBuilderWithBase(baseType, path) { @Override - DecimalTypeDefinition buildType(final List rangeConstraints) { - return new RestrictedDecimalType(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraints); + DecimalTypeDefinition buildType(final RangeConstraint rangeConstraint) { + return new RestrictedDecimalType(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint); } }; } @@ -158,8 +157,8 @@ public final class RestrictedTypes { final IntegerTypeDefinition baseType, final SchemaPath path) { return new RangeRestrictedTypeBuilderWithBase(baseType, path) { @Override - IntegerTypeDefinition buildType(final List rangeConstraints) { - return new RestrictedIntegerType(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraints); + IntegerTypeDefinition buildType(final RangeConstraint rangeConstraint) { + return new RestrictedIntegerType(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint); } }; } @@ -182,8 +181,8 @@ public final class RestrictedTypes { final UnsignedIntegerTypeDefinition baseType, final SchemaPath path) { return new RangeRestrictedTypeBuilderWithBase(baseType, path) { @Override - UnsignedIntegerTypeDefinition buildType(final List rangeConstraints) { - return new RestrictedUnsignedType(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraints); + UnsignedIntegerTypeDefinition buildType(final RangeConstraint rangeConstraint) { + return new RestrictedUnsignedType(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint); } }; } diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedUnsignedType.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedUnsignedType.java index 940ba8ac79..542bdccf6e 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedUnsignedType.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedUnsignedType.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.model.util.type; import java.util.Collection; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; @@ -17,8 +18,8 @@ final class RestrictedUnsignedType extends AbstractRangeRestrictedType unknownSchemaNodes, final Collection rangeConstraints) { - super(baseType, path, unknownSchemaNodes, rangeConstraints); + final Collection unknownSchemaNodes, final @Nullable RangeConstraint rangeConstraint) { + super(baseType, path, unknownSchemaNodes, rangeConstraint); } @Override diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/TypeDefinitions.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/TypeDefinitions.java index b3e261cf14..608d695f34 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/TypeDefinitions.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/TypeDefinitions.java @@ -78,7 +78,7 @@ final class TypeDefinitions { static int hashCode(final DecimalTypeDefinition type) { return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits().orElse(null), type.getDefaultValue().orElse(null), type.getFractionDigits(), - type.getRangeConstraints()); + type.getRangeConstraint().orElse(null)); } static int hashCode(final EmptyTypeDefinition type) { @@ -103,7 +103,7 @@ final class TypeDefinitions { static int hashCode(final IntegerTypeDefinition type) { return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), - type.getUnits().orElse(null), type.getDefaultValue().orElse(null), type.getRangeConstraints()); + type.getUnits().orElse(null), type.getDefaultValue().orElse(null), type.getRangeConstraint().orElse(null)); } static int hashCode(final LeafrefTypeDefinition type) { @@ -124,7 +124,7 @@ final class TypeDefinitions { static int hashCode(final UnsignedIntegerTypeDefinition type) { return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(), - type.getDefaultValue(), type.getRangeConstraints()); + type.getDefaultValue(), type.getRangeConstraint()); } static boolean equals(final BinaryTypeDefinition type, final Object obj) { @@ -156,7 +156,7 @@ final class TypeDefinitions { final DecimalTypeDefinition other = castIfEquals(DecimalTypeDefinition.class, type, obj); return other != null && type.getFractionDigits().equals(other.getFractionDigits()) - && type.getRangeConstraints().equals(other.getRangeConstraints()); + && type.getRangeConstraint().equals(other.getRangeConstraint()); } static boolean equals(final EmptyTypeDefinition type, final Object obj) { @@ -196,7 +196,7 @@ final class TypeDefinitions { } final IntegerTypeDefinition other = castIfEquals(IntegerTypeDefinition.class, type, obj); - return other != null && type.getRangeConstraints().equals(other.getRangeConstraints()); + return other != null && type.getRangeConstraint().equals(other.getRangeConstraint()); } static boolean equals(final LeafrefTypeDefinition type, final Object obj) { @@ -233,7 +233,7 @@ final class TypeDefinitions { } final UnsignedIntegerTypeDefinition other = castIfEquals(UnsignedIntegerTypeDefinition.class, type, obj); - return other != null && type.getRangeConstraints().equals(other.getRangeConstraints()); + return other != null && type.getRangeConstraint().equals(other.getRangeConstraint()); } static String toString(final BinaryTypeDefinition type) { @@ -250,7 +250,7 @@ final class TypeDefinitions { static String toString(final DecimalTypeDefinition type) { return toStringHelper(type).add("fractionDigits", type.getFractionDigits()) - .add("range", type.getRangeConstraints()).toString(); + .add("range", type.getRangeConstraint().orElse(null)).toString(); } static String toString(final EmptyTypeDefinition type) { @@ -270,7 +270,7 @@ final class TypeDefinitions { } static String toString(final IntegerTypeDefinition type) { - return toStringHelper(type).add("range", type.getRangeConstraints()).toString(); + return toStringHelper(type).add("range", type.getRangeConstraint().orElse(null)).toString(); } static String toString(final LeafrefTypeDefinition type) { @@ -287,6 +287,6 @@ final class TypeDefinitions { } static String toString(final UnsignedIntegerTypeDefinition type) { - return toStringHelper(type).add("range", type.getRangeConstraints()).toString(); + return toStringHelper(type).add("range", type.getRangeConstraint().orElse(null)).toString(); } } diff --git a/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/type/TypeTest.java b/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/type/TypeTest.java index a6957fac44..34fdf2c49e 100644 --- a/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/type/TypeTest.java +++ b/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/type/TypeTest.java @@ -11,11 +11,14 @@ package org.opendaylight.yangtools.yang.model.util.type; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import com.google.common.collect.ImmutableList; -import java.util.ArrayList; +import com.google.common.collect.ImmutableRangeSet; +import com.google.common.collect.Range; +import com.google.common.collect.RangeSet; import java.util.List; import java.util.Optional; import org.junit.Test; @@ -38,7 +41,6 @@ import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition; import org.opendaylight.yangtools.yang.model.util.BaseConstraints; @@ -422,10 +424,7 @@ public class TypeTest { final IntegerTypeDefinition integerTypeDefinition8 = BaseTypes.int8Type(); final RangeRestrictedTypeBuilder rangeRestrictedTypeBuilder = RestrictedTypes .newIntegerBuilder(integerTypeDefinition8, SCHEMA_PATH); - final RangeConstraint rangeConstraint = BaseConstraints.newRangeConstraint(min, max, ABSENT, ABSENT); - final ArrayList rangeArrayList = new ArrayList<>(1); - rangeArrayList.add(rangeConstraint); - rangeRestrictedTypeBuilder.setRangeAlternatives(rangeArrayList); + rangeRestrictedTypeBuilder.setRangeConstraint(mock(ConstraintMetaDefinition.class), lengthArrayList); final TypeDefinition typeDefinition1 = rangeRestrictedTypeBuilder.buildType(); assertNotNull(typeDefinition1); } @@ -434,15 +433,13 @@ public class TypeTest { public void exceptionTest() { final UnresolvedNumber min = UnresolvedNumber.min(); final UnresolvedNumber max = UnresolvedNumber.max(); - final RangeConstraint rangeConstraint = BaseConstraints.newRangeConstraint(min, max, Optional.empty(), - Optional.empty()); - final EnumPair enumPair = EnumPairBuilder.create("enum1", 1).setDescription("description") .setReference("reference").setUnknownSchemaNodes(mock(UnknownSchemaNode.class)).build(); + final RangeSet rangeset = ImmutableRangeSet.of(Range.closed(1, 2)); final InvalidRangeConstraintException invalidRangeConstraintException = new InvalidRangeConstraintException( - rangeConstraint, "error msg", "other important messages"); - assertEquals(invalidRangeConstraintException.getOffendingConstraint(), rangeConstraint); + rangeset, "error msg", "other important messages"); + assertSame(rangeset, invalidRangeConstraintException.getOffendingRanges()); final InvalidBitDefinitionException invalidBitDefinitionException = new InvalidBitDefinitionException( BIT_A, "error msg", "other important messages"); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RangeStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RangeStatementImpl.java index d6cf23d7ba..c1afac80e0 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RangeStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RangeStatementImpl.java @@ -9,7 +9,6 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import java.math.BigDecimal; import java.util.List; -import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; @@ -17,14 +16,14 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; +import org.opendaylight.yangtools.yang.model.api.stmt.ValueRange; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.RangeEffectiveStatementImpl; -public class RangeStatementImpl extends AbstractDeclaredStatement> implements RangeStatement { +public class RangeStatementImpl extends AbstractDeclaredStatement> implements RangeStatement { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping .RANGE) .addOptional(YangStmtMapping.DESCRIPTION) @@ -38,30 +37,30 @@ public class RangeStatementImpl extends AbstractDeclaredStatement, RangeStatement, ?> context) { + protected RangeStatementImpl(final StmtContext, RangeStatement, ?> context) { super(context); } - public static class Definition extends AbstractStatementSupport, RangeStatement, - EffectiveStatement, RangeStatement>> { + public static class Definition extends AbstractStatementSupport, RangeStatement, + EffectiveStatement, RangeStatement>> { public Definition() { super(YangStmtMapping.RANGE); } @Override - public List parseArgumentValue(final StmtContext ctx, final String value) { + public List parseArgumentValue(final StmtContext ctx, final String value) { return TypeUtils.parseRangeListFromString(ctx, value); } @Override - public RangeStatement createDeclared(final StmtContext, RangeStatement, ?> ctx) { + public RangeStatement createDeclared(final StmtContext, RangeStatement, ?> ctx) { return new RangeStatementImpl(ctx); } @Override - public EffectiveStatement, RangeStatement> createEffective( - final StmtContext, RangeStatement, EffectiveStatement, + public EffectiveStatement, RangeStatement> createEffective( + final StmtContext, RangeStatement, EffectiveStatement, RangeStatement>> ctx) { return new RangeEffectiveStatementImpl(ctx); } @@ -91,10 +90,4 @@ public class RangeStatementImpl extends AbstractDeclaredStatement getRange() { - return argument(); - } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypeUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypeUtils.java index 30123541b9..8f832ca79c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypeUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypeUtils.java @@ -20,7 +20,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.YangVersion; @@ -33,13 +32,11 @@ import org.opendaylight.yangtools.yang.model.api.stmt.UnresolvedNumber; import org.opendaylight.yangtools.yang.model.api.stmt.ValueRange; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.QNameCacheNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.RangeConstraintEffectiveImpl; /** * Utility class for manipulating YANG base and extended types implementation. @@ -146,16 +143,12 @@ public final class TypeUtils { } } - public static List parseRangeListFromString(final StmtContext ctx, - final String rangeArgument) { - - final Optional description = Optional.empty(); - final Optional reference = Optional.empty(); - - final List rangeConstraints = new ArrayList<>(); + public static List parseRangeListFromString(final StmtContext ctx, + final String rangeArgument) { + final List ranges = new ArrayList<>(); for (final String singleRange : PIPE_SPLITTER.split(rangeArgument)) { - final Iterator boundaries = TWO_DOTS_SPLITTER.splitToList(singleRange).iterator(); + final Iterator boundaries = TWO_DOTS_SPLITTER.split(singleRange).iterator(); final Number min = parseDecimalConstraintValue(ctx, boundaries.next()); final Number max; @@ -163,9 +156,8 @@ public final class TypeUtils { max = parseDecimalConstraintValue(ctx, boundaries.next()); // if min larger than max then error - InferenceException.throwIf(compareNumbers(min, max) == 1, ctx.getStatementSourceReference(), + SourceException.throwIf(compareNumbers(min, max) == 1, ctx.getStatementSourceReference(), "Range constraint %s has descending order of boundaries; should be ascending", singleRange); - SourceException.throwIf(boundaries.hasNext(), ctx.getStatementSourceReference(), "Wrong number of boundaries in range constraint %s", singleRange); } else { @@ -173,15 +165,14 @@ public final class TypeUtils { } // some of intervals overlapping - if (rangeConstraints.size() > 1 && compareNumbers(min, Iterables.getLast(rangeConstraints).getMax()) != 1) { - throw new InferenceException(ctx.getStatementSourceReference(), - "Some of the ranges in %s are not disjoint", rangeArgument); - } - - rangeConstraints.add(new RangeConstraintEffectiveImpl(min, max, description, reference)); + InferenceException.throwIf(ranges.size() > 1 + && compareNumbers(min, Iterables.getLast(ranges).upperBound()) != 1, + ctx.getStatementSourceReference(), "Some of the value ranges in %s are not disjoint", + rangeArgument); + ranges.add(ValueRange.of(min, max)); } - return rangeConstraints; + return ranges; } public static List parseLengthListFromString(final StmtContext ctx, @@ -198,8 +189,7 @@ public final class TypeUtils { // if min larger than max then error SourceException.throwIf(compareNumbers(min, max) == 1, ctx.getStatementSourceReference(), - "Length constraint %s has descending order of boundaries; should be ascending.", - singleRange); + "Length constraint %s has descending order of boundaries; should be ascending.", singleRange); SourceException.throwIf(boundaries.hasNext(), ctx.getStatementSourceReference(), "Wrong number of boundaries in length constraint %s.", singleRange); } else { @@ -211,7 +201,6 @@ public final class TypeUtils { && compareNumbers(min, Iterables.getLast(ranges).upperBound()) != 1, ctx.getStatementSourceReference(), "Some of the length ranges in %s are not disjoint", lengthArgument); - ranges.add(ValueRange.of(min, max)); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/AbstractListConstraintEffectiveStatement.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/AbstractListConstraintEffectiveStatement.java index ef7ee9aa62..0a273dbf3b 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/AbstractListConstraintEffectiveStatement.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/AbstractListConstraintEffectiveStatement.java @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type; import com.google.common.collect.ImmutableList; -import java.util.ArrayList; import java.util.List; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; @@ -22,16 +21,6 @@ abstract class AbstractListConstraintEffectiveStatement createConstraints(final List argument) { - if (!isCustomizedStatement()) { - return ImmutableList.copyOf(argument); - } - - final List customizedConstraints = new ArrayList<>(argument.size()); - for (final T constraint : argument) { - customizedConstraints.add(createCustomizedConstraint(constraint)); - } - return ImmutableList.copyOf(customizedConstraints); + return ImmutableList.copyOf(argument); } - - abstract T createCustomizedConstraint(T constraint); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/Decimal64SpecificationEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/Decimal64SpecificationEffectiveStatementImpl.java index 6e2fe999e2..a0db7f284a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/Decimal64SpecificationEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/Decimal64SpecificationEffectiveStatementImpl.java @@ -36,7 +36,8 @@ public final class Decimal64SpecificationEffectiveStatementImpl extends builder.setFractionDigits(((FractionDigitsEffectiveStatementImpl) stmt).argument()); } if (stmt instanceof RangeEffectiveStatementImpl) { - builder.setRangeAlternatives(((RangeEffectiveStatementImpl)stmt).argument()); + final RangeEffectiveStatementImpl range = (RangeEffectiveStatementImpl) stmt; + builder.setRangeConstraint(range, range.argument()); } if (stmt instanceof UnknownEffectiveStatementImpl) { builder.addUnknownSchemaNode((UnknownEffectiveStatementImpl)stmt); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/DecimalTypeEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/DecimalTypeEffectiveStatementImpl.java index 34d5013ad0..e25d8172a4 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/DecimalTypeEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/DecimalTypeEffectiveStatementImpl.java @@ -38,7 +38,8 @@ public final class DecimalTypeEffectiveStatementImpl extends DeclaredEffectiveSt for (EffectiveStatement stmt : effectiveSubstatements()) { if (stmt instanceof RangeEffectiveStatementImpl) { - builder.setRangeAlternatives(((RangeEffectiveStatementImpl)stmt).argument()); + final RangeEffectiveStatementImpl range = (RangeEffectiveStatementImpl) stmt; + builder.setRangeConstraint(range, range.argument()); } if (stmt instanceof UnknownEffectiveStatementImpl) { builder.addUnknownSchemaNode((UnknownEffectiveStatementImpl)stmt); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/IntegerTypeEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/IntegerTypeEffectiveStatementImpl.java index b98b8928d8..64db59535f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/IntegerTypeEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/IntegerTypeEffectiveStatementImpl.java @@ -13,7 +13,6 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; import org.opendaylight.yangtools.yang.model.util.type.InvalidRangeConstraintException; import org.opendaylight.yangtools.yang.model.util.type.RangeRestrictedTypeBuilder; import org.opendaylight.yangtools.yang.model.util.type.RestrictedTypes; @@ -38,7 +37,8 @@ public final class IntegerTypeEffectiveStatementImpl extends for (EffectiveStatement stmt : effectiveSubstatements()) { if (stmt instanceof RangeEffectiveStatementImpl) { - builder.setRangeAlternatives(((RangeEffectiveStatementImpl)stmt).argument()); + final RangeEffectiveStatementImpl range = (RangeEffectiveStatementImpl) stmt; + builder.setRangeConstraint(range, range.argument()); } if (stmt instanceof UnknownEffectiveStatementImpl) { builder.addUnknownSchemaNode((UnknownEffectiveStatementImpl)stmt); @@ -48,9 +48,8 @@ public final class IntegerTypeEffectiveStatementImpl extends try { typeDefinition = builder.build(); } catch (InvalidRangeConstraintException e) { - final RangeConstraint c = e.getOffendingConstraint(); - throw new SourceException(ctx.getStatementSourceReference(), e, "Invalid range constraint: <%s, %s>", - c.getMin(), c.getMax()); + throw new SourceException(ctx.getStatementSourceReference(), e, "Invalid range constraint: %s", + e.getOffendingRanges()); } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/LengthEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/LengthEffectiveStatementImpl.java index 35bf0284e5..31ac63caaf 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/LengthEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/LengthEffectiveStatementImpl.java @@ -14,13 +14,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; public class LengthEffectiveStatementImpl extends AbstractListConstraintEffectiveStatement { - public LengthEffectiveStatementImpl(final StmtContext, LengthStatement, ?> ctx) { super(ctx); } - - @Override - final ValueRange createCustomizedConstraint(final ValueRange lengthConstraint) { - return lengthConstraint; - } } \ No newline at end of file diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/RangeConstraintEffectiveImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/RangeConstraintEffectiveImpl.java deleted file mode 100644 index a5fedd5b9a..0000000000 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/RangeConstraintEffectiveImpl.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type; - -import static java.util.Objects.requireNonNull; - -import java.util.Objects; -import java.util.Optional; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; - -public class RangeConstraintEffectiveImpl implements RangeConstraint { - - public static final String DEFAULT_REFERENCE = "https://tools.ietf.org/html/rfc6020#section-9.2.4"; - private final Number min; - private final Number max; - - private final String description; - private final String reference; - - private final String errorAppTag; - private final String errorMessage; - - public RangeConstraintEffectiveImpl(final Number min, final Number max, final Optional description, - final Optional reference) { - this(min, max, description.orElse(null), reference.orElse(null), "range-out-of-specified-bounds", - "The argument is out of bounds <" + min + ", " + max + ">"); - } - - public RangeConstraintEffectiveImpl(final Number min, final Number max, final String description, - final String reference, final String errorAppTag, final String errorMessage) { - this.min = requireNonNull(min, "min must not be null"); - this.max = requireNonNull(max, "max must not be null"); - this.description = description; - this.reference = reference; - this.errorAppTag = errorAppTag != null ? errorAppTag : "range-out-of-specified-bounds"; - this.errorMessage = errorMessage != null ? errorMessage : "The argument is out of bounds <" + min + ", " + max - + ">"; - } - - @Override - public Optional getDescription() { - return Optional.ofNullable(description); - } - - @Override - public Optional getErrorAppTag() { - return Optional.ofNullable(errorAppTag); - } - - @Override - public Optional getErrorMessage() { - return Optional.ofNullable(errorMessage); - } - - @Override - public Optional getReference() { - return Optional.ofNullable(reference); - } - - @Override - public Number getMin() { - return min; - } - - @Override - public Number getMax() { - return max; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Objects.hashCode(description); - result = prime * result + errorAppTag.hashCode(); - result = prime * result + errorMessage.hashCode(); - result = prime * result + max.hashCode(); - result = prime * result + min.hashCode(); - result = prime * result + Objects.hashCode(reference); - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final RangeConstraintEffectiveImpl other = (RangeConstraintEffectiveImpl) obj; - if (!Objects.equals(description, other.description)) { - return false; - } - if (!Objects.equals(max, other.max)) { - return false; - } - if (!Objects.equals(min, other.min)) { - return false; - } - if (!Objects.equals(reference, other.reference)) { - return false; - } - return true; - } - - @Override - public String toString() { - return RangeConstraintEffectiveImpl.class.getSimpleName() + " [min=" + min + ", max=" + max + ", description=" - + description + ", reference=" + reference + ", errorAppTag=" + errorAppTag + ", errorMessage=" - + errorMessage + "]"; - } -} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/RangeEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/RangeEffectiveStatementImpl.java index 974464b15f..df7089053a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/RangeEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/RangeEffectiveStatementImpl.java @@ -9,19 +9,11 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type; import java.util.List; import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; +import org.opendaylight.yangtools.yang.model.api.stmt.ValueRange; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -public class RangeEffectiveStatementImpl extends - AbstractListConstraintEffectiveStatement { - public RangeEffectiveStatementImpl(final StmtContext, RangeStatement, ?> ctx) { +public class RangeEffectiveStatementImpl extends AbstractListConstraintEffectiveStatement { + public RangeEffectiveStatementImpl(final StmtContext, RangeStatement, ?> ctx) { super(ctx); } - - @Override - final RangeConstraint createCustomizedConstraint(final RangeConstraint rangeConstraint) { - return new RangeConstraintEffectiveImpl(rangeConstraint.getMin(), rangeConstraint.getMax(), - getDescription().orElse(null), getReference().orElse(null), getErrorAppTag().orElse(null), - getErrorMessage().orElse(null)); - } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/UnsignedIntegerTypeEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/UnsignedIntegerTypeEffectiveStatementImpl.java index 4360500fce..9f88fea04e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/UnsignedIntegerTypeEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/UnsignedIntegerTypeEffectiveStatementImpl.java @@ -35,7 +35,8 @@ public final class UnsignedIntegerTypeEffectiveStatementImpl extends for (EffectiveStatement stmt : effectiveSubstatements()) { if (stmt instanceof RangeEffectiveStatementImpl) { - builder.setRangeAlternatives(((RangeEffectiveStatementImpl)stmt).argument()); + final RangeEffectiveStatementImpl rangeStmt = (RangeEffectiveStatementImpl)stmt; + builder.setRangeConstraint(rangeStmt, rangeStmt.argument()); } if (stmt instanceof UnknownEffectiveStatementImpl) { builder.addUnknownSchemaNode((UnknownEffectiveStatementImpl)stmt); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/EffectiveStatementTypeTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/EffectiveStatementTypeTest.java index a034199671..c23185057e 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/EffectiveStatementTypeTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/EffectiveStatementTypeTest.java @@ -177,7 +177,7 @@ public class EffectiveStatementTypeTest { assertFalse(decimal64Eff.getReference().isPresent()); assertEquals(Status.CURRENT, decimal64Eff.getStatus()); - assertEquals(3, decimal64Eff.getRangeConstraints().size()); + assertEquals(3, decimal64Eff.getRangeConstraint().get().getAllowedRanges().asRanges().size()); assertNotNull(decimal64Eff.toString()); assertNotNull(decimal64Eff.hashCode()); assertTrue(decimal64Eff.getFractionDigits().equals(2)); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/TypedefConstraintsTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/TypedefConstraintsTest.java index 1db40ee58e..3f0fee007e 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/TypedefConstraintsTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/TypedefConstraintsTest.java @@ -13,8 +13,8 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import com.google.common.collect.Range; import java.math.BigDecimal; -import java.util.List; import java.util.Set; import org.junit.Test; import org.opendaylight.yangtools.yang.common.QName; @@ -23,7 +23,6 @@ import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.TypeUtils; public class TypedefConstraintsTest { @@ -43,8 +42,8 @@ public class TypedefConstraintsTest { assertNotNull(myDecimal); assertTrue(myDecimal instanceof DecimalTypeDefinition); - final List rangeConstraints = ((DecimalTypeDefinition) myDecimal) - .getRangeConstraints(); + final Set> rangeConstraints = ((DecimalTypeDefinition) myDecimal).getRangeConstraint() + .get().getAllowedRanges().asRanges(); assertNotNull(rangeConstraints); assertEquals(1, rangeConstraints.size()); @@ -60,13 +59,14 @@ public class TypedefConstraintsTest { assertTrue(type instanceof DecimalTypeDefinition); final DecimalTypeDefinition decType = (DecimalTypeDefinition) type; - final List decRangeConstraints = decType.getRangeConstraints(); + final Set> decRangeConstraints = decType.getRangeConstraint().get().getAllowedRanges() + .asRanges(); assertEquals(1, decRangeConstraints.size()); - final RangeConstraint range = decRangeConstraints.iterator().next(); - assertEquals(new BigDecimal(1.5), range.getMin()); - assertEquals(new BigDecimal(5.5), range.getMax()); + final Range range = decRangeConstraints.iterator().next(); + assertEquals(new BigDecimal(1.5), range.lowerEndpoint()); + assertEquals(new BigDecimal(5.5), range.upperEndpoint()); assertTrue(decType.getQName().getModule().equals(leafDecimal.getQName().getModule())); assertTrue(decType.getQName().getLocalName().equals(TypeUtils.DECIMAL64)); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserNegativeTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserNegativeTest.java index 0045648e91..6b03c4714c 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserNegativeTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserNegativeTest.java @@ -111,7 +111,7 @@ public class YangParserNegativeTest { TestUtils.loadModuleResources(getClass(), "/negative-scenario/testfile6.yang"); fail("ReactorException should be thrown"); } catch (final ReactorException e) { - assertTrue(e.getCause().getMessage().contains("Invalid range constraint: <5, 20>")); + assertTrue(e.getCause().getMessage().startsWith("Invalid range constraint: [[5..20]]")); } } diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserTest.java index 62616523e1..9fd68e5daa 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserTest.java @@ -176,40 +176,46 @@ public class YangParserTest { assertEquals(Optional.of("mile"), leafType.getUnits()); assertEquals(Optional.of("11"), leafType.getDefaultValue()); - final List ranges = leafType.getRangeConstraints(); + final RangeSet rangeset = leafType.getRangeConstraint().get().getAllowedRanges(); + final Set> ranges = rangeset.asRanges(); assertEquals(1, ranges.size()); - final RangeConstraint range = ranges.get(0); - assertEquals(12, range.getMin().intValue()); - assertEquals(20, range.getMax().intValue()); - - final IntegerTypeDefinition baseType = leafType.getBaseType(); - assertEquals(QName.create(BAR, "int32-ext2"), baseType.getQName()); - assertEquals(Optional.of("mile"), baseType.getUnits()); - assertEquals(Optional.of("11"), baseType.getDefaultValue()); - - final List baseTypeRanges = baseType.getRangeConstraints(); - assertEquals(2, baseTypeRanges.size()); - final RangeConstraint baseTypeRange1 = baseTypeRanges.get(0); - assertEquals(3, baseTypeRange1.getMin().intValue()); - assertEquals(9, baseTypeRange1.getMax().intValue()); - final RangeConstraint baseTypeRange2 = baseTypeRanges.get(1); - assertEquals(11, baseTypeRange2.getMin().intValue()); - assertEquals(20, baseTypeRange2.getMax().intValue()); - - final IntegerTypeDefinition base = baseType.getBaseType(); - final QName baseQName = base.getQName(); + + final Range range = ranges.iterator().next(); + assertEquals(12, range.lowerEndpoint().intValue()); + assertEquals(20, range.upperEndpoint().intValue()); + + final IntegerTypeDefinition firstBaseType = leafType.getBaseType(); + assertEquals(QName.create(BAR, "int32-ext2"), firstBaseType.getQName()); + assertEquals(Optional.of("mile"), firstBaseType.getUnits()); + assertEquals(Optional.of("11"), firstBaseType.getDefaultValue()); + + final RangeSet firstRangeset = firstBaseType.getRangeConstraint().get().getAllowedRanges(); + final Set> baseRanges = firstRangeset.asRanges(); + assertEquals(2, baseRanges.size()); + + final Iterator> it = baseRanges.iterator(); + final Range baseTypeRange1 = it.next(); + assertEquals(3, baseTypeRange1.lowerEndpoint().intValue()); + assertEquals(9, baseTypeRange1.upperEndpoint().intValue()); + final Range baseTypeRange2 = it.next(); + assertEquals(11, baseTypeRange2.lowerEndpoint().intValue()); + assertEquals(20, baseTypeRange2.upperEndpoint().intValue()); + + final IntegerTypeDefinition secondBaseType = firstBaseType.getBaseType(); + final QName baseQName = secondBaseType.getQName(); assertEquals("int32-ext1", baseQName.getLocalName()); assertEquals(BAR, baseQName.getModule()); - assertEquals(Optional.empty(), base.getUnits()); - assertEquals(Optional.empty(), base.getDefaultValue()); + assertEquals(Optional.empty(), secondBaseType.getUnits()); + assertEquals(Optional.empty(), secondBaseType.getDefaultValue()); - final List baseRanges = base.getRangeConstraints(); - assertEquals(1, baseRanges.size()); - final RangeConstraint baseRange = baseRanges.get(0); - assertEquals(2, baseRange.getMin().intValue()); - assertEquals(20, baseRange.getMax().intValue()); + final Set> secondRanges = secondBaseType.getRangeConstraint().get() + .getAllowedRanges().asRanges(); + assertEquals(1, secondRanges.size()); + final Range secondRange = secondRanges.iterator().next(); + assertEquals(2, secondRange.lowerEndpoint().intValue()); + assertEquals(20, secondRange.upperEndpoint().intValue()); - assertEquals(BaseTypes.int32Type(), base.getBaseType()); + assertEquals(BaseTypes.int32Type(), secondBaseType.getBaseType()); } @Test @@ -384,14 +390,14 @@ public class YangParserTest { assertEquals(Optional.empty(), type.getUnits()); assertEquals(Optional.empty(), type.getDefaultValue()); assertEquals(6, type.getFractionDigits().intValue()); - assertEquals(1, type.getRangeConstraints().size()); + assertEquals(1, type.getRangeConstraint().get().getAllowedRanges().asRanges().size()); final DecimalTypeDefinition typeBase = type.getBaseType(); assertEquals(QName.create(BAR, "decimal64"), typeBase.getQName()); assertEquals(Optional.empty(), typeBase.getUnits()); assertEquals(Optional.empty(), typeBase.getDefaultValue()); assertEquals(6, typeBase.getFractionDigits().intValue()); - assertEquals(1, typeBase.getRangeConstraints().size()); + assertEquals(1, typeBase.getRangeConstraint().get().getAllowedRanges().asRanges().size()); assertNull(typeBase.getBaseType()); } @@ -407,7 +413,7 @@ public class YangParserTest { assertEquals(Optional.empty(), type.getUnits()); assertEquals(Optional.empty(), type.getDefaultValue()); assertEquals(6, type.getFractionDigits().intValue()); - assertEquals(1, type.getRangeConstraints().size()); + assertEquals(1, type.getRangeConstraint().get().getAllowedRanges().asRanges().size()); final DecimalTypeDefinition baseTypeDecimal = type.getBaseType(); assertEquals(6, baseTypeDecimal.getFractionDigits().intValue()); @@ -438,11 +444,11 @@ public class YangParserTest { assertEquals(Optional.empty(), unionType1.getUnits()); assertEquals(Optional.empty(), unionType1.getDefaultValue()); - final List ranges = unionType1.getRangeConstraints(); - assertEquals(1, ranges.size()); - final RangeConstraint range = ranges.get(0); - assertEquals(1, range.getMin().intValue()); - assertEquals(100, range.getMax().intValue()); + final RangeConstraint ranges = unionType1.getRangeConstraint().get(); + assertEquals(1, ranges.getAllowedRanges().asRanges().size()); + final Range range = ranges.getAllowedRanges().span(); + assertEquals((short)1, range.lowerEndpoint()); + assertEquals((short)100, range.upperEndpoint()); assertEquals(BaseTypes.int16Type(), unionType1.getBaseType()); assertEquals(BaseTypes.int32Type(), unionTypes.get(1)); @@ -502,11 +508,12 @@ public class YangParserTest { assertEquals(QName.create(BAR, "int16"), int16Ext.getQName()); assertEquals(Optional.empty(), int16Ext.getUnits()); assertEquals(Optional.empty(), int16Ext.getDefaultValue()); - final List ranges = int16Ext.getRangeConstraints(); + final Set> ranges = int16Ext.getRangeConstraint().get().getAllowedRanges() + .asRanges(); assertEquals(1, ranges.size()); - final RangeConstraint range = ranges.get(0); - assertEquals(1, range.getMin().intValue()); - assertEquals(100, range.getMax().intValue()); + final Range range = ranges.iterator().next(); + assertEquals(1, range.lowerEndpoint().intValue()); + assertEquals(100, range.upperEndpoint().intValue()); assertEquals(BaseTypes.int16Type(), int16Ext.getBaseType()); } diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserWithContextTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserWithContextTest.java index 5da099328e..2f2da995fb 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserWithContextTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserWithContextTest.java @@ -14,6 +14,7 @@ import static org.junit.Assert.assertTrue; import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource; import com.google.common.collect.Iterables; +import com.google.common.collect.Range; import java.net.URI; import java.util.ArrayList; import java.util.Collection; @@ -41,7 +42,6 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.UsesNode; -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition; import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource; import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor; @@ -99,11 +99,11 @@ public class YangParserWithContextTest { final UnsignedIntegerTypeDefinition dscpExt = (UnsignedIntegerTypeDefinition) TestUtils.findTypedef( module.getTypeDefinitions(), "dscp-ext"); - final List ranges = dscpExt.getRangeConstraints(); + final Set> ranges = dscpExt.getRangeConstraint().get().getAllowedRanges().asRanges(); assertEquals(1, ranges.size()); - final RangeConstraint range = ranges.get(0); - assertEquals(0, range.getMin().intValue()); - assertEquals(63, range.getMax().intValue()); + final Range range = ranges.iterator().next(); + assertEquals((short)0, range.lowerEndpoint()); + assertEquals((short)63, range.upperEndpoint()); } @Test diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/test/Bug5200Test.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/test/Bug5200Test.java index f0ba129486..8ca82531e6 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/test/Bug5200Test.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/test/Bug5200Test.java @@ -67,10 +67,9 @@ public class Bug5200Test { assertEquals(Optional.of("pattern constraint error-app-tag"), patternConstraint.getErrorAppTag()); assertEquals(Optional.of("pattern constraint error-app-message"), patternConstraint.getErrorMessage()); - List rangeConstraints = ((IntegerTypeDefinition) myLeaf2Type).getRangeConstraints(); - assertEquals(1, rangeConstraints.size()); + RangeConstraint rangeConstraint = ((IntegerTypeDefinition) myLeaf2Type).getRangeConstraint().get(); + assertEquals(1, rangeConstraint.getAllowedRanges().asRanges().size()); - RangeConstraint rangeConstraint = rangeConstraints.iterator().next(); assertEquals(Optional.of("range constraint error-app-tag"), rangeConstraint.getErrorAppTag()); assertEquals(Optional.of("range constraint error-app-message"), rangeConstraint.getErrorMessage()); } -- 2.36.6