Binding generator v2 - uses statement - uses of module 55/60455/1
authorJie Han <han.jie@zte.com.cn>
Fri, 7 Jul 2017 02:44:26 +0000 (10:44 +0800)
committerMartin Ciglan <martin.ciglan@pantheon.tech>
Mon, 17 Jul 2017 08:09:58 +0000 (08:09 +0000)
Change-Id: I8a2c5c9872be167ee0883a5a3020af7f4dc1d937
Signed-off-by: Jie Han <han.jie@zte.com.cn>
(cherry picked from commit 70c109ac0bde4fc1c1c94e423242522df0f06cc7)

binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleToGenType.java
binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/opendaylight-binding-top-level-via-uses.yang [new file with mode: 0644]

index d354d2b253fd0bacb5b69c6a34bf94f3803c3048..b1270c6bed5685d5752a884eb8bde72129522ace 100644 (file)
@@ -284,16 +284,30 @@ final class GenHelperUtil {
         return genCtx;
     }
 
+    private static QName createQNameFromSuperNode(final Object node, final SchemaNode superChildNode) {
+        QName childNodeQName = null;
+        if (node instanceof Module) {
+            childNodeQName = QName.create(((Module)node).getNamespace(), ((Module)node).getRevision(),
+                    superChildNode.getQName().getLocalName());
+        } else if (node instanceof SchemaNode) {
+            childNodeQName = QName.create(((SchemaNode)node).getQName(), superChildNode.getQName().getLocalName());
+        } else {
+            throw new IllegalArgumentException("Not support node type:" + node.toString());
+        }
+
+        return childNodeQName;
+    }
+
     static void addUsesImplements(final SchemaNode superNode, final Module superModule,
-            final SchemaNode node, final Module module,
-            final SchemaContext schemaContext, Map<Module, ModuleContext> genCtx, final BindingNamespaceType namespaceType ) {
+            final Object node, final Module module, final SchemaContext schemaContext,
+            Map<Module, ModuleContext> genCtx, final BindingNamespaceType namespaceType) {
 
         if (superNode instanceof DataNodeContainer) {
             for (DataSchemaNode superChildNode : ((DataNodeContainer)superNode).getChildNodes()) {
                 if (superChildNode instanceof DataNodeContainer || superChildNode instanceof ChoiceSchemaNode) {
-                    final QName childQName = QName.create(node.getQName(), superChildNode.getQName().getLocalName());
+                    final QName childQName = createQNameFromSuperNode(node, superChildNode);
                     DataSchemaNode childNode = ((DataNodeContainer)node).getDataChildByName(childQName);
-                    Preconditions.checkNotNull(childNode, node.getPath() + "->" + childQName.toString());
+                    Preconditions.checkNotNull(childNode, node.toString() + "->" + childQName.toString());
 
                     final GeneratedTypeBuilder type = genCtx.get(module).getChildNode(childNode.getPath());
                     final GeneratedTypeBuilder superType = genCtx.get(superModule).getChildNode(superChildNode.getPath());
@@ -320,9 +334,9 @@ final class GenHelperUtil {
             }
         } else if (superNode instanceof ChoiceSchemaNode) {
             for (ChoiceCaseNode superCaseNode : ((ChoiceSchemaNode)superNode).getCases()) {
-                final QName childQName = QName.create(node.getQName(), superCaseNode.getQName().getLocalName());
+                final QName childQName = createQNameFromSuperNode(node, superCaseNode);
                 ChoiceCaseNode caseNode = ((ChoiceSchemaNode)node).getCaseNodeByName(childQName);
-                Preconditions.checkNotNull(caseNode, node.getPath() + "->" + childQName.toString());
+                Preconditions.checkNotNull(caseNode, node.toString() + "->" + childQName.toString());
 
                 final GeneratedTypeBuilder type = genCtx.get(module).getCase(caseNode.getPath());
                 final GeneratedTypeBuilder superType = genCtx.get(superModule).getCase(superCaseNode.getPath());
@@ -332,21 +346,37 @@ final class GenHelperUtil {
                 addUsesImplements(superCaseNode, superModule, caseNode, module, schemaContext, genCtx, namespaceType);
             }
         } else {
-            throw new IllegalArgumentException("Not support node :" + node.getPath().toString());
+            throw new IllegalArgumentException("Not support super node :" + superNode.toString());
+        }
+    }
+
+    private static GroupingDefinition findGroupingNodeFromUses(final Module module, final SchemaContext schemaContext,
+            final Object parentNode, final UsesNode usesNode) {
+        SchemaNode groupingNode;
+        if (parentNode instanceof Module) {
+            final Module superModule = schemaContext.findModuleByNamespaceAndRevision(
+                    usesNode.getGroupingPath().getLastComponent().getModule().getNamespace(),
+                    usesNode.getGroupingPath().getLastComponent().getModule().getRevision());
+            groupingNode = superModule.getGroupings()
+                    .stream().filter(grouping -> grouping.getPath().equals(usesNode.getGroupingPath()))
+                    .findFirst().orElse(null);
+        } else {
+            //FIXME: Schema path is not unique for Yang 1.1, findDataSchemaNode always does search from data node first.
+            groupingNode = SchemaContextUtil.findDataSchemaNode(schemaContext, usesNode.getGroupingPath());
         }
+        Preconditions.checkNotNull(groupingNode, module.toString() + "->"
+                + usesNode.getGroupingPath().toString());
+        Preconditions.checkState(groupingNode instanceof GroupingDefinition,
+                module.toString() + "->" + usesNode.getGroupingPath().toString());
+        return (GroupingDefinition) groupingNode;
     }
 
-    static Map<Module, ModuleContext> processUsesImplements(final SchemaNode node, final Module module,
+    static Map<Module, ModuleContext> processUsesImplements(final Object node, final Module module,
             final SchemaContext schemaContext, Map<Module, ModuleContext> genCtx, final BindingNamespaceType namespaceType) {
         if (node instanceof DataNodeContainer) {
             for (final UsesNode usesNode : ((DataNodeContainer)node).getUses()) {
-                final SchemaNode groupingNode = SchemaContextUtil.findDataSchemaNode(schemaContext, usesNode.getGroupingPath());
-                Preconditions.checkNotNull(groupingNode, module.toString() + "->"
-                        + usesNode.getGroupingPath().toString());
-                Preconditions.checkState(groupingNode instanceof GroupingDefinition,
-                        module.toString() + "->" + usesNode.getGroupingPath().toString());
-                final Module superModule = SchemaContextUtil.findParentModule(schemaContext, groupingNode);
-                GroupingDefinition grouping = (GroupingDefinition) groupingNode;
+                final GroupingDefinition grouping = findGroupingNodeFromUses(module, schemaContext, node, usesNode);
+                final Module superModule = SchemaContextUtil.findParentModule(schemaContext, grouping);
                 addUsesImplements(grouping, superModule, node, module, schemaContext, genCtx, namespaceType);
             }
         }
index ab9567d2403ef981241a87644768abbe5c571b08..f9c5d041951ffff2d47bbf4b951701871dcd99b8 100644 (file)
@@ -66,6 +66,7 @@ final class ModuleToGenType {
             GenHelperUtil.resolveDataSchemaNodes(module, basePackageName, moduleType, moduleType, module
                     .getChildNodes(), genCtx, schemaContext, verboseClassComments, genTypeBuilders, typeProvider,
                     BindingNamespaceType.Data);
+            processUsesImplements(module, module, schemaContext, genCtx, BindingNamespaceType.Data);
         }
 
         //after potential parent data schema nodes
diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/opendaylight-binding-top-level-via-uses.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/opendaylight-binding-top-level-via-uses.yang
new file mode 100644 (file)
index 0000000..193f6c2
--- /dev/null
@@ -0,0 +1,22 @@
+module opendaylight-binding-top-level-via-uses {
+       yang-version 1;
+    namespace "urn:opendaylight:params:xml:ns:yang:md:sal:test:top-via-uses";
+    prefix "binding-impl";
+
+    description
+        "Regression Test model for top-level-via uses";
+
+    revision "2015-11-12" {
+        description
+            "Initial revision";
+    }
+
+    grouping container-top {
+        container container-top {
+            presence "only for testing";
+        }
+    }
+
+    uses container-top;
+
+}
\ No newline at end of file