BUG-4268: clarify length constraint API contract
[yangtools.git] / yang / yang-model-util / src / main / java / org / opendaylight / yangtools / yang / model / util / type / RestrictedTypes.java
index 1c238fe677ebb193b654aa61cb0b3182ab7a81ad..2a04f7950347accc19806d392b9dd77e8984b5ad 100644 (file)
@@ -8,6 +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.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
@@ -20,6 +22,7 @@ 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.LeafrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
 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;
@@ -62,9 +65,22 @@ public final class RestrictedTypes {
     public static LengthRestrictedTypeBuilder<BinaryTypeDefinition> newBinaryBuilder(@Nonnull final BinaryTypeDefinition baseType, @Nonnull final SchemaPath path) {
         return new LengthRestrictedTypeBuilder<BinaryTypeDefinition>(baseType, path) {
             @Override
-            BinaryTypeDefinition buildType() {
-                return new RestrictedBinaryType(getBaseType(), getPath(), getUnknownSchemaNodes(),
-                    calculateLenghtConstraints(getBaseType().getLengthConstraints()));
+            BinaryTypeDefinition buildType(final List<LengthConstraint> lengthConstraints) {
+                return new RestrictedBinaryType(getBaseType(), getPath(), getUnknownSchemaNodes(), lengthConstraints);
+            }
+
+            @Override
+            List<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.
+                 */
+                return JavaLengthConstraints.INTEGER_SIZE_CONSTRAINTS;
+            }
+
+            @Override
+            List<LengthConstraint> getLengthConstraints(final BinaryTypeDefinition type) {
+                return type.getLengthConstraints();
             }
         };
     }
@@ -88,7 +104,7 @@ public final class RestrictedTypes {
     }
 
     public static RangeRestrictedTypeBuilder<DecimalTypeDefinition> newDecima64Builder(final DecimalTypeDefinition baseType, final SchemaPath path) {
-        return new RangeRestrictedTypeBuilder<DecimalTypeDefinition>(baseType, path) {
+        return new RangeRestrictedTypeBuilder<DecimalTypeDefinition>(Preconditions.checkNotNull(baseType), path) {
             @Override
             DecimalTypeDefinition buildType() {
                 return new RestrictedDecimalType(getBaseType(), getPath(), getUnknownSchemaNodes(),
@@ -138,7 +154,7 @@ public final class RestrictedTypes {
     }
 
     public static RangeRestrictedTypeBuilder<IntegerTypeDefinition> newIntegerBuilder(final IntegerTypeDefinition baseType, final SchemaPath path) {
-        return new RangeRestrictedTypeBuilder<IntegerTypeDefinition>(baseType, path) {
+        return new RangeRestrictedTypeBuilder<IntegerTypeDefinition>(Preconditions.checkNotNull(baseType), path) {
             @Override
             IntegerTypeDefinition buildType() {
                 return new RestrictedIntegerType(getBaseType(), getPath(), getUnknownSchemaNodes(),
@@ -161,7 +177,7 @@ public final class RestrictedTypes {
     }
 
     public static RangeRestrictedTypeBuilder<UnsignedIntegerTypeDefinition> newUnsignedBuilder(final UnsignedIntegerTypeDefinition baseType, final SchemaPath path) {
-        return new RangeRestrictedTypeBuilder<UnsignedIntegerTypeDefinition>(baseType, path) {
+        return new RangeRestrictedTypeBuilder<UnsignedIntegerTypeDefinition>(Preconditions.checkNotNull(baseType), path) {
             @Override
             UnsignedIntegerTypeDefinition buildType() {
                 return new RestrictedUnsignedType(getBaseType(), getPath(), getUnknownSchemaNodes(),