Refactor AbstractEffectiveDocumentedNodeWithStatus 13/92013/11
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 10 Aug 2020 15:33:42 +0000 (17:33 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Sat, 22 Aug 2020 17:37:39 +0000 (19:37 +0200)
This is the final vestige of custom-built statements, make sure
to switch it over to require pre-built substatements. This forces
extensions to adopt BaseStatementSupport et al., which is actually
a good thing.

JIRA: YANGTOOLS-1123
Change-Id: Ib1debecae8d2dbb474cb1c8aa34f05d0e1a3ecad
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
39 files changed:
yang/odlext-model-api/src/main/java/org/opendaylight/yangtools/odlext/model/api/AnyxmlSchemaLocationEffectiveStatement.java
yang/odlext-model-api/src/main/java/org/opendaylight/yangtools/odlext/model/api/AnyxmlSchemaLocationStatement.java
yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlSchemaLocationEffectiveStatementImpl.java
yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlSchemaLocationStatementImpl.java
yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlSchemaLocationStatementSupport.java
yang/openconfig-model-api/src/main/java/org/opendaylight/yangtools/openconfig/model/api/OpenConfigVersionStatement.java
yang/openconfig-parser-support/src/main/java/org/opendaylight/yangtools/openconfig/parser/AbstractHashedValueStatementSupport.java
yang/rfc6241-model-api/src/main/java/org/opendaylight/yangtools/rfc6241/model/api/GetFilterElementAttributesStatement.java
yang/rfc6241-parser-support/src/main/java/org/opendaylight/yangtools/rfc6241/parser/GetFilterElementAttributesStatementSupport.java
yang/rfc6536-model-api/src/main/java/org/opendaylight/yangtools/rfc6536/model/api/DefaultDenyAllEffectiveStatement.java
yang/rfc6536-model-api/src/main/java/org/opendaylight/yangtools/rfc6536/model/api/DefaultDenyAllStatement.java
yang/rfc6536-model-api/src/main/java/org/opendaylight/yangtools/rfc6536/model/api/DefaultDenyWriteEffectiveStatement.java
yang/rfc6536-model-api/src/main/java/org/opendaylight/yangtools/rfc6536/model/api/DefaultDenyWriteStatement.java
yang/rfc6536-parser-support/src/main/java/org/opendaylight/yangtools/rfc6536/parser/DefaultDenyAllStatementSupport.java
yang/rfc6536-parser-support/src/main/java/org/opendaylight/yangtools/rfc6536/parser/DefaultDenyWriteStatementSupport.java
yang/rfc7952-model-api/src/main/java/org/opendaylight/yangtools/rfc7952/model/api/AnnotationEffectiveStatement.java
yang/rfc7952-model-api/src/main/java/org/opendaylight/yangtools/rfc7952/model/api/AnnotationStatement.java
yang/rfc7952-parser-support/src/main/java/org/opendaylight/yangtools/rfc7952/parser/AnnotationStatementSupport.java
yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataEffectiveStatement.java
yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataStatement.java
yang/rfc8040-parser-support/src/main/java/org/opendaylight/yangtools/rfc8040/parser/YangDataEffectiveStatementImpl.java
yang/rfc8040-parser-support/src/main/java/org/opendaylight/yangtools/rfc8040/parser/YangDataStatementSupport.java
yang/rfc8528-model-api/src/main/java/org/opendaylight/yangtools/rfc8528/model/api/MountPointEffectiveStatement.java
yang/rfc8528-model-api/src/main/java/org/opendaylight/yangtools/rfc8528/model/api/MountPointStatement.java
yang/rfc8528-parser-support/src/main/java/org/opendaylight/yangtools/rfc8528/parser/MountPointStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/openconfig/stmt/OpenConfigVersionEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/openconfig/stmt/OpenConfigVersionStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/openconfig/stmt/OpenConfigVersionSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractDeclaredStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNodeWithStatus.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseVoidStatementSupport.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/UnknownEffectiveStatementBase.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedStatementSupport.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/thirdparty/plugin/ThirdPartyExtensionEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/thirdparty/plugin/ThirdPartyExtensionStatement.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/thirdparty/plugin/ThirdPartyExtensionStatementImpl.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/thirdparty/plugin/ThirdPartyExtensionSupport.java

index 5ec164987a399e8ef12917e1e229de5a4fb35543..8c3371d774e773c1ce299dc284c06462f60e61d3 100644 (file)
@@ -9,10 +9,14 @@ package org.opendaylight.yangtools.odlext.model.api;
 
 import com.google.common.annotations.Beta;
 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.SchemaNodeIdentifier;
 
 @Beta
 public interface AnyxmlSchemaLocationEffectiveStatement
-    extends EffectiveStatement<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement> {
-
+        extends EffectiveStatement<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return OpenDaylightExtensionsStatements.ANYXML_SCHEMA_LOCATION;
+    }
 }
index 62f9c1c4c91837ce55a8e2c2c14f3c292b7f64ac..d1d8fc00e093cab017c59f1d24a8c5d9e125f19c 100644 (file)
@@ -8,10 +8,14 @@
 package org.opendaylight.yangtools.odlext.model.api;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
 
 @Beta
 public interface AnyxmlSchemaLocationStatement extends UnknownStatement<SchemaNodeIdentifier> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return OpenDaylightExtensionsStatements.ANYXML_SCHEMA_LOCATION;
+    }
 }
index 6e085828db1ff31018cbced8dff4cdbd6d79fbfc..f42a117a944635ada35991550e83ba5f08b7b2c3 100644 (file)
@@ -8,11 +8,13 @@
 package org.opendaylight.yangtools.odlext.parser;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationEffectiveStatement;
 import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationStatement;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
@@ -25,8 +27,9 @@ public final class AnyxmlSchemaLocationEffectiveStatementImpl
     private final @NonNull SchemaPath path;
 
     AnyxmlSchemaLocationEffectiveStatementImpl(
-            final StmtContext<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement, ?> ctx) {
-        super(ctx);
+            final StmtContext<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(ctx, substatements);
         path = ctx.coerceParentContext().getSchemaPath().get().createChild(getNodeType());
     }
 
index ec7d4f894450c265f7f0f5bc3aa842bb15e7b34e..1573187e10cb4ee479f18ce2137678f448814ef9 100644 (file)
@@ -7,20 +7,18 @@
  */
 package org.opendaylight.yangtools.odlext.parser;
 
+import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-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 AnyxmlSchemaLocationStatementImpl extends AbstractDeclaredStatement<SchemaNodeIdentifier>
+final class AnyxmlSchemaLocationStatementImpl extends WithSubstatements<SchemaNodeIdentifier>
         implements AnyxmlSchemaLocationStatement {
     AnyxmlSchemaLocationStatementImpl(
-            final StmtContext<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement, ?> context) {
-        super(context);
-    }
-
-    @Override
-    public SchemaNodeIdentifier getArgument() {
-        return argument();
+            final StmtContext<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement, ?> context,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(context, substatements);
     }
 }
index 2a0f22dff4623124b8e2c0174a2f2e14fce3c619..a0d73752236a80d08333aab9e390c18b96f4e2b2 100644 (file)
@@ -9,18 +9,21 @@ package org.opendaylight.yangtools.odlext.parser;
 
 import static org.opendaylight.yangtools.odlext.model.api.OpenDaylightExtensionsStatements.ANYXML_SCHEMA_LOCATION;
 
+import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationEffectiveStatement;
 import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationStatement;
+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.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils;
-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.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
 public final class AnyxmlSchemaLocationStatementSupport
-        extends AbstractStatementSupport<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement,
+        extends BaseStatementSupport<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement,
             AnyxmlSchemaLocationEffectiveStatement> {
     private static final AnyxmlSchemaLocationStatementSupport INSTANCE =
             new AnyxmlSchemaLocationStatementSupport(ANYXML_SCHEMA_LOCATION);
@@ -49,19 +52,35 @@ public final class AnyxmlSchemaLocationStatementSupport
     }
 
     @Override
-    public AnyxmlSchemaLocationStatement createDeclared(
+    protected SubstatementValidator getSubstatementValidator() {
+        return validator;
+    }
+
+    @Override
+    protected AnyxmlSchemaLocationStatement createDeclared(
+            final StmtContext<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new AnyxmlSchemaLocationStatementImpl(ctx, substatements);
+    }
+
+    @Override
+    protected AnyxmlSchemaLocationStatement createEmptyDeclared(
             final StmtContext<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement, ?> ctx) {
-        return new AnyxmlSchemaLocationStatementImpl(ctx);
+        return createDeclared(ctx, ImmutableList.of());
     }
 
     @Override
-    public AnyxmlSchemaLocationEffectiveStatement createEffective(final StmtContext<SchemaNodeIdentifier,
-            AnyxmlSchemaLocationStatement, AnyxmlSchemaLocationEffectiveStatement> ctx) {
-        return new AnyxmlSchemaLocationEffectiveStatementImpl(ctx);
+    protected AnyxmlSchemaLocationEffectiveStatement createEffective(
+            final StmtContext<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement,
+                AnyxmlSchemaLocationEffectiveStatement> ctx, final AnyxmlSchemaLocationStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new AnyxmlSchemaLocationEffectiveStatementImpl(ctx, substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return validator;
+    protected AnyxmlSchemaLocationEffectiveStatement createEmptyEffective(
+            final StmtContext<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement,
+                AnyxmlSchemaLocationEffectiveStatement> ctx, final AnyxmlSchemaLocationStatement declared) {
+        return createEffective(ctx, declared, ImmutableList.of());
     }
 }
\ No newline at end of file
index 2db4f4e8bae1c54bf0089b9de25531f155ffef64..bc1cafb3b7add2129bd285d7cbb0baea70a66cd4 100644 (file)
@@ -9,9 +9,13 @@ package org.opendaylight.yangtools.openconfig.model.api;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.concepts.SemVer;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
 
 @Beta
 public interface OpenConfigVersionStatement extends UnknownStatement<SemVer> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return OpenConfigStatements.OPENCONFIG_VERSION;
+    }
 }
index 1efe79ff43384c45e92eaa4170ae88af53ae36d5..c71fd92ec745dce69d67cb56c8d0357ac96dd047 100644 (file)
@@ -7,30 +7,38 @@
  */
 package org.opendaylight.yangtools.openconfig.parser;
 
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigHashedValueEffectiveStatement;
 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigHashedValueStatement;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+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.rfc7950.stmt.AbstractDeclaredStatement.WithoutArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseVoidStatementSupport;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractVoidStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
 abstract class AbstractHashedValueStatementSupport
-        extends AbstractVoidStatementSupport<OpenConfigHashedValueStatement,
-            OpenConfigHashedValueEffectiveStatement> {
+        extends BaseVoidStatementSupport<OpenConfigHashedValueStatement, OpenConfigHashedValueEffectiveStatement> {
+
+    private static final class Declared extends WithSubstatements implements OpenConfigHashedValueStatement {
+        private final @NonNull StatementDefinition definition;
 
-    private static final class Declared extends AbstractDeclaredStatement<Void>
-        implements OpenConfigHashedValueStatement {
-        Declared(final StmtContext<Void, ?, ?> context) {
-            super(context);
+        Declared(final StatementDefinition definition,
+                final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+            super(substatements);
+            this.definition = requireNonNull(definition);
         }
 
         @Override
-        public Void getArgument() {
-            return null;
+        public StatementDefinition statementDefinition() {
+            return definition;
         }
     }
 
@@ -40,8 +48,9 @@ abstract class AbstractHashedValueStatementSupport
 
         private final SchemaPath path;
 
-        Effective(final StmtContext<Void, OpenConfigHashedValueStatement, ?> ctx) {
-            super(ctx);
+        Effective(final StmtContext<Void, OpenConfigHashedValueStatement, ?> ctx,
+                final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+            super(ctx, substatements);
             path = ctx.coerceParentContext().getSchemaPath().get().createChild(
                 ctx.getPublicDefinition().getStatementName());
         }
@@ -66,19 +75,35 @@ abstract class AbstractHashedValueStatementSupport
     }
 
     @Override
-    public final OpenConfigHashedValueStatement createDeclared(
+    protected final SubstatementValidator getSubstatementValidator() {
+        return validator;
+    }
+
+    @Override
+    protected final OpenConfigHashedValueStatement createDeclared(
+            final StmtContext<Void, OpenConfigHashedValueStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new Declared(getPublicView(), substatements);
+    }
+
+    @Override
+    protected final OpenConfigHashedValueStatement createEmptyDeclared(
             final StmtContext<Void, OpenConfigHashedValueStatement, ?> ctx) {
-        return new Declared(ctx);
+        return createDeclared(ctx, ImmutableList.of());
     }
 
     @Override
-    public final OpenConfigHashedValueEffectiveStatement createEffective(
-            final StmtContext<Void, OpenConfigHashedValueStatement, OpenConfigHashedValueEffectiveStatement> ctx) {
-        return new Effective(ctx);
+    protected final OpenConfigHashedValueEffectiveStatement createEffective(
+            final StmtContext<Void, OpenConfigHashedValueStatement, OpenConfigHashedValueEffectiveStatement> ctx,
+            final OpenConfigHashedValueStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new Effective(ctx, substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return validator;
+    protected final OpenConfigHashedValueEffectiveStatement createEmptyEffective(
+            final StmtContext<Void, OpenConfigHashedValueStatement, OpenConfigHashedValueEffectiveStatement> ctx,
+            final OpenConfigHashedValueStatement declared) {
+        return createEffective(ctx, declared, ImmutableList.of());
     }
 }
index 6d3a6a3a8b7a4ebc5162c5a8d0c5673e8619046b..d69f200bf224432e65542146d11b22cf3364162d 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.rfc6241.model.api;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
 
 /**
@@ -16,5 +17,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
  */
 @Beta
 public interface GetFilterElementAttributesStatement extends UnknownStatement<Void> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return NetconfStatements.GET_FILTER_ELEMENT_ATTRIBUTES;
+    }
 }
index 5d481433536b28a95c28ff606b4024bb2ce25c3a..92fa12798d43cb1575fd6550c0dc155564a08802 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.rfc6241.parser;
 
 import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.rfc6241.model.api.GetFilterElementAttributesEffectiveStatement;
 import org.opendaylight.yangtools.rfc6241.model.api.GetFilterElementAttributesSchemaNode;
@@ -16,10 +17,12 @@ import org.opendaylight.yangtools.rfc6241.model.api.NetconfStatements;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 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.rfc7950.stmt.AbstractDeclaredStatement.WithoutArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseVoidStatementSupport;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractVoidStatementSupport;
 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;
@@ -27,19 +30,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Beta
-public final class GetFilterElementAttributesStatementSupport
-    extends AbstractVoidStatementSupport<GetFilterElementAttributesStatement,
-        GetFilterElementAttributesEffectiveStatement> {
-
-    private static final class Declared extends AbstractDeclaredStatement<Void>
-            implements GetFilterElementAttributesStatement {
-        Declared(final StmtContext<Void, ?, ?> context) {
-            super(context);
-        }
+public final class GetFilterElementAttributesStatementSupport extends BaseVoidStatementSupport<
+        GetFilterElementAttributesStatement, GetFilterElementAttributesEffectiveStatement> {
 
-        @Override
-        public Void getArgument() {
-            return null;
+    private static final class Declared extends WithSubstatements implements GetFilterElementAttributesStatement {
+        static final @NonNull Declared EMPTY = new Declared(ImmutableList.of());
+
+        Declared(final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+            super(substatements);
         }
     }
 
@@ -48,8 +46,9 @@ public final class GetFilterElementAttributesStatementSupport
             implements GetFilterElementAttributesEffectiveStatement, GetFilterElementAttributesSchemaNode {
         private final @NonNull SchemaPath path;
 
-        Effective(final StmtContext<Void, GetFilterElementAttributesStatement, ?> ctx) {
-            super(ctx);
+        Effective(final StmtContext<Void, GetFilterElementAttributesStatement, ?> ctx,
+                final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+            super(ctx, substatements);
             path = ctx.coerceParentContext().getSchemaPath().get().createChild(
                 ctx.getPublicDefinition().getStatementName());
         }
@@ -82,27 +81,45 @@ public final class GetFilterElementAttributesStatementSupport
     }
 
     @Override
-    public GetFilterElementAttributesStatement createDeclared(
-            final StmtContext<Void, GetFilterElementAttributesStatement, ?> ctx) {
-        return new Declared(ctx);
+    public void onFullDefinitionDeclared(final Mutable<Void, GetFilterElementAttributesStatement,
+            GetFilterElementAttributesEffectiveStatement> stmt) {
+        super.onFullDefinitionDeclared(stmt);
+        stmt.setIsSupportedToBuildEffective(computeSupported(stmt));
     }
 
     @Override
-    public GetFilterElementAttributesEffectiveStatement createEffective(final StmtContext<Void,
-            GetFilterElementAttributesStatement, GetFilterElementAttributesEffectiveStatement> ctx) {
-        return new Effective(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return validator;
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return validator;
+    protected GetFilterElementAttributesStatement createDeclared(
+            final StmtContext<Void, GetFilterElementAttributesStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new Declared(substatements);
     }
 
     @Override
-    public void onFullDefinitionDeclared(final Mutable<Void, GetFilterElementAttributesStatement,
-            GetFilterElementAttributesEffectiveStatement> stmt) {
-        super.onFullDefinitionDeclared(stmt);
-        stmt.setIsSupportedToBuildEffective(computeSupported(stmt));
+    protected GetFilterElementAttributesStatement createEmptyDeclared(
+            final StmtContext<Void, GetFilterElementAttributesStatement, ?> ctx) {
+        return Declared.EMPTY;
+    }
+
+    @Override
+    protected GetFilterElementAttributesEffectiveStatement createEffective(
+            final StmtContext<Void, GetFilterElementAttributesStatement,
+                GetFilterElementAttributesEffectiveStatement> ctx,
+            final GetFilterElementAttributesStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new Effective(ctx, substatements);
+    }
+
+    @Override
+    protected GetFilterElementAttributesEffectiveStatement createEmptyEffective(
+            final StmtContext<Void, GetFilterElementAttributesStatement,
+                GetFilterElementAttributesEffectiveStatement> ctx,
+            final GetFilterElementAttributesStatement declared) {
+        return createEffective(ctx, declared, ImmutableList.of());
     }
 
     private static boolean computeSupported(final StmtContext<?, ?, ?> stmt) {
index 4982510eaf3f5bcb3a9c7bc02b1397aa2e606e13..f386bcc68bab5d058f1c72ae059b09d24ca30a92 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.rfc6536.model.api;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 /**
  * Effective statement representation of 'default-deny-all' extension defined in
@@ -16,5 +17,8 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
  */
 @Beta
 public interface DefaultDenyAllEffectiveStatement extends EffectiveStatement<Void, DefaultDenyAllStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return NACMStatements.DEFAULT_DENY_ALL;
+    }
 }
index 7bab5ef5193bb5e3b3c749e860296edc930509f9..1be4602731f073143405a628194ae03c6184a8ce 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.rfc6536.model.api;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
 
 /**
@@ -16,5 +17,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
  */
 @Beta
 public interface DefaultDenyAllStatement extends UnknownStatement<Void> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return NACMStatements.DEFAULT_DENY_ALL;
+    }
 }
index bd19179fce98759bc571d2cd6aa9d82eb2960118..6e749fdfbe20328cc8db216fbebbdec3bc035e51 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.rfc6536.model.api;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 /**
  * Effective statement representation of 'default-deny-write' extension defined in
@@ -16,5 +17,8 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
  */
 @Beta
 public interface DefaultDenyWriteEffectiveStatement extends EffectiveStatement<Void, DefaultDenyWriteStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return NACMStatements.DEFAULT_DENY_WRITE;
+    }
 }
index 9fd65e1c11730cbaa583c7d2345c11691a1c3a30..856dc8f34e25640089ae91c97c2decac34039310 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.rfc6536.model.api;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
 
 /**
@@ -16,5 +17,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
  */
 @Beta
 public interface DefaultDenyWriteStatement extends UnknownStatement<Void> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return NACMStatements.DEFAULT_DENY_WRITE;
+    }
 }
index 32c301c3efc3496c338450f14bae29fabccf7a84..ae88222e07834f62179953bfcb9f8d4b9095ad1d 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.rfc6536.parser;
 
+import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.rfc6536.model.api.DefaultDenyAllEffectiveStatement;
 import org.opendaylight.yangtools.rfc6536.model.api.DefaultDenyAllSchemaNode;
@@ -14,24 +15,22 @@ import org.opendaylight.yangtools.rfc6536.model.api.DefaultDenyAllStatement;
 import org.opendaylight.yangtools.rfc6536.model.api.NACMStatements;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+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.rfc7950.stmt.AbstractDeclaredStatement.WithoutArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseVoidStatementSupport;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractVoidStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
 public final class DefaultDenyAllStatementSupport
-        extends AbstractVoidStatementSupport<DefaultDenyAllStatement, DefaultDenyAllEffectiveStatement> {
+        extends BaseVoidStatementSupport<DefaultDenyAllStatement, DefaultDenyAllEffectiveStatement> {
+    private static final class Declared extends WithSubstatements implements DefaultDenyAllStatement {
+        static final @NonNull Declared EMPTY = new Declared(ImmutableList.of());
 
-    private static final class Declared extends AbstractDeclaredStatement<Void> implements DefaultDenyAllStatement {
-        Declared(final StmtContext<Void, ?, ?> context) {
-            super(context);
-        }
-
-        @Override
-        public Void getArgument() {
-            return null;
+        Declared(final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+            super(substatements);
         }
     }
 
@@ -39,8 +38,9 @@ public final class DefaultDenyAllStatementSupport
             implements DefaultDenyAllEffectiveStatement, DefaultDenyAllSchemaNode {
         private final @NonNull SchemaPath path;
 
-        Effective(final StmtContext<Void, DefaultDenyAllStatement, ?> ctx) {
-            super(ctx);
+        Effective(final StmtContext<Void, DefaultDenyAllStatement, ?> ctx,
+                final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+            super(ctx, substatements);
             path = ctx.coerceParentContext().getSchemaPath().get().createChild(
                 ctx.getPublicDefinition().getStatementName());
         }
@@ -63,7 +63,7 @@ public final class DefaultDenyAllStatementSupport
     private final SubstatementValidator validator;
 
     private DefaultDenyAllStatementSupport(final StatementDefinition definition) {
-        super(definition, CopyPolicy.CONTEXT_INDEPENDENT);
+        super(definition);
         this.validator = SubstatementValidator.builder(definition).build();
     }
 
@@ -72,18 +72,33 @@ public final class DefaultDenyAllStatementSupport
     }
 
     @Override
-    public DefaultDenyAllStatement createDeclared(final StmtContext<Void, DefaultDenyAllStatement, ?> ctx) {
-        return new Declared(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return validator;
     }
 
     @Override
-    public DefaultDenyAllEffectiveStatement createEffective(
-            final StmtContext<Void, DefaultDenyAllStatement, DefaultDenyAllEffectiveStatement> ctx) {
-        return new Effective(ctx);
+    protected DefaultDenyAllStatement createDeclared(final StmtContext<Void, DefaultDenyAllStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new Declared(substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return validator;
+    protected DefaultDenyAllStatement createEmptyDeclared(final StmtContext<Void, DefaultDenyAllStatement, ?> ctx) {
+        return Declared.EMPTY;
+    }
+
+    @Override
+    protected DefaultDenyAllEffectiveStatement createEffective(
+            final StmtContext<Void, DefaultDenyAllStatement, DefaultDenyAllEffectiveStatement> ctx,
+            final DefaultDenyAllStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new Effective(ctx, substatements);
+    }
+
+    @Override
+    protected DefaultDenyAllEffectiveStatement createEmptyEffective(
+            final StmtContext<Void, DefaultDenyAllStatement, DefaultDenyAllEffectiveStatement> ctx,
+            final DefaultDenyAllStatement declared) {
+        return createEffective(ctx, declared, ImmutableList.of());
     }
 }
index d7f97ca074587ea9bd598faed8f0f184c79d1c82..a3a9400668488fa2b73e5be7ee1d69ca896313d9 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.rfc6536.parser;
 
+import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.rfc6536.model.api.DefaultDenyWriteEffectiveStatement;
 import org.opendaylight.yangtools.rfc6536.model.api.DefaultDenyWriteSchemaNode;
@@ -14,24 +15,22 @@ import org.opendaylight.yangtools.rfc6536.model.api.DefaultDenyWriteStatement;
 import org.opendaylight.yangtools.rfc6536.model.api.NACMStatements;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+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.rfc7950.stmt.AbstractDeclaredStatement.WithoutArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseVoidStatementSupport;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractVoidStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
 public final class DefaultDenyWriteStatementSupport
-    extends AbstractVoidStatementSupport<DefaultDenyWriteStatement, DefaultDenyWriteEffectiveStatement> {
+        extends BaseVoidStatementSupport<DefaultDenyWriteStatement, DefaultDenyWriteEffectiveStatement> {
+    private static final class Declared extends WithSubstatements implements DefaultDenyWriteStatement {
+        static final @NonNull Declared EMPTY = new Declared(ImmutableList.of());
 
-    private static final class Declared extends AbstractDeclaredStatement<Void> implements DefaultDenyWriteStatement {
-        Declared(final StmtContext<Void, ?, ?> context) {
-            super(context);
-        }
-
-        @Override
-        public Void getArgument() {
-            return null;
+        Declared(final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+            super(substatements);
         }
     }
 
@@ -39,8 +38,9 @@ public final class DefaultDenyWriteStatementSupport
             implements DefaultDenyWriteEffectiveStatement, DefaultDenyWriteSchemaNode {
         private final @NonNull SchemaPath path;
 
-        Effective(final StmtContext<Void, DefaultDenyWriteStatement, ?> ctx) {
-            super(ctx);
+        Effective(final StmtContext<Void, DefaultDenyWriteStatement, ?> ctx,
+                final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+            super(ctx, substatements);
             path = ctx.coerceParentContext().getSchemaPath().get().createChild(
                 ctx.getPublicDefinition().getStatementName());
         }
@@ -72,18 +72,33 @@ public final class DefaultDenyWriteStatementSupport
     }
 
     @Override
-    public DefaultDenyWriteStatement createDeclared(final StmtContext<Void, DefaultDenyWriteStatement, ?> ctx) {
-        return new Declared(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return validator;
     }
 
     @Override
-    public DefaultDenyWriteEffectiveStatement createEffective(
-            final StmtContext<Void, DefaultDenyWriteStatement, DefaultDenyWriteEffectiveStatement> ctx) {
-        return new Effective(ctx);
+    protected DefaultDenyWriteStatement createDeclared(final StmtContext<Void, DefaultDenyWriteStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new Declared(substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return validator;
+    protected DefaultDenyWriteStatement createEmptyDeclared(final StmtContext<Void, DefaultDenyWriteStatement, ?> ctx) {
+        return Declared.EMPTY;
+    }
+
+    @Override
+    protected DefaultDenyWriteEffectiveStatement createEffective(
+            final StmtContext<Void, DefaultDenyWriteStatement, DefaultDenyWriteEffectiveStatement> ctx,
+            final DefaultDenyWriteStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new Effective(ctx, substatements);
+    }
+
+    @Override
+    protected DefaultDenyWriteEffectiveStatement createEmptyEffective(
+            final StmtContext<Void, DefaultDenyWriteStatement, DefaultDenyWriteEffectiveStatement> ctx,
+            final DefaultDenyWriteStatement declared) {
+        return createEffective(ctx, declared, ImmutableList.of());
     }
 }
index 86d9e4fb2c1b79d8c0b642d773156f435efd1435..fd0a5c5ebbed6bf9229c067acb475c95dfe374a3 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.rfc7952.model.api;
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.common.QName;
 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.TypeDefinitionAware;
 
 /**
@@ -19,5 +20,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypeDefinitionAware;
 @Beta
 public interface AnnotationEffectiveStatement extends EffectiveStatement<QName, AnnotationStatement>,
         TypeDefinitionAware {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return MetadataStatements.ANNOTATION;
+    }
 }
index 303b1f701e3e382ee504465b0a350e9106b658e6..333e285331f97af153effa960622a3cede980fd2 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.rfc7952.model.api;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.DocumentedDeclaredStatement.WithStatus;
 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureAwareDeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeAwareDeclaredStatement;
@@ -20,6 +21,9 @@ import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
  */
 @Beta
 public interface AnnotationStatement extends UnknownStatement<QName>, WithStatus<QName>,
-    IfFeatureAwareDeclaredStatement<QName>, TypeAwareDeclaredStatement {
-
+        IfFeatureAwareDeclaredStatement<QName>, TypeAwareDeclaredStatement {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return MetadataStatements.ANNOTATION;
+    }
 }
index 28c851c7216290334403a79c3180fb2d59d0621d..9ce4521c93c00d860b78581e663d8372ca1e16d6 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.rfc7952.parser;
 
+import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.rfc7952.model.api.AnnotationEffectiveStatement;
 import org.opendaylight.yangtools.rfc7952.model.api.AnnotationSchemaNode;
@@ -16,14 +17,16 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 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.TypeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement;
 import org.opendaylight.yangtools.yang.model.util.type.ConcreteTypeBuilder;
 import org.opendaylight.yangtools.yang.model.util.type.ConcreteTypes;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
 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;
@@ -31,16 +34,11 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 public final class AnnotationStatementSupport
-        extends AbstractStatementSupport<QName, AnnotationStatement, AnnotationEffectiveStatement> {
+        extends BaseStatementSupport<QName, AnnotationStatement, AnnotationEffectiveStatement> {
 
-    private static final class Declared extends AbstractDeclaredStatement<QName> implements AnnotationStatement {
-        Declared(final StmtContext<QName, ?, ?> context) {
-            super(context);
-        }
-
-        @Override
-        public QName getArgument() {
-            return argument();
+    private static final class Declared extends WithSubstatements implements AnnotationStatement {
+        Declared(final QName argument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+            super(argument, substatements);
         }
     }
 
@@ -50,8 +48,9 @@ public final class AnnotationStatementSupport
         private final @NonNull TypeDefinition<?> type;
         private final @NonNull SchemaPath path;
 
-        Effective(final StmtContext<QName, AnnotationStatement, ?> ctx) {
-            super(ctx);
+        Effective(final StmtContext<QName, AnnotationStatement, ?> ctx,
+                final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+            super(ctx, substatements);
             path = ctx.coerceParentContext().getSchemaPath().get().createChild(argument());
 
             final TypeEffectiveStatement<?> typeStmt = SourceException.throwIfNull(
@@ -111,17 +110,6 @@ public final class AnnotationStatementSupport
         return INSTANCE;
     }
 
-    @Override
-    public AnnotationStatement createDeclared(final StmtContext<QName, AnnotationStatement, ?> ctx) {
-        return new Declared(ctx);
-    }
-
-    @Override
-    public AnnotationEffectiveStatement createEffective(
-            final StmtContext<QName, AnnotationStatement, AnnotationEffectiveStatement> ctx) {
-        return new Effective(ctx);
-    }
-
     @Override
     public QName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
         return StmtContextUtils.parseIdentifier(ctx, value);
@@ -139,4 +127,30 @@ public final class AnnotationStatementSupport
     protected SubstatementValidator getSubstatementValidator() {
         return validator;
     }
+
+    @Override
+    protected AnnotationStatement createDeclared(final StmtContext<QName, AnnotationStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new Declared(ctx.coerceStatementArgument(), substatements);
+    }
+
+    @Override
+    protected AnnotationStatement createEmptyDeclared(final StmtContext<QName, AnnotationStatement, ?> ctx) {
+        return createDeclared(ctx, ImmutableList.of());
+    }
+
+    @Override
+    protected AnnotationEffectiveStatement createEffective(
+            final StmtContext<QName, AnnotationStatement, AnnotationEffectiveStatement> ctx,
+            final AnnotationStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new Effective(ctx, substatements);
+    }
+
+    @Override
+    protected AnnotationEffectiveStatement createEmptyEffective(
+            final StmtContext<QName, AnnotationStatement, AnnotationEffectiveStatement> ctx,
+            final AnnotationStatement declared) {
+        return new Effective(ctx, ImmutableList.of());
+    }
 }
index 64c48eda296086592b392d84c90635e328d77ec1..9cc7a3a667e2231a0f88aae2d5c416aaf9e1f08a 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.rfc8040.model.api;
 
 import com.google.common.annotations.Beta;
 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.ContainerEffectiveStatement;
 
 /**
@@ -17,6 +18,10 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatemen
  */
 @Beta
 public interface YangDataEffectiveStatement extends EffectiveStatement<String, YangDataStatement> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangDataStatements.YANG_DATA;
+    }
 
     /**
      * Return the container statement defined in this yang-data statement instance.
index a3a0a702227756ad7a6d97e1c094de09f3c8ac31..2b8aad0958882a5f47d16d26d1f33e6474caec6b 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.rfc8040.model.api;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
 
 /**
@@ -16,5 +17,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
  */
 @Beta
 public interface YangDataStatement extends UnknownStatement<String> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangDataStatements.YANG_DATA;
+    }
 }
index d1e2b4a124c064e7df64ac656f269bba163ff51c..ac0b0664e53653042e3093050961b9354a8b0364 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.rfc8040.parser;
 import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Verify;
+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.YangDataSchemaNode;
@@ -17,6 +18,7 @@ import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
@@ -30,8 +32,9 @@ final class YangDataEffectiveStatementImpl extends UnknownEffectiveStatementBase
     private final @NonNull QName maybeQNameArgument;
     private final @NonNull ContainerEffectiveStatement container;
 
-    YangDataEffectiveStatementImpl(final StmtContext<String, YangDataStatement, ?> ctx) {
-        super(ctx);
+    YangDataEffectiveStatementImpl(final StmtContext<String, YangDataStatement, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(ctx, substatements);
 
         QName maybeQNameArgumentInit;
         try {
index 799b767d551d141a3219caa8b6306f11aebc317f..5e71b1677cab472dba60e401e2f7fbfbda258388 100644 (file)
@@ -8,32 +8,31 @@
 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.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, YangDataEffectiveStatement> {
+        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,46 +53,55 @@ public final class YangDataStatementSupport
     }
 
     @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 YangDataEffectiveStatement createEffective(
-            final StmtContext<String, YangDataStatement, YangDataEffectiveStatement> 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, 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);
-        }
+    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 StmtContext<String, YangDataStatement, YangDataEffectiveStatement> ctx,
+            final YangDataStatement declared, 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(ctx);
+        return new YangDataEffectiveStatementImpl(ctx, substatements);
+    }
+
+    @Override
+    protected YangDataEffectiveStatement createEmptyEffective(
+            final StmtContext<String, YangDataStatement, YangDataEffectiveStatement> ctx,
+            final YangDataStatement declared) {
+        return createEffective(ctx, declared, ImmutableList.of());
     }
-}
\ No newline at end of file
+}
index e6308ac40c911b513961bbc3afa2418dace01c39..96aaa1476c59a9c1c253a0c2ff3984316f688a8c 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.rfc8528.model.api;
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 /**
  * Effective statement representation of 'mount-point' extension defined in
@@ -17,5 +18,8 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
  */
 @Beta
 public interface MountPointEffectiveStatement extends EffectiveStatement<QName, MountPointStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return SchemaMountStatements.MOUNT_POINT;
+    }
 }
index a81087a4462243efc7484f6a32362be443ee8d82..bfd817987d2a7f07dc0d260e545b83cb88a4c8a6 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.rfc8528.model.api;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatementAwareDeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DocumentedDeclaredStatement.WithStatus;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
@@ -19,6 +20,9 @@ import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
  */
 @Beta
 public interface MountPointStatement extends UnknownStatement<QName>, WithStatus<QName>,
-    ConfigStatementAwareDeclaredStatement<QName> {
-
+        ConfigStatementAwareDeclaredStatement<QName> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return SchemaMountStatements.MOUNT_POINT;
+    }
 }
index a8367b1d686f9cee08dfde77d4a3019b40be9f96..8d491c65fba1860a8844da01dbc5ffbc204a6922 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.rfc8528.parser;
 
+import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.rfc8528.model.api.MountPointEffectiveStatement;
 import org.opendaylight.yangtools.rfc8528.model.api.MountPointSchemaNode;
@@ -16,10 +17,12 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 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.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
 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;
@@ -27,16 +30,11 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 public final class MountPointStatementSupport
-        extends AbstractStatementSupport<QName, MountPointStatement, MountPointEffectiveStatement> {
+        extends BaseQNameStatementSupport<MountPointStatement, MountPointEffectiveStatement> {
 
-    private static final class Declared extends AbstractDeclaredStatement<QName> implements MountPointStatement {
-        Declared(final StmtContext<QName, ?, ?> context) {
-            super(context);
-        }
-
-        @Override
-        public QName getArgument() {
-            return argument();
+    private static final class Declared extends WithSubstatements implements MountPointStatement {
+        Declared(final QName argument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+            super(argument, substatements);
         }
     }
 
@@ -45,8 +43,9 @@ public final class MountPointStatementSupport
 
         private final @NonNull SchemaPath path;
 
-        Effective(final StmtContext<QName, MountPointStatement, ?> ctx) {
-            super(ctx);
+        Effective(final StmtContext<QName, MountPointStatement, ?> ctx,
+                final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+            super(ctx, substatements);
             path = ctx.coerceParentContext().getSchemaPath().get().createChild(argument());
         }
 
@@ -81,17 +80,6 @@ public final class MountPointStatementSupport
         return INSTANCE;
     }
 
-    @Override
-    public MountPointStatement createDeclared(final StmtContext<QName, MountPointStatement, ?> ctx) {
-        return new Declared(ctx);
-    }
-
-    @Override
-    public MountPointEffectiveStatement createEffective(
-            final StmtContext<QName, MountPointStatement, MountPointEffectiveStatement> ctx) {
-        return new Effective(ctx);
-    }
-
     @Override
     public QName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
         return StmtContextUtils.parseIdentifier(ctx, value);
@@ -114,4 +102,29 @@ public final class MountPointStatementSupport
     protected SubstatementValidator getSubstatementValidator() {
         return validator;
     }
+
+    @Override
+    protected MountPointStatement createDeclared(@NonNull final StmtContext<QName, MountPointStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new Declared(ctx.coerceStatementArgument(), substatements);
+    }
+
+    @Override
+    protected MountPointStatement createEmptyDeclared(final StmtContext<QName, MountPointStatement, ?> ctx) {
+        return createDeclared(ctx, ImmutableList.of());
+    }
+
+    @Override
+    protected MountPointEffectiveStatement createEffective(
+            final StmtContext<QName, MountPointStatement, MountPointEffectiveStatement> ctx,
+            final MountPointStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new Effective(ctx, substatements);
+    }
+
+    @Override
+    protected MountPointEffectiveStatement createEmptyEffective(
+            final StmtContext<QName, MountPointStatement, MountPointEffectiveStatement> ctx,
+            final MountPointStatement declared) {
+        return createEffective(ctx, declared, ImmutableList.of());
+    }
 }
index 21b95be57201dbf28c1b74d738a5bc8abdc583a4..9f70836e2e2105a44142dfe19fd750e0e7280217 100644 (file)
@@ -7,12 +7,14 @@
  */
 package org.opendaylight.yangtools.yang.parser.openconfig.stmt;
 
+import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.SemVer;
 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigVersionEffectiveStatement;
 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigVersionStatement;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
@@ -22,8 +24,9 @@ final class OpenConfigVersionEffectiveStatementImpl extends
 
     private final @NonNull SchemaPath path;
 
-    OpenConfigVersionEffectiveStatementImpl(final StmtContext<SemVer, OpenConfigVersionStatement, ?> ctx) {
-        super(ctx);
+    OpenConfigVersionEffectiveStatementImpl(final StmtContext<SemVer, OpenConfigVersionStatement, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(ctx, substatements);
         path = ctx.coerceParentContext().getSchemaPath().get().createChild(getNodeType());
     }
 
index 659a350e126845118fdf27374550dbedb640b360..c0b1e92c6bb323fd539d9c96439416af013893a5 100644 (file)
@@ -7,14 +7,16 @@
  */
 package org.opendaylight.yangtools.yang.parser.openconfig.stmt;
 
+import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.concepts.SemVer;
 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigVersionStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.ArgumentToString.WithSubstatements;
 
-final class OpenConfigVersionStatementImpl extends AbstractDeclaredStatement<SemVer>
+final class OpenConfigVersionStatementImpl extends WithSubstatements<SemVer>
         implements OpenConfigVersionStatement {
-    OpenConfigVersionStatementImpl(final StmtContext<SemVer, OpenConfigVersionStatement, ?> context) {
-        super(context);
+    OpenConfigVersionStatementImpl(final SemVer argument,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(argument, substatements);
     }
 }
index 7a827a7fe2585beade15e2720e9003ef73dbdd1b..fabf32bc7e0a35fea36c87e4e0498cd29935fab1 100644 (file)
@@ -7,18 +7,21 @@
  */
 package org.opendaylight.yangtools.yang.parser.openconfig.stmt;
 
+import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.concepts.SemVer;
 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigStatements;
 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigVersionEffectiveStatement;
 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigVersionStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SemanticVersionNamespace;
 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;
 
 public final class OpenConfigVersionSupport
-        extends AbstractStatementSupport<SemVer, OpenConfigVersionStatement, OpenConfigVersionEffectiveStatement> {
+        extends BaseStatementSupport<SemVer, OpenConfigVersionStatement, OpenConfigVersionEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(
         OpenConfigStatements.OPENCONFIG_VERSION).build();
     private static final OpenConfigVersionSupport INSTANCE = new OpenConfigVersionSupport();
@@ -43,18 +46,34 @@ public final class OpenConfigVersionSupport
     }
 
     @Override
-    public OpenConfigVersionStatement createDeclared(final StmtContext<SemVer, OpenConfigVersionStatement, ?> ctx) {
-        return new OpenConfigVersionStatementImpl(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
     }
 
     @Override
-    public OpenConfigVersionEffectiveStatement createEffective(
-            final StmtContext<SemVer, OpenConfigVersionStatement, OpenConfigVersionEffectiveStatement> ctx) {
-        return new OpenConfigVersionEffectiveStatementImpl(ctx);
+    protected OpenConfigVersionStatement createDeclared(final StmtContext<SemVer, OpenConfigVersionStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new OpenConfigVersionStatementImpl(ctx.coerceStatementArgument(), substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+    protected OpenConfigVersionStatement createEmptyDeclared(
+            final StmtContext<SemVer, OpenConfigVersionStatement, ?> ctx) {
+        return createDeclared(ctx, ImmutableList.of());
+    }
+
+    @Override
+    protected OpenConfigVersionEffectiveStatement createEffective(
+            final StmtContext<SemVer, OpenConfigVersionStatement, OpenConfigVersionEffectiveStatement> ctx,
+            final OpenConfigVersionStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new OpenConfigVersionEffectiveStatementImpl(ctx, substatements);
+    }
+
+    @Override
+    protected OpenConfigVersionEffectiveStatement createEmptyEffective(
+            final StmtContext<SemVer, OpenConfigVersionStatement, OpenConfigVersionEffectiveStatement> ctx,
+            final OpenConfigVersionStatement declared) {
+        return createEffective(ctx, declared, ImmutableList.of());
     }
-}
\ No newline at end of file
+}
index 4e0a7bffbb4ee16c80807faecf030d0b06d19aca..57e9142bd726138eb86fa68dbd7e0d41c80328a1 100644 (file)
@@ -200,4 +200,29 @@ public abstract class AbstractDeclaredStatement<A> extends AbstractModelStatemen
             return argument.toString();
         }
     }
+
+    public abstract static class WithoutArgument extends AbstractDeclaredStatement<Void> {
+        public abstract static class WithSubstatements extends WithoutArgument {
+            private final @NonNull Object substatements;
+
+            protected WithSubstatements(final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+                this.substatements = maskList(substatements);
+            }
+
+            @Override
+            public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
+                return unmaskList(substatements);
+            }
+        }
+
+        @Override
+        public final Void argument() {
+            return null;
+        }
+
+        @Override
+        public final String rawArgument() {
+            return null;
+        }
+    }
 }
index 6560a27cf49381ebed155fd33cb5db5dc7d6c9a3..24b40f0014070794a5ec723906a6452f37fa6a9c 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.Beta;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
@@ -40,13 +42,12 @@ public abstract class AbstractEffectiveDocumentedNodeWithStatus<A, D extends Dec
      *
      * @param ctx context of statement.
      */
-    protected AbstractEffectiveDocumentedNodeWithStatus(final StmtContext<A, D, ?> ctx) {
+    protected AbstractEffectiveDocumentedNodeWithStatus(final StmtContext<A, D, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
         argument = ctx.getStatementArgument();
         statementSource = ctx.getStatementSource();
         declaredInstance = ctx.buildDeclared();
-        substatements = ImmutableList.copyOf(
-            Collections2.transform(Collections2.filter(BaseStatementSupport.declaredSubstatements(ctx),
-                StmtContext::isSupportedToBuildEffective), StmtContext::buildEffective));
+        this.substatements = requireNonNull(substatements);
     }
 
     @Override
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseVoidStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseVoidStatementSupport.java
new file mode 100644 (file)
index 0000000..2172612
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt;
+
+import com.google.common.annotations.Beta;
+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.StmtContext;
+
+@Beta
+public abstract class BaseVoidStatementSupport<D extends DeclaredStatement<Void>, E extends EffectiveStatement<Void, D>>
+        extends BaseStatementSupport<Void, D, E> {
+    protected BaseVoidStatementSupport(final StatementDefinition publicDefinition) {
+        super(publicDefinition, CopyPolicy.CONTEXT_INDEPENDENT);
+    }
+
+    @Override
+    public final Void parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+        return null;
+    }
+}
index 2f1e6f0c7ecaec14ee0d39e04ac31c0395956d8c..38362a952aff67d22a82cb39323f225545e24c64 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
@@ -30,8 +31,9 @@ public abstract class UnknownEffectiveStatementBase<A, D extends UnknownStatemen
     private final QName nodeType;
     private final String nodeParameter;
 
-    protected UnknownEffectiveStatementBase(final StmtContext<A, D, ?> ctx) {
-        super(ctx);
+    protected UnknownEffectiveStatementBase(final StmtContext<A, D, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(ctx, substatements);
 
         final StmtContext<?, ExtensionStatement, ExtensionEffectiveStatement> extensionInit =
                 ctx.getFromNamespace(ExtensionNamespace.class, ctx.getPublicDefinition().getStatementName());
index 4ca8e8c2dafbd3a4eebd9cd7669dc2d794ff3f6b..588df62c7b121eeece53e2deab69e53f6b240fc7 100644 (file)
@@ -7,10 +7,12 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension;
 
+import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
@@ -27,8 +29,9 @@ final class UnrecognizedEffectiveStatementImpl extends UnknownEffectiveStatement
     private final QName maybeQNameArgument;
     private final @NonNull SchemaPath path;
 
-    UnrecognizedEffectiveStatementImpl(final StmtContext<String, UnrecognizedStatement, ?> ctx) {
-        super(ctx);
+    UnrecognizedEffectiveStatementImpl(final StmtContext<String, UnrecognizedStatement, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(ctx, substatements);
 
         // FIXME: Remove following section after fixing 4380
         final UnknownSchemaNode original = (UnknownSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective)
index e60ccdf22258093b7b12244548f845c80b075b8a..5a18c96b1f32a734d3c594485c04e174fca57245 100644 (file)
@@ -7,12 +7,25 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension;
 
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class UnrecognizedStatementImpl extends AbstractDeclaredStatement<String> implements UnrecognizedStatement {
-    UnrecognizedStatementImpl(final StmtContext<String, ?, ?> context) {
-        super(context);
+final class UnrecognizedStatementImpl extends WithSubstatements implements UnrecognizedStatement {
+    private final @NonNull StatementDefinition definition;
+
+    UnrecognizedStatementImpl(final StmtContext<String, ?, ?> context,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(context, substatements);
+        this.definition = context.getPublicDefinition();
+    }
+
+    @Override
+    public StatementDefinition statementDefinition() {
+        return definition;
     }
 }
index d493f3442d7df54351dceaafa2fb73cee78b75cf..cec58c09f145516012047110e6ebc2fff6a96022 100644 (file)
@@ -7,19 +7,22 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension;
 
+import com.google.common.collect.ImmutableList;
 import java.util.Optional;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition;
+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.UnrecognizedEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
-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.StatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 
 final class UnrecognizedStatementSupport
-        extends AbstractStatementSupport<String, UnrecognizedStatement, UnrecognizedEffectiveStatement> {
+        extends BaseStatementSupport<String, UnrecognizedStatement, UnrecognizedEffectiveStatement> {
     UnrecognizedStatementSupport(final StatementDefinition publicDefinition) {
         super(publicDefinition);
     }
@@ -29,22 +32,6 @@ final class UnrecognizedStatementSupport
         return value;
     }
 
-    @Override
-    public UnrecognizedStatement createDeclared(final StmtContext<String, UnrecognizedStatement, ?> ctx) {
-        return new UnrecognizedStatementImpl(ctx);
-    }
-
-    @Override
-    public UnrecognizedEffectiveStatement createEffective(
-            final StmtContext<String, UnrecognizedStatement, UnrecognizedEffectiveStatement> ctx) {
-        return new UnrecognizedEffectiveStatementImpl(ctx);
-    }
-
-    @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return null;
-    }
-
     @Override
     public Optional<StatementSupport<?, ?, ?>> getUnknownStatementDefinitionOf(
             final StatementDefinition yangStmtDef) {
@@ -61,4 +48,36 @@ final class UnrecognizedStatementSupport
         }
         return Optional.of(new ModelDefinedStatementSupport(def));
     }
+
+    @Override
+    protected SubstatementValidator getSubstatementValidator() {
+        return null;
+    }
+
+    @Override
+    protected UnrecognizedStatement createDeclared(final StmtContext<String, UnrecognizedStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new UnrecognizedStatementImpl(ctx, substatements);
+    }
+
+    @Override
+    protected UnrecognizedStatement createEmptyDeclared(final StmtContext<String, UnrecognizedStatement, ?> ctx) {
+        return createDeclared(ctx, ImmutableList.of());
+    }
+
+    @Override
+    protected UnrecognizedEffectiveStatement createEffective(
+            final StmtContext<String, UnrecognizedStatement, UnrecognizedEffectiveStatement> ctx,
+            final UnrecognizedStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new UnrecognizedEffectiveStatementImpl(ctx, substatements);
+    }
+
+    @Override
+    protected UnrecognizedEffectiveStatement createEmptyEffective(
+            final StmtContext<String, UnrecognizedStatement, UnrecognizedEffectiveStatement> ctx,
+            final UnrecognizedStatement declared) {
+        return createEffective(ctx, declared, ImmutableList.of());
+    }
+
 }
\ No newline at end of file
index ba5f8b681f2d01eb78fb60efeee1458d6c3fbcf3..abff9fe21d73d356f1dfeea8ebe3628c8738324d 100644 (file)
@@ -7,9 +7,11 @@
  */
 package org.opendaylight.yangtools.yang.thirdparty.plugin;
 
+import com.google.common.collect.ImmutableList;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
@@ -20,8 +22,9 @@ final class ThirdPartyExtensionEffectiveStatementImpl
     private final @NonNull SchemaPath path;
     private final String valueFromNamespace;
 
-    ThirdPartyExtensionEffectiveStatementImpl(final StmtContext<String, ThirdPartyExtensionStatement, ?> ctx) {
-        super(ctx);
+    ThirdPartyExtensionEffectiveStatementImpl(final StmtContext<String, ThirdPartyExtensionStatement, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(ctx, substatements);
         path = ctx.coerceParentContext().getSchemaPath().get().createChild(getNodeType());
         valueFromNamespace = ctx.getFromNamespace(ThirdPartyNamespace.class, ctx);
     }
index 75173df3fcc71364712d382c8e90f42c42e165c6..6161777ec0f12bd45c3bfcea05e11fbfa4a88d21 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.thirdparty.plugin;
 
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
 
 /**
@@ -14,5 +15,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
  * concepts defined in yang-model-api.
  */
 public interface ThirdPartyExtensionStatement extends UnknownStatement<String> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return ThirdPartyExtensionsMapping.THIRD_PARTY_EXTENSION;
+    }
 }
index 686492e9543c8e0da227cb32cb9b1dd5d0468290..de5d4608e0f7221b8b79704f9f565e0e6379f70e 100644 (file)
@@ -7,17 +7,18 @@
  */
 package org.opendaylight.yangtools.yang.thirdparty.plugin;
 
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
 /**
  * Private implementation of {@link ThirdPartyExtensionStatement}. This class can rely on parser internals and should
  * never be exposed to the world.
  */
-final class ThirdPartyExtensionStatementImpl extends AbstractDeclaredStatement<String> implements
-        ThirdPartyExtensionStatement {
-
-    ThirdPartyExtensionStatementImpl(final StmtContext<String, ThirdPartyExtensionStatement, ?> context) {
-        super(context);
+final class ThirdPartyExtensionStatementImpl extends WithSubstatements implements ThirdPartyExtensionStatement {
+    ThirdPartyExtensionStatementImpl(final StmtContext<String, ThirdPartyExtensionStatement, ?> context,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(context, substatements);
     }
 }
index d77f07e695381916d7b1c4a42d7ae2312effd6c9..54a8e3d409065900e21cfb5b848ac4df861948e1 100644 (file)
@@ -7,14 +7,16 @@
  */
 package org.opendaylight.yangtools.yang.thirdparty.plugin;
 
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStringStatementSupport;
 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;
 
-public final class ThirdPartyExtensionSupport extends AbstractStatementSupport<String, ThirdPartyExtensionStatement,
-        EffectiveStatement<String, ThirdPartyExtensionStatement>> {
+public final class ThirdPartyExtensionSupport
+        extends BaseStringStatementSupport<ThirdPartyExtensionStatement, ThirdPartyExtensionEffectiveStatement> {
 
     private static final ThirdPartyExtensionSupport INSTANCE = new ThirdPartyExtensionSupport();
 
@@ -27,30 +29,42 @@ public final class ThirdPartyExtensionSupport extends AbstractStatementSupport<S
     }
 
     @Override
-    public String parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-        return value;
+    public void onFullDefinitionDeclared(
+            final Mutable<String, ThirdPartyExtensionStatement, ThirdPartyExtensionEffectiveStatement> stmt) {
+        super.onFullDefinitionDeclared(stmt);
+        stmt.addToNs(ThirdPartyNamespace.class, stmt, "Third-party namespace test.");
     }
 
     @Override
-    public void onFullDefinitionDeclared(final Mutable<String, ThirdPartyExtensionStatement,
-            EffectiveStatement<String, ThirdPartyExtensionStatement>> stmt) {
-        super.onFullDefinitionDeclared(stmt);
-        stmt.addToNs(ThirdPartyNamespace.class, stmt, "Third-party namespace test.");
+    protected SubstatementValidator getSubstatementValidator() {
+        return null;
     }
 
     @Override
-    public ThirdPartyExtensionStatement createDeclared(final StmtContext<String, ThirdPartyExtensionStatement, ?> ctx) {
-        return new ThirdPartyExtensionStatementImpl(ctx);
+    protected ThirdPartyExtensionStatement createDeclared(
+            final StmtContext<String, ThirdPartyExtensionStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new ThirdPartyExtensionStatementImpl(ctx, substatements);
     }
 
     @Override
-    public EffectiveStatement<String, ThirdPartyExtensionStatement> createEffective(final StmtContext<String,
-            ThirdPartyExtensionStatement, EffectiveStatement<String, ThirdPartyExtensionStatement>> ctx) {
-        return new ThirdPartyExtensionEffectiveStatementImpl(ctx);
+    protected ThirdPartyExtensionStatement createEmptyDeclared(
+            final StmtContext<String, ThirdPartyExtensionStatement, ?> ctx) {
+        return createDeclared(ctx, ImmutableList.of());
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return null;
+    protected ThirdPartyExtensionEffectiveStatement createEffective(
+            final StmtContext<String, ThirdPartyExtensionStatement, ThirdPartyExtensionEffectiveStatement> ctx,
+            final ThirdPartyExtensionStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new ThirdPartyExtensionEffectiveStatementImpl(ctx, substatements);
+    }
+
+    @Override
+    protected ThirdPartyExtensionEffectiveStatement createEmptyEffective(
+            final StmtContext<String, ThirdPartyExtensionStatement, ThirdPartyExtensionEffectiveStatement> ctx,
+            final ThirdPartyExtensionStatement declared) {
+        return createEffective(ctx, declared, ImmutableList.of());
     }
-}
\ No newline at end of file
+}