Reflect supported features in effective model 32/98632/1
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 22 Nov 2021 07:14:21 +0000 (08:14 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 22 Nov 2021 09:06:21 +0000 (10:06 +0100)
We currently do not capture the set of supported features in
EffectiveModelContext aside from applying their effects. Improve this
by not exposing unsupported features in the effective model, so that
users can understand the set of supported features by simply looking
for all FeatureEffectiveStatements.

JIRA: YANGTOOLS-1368
Change-Id: I8c60705ad96854cd2d4dc5d7b97cc2e51dd5a032
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit e4da09169c29d790b3b835a1e88a629758d27435)

parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/meta/FeatureStatementSupport.java
parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug8922Test.java

index 7b78289ef6691a255da318400159675133fd8f12..b85e0b3e2eb7c8f875c8b013e3cc0ce212e7c2ff 100644 (file)
@@ -29,6 +29,8 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
+import org.opendaylight.yangtools.yang.parser.spi.source.SupportedFeaturesNamespace;
+import org.opendaylight.yangtools.yang.parser.spi.source.SupportedFeaturesNamespace.SupportedFeatures;
 
 public final class FeatureStatementSupport
         extends AbstractQNameStatementSupport<FeatureStatement, FeatureEffectiveStatement> {
@@ -53,6 +55,13 @@ public final class FeatureStatementSupport
     public void onFullDefinitionDeclared(final Mutable<QName, FeatureStatement, FeatureEffectiveStatement> stmt) {
         super.onFullDefinitionDeclared(stmt);
         stmt.addContext(FeatureNamespace.class, stmt.getArgument(), stmt);
+
+        // Do not build effective statement if supported features does not include this feature
+        final var supportedFeatures = stmt.getFromNamespace(SupportedFeaturesNamespace.class,
+            SupportedFeatures.SUPPORTED_FEATURES);
+        if (supportedFeatures != null && !supportedFeatures.contains(stmt.getArgument())) {
+            stmt.setIsSupportedToBuildEffective(false);
+        }
     }
 
     @Override
index f66708eacc0af8ba8f210d5ab61d82c3b993a4fd..5ca52d95a08fae717505b7a692bd67ea92675d98 100644 (file)
@@ -18,30 +18,32 @@ import java.util.Optional;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.FeatureEffectiveStatement;
 
 public class Bug8922Test {
-    private static final String NS = "foo";
+    private static final QName MY_CON = QName.create("foo", "my-con");
+    private static final QName TARGET = QName.create("foo", "target");
 
     @Test
     public void testAllFeaturesSupported() throws Exception {
-        final SchemaContext context = StmtTestUtils.parseYangSource("/bugs/bug8922/foo.yang");
+        final var context = StmtTestUtils.parseYangSource("/bugs/bug8922/foo.yang");
         assertNotNull(context);
-        final SchemaNode findNode = context.findDataTreeChild(qN("target"), qN("my-con")).get();
+        final var findNode = context.findDataTreeChild(TARGET, MY_CON).get();
         assertThat(findNode, instanceOf(ContainerSchemaNode.class));
         assertEquals(Optional.of("New description"), findNode.getDescription());
+
+        assertEquals(1, context.findModuleStatements("foo").iterator().next()
+            .streamEffectiveSubstatements(FeatureEffectiveStatement.class).count());
     }
 
     @Test
     public void testNoFeatureSupported() throws Exception {
-        final SchemaContext context = StmtTestUtils.parseYangSource("/bugs/bug8922/foo.yang", ImmutableSet.of());
+        final var context = StmtTestUtils.parseYangSource("/bugs/bug8922/foo.yang", ImmutableSet.of());
         assertNotNull(context);
-        assertEquals(Optional.empty(), context.findDataTreeChild(qN("target"), qN("my-con")));
+        assertEquals(Optional.empty(), context.findDataTreeChild(TARGET, MY_CON));
         assertTrue(context.getAvailableAugmentations().isEmpty());
-    }
 
-    private static QName qN(final String localName) {
-        return QName.create(NS, localName);
+        assertEquals(0, context.findModuleStatements("foo").iterator().next()
+            .streamEffectiveSubstatements(FeatureEffectiveStatement.class).count());
     }
 }