X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-runtime-spi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fruntime%2Fspi%2FModuleInfoSnapshotResolver.java;h=6d180fff19bf79ce811e29220a9387e30f6c1143;hb=e1ac69a900fc0ee60e030bb7de2f5642a86997d5;hp=d287bf78b655ef52bf05c56c659eea691d7fcff9;hpb=d1c5088020b0b0d8693d2252ff2c4248a2cbccba;p=mdsal.git diff --git a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotResolver.java b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotResolver.java index d287bf78b6..6d180fff19 100644 --- a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotResolver.java +++ b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotResolver.java @@ -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; @@ -28,17 +29,20 @@ 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.reflect.BindingReflections; -import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; +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.common.Revision; +import org.opendaylight.yangtools.yang.binding.contract.Naming; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.api.source.YangTextSource; import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement; import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceException; -import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; -import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang.model.spi.source.DelegatedYangTextSource; import org.opendaylight.yangtools.yang.parser.api.YangParserFactory; import org.opendaylight.yangtools.yang.parser.api.YangSyntaxErrorException; import org.opendaylight.yangtools.yang.parser.repo.YangTextSchemaContextResolver; @@ -92,15 +96,24 @@ public final class ModuleInfoSnapshotResolver implements Mutable { private final ListMultimap sourceToInfoReg = MultimapBuilder.hashKeys().arrayListValues().build(); @GuardedBy("this") + private final ListMultimap, ImmutableSet>> 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> registerModuleInfos( - final Iterable moduleInfos) { - final var ret = new ArrayList>(); + public synchronized Registration registerModuleFeatures(final Class module, + final Set> 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 registerModuleInfos(final Iterable moduleInfos) { + final var ret = new ArrayList(); for (var moduleInfo : moduleInfos) { ret.add(register(requireNonNull(moduleInfo))); } @@ -108,12 +121,12 @@ public final class ModuleInfoSnapshotResolver implements Mutable { } @Holding("this") - private ObjectRegistration 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); @@ -154,7 +167,7 @@ public final class ModuleInfoSnapshotResolver implements Mutable { public synchronized @NonNull ModuleInfoSnapshot takeSnapshot() { final var effectiveModel = ctxResolver.getEffectiveModelContext().orElseThrow(); final var local = currentSnapshot; - if (local != null && local.getEffectiveModelContext().equals(effectiveModel)) { + if (local != null && local.modelContext().equals(effectiveModel)) { return local; } @@ -162,11 +175,11 @@ public final class ModuleInfoSnapshotResolver implements Mutable { } @Holding("this") - private @NonNull ModuleInfoSnapshot updateSnapshot(final EffectiveModelContext effectiveModel) { + private @NonNull ModuleInfoSnapshot updateSnapshot(final EffectiveModelContext modelContext) { // Alright, now let's find out which sources got captured final var sources = new HashSet(); - for (var entry : effectiveModel.getModuleStatements().entrySet()) { - final var revision = entry.getKey().getRevision().orElse(null); + for (var entry : modelContext.getModuleStatements().entrySet()) { + final var revision = entry.getKey().revision(); final var module = entry.getValue(); sources.add(new SourceIdentifier(module.argument(), revision)); @@ -184,12 +197,10 @@ public final class ModuleInfoSnapshotResolver implements Mutable { final var reg = regs.get(0); final var info = reg.info; moduleInfos.put(source, info); - final var infoClass = info.getClass(); - classLoaders.put(BindingReflections.getModelRootPackageName(infoClass.getPackage()), - infoClass.getClassLoader()); + classLoaders.put(Naming.getRootPackageName(info.getName().getModule()), info.getClass().getClassLoader()); } - final var next = new DefaultModuleInfoSnapshot(effectiveModel, moduleInfos, classLoaders); + final var next = new DefaultModuleInfoSnapshot(modelContext, moduleInfos, classLoaders); currentSnapshot = next; return next; } @@ -210,19 +221,18 @@ public final class ModuleInfoSnapshotResolver implements Mutable { } } - static @NonNull YangTextSchemaSource toYangTextSource(final YangModuleInfo moduleInfo) { - return YangTextSchemaSource.delegateForByteSource(sourceIdentifierFrom(moduleInfo), - moduleInfo.getYangTextByteSource()); + static @NonNull YangTextSource toYangTextSource(final YangModuleInfo moduleInfo) { + return new DelegatedYangTextSource(sourceIdentifierFrom(moduleInfo), moduleInfo.getYangTextCharSource()); } - private static @NonNull YangTextSchemaSource toYangTextSource(final SourceIdentifier identifier, + private static @NonNull YangTextSource toYangTextSource(final SourceIdentifier identifier, final YangModuleInfo moduleInfo) { - return YangTextSchemaSource.delegateForByteSource(identifier, moduleInfo.getYangTextByteSource()); + return new DelegatedYangTextSource(identifier, moduleInfo.getYangTextCharSource()); } private static SourceIdentifier sourceIdentifierFrom(final YangModuleInfo moduleInfo) { final var name = moduleInfo.getName(); - return new SourceIdentifier(name.getLocalName(), name.getRevision().map(Revision::toString).orElse(null)); + return new SourceIdentifier(name.getLocalName(), name.getRevision().orElse(null)); } private static @NonNull List<@NonNull YangModuleInfo> flatDependencies(final YangModuleInfo moduleInfo) {