- @SuppressWarnings("checkstyle:IllegalCatch")
- 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 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() {
+ return loadModuleInfos(Thread.currentThread().getContextClassLoader());
+ }
+
+ /**
+ * Loads {@link YangModuleInfo} infos available on supplied classloader.
+ *
+ * <p>
+ * {@link YangModuleInfo} are discovered using {@link ServiceLoader} for {@link YangModelBindingProvider}.
+ * {@link YangModelBindingProvider} are simple classes which holds only pointers to actual instance
+ * {@link YangModuleInfo}.
+ *
+ * <p>
+ * When {@link YangModuleInfo} is available, all dependencies are recursively collected into returning set by
+ * collecting results of {@link YangModuleInfo#getImportedModules()}.
+ *
+ * @param classLoader Classloader for which {@link YangModuleInfo} should be retrieved.
+ * @return Set of {@link YangModuleInfo} available for supplied classloader.
+ */
+ public static @NonNull ImmutableSet<YangModuleInfo> loadModuleInfos(final ClassLoader classLoader) {
+ final var moduleInfoSet = ImmutableSet.<YangModuleInfo>builder();
+ for (var bindingProvider : ServiceLoader.load(YangModelBindingProvider.class, classLoader)) {
+ 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);