From d62116a5cd78856140135a991b1efe09081fe127 Mon Sep 17 00:00:00 2001 From: Jie Han Date: Wed, 5 Jul 2017 22:15:48 +0800 Subject: [PATCH] Binding generator v2 - uses statement - uses implements - interfaces generated for data children extends (implements) interfaces for same children generated for referenced grouping Change-Id: I4d9cd6e31760870353c5fdb22b7d961b195db8a0 Signed-off-by: Jie Han --- .../javav2/generator/impl/GenHelperUtil.java | 48 +++++++++++++++++-- .../uses-statement/test-uses-statement1.yang | 19 ++++++++ .../uses-statement/test-uses-statement2.yang | 18 +++++++ 3 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-statement1.yang create mode 100644 binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-statement2.yang diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java index 3becdd14a6..146893bf38 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java @@ -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 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 processUsesImplements(final DataNodeContainer node, final Module module, + final SchemaContext schemaContext, Map 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 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; } 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 index 0000000000..86fe51686c --- /dev/null +++ b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-statement1.yang @@ -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 index 0000000000..019263bba9 --- /dev/null +++ b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-statement2.yang @@ -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 -- 2.36.6