Fix BindingRuntimeHelper.extractYangModuleInfo() 64/106564/4
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 20 Jun 2023 21:39:16 +0000 (23:39 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 20 Jun 2023 22:19:48 +0000 (00:19 +0200)
Previous patch has broken the extraction facility in multi-classloader
environments: when we have a Class, we should be using its ClassLoader,
not TCCL, to locate its sibling.

JIRA: MDSAL-803
Change-Id: Ie3684a6defeaf51c6c98efcf48791b677b2ef2f1
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/BindingRuntimeHelpers.java
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotBuilder.java

index 0e5a488318624a6e6b387313b02756d240038fee..38c4c35d593820840e682d46c7abfc9818f12704 100644 (file)
@@ -20,9 +20,9 @@ import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeGenerator;
 import org.opendaylight.mdsal.binding.runtime.api.DefaultBindingRuntimeContext;
 import org.opendaylight.mdsal.binding.runtime.api.ModuleInfoSnapshot;
-import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
+import org.opendaylight.yangtools.yang.binding.contract.Naming;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.parser.api.YangParserException;
 import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
@@ -40,7 +40,7 @@ public final class BindingRuntimeHelpers {
 
     public static @NonNull EffectiveModelContext createEffectiveModel(final Class<?>... classes) {
         return createEffectiveModel(Arrays.stream(classes)
-            .map(BindingRuntimeHelpers::extractYangModuleInfo)
+            .map(BindingRuntimeHelpers::getYangModuleInfo)
             .collect(Collectors.toList()));
     }
 
@@ -100,17 +100,22 @@ public final class BindingRuntimeHelpers {
     public static @NonNull BindingRuntimeContext createRuntimeContext(final YangParserFactory parserFactory,
             final BindingRuntimeGenerator generator, final Collection<Class<?>> classes) throws YangParserException {
         final ModuleInfoSnapshot infos = prepareContext(parserFactory, classes.stream()
-            .map(BindingRuntimeHelpers::extractYangModuleInfo)
+            .map(BindingRuntimeHelpers::getYangModuleInfo)
             .collect(Collectors.toList()));
         return new DefaultBindingRuntimeContext(generator.generateTypeMapping(infos.getEffectiveModelContext()), infos);
     }
 
-    public static @NonNull YangModuleInfo extractYangModuleInfo(final Class<?> clazz) {
-        final var namespace = BindingReflections.findQName(clazz).getNamespace();
-        return loadModuleInfos().stream()
-            .filter(info -> namespace.equals(info.getName().getNamespace()))
-            .findFirst()
-            .orElseThrow(() -> new IllegalStateException("Failed to extract module info from " + clazz));
+    public static @NonNull YangModuleInfo getYangModuleInfo(final Class<?> clazz) {
+        // Module info resides in the root package we will use that to ascertain identity
+        final var modelPackage = Naming.getModelRootPackageName(clazz.getPackage().getName());
+
+        for (var bindingProvider : ServiceLoader.load(YangModelBindingProvider.class, clazz.getClassLoader())) {
+            var moduleInfo = bindingProvider.getModuleInfo();
+            if (modelPackage.equals(moduleInfo.getClass().getPackage().getName())) {
+                return moduleInfo;
+            }
+        }
+        throw new IllegalStateException("Failed to find YangModuleInfo in package " + modelPackage + " for " + clazz);
     }
 
     public static @NonNull ImmutableSet<YangModuleInfo> loadModuleInfos() {
index 89dd34d983e4649f4302077c0ca0c40ba824f0fc..4435c79e1b6973505bc8ffe50bd765f8f48b3aed 100644 (file)
@@ -52,7 +52,7 @@ public final class ModuleInfoSnapshotBuilder {
     public @NonNull ModuleInfoSnapshotBuilder add(final Class<? extends BindingObject> clazz) {
         final YangModuleInfo moduleInfo;
         try {
-            moduleInfo = BindingRuntimeHelpers.extractYangModuleInfo(clazz);
+            moduleInfo = BindingRuntimeHelpers.getYangModuleInfo(clazz);
         } catch (Exception e) {
             Throwables.throwIfUnchecked(e);
             throw new IllegalStateException("Failed to introspect " + clazz, e);