BUG-8043: correct RangeConstraint definition
[yangtools.git] / yang / yang-model-util / src / main / java / org / opendaylight / yangtools / yang / model / util / type / RestrictedTypes.java
index fe31615fcbf5fb04d42695701391fefe831c7ef7..1bba04d09ae1c11136c8500450ae37aaea1d1a80 100644 (file)
@@ -8,9 +8,8 @@
 package org.opendaylight.yangtools.yang.model.util.type;
 
 import com.google.common.annotations.Beta;
-import com.google.common.base.Preconditions;
-import java.util.List;
 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.type.BinaryTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
@@ -23,6 +22,7 @@ import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefi
 import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
+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.UnionTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition;
@@ -31,6 +31,7 @@ import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinit
  * Restricted types are a refinement of the restrictions applied to a particular type. YANG defines restrictions only
  * on a subset of the base types, but conceptually any such definition can hold unknown nodes.
  *
+ * <p>
  * 1) Restrictable
  *    binary (length)
  *    int{8,16,32,64} (range)
@@ -39,6 +40,7 @@ import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinit
  *    decimal64 (range)
  *    instance-identifier (require-instance)
  *
+ * <p>
  * 2) Non-restrictable
  *    boolean
  *    bits
@@ -48,11 +50,13 @@ import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinit
  *    leafref
  *    union
  *
+ * <p>
  * This class holds methods which allow creation of restricted types using {@link TypeBuilder} and its subclasses. Each
  * restricted type is logically anchored at a {@link SchemaPath}, but can be substituted by its base type if it does
  * not contribute any additional restrictions. TypeBuilder instances take this into account, and result in the base type
  * being returned from the builder when the base type and restricted type are semantically equal.
  *
+ * <p>
  * Restricted types inherit the default value, description, reference, status and units from the base type, if that type
  * defines them.
  */
@@ -62,39 +66,31 @@ public final class RestrictedTypes {
         throw new UnsupportedOperationException();
     }
 
-    public static LengthRestrictedTypeBuilder<BinaryTypeDefinition> newBinaryBuilder(@Nonnull final BinaryTypeDefinition baseType, @Nonnull final SchemaPath path) {
+    public static LengthRestrictedTypeBuilder<BinaryTypeDefinition> newBinaryBuilder(
+            @Nonnull final BinaryTypeDefinition baseType, @Nonnull final SchemaPath path) {
         return new LengthRestrictedTypeBuilder<BinaryTypeDefinition>(baseType, path) {
             @Override
-            BinaryTypeDefinition buildType(final List<LengthConstraint> lengthConstraints) {
-                return new RestrictedBinaryType(getBaseType(), getPath(), getUnknownSchemaNodes(), lengthConstraints);
+            BinaryTypeDefinition buildType(final @Nullable LengthConstraint lengthConstraint) {
+                return new RestrictedBinaryType(getBaseType(), getPath(), getUnknownSchemaNodes(), lengthConstraint);
             }
 
             @Override
-            List<LengthConstraint> typeLengthConstraints() {
+            LengthConstraint typeLengthConstraints() {
                 /**
-                 * Length constraint imposed on YANG binary type by our implementation. byte[].length is an integer, capping our
-                 * ability to support arbitrary binary data.
+                 * Length constraint imposed on YANG binary type by our implementation. byte[].length is an integer,
+                 * capping our ability to support arbitrary binary data.
                  */
                 return JavaLengthConstraints.INTEGER_SIZE_CONSTRAINTS;
             }
-
-            @Override
-            List<LengthConstraint> getLengthConstraints(final BinaryTypeDefinition type) {
-                return type.getLengthConstraints();
-            }
         };
     }
 
-    public static TypeBuilder<BitsTypeDefinition> newBitsBuilder(final BitsTypeDefinition baseType, final SchemaPath path) {
-        return new AbstractRestrictedTypeBuilder<BitsTypeDefinition>(baseType, path) {
-            @Override
-            BitsTypeDefinition buildType() {
-                return new RestrictedBitsType(getBaseType(), getPath(), getUnknownSchemaNodes());
-            }
-        };
+    public static BitsTypeBuilder newBitsBuilder(final BitsTypeDefinition baseType, final SchemaPath path) {
+        return new BitsTypeBuilder(baseType, path);
     }
 
-    public static TypeBuilder<BooleanTypeDefinition> newBooleanBuilder(@Nonnull final BooleanTypeDefinition baseType, @Nonnull final SchemaPath path) {
+    public static TypeBuilder<BooleanTypeDefinition> newBooleanBuilder(@Nonnull final BooleanTypeDefinition baseType,
+            @Nonnull final SchemaPath path) {
         return new AbstractRestrictedTypeBuilder<BooleanTypeDefinition>(baseType, path) {
             @Override
             BooleanTypeDefinition buildType() {
@@ -103,17 +99,18 @@ public final class RestrictedTypes {
         };
     }
 
-    public static RangeRestrictedTypeBuilder<DecimalTypeDefinition> newDecima64Builder(final DecimalTypeDefinition baseType, final SchemaPath path) {
-        return new RangeRestrictedTypeBuilder<DecimalTypeDefinition>(Preconditions.checkNotNull(baseType), path) {
+    public static RangeRestrictedTypeBuilder<DecimalTypeDefinition> newDecima64Builder(
+            final DecimalTypeDefinition baseType, final SchemaPath path) {
+        return new RangeRestrictedTypeBuilderWithBase<DecimalTypeDefinition>(baseType, path) {
             @Override
-            DecimalTypeDefinition buildType() {
-                return new RestrictedDecimalType(getBaseType(), getPath(), getUnknownSchemaNodes(),
-                    calculateRangeConstraints(getBaseType().getRangeConstraints()));
+            DecimalTypeDefinition buildType(final RangeConstraint<?> rangeConstraint) {
+                return new RestrictedDecimalType(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);
             }
         };
     }
 
-    public static TypeBuilder<EmptyTypeDefinition> newEmptyBuilder(final EmptyTypeDefinition baseType, final SchemaPath path) {
+    public static TypeBuilder<EmptyTypeDefinition> newEmptyBuilder(final EmptyTypeDefinition baseType,
+            final SchemaPath path) {
         return new AbstractRestrictedTypeBuilder<EmptyTypeDefinition>(baseType, path) {
             @Override
             EmptyTypeDefinition buildType() {
@@ -122,16 +119,13 @@ public final class RestrictedTypes {
         };
     }
 
-    public static TypeBuilder<EnumTypeDefinition> newEnumerationBuilder(final EnumTypeDefinition baseType, final SchemaPath path) {
-        return new AbstractRestrictedTypeBuilder<EnumTypeDefinition>(baseType, path) {
-            @Override
-            EnumTypeDefinition buildType() {
-                return new RestrictedEnumerationType(getBaseType(), getPath(), getUnknownSchemaNodes());
-            }
-        };
+    public static EnumerationTypeBuilder newEnumerationBuilder(final EnumTypeDefinition baseType,
+            final SchemaPath path) {
+        return new EnumerationTypeBuilder(baseType, path);
     }
 
-    public static TypeBuilder<IdentityrefTypeDefinition> newIdentityrefBuilder(final IdentityrefTypeDefinition baseType, final SchemaPath path) {
+    public static TypeBuilder<IdentityrefTypeDefinition> newIdentityrefBuilder(final IdentityrefTypeDefinition baseType,
+            final SchemaPath path) {
         return new AbstractRestrictedTypeBuilder<IdentityrefTypeDefinition>(baseType, path) {
             @Override
             IdentityrefTypeDefinition buildType() {
@@ -140,7 +134,8 @@ public final class RestrictedTypes {
         };
     }
 
-    public static InstanceIdentifierTypeBuilder newInstanceIdentifierBuilder(final InstanceIdentifierTypeDefinition baseType, final SchemaPath path) {
+    public static InstanceIdentifierTypeBuilder newInstanceIdentifierBuilder(
+            final InstanceIdentifierTypeDefinition baseType, final SchemaPath path) {
         return new InstanceIdentifierTypeBuilder(baseType, path);
     }
 
@@ -152,17 +147,18 @@ public final class RestrictedTypes {
                 if (getRequireInstance() == getBaseType().requireInstance()) {
                     return getBaseType();
                 }
-                return new RestrictedLeafrefType(getBaseType(), getPath(), getUnknownSchemaNodes(), getRequireInstance());
+                return new RestrictedLeafrefType(getBaseType(), getPath(), getUnknownSchemaNodes(),
+                        getRequireInstance());
             }
         };
     }
 
-    public static RangeRestrictedTypeBuilder<IntegerTypeDefinition> newIntegerBuilder(final IntegerTypeDefinition baseType, final SchemaPath path) {
-        return new RangeRestrictedTypeBuilder<IntegerTypeDefinition>(Preconditions.checkNotNull(baseType), path) {
+    public static RangeRestrictedTypeBuilder<IntegerTypeDefinition> newIntegerBuilder(
+            final IntegerTypeDefinition baseType, final SchemaPath path) {
+        return new RangeRestrictedTypeBuilderWithBase<IntegerTypeDefinition>(baseType, path) {
             @Override
-            IntegerTypeDefinition buildType() {
-                return new RestrictedIntegerType(getBaseType(), getPath(), getUnknownSchemaNodes(),
-                    calculateRangeConstraints(getBaseType().getRangeConstraints()));
+            IntegerTypeDefinition buildType(final RangeConstraint<?> rangeConstraint) {
+                return new RestrictedIntegerType(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);
             }
         };
     }
@@ -171,7 +167,8 @@ public final class RestrictedTypes {
         return new StringTypeBuilder(baseType, path);
     }
 
-    public static TypeBuilder<UnionTypeDefinition> newUnionBuilder(final UnionTypeDefinition baseType, final SchemaPath path) {
+    public static TypeBuilder<UnionTypeDefinition> newUnionBuilder(final UnionTypeDefinition baseType,
+            final SchemaPath path) {
         return new AbstractRestrictedTypeBuilder<UnionTypeDefinition>(baseType, path) {
             @Override
             UnionTypeDefinition buildType() {
@@ -180,12 +177,12 @@ public final class RestrictedTypes {
         };
     }
 
-    public static RangeRestrictedTypeBuilder<UnsignedIntegerTypeDefinition> newUnsignedBuilder(final UnsignedIntegerTypeDefinition baseType, final SchemaPath path) {
-        return new RangeRestrictedTypeBuilder<UnsignedIntegerTypeDefinition>(Preconditions.checkNotNull(baseType), path) {
+    public static RangeRestrictedTypeBuilder<UnsignedIntegerTypeDefinition> newUnsignedBuilder(
+            final UnsignedIntegerTypeDefinition baseType, final SchemaPath path) {
+        return new RangeRestrictedTypeBuilderWithBase<UnsignedIntegerTypeDefinition>(baseType, path) {
             @Override
-            UnsignedIntegerTypeDefinition buildType() {
-                return new RestrictedUnsignedType(getBaseType(), getPath(), getUnknownSchemaNodes(),
-                    calculateRangeConstraints(getBaseType().getRangeConstraints()));
+            UnsignedIntegerTypeDefinition buildType(final RangeConstraint<?> rangeConstraint) {
+                return new RestrictedUnsignedType(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);
             }
         };
     }