2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.collect.ImmutableSet;
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;
20 final class EffectiveConstraintDefinitionImpl implements ConstraintDefinition {
21 private static final String UNBOUNDED_STR = "unbounded";
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;
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);
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;
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;
61 final MandatoryEffectiveStatement firstMandatoryStmt = parent.firstEffective(MandatoryEffectiveStatement.class);
62 final boolean mandatory = firstMandatoryStmt == null ? minElements != null : firstMandatoryStmt.argument();
64 final Set<MustDefinition> mustSubstatements = ImmutableSet.copyOf(parent.allSubstatementsOfType(
65 MustDefinition.class));
66 final WhenEffectiveStatementImpl firstWhenStmt = parent.firstEffective(WhenEffectiveStatementImpl.class);
68 // Check for singleton instances
69 if (minElements == null && maxElements == null && mustSubstatements.isEmpty() && firstWhenStmt == null) {
70 return EmptyConstraintDefinition.create(mandatory);
73 return new EffectiveConstraintDefinitionImpl(mandatory, minElements, maxElements,
74 firstWhenStmt == null ? null : firstWhenStmt.argument(), mustSubstatements);
78 public RevisionAwareXPath getWhenCondition() {
83 public Set<MustDefinition> getMustConstraints() {
84 return mustConstraints;
88 public boolean isMandatory() {
93 public Integer getMinElements() {
98 public Integer getMaxElements() {
103 public int hashCode() {
104 return ConstraintDefinitions.hashCode(this);
108 public boolean equals(final Object obj) {
109 return ConstraintDefinitions.equals(this, obj);
113 public String toString() {
114 return ConstraintDefinitions.toString(this);