Reduce ObjectRegistration use
[mdsal.git] / binding / mdsal-binding-runtime-spi / src / main / java / org / opendaylight / mdsal / binding / runtime / spi / ModuleInfoSnapshotResolver.java
index 1cff6edef7dd43401cdb0b1e1eb088b4ca6b9514..ab655c878286b1d785a09d6989594e6db370dcbe 100644 (file)
@@ -13,6 +13,7 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.MultimapBuilder;
 import java.io.IOException;
@@ -27,12 +28,15 @@ import org.checkerframework.checker.lock.qual.Holding;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.runtime.api.ModuleInfoSnapshot;
-import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
-import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
+import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
+import org.opendaylight.yangtools.concepts.AbstractRegistration;
 import org.opendaylight.yangtools.concepts.Mutable;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
 import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.binding.DataRoot;
+import org.opendaylight.yangtools.yang.binding.YangFeature;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
+import org.opendaylight.yangtools.yang.binding.contract.Naming;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
@@ -92,15 +96,24 @@ public final class ModuleInfoSnapshotResolver implements Mutable {
     private final ListMultimap<SourceIdentifier, RegisteredModuleInfo> sourceToInfoReg =
             MultimapBuilder.hashKeys().arrayListValues().build();
     @GuardedBy("this")
+    private final ListMultimap<Class<? extends DataRoot>, ImmutableSet<YangFeature<?, ?>>> moduleToFeatures =
+            MultimapBuilder.hashKeys().arrayListValues().build();
+    @GuardedBy("this")
     private @Nullable ModuleInfoSnapshot currentSnapshot;
 
     public ModuleInfoSnapshotResolver(final String name, final YangParserFactory parserFactory) {
         ctxResolver = YangTextSchemaContextResolver.create(name, parserFactory);
     }
 
-    public synchronized List<ObjectRegistration<YangModuleInfo>> registerModuleInfos(
-            final Iterable<? extends YangModuleInfo> moduleInfos) {
-        final var ret = new ArrayList<ObjectRegistration<YangModuleInfo>>();
+    public synchronized <R extends @NonNull DataRoot> Registration registerModuleFeatures(final Class<R> module,
+            final Set<? extends YangFeature<?, R>> supportedFeatures) {
+        final var features = supportedFeatures.stream().map(YangFeature::qname).map(QName::getLocalName).sorted()
+            .collect(ImmutableSet.toImmutableSet());
+        return ctxResolver.registerSupportedFeatures(BindingReflections.getQNameModule(module), features);
+    }
+
+    public synchronized List<Registration> registerModuleInfos(final Iterable<? extends YangModuleInfo> moduleInfos) {
+        final var ret = new ArrayList<Registration>();
         for (var moduleInfo : moduleInfos) {
             ret.add(register(requireNonNull(moduleInfo)));
         }
@@ -108,12 +121,12 @@ public final class ModuleInfoSnapshotResolver implements Mutable {
     }
 
     @Holding("this")
-    private ObjectRegistration<YangModuleInfo> register(final @NonNull YangModuleInfo moduleInfo) {
+    private Registration register(final @NonNull YangModuleInfo moduleInfo) {
         final var regInfos = flatDependencies(moduleInfo).stream()
             .map(this::registerModuleInfo)
             .collect(ImmutableList.toImmutableList());
 
-        return new AbstractObjectRegistration<>(moduleInfo) {
+        return new AbstractRegistration() {
             @Override
             protected void removeRegistration() {
                 unregister(regInfos);
@@ -185,7 +198,7 @@ public final class ModuleInfoSnapshotResolver implements Mutable {
             final var info = reg.info;
             moduleInfos.put(source, info);
             final var infoClass = info.getClass();
-            classLoaders.put(BindingMapping.getModelRootPackageName(infoClass.getPackage().getName()),
+            classLoaders.put(Naming.getModelRootPackageName(infoClass.getPackage().getName()),
                 infoClass.getClassLoader());
         }
 
@@ -211,13 +224,13 @@ public final class ModuleInfoSnapshotResolver implements Mutable {
     }
 
     static @NonNull YangTextSchemaSource toYangTextSource(final YangModuleInfo moduleInfo) {
-        return YangTextSchemaSource.delegateForByteSource(sourceIdentifierFrom(moduleInfo),
-            moduleInfo.getYangTextByteSource());
+        return YangTextSchemaSource.delegateForCharSource(sourceIdentifierFrom(moduleInfo),
+            moduleInfo.getYangTextCharSource());
     }
 
     private static @NonNull YangTextSchemaSource toYangTextSource(final SourceIdentifier identifier,
             final YangModuleInfo moduleInfo) {
-        return YangTextSchemaSource.delegateForByteSource(identifier, moduleInfo.getYangTextByteSource());
+        return YangTextSchemaSource.delegateForCharSource(identifier, moduleInfo.getYangTextCharSource());
     }
 
     private static SourceIdentifier sourceIdentifierFrom(final YangModuleInfo moduleInfo) {