Bump yangtools to 13.0.0
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 11 Dec 2023 10:19:04 +0000 (11:19 +0100)
committerAnil Belur <abelur@linuxfoundation.org>
Wed, 19 Jun 2024 00:41:48 +0000 (10:41 +1000)
This adopts yangtools-13.0.0 and updates the various integration
surfaces.

Change-Id: Ie9e2ed6fec32bdb7cd98803552a4500a5b44f127
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
28 files changed:
binding/binding-parent/pom.xml
binding/mdsal-binding-dom-codec-spi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/spi/AbstractBindingLazyContainerNode.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObject.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Mdsal673Test.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/NonCachingCodecTest.java
binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/BindingRuntimeTypesFactory.java
binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/DefaultBindingRuntimeGenerator.java
binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/GeneratorContext.java
binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/rt/DefaultBindingRuntimeTypes.java
binding/mdsal-binding-generator/src/test/java/org/opendaylight/mdsal/binding/generator/impl/Mdsal829Test.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/JavaFileGenerator.java
binding/mdsal-binding-runtime-api/pom.xml
binding/mdsal-binding-runtime-api/src/main/java/module-info.java
binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/BindingRuntimeContext.java
binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/BindingRuntimeGenerator.java
binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/BindingRuntimeTypes.java
binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/ModuleInfoSnapshot.java
binding/mdsal-binding-runtime-osgi/src/main/java/org/opendaylight/mdsal/binding/runtime/osgi/impl/OSGiBindingRuntime.java
binding/mdsal-binding-runtime-spi/pom.xml
binding/mdsal-binding-runtime-spi/src/main/java/module-info.java
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/BindingRuntimeHelpers.java
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/DefaultModuleInfoSnapshot.java
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ForwardingModuleInfoSnapshot.java
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotBuilder.java
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotResolver.java
binding/mdsal-binding-runtime-spi/src/test/java/org/opendaylight/mdsal/binding/runtime/spi/ModuleInfoSnapshotBuilderTest.java

index 1ed2a3b2c5e61176d0912d2da3dfea80e4d6b1d8..7b87af3f6f5d030c316333a6c3fb7ae6af094e00 100644 (file)
@@ -70,7 +70,7 @@
                         <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>
index cc65a621bc4a769ee47591650734dfce43766653..827c420d9a8dd63f01cf847fa9d16fd86169bded 100644 (file)
@@ -54,12 +54,6 @@ public abstract class AbstractBindingLazyContainerNode<T extends DataObject, C>
         return identifier;
     }
 
-    @Override
-    @Deprecated(since = "12.0.0", forRemoval = true)
-    public final NodeIdentifier getIdentifier() {
-        return identifier;
-    }
-
     @Override
     public final ContainerNode getDelegate() {
         return delegate();
index 33d9e2ad89fa5fd26afa3c59820429b899041b49..c3e327ec9a2d518aeaabde3bd378e6dd70a77aee 100644 (file)
@@ -185,7 +185,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
                 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.");
                     }
@@ -649,7 +649,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
                     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());
index 65e40086155a3d804c3262dbc1d05ef2105a6643..173ccccd44bb2d00e61194c9deb110c1e2fc5d62 100644 (file)
@@ -45,8 +45,8 @@ public abstract class CodecDataObject<T extends DataObject> implements DataObjec
     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;
 
index 403e3dc57e22088fe3c2da6baf2a22394ade2b8c..67cbc1aa3b47a521cfdc929bd6156fa73a41f685 100644 (file)
@@ -43,7 +43,6 @@ import org.opendaylight.yangtools.yang.binding.DataContainer;
 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;
@@ -194,8 +193,8 @@ abstract sealed class DataContainerCodecContext<D extends BindingObject & DataCo
 
     @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);
index 104f07911107aebf971d9c6e5085712035bb5108..b21aed113cce3a38a7f71b3088034df8b7f39e79 100644 (file)
@@ -21,7 +21,7 @@ import org.opendaylight.yang.gen.v1.mdsal668.norev.bar.BarBuilder;
 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);
@@ -33,7 +33,7 @@ public class Mdsal673Test extends AbstractBindingCodecTest {
     @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());
 
@@ -52,9 +52,9 @@ public class Mdsal673Test extends AbstractBindingCodecTest {
     @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());
@@ -73,14 +73,13 @@ public class Mdsal673Test extends AbstractBindingCodecTest {
     @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();
index 3a4017a50cc3f41effe09b7a00d59123e2bafb94..6f2cd64b7e73c6e5f000a2550b4e36c26aacaa57 100644 (file)
@@ -17,14 +17,14 @@ import org.mockito.Mock;
 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;
 
index 8d28821b532e1febe233272966b5de3ea8a291b0..8617b250b9ecafb804d482b297ff899dde2ea309 100644 (file)
@@ -52,15 +52,15 @@ final class BindingRuntimeTypesFactory implements Mutable {
         // 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);
     }
 
index f8ba855ea371e08a279901d981cb8f7de0782c25..1abbcc0d36903a5745feff75036a7dbc4fde2799 100644 (file)
@@ -26,8 +26,8 @@ public class DefaultBindingRuntimeGenerator implements BindingRuntimeGenerator {
     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
index a3edbfde57f745c618b980e15a7d2c2ec687d128..92ca3341c03cc44abe9a61e0f5b7165b5df125cf 100644 (file)
@@ -7,6 +7,8 @@
  */
 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;
@@ -14,14 +16,19 @@ import org.opendaylight.yangtools.yang.common.QNameModule;
 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;
     }
 
     /**
index a954560bdbf1376b0c69721fef0902b816cf6192..8f4f6c6167ee97d793662dd5f25205d8d9159758 100644 (file)
@@ -37,18 +37,18 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
  * 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);
@@ -59,8 +59,8 @@ public final class DefaultBindingRuntimeTypes implements BindingRuntimeTypes {
     }
 
     @Override
-    public EffectiveModelContext getEffectiveModelContext() {
-        return context;
+    public EffectiveModelContext modelContext() {
+        return modelContext;
     }
 
     @Override
index 9c77304381ad9e2051ce1ac198bdc5f32007a604..47f1a0200f553676c3439f111253a5a83d780afc 100644 (file)
@@ -12,29 +12,24 @@ import static org.junit.Assert.assertNotNull;
 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);
index f890b0a9d46dad3705fa396c8dd1a1bee96145c9..aed52dea0869d61049bba78a4d4a8bf48867884d 100644 (file)
@@ -35,7 +35,7 @@ import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
 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;
 
@@ -76,7 +76,7 @@ final class JavaFileGenerator implements FileGenerator {
         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),
index c9e3ed1cb8e76c438e9685e50f451ed1ee1589ed..06a9bd48547fa96f0214ec918811f13fd5cf7bf8 100644 (file)
             <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>
index 8d9ab777f9b08b2a3c92ca981aa0292ca7fa62bc..e39a79178395cbc8a8d465055d56692f3c45cb18 100644 (file)
@@ -12,7 +12,6 @@ module org.opendaylight.mdsal.binding.runtime.api {
     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;
index 43cd0cb71209b13d8c11207c01357afc56062b15..b9219d34756230a5821a60a342b06702c33b9e7f 100644 (file)
@@ -25,7 +25,6 @@ import org.opendaylight.yangtools.yang.common.YangDataName;
 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;
 
@@ -35,7 +34,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absol
  */
 @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;
@@ -44,9 +44,8 @@ public interface BindingRuntimeContext extends EffectiveModelContextProvider, Im
         return loadClass(type.getIdentifier());
     }
 
-    @Override
-    default EffectiveModelContext getEffectiveModelContext() {
-        return getTypes().getEffectiveModelContext();
+    default @NonNull EffectiveModelContext modelContext() {
+        return getTypes().modelContext();
     }
 
     /**
index a44af58f0d4b3da5aaf7e8753e8312b6b8d811bf..0e6fb1ce415ce9cf0336341baed22e5b372acd82 100644 (file)
@@ -23,8 +23,8 @@ public interface BindingRuntimeGenerator {
      * 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);
 }
index 8114e0df1b10bf805cad79053a8c943d0cd3696a..46369f132fca22b391ce95b40fef4e9b52f2bfc8 100644 (file)
@@ -17,14 +17,21 @@ import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
 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.
      *
index 733511d47727a636ec297adc318370d5d245ec63..fa70bfb1f69accd2492e45ef5432433921ba407b 100644 (file)
@@ -8,14 +8,24 @@
 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;
 }
index 4b9982df53936ab062070c4e9f75466f4bd541e7..95dadcd1e108e7cbc96b77ee143e0ea0041cc5e2 100644 (file)
@@ -19,9 +19,7 @@ import java.util.Set;
 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;
@@ -101,12 +99,12 @@ public final class OSGiBindingRuntime {
 
         @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
index ec3a29dcb480a0fce28e14f60ae5205794823bec..a0ad3891819db4efa503ddcc4c19700d5888fa23 100644 (file)
         <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>
index ec3c2e23cee6429928d9cb981e0d52c12a026a4b..36e8fba403b5bf3123a0669b18685e77edc1d92f 100644 (file)
@@ -13,6 +13,7 @@ module org.opendaylight.mdsal.binding.runtime.spi {
     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;
index ea026071a3b8c8e47ce10528f37bd4dce170d226..e4db5c3d441f88462926c9c125ba3c2ee8056275 100644 (file)
@@ -55,7 +55,7 @@ public final class BindingRuntimeHelpers {
 
     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() {
@@ -66,7 +66,7 @@ public final class BindingRuntimeHelpers {
             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) {
@@ -89,7 +89,7 @@ public final class BindingRuntimeHelpers {
         }
 
         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,
@@ -99,10 +99,10 @@ public final class BindingRuntimeHelpers {
 
     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) {
index d5f4971a98cb0fcebcbffb49f3115064492a9310..94298c1bb1bae829a7640a8899e3207d7baf22f3 100644 (file)
@@ -18,47 +18,45 @@ import org.opendaylight.mdsal.binding.runtime.api.ModuleInfoSnapshot;
 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;
     }
 }
index 90454856ee7d5356d8af7d8afffe9901378cd5db..1564797e7e51908819449b7fad3260030120a627 100644 (file)
@@ -13,8 +13,8 @@ import com.google.common.util.concurrent.ListenableFuture;
 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 {
@@ -27,12 +27,12 @@ public abstract class ForwardingModuleInfoSnapshot extends ForwardingObject impl
     }
 
     @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);
     }
 }
index b4cce3390cd1ab61a8dc6904ff81521114ee665d..363cdab4a37cfc42144e32c027c95ed7c6fa55d4 100644 (file)
@@ -29,8 +29,8 @@ 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.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;
@@ -107,7 +107,7 @@ public final class ModuleInfoSnapshotBuilder {
 
         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());
index ab655c878286b1d785a09d6989594e6db370dcbe..d98becaabaaeafb11797060801087621a3d1cd74 100644 (file)
@@ -37,12 +37,12 @@ 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.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;
@@ -167,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;
         }
 
@@ -175,10 +175,10 @@ 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<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();
 
@@ -202,7 +202,7 @@ public final class ModuleInfoSnapshotResolver implements Mutable {
                 infoClass.getClassLoader());
         }
 
-        final var next = new DefaultModuleInfoSnapshot(effectiveModel, moduleInfos, classLoaders);
+        final var next = new DefaultModuleInfoSnapshot(modelContext, moduleInfos, classLoaders);
         currentSnapshot = next;
         return next;
     }
@@ -223,19 +223,18 @@ public final class ModuleInfoSnapshotResolver implements Mutable {
         }
     }
 
-    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) {
index 69306a65fcede737bb7bab7534584e99e1341b21..babc6783d94784d5940e0fefd9c582a7d424506b 100644 (file)
@@ -7,40 +7,31 @@
  */
 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());
     }
 }