/**
* Copyright (c) 2015 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.parser.stmt.rfc6020.effective;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import java.util.Set;
import org.opendaylight.yangtools.yang.data.util.ConstraintDefinitions;
import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
import org.opendaylight.yangtools.yang.model.api.MustDefinition;
import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
import org.opendaylight.yangtools.yang.data.util.EmptyConstraintDefinition;
final class EffectiveConstraintDefinitionImpl implements ConstraintDefinition {
private static final String UNBOUNDED_STR = "unbounded";
private final RevisionAwareXPath whenCondition;
private final Set<MustDefinition> mustConstraints;
private final Integer minElements;
private final Integer maxElements;
private final boolean mandatory;
private EffectiveConstraintDefinitionImpl(final boolean mandatory, final Integer minElements,
final Integer maxElements, final RevisionAwareXPath whenCondition,
final Set<MustDefinition> mustConstraints) {
this.mandatory = mandatory;
this.minElements = minElements;
this.maxElements = maxElements;
this.whenCondition = whenCondition;
this.mustConstraints = Preconditions.checkNotNull(mustConstraints);
}
static ConstraintDefinition forParent(final EffectiveStatementBase<?, ?> parent) {
final MinElementsEffectiveStatementImpl firstMinElementsStmt = parent
.firstEffective(MinElementsEffectiveStatementImpl.class);
final Integer minElements;
if (firstMinElementsStmt != null) {
final Integer m = firstMinElementsStmt.argument();
minElements = m > 0 ? m : null;
} else {
minElements = null;
}
final MaxElementsEffectiveStatementImpl firstMaxElementsStmt = parent
.firstEffective(MaxElementsEffectiveStatementImpl.class);
final String maxElementsArg = (firstMaxElementsStmt == null) ? UNBOUNDED_STR : firstMaxElementsStmt.argument();
final Integer maxElements;
if (!UNBOUNDED_STR.equals(maxElementsArg)) {
final Integer m = Integer.valueOf(maxElementsArg);
maxElements = m < Integer.MAX_VALUE ? m : null;
} else {
maxElements = null;
}
final MandatoryEffectiveStatement firstMandatoryStmt = parent.firstEffective(MandatoryEffectiveStatement.class);
final boolean mandatory = (firstMandatoryStmt == null) ? minElements != null : firstMandatoryStmt.argument();
final Set<MustDefinition> mustSubstatements = ImmutableSet.copyOf(parent.allSubstatementsOfType(
MustDefinition.class));
final WhenEffectiveStatementImpl firstWhenStmt = parent.firstEffective(WhenEffectiveStatementImpl.class);
// Check for singleton instances
if (minElements == null && maxElements == null && mustSubstatements.isEmpty() && firstWhenStmt == null) {
return EmptyConstraintDefinition.create(mandatory);
}
return new EffectiveConstraintDefinitionImpl(mandatory, minElements, maxElements,
(firstWhenStmt == null) ? null : firstWhenStmt.argument(), mustSubstatements);
}
@Override
public RevisionAwareXPath getWhenCondition() {
return whenCondition;
}
@Override
public Set<MustDefinition> getMustConstraints() {
return mustConstraints;
}
@Override
public boolean isMandatory() {
return mandatory;
}
@Override
public Integer getMinElements() {
return minElements;
}
@Override
public Integer getMaxElements() {
return maxElements;
}
@Override
public int hashCode() {
return ConstraintDefinitions.hashCode(this);
}
@Override
public boolean equals(final Object obj) {
return ConstraintDefinitions.equals(this, obj);
}
@Override
public String toString() {
return ConstraintDefinitions.toString(this);
}
}