org.opendaylight.yangtools.yang.model.api.ElementCountConstraint Maven / Gradle / Ivy
/*
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.yangtools.yang.model.api;
import static com.google.common.base.Preconditions.checkArgument;
import com.google.common.annotations.Beta;
import com.google.common.base.MoreObjects;
import java.util.Objects;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
/**
* Contains method which returns various data constraints for a list-like YANG element
* (e.g. min or max number of elements).
*/
@Beta
public abstract class ElementCountConstraint {
private static final class Min extends ElementCountConstraint {
private final int minElements;
Min(final int minElements) {
checkArgument(minElements >= 0);
this.minElements = minElements;
}
@Override
public Integer getMinElements() {
return minElements;
}
@Override
public Integer getMaxElements() {
return null;
}
}
private static final class Max extends ElementCountConstraint {
private final int maxElements;
Max(final int maxElements) {
checkArgument(maxElements >= 0);
this.maxElements = maxElements;
}
@Override
public Integer getMinElements() {
return null;
}
@Override
public Integer getMaxElements() {
return maxElements;
}
}
private static final class MinMax extends ElementCountConstraint {
private final int minElements;
private final int maxElements;
MinMax(final int minElements, final int maxElements) {
checkArgument(minElements >= 0);
checkArgument(maxElements >= 0);
checkArgument(minElements <= maxElements);
this.minElements = minElements;
this.maxElements = maxElements;
}
@Override
public Integer getMinElements() {
return minElements;
}
@Override
public Integer getMaxElements() {
return maxElements;
}
}
ElementCountConstraint() {
// Hidden on purpose
}
public static @NonNull ElementCountConstraint atLeast(final int minElements) {
return new Min(minElements);
}
public static @NonNull ElementCountConstraint atMost(final int maxElements) {
return new Max(maxElements);
}
public static @NonNull ElementCountConstraint inRange(final int minElements, final int maxElements) {
return new MinMax(minElements, maxElements);
}
public static @NonNull Optional forNullable(final @Nullable Integer minElements,
final @Nullable Integer maxElements) {
if (minElements == null) {
return maxElements != null ? Optional.of(new Max(maxElements)) : Optional.empty();
}
return Optional.of(maxElements != null ? new MinMax(minElements, maxElements) : new Min(minElements));
}
/**
* Returns the minimum required number of data elements for node where this
* constraint is specified.
*
*
* The returning value equals to value of the argument of the
* min-elements YANG substatement.
* It is used with YANG statements leaf-list, list, deviate.
*
* @return integer with minimal number of elements, or null if no minimum is defined
*/
public abstract @Nullable Integer getMinElements();
/**
* Returns the maximum admissible number of data elements for node where
* this constraint is specified.
*
*
* The returning value equals to value of the argument of the
* max-elements YANG substatement.
* It is used with YANG statements leaf-list, list, deviate.
*
* @return integer with maximum number of elements, or null if no maximum is defined
*/
public abstract @Nullable Integer getMaxElements();
@Override
public final int hashCode() {
return Objects.hash(getMinElements(), getMaxElements());
}
@Override
public final boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof ElementCountConstraint)) {
return false;
}
final ElementCountConstraint other = (ElementCountConstraint) obj;
return Objects.equals(getMinElements(), other.getMinElements())
&& Objects.equals(getMaxElements(), other.getMaxElements());
}
@Override
public final String toString() {
return MoreObjects.toStringHelper(ElementCountConstraint.class).omitNullValues()
.add("minElements", getMinElements())
.add("maxElements", getMaxElements()).toString();
}
}