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;
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;
25 final class EffectiveConstraintDefinitionImpl implements ConstraintDefinition {
26 private static final String UNBOUNDED_STR = "unbounded";
28 private final RevisionAwareXPath whenCondition;
29 private final Set<MustDefinition> mustConstraints;
30 private final Integer minElements;
31 private final Integer maxElements;
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);
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;
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;
63 final Set<MustDefinition> mustSubstatements = ImmutableSet.copyOf(parent.allSubstatementsOfType(
64 MustDefinition.class));
65 final WhenEffectiveStatement firstWhenStmt = parent.firstEffective(WhenEffectiveStatement.class);
67 // Check for singleton instances
68 if (minElements == null && maxElements == null && mustSubstatements.isEmpty() && firstWhenStmt == null) {
69 return EmptyConstraintDefinition.getInstance();
72 return new EffectiveConstraintDefinitionImpl(minElements, maxElements,
73 firstWhenStmt == null ? null : firstWhenStmt.argument(), mustSubstatements);
77 public Optional<RevisionAwareXPath> getWhenCondition() {
78 return Optional.ofNullable(whenCondition);
82 public Set<MustDefinition> getMustConstraints() {
83 return mustConstraints;
87 public Integer getMinElements() {
92 public Integer getMaxElements() {
97 public int hashCode() {
98 return ConstraintDefinitions.hashCode(this);
102 public boolean equals(final Object obj) {
103 return ConstraintDefinitions.equals(this, obj);
107 public String toString() {
108 return ConstraintDefinitions.toString(this);