/*
* Copyright (c) 2015 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.ri.type;
import com.google.common.annotations.Beta;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.yangtools.yang.common.Decimal64;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.Uint16;
import org.opendaylight.yangtools.yang.common.Uint32;
import org.opendaylight.yangtools.yang.common.Uint64;
import org.opendaylight.yangtools.yang.common.Uint8;
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;
import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
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.Int16TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.Int32TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.Int64TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.Int8TypeDefinition;
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.Uint16TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.Uint64TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.Uint8TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
/**
* 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.
*
*
* 1) Restrictable
* binary (length)
* int{8,16,32,64} (range)
* string (length, patterns)
* uint{8,16,32,64} (range)
* decimal64 (range)
* instance-identifier (require-instance)
*
*
* 2) Non-restrictable
* boolean
* bits
* empty (ignores default on derivation)
* enumeration
* identityref
* leafref
* union
*
*
* 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.
*
*
* Restricted types inherit the default value, description, reference, status and units from the base type, if that type
* defines them.
*/
@Beta
public final class RestrictedTypes {
private RestrictedTypes() {
// Hidden on purpose
}
public static @NonNull LengthRestrictedTypeBuilder newBinaryBuilder(
final @NonNull BinaryTypeDefinition baseType, final @NonNull QName qname) {
return new LengthRestrictedTypeBuilder<>(baseType, qname) {
@Override
BinaryTypeDefinition buildType(final @Nullable LengthConstraint constraint) {
return new RestrictedBinaryType(getBaseType(), getQName(), getUnknownSchemaNodes(), constraint);
}
@Override
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;
}
};
}
public static @NonNull BitsTypeBuilder newBitsBuilder(final BitsTypeDefinition baseType, final QName qname) {
return new BitsTypeBuilder(baseType, qname);
}
public static @NonNull TypeBuilder newBooleanBuilder(
final @NonNull BooleanTypeDefinition baseType, final @NonNull QName qname) {
return new AbstractRestrictedTypeBuilder<>(baseType, qname) {
@Override
BooleanTypeDefinition buildType() {
return new RestrictedBooleanType(getBaseType(), getQName(), getUnknownSchemaNodes());
}
};
}
public static @NonNull RangeRestrictedTypeBuilder newDecima64Builder(
final DecimalTypeDefinition baseType, final QName qname) {
return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
@Override
DecimalTypeDefinition buildType(final RangeConstraint<@NonNull Decimal64> rangeConstraint) {
return new RestrictedDecimalType(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
}
};
}
public static @NonNull TypeBuilder newEmptyBuilder(final EmptyTypeDefinition baseType,
final QName qname) {
return new AbstractRestrictedTypeBuilder<>(baseType, qname) {
@Override
EmptyTypeDefinition buildType() {
return new RestrictedEmptyType(getBaseType(), getQName(), getUnknownSchemaNodes());
}
};
}
public static @NonNull EnumerationTypeBuilder newEnumerationBuilder(final EnumTypeDefinition baseType,
final QName qname) {
return new EnumerationTypeBuilder(baseType, qname);
}
public static @NonNull TypeBuilder newIdentityrefBuilder(
final IdentityrefTypeDefinition baseType, final QName qname) {
return new AbstractRestrictedTypeBuilder<>(baseType, qname) {
@Override
IdentityrefTypeDefinition buildType() {
return new RestrictedIdentityrefType(getBaseType(), getQName(), getUnknownSchemaNodes());
}
};
}
public static @NonNull InstanceIdentifierTypeBuilder newInstanceIdentifierBuilder(
final InstanceIdentifierTypeDefinition baseType, final QName qname) {
return new InstanceIdentifierTypeBuilder(baseType, qname);
}
public static @NonNull RequireInstanceRestrictedTypeBuilder newLeafrefBuilder(
final LeafrefTypeDefinition baseType, final QName qname) {
return new RequireInstanceRestrictedTypeBuilder<>(baseType, qname) {
@Override
LeafrefTypeDefinition buildType() {
final LeafrefTypeDefinition base = getBaseType();
if (getRequireInstance() == base.requireInstance()) {
return base;
}
return new RestrictedLeafrefType(getBaseType(), getQName(), getUnknownSchemaNodes(),
getRequireInstance());
}
};
}
public static @NonNull RangeRestrictedTypeBuilder newInt8Builder(
final Int8TypeDefinition baseType, final QName qname) {
return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
@Override
Int8TypeDefinition buildType(final RangeConstraint rangeConstraint) {
return new RestrictedInt8Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
}
};
}
public static @NonNull RangeRestrictedTypeBuilder newInt16Builder(
final Int16TypeDefinition baseType, final QName qname) {
return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
@Override
Int16TypeDefinition buildType(final RangeConstraint rangeConstraint) {
return new RestrictedInt16Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
}
};
}
public static @NonNull RangeRestrictedTypeBuilder newInt32Builder(
final Int32TypeDefinition baseType, final QName qname) {
return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
@Override
Int32TypeDefinition buildType(final RangeConstraint rangeConstraint) {
return new RestrictedInt32Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
}
};
}
public static @NonNull RangeRestrictedTypeBuilder newInt64Builder(
final Int64TypeDefinition baseType, final QName qname) {
return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
@Override
Int64TypeDefinition buildType(final RangeConstraint rangeConstraint) {
return new RestrictedInt64Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
}
};
}
public static @NonNull StringTypeBuilder newStringBuilder(final StringTypeDefinition baseType, final QName qname) {
return new StringTypeBuilder(baseType, qname);
}
public static @NonNull TypeBuilder newUnionBuilder(final UnionTypeDefinition baseType,
final QName qname) {
return new AbstractRestrictedTypeBuilder<>(baseType, qname) {
@Override
UnionTypeDefinition buildType() {
return new RestrictedUnionType(getBaseType(), getQName(), getUnknownSchemaNodes());
}
};
}
public static @NonNull RangeRestrictedTypeBuilder newUint8Builder(
final Uint8TypeDefinition baseType, final QName qname) {
return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
@Override
Uint8TypeDefinition buildType(final RangeConstraint<@NonNull Uint8> rangeConstraint) {
return new RestrictedUint8Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
}
};
}
public static @NonNull RangeRestrictedTypeBuilder newUint16Builder(
final Uint16TypeDefinition baseType, final QName qname) {
return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
@Override
Uint16TypeDefinition buildType(final RangeConstraint<@NonNull Uint16> rangeConstraint) {
return new RestrictedUint16Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
}
};
}
public static @NonNull RangeRestrictedTypeBuilder newUint32Builder(
final Uint32TypeDefinition baseType, final QName qname) {
return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
@Override
Uint32TypeDefinition buildType(final RangeConstraint<@NonNull Uint32> rangeConstraint) {
return new RestrictedUint32Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
}
};
}
public static @NonNull RangeRestrictedTypeBuilder newUint64Builder(
final Uint64TypeDefinition baseType, final QName qname) {
return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
@Override
Uint64TypeDefinition buildType(final RangeConstraint<@NonNull Uint64> rangeConstraint) {
return new RestrictedUint64Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
}
};
}
}