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.util.type;
10 import com.google.common.annotations.Beta;
11 import java.math.BigDecimal;
12 import java.math.BigInteger;
13 import javax.annotation.Nonnull;
14 import org.eclipse.jdt.annotation.Nullable;
15 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
16 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
17 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
18 import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
19 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
20 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
21 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
22 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
23 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
24 import org.opendaylight.yangtools.yang.model.api.type.Int16TypeDefinition;
25 import org.opendaylight.yangtools.yang.model.api.type.Int32TypeDefinition;
26 import org.opendaylight.yangtools.yang.model.api.type.Int64TypeDefinition;
27 import org.opendaylight.yangtools.yang.model.api.type.Int8TypeDefinition;
28 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
29 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
30 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
31 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
32 import org.opendaylight.yangtools.yang.model.api.type.Uint16TypeDefinition;
33 import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition;
34 import org.opendaylight.yangtools.yang.model.api.type.Uint64TypeDefinition;
35 import org.opendaylight.yangtools.yang.model.api.type.Uint8TypeDefinition;
36 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
39 * Restricted types are a refinement of the restrictions applied to a particular type. YANG defines restrictions only
40 * on a subset of the base types, but conceptually any such definition can hold unknown nodes.
45 * int{8,16,32,64} (range)
46 * string (length, patterns)
47 * uint{8,16,32,64} (range)
49 * instance-identifier (require-instance)
55 * empty (ignores default on derivation)
62 * This class holds methods which allow creation of restricted types using {@link TypeBuilder} and its subclasses. Each
63 * restricted type is logically anchored at a {@link SchemaPath}, but can be substituted by its base type if it does
64 * not contribute any additional restrictions. TypeBuilder instances take this into account, and result in the base type
65 * being returned from the builder when the base type and restricted type are semantically equal.
68 * Restricted types inherit the default value, description, reference, status and units from the base type, if that type
72 public final class RestrictedTypes {
73 private RestrictedTypes() {
74 throw new UnsupportedOperationException();
77 public static LengthRestrictedTypeBuilder<BinaryTypeDefinition> newBinaryBuilder(
78 @Nonnull final BinaryTypeDefinition baseType, @Nonnull final SchemaPath path) {
79 return new LengthRestrictedTypeBuilder<BinaryTypeDefinition>(baseType, path) {
81 BinaryTypeDefinition buildType(final @Nullable LengthConstraint constraint) {
82 return new RestrictedBinaryType(getBaseType(), getPath(), getUnknownSchemaNodes(), constraint);
86 LengthConstraint typeLengthConstraints() {
88 * Length constraint imposed on YANG binary type by our implementation. byte[].length is an integer,
89 * capping our ability to support arbitrary binary data.
91 return JavaLengthConstraints.INTEGER_SIZE_CONSTRAINTS;
96 public static BitsTypeBuilder newBitsBuilder(final BitsTypeDefinition baseType, final SchemaPath path) {
97 return new BitsTypeBuilder(baseType, path);
100 public static TypeBuilder<BooleanTypeDefinition> newBooleanBuilder(@Nonnull final BooleanTypeDefinition baseType,
101 @Nonnull final SchemaPath path) {
102 return new AbstractRestrictedTypeBuilder<BooleanTypeDefinition>(baseType, path) {
104 BooleanTypeDefinition buildType() {
105 return new RestrictedBooleanType(getBaseType(), getPath(), getUnknownSchemaNodes());
110 public static RangeRestrictedTypeBuilder<DecimalTypeDefinition, BigDecimal> newDecima64Builder(
111 final DecimalTypeDefinition baseType, final SchemaPath path) {
112 return new RangeRestrictedTypeBuilderWithBase<DecimalTypeDefinition, BigDecimal>(baseType, path) {
114 DecimalTypeDefinition buildType(final RangeConstraint<BigDecimal> rangeConstraint) {
115 return new RestrictedDecimalType(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);
120 public static TypeBuilder<EmptyTypeDefinition> newEmptyBuilder(final EmptyTypeDefinition baseType,
121 final SchemaPath path) {
122 return new AbstractRestrictedTypeBuilder<EmptyTypeDefinition>(baseType, path) {
124 EmptyTypeDefinition buildType() {
125 return new RestrictedEmptyType(getBaseType(), getPath(), getUnknownSchemaNodes());
130 public static EnumerationTypeBuilder newEnumerationBuilder(final EnumTypeDefinition baseType,
131 final SchemaPath path) {
132 return new EnumerationTypeBuilder(baseType, path);
135 public static TypeBuilder<IdentityrefTypeDefinition> newIdentityrefBuilder(final IdentityrefTypeDefinition baseType,
136 final SchemaPath path) {
137 return new AbstractRestrictedTypeBuilder<IdentityrefTypeDefinition>(baseType, path) {
139 IdentityrefTypeDefinition buildType() {
140 return new RestrictedIdentityrefType(getBaseType(), getPath(), getUnknownSchemaNodes());
145 public static InstanceIdentifierTypeBuilder newInstanceIdentifierBuilder(
146 final InstanceIdentifierTypeDefinition baseType, final SchemaPath path) {
147 return new InstanceIdentifierTypeBuilder(baseType, path);
150 public static RequireInstanceRestrictedTypeBuilder<LeafrefTypeDefinition> newLeafrefBuilder(
151 final LeafrefTypeDefinition baseType, final SchemaPath path) {
152 return new RequireInstanceRestrictedTypeBuilder<LeafrefTypeDefinition>(baseType, path) {
154 LeafrefTypeDefinition buildType() {
155 if (getRequireInstance() == getBaseType().requireInstance()) {
156 return getBaseType();
158 return new RestrictedLeafrefType(getBaseType(), getPath(), getUnknownSchemaNodes(),
159 getRequireInstance());
164 public static RangeRestrictedTypeBuilder<Int8TypeDefinition, Byte> newInt8Builder(
165 final Int8TypeDefinition baseType, final SchemaPath path) {
166 return new RangeRestrictedTypeBuilderWithBase<Int8TypeDefinition, Byte>(baseType, path) {
168 Int8TypeDefinition buildType(final RangeConstraint<Byte> rangeConstraint) {
169 return new RestrictedInt8Type(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);
174 public static RangeRestrictedTypeBuilder<Int16TypeDefinition, Short> newInt16Builder(
175 final Int16TypeDefinition baseType, final SchemaPath path) {
176 return new RangeRestrictedTypeBuilderWithBase<Int16TypeDefinition, Short>(baseType, path) {
178 Int16TypeDefinition buildType(final RangeConstraint<Short> rangeConstraint) {
179 return new RestrictedInt16Type(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);
184 public static RangeRestrictedTypeBuilder<Int32TypeDefinition, Integer> newInt32Builder(
185 final Int32TypeDefinition baseType, final SchemaPath path) {
186 return new RangeRestrictedTypeBuilderWithBase<Int32TypeDefinition, Integer>(baseType, path) {
188 Int32TypeDefinition buildType(final RangeConstraint<Integer> rangeConstraint) {
189 return new RestrictedInt32Type(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);
194 public static RangeRestrictedTypeBuilder<Int64TypeDefinition, Long> newInt64Builder(
195 final Int64TypeDefinition baseType, final SchemaPath path) {
196 return new RangeRestrictedTypeBuilderWithBase<Int64TypeDefinition, Long>(baseType, path) {
198 Int64TypeDefinition buildType(final RangeConstraint<Long> rangeConstraint) {
199 return new RestrictedInt64Type(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);
204 public static StringTypeBuilder newStringBuilder(final StringTypeDefinition baseType, final SchemaPath path) {
205 return new StringTypeBuilder(baseType, path);
208 public static TypeBuilder<UnionTypeDefinition> newUnionBuilder(final UnionTypeDefinition baseType,
209 final SchemaPath path) {
210 return new AbstractRestrictedTypeBuilder<UnionTypeDefinition>(baseType, path) {
212 UnionTypeDefinition buildType() {
213 return new RestrictedUnionType(getBaseType(), getPath(), getUnknownSchemaNodes());
218 public static RangeRestrictedTypeBuilder<Uint8TypeDefinition, Short> newUint8Builder(
219 final Uint8TypeDefinition baseType, final SchemaPath path) {
220 return new RangeRestrictedTypeBuilderWithBase<Uint8TypeDefinition, Short>(baseType, path) {
222 Uint8TypeDefinition buildType(final RangeConstraint<Short> rangeConstraint) {
223 return new RestrictedUint8Type(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);
228 public static RangeRestrictedTypeBuilder<Uint16TypeDefinition, Integer> newUint16Builder(
229 final Uint16TypeDefinition baseType, final SchemaPath path) {
230 return new RangeRestrictedTypeBuilderWithBase<Uint16TypeDefinition, Integer>(baseType, path) {
232 Uint16TypeDefinition buildType(final RangeConstraint<Integer> rangeConstraint) {
233 return new RestrictedUint16Type(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);
238 public static RangeRestrictedTypeBuilder<Uint32TypeDefinition, Long> newUint32Builder(
239 final Uint32TypeDefinition baseType, final SchemaPath path) {
240 return new RangeRestrictedTypeBuilderWithBase<Uint32TypeDefinition, Long>(baseType, path) {
242 Uint32TypeDefinition buildType(final RangeConstraint<Long> rangeConstraint) {
243 return new RestrictedUint32Type(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);
248 public static RangeRestrictedTypeBuilder<Uint64TypeDefinition, BigInteger> newUint64Builder(
249 final Uint64TypeDefinition baseType, final SchemaPath path) {
250 return new RangeRestrictedTypeBuilderWithBase<Uint64TypeDefinition, BigInteger>(baseType, path) {
252 Uint64TypeDefinition buildType(final RangeConstraint<BigInteger> rangeConstraint) {
253 return new RestrictedUint64Type(getBaseType(), getPath(), getUnknownSchemaNodes(), rangeConstraint);