Binding generator v2 - uses statement - uses implements
[mdsal.git] / binding2 / mdsal-binding2-generator-impl / src / main / java / org / opendaylight / mdsal / binding / javav2 / generator / impl / GenHelperUtil.java
index 3becdd14a67edd1e69538f66a004bfd34ff48f41..146893bf3821f3d3e8980e9a4cfb9efcd560f8c1 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;
@@ -281,6 +282,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);
@@ -654,6 +696,7 @@ final class GenHelperUtil {
             }
             resolveDataSchemaNodes(module, basePackageName, genType, genType, node.getChildNodes(), genCtx,
                     schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
+            processUsesImplements(node, module, schemaContext, genCtx, namespaceType);
         }
     }
 
@@ -1118,8 +1161,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);
         }
@@ -1196,10 +1237,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;
     }