Rehost BindingReflections.loadModuleInfos()
[mdsal.git] / binding / mdsal-binding-runtime-spi / src / main / java / org / opendaylight / mdsal / binding / runtime / spi / BindingRuntimeHelpers.java
index d724dd498f0e5699ef7d93f646df969fd2a3ac39..0e5a488318624a6e6b387313b02756d240038fee 100644 (file)
@@ -7,10 +7,13 @@
  */
 package org.opendaylight.mdsal.binding.runtime.spi;
 
+import static com.google.common.base.Preconditions.checkState;
+
 import com.google.common.annotations.Beta;
-import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableSet;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.ServiceLoader;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
@@ -18,6 +21,7 @@ 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.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.parser.api.YangParserException;
@@ -31,7 +35,7 @@ import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
 @Beta
 public final class BindingRuntimeHelpers {
     private BindingRuntimeHelpers() {
-
+        // Hidden on purpose
     }
 
     public static @NonNull EffectiveModelContext createEffectiveModel(final Class<?>... classes) {
@@ -57,8 +61,7 @@ public final class BindingRuntimeHelpers {
     public static @NonNull BindingRuntimeContext createRuntimeContext() {
         final ModuleInfoSnapshot infos;
         try {
-            infos = prepareContext(ServiceLoaderState.ParserFactory.INSTANCE,
-                BindingReflections.loadModuleInfos());
+            infos = prepareContext(ServiceLoaderState.ParserFactory.INSTANCE, loadModuleInfos());
         } catch (YangParserException e) {
             throw new IllegalStateException("Failed to parse models", e);
         }
@@ -102,13 +105,29 @@ public final class BindingRuntimeHelpers {
         return new DefaultBindingRuntimeContext(generator.generateTypeMapping(infos.getEffectiveModelContext()), infos);
     }
 
-    @SuppressWarnings("checkstyle:IllegalCatch")
-    private static @NonNull YangModuleInfo extractYangModuleInfo(final Class<?> clazz) {
-        try {
-            return BindingReflections.getModuleInfo(clazz);
-        } catch (Exception e) {
-            Throwables.throwIfUnchecked(e);
-            throw new IllegalStateException("Failed to extract module info from " + clazz, e);
+    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 ImmutableSet<YangModuleInfo> loadModuleInfos() {
+        final var moduleInfoSet = ImmutableSet.<YangModuleInfo>builder();
+        for (var bindingProvider : ServiceLoader.load(YangModelBindingProvider.class)) {
+            var moduleInfo = bindingProvider.getModuleInfo();
+            checkState(moduleInfo != null, "Module Info for %s is not available.", bindingProvider.getClass());
+            collectYangModuleInfo(bindingProvider.getModuleInfo(), moduleInfoSet);
+        }
+        return moduleInfoSet.build();
+    }
+
+    private static void collectYangModuleInfo(final YangModuleInfo moduleInfo,
+            final ImmutableSet.Builder<YangModuleInfo> moduleInfoSet) {
+        moduleInfoSet.add(moduleInfo);
+        for (var dependency : moduleInfo.getImportedModules()) {
+            collectYangModuleInfo(dependency, moduleInfoSet);
         }
     }