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