2 * Copyright (c) 2015 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.model.ri.type;
10 import com.google.common.annotations.Beta;
11 import org.eclipse.jdt.annotation.NonNull;
12 import org.eclipse.jdt.annotation.Nullable;
13 import org.opendaylight.yangtools.yang.common.Decimal64;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.common.Uint16;
16 import org.opendaylight.yangtools.yang.common.Uint32;
17 import org.opendaylight.yangtools.yang.common.Uint64;
18 import org.opendaylight.yangtools.yang.common.Uint8;
19 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
20 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
21 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
22 import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
23 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
24 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
25 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
26 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
27 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
28 import org.opendaylight.yangtools.yang.model.api.type.Int16TypeDefinition;
29 import org.opendaylight.yangtools.yang.model.api.type.Int32TypeDefinition;
30 import org.opendaylight.yangtools.yang.model.api.type.Int64TypeDefinition;
31 import org.opendaylight.yangtools.yang.model.api.type.Int8TypeDefinition;
32 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
33 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
34 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
35 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
36 import org.opendaylight.yangtools.yang.model.api.type.Uint16TypeDefinition;
37 import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition;
38 import org.opendaylight.yangtools.yang.model.api.type.Uint64TypeDefinition;
39 import org.opendaylight.yangtools.yang.model.api.type.Uint8TypeDefinition;
40 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
43 * Restricted types are a refinement of the restrictions applied to a particular type. YANG defines restrictions only
44 * on a subset of the base types, but conceptually any such definition can hold unknown nodes.
49 * int{8,16,32,64} (range)
50 * string (length, patterns)
51 * uint{8,16,32,64} (range)
53 * instance-identifier (require-instance)
59 * empty (ignores default on derivation)
66 * This class holds methods which allow creation of restricted types using {@link TypeBuilder} and its subclasses. Each
67 * restricted type is logically anchored at a {@link SchemaPath}, but can be substituted by its base type if it does
68 * not contribute any additional restrictions. TypeBuilder instances take this into account, and result in the base type
69 * being returned from the builder when the base type and restricted type are semantically equal.
72 * Restricted types inherit the default value, description, reference, status and units from the base type, if that type
76 public final class RestrictedTypes {
77 private RestrictedTypes() {
81 public static @NonNull LengthRestrictedTypeBuilder<BinaryTypeDefinition> newBinaryBuilder(
82 final @NonNull BinaryTypeDefinition baseType, final @NonNull QName qname) {
83 return new LengthRestrictedTypeBuilder<>(baseType, qname) {
85 BinaryTypeDefinition buildType(final @Nullable LengthConstraint constraint) {
86 return new RestrictedBinaryType(getBaseType(), getQName(), getUnknownSchemaNodes(), constraint);
90 LengthConstraint typeLengthConstraints() {
92 * Length constraint imposed on YANG binary type by our implementation. byte[].length is an integer,
93 * capping our ability to support arbitrary binary data.
95 return JavaLengthConstraints.INTEGER_SIZE_CONSTRAINTS;
100 public static @NonNull BitsTypeBuilder newBitsBuilder(final BitsTypeDefinition baseType, final QName qname) {
101 return new BitsTypeBuilder(baseType, qname);
104 public static @NonNull TypeBuilder<BooleanTypeDefinition> newBooleanBuilder(
105 final @NonNull BooleanTypeDefinition baseType, final @NonNull QName qname) {
106 return new AbstractRestrictedTypeBuilder<>(baseType, qname) {
108 BooleanTypeDefinition buildType() {
109 return new RestrictedBooleanType(getBaseType(), getQName(), getUnknownSchemaNodes());
114 public static @NonNull RangeRestrictedTypeBuilder<DecimalTypeDefinition, Decimal64> newDecima64Builder(
115 final DecimalTypeDefinition baseType, final QName qname) {
116 return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
118 DecimalTypeDefinition buildType(final RangeConstraint<@NonNull Decimal64> rangeConstraint) {
119 return new RestrictedDecimalType(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
124 public static @NonNull TypeBuilder<EmptyTypeDefinition> newEmptyBuilder(final EmptyTypeDefinition baseType,
126 return new AbstractRestrictedTypeBuilder<>(baseType, qname) {
128 EmptyTypeDefinition buildType() {
129 return new RestrictedEmptyType(getBaseType(), getQName(), getUnknownSchemaNodes());
134 public static @NonNull EnumerationTypeBuilder newEnumerationBuilder(final EnumTypeDefinition baseType,
136 return new EnumerationTypeBuilder(baseType, qname);
139 public static @NonNull TypeBuilder<IdentityrefTypeDefinition> newIdentityrefBuilder(
140 final IdentityrefTypeDefinition baseType, final QName qname) {
141 return new AbstractRestrictedTypeBuilder<>(baseType, qname) {
143 IdentityrefTypeDefinition buildType() {
144 return new RestrictedIdentityrefType(getBaseType(), getQName(), getUnknownSchemaNodes());
149 public static @NonNull InstanceIdentifierTypeBuilder newInstanceIdentifierBuilder(
150 final InstanceIdentifierTypeDefinition baseType, final QName qname) {
151 return new InstanceIdentifierTypeBuilder(baseType, qname);
154 public static @NonNull RequireInstanceRestrictedTypeBuilder<LeafrefTypeDefinition> newLeafrefBuilder(
155 final LeafrefTypeDefinition baseType, final QName qname) {
156 return new RequireInstanceRestrictedTypeBuilder<>(baseType, qname) {
158 LeafrefTypeDefinition buildType() {
159 final LeafrefTypeDefinition base = getBaseType();
160 if (getRequireInstance() == base.requireInstance()) {
163 return new RestrictedLeafrefType(getBaseType(), getQName(), getUnknownSchemaNodes(),
164 getRequireInstance());
169 public static @NonNull RangeRestrictedTypeBuilder<Int8TypeDefinition, Byte> newInt8Builder(
170 final Int8TypeDefinition baseType, final QName qname) {
171 return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
173 Int8TypeDefinition buildType(final RangeConstraint<Byte> rangeConstraint) {
174 return new RestrictedInt8Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
179 public static @NonNull RangeRestrictedTypeBuilder<Int16TypeDefinition, Short> newInt16Builder(
180 final Int16TypeDefinition baseType, final QName qname) {
181 return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
183 Int16TypeDefinition buildType(final RangeConstraint<Short> rangeConstraint) {
184 return new RestrictedInt16Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
189 public static @NonNull RangeRestrictedTypeBuilder<Int32TypeDefinition, Integer> newInt32Builder(
190 final Int32TypeDefinition baseType, final QName qname) {
191 return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
193 Int32TypeDefinition buildType(final RangeConstraint<Integer> rangeConstraint) {
194 return new RestrictedInt32Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
199 public static @NonNull RangeRestrictedTypeBuilder<Int64TypeDefinition, Long> newInt64Builder(
200 final Int64TypeDefinition baseType, final QName qname) {
201 return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
203 Int64TypeDefinition buildType(final RangeConstraint<Long> rangeConstraint) {
204 return new RestrictedInt64Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
209 public static @NonNull StringTypeBuilder newStringBuilder(final StringTypeDefinition baseType, final QName qname) {
210 return new StringTypeBuilder(baseType, qname);
213 public static @NonNull TypeBuilder<UnionTypeDefinition> newUnionBuilder(final UnionTypeDefinition baseType,
215 return new AbstractRestrictedTypeBuilder<>(baseType, qname) {
217 UnionTypeDefinition buildType() {
218 return new RestrictedUnionType(getBaseType(), getQName(), getUnknownSchemaNodes());
223 public static @NonNull RangeRestrictedTypeBuilder<Uint8TypeDefinition, Uint8> newUint8Builder(
224 final Uint8TypeDefinition baseType, final QName qname) {
225 return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
227 Uint8TypeDefinition buildType(final RangeConstraint<@NonNull Uint8> rangeConstraint) {
228 return new RestrictedUint8Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
233 public static @NonNull RangeRestrictedTypeBuilder<Uint16TypeDefinition, Uint16> newUint16Builder(
234 final Uint16TypeDefinition baseType, final QName qname) {
235 return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
237 Uint16TypeDefinition buildType(final RangeConstraint<@NonNull Uint16> rangeConstraint) {
238 return new RestrictedUint16Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
243 public static @NonNull RangeRestrictedTypeBuilder<Uint32TypeDefinition, Uint32> newUint32Builder(
244 final Uint32TypeDefinition baseType, final QName qname) {
245 return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
247 Uint32TypeDefinition buildType(final RangeConstraint<@NonNull Uint32> rangeConstraint) {
248 return new RestrictedUint32Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);
253 public static @NonNull RangeRestrictedTypeBuilder<Uint64TypeDefinition, Uint64> newUint64Builder(
254 final Uint64TypeDefinition baseType, final QName qname) {
255 return new RangeRestrictedTypeBuilderWithBase<>(baseType, qname) {
257 Uint64TypeDefinition buildType(final RangeConstraint<@NonNull Uint64> rangeConstraint) {
258 return new RestrictedUint64Type(getBaseType(), getQName(), getUnknownSchemaNodes(), rangeConstraint);