<plugin>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-maven-plugin</artifactId>
- <version>11.0.5</version>
+ <version>13.0.0</version>
<dependencies>
<dependency>
<groupId>org.opendaylight.mdsal</groupId>
return identifier;
}
- @Override
- @Deprecated(since = "12.0.0", forRemoval = true)
- public final NodeIdentifier getIdentifier() {
- return identifier;
- }
-
@Override
public final ContainerNode getDelegate() {
return delegate();
final var child = type.schemaTreeChild(qname);
if (child == null) {
final var module = qname.getModule();
- if (context.getEffectiveModelContext().findModule(module).isEmpty()) {
+ if (context.modelContext().findModule(module).isEmpty()) {
throw new MissingSchemaException(
"Module " + module + " is not present in current schema context.");
}
final Class<?> valueType = method.getReturnType();
final ValueCodec<Object, Object> codec = getCodec(valueType, leafSchema.getType());
valueNode = LeafNodeCodecContext.of(leafSchema, codec, method.getName(), valueType,
- context.getEffectiveModelContext());
+ context.modelContext());
} else if (schema instanceof LeafListSchemaNode leafListSchema) {
final Optional<Type> optType = ClassLoaderUtils.getFirstGenericParameter(
method.getGenericReturnType());
private final @NonNull DataContainerNode data;
// Accessed via a VarHandle
- @SuppressWarnings("unused")
// FIXME: consider using a primitive int-based cache (with 0 being uninit)
+ @SuppressWarnings("unused")
@SuppressFBWarnings(value = "UUF_UNUSED_FIELD", justification = "https://github.com/spotbugs/spotbugs/issues/2749")
private volatile Integer cachedHashcode;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
@CheckReturnValue
private IllegalArgumentException childNullException(final QName child, final String message, final Object... args) {
- final QNameModule module = child.getModule();
- if (!factory().getRuntimeContext().getEffectiveModelContext().findModule(module).isPresent()) {
+ final var module = child.getModule();
+ if (!factory().getRuntimeContext().modelContext().findModule(module).isPresent()) {
return new MissingSchemaException("Module " + module + " is not present in current schema context.");
}
return new IncorrectNestingException(message, args);
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
public class Mdsal673Test extends AbstractBindingCodecTest {
private static final NodeIdentifier FOO = new NodeIdentifier(Foo.QNAME);
@Test
public void testNonnullContainer() {
final var entry = codecContext.fromNormalizedNode(YangInstanceIdentifier.of(FOO),
- Builders.containerBuilder().withNodeIdentifier(FOO).build());
+ ImmutableNodes.newContainerBuilder().withNodeIdentifier(FOO).build());
assertNotNull(entry);
assertEquals(InstanceIdentifier.create(Foo.class), entry.getKey());
@Test
public void testEmptyContainer() {
final var entry = codecContext.fromNormalizedNode(YangInstanceIdentifier.of(FOO),
- Builders.containerBuilder()
+ ImmutableNodes.newContainerBuilder()
.withNodeIdentifier(FOO)
- .withChild(Builders.containerBuilder().withNodeIdentifier(BAR).build())
+ .withChild(ImmutableNodes.newContainerBuilder().withNodeIdentifier(BAR).build())
.build());
assertNotNull(entry);
assertEquals(InstanceIdentifier.create(Foo.class), entry.getKey());
@Test
public void testNotEmptyContainer() {
// FIXME: MDSAL-670: these should get translated to YangInstanceIdentifier.of(FOO)
- final var identifier = new YangInstanceIdentifier.NodeWithValue<>(Bar.QNAME, FOO);
- final var data = Builders.containerBuilder()
+ final var data = ImmutableNodes.newContainerBuilder()
.withNodeIdentifier(FOO)
- .withChild(Builders.containerBuilder()
+ .withChild(ImmutableNodes.newContainerBuilder()
.withNodeIdentifier(BAR)
- .withChild(Builders.leafSetBuilder()
+ .withChild(ImmutableNodes.newSystemLeafSetBuilder()
.withNodeIdentifier(BAR)
- .withChild(Builders.leafSetEntryBuilder().withNodeIdentifier(identifier).withValue(FOO).build())
+ .withChild(ImmutableNodes.leafSetEntry(Bar.QNAME, FOO))
.build())
.build())
.build();
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeCodec;
import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
@RunWith(MockitoJUnitRunner.StrictStubs.class)
public class NonCachingCodecTest {
@Mock
public BindingNormalizedNodeCodec<DataObject> codec;
@Mock
- public NormalizedNode node;
+ public ContainerNode node;
@Mock
public DataObject object;
// Hidden on purpose
}
- static @NonNull BindingRuntimeTypes createTypes(final @NonNull EffectiveModelContext context) {
- final var moduleGens = new GeneratorReactor(context).execute(TypeBuilderFactory.runtime());
+ static @NonNull BindingRuntimeTypes createTypes(final @NonNull EffectiveModelContext modelContext) {
+ final var moduleGens = new GeneratorReactor(modelContext).execute(TypeBuilderFactory.runtime());
final var sw = Stopwatch.createStarted();
final var factory = new BindingRuntimeTypesFactory();
factory.indexModules(moduleGens);
LOG.debug("Indexed {} generators in {}", moduleGens.size(), sw);
- return new DefaultBindingRuntimeTypes(context, factory.modules, factory.allTypes, factory.identities,
+ return new DefaultBindingRuntimeTypes(modelContext, factory.modules, factory.allTypes, factory.identities,
factory.choiceToCases);
}
private static final Logger LOG = LoggerFactory.getLogger(DefaultBindingRuntimeGenerator.class);
@Override
- public BindingRuntimeTypes generateTypeMapping(final EffectiveModelContext context) {
- return BindingRuntimeTypesFactory.createTypes(context);
+ public BindingRuntimeTypes generateTypeMapping(final EffectiveModelContext modelContext) {
+ return BindingRuntimeTypesFactory.createTypes(modelContext);
}
@Activate
*/
package org.opendaylight.mdsal.binding.generator.impl.reactor;
+import static java.util.Objects.requireNonNull;
+
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.PathExpression;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
-import org.opendaylight.yangtools.yang.model.spi.AbstractEffectiveModelContextProvider;
/**
* Abstract view on generation tree as viewed by a particular {@link Generator}.
*/
-abstract class GeneratorContext extends AbstractEffectiveModelContextProvider {
+abstract class GeneratorContext {
+ private final @NonNull EffectiveModelContext modelContext;
+
GeneratorContext(final EffectiveModelContext modelContext) {
- super(modelContext);
+ this.modelContext = requireNonNull(modelContext);
+ }
+
+ final @NonNull EffectiveModelContext modelContext() {
+ return modelContext;
}
/**
* The result of BindingGenerator run. Contains mapping between Types and SchemaNodes.
*/
public final class DefaultBindingRuntimeTypes implements BindingRuntimeTypes {
- private final @NonNull EffectiveModelContext context;
+ private final @NonNull EffectiveModelContext modelContext;
private final ImmutableSetMultimap<JavaTypeName, CaseRuntimeType> choiceToCases;
private final ImmutableMap<QNameModule, ModuleRuntimeType> modulesByNamespace;
private final ImmutableSortedMap<String, ModuleRuntimeType> modulesByPackage;
private final ImmutableMap<QName, IdentityRuntimeType> identities;
private final ImmutableMap<JavaTypeName, RuntimeType> types;
- public DefaultBindingRuntimeTypes(final EffectiveModelContext context,
+ public DefaultBindingRuntimeTypes(final EffectiveModelContext modelContext,
final Map<QNameModule, ModuleRuntimeType> modules, final Map<JavaTypeName, RuntimeType> types,
final Map<QName, IdentityRuntimeType> identities,
final SetMultimap<JavaTypeName, CaseRuntimeType> choiceToCases) {
- this.context = requireNonNull(context);
+ this.modelContext = requireNonNull(modelContext);
this.identities = ImmutableMap.copyOf(identities);
this.types = ImmutableMap.copyOf(types);
this.choiceToCases = ImmutableSetMultimap.copyOf(choiceToCases);
}
@Override
- public EffectiveModelContext getEffectiveModelContext() {
- return context;
+ public EffectiveModelContext modelContext() {
+ return modelContext;
}
@Override
import static org.junit.Assert.assertSame;
import java.util.Set;
-import org.junit.BeforeClass;
import org.junit.Test;
import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
public class Mdsal829Test {
- private static EffectiveModelContext CONTEXT;
-
- @BeforeClass
- public static void beforeClass() {
- CONTEXT = YangParserTestUtils.parseYangResource("/mdsal829.yang", Set.of());
- }
+ private static final EffectiveModelContext MODEL_CONTEXT =
+ YangParserTestUtils.parseYangResource("/mdsal829.yang", Set.of());
@Test
public void testCompileTimeTypes() {
- assertEquals(1, DefaultBindingGenerator.generateFor(CONTEXT).size());
+ assertEquals(1, DefaultBindingGenerator.generateFor(MODEL_CONTEXT).size());
}
@Test
public void testRunTimeTypes() {
- final var types = BindingRuntimeTypesFactory.createTypes(CONTEXT);
- assertSame(CONTEXT, types.getEffectiveModelContext());
+ final var types = BindingRuntimeTypesFactory.createTypes(MODEL_CONTEXT);
+ assertSame(MODEL_CONTEXT, types.modelContext());
final var schema = types.findSchema(
JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal829.norev", "Mdsal829Data")).orElseThrow();
assertNotNull(schema);
import org.opendaylight.yangtools.yang.binding.contract.Naming;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
final Builder<String> bindingProviders = ImmutableSet.builder();
for (Module module : localModules) {
final YangModuleInfoTemplate template = new YangModuleInfoTemplate(module, context,
- mod -> moduleResourcePathResolver.findModuleResourcePath(mod, YangTextSchemaSource.class));
+ mod -> moduleResourcePathResolver.findModuleResourcePath(mod, YangTextSource.class));
final String path = DOT_MATCHER.replaceFrom(template.getPackageName(), '/') + "/";
result.put(GeneratedFileType.SOURCE, GeneratedFilePath.ofPath(path + MODULE_INFO),
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>rfc8040-model-api</artifactId>
</dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-repo-api</artifactId>
- </dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-repo-spi</artifactId>
requires transitive org.opendaylight.yangtools.yang.common;
requires transitive org.opendaylight.yangtools.yang.model.api;
requires transitive org.opendaylight.yangtools.yang.binding;
- requires transitive org.opendaylight.yangtools.yang.repo.api;
requires transitive org.opendaylight.yangtools.yang.repo.spi;
requires transitive org.opendaylight.yangtools.rfc8040.model.api;
requires transitive org.opendaylight.mdsal.binding.model.api;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
*/
@Beta
// FIXME: refactor return to follow foo()/getFoo()/findFoo() naming
-public interface BindingRuntimeContext extends EffectiveModelContextProvider, Immutable {
+public interface BindingRuntimeContext extends Immutable {
+
@NonNull BindingRuntimeTypes getTypes();
@NonNull <T> Class<T> loadClass(JavaTypeName type) throws ClassNotFoundException;
return loadClass(type.getIdentifier());
}
- @Override
- default EffectiveModelContext getEffectiveModelContext() {
- return getTypes().getEffectiveModelContext();
+ default @NonNull EffectiveModelContext modelContext() {
+ return getTypes().modelContext();
}
/**
* The EffectiveModelContext MUST contain all of the sub modules otherwise the there is no guarantee that result
* List of Generated Types will contain correct Generated Types.
*
- * @param context Schema Context
+ * @param modelContext effective model context
* @return Generated type mapping.
*/
- BindingRuntimeTypes generateTypeMapping(EffectiveModelContext context);
+ BindingRuntimeTypes generateTypeMapping(EffectiveModelContext modelContext);
}
import org.opendaylight.yangtools.concepts.Immutable;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.YangDataName;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
/**
* The result of BindingGenerator run. Contains mapping between Types and SchemaNodes.
*/
@Beta
-public interface BindingRuntimeTypes extends EffectiveModelContextProvider, RuntimeTypeContainer, Immutable {
+public interface BindingRuntimeTypes extends RuntimeTypeContainer, Immutable {
+ /**
+ * Return the {@link EffectiveModelContext} underlying this object.
+ *
+ * @return the {@link EffectiveModelContext} underlying this object
+ */
+ @NonNull EffectiveModelContext modelContext();
+
/**
* Lookup {@link IdentityRuntimeType} by its QNamme.
*
package org.opendaylight.mdsal.binding.runtime.api;
import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.concepts.Immutable;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
+/**
+ * A snapshot of a set of {@link YangModuleInfo}s, assembled to form an {@link EffectiveModelContext}.
+ */
@Beta
-public interface ModuleInfoSnapshot extends Immutable, EffectiveModelContextProvider,
- SchemaSourceProvider<YangTextSchemaSource> {
+public interface ModuleInfoSnapshot extends Immutable, SchemaSourceProvider<YangTextSource> {
+ /**
+ * The {@link EffectiveModelContext} resulting from all models exposed from constituent module infos.
+ *
+ * @return the resulting model context
+ */
+ @NonNull EffectiveModelContext modelContext();
<T> Class<T> loadClass(String fullyQualifiedName) throws ClassNotFoundException;
}
import org.checkerframework.checker.lock.qual.GuardedBy;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeGenerator;
-import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeTypes;
import org.opendaylight.mdsal.binding.runtime.api.DefaultBindingRuntimeContext;
-import org.opendaylight.mdsal.binding.runtime.api.ModuleInfoSnapshot;
import org.opendaylight.mdsal.dom.schema.osgi.OSGiModuleInfoSnapshot;
import org.osgi.service.component.ComponentFactory;
import org.osgi.service.component.ComponentInstance;
@Override
void add(final OSGiModuleInfoSnapshot snapshot) {
- final ModuleInfoSnapshot context = snapshot.getService();
- final BindingRuntimeTypes types = generator.generateTypeMapping(context.getEffectiveModelContext());
+ final var infoSnapshot = snapshot.getService();
+ final var types = generator.generateTypeMapping(infoSnapshot.modelContext());
instances.put(snapshot, factory.newInstance(OSGiBindingRuntimeContextImpl.props(
snapshot.getGeneration(), snapshot.getServiceRanking(),
- new DefaultBindingRuntimeContext(types, context))));
+ new DefaultBindingRuntimeContext(types, infoSnapshot))));
}
@Override
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-model-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-model-spi</artifactId>
</dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
requires org.opendaylight.yangtools.concepts;
requires org.opendaylight.yangtools.util;
requires org.opendaylight.yangtools.yang.model.api;
+ requires org.opendaylight.yangtools.yang.model.spi;
requires org.opendaylight.yangtools.yang.parser.impl;
requires org.opendaylight.mdsal.binding.model.api;
requires org.opendaylight.mdsal.binding.spec.util;
public static @NonNull EffectiveModelContext createEffectiveModel(final YangParserFactory parserFactory,
final Iterable<? extends YangModuleInfo> moduleInfos) throws YangParserException {
- return prepareContext(parserFactory, moduleInfos).getEffectiveModelContext();
+ return prepareContext(parserFactory, moduleInfos).modelContext();
}
public static @NonNull BindingRuntimeContext createRuntimeContext() {
throw new IllegalStateException("Failed to parse models", e);
}
return new DefaultBindingRuntimeContext(ServiceLoaderState.Generator.INSTANCE.generateTypeMapping(
- infos.getEffectiveModelContext()), infos);
+ infos.modelContext()), infos);
}
public static @NonNull BindingRuntimeContext createRuntimeContext(final Class<?>... classes) {
}
return new DefaultBindingRuntimeContext(
- ServiceLoaderState.Generator.INSTANCE.generateTypeMapping(snapshot.getEffectiveModelContext()), snapshot);
+ ServiceLoaderState.Generator.INSTANCE.generateTypeMapping(snapshot.modelContext()), snapshot);
}
public static @NonNull BindingRuntimeContext createRuntimeContext(final YangParserFactory parserFactory,
public static @NonNull BindingRuntimeContext createRuntimeContext(final YangParserFactory parserFactory,
final BindingRuntimeGenerator generator, final Collection<Class<?>> classes) throws YangParserException {
- final ModuleInfoSnapshot infos = prepareContext(parserFactory, classes.stream()
+ final var infos = prepareContext(parserFactory, classes.stream()
.map(BindingRuntimeHelpers::getYangModuleInfo)
.collect(Collectors.toList()));
- return new DefaultBindingRuntimeContext(generator.generateTypeMapping(infos.getEffectiveModelContext()), infos);
+ return new DefaultBindingRuntimeContext(generator.generateTypeMapping(infos.modelContext()), infos);
}
public static @NonNull YangModuleInfo getYangModuleInfo(final Class<?> clazz) {
import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
import org.opendaylight.yangtools.yang.binding.contract.Naming;
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.repo.api.MissingSchemaSourceException;
-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;
final class DefaultModuleInfoSnapshot implements ModuleInfoSnapshot {
private final ImmutableMap<SourceIdentifier, YangModuleInfo> moduleInfos;
private final ImmutableMap<String, ClassLoader> classLoaders;
- private final @NonNull EffectiveModelContext effectiveModel;
+ private final @NonNull EffectiveModelContext modelContext;
- DefaultModuleInfoSnapshot(final EffectiveModelContext effectiveModel,
+ DefaultModuleInfoSnapshot(final EffectiveModelContext modelContext,
final Map<SourceIdentifier, YangModuleInfo> moduleInfos, final Map<String, ClassLoader> classLoaders) {
- this.effectiveModel = requireNonNull(effectiveModel);
+ this.modelContext = requireNonNull(modelContext);
this.moduleInfos = ImmutableMap.copyOf(moduleInfos);
this.classLoaders = ImmutableMap.copyOf(classLoaders);
}
@Override
- public EffectiveModelContext getEffectiveModelContext() {
- return effectiveModel;
+ public EffectiveModelContext modelContext() {
+ return modelContext;
}
@Override
- public ListenableFuture<? extends YangTextSchemaSource> getSource(final SourceIdentifier sourceIdentifier) {
- final YangModuleInfo info = moduleInfos.get(sourceIdentifier);
- if (info == null) {
- return Futures.immediateFailedFuture(
- new MissingSchemaSourceException("No source registered", sourceIdentifier));
- }
- return Futures.immediateFuture(YangTextSchemaSource.delegateForCharSource(sourceIdentifier,
- info.getYangTextCharSource()));
+ public ListenableFuture<? extends YangTextSource> getSource(final SourceIdentifier sourceId) {
+ final var info = moduleInfos.get(sourceId);
+ return info == null
+ ? Futures.immediateFailedFuture(new MissingSchemaSourceException(sourceId, "No source registered"))
+ : Futures.immediateFuture(new DelegatedYangTextSource(sourceId, info.getYangTextCharSource()));
}
@Override
public <T> Class<T> loadClass(final String fullyQualifiedName) throws ClassNotFoundException {
- final String packageName = Naming.getModelRootPackageName(fullyQualifiedName);
- final ClassLoader loader = classLoaders.get(packageName);
+ final var packageName = Naming.getModelRootPackageName(fullyQualifiedName);
+ final var loader = classLoaders.get(packageName);
if (loader == null) {
throw new ClassNotFoundException("Package " + packageName + " not found");
}
@SuppressWarnings("unchecked")
- final Class<T> loaded = (Class<T>) loader.loadClass(fullyQualifiedName);
+ final var loaded = (Class<T>) loader.loadClass(fullyQualifiedName);
return loaded;
}
}
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.mdsal.binding.runtime.api.ModuleInfoSnapshot;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.source.YangTextSource;
@Beta
public abstract class ForwardingModuleInfoSnapshot extends ForwardingObject implements ModuleInfoSnapshot {
}
@Override
- public @NonNull EffectiveModelContext getEffectiveModelContext() {
- return delegate().getEffectiveModelContext();
+ public @NonNull EffectiveModelContext modelContext() {
+ return delegate().modelContext();
}
@Override
- public ListenableFuture<? extends YangTextSchemaSource> getSource(final SourceIdentifier sourceIdentifier) {
+ public ListenableFuture<? extends YangTextSource> getSource(final SourceIdentifier sourceIdentifier) {
return delegate().getSource(sourceIdentifier);
}
}
import org.opendaylight.yangtools.yang.binding.contract.Naming;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
import org.opendaylight.yangtools.yang.model.api.stmt.FeatureSet;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
import org.opendaylight.yangtools.yang.parser.api.YangParser;
import org.opendaylight.yangtools.yang.parser.api.YangParserException;
import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
for (var info : moduleInfos) {
final var source = ModuleInfoSnapshotResolver.toYangTextSource(info);
- mappedInfos.put(source.getIdentifier(), info);
+ mappedInfos.put(source.sourceId(), info);
final Class<?> infoClass = info.getClass();
final String infoRoot = Naming.getModelRootPackageName(infoClass.getPackage().getName());
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.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;
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;
}
}
@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<SourceIdentifier>();
- for (var entry : effectiveModel.getModuleStatements().entrySet()) {
+ for (var entry : modelContext.getModuleStatements().entrySet()) {
final var revision = entry.getKey().getRevision().orElse(null);
final var module = entry.getValue();
infoClass.getClassLoader());
}
- final var next = new DefaultModuleInfoSnapshot(effectiveModel, moduleInfos, classLoaders);
+ final var next = new DefaultModuleInfoSnapshot(modelContext, moduleInfos, classLoaders);
currentSnapshot = next;
return next;
}
}
}
- static @NonNull YangTextSchemaSource toYangTextSource(final YangModuleInfo moduleInfo) {
- return YangTextSchemaSource.delegateForCharSource(sourceIdentifierFrom(moduleInfo),
- moduleInfo.getYangTextCharSource());
+ 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.delegateForCharSource(identifier, moduleInfo.getYangTextCharSource());
+ 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) {
*/
package org.opendaylight.mdsal.binding.runtime.spi;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
-import java.util.Map;
import java.util.Set;
-import org.junit.Test;
-import org.opendaylight.mdsal.binding.runtime.api.ModuleInfoSnapshot;
+import org.junit.jupiter.api.Test;
import org.opendaylight.yang.gen.v1.mdsal767.norev.$YangModuleInfoImpl;
import org.opendaylight.yang.gen.v1.mdsal767.norev.Mdsal767Data;
import org.opendaylight.yang.gen.v1.mdsal767.norev.One$F;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.XMLNamespace;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.stmt.FeatureEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.api.YangParserException;
-import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
import org.opendaylight.yangtools.yang.parser.impl.DefaultYangParserFactory;
-public class ModuleInfoSnapshotBuilderTest {
- private static final YangParserFactory PARSER_FACTORY = new DefaultYangParserFactory();
-
+class ModuleInfoSnapshotBuilderTest {
@Test
- public void testModuleRegistration() throws YangParserException {
- final ModuleInfoSnapshotBuilder snapshotBuilder = new ModuleInfoSnapshotBuilder(PARSER_FACTORY);
+ void testModuleRegistration() throws Exception {
+ final var snapshotBuilder = new ModuleInfoSnapshotBuilder(new DefaultYangParserFactory());
snapshotBuilder.add($YangModuleInfoImpl.getInstance());
snapshotBuilder.addModuleFeatures(Mdsal767Data.class, Set.of(One$F.VALUE));
- final ModuleInfoSnapshot snapshot = snapshotBuilder.build();
- final EffectiveModelContext modelContext = snapshot.getEffectiveModelContext();
- final Map<QNameModule, ModuleEffectiveStatement> modules = modelContext.getModuleStatements();
- final ModuleEffectiveStatement module = modules.get(QNameModule.create(XMLNamespace.of("mdsal767")));
+ final var snapshot = snapshotBuilder.build();
+ final var modelContext = snapshot.modelContext();
+ final var modules = modelContext.getModuleStatements();
+ final var module = modules.get(QNameModule.create(XMLNamespace.of("mdsal767")));
assertEquals(1, module.features().size());
- final FeatureEffectiveStatement feature = module.features().stream().findAny().orElseThrow();
+ final var feature = module.features().stream().findAny().orElseThrow();
assertEquals(QName.create("mdsal767", "one"), feature.argument());
}
}