import com.google.common.annotations.Beta;
import org.opendaylight.yangtools.yang.model.api.DeviateKind;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
@Beta
public interface DeviateEffectiveStatement extends EffectiveStatement<DeviateKind, DeviateStatement> {
-
+ @Override
+ default StatementDefinition statementDefinition() {
+ return YangStmtMapping.DEVIATE;
+ }
}
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.model.api.DeviateKind;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
public interface DeviateStatement extends DeclaredStatement<DeviateKind> {
+ @Override
+ default StatementDefinition statementDefinition() {
+ return YangStmtMapping.DEVIATE;
+ }
+
default @NonNull DeviateKind getValue() {
// FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here
return verifyNotNull(argument());
*/
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import org.opendaylight.yangtools.yang.common.YangVersion;
import org.opendaylight.yangtools.yang.model.api.DeviateKind;
import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.YangValidationBundles;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
import org.slf4j.LoggerFactory;
abstract class AbstractDeviateStatementSupport
- extends AbstractStatementSupport<DeviateKind, DeviateStatement, DeviateEffectiveStatement> {
+ extends BaseStatementSupport<DeviateKind, DeviateStatement, DeviateEffectiveStatement> {
private static final Logger LOG = LoggerFactory.getLogger(AbstractDeviateStatementSupport.class);
private static final SubstatementValidator DEVIATE_NOT_SUPPORTED_SUBSTATEMENT_VALIDATOR =
ctx.getStatementSourceReference(), "String '%s' is not valid deviate argument", value);
}
- @Override
- public final DeviateStatement createDeclared(final StmtContext<DeviateKind, DeviateStatement, ?> ctx) {
- return new DeviateStatementImpl(ctx);
- }
-
- @Override
- public final DeviateEffectiveStatement createEffective(
- final StmtContext<DeviateKind, DeviateStatement, DeviateEffectiveStatement> ctx) {
- return new DeviateEffectiveStatementImpl(ctx);
- }
-
@Override
public final void onFullDefinitionDeclared(
final Mutable<DeviateKind, DeviateStatement, DeviateEffectiveStatement> deviateStmtCtx) {
return null;
}
+ @Override
+ protected final DeviateStatement createDeclared(final StmtContext<DeviateKind, DeviateStatement, ?> ctx,
+ final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+ return new DeviateStatementImpl(ctx, substatements);
+ }
+
+ @Override
+ protected final DeviateStatement createEmptyDeclared(final StmtContext<DeviateKind, DeviateStatement, ?> ctx) {
+ // This is exceedingly unlikely, just reuse the implementation
+ return createDeclared(ctx, ImmutableList.of());
+ }
+
+ @Override
+ protected final DeviateEffectiveStatement createEffective(
+ final StmtContext<DeviateKind, DeviateStatement, DeviateEffectiveStatement> ctx,
+ final DeviateStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+ return new DeviateEffectiveStatementImpl(declared, substatements);
+ }
+
+ @Override
+ protected final DeviateEffectiveStatement createEmptyEffective(
+ final StmtContext<DeviateKind, DeviateStatement, DeviateEffectiveStatement> ctx,
+ final DeviateStatement declared) {
+ // This is exceedingly unlikely, just reuse the implementation
+ return createEffective(ctx, declared, ImmutableList.of());
+ }
+
protected SubstatementValidator getSubstatementValidatorForDeviate(final DeviateKind deviateKind) {
switch (deviateKind) {
case NOT_SUPPORTED:
*/
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));
}
}
*/
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate;
+import com.google.common.collect.ImmutableList;
import org.opendaylight.yangtools.yang.model.api.DeviateKind;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument.WithSubstatements;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-final class DeviateStatementImpl extends AbstractDeclaredStatement<DeviateKind> implements DeviateStatement {
- DeviateStatementImpl(final StmtContext<DeviateKind, DeviateStatement, ?> context) {
- super(context);
+final class DeviateStatementImpl extends WithSubstatements<DeviateKind> implements DeviateStatement {
+ DeviateStatementImpl(final StmtContext<DeviateKind, ?, ?> context,
+ final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+ super(context, substatements);
}
}