From 5164fe4ff2899743c382f6707a7203810a7936bc Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 22 Jun 2023 17:53:32 +0200 Subject: [PATCH] Do not use BindingReflections in ModuleInfoSnapshotBuilder We have YangModuleInfos, which expose both the root package and the corresponding namespace. Use that information to resolve QNameModule for a particular root without relying on reflective access. JIRA: MDSAL-783 Change-Id: If8b14cb49118f5d97c65783f29f1aa77bcc4eada Signed-off-by: Robert Varga --- .../spi/ModuleInfoSnapshotBuilder.java | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotBuilder.java b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotBuilder.java index 4435c79e1b..b4cce3390c 100644 --- a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotBuilder.java +++ b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotBuilder.java @@ -19,20 +19,18 @@ import com.google.common.collect.SetMultimap; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; -import java.util.Map; import java.util.Set; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.runtime.api.ModuleInfoSnapshot; -import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.BindingObject; import org.opendaylight.yangtools.yang.binding.DataRoot; import org.opendaylight.yangtools.yang.binding.YangFeature; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; import org.opendaylight.yangtools.yang.binding.contract.Naming; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.stmt.FeatureSet; import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.parser.api.YangParser; import org.opendaylight.yangtools.yang.parser.api.YangParserException; import org.opendaylight.yangtools.yang.parser.api.YangParserFactory; @@ -61,9 +59,9 @@ public final class ModuleInfoSnapshotBuilder { return add(moduleInfo); } - @SuppressWarnings("unchecked") - public @NonNull ModuleInfoSnapshotBuilder add(final Class... classes) { - for (Class clazz : classes) { + @SafeVarargs + public final @NonNull ModuleInfoSnapshotBuilder add(final Class... classes) { + for (var clazz : classes) { add(clazz); } return this; @@ -75,7 +73,7 @@ public final class ModuleInfoSnapshotBuilder { } public @NonNull ModuleInfoSnapshotBuilder add(final YangModuleInfo... infos) { - for (YangModuleInfo info : infos) { + for (var info : infos) { add(info); } return this; @@ -103,15 +101,18 @@ public final class ModuleInfoSnapshotBuilder { public @NonNull ModuleInfoSnapshot build() throws YangParserException { final YangParser parser = parserFactory.createParser(); - final Map mappedInfos = new HashMap<>(); - final Map classLoaders = new HashMap<>(); - for (YangModuleInfo info : moduleInfos) { - final YangTextSchemaSource source = ModuleInfoSnapshotResolver.toYangTextSource(info); + final var mappedInfos = new HashMap(); + final var classLoaders = new HashMap(); + final var namespaces = new HashMap(); + + for (var info : moduleInfos) { + final var source = ModuleInfoSnapshotResolver.toYangTextSource(info); mappedInfos.put(source.getIdentifier(), info); final Class infoClass = info.getClass(); - classLoaders.put(Naming.getModelRootPackageName(infoClass.getPackage().getName()), - infoClass.getClassLoader()); + final String infoRoot = Naming.getModelRootPackageName(infoClass.getPackage().getName()); + classLoaders.put(infoRoot, infoClass.getClassLoader()); + namespaces.put(infoRoot, info.getName().getModule()); try { parser.addSource(source); @@ -123,9 +124,18 @@ public final class ModuleInfoSnapshotBuilder { if (!moduleFeatures.isEmpty()) { final var featuresByModule = FeatureSet.builder(); for (var entry : Multimaps.asMap(moduleFeatures).entrySet()) { - featuresByModule.addModuleFeatures(BindingReflections.getQNameModule(entry.getKey()), - entry.getValue().stream().map(YangFeature::qname).map(QName::getLocalName).sorted() - .collect(ImmutableSet.toImmutableSet())); + final var moduleData = entry.getKey(); + final var moduleRoot = Naming.getModelRootPackageName(moduleData.getPackage().getName()); + final var moduleNamespace = namespaces.get(moduleRoot); + if (moduleNamespace == null) { + throw new YangParserException("Failed to resolve namespace of " + moduleData); + } + + featuresByModule.addModuleFeatures(moduleNamespace, entry.getValue().stream() + .map(YangFeature::qname) + .map(QName::getLocalName) + .sorted() + .collect(ImmutableSet.toImmutableSet())); } parser.setSupportedFeatures(featuresByModule.build()); } -- 2.36.6