Bump yangtools to 5.0.0-SNAPSHOT 92/87092/22
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 23 Jan 2020 07:01:07 +0000 (08:01 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 24 Feb 2020 07:18:47 +0000 (08:18 +0100)
This adopts yangtools-5.0.0 at snapshots, so we can shake out
integation issues and base our development on yt-5.0.0 changes.

This forces us to refactor mdsal-binding-dom-codec-osgi, which
is done in this patch. We adopt OSGi DS for tracking services.

JIRA: MDSAL-392
Change-Id: Ib5f7cb9817869ca5fc9053af4620d9536a27dcbf
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
27 files changed:
binding/binding-parent/pom.xml
binding/maven-sal-api-gen-plugin/pom.xml
binding/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/mdsal/binding/yang/unified/doc/generator/GeneratorImpl.xtend
binding/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/mdsal/binding/yang/wadl/generator/WadlRestconfGenerator.xtend
binding/maven-sal-api-gen-plugin/src/test/java/org/opendaylight/mdsal/binding/yang/unified/doc/generator/maven/DocGenTest.java
binding/maven-sal-api-gen-plugin/src/test/java/org/opendaylight/mdsal/binding/yang/unified/doc/generator/maven/YangModuleInfoCompilationTest.java
binding/maven-sal-api-gen-plugin/src/test/java/org/opendaylight/mdsal/binding/yang/wadl/generator/maven/WadlGenTest.java
binding/mdsal-binding-dom-codec-osgi/pom.xml
binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/impl/BindingClassLoadingStrategy.java [moved from binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/impl/Activator.java with 50% similarity]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecPrototype.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/yang/types/GroupingDefinitionDependencySort.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/yang/types/TypedefResolver.java
binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/binding/runtime/api/AbstractBindingRuntimeContext.java
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/ModuleInfoBackedContext.java
docs/pom.xml
dom/dom-parent/pom.xml
features/feature-parent/pom.xml
features/odl-mdsal-binding-api/src/main/feature/feature.xml
features/odl-mdsal-binding-base/src/main/feature/feature.xml
features/odl-mdsal-binding-runtime/src/main/feature/feature.xml
features/odl-mdsal-common/src/main/feature/feature.xml
features/odl-mdsal-dom-api/src/main/feature/feature.xml
features/odl-mdsal-dom-broker/src/main/feature/feature.xml
features/odl-mdsal-eos-common/src/main/feature/feature.xml
features/odl-mdsal-exp-yanglib-api/src/main/feature/feature.xml
features/odl-mdsal-uint24-netty/src/main/feature/feature.xml

index fef8f014029a2e2daedbea7cc63c76efb5897b67..068431a9e6d3d468a69b461e625092049f88e7ba 100644 (file)
@@ -58,7 +58,7 @@
                         <plugin>
                             <groupId>org.opendaylight.yangtools</groupId>
                             <artifactId>yang-maven-plugin</artifactId>
-                            <version>4.0.7</version>
+                            <version>5.0.0-SNAPSHOT</version>
                             <dependencies>
                                 <dependency>
                                     <groupId>org.opendaylight.mdsal</groupId>
index 381b9eedc8f3558b7dfdcf469c7f55f3c18592b8..36a01e5b481b4ec75530c356014adb8570bb5327 100644 (file)
@@ -39,7 +39,7 @@
             <dependency>
                 <groupId>org.opendaylight.yangtools</groupId>
                 <artifactId>yangtools-artifacts</artifactId>
-                <version>4.0.7</version>
+                <version>5.0.0-SNAPSHOT</version>
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
index 06d55edf783e37124c66393f63ae689d476a7b5e..e8fc818c11bc9ecc08eec7516ac1ff0311ea10dc 100644 (file)
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.mdsal.binding.yang.unified.doc.generator
 
-import com.google.common.collect.Iterables
-import com.google.common.collect.Lists
 import java.io.BufferedWriter
 import java.io.File
 import java.io.IOException
@@ -47,6 +45,8 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode
 import org.opendaylight.yangtools.yang.model.api.SchemaPath
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition
 import org.opendaylight.yangtools.yang.model.api.UsesNode
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute
 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition
 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition
 import org.opendaylight.yangtools.yang.model.api.type.Int8TypeDefinition
@@ -318,7 +318,7 @@ class GeneratorImpl {
             «FOR augment : module.augmentations»
                 <li>
                     <h3 id="«schemaPathToString(module, augment.targetPath, context, augment)»">
-                    Target [«typeAnchorLink(augment.targetPath,schemaPathToString(module, augment.targetPath, context, augment))»]</h3>
+                    Target [«typeAnchorLink(augment.targetPath.asSchemaPath, schemaPathToString(module, augment.targetPath, context, augment))»]</h3>
                     «augment.description»
                         Status: «strong(String.valueOf(augment.status))»
                     «IF augment.reference !== null»
@@ -346,9 +346,9 @@ class GeneratorImpl {
         return ''
     }
 
-    private def parseTargetPath(SchemaPath path) {
-        val List<DataSchemaNode> nodes = new ArrayList<DataSchemaNode>();
-        for (QName pathElement : path.pathFromRoot) {
+    private def parseTargetPath(SchemaNodeIdentifier path) {
+        val nodes = new ArrayList<DataSchemaNode>();
+        for (QName pathElement : path.nodeIdentifiers) {
             val module = ctx.findModule(pathElement.module)
             if (module.isPresent) {
                 var foundNode = module.get.getDataChildByName(pathElement)
@@ -368,7 +368,7 @@ class GeneratorImpl {
             lastNodeInTargetPath = nodes.get(nodes.size() - 1)
         }
 
-        val List<DataSchemaNode> targetPathNodes = new ArrayList<DataSchemaNode>();
+        val targetPathNodes = new ArrayList<DataSchemaNode>();
         targetPathNodes.add(lastNodeInTargetPath)
 
         return targetPathNodes
@@ -435,10 +435,10 @@ class GeneratorImpl {
     }
 
     private def printChoiceNode(ChoiceSchemaNode child) {
-        val List<CaseSchemaNode> cases = new ArrayList(child.cases.values);
-        if(!cases.empty) {
+        val cases = new ArrayList(child.cases)
+        if (!cases.empty) {
             val CaseSchemaNode aCase = cases.get(0)
-            for(caseChildNode : aCase.childNodes)
+            for (caseChildNode : aCase.childNodes)
                 printAugmentedNode(caseChildNode)
         }
     }
@@ -767,10 +767,10 @@ class GeneratorImpl {
 
     private def dispatch CharSequence tree(ChoiceSchemaNode node,YangInstanceIdentifier path) '''
         «node.nodeName» (choice)
-        «casesTree(node.cases.values, path)»
+        «casesTree(node.cases, path)»
     '''
 
-    def casesTree(Collection<CaseSchemaNode> nodes, YangInstanceIdentifier path) '''
+    def casesTree(Collection<? extends CaseSchemaNode> nodes, YangInstanceIdentifier path) '''
         <ul>
         «FOR node : nodes»
             <li>
@@ -839,7 +839,7 @@ class GeneratorImpl {
 
     def String typeAnchorLink(SchemaPath path, CharSequence text) {
         if(path !== null) {
-            val lastElement = Iterables.getLast(path.pathFromRoot)
+            val lastElement = path.lastComponent
             val ns = lastElement.namespace
             if (ns == this.currentModule.namespace) {
                 return '''<a href="#«path.schemaPathToId»">«text»</a>'''
@@ -878,7 +878,7 @@ class GeneratorImpl {
             return '''
                 «printInfo(node, "choice")»
                 «listItem("default case", node.defaultCase.map([ CaseSchemaNode n | n.getQName.localName]).orElse(null))»
-                «FOR caseNode : node.cases.values»
+                «FOR caseNode : node.cases»
                     «caseNode.printSchemaNodeInfo»
                 «ENDFOR»
                 </ul>
@@ -934,7 +934,7 @@ class GeneratorImpl {
 
     def CharSequence printUses(UsesNode usesNode) {
         return '''
-            «strong(listItem("uses", typeAnchorLink(usesNode.groupingPath, usesNode.groupingPath.pathTowardsRoot.iterator.next.localName)))»
+            «strong(listItem("uses", typeAnchorLink(usesNode.sourceGrouping.path, usesNode.sourceGrouping.path.pathTowardsRoot.iterator.next.localName)))»
             <ul>
             <li>refines:
                 <ul>
@@ -944,7 +944,7 @@ class GeneratorImpl {
                 </ul>
             </li>
             «FOR augment : usesNode.augmentations»
-                «typeAnchorLink(augment.targetPath,schemaPathToString(currentModule, augment.targetPath, ctx, augment))»
+                «typeAnchorLink(augment.targetPath.asSchemaPath, schemaPathToString(currentModule, augment.targetPath, ctx, augment))»
             «ENDFOR»
             </ul>
         '''
@@ -1092,7 +1092,7 @@ class GeneratorImpl {
     '''
 
     private def dispatch CharSequence printInfo(ChoiceSchemaNode node, int level, YangInstanceIdentifier path) '''
-        «val Set<DataSchemaNode> choiceCases = new HashSet(node.cases.values
+        «val Set<DataSchemaNode> choiceCases = new HashSet(node.cases)»
         «choiceCases.printChildren(level, path)»
     '''
 
@@ -1208,10 +1208,11 @@ class GeneratorImpl {
         return it.toString;
     }
 
-    private def String schemaPathToString(Module module, SchemaPath schemaPath, EffectiveModelContext ctx, DataNodeContainer dataNode) {
-            val List<QName> path = Lists.newArrayList(schemaPath.pathFromRoot);
+    private def String schemaPathToString(Module module, SchemaNodeIdentifier schemaPath, EffectiveModelContext ctx,
+            DataNodeContainer dataNode) {
+        val path = schemaPath.nodeIdentifiers
         val StringBuilder pathString = new StringBuilder()
-        if (schemaPath.absolute) {
+        if (schemaPath instanceof Absolute) {
             pathString.append('/')
         }
 
@@ -1449,7 +1450,7 @@ class GeneratorImpl {
             result.append('/')
         }
         if (path !== null && !path.empty) {
-            val List<QName> actual = new ArrayList()
+            val actual = new ArrayList()
             var i = 0;
             for (pathElement : path) {
                 actual.add(pathElement)
@@ -1474,15 +1475,11 @@ class GeneratorImpl {
     '''
 
     private def dispatch isAddedBy(SchemaNode node) {
-        return false;
+        return false
     }
 
     private def dispatch isAddedBy(DataSchemaNode node) {
-        if (node.augmenting || node.addedByUses) {
-            return true
-        } else {
-            return false;
-        }
+        return node.augmenting || node.addedByUses
     }
 
     private def dispatch nodeName(SchemaNode node) '''
index 7cbdcec13bca9f4d07fdc8405f03062031bd9781..b9237e0bab0ae02acfff4ac42867a4125eb6a632 100644 (file)
@@ -13,9 +13,9 @@ import java.io.OutputStreamWriter
 import java.net.URI
 import java.nio.charset.StandardCharsets
 import java.util.ArrayList
+import java.util.Collection
 import java.util.HashSet
 import java.util.List
-import java.util.Set
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode
@@ -42,7 +42,7 @@ class WadlRestconfGenerator {
         this.buildContext = buildContext
     }
 
-    def generate(EffectiveModelContext context, Set<Module> modules) {
+    def generate(EffectiveModelContext context, Collection<? extends Module> modules) {
         val result = new HashSet;
         this.context = context
         for (module : modules) {
index 6d94bdea4de74f762e691271a2a3290421d984ff..9e54aebdaf7c3ab25ec9578588076d14fb480c3d 100644 (file)
@@ -23,7 +23,6 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 import org.sonatype.plexus.build.incremental.DefaultBuildContext;
 
@@ -51,11 +50,10 @@ public class DocGenTest {
     public void testListGeneration() throws Exception {
         final List<File> sourceFiles = getSourceFiles("/doc-gen");
         final EffectiveModelContext context = YangParserTestUtils.parseYangFiles(sourceFiles);
-        final Set<Module> modules = context.getModules();
         final DocumentationGeneratorImpl generator = new DocumentationGeneratorImpl();
         generator.setBuildContext(new DefaultBuildContext());
-        Collection<File> generatedFiles = generator.generateSources(context, GENERATOR_OUTPUT_DIR, modules,
-            module -> Optional.empty());
+        Collection<File> generatedFiles = generator.generateSources(context, GENERATOR_OUTPUT_DIR,
+            Set.copyOf(context.getModules()), module -> Optional.empty());
         assertEquals(4, generatedFiles.size());
     }
 
index daa07c673d8fa4e58df5b3e8bd7c94e7b6bb6406..cee5dfd251256aa84143c71b86bb4eaf2087d351 100644 (file)
@@ -148,7 +148,7 @@ public class YangModuleInfoCompilationTest {
         final EffectiveModelContext context = YangParserTestUtils.parseYangFiles(sourceFiles);
         CodeGeneratorImpl codegen = new CodeGeneratorImpl();
         codegen.setBuildContext(new DefaultBuildContext());
-        codegen.generateSources(context, sourcesOutputDir, context.getModules(),
+        codegen.generateSources(context, sourcesOutputDir, Set.copyOf(context.getModules()),
             module -> Optional.of(resourceDirPath + File.separator + module.getName()
             + YangConstants.RFC6020_YANG_FILE_EXTENSION));
     }
@@ -162,7 +162,7 @@ public class YangModuleInfoCompilationTest {
         codegen.setResourceBaseDir(null);
         codegen.setMavenProject(new MavenProject());
         codegen.setAdditionalConfig(ImmutableMap.of("test", "test"));
-        Collection<File> files = codegen.generateSources(context, null, context.getModules(),
+        Collection<File> files = codegen.generateSources(context, null, Set.copyOf(context.getModules()),
             module -> Optional.of(module.getName()));
         assertFalse(files.isEmpty());
         files.forEach(file -> {
index d19d5e20c2d0d879978bcfcabd7eec47d7ec5e06..ae95922cfa90704498ac5d88b0551ab33404887a 100644 (file)
@@ -24,7 +24,6 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 import org.sonatype.plexus.build.incremental.DefaultBuildContext;
 
@@ -53,11 +52,10 @@ public class WadlGenTest {
     public void testListGeneration() throws Exception {
         final List<File> sourceFiles = getSourceFiles("/wadl-gen");
         final EffectiveModelContext context = YangParserTestUtils.parseYangFiles(sourceFiles);
-        final Set<Module> modules = context.getModules();
         final WadlGenerator generator = new WadlGenerator();
         generator.setBuildContext(new DefaultBuildContext());
-        Collection<File> generatedWadlFiles = generator.generateSources(context, GENERATOR_OUTPUT_DIR, modules,
-            module -> Optional.empty());
+        Collection<File> generatedWadlFiles = generator.generateSources(context, GENERATOR_OUTPUT_DIR,
+            Set.copyOf(context.getModules()), module -> Optional.empty());
         assertEquals(3, generatedWadlFiles.size());
         generatedWadlFiles.forEach(file -> assertTrue(file.exists()));
     }
@@ -66,10 +64,9 @@ public class WadlGenTest {
     public void testListGenerationWithoutPath() throws Exception {
         final List<File> sourceFiles = getSourceFiles("/wadl-gen");
         final EffectiveModelContext context = YangParserTestUtils.parseYangFiles(sourceFiles);
-        final Set<Module> modules = context.getModules();
         final WadlGenerator generator = new WadlGenerator();
         generator.setBuildContext(new DefaultBuildContext());
-        Collection<File> generatedWadlFiles = generator.generateSources(context, null, modules,
+        Collection<File> generatedWadlFiles = generator.generateSources(context, null, Set.copyOf(context.getModules()),
             module -> Optional.empty());
         assertEquals(3, generatedWadlFiles.size());
         generatedWadlFiles.forEach(file -> {
index 104a21ccc92c74945839d84b1c37904b5554e4af..7311fa57614e68fa9921c95c274fcf10697cff26 100644 (file)
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-dom-codec</artifactId>
         </dependency>
+
+        <!-- FIXME: MDSAL-392: this is ugly, we should be looking this up,
+                               but then we may want to end up doing something
+                               completely different in thes artifacts -->
         <dependency>
-            <!-- FIXME: MDSAL-392: this is ugly, we should be looking this up,
-                 but then we may want to end up doing something
-                 completely different in this artifact -->
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-generator-impl</artifactId>
         </dependency>
+
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-runtime-spi</artifactId>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.cmpn</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.opendaylight.yangtools</groupId>
@@ -59,7 +65,6 @@
                 <configuration>
                     <instructions>
                         <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
-                        <Bundle-Activator>org.opendaylight.mdsal.binding.dom.codec.osgi.impl.Activator</Bundle-Activator>
                     </instructions>
                 </configuration>
             </plugin>
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others.  All rights reserved.
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -7,29 +7,33 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.osgi.impl;
 
-import java.util.ArrayList;
-import java.util.List;
 import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
 import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 import org.opendaylight.binding.runtime.spi.ModuleInfoBackedContext;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
+import org.opendaylight.yangtools.yang.model.parser.api.YangParserFactory;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public final class Activator implements BundleActivator {
-    private static final Logger LOG = LoggerFactory.getLogger(Activator.class);
+@Component(immediate = true)
+public final class BindingClassLoadingStrategy implements ClassLoadingStrategy {
+    private static final Logger LOG = LoggerFactory.getLogger(BindingClassLoadingStrategy.class);
 
-    private final List<ServiceRegistration<?>> registrations = new ArrayList<>(2);
+    @Reference
+    YangParserFactory factory = null;
 
     private ModuleInfoBundleTracker bundleTracker = null;
+    private ModuleInfoBackedContext moduleInfoBackedContext = null;
 
-    @Override
-    public void start(final BundleContext context) {
+    @Activate
+    void activate(final ComponentContext ctx) {
         LOG.info("Binding-DOM codec starting");
 
-        final ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create(
+        moduleInfoBackedContext = ModuleInfoBackedContext.create("binding-dom-codec", factory,
             // FIXME: This is the fallback strategy, it should not be needed
             GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy());
 
@@ -37,26 +41,24 @@ public final class Activator implements BundleActivator {
                 moduleInfoBackedContext);
 
         LOG.debug("Starting Binding-DOM codec bundle tracker");
-        bundleTracker = new ModuleInfoBundleTracker(context, registry);
+        bundleTracker = new ModuleInfoBundleTracker(ctx.getBundleContext(), registry);
         bundleTracker.open();
 
-        LOG.debug("Registering Binding-DOM codec services");
-        registrations.add(context.registerService(ClassLoadingStrategy.class, moduleInfoBackedContext, null));
-
         LOG.info("Binding-DOM codec started");
     }
 
-    @Override
-    public void stop(final BundleContext context) {
+    @Deactivate
+    void deactivate() {
         LOG.info("Binding-DOM codec stopping");
-
-        LOG.debug("Unregistering Binding-DOM codec services");
-        registrations.forEach(ServiceRegistration::unregister);
-        registrations.clear();
-
         LOG.debug("Stopping Binding-DOM codec bundle tracker");
         bundleTracker.close();
-
+        moduleInfoBackedContext = null;
+        bundleTracker = null;
         LOG.info("Binding-DOM codec stopped");
     }
+
+    @Override
+    public Class<?> loadClass(final String fullyQualifiedName) throws ClassNotFoundException {
+        return moduleInfoBackedContext.loadClass(fullyQualifiedName);
+    }
 }
index 85c4d6100137f1000cd00e3a286603896bf78ea3..73a52cfd12108d6d303b4d518aaeb428b9b90c02 100644 (file)
@@ -146,7 +146,7 @@ final class DataContainerCodecPrototype<T extends WithStatus> implements NodeCon
         } else if (nodeSchema instanceof ChoiceSchemaNode) {
             boolean haveAddressable = false;
             boolean haveUnaddressable = false;
-            for (CaseSchemaNode child : ((ChoiceSchemaNode) nodeSchema).getCases().values()) {
+            for (CaseSchemaNode child : ((ChoiceSchemaNode) nodeSchema).getCases()) {
                 switch (computeChildAddressabilitySummary(child)) {
                     case ADDRESSABLE:
                         haveAddressable = true;
index 7ecd4b16046bbb00ff7d0546ec775631bec6b631..8246669480c5806a86c653ccd2d40d1c4f1eb65a 100644 (file)
@@ -120,6 +120,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
@@ -141,8 +142,8 @@ abstract class AbstractTypeGenerator {
      * Comparator based on augment target path.
      */
     private static final Comparator<AugmentationSchemaNode> AUGMENT_COMP = (o1, o2) -> {
-        final Iterator<QName> thisIt = o1.getTargetPath().getPathFromRoot().iterator();
-        final Iterator<QName> otherIt = o2.getTargetPath().getPathFromRoot().iterator();
+        final Iterator<QName> thisIt = o1.getTargetPath().getNodeIdentifiers().iterator();
+        final Iterator<QName> otherIt = o2.getTargetPath().getNodeIdentifiers().iterator();
 
         while (thisIt.hasNext()) {
             if (!otherIt.hasNext()) {
@@ -478,7 +479,7 @@ abstract class AbstractTypeGenerator {
 
     private Optional<ActionDefinition> findOrigAction(final DataNodeContainer parent, final ActionDefinition action) {
         for (UsesNode uses : parent.getUses()) {
-            final GroupingDefinition grp = findUsedGrouping(uses);
+            final GroupingDefinition grp = uses.getSourceGrouping();
             final Optional<ActionDefinition> found = grp.findAction(action.getQName());
             if (found.isPresent()) {
                 final ActionDefinition result = found.get();
@@ -823,10 +824,11 @@ abstract class AbstractTypeGenerator {
                 "Augmentation Schema does not contain Target Path (Target Path is NULL).");
 
         processUsesAugments(augSchema, context, false);
-        final SchemaPath targetPath = augSchema.getTargetPath();
+        final SchemaNodeIdentifier targetPath = augSchema.getTargetPath();
         SchemaNode targetSchemaNode = null;
 
-        targetSchemaNode = findDataSchemaNode(schemaContext, targetPath);
+        // FIXME: can we use findDataSchemaNode() instead?
+        targetSchemaNode = findDataSchemaNode(schemaContext, targetPath.getNodeIdentifiers());
         if (targetSchemaNode instanceof DataSchemaNode && ((DataSchemaNode) targetSchemaNode).isAddedByUses()) {
             if (targetSchemaNode instanceof DerivableSchemaNode) {
                 targetSchemaNode = ((DerivableSchemaNode) targetSchemaNode).getOriginal().orElse(null);
@@ -864,7 +866,7 @@ abstract class AbstractTypeGenerator {
                 "Augmentation Schema does not contain Target Path (Target Path is NULL).");
 
         processUsesAugments(augSchema, context, inGrouping);
-        final SchemaPath targetPath = augSchema.getTargetPath();
+        final SchemaNodeIdentifier targetPath = augSchema.getTargetPath();
         final SchemaNode targetSchemaNode = findOriginalTargetFromGrouping(targetPath, usesNode);
         if (targetSchemaNode == null) {
             throw new IllegalArgumentException("augment target not found: " + targetPath);
@@ -893,16 +895,6 @@ abstract class AbstractTypeGenerator {
         }
     }
 
-    private GroupingDefinition findUsedGrouping(final UsesNode uses) {
-        final SchemaNode targetGrouping = findNodeInSchemaContext(schemaContext, uses.getGroupingPath()
-            .getPathFromRoot());
-        if (targetGrouping instanceof GroupingDefinition) {
-            return (GroupingDefinition) targetGrouping;
-        }
-
-        throw new IllegalArgumentException("Failed to resolve used grouping for " + uses);
-    }
-
     /**
      * Convenient method to find node added by uses statement.
      *
@@ -910,11 +902,12 @@ abstract class AbstractTypeGenerator {
      * @param parentUsesNode parent of uses node
      * @return node from its original location in grouping
      */
-    private DataSchemaNode findOriginalTargetFromGrouping(final SchemaPath targetPath, final UsesNode parentUsesNode) {
-        SchemaNode result = findUsedGrouping(parentUsesNode);
-        for (final QName node : targetPath.getPathFromRoot()) {
+    private static DataSchemaNode findOriginalTargetFromGrouping(final SchemaNodeIdentifier targetPath,
+            final UsesNode parentUsesNode) {
+        SchemaNode result = parentUsesNode.getSourceGrouping();
+        for (final QName node : targetPath.getNodeIdentifiers()) {
             if (result instanceof DataNodeContainer) {
-                final QName resultNode = node.withModule(result.getQName().getModule());
+                final QName resultNode = node.bindTo(result.getQName().getModule());
                 result = ((DataNodeContainer) result).getDataChildByName(resultNode);
             } else if (result instanceof ChoiceSchemaNode) {
                 result = findNamedCase((ChoiceSchemaNode) result, node.getLocalName());
@@ -1188,7 +1181,7 @@ abstract class AbstractTypeGenerator {
         checkArgument(refChoiceType != null, "Referenced Choice Type cannot be NULL.");
         checkArgument(choiceNode != null, "ChoiceNode cannot be NULL.");
 
-        for (final CaseSchemaNode caseNode : choiceNode.getCases().values()) {
+        for (final CaseSchemaNode caseNode : choiceNode.getCases()) {
             if (caseNode != null && !caseNode.isAddedByUses() && !caseNode.isAugmenting()) {
                 final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(context, caseNode);
                 caseTypeBuilder.addImplementsType(refChoiceType);
@@ -1205,8 +1198,10 @@ abstract class AbstractTypeGenerator {
 
                         if (parent instanceof AugmentationSchemaNode) {
                             final AugmentationSchemaNode augSchema = (AugmentationSchemaNode) parent;
-                            final SchemaPath targetPath = augSchema.getTargetPath();
-                            SchemaNode targetSchemaNode = findDataSchemaNode(schemaContext, targetPath);
+                            final SchemaNodeIdentifier targetPath = augSchema.getTargetPath();
+                            // FIXME: can we use findDataSchemaNode?
+                            SchemaNode targetSchemaNode = findNodeInSchemaContext(schemaContext,
+                                targetPath.getNodeIdentifiers());
                             if (targetSchemaNode instanceof DataSchemaNode
                                     && ((DataSchemaNode) targetSchemaNode).isAddedByUses()) {
                                 if (targetSchemaNode instanceof DerivableSchemaNode) {
@@ -1324,7 +1319,7 @@ abstract class AbstractTypeGenerator {
     }
 
     private static CaseSchemaNode findNamedCase(final ChoiceSchemaNode choice, final String caseName) {
-        final List<CaseSchemaNode> cases = choice.findCaseNodes(caseName);
+        final List<? extends CaseSchemaNode> cases = choice.findCaseNodes(caseName);
         return cases.isEmpty() ? null : cases.get(0);
     }
 
@@ -1926,10 +1921,10 @@ abstract class AbstractTypeGenerator {
     private GeneratedTypeBuilder addImplementedInterfaceFromUses(final DataNodeContainer dataNodeContainer,
             final GeneratedTypeBuilder builder) {
         for (final UsesNode usesNode : dataNodeContainer.getUses()) {
-            final GeneratedTypeBuilder genType = findGroupingByPath(usesNode.getGroupingPath());
+            final GeneratedTypeBuilder genType = findGrouping(usesNode.getSourceGrouping());
             if (genType == null) {
-                throw new IllegalStateException("Grouping " + usesNode.getGroupingPath() + "is not resolved for "
-                        + builder.getName());
+                throw new IllegalStateException("Grouping " + usesNode.getSourceGrouping().getQName()
+                    + " is not resolved for " + builder.getName());
             }
 
             builder.addImplementsType(genType.build());
@@ -1947,6 +1942,16 @@ abstract class AbstractTypeGenerator {
         return null;
     }
 
+    private GeneratedTypeBuilder findGrouping(final GroupingDefinition grouping) {
+        for (final ModuleContext ctx : genCtx.values()) {
+            final GeneratedTypeBuilder result = ctx.getGrouping(grouping.getPath());
+            if (result != null) {
+                return result;
+            }
+        }
+        return null;
+    }
+
     private GeneratedTypeBuilder findGroupingByPath(final SchemaPath path) {
         for (final ModuleContext ctx : genCtx.values()) {
             final GeneratedTypeBuilder result = ctx.getGrouping(path);
index 59aba315b6d22e182de415c6a299121e591899b0..f3a910af4279e247340457d34afcc193292c1a92 100644 (file)
@@ -26,7 +26,6 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
 import org.opendaylight.yangtools.yang.model.api.NotificationNodeContainer;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
 
 public class GroupingDefinitionDependencySort {
@@ -72,12 +71,12 @@ public class GroupingDefinitionDependencySort {
      * @return set of nodes where every one contains wrapped grouping definition
      */
     private Set<Node> groupingDefinitionsToNodes(final Collection<? extends GroupingDefinition> groupingDefinitions) {
-        final Map<SchemaPath, Node> nodeMap = new HashMap<>();
+        final Map<GroupingDefinition, Node> nodeMap = new HashMap<>();
         final Set<Node> resultNodes = new HashSet<>();
 
         for (final GroupingDefinition groupingDefinition : groupingDefinitions) {
             final Node node = new NodeWrappedType(groupingDefinition);
-            nodeMap.put(groupingDefinition.getPath(), node);
+            nodeMap.put(groupingDefinition, node);
             resultNodes.add(node);
         }
 
@@ -88,12 +87,9 @@ public class GroupingDefinitionDependencySort {
             Set<UsesNode> usesNodes = getAllUsesNodes(groupingDefinition);
 
             for (UsesNode usesNode : usesNodes) {
-                SchemaPath schemaPath = usesNode.getGroupingPath();
-                if (schemaPath != null) {
-                    Node nodeTo = nodeMap.get(schemaPath);
-                    if (nodeTo != null) {
-                        nodeWrappedType.addEdge(nodeTo);
-                    }
+                Node nodeTo = nodeMap.get(usesNode.getSourceGrouping());
+                if (nodeTo != null) {
+                    nodeWrappedType.addEdge(nodeTo);
                 }
             }
         }
@@ -125,7 +121,7 @@ public class GroupingDefinitionDependencySort {
             if (childNode instanceof DataNodeContainer) {
                 ret.addAll(getAllUsesNodes((DataNodeContainer) childNode));
             } else if (childNode instanceof ChoiceSchemaNode) {
-                for (CaseSchemaNode choiceCaseNode : ((ChoiceSchemaNode) childNode).getCases().values()) {
+                for (CaseSchemaNode choiceCaseNode : ((ChoiceSchemaNode) childNode).getCases()) {
                     ret.addAll(getAllUsesNodes(choiceCaseNode));
                 }
             }
index 8988b97ce8a979bac2c8be60dc48df53a9853baf..9874be5e256cfb1286a92177219dda68b7e8324e 100644 (file)
@@ -55,7 +55,7 @@ final class TypedefResolver {
                     } else if (childNode instanceof ListSchemaNode) {
                         fillRecursively(list, (ListSchemaNode) childNode);
                     } else if (childNode instanceof ChoiceSchemaNode) {
-                        for (final CaseSchemaNode caseNode : ((ChoiceSchemaNode) childNode).getCases().values()) {
+                        for (CaseSchemaNode caseNode : ((ChoiceSchemaNode) childNode).getCases()) {
                             fillRecursively(list, caseNode);
                         }
                     }
index cf36fad9a99454d6e4adc6fdb02a52b51c9b7899..e14538fd31f6447a175fbb54cc837e044713cb41 100644 (file)
@@ -358,7 +358,7 @@ public abstract class AbstractBindingRuntimeContext implements BindingRuntimeCon
 
     private static @NonNull Optional<CaseSchemaNode> findInstantiatedCase(final ChoiceSchemaNode instantiatedChoice,
             final CaseSchemaNode originalDefinition) {
-        CaseSchemaNode potential = instantiatedChoice.getCaseNodeByName(originalDefinition.getQName());
+        CaseSchemaNode potential = instantiatedChoice.findCase(originalDefinition.getQName()).orElse(null);
         if (originalDefinition.equals(potential)) {
             return Optional.of(potential);
         }
index 02666536acbe180c781be73ebeabb95d0608b34e..afb2afb3c2a19f71f82ea91c94aea020b7fb5996 100644 (file)
@@ -44,6 +44,7 @@ import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
+import org.opendaylight.yangtools.yang.model.parser.api.YangParserFactory;
 import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
 import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceException;
@@ -61,7 +62,8 @@ public class ModuleInfoBackedContext extends GeneratedClassLoadingStrategy
     private static final class WithFallback extends ModuleInfoBackedContext {
         private final @NonNull ClassLoadingStrategy fallback;
 
-        WithFallback(final ClassLoadingStrategy fallback) {
+        WithFallback(final YangTextSchemaContextResolver resolver, final ClassLoadingStrategy fallback) {
+            super(resolver);
             this.fallback = requireNonNull(fallback);
         }
 
@@ -146,7 +148,7 @@ public class ModuleInfoBackedContext extends GeneratedClassLoadingStrategy
                     }
             });
 
-    private final YangTextSchemaContextResolver ctxResolver = YangTextSchemaContextResolver.create("binding-context");
+    private final YangTextSchemaContextResolver ctxResolver;
 
     @GuardedBy("this")
     private final ListMultimap<String, AbstractRegisteredModuleInfo> packageToInfoReg =
@@ -155,8 +157,8 @@ public class ModuleInfoBackedContext extends GeneratedClassLoadingStrategy
     private final ListMultimap<SourceIdentifier, AbstractRegisteredModuleInfo> sourceToInfoReg =
             MultimapBuilder.hashKeys().arrayListValues().build();
 
-    ModuleInfoBackedContext() {
-        // Hidden on purpose
+    ModuleInfoBackedContext(final YangTextSchemaContextResolver resolver) {
+        this.ctxResolver = requireNonNull(resolver);
     }
 
     @Beta
@@ -166,11 +168,28 @@ public class ModuleInfoBackedContext extends GeneratedClassLoadingStrategy
     }
 
     public static ModuleInfoBackedContext create() {
-        return new ModuleInfoBackedContext();
+        return create("unnamed");
+    }
+
+    public static ModuleInfoBackedContext create(final String id) {
+        return new ModuleInfoBackedContext(YangTextSchemaContextResolver.create(id));
     }
 
     public static ModuleInfoBackedContext create(final ClassLoadingStrategy loadingStrategy) {
-        return new WithFallback(loadingStrategy);
+        return create("unnamed", loadingStrategy);
+    }
+
+    public static ModuleInfoBackedContext create(final String id, final ClassLoadingStrategy loadingStrategy) {
+        return new WithFallback(YangTextSchemaContextResolver.create(id), loadingStrategy);
+    }
+
+    public static ModuleInfoBackedContext create(final String id, final YangParserFactory factory) {
+        return new ModuleInfoBackedContext(YangTextSchemaContextResolver.create(id, factory));
+    }
+
+    public static ModuleInfoBackedContext create(final String id, final YangParserFactory factory,
+            final ClassLoadingStrategy loadingStrategy) {
+        return new WithFallback(YangTextSchemaContextResolver.create(id, factory), loadingStrategy);
     }
 
     @Override
index 8f59477f5791f95ebe4c30a1ebeb4d82540b3047..7f7b49e9afd1d0c55c6cce7857091f1be8c73852 100644 (file)
             <artifactId>org.osgi.core</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.cmpn</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>org.apache.aries.blueprint</groupId>
             <artifactId>blueprint-maven-plugin-annotation</artifactId>
                         <link>https://commons.apache.org/proper/commons-lang/javadocs/api-3.9/</link>
                         <link>https://commons.apache.org/proper/commons-codec/apidocs/</link>
 
-                        <link>https://www.javadoc.io/doc/org.opendaylight.yangtools/yangtools-docs/4.0.7/</link>
+                        <link>https://www.javadoc.io/doc/org.opendaylight.yangtools/yangtools-docs/5.0.0-SNAPSHOT/</link>
                     </links>
                     <groups>
                         <group>
index 3cc4da70eb5c3d356943b3eca949fbd9671d7e27..c7ed1e6abfb120477f8438ff107361613fb36a01 100644 (file)
@@ -29,7 +29,7 @@
             <dependency>
                 <groupId>org.opendaylight.yangtools</groupId>
                 <artifactId>yangtools-artifacts</artifactId>
-                <version>4.0.7</version>
+                <version>5.0.0-SNAPSHOT</version>
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
index 8745f630ab99117aedbf175fa92d6b6397fb5360..2e33b51b93c8f30aea08454b00b8eb8bb6a08c3c 100644 (file)
@@ -27,7 +27,7 @@
             <dependency>
                 <groupId>org.opendaylight.yangtools</groupId>
                 <artifactId>yangtools-artifacts</artifactId>
-                <version>4.0.7</version>
+                <version>5.0.0-SNAPSHOT</version>
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
index 29aba2d51c5d5a9c3ed54e83ba477e3af8f6b6f8..ecb2c4d397a9a34720070ca46c0e64cc7507c156 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-mdsal-binding-api">
     <feature name="odl-mdsal-binding-api">
-        <feature version="[4,5)">odl-yangtools-data-api</feature>
+        <feature version="[5,6)">odl-yangtools-data-api</feature>
     </feature>
 </features>
index ee7db4d88592c79257390f00d90bf9bec2be8b80..068e0e0fd18345bd0769e7b84778194824d7a978 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-mdsal-binding-base">
     <feature name="odl-mdsal-binding-base">
-        <feature version="[4,5)">odl-yangtools-common</feature>
+        <feature version="[5,6)">odl-yangtools-common</feature>
     </feature>
 </features>
index b730ef358612e9b9e4ed7c258e7a4a728bd983c9..7ab803defbf3c5fc2322b7608600b8fdfdab82e9 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-mdsal-binding-runtime">
     <feature name="odl-mdsal-binding-runtime">
-        <feature version="[4,5)">odl-yangtools-data</feature>
-        <feature version="[4,5)">odl-yangtools-parser</feature>
+        <feature version="[5,6)">odl-yangtools-data</feature>
+        <feature version="[5,6)">odl-yangtools-parser</feature>
     </feature>
 </features>
index 320a4a483aafa38b673f6798171302889770d1e5..416e93bad406ed23decdfbf9a3625b3e00eb1f8c 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-mdsal-common">
     <feature name="odl-mdsal-common">
-        <feature version="[4,5)">odl-yangtools-common</feature>
+        <feature version="[5,6)">odl-yangtools-common</feature>
     </feature>
 </features>
index 5222412bfe4f61070ddf356488b36d9fb4c7d659..91241ed70946b42e69621384d3c4d2700ace6591 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-mdsal-dom-api">
     <feature name="odl-mdsal-dom-api">
-        <feature version="[4,5)">odl-yangtools-data-api</feature>
+        <feature version="[5,6)">odl-yangtools-data-api</feature>
     </feature>
 </features>
index 40d80839560ff82198a5725ee3417ede05ba4eaf..36e24ded02cb402dffda53ae0f94b4a1e00d4620 100644 (file)
@@ -2,7 +2,7 @@
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-mdsal-dom-broker">
     <feature name="odl-mdsal-dom-broker">
         <feature version="[6,7)">odl-lmax-3</feature>
-        <feature version="[4,5)">odl-yangtools-data</feature>
-        <feature version="[4,5)">odl-yangtools-parser</feature>
+        <feature version="[5,6)">odl-yangtools-data</feature>
+        <feature version="[5,6)">odl-yangtools-parser</feature>
     </feature>
 </features>
index ee18c07c66f45169d8af1d4ae7d4388575bfed2f..a5e489b33ecaeee8299053b72acea6eb064ab71b 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-mdsal-eos-common">
     <feature name="odl-mdsal-eos-common">
-        <feature version="[4,5)">odl-yangtools-data-api</feature>
+        <feature version="[5,6)">odl-yangtools-data-api</feature>
     </feature>
 </features>
index 1b6996da43bf74a47a4834203970eabd57c30326..0461deea9b79b125621ea23e8fa2fb4a323e7313 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-mdsal-exp-yanglib-api">
     <feature name="odl-mdsal-exp-yanglib-api">
-        <feature version="[4,5)">odl-yangtools-data-api</feature>
+        <feature version="[5,6)">odl-yangtools-data-api</feature>
     </feature>
 </features>
index 542c2e60f6c3602fbb05e01e43b030f2dbebcf21..47dacdc94f8c45b2e21308b48b38598a8a96e145 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-mdsal-uint24-netty">
     <feature name="odl-mdsal-uint24-netty">
-        <feature version="[4,5)">odl-yangtools-netty</feature>
+        <feature version="[5,6)">odl-yangtools-netty</feature>
     </feature>
 </features>