/** * Get all Yang modules from classpath using ServiceLoader scanning. * @return * Complete list of models found on classpath. */ public static Set<YangModuleInfo> getAllModelsFromClasspath() { Set<YangModuleInfo> moduleInfos = new HashSet<>(); ServiceLoader<YangModelBindingProvider> yangProviderLoader = ServiceLoader.load(YangModelBindingProvider.class); for (YangModelBindingProvider yangModelBindingProvider : yangProviderLoader) { moduleInfos.add(yangModelBindingProvider.getModuleInfo()); LOG.info("Adding [{}] module into known modules", yangModelBindingProvider.getModuleInfo()); } return Collections.unmodifiableSet(moduleInfos); }
private static Set<YangModuleInfo> filterYangModelBindingProviders(final ModuleId moduleId, final ServiceLoader<YangModelBindingProvider> yangProviderLoader) { Set<YangModuleInfo> filteredSet = new HashSet<>(); for (YangModelBindingProvider yangModelBindingProvider : yangProviderLoader) { if (moduleId.getQName().equals(yangModelBindingProvider.getModuleInfo().getName())) { filteredSet.add(yangModelBindingProvider.getModuleInfo()); } } return filteredSet; }
/** * * Loads {@link YangModuleInfo} infos available on supplied classloader. * * {@link YangModuleInfo} are discovered using {@link ServiceLoader} for * {@link YangModelBindingProvider}. {@link YangModelBindingProvider} are * simple classes which holds only pointers to actual instance * {@link YangModuleInfo}. * * When {@link YangModuleInfo} is available, all dependencies are * recursivelly collected into returning set by collecting results of * {@link YangModuleInfo#getImportedModules()}. * * * @param loader * Classloader for which {@link YangModuleInfo} should be * retrieved. * @return Set of {@link YangModuleInfo} available for supplied classloader. */ public static ImmutableSet<YangModuleInfo> loadModuleInfos(final ClassLoader loader) { Builder<YangModuleInfo> moduleInfoSet = ImmutableSet.<YangModuleInfo> builder(); ServiceLoader<YangModelBindingProvider> serviceLoader = ServiceLoader.load(YangModelBindingProvider.class, loader); for (YangModelBindingProvider bindingProvider : serviceLoader) { YangModuleInfo moduleInfo = bindingProvider.getModuleInfo(); checkState(moduleInfo != null, "Module Info for %s is not available.", bindingProvider.getClass()); collectYangModuleInfo(bindingProvider.getModuleInfo(), moduleInfoSet); } return moduleInfoSet.build(); }
private static YangModuleInfo retrieveModuleInfo(final String moduleInfoClass, final Bundle bundle) { final Class<?> clazz = loadClass(moduleInfoClass, bundle); if (!YangModelBindingProvider.class.isAssignableFrom(clazz)) { String errorMessage = logMessage("Class {} does not implement {} in bundle {}", clazz, YangModelBindingProvider.class, bundle); throw new IllegalStateException(errorMessage); } final YangModelBindingProvider instance; try { Object instanceObj = clazz.newInstance(); instance = YangModelBindingProvider.class.cast(instanceObj); } catch (InstantiationException e) { String errorMessage = logMessage("Could not instantiate {} in bundle {}, reason {}", moduleInfoClass, bundle, e); throw new IllegalStateException(errorMessage, e); } catch (IllegalAccessException e) { String errorMessage = logMessage("Illegal access during instantiation of class {} in bundle {}, reason {}", moduleInfoClass, bundle, e); throw new IllegalStateException(errorMessage, e); } try { return instance.getModuleInfo(); } catch (NoClassDefFoundError | ExceptionInInitializerError e) { throw new IllegalStateException("Error while executing getModuleInfo on " + instance, e); } }