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;
13 import java.util.Optional;
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;
21 final class EffectiveConstraintDefinitionImpl implements ConstraintDefinition {
22 private static final String UNBOUNDED_STR = "unbounded";
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;
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);
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;
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;
62 final MandatoryEffectiveStatement firstMandatoryStmt = parent.firstEffective(MandatoryEffectiveStatement.class);
63 final boolean mandatory = firstMandatoryStmt == null ? minElements != null : firstMandatoryStmt.argument();
65 final Set<MustDefinition> mustSubstatements = ImmutableSet.copyOf(parent.allSubstatementsOfType(
66 MustDefinition.class));
67 final WhenEffectiveStatementImpl firstWhenStmt = parent.firstEffective(WhenEffectiveStatementImpl.class);
69 // Check for singleton instances
70 if (minElements == null && maxElements == null && mustSubstatements.isEmpty() && firstWhenStmt == null) {
71 return EmptyConstraintDefinition.create(mandatory);
74 return new EffectiveConstraintDefinitionImpl(mandatory, minElements, maxElements,
75 firstWhenStmt == null ? null : firstWhenStmt.argument(), mustSubstatements);
79 public Optional<RevisionAwareXPath> getWhenCondition() {
80 return Optional.ofNullable(whenCondition);
84 public Set<MustDefinition> getMustConstraints() {
85 return mustConstraints;
89 public boolean isMandatory() {
94 public Integer getMinElements() {
99 public Integer getMaxElements() {
104 public int hashCode() {
105 return ConstraintDefinitions.hashCode(this);
109 public boolean equals(final Object obj) {
110 return ConstraintDefinitions.equals(this, obj);
114 public String toString() {
115 return ConstraintDefinitions.toString(this);