X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding2%2Fmdsal-binding2-generator-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fjavav2%2Fgenerator%2Fimpl%2FGenHelperUtil.java;h=ee592c584daf9d01f4433d74cd843364371d528f;hb=3035ac7215c3c66af829ece2903628415b77b6ad;hp=9d9fa5cde8c1b9b7551d9ea8caa58a6d437fc224;hpb=8d19626640b8f6cab9ed3e0f9908fa3c416956e5;p=mdsal.git 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 9d9fa5cde8..ee592c584d --- 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 @@ -12,7 +12,6 @@ import static com.google.common.base.Preconditions.checkArgument; import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.addTOToTypeBuilder; import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.annotateDeprecatedIfNecessary; import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.constructGetter; -import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.createDescription; import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.createReturnTypeForUnion; import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.getAugmentIdentifier; import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.isInnerType; @@ -28,18 +27,18 @@ import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes. import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes.NOTIFICATION; import static org.opendaylight.mdsal.binding.javav2.generator.util.Types.parameterizedTypeFor; import static org.opendaylight.mdsal.binding.javav2.generator.util.Types.wildcardTypeFor; -import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNode; +import static org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeGenHelper.resolveRegExpressions; import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findParentModule; import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; -import com.google.common.collect.Iterables; import java.util.Collection; import java.util.HashMap; 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; @@ -47,10 +46,11 @@ import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes; import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier; import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer; import org.opendaylight.mdsal.binding.javav2.generator.util.ReferencedTypeImpl; +import org.opendaylight.mdsal.binding.javav2.generator.util.TypeComments; import org.opendaylight.mdsal.binding.javav2.generator.util.Types; import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedPropertyBuilderImpl; -import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTOBuilderImpl; import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTypeBuilderImpl; +import org.opendaylight.mdsal.binding.javav2.generator.yang.types.BaseYangTypes; import org.opendaylight.mdsal.binding.javav2.generator.yang.types.GroupingDefinitionDependencySort; import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl; import org.opendaylight.mdsal.binding.javav2.model.api.AccessModifier; @@ -58,6 +58,7 @@ import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType; import org.opendaylight.mdsal.binding.javav2.model.api.ParameterizedType; import org.opendaylight.mdsal.binding.javav2.model.api.Restrictions; import org.opendaylight.mdsal.binding.javav2.model.api.Type; +import org.opendaylight.mdsal.binding.javav2.model.api.YangSourceDefinition; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.EnumBuilder; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedPropertyBuilder; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder; @@ -92,6 +93,7 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UsesNode; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition; import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils; @@ -126,9 +128,14 @@ final class GenHelperUtil { genCtx.get(module)); addImplementedInterfaceFromUses(module, moduleDataTypeBuilder, genCtx); moduleDataTypeBuilder.addImplementsType(BindingTypes.TREE_ROOT); - moduleDataTypeBuilder.addComment(module.getDescription().orElse(null)); - moduleDataTypeBuilder.setDescription(createDescription(module, verboseClassComments)); - moduleDataTypeBuilder.setReference(module.getReference().orElse(null)); + + if (verboseClassComments) { + YangSourceDefinition.of(module).ifPresent(moduleDataTypeBuilder::setYangSourceDefinition); + TypeComments.description(module).ifPresent(moduleDataTypeBuilder::addComment); + module.getDescription().ifPresent(moduleDataTypeBuilder::setDescription); + module.getReference().ifPresent(moduleDataTypeBuilder::setReference); + } + return moduleDataTypeBuilder; } @@ -155,8 +162,12 @@ final class GenHelperUtil { final String moduleName = new StringBuilder(module.getName()).append('_').append(postfix).toString(); final GeneratedTypeBuilderImpl moduleBuilder = new GeneratedTypeBuilderImpl(packageName, moduleName, context); - moduleBuilder.setDescription(createDescription(module, verboseClassComments)); - moduleBuilder.setReference(module.getReference().orElse(null)); + if (verboseClassComments) { + YangSourceDefinition.of(module).ifPresent(moduleBuilder::setYangSourceDefinition); + TypeComments.description(module).ifPresent(moduleBuilder::addComment); + module.getDescription().ifPresent(moduleBuilder::setDescription); + module.getReference().ifPresent(moduleBuilder::setReference); + } moduleBuilder.setModuleName(moduleName); return moduleBuilder; } @@ -201,9 +212,9 @@ final class GenHelperUtil { return null; } - static GeneratedTOBuilder findIdentityByQname(final QName qname, final Map genCtx) { + static GeneratedTypeBuilder findIdentityByQname(final QName qname, final Map genCtx) { for (final ModuleContext ctx : genCtx.values()) { - final GeneratedTOBuilder result = ctx.getIdentities().get(qname); + final GeneratedTypeBuilder result = ctx.getIdentities().get(qname); if (result != null) { return result; } @@ -265,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) { @@ -414,6 +417,8 @@ final class GenHelperUtil { //this requires valid semantics in YANG model String augIdentifier = null; for (AugmentationSchemaNode aug : schemaPathAugmentListEntry) { + // FIXME: when there're multiple augment identifiers for augmentations of same target, + // it would pick the first identifier. augIdentifier = getAugmentIdentifier(aug.getUnknownSchemaNodes()); break; } @@ -445,10 +450,10 @@ final class GenHelperUtil { augmentBuilders.put(augTypeBuilder.getName(), augTypeBuilder); if(!augSchema.getChildNodes().isEmpty()) { - genCtx.get(module).addTypeToAugmentation(augTypeBuilder, augSchema); genCtx.get(module).addTargetToAugmentation(augTypeBuilder, augSchema.getTargetPath()); } genCtx.get(module).addAugmentType(augTypeBuilder); + genCtx.get(module).addTypeToAugmentations(augTypeBuilder, schemaPathAugmentListEntry); return genCtx; } @@ -508,42 +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) { - String suffix = ""; - if (schemaNode instanceof GroupingDefinition) { - suffix = "grouping"; - } else if (namespaceType.equals(BindingNamespaceType.Grouping)) { - suffix = "data"; - } - - GeneratedTypeBuilder it = addRawInterfaceDefinition(basePackageName, schemaNode, schemaContext, "", suffix, + 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 (parent instanceof ListSchemaNode) { - it.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, parent, parameterizedTypeFor - (BindingTypes.IDENTIFIABLE_ITEM, parent))); - } else { - it.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, parent, parameterizedTypeFor - (BindingTypes.ITEM, parent))); - it.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, it)); + if (!(schemaNode instanceof ListSchemaNode) || + ((ListSchemaNode) schemaNode).getKeyDefinition().isEmpty()) { + it.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, childOf, + parameterizedTypeFor(BindingTypes.ITEM, 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); } @@ -635,10 +634,12 @@ final class GenHelperUtil { final GeneratedTypeBuilderImpl newType = new GeneratedTypeBuilderImpl(packageName, schemaNodeName, context); final Module module = SchemaContextUtil.findParentModule(schemaContext, schemaNode); qNameConstant(newType, BindingMapping.QNAME_STATIC_FIELD_NAME, schemaNode.getQName()); - newType.addComment(schemaNode.getDescription().orElse(null)); - newType.setDescription(createDescription(schemaNode, newType.getFullyQualifiedName(), schemaContext, - verboseClassComments, namespaceType)); - newType.setReference(schemaNode.getReference().orElse(null)); + if (verboseClassComments) { + YangSourceDefinition.of(module, schemaNode).ifPresent(newType::setYangSourceDefinition); + TypeComments.description(schemaNode).ifPresent(newType::addComment); + schemaNode.getDescription().ifPresent(newType::setDescription); + schemaNode.getReference().ifPresent(newType::setReference); + } newType.setSchemaPath((List) schemaNode.getPath().getPathFromRoot()); newType.setModuleName(module.getName()); newType.setBasePackageName(BindingMapping.getRootPackageName(module)); @@ -670,15 +671,15 @@ final class GenHelperUtil { schemaContext, verboseClassComments, genCtx, genTypeBuilders, typeProvider, namespaceType); } else if (node instanceof LeafListSchemaNode) { resolveLeafListSchemaNode(schemaContext, typeBuilder, (LeafListSchemaNode) node, module, - typeProvider, genCtx); + typeProvider, genCtx, verboseClassComments); } else if (node instanceof LeafSchemaNode) { resolveLeafSchemaNodeAsMethod("", schemaContext, typeBuilder, genCtx, (LeafSchemaNode) node, module, - typeProvider); + typeProvider, verboseClassComments); } else if (node instanceof ListSchemaNode) { 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); @@ -710,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)); } @@ -787,6 +791,9 @@ final class GenHelperUtil { final Type identifiableMarker = Types.parameterizedTypeFor(IDENTIFIABLE, genTOBuilder); genTOBuilder.addImplementsType(IDENTIFIER); genType.addImplementsType(identifiableMarker); + genType.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, childOf, parameterizedTypeFor + (BindingTypes.IDENTIFIABLE_ITEM, genType, genTOBuilder))); + } for (final DataSchemaNode schemaNode : node.getChildNodes()) { @@ -802,7 +809,6 @@ final class GenHelperUtil { final GeneratedPropertyBuilder prop = new GeneratedPropertyBuilderImpl("serialVersionUID"); prop.setValue(Long.toString(computeDefaultSUID(genTOBuilder))); genTOBuilder.setSUID(prop); - typeBuildersToGenTypes(module, genType, genTOBuilder.toInstance(), genCtx, namespaceType); genCtx.get(module).addGeneratedTOBuilder(node.getPath(), genTOBuilder); } @@ -825,6 +831,18 @@ final class GenHelperUtil { } } + private static void addPatternConstant(final GeneratedTypeBuilder typeBuilder, final String leafName, + final List patternConstraints) { + if (!patternConstraints.isEmpty()) { + final StringBuilder field = new StringBuilder(); + field.append(BindingMapping.PATTERN_CONSTANT_NAME).append("_") + .append(JavaIdentifierNormalizer.normalizeSpecificIdentifier(leafName, JavaIdentifier.CLASS) + .toUpperCase()); + typeBuilder.addConstant(Types.listTypeFor(BaseYangTypes.STRING_TYPE), field.toString(), + resolveRegExpressions(patternConstraints)); + } + } + /** * Converts leaf to the getter method which is added to * typeBuilder. @@ -846,7 +864,7 @@ final class GenHelperUtil { */ private static Type resolveLeafSchemaNodeAsMethod(final String nodeName, final SchemaContext schemaContext, final GeneratedTypeBuilder typeBuilder, final Map genCtx, final LeafSchemaNode leaf, - final Module module, final TypeProvider typeProvider) { + final Module module, final TypeProvider typeProvider, final boolean verboseClassComments) { if (leaf == null || typeBuilder == null) { return null; } @@ -893,7 +911,8 @@ final class GenHelperUtil { typeProvider, schemaContext, genCtx.get(module), genCtx); if (genTOBuilder != null) { //TODO: https://bugs.opendaylight.org/show_bug.cgi?id=2289 - returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule, typeProvider); + returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule, + typeProvider, verboseClassComments); } } else if (typeDef instanceof BitsTypeDefinition) { final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leaf, parentModule, @@ -909,10 +928,12 @@ final class GenHelperUtil { final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); returnType = typeProvider.javaTypeForSchemaDefinitionType(getBaseOrDeclaredType(typeDef), leaf, restrictions, genCtx.get(module)); + addPatternConstant(typeBuilder, leafName, restrictions.getPatternConstraints()); } } else { final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, restrictions, genCtx.get(module)); + addPatternConstant(typeBuilder, leafName, restrictions.getPatternConstraints()); } if (returnType == null) { @@ -957,7 +978,7 @@ final class GenHelperUtil { */ private static boolean resolveLeafListSchemaNode(final SchemaContext schemaContext, final GeneratedTypeBuilder typeBuilder, final LeafListSchemaNode node, final Module module, final TypeProvider typeProvider, - final Map genCtx) { + final Map genCtx, final boolean verboseClassComments) { if (node == null || typeBuilder == null) { return false; } @@ -981,7 +1002,8 @@ final class GenHelperUtil { final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule, typeProvider, schemaContext, genCtx.get(module), genCtx); if (genTOBuilder != null) { - returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule, typeProvider); + returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule, + typeProvider, verboseClassComments); } } else if (typeDef instanceof BitsTypeDefinition) { final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule, @@ -990,10 +1012,14 @@ final class GenHelperUtil { } else { final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions, genCtx.get(module)); + + addPatternConstant(typeBuilder, nodeName.getLocalName(), restrictions.getPatternConstraints()); } } else { final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions, genCtx.get(module)); + + addPatternConstant(typeBuilder, nodeName.getLocalName(), restrictions.getPatternConstraints()); } final ParameterizedType listType = Types.listTypeFor(returnType); @@ -1034,9 +1060,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."); @@ -1044,53 +1071,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); } } } @@ -1159,7 +1153,7 @@ final class GenHelperUtil { final QName leafQName = leaf.getQName(); final Type type = resolveLeafSchemaNodeAsMethod(nodeName, schemaContext, typeBuilder, genCtx, leaf, module, - typeProvider); + typeProvider, verboseClassComments); if (listKeys.contains(leafQName)) { if (type == null) { resolveLeafSchemaNodeAsProperty(nodeName, schemaContext, typeProvider, genCtx, genTOBuilder, leaf, true, @@ -1171,7 +1165,7 @@ final class GenHelperUtil { } else { if (schemaNode instanceof LeafListSchemaNode) { resolveLeafListSchemaNode(schemaContext, typeBuilder, (LeafListSchemaNode) schemaNode, module, - typeProvider, genCtx); + typeProvider, genCtx, verboseClassComments); } else if (schemaNode instanceof ContainerSchemaNode) { containerToGenType(module, basePackageName, typeBuilder, typeBuilder, (ContainerSchemaNode) schemaNode, schemaContext, verboseClassComments, genCtx, genTypeBuilders, typeProvider, namespaceType); @@ -1179,18 +1173,18 @@ 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); } } } private static void addSchemaNodeToListTypeBuilders(final String nodeName, final String basePackageName, - final DataSchemaNode schemaNode, final GeneratedTypeBuilder typeBuilder, - final GeneratedTypeBuilder genTypeBuilder, final List listKeys, final Module module, - final TypeProvider typeProvider, final SchemaContext schemaContext, final Map genCtx, - final Map> genTypeBuilders, final boolean verboseClassComments, - final BindingNamespaceType namespaceType) { + final DataSchemaNode schemaNode, final GeneratedTypeBuilder typeBuilder, + final GeneratedTypeBuilder genTypeBuilder, final List listKeys, final Module module, + final TypeProvider typeProvider, final SchemaContext schemaContext, final Map genCtx, + final Map> genTypeBuilders, final boolean verboseClassComments, + final BindingNamespaceType namespaceType) { checkArgument(schemaNode != null, "Data Schema Node cannot be NULL."); checkArgument(typeBuilder != null, "Generated Type Builder cannot be NULL."); @@ -1198,15 +1192,15 @@ final class GenHelperUtil { final LeafSchemaNode leaf = (LeafSchemaNode) schemaNode; final QName leafQName = leaf.getQName(); final Type type = resolveLeafSchemaNodeAsMethod(nodeName, schemaContext, typeBuilder, genCtx, leaf, module, - typeProvider); + typeProvider, verboseClassComments); if (listKeys.contains(leafQName)) { resolveLeafSchemaNodeAsMethod(nodeName, schemaContext, genTypeBuilder, genCtx, leaf, module, - typeProvider); + typeProvider, verboseClassComments); } } else { if (schemaNode instanceof LeafListSchemaNode) { resolveLeafListSchemaNode(schemaContext, typeBuilder, (LeafListSchemaNode) schemaNode, module, - typeProvider, genCtx); + typeProvider, genCtx, verboseClassComments); } else if (schemaNode instanceof ContainerSchemaNode) { containerToGenType(module, basePackageName, typeBuilder, typeBuilder, (ContainerSchemaNode) schemaNode, schemaContext, verboseClassComments, genCtx, genTypeBuilders, typeProvider, namespaceType); @@ -1214,7 +1208,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); } } @@ -1261,12 +1255,14 @@ final class GenHelperUtil { final GeneratedTypeBuilder genType = addDefaultInterfaceDefinition(basePackageName, node, childOf, module, genCtx, schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType); - genType.addComment(node.getDescription().orElse(null)); annotateDeprecatedIfNecessary(node.getStatus(), genType); - genType.setDescription(createDescription(node, genType.getFullyQualifiedName(), schemaContext, - verboseClassComments, namespaceType)); genType.setModuleName(module.getName()); - genType.setReference(node.getReference().orElse(null)); + if (verboseClassComments) { + YangSourceDefinition.of(module, node).ifPresent(genType::setYangSourceDefinition); + TypeComments.description(node).ifPresent(genType::addComment); + node.getDescription().ifPresent(genType::setDescription); + node.getReference().ifPresent(genType::setReference); + } genType.setSchemaPath((List) node.getPath().getPathFromRoot()); genType.setParentTypeForBuilder(childOf); if (node instanceof DataNodeContainer) { @@ -1339,7 +1335,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); @@ -1378,13 +1374,13 @@ final class GenHelperUtil { return genCtx; } - private static GeneratedTOBuilder resolveIdentitySchemaNode(final String basePackageName, final SchemaContext schemaContext, + private static GeneratedTypeBuilder resolveIdentitySchemaNode(final String basePackageName, final SchemaContext schemaContext, final IdentitySchemaNode identity, final Module module, final boolean verboseClassComments, final Map genCtx) { Preconditions.checkNotNull(identity,"Identity can not be null!"); //check first if identity has been resolved as base identity of some other one - GeneratedTOBuilder newType = findIdentityByQname(identity.getQName(), genCtx); + GeneratedTypeBuilder newType = findIdentityByQname(identity.getQName(), genCtx); if (newType == null) { final Module parentModule = SchemaContextUtil.findParentModule(schemaContext, identity); Preconditions.checkState(module.equals(parentModule), @@ -1393,29 +1389,30 @@ final class GenHelperUtil { final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, identity.getPath(), BindingNamespaceType.Identity); - newType = new GeneratedTOBuilderImpl(packageName, identity.getQName().getLocalName(), true, false, + newType = new GeneratedTypeBuilderImpl(packageName, identity.getQName().getLocalName(), true, false, genCtx.get(module)); final Set baseIdentities = identity.getBaseIdentities(); if (baseIdentities.size() == 0) { //no base - abstract - final GeneratedTOBuilderImpl gto = new GeneratedTOBuilderImpl(BaseIdentity.class.getPackage().getName(), + final GeneratedTypeBuilderImpl genType = new GeneratedTypeBuilderImpl(BaseIdentity.class.getPackage().getName(), BaseIdentity.class.getSimpleName(), genCtx.get(module)); - newType.setExtendsType(gto.toInstance()); + newType.addImplementsType(genType.toInstance()); } else { - //one base - inheritance - final IdentitySchemaNode baseIdentity = baseIdentities.iterator().next(); - GeneratedTOBuilder baseType = resolveIdentitySchemaNode(basePackageName, schemaContext, - baseIdentity, module, verboseClassComments, genCtx); - newType.setExtendsType(baseType.toInstance()); + //multiple bases - inheritance + for (IdentitySchemaNode baseIdentity : baseIdentities) { + GeneratedTypeBuilder baseType = resolveIdentitySchemaNode(basePackageName, schemaContext, + baseIdentity, module, verboseClassComments, genCtx); + newType.addImplementsType(baseType.toInstance()); + } } - newType.setAbstract(true); - newType.addComment(identity.getDescription().orElse(null)); - newType.setDescription(createDescription(identity, newType.getFullyQualifiedName(), schemaContext, - verboseClassComments, BindingNamespaceType.Identity)); - newType.setReference(identity.getReference().orElse(null)); - newType.setModuleName(module.getName()); + if (verboseClassComments) { + YangSourceDefinition.of(module).ifPresent(newType::setYangSourceDefinition); + TypeComments.description(module).ifPresent(newType::addComment); + module.getDescription().ifPresent(newType::setDescription); + module.getReference().ifPresent(newType::setReference); + } newType.setSchemaPath((List) identity.getPath().getPathFromRoot()); qNameConstant(newType, BindingMapping.QNAME_STATIC_FIELD_NAME, identity.getQName());