Binding V2 generator - fix choice/case 09/67909/14
authorJie Han <han.jie@zte.com.cn>
Mon, 5 Feb 2018 06:38:14 +0000 (14:38 +0800)
committerRobert Varga <nite@hq.sk>
Mon, 5 Mar 2018 16:47:07 +0000 (16:47 +0000)
- Make generated type of choice implement Instantiable.

- Pass down the closest ancestor parent type (childOf) through
  choice/cases to their children data nodes.

- Fix generate types from augmentd choice/cases as well as
  unit tests.

- Cleanup GenHelperUtil a bit.

Change-Id: Id65d1025a173298dd25e70f36f9c8e3723d460c5
Signed-off-by: Jie Han <han.jie@zte.com.cn>
binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenType.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java [changed mode: 0644->0755]
binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java

index 587d21e0e2d326aac08d46f0e54ff28b3b8dffa0..070f3298274ae580b7294bd65a9dea96fccf5f64 100644 (file)
@@ -138,10 +138,19 @@ public interface GeneratedTypeBuilderBase<T extends GeneratedTypeBuilderBase<T>>
     EnumBuilder addEnumeration(String name, ModuleContext context);
 
     /**
-     * Sets parent type for data schema node node builder
+     * Gets parent type for data schema node builder, the parent
+     * MUST be a data tree node.
      *
-     * @param type generated parent type
-     * @return generated type
+     * @return parent generated type of tree node
+     */
+    Type getParentTypeForBuilder();
+
+    /**
+     * Sets parent type for data schema node builder, the parent
+     * MUST be a data tree node.
+     *
+     * @param type parent generated type of tree node
+     * @return parent generated type
      */
     Type setParentTypeForBuilder(Type type);
 
index c138454fe83678b8b2255e30fe894422e8f05e4d..d63d51bf2e691586f99399c7b107d147ecdb6ccc 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.annotations.Beta;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
@@ -25,6 +26,7 @@ import java.util.stream.Collectors;
 import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
+import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
@@ -242,14 +244,13 @@ final class AugmentToGenType {
 
         if (!(targetSchemaNode instanceof ChoiceSchemaNode)) {
             genCtx = GenHelperUtil.addRawAugmentGenTypeDefinition(module, augmentPackageName,
-                    targetTypeBuilder.toInstance(), targetSchemaNode, schemaPathAugmentListEntry.getValue(), genTypeBuilders, genCtx,
-                    schemaContext, verboseClassComments, typeProvider, BindingNamespaceType.Data);
+                targetTypeBuilder.toInstance(), targetSchemaNode, schemaPathAugmentListEntry.getValue(),
+                genTypeBuilders, genCtx, schemaContext, verboseClassComments, typeProvider, BindingNamespaceType.Data);
         } else {
             genCtx = generateTypesFromAugmentedChoiceCases(schemaContext, module, basePackageName,
-                    targetTypeBuilder.toInstance(), (ChoiceSchemaNode) targetSchemaNode,
-                    schemaPathAugmentListEntry.getValue(),
-                    null, genCtx, verboseClassComments, genTypeBuilders, typeProvider,
-                    BindingNamespaceType.Data);
+                targetTypeBuilder.toInstance(), (ChoiceSchemaNode) targetSchemaNode,
+                schemaPathAugmentListEntry.getValue(),genCtx, verboseClassComments, genTypeBuilders, typeProvider,
+                BindingNamespaceType.Data);
         }
         return genCtx;
     }
@@ -354,9 +355,8 @@ final class AugmentToGenType {
     @VisibleForTesting
     static Map<Module, ModuleContext> generateTypesFromAugmentedChoiceCases(
             final SchemaContext schemaContext, final Module module,
-            final String basePackageName, final Type targetType, final ChoiceSchemaNode targetNode,
+            final String basePackageName, final GeneratedType targetType, final ChoiceSchemaNode targetNode,
             final List<AugmentationSchemaNode> schemaPathAugmentListEntry,
-            final DataNodeContainer usesNodeParent,
             final Map<Module, ModuleContext> genCtx, final boolean verboseClassComments,
             final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders, final TypeProvider typeProvider,
             final BindingNamespaceType namespaceType) {
@@ -366,57 +366,35 @@ final class AugmentToGenType {
 
 
         for (final AugmentationSchemaNode augmentationSchema : schemaPathAugmentListEntry) {
-            for (final DataSchemaNode caseNode : augmentationSchema.getChildNodes()) {
-                if (caseNode != null) {
-                    final GeneratedTypeBuilder caseTypeBuilder = GenHelperUtil.addDefaultInterfaceDefinition(basePackageName,
-                            caseNode, module, genCtx, schemaContext, verboseClassComments, genTypeBuilders, typeProvider,
-                            namespaceType);
+            for (final DataSchemaNode childNode : augmentationSchema.getChildNodes()) {
+                if (childNode != null) {
+                    final GeneratedTypeBuilder caseTypeBuilder =
+                        GenHelperUtil.addDefaultInterfaceDefinition(basePackageName, childNode, null, module,
+                            genCtx, schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
                     caseTypeBuilder.addImplementsType(targetType);
+                    caseTypeBuilder.setParentTypeForBuilder(targetType.getParentTypeForBuilder());
 
-                    SchemaNode parent;
-                    final SchemaPath nodeSp = targetNode.getPath();
-                    parent = SchemaContextUtil.findDataSchemaNode(schemaContext, nodeSp.getParent());
-
-                    GeneratedTypeBuilder childOfType = null;
-                    if (parent instanceof Module) {
-                        childOfType = genCtx.get(parent).getModuleNode();
-                    } else if (parent instanceof CaseSchemaNode) {
-                        childOfType = GenHelperUtil.findCaseByPath(parent.getPath(), genCtx);
-                    } else if (parent instanceof DataSchemaNode || parent instanceof NotificationDefinition) {
-                        childOfType = GenHelperUtil.findChildNodeByPath(parent.getPath(), genCtx);
-                    } else if (parent instanceof GroupingDefinition) {
-                        childOfType = GenHelperUtil.findGroupingByPath(parent.getPath(), genCtx);
-                    }
-
-                    if (childOfType == null) {
-                        throw new IllegalArgumentException("Failed to find parent type of choice " + targetNode);
-                    }
-
-                    CaseSchemaNode node = null;
-                    final String caseLocalName = caseNode.getQName().getLocalName();
-                    if (caseNode instanceof CaseSchemaNode) {
-                        node = (CaseSchemaNode) caseNode;
-                    } else if (findNamedCase(targetNode, caseLocalName) == null) {
-                        final String targetNodeLocalName = targetNode.getQName().getLocalName();
-                        for (DataSchemaNode dataSchemaNode : usesNodeParent.getChildNodes()) {
-                            if (dataSchemaNode instanceof ChoiceSchemaNode && targetNodeLocalName.equals(dataSchemaNode.getQName
-                                    ().getLocalName())) {
-                                node = findNamedCase((ChoiceSchemaNode) dataSchemaNode, caseLocalName);
-                                break;
-                            }
-                        }
+                    //Since uses augment nodes has been processed as inline nodes,
+                    //we just take two situations below.
+                    final CaseSchemaNode caseNode;
+                    if (childNode instanceof CaseSchemaNode) {
+                        caseNode = (CaseSchemaNode) childNode;
                     } else {
-                        node = findNamedCase(targetNode, caseLocalName);
+                        caseNode = findNamedCase(targetNode, childNode.getQName().getLocalName());
+                        if (caseNode == null) {
+                            throw new IllegalArgumentException("Failed to find case node " + childNode);
+                        }
                     }
-                    final Iterable<DataSchemaNode> childNodes = node.getChildNodes();
-                    if (childNodes != null) {
-                        GenHelperUtil.resolveDataSchemaNodes(module, basePackageName, caseTypeBuilder, childOfType,
-                                childNodes, genCtx, schemaContext, verboseClassComments, genTypeBuilders, typeProvider,
-                                namespaceType);
-                        processUsesImplements(node, module, schemaContext, genCtx, namespaceType);
+
+                    final Collection<DataSchemaNode> childNodes = caseNode.getChildNodes();
+                    if (!childNodes.isEmpty()) {
+                        GenHelperUtil.resolveDataSchemaNodes(module, basePackageName, caseTypeBuilder,
+                                (GeneratedTypeBuilder) targetType.getParentTypeForBuilder(),  childNodes, genCtx,
+                            schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
+                        processUsesImplements(caseNode, module, schemaContext, genCtx, namespaceType);
                     }
-                    genCtx.get(module).addCaseType(caseNode.getPath(), caseTypeBuilder);
-                    genCtx.get(module).addChoiceToCaseMapping(targetType, caseTypeBuilder, node);
+                    genCtx.get(module).addCaseType(childNode.getPath(), caseTypeBuilder);
+                    genCtx.get(module).addChoiceToCaseMapping(targetType, caseTypeBuilder, caseNode);
                 }
             }
         }
old mode 100644 (file)
new mode 100755 (executable)
index fa67281..79ecf3c
@@ -39,6 +39,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
+import javax.annotation.Nullable;
 import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
@@ -275,14 +276,6 @@ final class GenHelperUtil {
         return module.equals(originalModule);
     }
 
-    static GeneratedTypeBuilder addDefaultInterfaceDefinition(final String basePackageName, final SchemaNode
-            schemaNode, final Module module, final Map<Module, ModuleContext> genCtx, final SchemaContext schemaContext,
-            final boolean verboseClassComments, final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders,
-            final TypeProvider typeProvider, final BindingNamespaceType namespaceType) {
-        return addDefaultInterfaceDefinition(basePackageName, schemaNode, null, module, genCtx, schemaContext,
-                verboseClassComments, genTypeBuilders, typeProvider , namespaceType);
-    }
-
     private static QName createQNameFromSuperNode(final Module module, final Object node, final SchemaNode superChildNode) {
         QName childNodeQName = null;
         if (node instanceof Module) {
@@ -520,33 +513,36 @@ final class GenHelperUtil {
      *            string contains the module package name
      * @param schemaNode
      *            schema node for which is created generated type builder
-     * @param parent
-     *            parent type (can be null)
+     * @param childOf
+     *            parent generated type of data tree node, which should be
+     *            set null if current schema node is not a data tree node.
      * @param schemaContext schema context
      * @return generated type builder <code>schemaNode</code>
      */
-    private static GeneratedTypeBuilder addDefaultInterfaceDefinition(final String basePackageName, final SchemaNode
-            schemaNode, final Type parent, final Module module, final Map<Module, ModuleContext> genCtx,
+    public static GeneratedTypeBuilder addDefaultInterfaceDefinition(final String basePackageName, final SchemaNode
+            schemaNode, @Nullable final Type childOf, final Module module, final Map<Module, ModuleContext> genCtx,
             final SchemaContext schemaContext, final boolean verboseClassComments, final Map<String, Map<String,
             GeneratedTypeBuilder>> genTypeBuilders, final TypeProvider typeProvider, final BindingNamespaceType namespaceType) {
 
         GeneratedTypeBuilder it = addRawInterfaceDefinition(basePackageName, schemaNode, schemaContext, "", "",
                 verboseClassComments, genTypeBuilders, namespaceType, genCtx.get(module));
+
         if (namespaceType.equals(BindingNamespaceType.Data)) {
-            if (parent == null) {
+            if (childOf == null) {
                 it.addImplementsType(BindingTypes.TREE_NODE);
             } else {
                 if (!(schemaNode instanceof ListSchemaNode) ||
                         ((ListSchemaNode) schemaNode).getKeyDefinition().isEmpty()) {
-                    it.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, parent, parameterizedTypeFor
-                            (BindingTypes.ITEM, it)));
+                    it.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, childOf,
+                        parameterizedTypeFor(BindingTypes.ITEM, it)));
                 }
-                it.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, it));
             }
 
-            if (!(schemaNode instanceof GroupingDefinition)) {
-                it.addImplementsType(BindingTypes.augmentable(it));
+            if (!(schemaNode instanceof CaseSchemaNode)) {
+                it.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, it));
             }
+
+            it.addImplementsType(BindingTypes.augmentable(it));
         } else {
             it.addImplementsType(BindingTypes.TREE_NODE);
         }
@@ -569,7 +565,6 @@ final class GenHelperUtil {
                         verboseClassComments, genTypeBuilders, typeProvider, BindingNamespaceType.Data);
         annotateDeprecatedIfNecessary(notification.getStatus(), notificationInterface);
         notificationInterface.addImplementsType(NOTIFICATION);
-        notificationInterface.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, notificationInterface));
         genCtx.get(module).addChildNodeType(notification, notificationInterface);
 
         // Notification object
@@ -684,7 +679,7 @@ final class GenHelperUtil {
                 listToGenType(module, basePackageName, typeBuilder, childOf, (ListSchemaNode) node, schemaContext,
                         verboseClassComments, genCtx, genTypeBuilders, typeProvider, namespaceType);
             } else if (node instanceof ChoiceSchemaNode) {
-                choiceToGenType(module, schemaContext, verboseClassComments, basePackageName, typeBuilder,
+                choiceToGenType(module, schemaContext, verboseClassComments, basePackageName, typeBuilder, childOf,
                         (ChoiceSchemaNode) node, genTypeBuilders, genCtx, typeProvider, namespaceType);
             } else if (node instanceof AnyXmlSchemaNode || node instanceof AnyDataSchemaNode) {
                 resolveAnyNodeAsMethod(schemaContext, typeBuilder, genCtx, node, module, typeProvider);
@@ -716,16 +711,19 @@ final class GenHelperUtil {
      *             </ul>
      */
     private static void choiceToGenType(final Module module, final SchemaContext schemaContext, final boolean
-            verboseClasssComments, final String basePackageName, final GeneratedTypeBuilder parent, final
-            ChoiceSchemaNode choiceNode, final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders,
-            final Map<Module, ModuleContext> genCtx, final TypeProvider typeProvider, final BindingNamespaceType namespaceType) {
+            verboseClasssComments, final String basePackageName, final GeneratedTypeBuilder parent,
+            final GeneratedTypeBuilder childOf, final ChoiceSchemaNode choiceNode,
+            final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders,
+            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, genCtx.get(module));
+            schemaContext, "", "", verboseClasssComments, genTypeBuilders, namespaceType, genCtx.get(module));
         constructGetter(parent, choiceNode.getQName().getLocalName(),
                 choiceNode.getDescription().orElse(null), choiceTypeBuilder, choiceNode.getStatus());
+        choiceTypeBuilder.setParentTypeForBuilder(childOf);
         if (namespaceType.equals(BindingNamespaceType.Data)) {
             choiceTypeBuilder.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, choiceTypeBuilder));
         }
@@ -793,7 +791,7 @@ final class GenHelperUtil {
                     final Type identifiableMarker = Types.parameterizedTypeFor(IDENTIFIABLE, genTOBuilder);
                     genTOBuilder.addImplementsType(IDENTIFIER);
                     genType.addImplementsType(identifiableMarker);
-                    genType.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, parent, parameterizedTypeFor
+                    genType.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, childOf, parameterizedTypeFor
                         (BindingTypes.IDENTIFIABLE_ITEM, genType, genTOBuilder)));
 
                 }
@@ -1044,9 +1042,10 @@ final class GenHelperUtil {
      *             </ul>
      */
     private static void generateTypesFromChoiceCases(final Module module, final SchemaContext schemaContext,
-            final Map<Module, ModuleContext> genCtx, final String basePackageName, final Type refChoiceType,
-            final ChoiceSchemaNode choiceNode, final boolean verboseClassComments, final TypeProvider typeProvider,
-            final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders, final BindingNamespaceType namespaceType) {
+            final Map<Module, ModuleContext> genCtx, final String basePackageName, final GeneratedType refChoiceType,
+            final ChoiceSchemaNode choiceNode, final boolean verboseClassComments,
+            final TypeProvider typeProvider, final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders,
+            final BindingNamespaceType namespaceType) {
         checkArgument(basePackageName != null, "Base Package Name cannot be NULL.");
         checkArgument(refChoiceType != null, "Referenced Choice Type cannot be NULL.");
         checkArgument(choiceNode != null, "ChoiceNode cannot be NULL.");
@@ -1054,53 +1053,20 @@ final class GenHelperUtil {
         for (final CaseSchemaNode caseNode : choiceNode.getCases().values()) {
             if (caseNode != null && resolveDataSchemaNodesCheck(module, schemaContext, caseNode)) {
                 final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(basePackageName, caseNode,
-                    module, genCtx, schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
+                    null, module, genCtx, schemaContext, verboseClassComments,
+                    genTypeBuilders, typeProvider, namespaceType);
                 caseTypeBuilder.addImplementsType(refChoiceType);
-                caseTypeBuilder.setParentTypeForBuilder(refChoiceType);
+                caseTypeBuilder.setParentTypeForBuilder(refChoiceType.getParentTypeForBuilder());
                 annotateDeprecatedIfNecessary(caseNode.getStatus(), caseTypeBuilder);
                 genCtx.get(module).addCaseType(caseNode.getPath(), caseTypeBuilder);
-                genCtx.get(module).addChoiceToCaseMapping(refChoiceType, caseTypeBuilder, caseNode);
-                final Iterable<DataSchemaNode> caseChildNodes = caseNode.getChildNodes();
-                if (caseChildNodes != null) {
-                    final SchemaPath choiceNodeParentPath = choiceNode.getPath().getParent();
-
-                    if (!Iterables.isEmpty(choiceNodeParentPath.getPathFromRoot())) {
-                        SchemaNode parent = findDataSchemaNode(schemaContext, choiceNodeParentPath);
-
-                        if (parent instanceof AugmentationSchemaNode) {
-                            final AugmentationSchemaNode augSchema = (AugmentationSchemaNode) parent;
-                            final SchemaPath targetPath = augSchema.getTargetPath();
-                            SchemaNode targetSchemaNode = findDataSchemaNode(schemaContext, targetPath);
-                            if (targetSchemaNode instanceof DataSchemaNode
-                                    && ((DataSchemaNode) targetSchemaNode).isAddedByUses()) {
-                                if (targetSchemaNode instanceof DerivableSchemaNode) {
-                                    targetSchemaNode = ((DerivableSchemaNode) targetSchemaNode).getOriginal().orElse(null);
-                                }
-                                if (targetSchemaNode == null) {
-                                    throw new IllegalStateException(
-                                            "Failed to find target node from grouping for augmentation " + augSchema
-                                                    + " in module " + module.getName());
-                                }
-                            }
-                            parent = targetSchemaNode;
-                        }
-
-                        Preconditions.checkState(parent != null, "Could not find Choice node parent %s",
-                                choiceNodeParentPath);
-                        GeneratedTypeBuilder childOfType = findChildNodeByPath(parent.getPath(), genCtx);
-                        if (childOfType == null) {
-                            childOfType = findGroupingByPath(parent.getPath(), genCtx);
-                        }
-                        resolveDataSchemaNodes(module, basePackageName, caseTypeBuilder, childOfType, caseChildNodes,
-                                genCtx, schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
-                    } else {
-                        final GeneratedTypeBuilder moduleType = genCtx.get(module).getModuleNode();
-                        Preconditions.checkNotNull(moduleType, "Module type can not be null.");
-                        resolveDataSchemaNodes(module, basePackageName, caseTypeBuilder, moduleType, caseChildNodes,
-                            genCtx, schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
-                    }
-                    processUsesImplements(caseNode, module, schemaContext, genCtx, namespaceType);
+                if (namespaceType.equals(BindingNamespaceType.Data)) {
+                    genCtx.get(module).addChoiceToCaseMapping(refChoiceType, caseTypeBuilder, caseNode);
                 }
+
+                resolveDataSchemaNodes(module, basePackageName, caseTypeBuilder,
+                        (GeneratedTypeBuilder) refChoiceType.getParentTypeForBuilder(), caseNode.getChildNodes(),
+                    genCtx, schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
+                processUsesImplements(caseNode, module, schemaContext, genCtx, namespaceType);
             }
         }
     }
@@ -1189,7 +1155,7 @@ final class GenHelperUtil {
                 listToGenType(module, basePackageName, typeBuilder, typeBuilder, (ListSchemaNode) schemaNode,
                         schemaContext, verboseClassComments, genCtx, genTypeBuilders, typeProvider, namespaceType);
             } else if (schemaNode instanceof ChoiceSchemaNode) {
-                choiceToGenType(module, schemaContext, verboseClassComments, basePackageName, typeBuilder,
+                choiceToGenType(module, schemaContext, verboseClassComments, basePackageName, typeBuilder, typeBuilder,
                         (ChoiceSchemaNode) schemaNode, genTypeBuilders, genCtx, typeProvider, namespaceType);
             }
         }
@@ -1224,7 +1190,7 @@ final class GenHelperUtil {
                 listToGenType(module, basePackageName, typeBuilder, typeBuilder, (ListSchemaNode) schemaNode,
                         schemaContext, verboseClassComments, genCtx, genTypeBuilders, typeProvider, namespaceType);
             } else if (schemaNode instanceof ChoiceSchemaNode) {
-                choiceToGenType(module, schemaContext, verboseClassComments, basePackageName, typeBuilder,
+                choiceToGenType(module, schemaContext, verboseClassComments, basePackageName, typeBuilder, typeBuilder,
                         (ChoiceSchemaNode) schemaNode, genTypeBuilders, genCtx, typeProvider, namespaceType);
             }
         }
@@ -1351,7 +1317,7 @@ final class GenHelperUtil {
     private static Map<Module, ModuleContext> groupingToGenType(final String basePackageName, final GroupingDefinition grouping, final Module
             module, Map<Module, ModuleContext> genCtx, final SchemaContext schemaContext, final boolean
             verboseClassComments, final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders, final TypeProvider typeProvider) {
-        final GeneratedTypeBuilder genType = addDefaultInterfaceDefinition(basePackageName, grouping, module, genCtx,
+        final GeneratedTypeBuilder genType = addDefaultInterfaceDefinition(basePackageName, grouping, null, module, genCtx,
                 schemaContext, verboseClassComments, genTypeBuilders, typeProvider, BindingNamespaceType.Grouping);
         annotateDeprecatedIfNecessary(grouping.getStatus(), genType);
         genCtx.get(module).addGroupingType(grouping, genType);
index 29455cfe48f91a444f5a177f41ee3dedab1e22cd..7bfc8492af309248eea30e2b54830d7dc7b40158 100644 (file)
@@ -28,6 +28,7 @@ import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTypeBuilderImpl;
 import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl;
+import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
@@ -606,16 +607,15 @@ public class AugmentToGenTypeTest {
         final SchemaContext schemaContext = null;
         final Module module = null;
         final String pckgName = null;
-        final Type targetType = null;
+        final GeneratedType targetType = null;
         final ChoiceSchemaNode targetNode = null;
         final List<AugmentationSchemaNode> schemaPathAugmentListEntry = null;
-        final DataNodeContainer usesNodeParent = null;
         final Map<Module, ModuleContext> genCtx = new HashMap<>();
         final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilder = new HashMap<>();
 
         try {
             AugmentToGenType.generateTypesFromAugmentedChoiceCases(schemaContext, module, pckgName, targetType,
-                targetNode, schemaPathAugmentListEntry, usesNodeParent, genCtx, false, genTypeBuilder, null,
+                targetNode, schemaPathAugmentListEntry, genCtx, false, genTypeBuilder, null,
                 BindingNamespaceType.Data);
             fail();
         } catch (final IllegalArgumentException e) {
@@ -628,16 +628,15 @@ public class AugmentToGenTypeTest {
         final SchemaContext schemaContext = null;
         final Module module = null;
         final String pckgName = "";
-        final Type targetType = null;
+        final GeneratedType targetType = null;
         final ChoiceSchemaNode targetNode = null;
         final List<AugmentationSchemaNode> schemaPathAugmentListEntry = null;
-        final DataNodeContainer usesNodeParent = null;
         final Map<Module, ModuleContext> genCtx = new HashMap<>();
         final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilder = new HashMap<>();
 
         try {
             AugmentToGenType.generateTypesFromAugmentedChoiceCases(schemaContext, module, pckgName, targetType,
-                targetNode, schemaPathAugmentListEntry, usesNodeParent, genCtx, false, genTypeBuilder, null,
+                targetNode, schemaPathAugmentListEntry, genCtx, false, genTypeBuilder, null,
                 BindingNamespaceType.Data);
             fail();
         } catch (final IllegalArgumentException e) {
@@ -650,17 +649,15 @@ public class AugmentToGenTypeTest {
         final SchemaContext schemaContext = null;
         final Module module = null;
         final String pckgName = "";
-        final Type targetType = mock(Type.class);
+        final GeneratedType targetType = mock(GeneratedType.class);
         final ChoiceSchemaNode targetNode = null;
         final List<AugmentationSchemaNode> schemaPathAugmentListEntry = null;
-        final DataNodeContainer usesNodeParent = null;
         final Map<Module, ModuleContext> genCtx = new HashMap<>();
         final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilder = new HashMap<>();
 
-        final Object[] args = {  };
         try {
             AugmentToGenType.generateTypesFromAugmentedChoiceCases(schemaContext, module, pckgName, targetType,
-                targetNode, schemaPathAugmentListEntry, usesNodeParent, genCtx, false, genTypeBuilder, null,
+                targetNode, schemaPathAugmentListEntry, genCtx, false, genTypeBuilder, null,
                 BindingNamespaceType.Data);
             fail();
         } catch (final IllegalArgumentException e) {
@@ -673,7 +670,7 @@ public class AugmentToGenTypeTest {
         final SchemaContext schemaContext = null;
         final Module module = null;
         final String pckgName = "";
-        final Type targetType = mock(Type.class);
+        final GeneratedType targetType = mock(GeneratedType.class);
         final ChoiceSchemaNode targetNode = null;
         final Set<DataSchemaNode> augmentNodes = new HashSet<>();
         final DataSchemaNode caseNode = null;
@@ -684,70 +681,15 @@ public class AugmentToGenTypeTest {
         final List<AugmentationSchemaNode> schemaPathAugmentListEntry = new ArrayList<>();
         schemaPathAugmentListEntry.add(AugmentationSchemaNode);
 
-        final DataNodeContainer usesNodeParent = null;
         final Map<Module, ModuleContext> genCtx = new HashMap<>();
         final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilder = new HashMap<>();
 
         final Map<Module, ModuleContext> result = AugmentToGenType.generateTypesFromAugmentedChoiceCases(schemaContext,
-            module, pckgName, targetType, targetNode, schemaPathAugmentListEntry, usesNodeParent, genCtx, false,
+            module, pckgName, targetType, targetNode, schemaPathAugmentListEntry, genCtx, false,
             genTypeBuilder, null, BindingNamespaceType.Data);
         assertEquals(genCtx, result);
     }
 
-    @Test
-    public void generateTypesFromAugmentedChoiceCasesNullChildTest() {
-        final QName qnamePath = QName.create("test", "2017-04-04", "chcase");
-        final QName qnamePath2 = QName.create("test", "2017-04-04", "chcase2");
-        final SchemaPath path = SchemaPath.create(true, qnamePath, qnamePath2);
-
-        final SchemaContext schemaContext = mock(SchemaContext.class);
-        final Module module = mock(Module.class);
-        when(module.getName()).thenReturn("test-module-case");
-        final DataSchemaNode schemaNode = mock(DataSchemaNode.class);
-        when(module.getDataChildByName(qnamePath)).thenReturn(schemaNode);
-        when(module.getRevision()).thenReturn(qnamePath.getRevision());
-        when(module.getNamespace()).thenReturn(qnamePath.getNamespace());
-        final String pckgName = "test.augment.choice.cases";
-        final Type targetType = mock(Type.class);
-        when(targetType.getFullyQualifiedName()).thenReturn(Augmentable.class.getName());
-        final Set<DataSchemaNode> augmentNodes = new HashSet<>();
-        final CaseSchemaNode caseNode = mock(CaseSchemaNode.class);
-        when(caseNode.getPath()).thenReturn(path);
-        when(caseNode.getQName()).thenReturn(qnamePath);
-        when(caseNode.getDescription()).thenReturn(Optional.empty());
-        when(caseNode.getReference()).thenReturn(Optional.empty());
-
-        augmentNodes.add(caseNode);
-
-        final AugmentationSchemaNode AugmentationSchemaNode = mock(AugmentationSchemaNode.class);
-        when(AugmentationSchemaNode.getChildNodes()).thenReturn(augmentNodes);
-        final List<AugmentationSchemaNode> schemaPathAugmentListEntry = new ArrayList<>();
-        schemaPathAugmentListEntry.add(AugmentationSchemaNode);
-
-        final DataNodeContainer usesNodeParent = null;
-        final ChoiceSchemaNode targetNode = mock(ChoiceSchemaNode.class);
-        when(targetNode.getPath()).thenReturn(path);
-        when(targetNode.getDescription()).thenReturn(Optional.empty());
-        when(targetNode.getReference()).thenReturn(Optional.empty());
-
-        final Map<Module, ModuleContext> genCtx = new HashMap<>();
-        genCtx.put(module, new ModuleContext());
-        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(pckgName, "test-case-node-augment", genCtx.get(module));
-        genCtx.get(module).addCaseType(path, gtb);
-        final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilder = new HashMap<>();
-
-        when(schemaContext.findModule(qnamePath.getModule())).thenReturn(Optional.of(module));
-
-        try {
-            AugmentToGenType.generateTypesFromAugmentedChoiceCases(schemaContext, module, pckgName, targetType,
-                targetNode, schemaPathAugmentListEntry, usesNodeParent, genCtx, false, genTypeBuilder, null,
-                BindingNamespaceType.Data);
-            fail();
-        } catch (final IllegalArgumentException e) {
-            assertEquals("Failed to find parent type of choice " + targetNode, e.getMessage());
-        }
-    }
-
     @Test
     public void generateTypesFromAugmentedChoiceCasesTest() {
         final QName qnamePath = QName.create("test", "2017-04-04", "chcase");
@@ -763,8 +705,9 @@ public class AugmentToGenTypeTest {
         when(module.getRevision()).thenReturn(qnamePath.getRevision());
         when(module.getNamespace()).thenReturn(qnamePath.getNamespace());
         final String pckgName = "test.augment.choice.cases";
-        final Type targetType = mock(Type.class);
+        final GeneratedType targetType = mock(GeneratedType.class);
         when(targetType.getFullyQualifiedName()).thenReturn(Augmentable.class.getName());
+
         final Set<DataSchemaNode> augmentNodes = new HashSet<>();
         final CaseSchemaNode caseNode = mock(CaseSchemaNode.class);
         when(caseNode.getPath()).thenReturn(path);
@@ -778,7 +721,6 @@ public class AugmentToGenTypeTest {
         final List<AugmentationSchemaNode> schemaPathAugmentListEntry = new ArrayList<>();
         schemaPathAugmentListEntry.add(AugmentationSchemaNode);
 
-        final DataNodeContainer usesNodeParent = null;
         final ChoiceSchemaNode targetNode = mock(ChoiceSchemaNode.class);
         when(targetNode.getPath()).thenReturn(path);
         when(targetNode.getDescription()).thenReturn(Optional.empty());
@@ -786,14 +728,14 @@ public class AugmentToGenTypeTest {
         final Map<Module, ModuleContext> genCtx = new HashMap<>();
         final ModuleContext moduleContext = new ModuleContext();
         final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(pckgName, "test-case-node-augment", moduleContext);
-        moduleContext.addCaseType(path, gtb);
+        when(targetType.getParentTypeForBuilder()).thenReturn(gtb);
         genCtx.put(module, moduleContext);
         final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilder = new HashMap<>();
 
         when(schemaContext.findModule(qnamePath.getModule())).thenReturn(Optional.of(module));
 
         final Map<Module, ModuleContext> result = AugmentToGenType.generateTypesFromAugmentedChoiceCases(schemaContext,
-            module, pckgName, targetType, targetNode, schemaPathAugmentListEntry, usesNodeParent, genCtx, false,
+            module, pckgName, targetType, targetNode, schemaPathAugmentListEntry, genCtx, false,
             genTypeBuilder, null, BindingNamespaceType.Data);
         assertNotNull(result);
         assertEquals(result.get(module), moduleContext);
index e2af82c9c5d408c9aab23b81653067e7d6c312bd..c2a31fdab9189a793e9826a5d58c1db55b6980cc 100755 (executable)
@@ -163,6 +163,8 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         return constant;
     }
 
+
+
     @Override
     public Type setParentTypeForBuilder(Type type) {
         return this.parentTypeForBuilder = type;
@@ -272,6 +274,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         return null;
     }
 
+    @Override
     public Type getParentTypeForBuilder() {
         return parentTypeForBuilder;
     }