Reformulate StatementContextFactory.createEffective()
[yangtools.git] / yang / rfc8040-parser-support / src / main / java / org / opendaylight / yangtools / rfc8040 / parser / YangDataStatementSupport.java
index d7179ae1a100e089ea207f306e3ea08c5c51f93b..7d35ddc8bd993b85de7007125f638b12081f1d44 100644 (file)
@@ -8,32 +8,32 @@
 package org.opendaylight.yangtools.rfc8040.parser;
 
 import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.rfc8040.model.api.YangDataEffectiveStatement;
 import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
 import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatements;
 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.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStringStatementSupport;
+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.SubstatementValidator;
 
 @Beta
-public final class YangDataStatementSupport extends AbstractStatementSupport<String, YangDataStatement,
-        EffectiveStatement<String, YangDataStatement>> {
+public final class YangDataStatementSupport
+        extends BaseStringStatementSupport<YangDataStatement, YangDataEffectiveStatement> {
     /**
      * Declared statement representation of 'yang-data' extension defined in
      * <a href="https://tools.ietf.org/html/rfc8040#section-8">RFC 8040</a>.
      */
-    private static final class Declared extends AbstractDeclaredStatement<String> implements YangDataStatement {
-        Declared(final StmtContext<String, YangDataStatement, ?> ctx) {
-            super(ctx);
-        }
-
-        @Override
-        public String getArgument() {
-            return argument();
+    private static final class Declared extends WithSubstatements implements YangDataStatement {
+        Declared(final String rawArgument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+            super(rawArgument, substatements);
         }
     }
 
@@ -54,47 +54,47 @@ public final class YangDataStatementSupport extends AbstractStatementSupport<Str
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return validator;
+    public void onFullDefinitionDeclared(final Mutable<String, YangDataStatement, YangDataEffectiveStatement> ctx) {
+        // as per https://tools.ietf.org/html/rfc8040#section-8,
+        // yang-data is ignored unless it appears as a top-level statement
+        if (ctx.coerceParentContext().getParentContext() != null) {
+            ctx.setIsSupportedToBuildEffective(false);
+        }
     }
 
     @Override
-    public String parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-        return value;
+    public boolean isIgnoringIfFeatures() {
+        return true;
     }
 
     @Override
-    public YangDataStatement createDeclared(final StmtContext<String, YangDataStatement, ?> ctx) {
-        return new Declared(ctx);
+    public boolean isIgnoringConfig() {
+        return true;
     }
 
     @Override
-    public EffectiveStatement<String, YangDataStatement> createEffective(final StmtContext<String,
-            YangDataStatement, EffectiveStatement<String, YangDataStatement>> ctx) {
-        // in case of yang-data node we need to perform substatement validation at the point when we have
-        // effective substatement contexts already available - if the node has only a uses statement declared in it,
-        // one top-level container node may very well be added to the yang-data as an effective statement
-        validator.validate(ctx);
-        return new YangDataEffectiveStatementImpl(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return validator;
     }
 
     @Override
-    public void onFullDefinitionDeclared(final Mutable<String, YangDataStatement,
-            EffectiveStatement<String, YangDataStatement>> ctx) {
-        // as per https://tools.ietf.org/html/rfc8040#section-8,
-        // yang-data is ignored unless it appears as a top-level statement
-        if (ctx.getParentContext().getParentContext() != null) {
-            ctx.setIsSupportedToBuildEffective(false);
-        }
+    protected YangDataStatement createDeclared(@NonNull final StmtContext<String, YangDataStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new Declared(ctx.coerceRawStatementArgument(), substatements);
     }
 
     @Override
-    public boolean isIgnoringIfFeatures() {
-        return true;
+    protected YangDataStatement createEmptyDeclared(final StmtContext<String, YangDataStatement, ?> ctx) {
+        return createDeclared(ctx, ImmutableList.of());
     }
 
     @Override
-    public boolean isIgnoringConfig() {
-        return true;
+    protected YangDataEffectiveStatement createEffective(final Current<String, YangDataStatement> stmt,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        // in case of yang-data node we need to perform substatement validation at the point when we have
+        // effective substatement contexts already available - if the node has only a uses statement declared in it,
+        // one top-level container node may very well be added to the yang-data as an effective statement
+        validator.validate(stmt.caerbannog());
+        return new YangDataEffectiveStatementImpl(stmt, substatements);
     }
-}
\ No newline at end of file
+}