X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-rfc7950%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Frfc7950%2Fstmt%2Fcase_%2FAbstractCaseStatementSupport.java;h=7bf6f5a987eb31146b0628df178932dd5b230c27;hb=88aeb1cd912d37fcadf671b622fece9a01297e90;hp=8853092be24dfb632336a5dc6f52dfe166a07ccb;hpb=7bb6ae1269659c12efc127b97cc750ed81ecaac6;p=yangtools.git diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/case_/AbstractCaseStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/case_/AbstractCaseStatementSupport.java index 8853092be2..7bf6f5a987 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/case_/AbstractCaseStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/case_/AbstractCaseStatementSupport.java @@ -7,40 +7,81 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.case_; +import com.google.common.collect.ImmutableList; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; +import org.opendaylight.yangtools.yang.model.api.Status; 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.StatementSource; import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement; -import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport; +import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseImplicitStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder; +import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; abstract class AbstractCaseStatementSupport - extends AbstractQNameStatementSupport { + extends BaseImplicitStatementSupport { AbstractCaseStatementSupport() { super(YangStmtMapping.CASE); } @Override - public final QName parseArgumentValue(final StmtContext ctx, final String value) { - return StmtContextUtils.parseIdentifier(ctx, value); + protected final CaseStatement createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + final StatementSource source = ctx.getStatementSource(); + switch (ctx.getStatementSource()) { + case CONTEXT: + return new RegularUndeclaredCaseStatement(ctx.coerceStatementArgument(), substatements); + case DECLARATION: + return new RegularCaseStatement(ctx.coerceStatementArgument(), substatements); + default: + throw new IllegalStateException("Unhandled statement source " + source); + } } @Override - public final void onStatementAdded(final Mutable stmt) { - stmt.coerceParentContext().addToNs(ChildSchemaNodeNamespace.class, stmt.coerceStatementArgument(), stmt); + protected final CaseStatement createEmptyDeclared(final StmtContext ctx) { + final StatementSource source = ctx.getStatementSource(); + switch (ctx.getStatementSource()) { + case CONTEXT: + return new EmptyUndeclaredCaseStatement(ctx.coerceStatementArgument()); + case DECLARATION: + return new EmptyCaseStatement(ctx.coerceStatementArgument()); + default: + throw new IllegalStateException("Unhandled statement source " + source); + } } @Override - public final CaseStatement createDeclared(final StmtContext ctx) { - return new CaseStatementImpl(ctx); + protected final CaseEffectiveStatement createDeclaredEffective(final Current stmt, + final ImmutableList> substatements) { + return new DeclaredCaseEffectiveStatement(stmt.declared(), substatements, stmt.sourceReference(), + computeFlags(stmt, substatements), stmt.getSchemaPath(), findOriginal(stmt)); } @Override - public final CaseEffectiveStatement createEffective( - final StmtContext ctx) { - return new CaseEffectiveStatementImpl(ctx); + protected final CaseEffectiveStatement createUndeclaredEffective(final Current stmt, + final ImmutableList> substatements) { + return new UndeclaredCaseEffectiveStatement(substatements, stmt.sourceReference(), + computeFlags(stmt, substatements), stmt.getSchemaPath(), findOriginal(stmt)); + } + + private static @Nullable CaseSchemaNode findOriginal(final Current stmt) { + return (CaseSchemaNode) stmt.original(); + } + + private static int computeFlags(final Current stmt, + final ImmutableList> substatements) { + return new FlagsBuilder() + .setHistory(stmt.history()) + .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT)) + .setConfiguration(stmt.effectiveConfig() + && stmt.caerbannog().allSubstatementsStream().anyMatch(StmtContext::isConfiguration)) + .toFlags(); } } \ No newline at end of file