From cf58c213929bfe0f02649dae81e06a89b3cab75c Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 3 Feb 2022 09:43:00 +0100 Subject: [PATCH] Examine supported features in yanglib yang-model-library exposes the features that are actually supported from a particular module. Process this information and pass it to SchemaContextResolver so that it can create a correct EffectiveModelContext. JIRA: MDSAL-719 Change-Id: I32af4cdec4acb823ad90f2608036f0d71210910b Signed-off-by: Robert Varga --- .../src/main/java/module-info.java | 1 + .../yanglib/api/SchemaContextResolver.java | 4 +++- .../rfc7895/MountPointContextFactoryImpl.java | 15 ++++++++++--- .../rfc8525/MountPointContextFactoryImpl.java | 21 ++++++++++++++----- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/yanglib/mdsal-yanglib-api/src/main/java/module-info.java b/yanglib/mdsal-yanglib-api/src/main/java/module-info.java index 1f1cf38f85..a23e6071b9 100644 --- a/yanglib/mdsal-yanglib-api/src/main/java/module-info.java +++ b/yanglib/mdsal-yanglib-api/src/main/java/module-info.java @@ -8,6 +8,7 @@ module org.opendaylight.mdsal.yanglib.api { exports org.opendaylight.mdsal.yanglib.api; + requires transitive org.opendaylight.yangtools.yang.common; requires transitive org.opendaylight.yangtools.yang.model.api; requires transitive org.opendaylight.yangtools.rfc8528.data.api; diff --git a/yanglib/mdsal-yanglib-api/src/main/java/org/opendaylight/mdsal/yanglib/api/SchemaContextResolver.java b/yanglib/mdsal-yanglib-api/src/main/java/org/opendaylight/mdsal/yanglib/api/SchemaContextResolver.java index ea8af299fd..335f7c9652 100644 --- a/yanglib/mdsal-yanglib-api/src/main/java/org/opendaylight/mdsal/yanglib/api/SchemaContextResolver.java +++ b/yanglib/mdsal-yanglib-api/src/main/java/org/opendaylight/mdsal/yanglib/api/SchemaContextResolver.java @@ -9,7 +9,9 @@ package org.opendaylight.mdsal.yanglib.api; import com.google.common.annotations.Beta; import java.util.List; +import java.util.Set; import org.eclipse.jdt.annotation.NonNullByDefault; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.parser.api.YangParserException; @@ -27,5 +29,5 @@ import org.opendaylight.yangtools.yang.parser.api.YangParserException; public interface SchemaContextResolver { EffectiveModelContext resolveSchemaContext(List librarySources, - List requiredSources) throws YangParserException; + List requiredSources, Set supportedFeatures) throws YangParserException; } diff --git a/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/MountPointContextFactoryImpl.java b/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/MountPointContextFactoryImpl.java index 42b562a85e..26557bd507 100644 --- a/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/MountPointContextFactoryImpl.java +++ b/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/MountPointContextFactoryImpl.java @@ -14,8 +14,10 @@ import static java.util.Objects.requireNonNull; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.mdsal.yanglib.api.SchemaContextResolver; @@ -31,6 +33,8 @@ import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory; import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier; import org.opendaylight.yangtools.rfc8528.data.api.YangLibraryConstants.ContainerName; import org.opendaylight.yangtools.rfc8528.data.util.AbstractMountPointContextFactory; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.XMLNamespace; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier; @@ -52,7 +56,7 @@ final class MountPointContextFactoryImpl extends AbstractMountPointContextFactor super(mountId); this.resolver = requireNonNull(resolver); this.yangLibContext = requireNonNull(yangLibContext); - this.codec = requireNonNull(moduleStateCodec); + codec = requireNonNull(moduleStateCodec); } @Override @@ -86,11 +90,16 @@ final class MountPointContextFactoryImpl extends AbstractMountPointContextFactor throws YangParserException { final List requiredSources = new ArrayList<>(); final List librarySources = new ArrayList<>(); + final Set supportedFeatures = new HashSet<>(); for (Module module : modState.nonnullModule().values()) { final SourceReference modRef = sourceRefFor(module, module.getSchema()); + final var namespace = XMLNamespace.of(module.requireNamespace().getValue()); + for (var feature : module.requireFeature()) { + supportedFeatures.add(QName.create(namespace, feature.getValue()).intern()); + } - // TODO: take deviations/features into account + // TODO: take deviations into account if (ConformanceType.Import == module.getConformanceType()) { librarySources.add(modRef); @@ -104,7 +113,7 @@ final class MountPointContextFactoryImpl extends AbstractMountPointContextFactor } } - return resolver.resolveSchemaContext(librarySources, requiredSources); + return resolver.resolveSchemaContext(librarySources, requiredSources, supportedFeatures); } private static SourceReference sourceRefFor(final CommonLeafs obj, final Uri uri) { diff --git a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/MountPointContextFactoryImpl.java b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/MountPointContextFactoryImpl.java index ee79eb7227..4064655b46 100644 --- a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/MountPointContextFactoryImpl.java +++ b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/MountPointContextFactoryImpl.java @@ -18,6 +18,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; @@ -44,6 +45,7 @@ import org.opendaylight.yangtools.rfc8528.data.api.YangLibraryConstants.Containe import org.opendaylight.yangtools.rfc8528.data.util.AbstractMountPointContextFactory; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Revision; +import org.opendaylight.yangtools.yang.common.XMLNamespace; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier; @@ -112,15 +114,16 @@ final class MountPointContextFactoryImpl extends AbstractMountPointContextFactor final var requiredSources = new ArrayList(); final var librarySources = new ArrayList(); + final var supportedFeatures = new HashSet(); final var moduleSet = findModuleSet(yangLib, findSchemaName(datastores, Operational.QNAME)); for (var modSet : yangLib.nonnullModuleSet().values()) { if (moduleSet.remove(modSet.getName())) { - fillModules(librarySources, requiredSources, modSet); + fillModules(librarySources, requiredSources, supportedFeatures, modSet); } } checkArgument(moduleSet.isEmpty(), "Failed to resolve module sets %s", moduleSet); - return resolver.resolveSchemaContext(librarySources, requiredSources); + return resolver.resolveSchemaContext(librarySources, requiredSources, supportedFeatures); } @SuppressWarnings("deprecation") @@ -128,11 +131,17 @@ final class MountPointContextFactoryImpl extends AbstractMountPointContextFactor throws YangParserException { final var requiredSources = new ArrayList(); final var librarySources = new ArrayList(); + final var supportedFeatures = new HashSet(); for (var module : modState.nonnullModule().values()) { final var modRef = sourceRefFor(module, module.getSchema()); - // TODO: take deviations/features into account + final var namespace = XMLNamespace.of(module.requireNamespace().getValue()); + for (var feature : module.requireFeature()) { + supportedFeatures.add(QName.create(namespace, feature.getValue()).intern()); + } + + // TODO: take deviations into account if (ConformanceType.Import == module.getConformanceType()) { librarySources.add(modRef); @@ -146,7 +155,7 @@ final class MountPointContextFactoryImpl extends AbstractMountPointContextFactor } } - return resolver.resolveSchemaContext(librarySources, requiredSources); + return resolver.resolveSchemaContext(librarySources, requiredSources, supportedFeatures); } private String findSchemaName(final Map datastores, final QName qname) { @@ -191,7 +200,7 @@ final class MountPointContextFactoryImpl extends AbstractMountPointContextFactor } private static void fillModules(final List librarySources, - final List requiredSources, final ModuleSet modSet) { + final List requiredSources, final Set supportedFeatures, final ModuleSet modSet) { // TODO: take deviations/features into account for (var mod : modSet.nonnullImportOnlyModule().values()) { @@ -203,6 +212,8 @@ final class MountPointContextFactoryImpl extends AbstractMountPointContextFactor } for (var mod : modSet.nonnullModule().values()) { fillSource(requiredSources, mod.getName(), toYangCommon(mod.getRevision()), mod.getLocation()); + final var namespace = XMLNamespace.of(mod.requireNamespace().getValue()); + mod.requireFeature().forEach(feature -> supportedFeatures.add(QName.create(namespace, feature.getValue()))); mod.nonnullSubmodule().values().forEach(sub -> { fillSource(librarySources, sub.getName(), toYangCommon(sub.getRevision()), sub.getLocation()); }); -- 2.36.6