*/
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate;
+import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
import java.util.Collection;
-import java.util.Set;
-import org.opendaylight.yangtools.util.OptionalBoolean;
import org.opendaylight.yangtools.yang.model.api.DeviateDefinition;
import org.opendaylight.yangtools.yang.model.api.DeviateKind;
import org.opendaylight.yangtools.yang.model.api.MustDefinition;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.UniqueConstraint;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ConfigEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements;
-final class DeviateEffectiveStatementImpl extends DeclaredEffectiveStatementBase<DeviateKind, DeviateStatement>
+final class DeviateEffectiveStatementImpl extends WithSubstatements<DeviateKind, DeviateStatement>
implements DeviateDefinition, DeviateEffectiveStatement {
-
- private final String deviatedDefault;
- private final Integer deviatedMaxElements;
- private final Integer deviatedMinElements;
- private final ImmutableSet<MustDefinition> deviatedMustDefinitions;
- private final TypeDefinition<?> deviatedType;
- private final ImmutableList<UniqueConstraint> deviatedUniqueConstraints;
- private final String deviatedUnits;
-
- private final byte deviatedConfig;
- private final byte deviatedMandatory;
-
- DeviateEffectiveStatementImpl(final StmtContext<DeviateKind, DeviateStatement, ?> ctx) {
- super(ctx);
-
- deviatedConfig = OptionalBoolean.ofNullable(findFirstEffectiveSubstatementArgument(
- ConfigEffectiveStatement.class).orElse(null));
- deviatedMandatory = OptionalBoolean.ofNullable(findFirstEffectiveSubstatementArgument(
- MandatoryEffectiveStatement.class).orElse(null));
- deviatedDefault = findFirstEffectiveSubstatementArgument(DefaultEffectiveStatement.class).orElse(null);
- deviatedMaxElements = findFirstEffectiveSubstatementArgument(MaxElementsEffectiveStatement.class)
- // FIXME: this does not handle 'unbounded'
- .map(Integer::valueOf).orElse(null);
- deviatedMinElements = findFirstEffectiveSubstatementArgument(MinElementsEffectiveStatement.class).orElse(null);
- deviatedType = findFirstEffectiveSubstatement(TypeEffectiveStatement.class)
- .map(TypeEffectiveStatement::getTypeDefinition).orElse(null);
- deviatedUnits = findFirstEffectiveSubstatementArgument(UnitsEffectiveStatement.class).orElse(null);
-
- deviatedMustDefinitions = ImmutableSet.copyOf(allSubstatementsOfType(MustDefinition.class));
- deviatedUniqueConstraints = ImmutableList.copyOf(allSubstatementsOfType(UniqueConstraint.class));
+ DeviateEffectiveStatementImpl(final DeviateStatement declared,
+ final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+ super(declared, substatements);
}
@Override
@Override
public Boolean getDeviatedConfig() {
- return OptionalBoolean.toNullable(deviatedConfig);
+ return findFirstEffectiveSubstatementArgument(ConfigEffectiveStatement.class).orElse(null);
}
@Override
public String getDeviatedDefault() {
- return deviatedDefault;
+ return findFirstEffectiveSubstatementArgument(DefaultEffectiveStatement.class).orElse(null);
}
@Override
public Boolean getDeviatedMandatory() {
- return OptionalBoolean.toNullable(deviatedMandatory);
+ return findFirstEffectiveSubstatementArgument(MandatoryEffectiveStatement.class).orElse(null);
}
@Override
public Integer getDeviatedMaxElements() {
- return deviatedMaxElements;
+ return findFirstEffectiveSubstatementArgument(MaxElementsEffectiveStatement.class)
+ // FIXME: this does not handle 'unbounded'
+ .map(Integer::valueOf).orElse(null);
}
@Override
public Integer getDeviatedMinElements() {
- return deviatedMinElements;
+ return findFirstEffectiveSubstatementArgument(MinElementsEffectiveStatement.class).orElse(null);
}
@Override
- public Set<MustDefinition> getDeviatedMusts() {
- return deviatedMustDefinitions;
+ public Collection<? extends MustDefinition> getDeviatedMusts() {
+ return allSubstatementsOfType(MustDefinition.class);
}
@Override
public TypeDefinition<?> getDeviatedType() {
- return deviatedType;
+ return findFirstEffectiveSubstatement(TypeEffectiveStatement.class)
+ .map(TypeEffectiveStatement::getTypeDefinition).orElse(null);
}
@Override
- public Collection<UniqueConstraint> getDeviatedUniques() {
- return deviatedUniqueConstraints;
+ public Collection<? extends UniqueConstraint> getDeviatedUniques() {
+ return allSubstatementsOfType(UniqueConstraint.class);
}
@Override
public String getDeviatedUnits() {
- return deviatedUnits;
+ return findFirstEffectiveSubstatementArgument(UnitsEffectiveStatement.class).orElse(null);
+ }
+
+ @SuppressWarnings("unchecked")
+ private <T> Collection<T> allSubstatementsOfType(final Class<T> type) {
+ return Collection.class.cast(Collections2.filter(effectiveSubstatements(), type::isInstance));
}
}