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