Binding generator v2 - uses statement - uses of module
[mdsal.git] / binding2 / mdsal-binding2-generator-impl / src / main / java / org / opendaylight / mdsal / binding / javav2 / generator / impl / GenHelperUtil.java
index bea588774f8eae3402049fce3d5952767fae5ef8..b1270c6bed5685d5752a884eb8bde72129522ace 100644 (file)
@@ -284,52 +284,101 @@ 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);
-                if (superChildNode instanceof ListSchemaNode
-                        && !((ListSchemaNode)superChildNode).getKeyDefinition().isEmpty()) {
-                    if (namespaceType.equals(BindingNamespaceType.Grouping)) {
-                        genCtx.get(module).getKeyType(childNode.getPath())
-                                .addImplementsType(genCtx.get(superModule).getKeyType(superChildNode.getPath()));
-                    } else if (namespaceType.equals(BindingNamespaceType.Data)){
-                        genCtx.get(module).getKeyGenTO(childNode.getPath())
-                                .addImplementsType(genCtx.get(superModule).getKeyType(superChildNode.getPath()));
+    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 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 = createQNameFromSuperNode(node, superChildNode);
+                    DataSchemaNode childNode = ((DataNodeContainer)node).getDataChildByName(childQName);
+                    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());
+
+                    //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);
+                    if (superChildNode instanceof ListSchemaNode
+                            && !((ListSchemaNode) superChildNode).getKeyDefinition().isEmpty()) {
+                        if (namespaceType.equals(BindingNamespaceType.Grouping)) {
+                            genCtx.get(module).getKeyType(childNode.getPath())
+                                    .addImplementsType(genCtx.get(superModule).getKeyType(superChildNode.getPath()));
+                        } else if (namespaceType.equals(BindingNamespaceType.Data)) {
+                            genCtx.get(module).getKeyGenTO(childNode.getPath())
+                                    .addImplementsType(genCtx.get(superModule).getKeyType(superChildNode.getPath()));
+                        }
+                    }
+                    addUsesImplements(superChildNode, superModule, childNode, module, schemaContext, genCtx, namespaceType);
                 }
-                addUsesImplements((DataNodeContainer)superChildNode, superModule, (DataNodeContainer)childNode, module, schemaContext, genCtx, namespaceType);
             }
+        } else if (superNode instanceof ChoiceSchemaNode) {
+            for (ChoiceCaseNode superCaseNode : ((ChoiceSchemaNode)superNode).getCases()) {
+                final QName childQName = createQNameFromSuperNode(node, superCaseNode);
+                ChoiceCaseNode caseNode = ((ChoiceSchemaNode)node).getCaseNodeByName(childQName);
+                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());
+                Preconditions.checkNotNull(type, module.toString() + "->" + caseNode.getPath().toString());
+                Preconditions.checkNotNull(superType, superModule.toString() + "->" + superCaseNode.getPath().toString());
+                type.addImplementsType(superType);
+                addUsesImplements(superCaseNode, superModule, caseNode, module, schemaContext, genCtx, namespaceType);
+            }
+        } else {
+            throw new IllegalArgumentException("Not support super node :" + superNode.toString());
         }
     }
 
-    static Map<Module, ModuleContext> processUsesImplements(final DataNodeContainer node, final Module module,
-            final SchemaContext schemaContext, Map<Module, ModuleContext> genCtx, final BindingNamespaceType namespaceType) {
+    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;
+    }
 
-        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);
+    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 GroupingDefinition grouping = findGroupingNodeFromUses(module, schemaContext, node, usesNode);
+                final Module superModule = SchemaContextUtil.findParentModule(schemaContext, grouping);
+                addUsesImplements(grouping, superModule, node, module, schemaContext, genCtx, namespaceType);
+            }
         }
         return genCtx;
     }
@@ -684,12 +733,14 @@ final class GenHelperUtil {
             final Map<Module, ModuleContext> genCtx, final TypeProvider typeProvider, final BindingNamespaceType namespaceType) {
         checkArgument(basePackageName != null, "Base Package Name cannot be NULL.");
         checkArgument(choiceNode != null, "Choice Schema Node cannot be NULL.");
-        
+
         final GeneratedTypeBuilder choiceTypeBuilder = addRawInterfaceDefinition(basePackageName, choiceNode,
                 schemaContext, "", "", verboseClasssComments, genTypeBuilders, namespaceType);
         constructGetter(parent, choiceNode.getQName().getLocalName(),
                 choiceNode.getDescription(), choiceTypeBuilder, choiceNode.getStatus());
-        choiceTypeBuilder.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, choiceTypeBuilder));
+        if (namespaceType.equals(BindingNamespaceType.Data)) {
+            choiceTypeBuilder.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, choiceTypeBuilder));
+        }
         annotateDeprecatedIfNecessary(choiceNode.getStatus(), choiceTypeBuilder);
         genCtx.get(module).addChildNodeType(choiceNode, choiceTypeBuilder);
         generateTypesFromChoiceCases(module, schemaContext, genCtx, basePackageName, choiceTypeBuilder.toInstance(),
@@ -706,13 +757,7 @@ final class GenHelperUtil {
                 schemaContext, verboseClassComments, genCtx, genTypeBuilders, typeProvider, namespaceType);
         if (genType != null) {
             StringBuilder getterName = new StringBuilder(node.getQName().getLocalName());
-            if (!namespaceType.equals(BindingNamespaceType.Data)) {
-                getterName.append('_').append(BindingNamespaceType.Data);
-            }
             final MethodSignatureBuilder getter = constructGetter(parent, getterName.toString(), node.getDescription(), genType, node.getStatus());
-            if (!namespaceType.equals(BindingNamespaceType.Data)) {
-                getter.setAccessModifier(AccessModifier.DEFAULT);
-            }
             resolveDataSchemaNodes(module, basePackageName, genType, genType, node.getChildNodes(), genCtx,
                     schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
             processUsesImplements(node, module, schemaContext, genCtx, namespaceType);