From 53dc15eb6be83d186755ee7c7426aa842b04dcd7 Mon Sep 17 00:00:00 2001 From: Jie Han Date: Mon, 5 Feb 2018 14:38:14 +0800 Subject: [PATCH] Binding V2 generator - fix choice/case - 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 --- .../builder/GeneratedTypeBuilderBase.java | 15 ++- .../generator/impl/AugmentToGenType.java | 86 +++++-------- .../javav2/generator/impl/GenHelperUtil.java | 114 ++++++------------ .../generator/impl/AugmentToGenTypeTest.java | 84 ++----------- .../builder/AbstractGeneratedTypeBuilder.java | 3 + 5 files changed, 100 insertions(+), 202 deletions(-) mode change 100644 => 100755 binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java diff --git a/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java index 587d21e0e2..070f329827 100644 --- a/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java +++ b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java @@ -138,10 +138,19 @@ public interface GeneratedTypeBuilderBase> 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); diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenType.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenType.java index c138454fe8..d63d51bf2e 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenType.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenType.java @@ -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 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 schemaPathAugmentListEntry, - final DataNodeContainer usesNodeParent, final Map genCtx, final boolean verboseClassComments, final Map> 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 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 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); } } } 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 old mode 100644 new mode 100755 index fa67281bdf..79ecf3c13d --- 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 @@ -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 genCtx, final SchemaContext schemaContext, - final boolean verboseClassComments, final Map> 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 schemaNode */ - private static GeneratedTypeBuilder addDefaultInterfaceDefinition(final String basePackageName, final SchemaNode - schemaNode, final Type parent, final Module module, final Map genCtx, + public static GeneratedTypeBuilder addDefaultInterfaceDefinition(final String basePackageName, final SchemaNode + schemaNode, @Nullable final Type childOf, final Module module, final Map genCtx, final SchemaContext schemaContext, final boolean verboseClassComments, final Map> 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 { * */ private static void choiceToGenType(final Module module, final SchemaContext schemaContext, final boolean - verboseClasssComments, final String basePackageName, final GeneratedTypeBuilder parent, final - ChoiceSchemaNode choiceNode, final Map> genTypeBuilders, - final Map genCtx, final TypeProvider typeProvider, final BindingNamespaceType namespaceType) { + verboseClasssComments, final String basePackageName, final GeneratedTypeBuilder parent, + final GeneratedTypeBuilder childOf, final ChoiceSchemaNode choiceNode, + final Map> genTypeBuilders, + final Map 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 { * */ private static void generateTypesFromChoiceCases(final Module module, final SchemaContext schemaContext, - final Map genCtx, final String basePackageName, final Type refChoiceType, - final ChoiceSchemaNode choiceNode, final boolean verboseClassComments, final TypeProvider typeProvider, - final Map> genTypeBuilders, final BindingNamespaceType namespaceType) { + final Map genCtx, final String basePackageName, final GeneratedType refChoiceType, + final ChoiceSchemaNode choiceNode, final boolean verboseClassComments, + final TypeProvider typeProvider, final Map> 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 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 groupingToGenType(final String basePackageName, final GroupingDefinition grouping, final Module module, Map genCtx, final SchemaContext schemaContext, final boolean verboseClassComments, final Map> 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); diff --git a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java index 29455cfe48..7bfc8492af 100644 --- a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java +++ b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java @@ -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 schemaPathAugmentListEntry = null; - final DataNodeContainer usesNodeParent = null; final Map genCtx = new HashMap<>(); final Map> 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 schemaPathAugmentListEntry = null; - final DataNodeContainer usesNodeParent = null; final Map genCtx = new HashMap<>(); final Map> 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 schemaPathAugmentListEntry = null; - final DataNodeContainer usesNodeParent = null; final Map genCtx = new HashMap<>(); final Map> 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 augmentNodes = new HashSet<>(); final DataSchemaNode caseNode = null; @@ -684,70 +681,15 @@ public class AugmentToGenTypeTest { final List schemaPathAugmentListEntry = new ArrayList<>(); schemaPathAugmentListEntry.add(AugmentationSchemaNode); - final DataNodeContainer usesNodeParent = null; final Map genCtx = new HashMap<>(); final Map> genTypeBuilder = new HashMap<>(); final Map 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 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 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 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> 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 augmentNodes = new HashSet<>(); final CaseSchemaNode caseNode = mock(CaseSchemaNode.class); when(caseNode.getPath()).thenReturn(path); @@ -778,7 +721,6 @@ public class AugmentToGenTypeTest { final List 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 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> genTypeBuilder = new HashMap<>(); when(schemaContext.findModule(qnamePath.getModule())).thenReturn(Optional.of(module)); final Map 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); diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java index e2af82c9c5..c2a31fdab9 100755 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java @@ -163,6 +163,8 @@ abstract class AbstractGeneratedTypeBuilder