Add BaseSchemaTreeStatementSupport.parseArgumentValue()
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / case_ / AbstractCaseStatementSupport.java
index 8853092be24dfb632336a5dc6f52dfe166a07ccb..d927160149dccf1dd8ad2668bc4b2876e36fac6f 100644 (file)
@@ -7,40 +7,82 @@
  */
 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.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<CaseStatement, CaseEffectiveStatement> {
+        extends BaseImplicitStatementSupport<CaseStatement, CaseEffectiveStatement> {
     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<QName, CaseStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> 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<QName, CaseStatement, CaseEffectiveStatement> stmt) {
-        stmt.coerceParentContext().addToNs(ChildSchemaNodeNamespace.class, stmt.coerceStatementArgument(), stmt);
+    protected final CaseStatement createEmptyDeclared(final StmtContext<QName, CaseStatement, ?> 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<QName, CaseStatement, ?> ctx) {
-        return new CaseStatementImpl(ctx);
+    protected final CaseEffectiveStatement createDeclaredEffective(
+            final StmtContext<QName, CaseStatement, CaseEffectiveStatement> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final CaseStatement declared) {
+        return new DeclaredCaseEffectiveStatement(declared, ctx, substatements, computeFlags(ctx, substatements),
+            findOriginal(ctx));
     }
 
     @Override
-    public final CaseEffectiveStatement createEffective(
-            final StmtContext<QName, CaseStatement, CaseEffectiveStatement> ctx) {
-        return new CaseEffectiveStatementImpl(ctx);
+    protected final CaseEffectiveStatement createUndeclaredEffective(
+            final StmtContext<QName, CaseStatement, CaseEffectiveStatement> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new UndeclaredCaseEffectiveStatement(ctx, substatements, computeFlags(ctx, substatements),
+            findOriginal(ctx));
+    }
+
+    private static @Nullable CaseSchemaNode findOriginal(final StmtContext<?, ?, ?> ctx) {
+        return (CaseSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
+    }
+
+    private static int computeFlags(final StmtContext<?, ?, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new FlagsBuilder()
+                .setHistory(ctx.getCopyHistory())
+                .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
+                .setConfiguration(ctx.isConfiguration()
+                    && ctx.allSubstatementsStream().anyMatch(StmtContext::isConfiguration))
+                .toFlags();
     }
 }
\ No newline at end of file