Add BaseSchemaTreeStatementSupport.parseArgumentValue()
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / choice / AbstractChoiceStatementSupport.java
index 6df064d9d54baebf6d684d15110098a52cd237fd..9b95f1389ccde6b92245342c53b09442c81d500f 100644 (file)
@@ -9,8 +9,6 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.choice;
 
 import com.google.common.collect.ImmutableList;
 import java.util.Optional;
-import java.util.SortedMap;
-import java.util.TreeMap;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
@@ -25,41 +23,28 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.YangValidationBundles;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseSchemaTreeStatementSupport;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ImplicitParentAwareStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
 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;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 abstract class AbstractChoiceStatementSupport
-        extends BaseQNameStatementSupport<ChoiceStatement, ChoiceEffectiveStatement>
+        extends BaseSchemaTreeStatementSupport<ChoiceStatement, ChoiceEffectiveStatement>
         implements ImplicitParentAwareStatementSupport {
     AbstractChoiceStatementSupport() {
         super(YangStmtMapping.CHOICE);
     }
 
-    @Override
-    public final QName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-        return StmtContextUtils.parseIdentifier(ctx, value);
-    }
-
     @Override
     public final Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(final StatementDefinition stmtDef) {
         return YangValidationBundles.SUPPORTED_CASE_SHORTHANDS.contains(stmtDef) ? Optional.of(implictCase())
                 : Optional.empty();
     }
 
-    @Override
-    public final void onStatementAdded(final Mutable<QName, ChoiceStatement, ChoiceEffectiveStatement> stmt) {
-        stmt.coerceParentContext().addToNs(ChildSchemaNodeNamespace.class, stmt.coerceStatementArgument(), stmt);
-    }
-
     @Override
     protected final ChoiceStatement createDeclared(@NonNull final StmtContext<QName, ChoiceStatement, ?> ctx,
             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
@@ -75,16 +60,6 @@ abstract class AbstractChoiceStatementSupport
     protected final ChoiceEffectiveStatement createEffective(
             final StmtContext<QName, ChoiceStatement, ChoiceEffectiveStatement> ctx,
             final ChoiceStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
-        // FIXME: YANGTOOLS-652: this is rather unnecessary
-        final SortedMap<QName, CaseSchemaNode> cases = new TreeMap<>();
-        for (final EffectiveStatement<?, ?> effectiveStatement : substatements) {
-            if (effectiveStatement instanceof CaseSchemaNode) {
-                final CaseSchemaNode choiceCaseNode = (CaseSchemaNode) effectiveStatement;
-                // FIXME: we may be overwriting a previous entry, is that really okay?
-                cases.put(choiceCaseNode.getQName(), choiceCaseNode);
-            }
-        }
-
         final String defaultArg = findFirstArgument(substatements, DefaultEffectiveStatement.class, null);
         final CaseSchemaNode defaultCase;
         if (defaultArg != null) {
@@ -97,8 +72,8 @@ abstract class AbstractChoiceStatementSupport
             }
 
             // FIXME: this does not work with submodules, as they are
-            defaultCase = InferenceException.throwIfNull(cases.get(qname), ctx.getStatementSourceReference(),
-                "Default statement refers to missing case %s", qname);
+            defaultCase = InferenceException.throwIfNull(findCase(qname, substatements),
+                ctx.getStatementSourceReference(), "Default statement refers to missing case %s", qname);
         } else {
             defaultCase = null;
         }
@@ -110,7 +85,7 @@ abstract class AbstractChoiceStatementSupport
                 .setMandatory(findFirstArgument(substatements, MandatoryEffectiveStatement.class, Boolean.FALSE))
                 .toFlags();
 
-        return new ChoiceEffectiveStatementImpl(declared, ctx, substatements, flags, cases, defaultCase,
+        return new ChoiceEffectiveStatementImpl(declared, ctx, substatements, flags, defaultCase,
             (ChoiceSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null));
     }
 
@@ -121,4 +96,18 @@ abstract class AbstractChoiceStatementSupport
     }
 
     abstract StatementSupport<?, ?, ?> implictCase();
+
+    private static CaseSchemaNode findCase(final QName qname,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        for (final EffectiveStatement<?, ?> effectiveStatement : substatements) {
+            if (effectiveStatement instanceof CaseSchemaNode) {
+                final CaseSchemaNode choiceCaseNode = (CaseSchemaNode) effectiveStatement;
+                if (qname.equals(choiceCaseNode.getQName())) {
+                    return choiceCaseNode;
+                }
+            }
+        }
+
+        return null;
+    }
 }
\ No newline at end of file