2 * Copyright (c) 2013 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.model.api;
10 import static com.google.common.base.Preconditions.checkArgument;
12 import com.google.common.annotations.Beta;
13 import com.google.common.base.MoreObjects;
14 import java.util.Objects;
15 import java.util.Optional;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.eclipse.jdt.annotation.Nullable;
20 * Contains method which returns various data constraints for a list-like YANG element
21 * (e.g. min or max number of elements).
24 public abstract class ElementCountConstraint {
25 private static final class Min extends ElementCountConstraint {
26 private final int minElements;
28 Min(final int minElements) {
29 checkArgument(minElements >= 0);
30 this.minElements = minElements;
34 public Integer getMinElements() {
39 public Integer getMaxElements() {
44 private static final class Max extends ElementCountConstraint {
45 private final int maxElements;
47 Max(final int maxElements) {
48 checkArgument(maxElements >= 0);
49 this.maxElements = maxElements;
53 public Integer getMinElements() {
58 public Integer getMaxElements() {
63 private static final class MinMax extends ElementCountConstraint {
64 private final int minElements;
65 private final int maxElements;
67 MinMax(final int minElements, final int maxElements) {
68 checkArgument(minElements >= 0);
69 checkArgument(maxElements >= 0);
70 checkArgument(minElements <= maxElements);
71 this.minElements = minElements;
72 this.maxElements = maxElements;
76 public Integer getMinElements() {
81 public Integer getMaxElements() {
86 ElementCountConstraint() {
90 public static @NonNull ElementCountConstraint atLeast(final int minElements) {
91 return new Min(minElements);
94 public static @NonNull ElementCountConstraint atMost(final int maxElements) {
95 return new Max(maxElements);
98 public static @NonNull ElementCountConstraint inRange(final int minElements, final int maxElements) {
99 return new MinMax(minElements, maxElements);
102 public static @NonNull Optional<ElementCountConstraint> forNullable(final @Nullable Integer minElements,
103 final @Nullable Integer maxElements) {
104 if (minElements == null) {
105 return maxElements != null ? Optional.of(new Max(maxElements)) : Optional.empty();
108 return Optional.of(maxElements != null ? new MinMax(minElements, maxElements) : new Min(minElements));
112 * Returns the minimum required number of data elements for node where this
113 * constraint is specified.
116 * The returning value equals to value of the argument of the
117 * <b>min-elements</b> YANG substatement.
118 * It is used with YANG statements leaf-list, list, deviate.
120 * @return integer with minimal number of elements, or null if no minimum is defined
122 public abstract @Nullable Integer getMinElements();
125 * Returns the maximum admissible number of data elements for node where
126 * this constraint is specified.
129 * The returning value equals to value of the argument of the
130 * <b>max-elements</b> YANG substatement.
131 * It is used with YANG statements leaf-list, list, deviate.
133 * @return integer with maximum number of elements, or null if no maximum is defined
135 public abstract @Nullable Integer getMaxElements();
138 public final int hashCode() {
139 return Objects.hash(getMinElements(), getMaxElements());
143 public final boolean equals(final Object obj) {
147 if (!(obj instanceof ElementCountConstraint)) {
150 final ElementCountConstraint other = (ElementCountConstraint) obj;
151 return Objects.equals(getMinElements(), other.getMinElements())
152 && Objects.equals(getMaxElements(), other.getMaxElements());
156 public final String toString() {
157 return MoreObjects.toStringHelper(ElementCountConstraint.class).omitNullValues()
158 .add("minElements", getMinElements())
159 .add("maxElements", getMaxElements()).toString();