Binding generator v2 - uses statement - uses implements 74/60274/2
authorJie Han <han.jie@zte.com.cn>
Wed, 5 Jul 2017 14:15:48 +0000 (22:15 +0800)
committerRobert Varga <nite@hq.sk>
Sat, 15 Jul 2017 22:18:44 +0000 (22:18 +0000)
- interfaces generated for data children extends (implements) interfaces for
  same children generated for referenced grouping

Change-Id: I4d9cd6e31760870353c5fdb22b7d961b195db8a0
Signed-off-by: Jie Han <han.jie@zte.com.cn>
(cherry picked from commit d62116a5cd78856140135a991b1efe09081fe127)

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

index 66f31373e0ca3866b66804deea2110322f28ef4d..cee0557915d1ef1ab9befcf977080b8c435ae2bf 100644 (file)
@@ -66,6 +66,7 @@ import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
 import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentable;
 import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
 import org.opendaylight.yangtools.yang.model.api.AnyDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -271,6 +272,47 @@ final class GenHelperUtil {
         return genCtx;
     }
 
+
+    static void addUsesImplements(final DataNodeContainer superNode, final Module superModule,
+            final DataNodeContainer node, final Module module,
+            final SchemaContext schemaContext, Map<Module, ModuleContext> genCtx, final BindingNamespaceType namespaceType ) {
+        for (SchemaNode superChildNode : superNode.getChildNodes()) {
+            if (superChildNode instanceof DataNodeContainer) {
+                final QName childQName = QName.create(((SchemaNode)node).getQName(), superChildNode.getQName().getLocalName());
+                DataSchemaNode childNode = node.getDataChildByName(childQName);
+                Preconditions.checkNotNull(childNode, ((SchemaNode) node).getPath() + "->" + childQName.toString());
+
+                final GeneratedTypeBuilder type = genCtx.get(module).getChildNode(childNode.getPath());
+                final GeneratedTypeBuilder superType = genCtx.get(superModule).getChildNode(superChildNode.getPath());
+
+                //TODO:delete this after supporting uses augment
+                if (type == null || superType == null) {
+                    return;
+                }
+                Preconditions.checkNotNull(type, module.toString() + "->" + childNode.getPath().toString());
+                Preconditions.checkNotNull(superType, superModule.toString() + "->" + superChildNode.getPath().toString());
+                type.addImplementsType(superType);
+                addUsesImplements((DataNodeContainer)superChildNode, superModule, (DataNodeContainer)childNode, module, schemaContext, genCtx, namespaceType);
+            }
+        }
+    }
+
+    static Map<Module, ModuleContext> processUsesImplements(final DataNodeContainer node, final Module module,
+            final SchemaContext schemaContext, Map<Module, ModuleContext> genCtx, final BindingNamespaceType namespaceType) {
+
+        for (final UsesNode usesNode : 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;
+            addUsesImplements(grouping, superModule, node, module, schemaContext, genCtx, namespaceType);
+        }
+        return genCtx;
+    }
+
     static GeneratedTypeBuilder findChildNodeByPath(final SchemaPath path, final Map<Module, ModuleContext> genCtx) {
         for (final ModuleContext ctx : genCtx.values()) {
             final GeneratedTypeBuilder result = ctx.getChildNode(path);
@@ -644,6 +686,7 @@ final class GenHelperUtil {
             }
             resolveDataSchemaNodes(module, basePackageName, genType, genType, node.getChildNodes(), genCtx,
                     schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
+            processUsesImplements(node, module, schemaContext, genCtx, namespaceType);
         }
     }
 
@@ -1108,8 +1151,6 @@ final class GenHelperUtil {
         genType.setParentTypeForBuilder(childOf);
         if (node instanceof DataNodeContainer) {
             genCtx.get(module).addChildNodeType(node, genType);
-            genCtx = groupingsToGenTypes(module, ((DataNodeContainer) node).getGroupings(), genCtx, schemaContext,
-                    verboseClassComments, genTypeBuilders, typeProvider);
             processUsesAugments(schemaContext, (DataNodeContainer) node, module, genCtx, genTypeBuilders,
                     verboseClassComments, typeProvider, namespaceType);
         }
@@ -1186,10 +1227,9 @@ final class GenHelperUtil {
         genCtx.get(module).addGroupingType(grouping, genType);
         resolveDataSchemaNodes(module, basePackageName, genType, genType, grouping.getChildNodes(), genCtx,
                 schemaContext, verboseClassComments, genTypeBuilders, typeProvider, BindingNamespaceType.Grouping);
-        genCtx = groupingsToGenTypes(module, grouping.getGroupings(), genCtx, schemaContext, verboseClassComments,
-                genTypeBuilders, typeProvider);
         genCtx = processUsesAugments(schemaContext, grouping, module, genCtx, genTypeBuilders, verboseClassComments,
                 typeProvider, BindingNamespaceType.Grouping);
+        genCtx = processUsesImplements(grouping, module, schemaContext, genCtx, BindingNamespaceType.Grouping);
         return genCtx;
     }
 
diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-statement1.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-statement1.yang
new file mode 100644 (file)
index 0000000..86fe516
--- /dev/null
@@ -0,0 +1,19 @@
+module test-uses-statement1 {
+    yang-version 1.1;
+
+    namespace "urn:test:uses:statement1";
+    prefix test-uses-statement1;
+    organization "test.type.org";
+    revision "2017-06-30";
+
+    grouping simple {
+        container foo;
+        leaf bar {
+            type string;
+        }
+    }
+
+    container top {
+        uses simple;
+    }
+}
\ No newline at end of file
diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-statement2.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-statement2.yang
new file mode 100644 (file)
index 0000000..019263b
--- /dev/null
@@ -0,0 +1,18 @@
+module test-uses-statement2 {
+    yang-version 1.1;
+
+    namespace "urn:test:uses:statement2";
+    prefix test-uses-statement2;
+    organization "test.type.org";
+    revision "2017-06-30";
+
+    grouping with-inner {
+        grouping inner {
+            container cont;
+        }
+        uses inner;
+    }
+    container top {
+        uses with-inner;
+    }
+}
\ No newline at end of file