YANGTOOLS-706: reorganize statement definitions
[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 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsEffectiveStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement;
23 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementBase;
24
25 final class EffectiveConstraintDefinitionImpl implements ConstraintDefinition {
26     private static final String UNBOUNDED_STR = "unbounded";
27
28     private final RevisionAwareXPath whenCondition;
29     private final Set<MustDefinition> mustConstraints;
30     private final Integer minElements;
31     private final Integer maxElements;
32
33     private EffectiveConstraintDefinitionImpl(final Integer minElements, final Integer maxElements,
34             final RevisionAwareXPath whenCondition, final Set<MustDefinition> mustConstraints) {
35         this.minElements = minElements;
36         this.maxElements = maxElements;
37         this.whenCondition = whenCondition;
38         this.mustConstraints = requireNonNull(mustConstraints);
39     }
40
41     static ConstraintDefinition forParent(final EffectiveStatementBase<?, ?> parent) {
42         final MinElementsEffectiveStatement firstMinElementsStmt = parent
43                 .firstEffective(MinElementsEffectiveStatement.class);
44         final Integer minElements;
45         if (firstMinElementsStmt != null) {
46             final Integer m = firstMinElementsStmt.argument();
47             minElements = m > 0 ? m : null;
48         } else {
49             minElements = null;
50         }
51
52         final MaxElementsEffectiveStatement firstMaxElementsStmt = parent
53                 .firstEffective(MaxElementsEffectiveStatement.class);
54         final String maxElementsArg = firstMaxElementsStmt == null ? UNBOUNDED_STR : firstMaxElementsStmt.argument();
55         final Integer maxElements;
56         if (!UNBOUNDED_STR.equals(maxElementsArg)) {
57             final Integer m = Integer.valueOf(maxElementsArg);
58             maxElements = m < Integer.MAX_VALUE ? m : null;
59         } else {
60             maxElements = null;
61         }
62
63         final Set<MustDefinition> mustSubstatements = ImmutableSet.copyOf(parent.allSubstatementsOfType(
64             MustDefinition.class));
65         final WhenEffectiveStatement firstWhenStmt = parent.firstEffective(WhenEffectiveStatement.class);
66
67         // Check for singleton instances
68         if (minElements == null && maxElements == null && mustSubstatements.isEmpty() && firstWhenStmt == null) {
69             return EmptyConstraintDefinition.getInstance();
70         }
71
72         return new EffectiveConstraintDefinitionImpl(minElements, maxElements,
73             firstWhenStmt == null ? null : firstWhenStmt.argument(), mustSubstatements);
74     }
75
76     @Override
77     public Optional<RevisionAwareXPath> getWhenCondition() {
78         return Optional.ofNullable(whenCondition);
79     }
80
81     @Override
82     public Set<MustDefinition> getMustConstraints() {
83         return mustConstraints;
84     }
85
86     @Override
87     public Integer getMinElements() {
88         return minElements;
89     }
90
91     @Override
92     public Integer getMaxElements() {
93         return maxElements;
94     }
95
96     @Override
97     public int hashCode() {
98         return ConstraintDefinitions.hashCode(this);
99     }
100
101     @Override
102     public boolean equals(final Object obj) {
103         return ConstraintDefinitions.equals(this, obj);
104     }
105
106     @Override
107     public String toString() {
108         return ConstraintDefinitions.toString(this);
109     }
110 }