BUG-8043: correct RangeConstraint definition
[yangtools.git] / yang / yang-model-util / src / main / java / org / opendaylight / yangtools / yang / model / util / type / BaseDecimalType.java
1 /*
2  * Copyright (c) 2015 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.model.util.type;
9
10 import static com.google.common.base.Verify.verifyNotNull;
11
12 import com.google.common.collect.ImmutableList;
13 import com.google.common.collect.ImmutableRangeSet;
14 import com.google.common.collect.Range;
15 import java.math.BigDecimal;
16 import java.util.List;
17 import java.util.Optional;
18 import javax.annotation.Nonnull;
19 import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition;
20 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
21 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
23 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
24
25 final class BaseDecimalType extends AbstractRangeRestrictedBaseType<DecimalTypeDefinition, BigDecimal>
26         implements DecimalTypeDefinition {
27     private static final ConstraintMetaDefinition BUILTIN_CONSTRAINT = new ConstraintMetaDefinition() {
28
29         @Override
30         public Optional<String> getReference() {
31             return Optional.of("https://tools.ietf.org/html/rfc6020#section-9.3.4");
32         }
33
34         @Override
35         public Optional<String> getDescription() {
36             return Optional.empty();
37         }
38
39         @Override
40         public Optional<String> getErrorMessage() {
41             return Optional.empty();
42         }
43
44         @Override
45         public Optional<String> getErrorAppTag() {
46             return Optional.empty();
47         }
48     };
49
50     private static final ImmutableList<RangeConstraint<BigDecimal>> IMPLICIT_RANGE_STATEMENTS = ImmutableList.of(
51         createRangeConstraint("-922337203685477580.8", "922337203685477580.7"),
52         createRangeConstraint("-92233720368547758.08", "92233720368547758.07"),
53         createRangeConstraint("-9223372036854775.808", "9223372036854775.807"),
54         createRangeConstraint("-922337203685477.5808", "922337203685477.5807"),
55         createRangeConstraint("-92233720368547.75808", "92233720368547.75807"),
56         createRangeConstraint("-9223372036854.775808", "9223372036854.775807"),
57         createRangeConstraint("-922337203685.4775808", "922337203685.4775807"),
58         createRangeConstraint("-92233720368.54775808", "92233720368.54775807"),
59         createRangeConstraint("-9223372036.854775808", "9223372036.854775807"),
60         createRangeConstraint("-922337203.6854775808", "922337203.6854775807"),
61         createRangeConstraint("-92233720.36854775808", "92233720.36854775807"),
62         createRangeConstraint("-9223372.036854775808", "9223372.036854775807"),
63         createRangeConstraint("-922337.2036854775808", "922337.2036854775807"),
64         createRangeConstraint("-92233.72036854775808", "92233.72036854775807"),
65         createRangeConstraint("-9223.372036854775808", "9223.372036854775807"),
66         createRangeConstraint("-922.3372036854775808", "922.3372036854775807"),
67         createRangeConstraint("-92.23372036854775808", "92.23372036854775807"),
68         createRangeConstraint("-9.223372036854775808", "9.223372036854775807"));
69
70     private static RangeConstraint<BigDecimal> createRangeConstraint(final String min, final String max) {
71         return new ResolvedRangeConstraint<>(BUILTIN_CONSTRAINT, ImmutableRangeSet.of(
72             Range.closed(new BigDecimal(min), new BigDecimal(max))));
73     }
74
75     static RangeConstraint<BigDecimal> constraintsForDigits(final int fractionDigits) {
76         return verifyNotNull(IMPLICIT_RANGE_STATEMENTS.get(fractionDigits - 1));
77     }
78
79     private final Integer fractionDigits;
80
81     BaseDecimalType(final SchemaPath path, final List<UnknownSchemaNode> unknownSchemaNodes,
82             final Integer fractionDigits, final RangeConstraint<BigDecimal> rangeConstraint) {
83         super(path, unknownSchemaNodes, rangeConstraint);
84         this.fractionDigits = fractionDigits;
85     }
86
87     @Nonnull
88     @Override
89     public Integer getFractionDigits() {
90         return fractionDigits;
91     }
92
93     @Override
94     public int hashCode() {
95         return TypeDefinitions.hashCode(this);
96     }
97
98     @Override
99     public boolean equals(final Object obj) {
100         return TypeDefinitions.equals(this, obj);
101     }
102
103     @Override
104     public String toString() {
105         return TypeDefinitions.toString(this);
106     }
107 }