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 com.google.common.base.Preconditions;
11 import com.google.common.collect.ImmutableSet;
13 import org.opendaylight.yangtools.yang.data.util.ConstraintDefinitions;
14 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
15 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
16 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
17 import org.opendaylight.yangtools.yang.data.util.EmptyConstraintDefinition;
19 final class EffectiveConstraintDefinitionImpl implements ConstraintDefinition {
20 private static final String UNBOUNDED_STR = "unbounded";
22 private final RevisionAwareXPath whenCondition;
23 private final Set<MustDefinition> mustConstraints;
24 private final Integer minElements;
25 private final Integer maxElements;
26 private final boolean mandatory;
28 private EffectiveConstraintDefinitionImpl(final boolean mandatory, final Integer minElements,
29 final Integer maxElements, final RevisionAwareXPath whenCondition,
30 final Set<MustDefinition> mustConstraints) {
31 this.mandatory = mandatory;
32 this.minElements = minElements;
33 this.maxElements = maxElements;
34 this.whenCondition = whenCondition;
35 this.mustConstraints = Preconditions.checkNotNull(mustConstraints);
38 static ConstraintDefinition forParent(final EffectiveStatementBase<?, ?> parent) {
39 final MinElementsEffectiveStatementImpl firstMinElementsStmt = parent
40 .firstEffective(MinElementsEffectiveStatementImpl.class);
41 final Integer minElements;
42 if (firstMinElementsStmt != null) {
43 final Integer m = firstMinElementsStmt.argument();
44 minElements = m > 0 ? m : null;
49 final MaxElementsEffectiveStatementImpl firstMaxElementsStmt = parent
50 .firstEffective(MaxElementsEffectiveStatementImpl.class);
51 final String maxElementsArg = (firstMaxElementsStmt == null) ? UNBOUNDED_STR : firstMaxElementsStmt.argument();
52 final Integer maxElements;
53 if (!UNBOUNDED_STR.equals(maxElementsArg)) {
54 final Integer m = Integer.valueOf(maxElementsArg);
55 maxElements = m < Integer.MAX_VALUE ? m : null;
60 final MandatoryEffectiveStatement firstMandatoryStmt = parent.firstEffective(MandatoryEffectiveStatement.class);
61 final boolean mandatory = (firstMandatoryStmt == null) ? minElements != null : firstMandatoryStmt.argument();
63 final Set<MustDefinition> mustSubstatements = ImmutableSet.copyOf(parent.allSubstatementsOfType(
64 MustDefinition.class));
65 final WhenEffectiveStatementImpl firstWhenStmt = parent.firstEffective(WhenEffectiveStatementImpl.class);
67 // Check for singleton instances
68 if (minElements == null && maxElements == null && mustSubstatements.isEmpty() && firstWhenStmt == null) {
69 return EmptyConstraintDefinition.create(mandatory);
72 return new EffectiveConstraintDefinitionImpl(mandatory, minElements, maxElements,
73 (firstWhenStmt == null) ? null : firstWhenStmt.argument(), mustSubstatements);
77 public RevisionAwareXPath getWhenCondition() {
82 public Set<MustDefinition> getMustConstraints() {
83 return mustConstraints;
87 public boolean isMandatory() {
92 public Integer getMinElements() {
97 public Integer getMaxElements() {
102 public int hashCode() {
103 return ConstraintDefinitions.hashCode(this);
107 public boolean equals(final Object obj) {
108 return ConstraintDefinitions.equals(this, obj);
112 public String toString() {
113 return ConstraintDefinitions.toString(this);