*/
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;
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;
@Beta
public final class BindingRuntimeHelpers {
private BindingRuntimeHelpers() {
-
+ // Hidden on purpose
}
public static @NonNull EffectiveModelContext createEffectiveModel(final Class<?>... classes) {
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);
}
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);
}
}