Make DecimalTypeDefinition.getFractionDigits() return int
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / EffectiveConstraintDefinitionImpl.java
1 /**
2  * Copyright (c) 2015 Cisco Systems, Inc. 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.parser.stmt.rfc6020.effective;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.collect.ImmutableSet;
13 import java.util.Optional;
14 import java.util.Set;
15 import org.opendaylight.yangtools.yang.data.util.ConstraintDefinitions;
16 import org.opendaylight.yangtools.yang.data.util.EmptyConstraintDefinition;
17 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
18 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
19 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
20
21 final class EffectiveConstraintDefinitionImpl implements ConstraintDefinition {
22     private static final String UNBOUNDED_STR = "unbounded";
23
24     private final RevisionAwareXPath whenCondition;
25     private final Set<MustDefinition> mustConstraints;
26     private final Integer minElements;
27     private final Integer maxElements;
28     private final boolean mandatory;
29
30     private EffectiveConstraintDefinitionImpl(final boolean mandatory, final Integer minElements,
31             final Integer maxElements, final RevisionAwareXPath whenCondition,
32             final Set<MustDefinition> mustConstraints) {
33         this.mandatory = mandatory;
34         this.minElements = minElements;
35         this.maxElements = maxElements;
36         this.whenCondition = whenCondition;
37         this.mustConstraints = requireNonNull(mustConstraints);
38     }
39
40     static ConstraintDefinition forParent(final EffectiveStatementBase<?, ?> parent) {
41         final MinElementsEffectiveStatementImpl firstMinElementsStmt = parent
42                 .firstEffective(MinElementsEffectiveStatementImpl.class);
43         final Integer minElements;
44         if (firstMinElementsStmt != null) {
45             final Integer m = firstMinElementsStmt.argument();
46             minElements = m > 0 ? m : null;
47         } else {
48             minElements = null;
49         }
50
51         final MaxElementsEffectiveStatementImpl firstMaxElementsStmt = parent
52                 .firstEffective(MaxElementsEffectiveStatementImpl.class);
53         final String maxElementsArg = firstMaxElementsStmt == null ? UNBOUNDED_STR : firstMaxElementsStmt.argument();
54         final Integer maxElements;
55         if (!UNBOUNDED_STR.equals(maxElementsArg)) {
56             final Integer m = Integer.valueOf(maxElementsArg);
57             maxElements = m < Integer.MAX_VALUE ? m : null;
58         } else {
59             maxElements = null;
60         }
61
62         final MandatoryEffectiveStatement firstMandatoryStmt = parent.firstEffective(MandatoryEffectiveStatement.class);
63         final boolean mandatory = firstMandatoryStmt == null ? minElements != null : firstMandatoryStmt.argument();
64
65         final Set<MustDefinition> mustSubstatements = ImmutableSet.copyOf(parent.allSubstatementsOfType(
66             MustDefinition.class));
67         final WhenEffectiveStatementImpl firstWhenStmt = parent.firstEffective(WhenEffectiveStatementImpl.class);
68
69         // Check for singleton instances
70         if (minElements == null && maxElements == null && mustSubstatements.isEmpty() && firstWhenStmt == null) {
71             return EmptyConstraintDefinition.create(mandatory);
72         }
73
74         return new EffectiveConstraintDefinitionImpl(mandatory, minElements, maxElements,
75             firstWhenStmt == null ? null : firstWhenStmt.argument(), mustSubstatements);
76     }
77
78     @Override
79     public Optional<RevisionAwareXPath> getWhenCondition() {
80         return Optional.ofNullable(whenCondition);
81     }
82
83     @Override
84     public Set<MustDefinition> getMustConstraints() {
85         return mustConstraints;
86     }
87
88     @Override
89     public boolean isMandatory() {
90         return mandatory;
91     }
92
93     @Override
94     public Integer getMinElements() {
95         return minElements;
96     }
97
98     @Override
99     public Integer getMaxElements() {
100         return maxElements;
101     }
102
103     @Override
104     public int hashCode() {
105         return ConstraintDefinitions.hashCode(this);
106     }
107
108     @Override
109     public boolean equals(final Object obj) {
110         return ConstraintDefinitions.equals(this, obj);
111     }
112
113     @Override
114     public String toString() {
115         return ConstraintDefinitions.toString(this);
116     }
117 }