From 70c109ac0bde4fc1c1c94e423242522df0f06cc7 Mon Sep 17 00:00:00 2001 From: Jie Han Date: Fri, 7 Jul 2017 10:44:26 +0800 Subject: [PATCH] Binding generator v2 - uses statement - uses of module Change-Id: I8a2c5c9872be167ee0883a5a3020af7f4dc1d937 Signed-off-by: Jie Han --- .../javav2/generator/impl/GenHelperUtil.java | 60 ++++++++++++++----- .../generator/impl/ModuleToGenType.java | 1 + ...endaylight-binding-top-level-via-uses.yang | 22 +++++++ 3 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/opendaylight-binding-top-level-via-uses.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 d354d2b253..b1270c6bed 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 @@ -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 genCtx, final BindingNamespaceType namespaceType ) { + final Object node, final Module module, final SchemaContext schemaContext, + Map 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 processUsesImplements(final SchemaNode node, final Module module, + static Map processUsesImplements(final Object node, final Module module, final SchemaContext schemaContext, Map 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); } } diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleToGenType.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleToGenType.java index ab9567d240..f9c5d04195 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleToGenType.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleToGenType.java @@ -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 index 0000000000..193f6c2f39 --- /dev/null +++ b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/opendaylight-binding-top-level-via-uses.yang @@ -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 -- 2.36.6