X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fsal%2Fyang-prototype%2Fcode-generator%2Fbinding-generator-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fbinding%2Fgenerator%2Fimpl%2FBindingGeneratorImpl.java;h=3b5272d3f09ef87fa0944cdec4c1f743d30e67cb;hp=6700b470faee489b0789dfde840b4a1e65c47448;hb=97d2f10bea5bdd773453bc7202b9dd04f4b70c3b;hpb=a21ad10dca48977b9c4ea885bc728563f920371b diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java index 6700b470fa..3b5272d3f0 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java @@ -8,10 +8,7 @@ package org.opendaylight.controller.sal.binding.generator.impl; import static org.opendaylight.controller.binding.generator.util.BindingGeneratorUtil.*; -import static org.opendaylight.controller.yang.model.util.SchemaContextUtil.findDataSchemaNode; -import static org.opendaylight.controller.yang.model.util.SchemaContextUtil.findParentModule; - -import java.util.concurrent.Future; +import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.*; import java.util.ArrayList; import java.util.Collections; @@ -20,6 +17,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.Future; + +import javax.management.Notification; import org.opendaylight.controller.binding.generator.util.ReferencedTypeImpl; import org.opendaylight.controller.binding.generator.util.Types; @@ -35,41 +35,43 @@ import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedP import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTOBuilder; import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTypeBuilder; import org.opendaylight.controller.sal.binding.model.api.type.builder.MethodSignatureBuilder; +import org.opendaylight.controller.sal.binding.yang.types.GroupingDefinitionDependencySort; import org.opendaylight.controller.sal.binding.yang.types.TypeProviderImpl; -import org.opendaylight.controller.yang.binding.Notification; -import org.opendaylight.controller.yang.common.QName; -import org.opendaylight.controller.yang.common.RpcResult; -import org.opendaylight.controller.yang.model.api.AugmentationSchema; -import org.opendaylight.controller.yang.model.api.ChoiceCaseNode; -import org.opendaylight.controller.yang.model.api.ChoiceNode; -import org.opendaylight.controller.yang.model.api.ContainerSchemaNode; -import org.opendaylight.controller.yang.model.api.DataNodeContainer; -import org.opendaylight.controller.yang.model.api.DataSchemaNode; -import org.opendaylight.controller.yang.model.api.GroupingDefinition; -import org.opendaylight.controller.yang.model.api.IdentitySchemaNode; -import org.opendaylight.controller.yang.model.api.LeafListSchemaNode; -import org.opendaylight.controller.yang.model.api.LeafSchemaNode; -import org.opendaylight.controller.yang.model.api.ListSchemaNode; -import org.opendaylight.controller.yang.model.api.Module; -import org.opendaylight.controller.yang.model.api.NotificationDefinition; -import org.opendaylight.controller.yang.model.api.RpcDefinition; -import org.opendaylight.controller.yang.model.api.SchemaContext; -import org.opendaylight.controller.yang.model.api.SchemaNode; -import org.opendaylight.controller.yang.model.api.SchemaPath; -import org.opendaylight.controller.yang.model.api.TypeDefinition; -import org.opendaylight.controller.yang.model.api.type.BitsTypeDefinition; -import org.opendaylight.controller.yang.model.api.type.EnumTypeDefinition; -import org.opendaylight.controller.yang.model.api.type.EnumTypeDefinition.EnumPair; -import org.opendaylight.controller.yang.model.util.DataNodeIterator; -import org.opendaylight.controller.yang.model.util.ExtendedType; -import org.opendaylight.controller.yang.model.util.SchemaContextUtil; -import org.opendaylight.controller.yang.model.util.UnionType; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; +import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; +import org.opendaylight.yangtools.yang.model.api.ChoiceNode; +import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; +import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; +import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; +import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; +import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; +import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; +import org.opendaylight.yangtools.yang.model.api.RpcDefinition; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaNode; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; +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.EnumTypeDefinition.EnumPair; +import org.opendaylight.yangtools.yang.model.util.DataNodeIterator; +import org.opendaylight.yangtools.yang.model.util.ExtendedType; +import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; +import org.opendaylight.yangtools.yang.model.util.UnionType; public final class BindingGeneratorImpl implements BindingGenerator { private Map> genTypeBuilders; private TypeProvider typeProvider; private SchemaContext schemaContext; + private final Map allGroupings = new HashMap(); public BindingGeneratorImpl() { super(); @@ -90,6 +92,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { final Set modules = context.getModules(); genTypeBuilders = new HashMap<>(); for (final Module module : modules) { + generatedTypes.addAll(allGroupingsToGenTypes(module)); generatedTypes.add(moduleToDataType(module)); generatedTypes.addAll(allTypeDefinitionsToGenTypes(module)); generatedTypes.addAll(allContainersToGenTypes(module)); @@ -99,7 +102,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { generatedTypes.addAll(allRPCMethodsToGenType(module)); generatedTypes.addAll(allNotificationsToGenType(module)); generatedTypes.addAll(allIdentitiesToGenTypes(module, context)); - generatedTypes.addAll(allGroupingsToGenTypes(module)); + } return generatedTypes; } @@ -124,6 +127,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { for (final Module contextModule : contextModules) { final List generatedTypes = new ArrayList<>(); + generatedTypes.addAll(allGroupingsToGenTypes(contextModule)); generatedTypes.add(moduleToDataType(contextModule)); generatedTypes.addAll(allTypeDefinitionsToGenTypes(contextModule)); generatedTypes.addAll(allContainersToGenTypes(contextModule)); @@ -133,7 +137,6 @@ public final class BindingGeneratorImpl implements BindingGenerator { generatedTypes.addAll(allRPCMethodsToGenType(contextModule)); generatedTypes.addAll(allNotificationsToGenType(contextModule)); generatedTypes.addAll(allIdentitiesToGenTypes(contextModule, context)); - generatedTypes.addAll(allGroupingsToGenTypes(contextModule)); if (modules.contains(contextModule)) { filteredGenTypes.addAll(generatedTypes); @@ -185,7 +188,9 @@ public final class BindingGeneratorImpl implements BindingGenerator { final List schemaContainers = it.allContainers(); final String basePackageName = moduleNamespaceToPackageName(module); for (final ContainerSchemaNode container : schemaContainers) { - generatedTypes.add(containerToGenType(basePackageName, container)); + if (!container.isAddedByUses()) { + generatedTypes.add(containerToGenType(basePackageName, container)); + } } return generatedTypes; } @@ -210,7 +215,9 @@ public final class BindingGeneratorImpl implements BindingGenerator { final String basePackageName = moduleNamespaceToPackageName(module); if (schemaLists != null) { for (final ListSchemaNode list : schemaLists) { - generatedTypes.addAll(listToGenType(basePackageName, list)); + if (!list.isAddedByUses()) { + generatedTypes.addAll(listToGenType(basePackageName, list)); + } } } return generatedTypes; @@ -230,7 +237,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { final List generatedTypes = new ArrayList<>(); for (final ChoiceNode choice : choiceNodes) { - if (choice != null) { + if ((choice != null) && !choice.isAddedByUses()) { generatedTypes.addAll(choiceToGeneratedType(basePackageName, choice)); } } @@ -292,6 +299,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { } final GeneratedTypeBuilder moduleDataTypeBuilder = moduleTypeBuilder(module, "Data"); + addInterfaceDefinition(module, moduleDataTypeBuilder); final String basePackageName = moduleNamespaceToPackageName(module); if (moduleDataTypeBuilder != null) { @@ -335,6 +343,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { if (input != null) { rpcInOut.add(new DataNodeIterator(input)); GeneratedTypeBuilder inType = addRawInterfaceDefinition(basePackageName, input, rpcName); + addInterfaceDefinition(input, inType); resolveDataSchemaNodes(basePackageName, inType, input.getChildNodes()); Type inTypeInstance = inType.toInstance(); genRPCTypes.add(inTypeInstance); @@ -344,8 +353,8 @@ public final class BindingGeneratorImpl implements BindingGenerator { Type outTypeInstance = Types.typeForClass(Void.class); if (output != null) { rpcInOut.add(new DataNodeIterator(output)); - GeneratedTypeBuilder outType = addRawInterfaceDefinition(basePackageName, output, rpcName); + addInterfaceDefinition(output, outType); resolveDataSchemaNodes(basePackageName, outType, output.getChildNodes()); outTypeInstance = outType.toInstance(); genRPCTypes.add(outTypeInstance); @@ -358,13 +367,17 @@ public final class BindingGeneratorImpl implements BindingGenerator { List nContainers = it.allContainers(); if ((nContainers != null) && !nContainers.isEmpty()) { for (final ContainerSchemaNode container : nContainers) { - genRPCTypes.add(containerToGenType(basePackageName, container)); + if (!container.isAddedByUses()) { + genRPCTypes.add(containerToGenType(basePackageName, container)); + } } } List nLists = it.allLists(); if ((nLists != null) && !nLists.isEmpty()) { for (final ListSchemaNode list : nLists) { - genRPCTypes.addAll(listToGenType(basePackageName, list)); + if (!list.isAddedByUses()) { + genRPCTypes.addAll(listToGenType(basePackageName, list)); + } } } } @@ -398,11 +411,15 @@ public final class BindingGeneratorImpl implements BindingGenerator { // Containers for (ContainerSchemaNode node : it.allContainers()) { - genNotifyTypes.add(containerToGenType(basePackageName, node)); + if (!node.isAddedByUses()) { + genNotifyTypes.add(containerToGenType(basePackageName, node)); + } } // Lists for (ListSchemaNode node : it.allLists()) { - genNotifyTypes.addAll(listToGenType(basePackageName, node)); + if (!node.isAddedByUses()) { + genNotifyTypes.addAll(listToGenType(basePackageName, node)); + } } final GeneratedTypeBuilder notificationTypeBuilder = addDefaultInterfaceDefinition(basePackageName, notification); @@ -460,10 +477,16 @@ public final class BindingGeneratorImpl implements BindingGenerator { final List genTypes = new ArrayList<>(); final String basePackageName = moduleNamespaceToPackageName(module); final Set groupings = module.getGroupings(); - if (groupings != null && !groupings.isEmpty()) { - for (final GroupingDefinition grouping : groupings) { - genTypes.add(groupingToGenType(basePackageName, grouping)); - } + List groupingsSortedByDependencies; + // groupingsSortedByDependencies = + // sortGroupingDefinitionsByUses(groupings); + groupingsSortedByDependencies = GroupingDefinitionDependencySort.sort(groupings); + + for (final GroupingDefinition grouping : groupingsSortedByDependencies) { + GeneratedType genType = groupingToGenType(basePackageName, grouping); + genTypes.add(genType); + SchemaPath schemaPath = grouping.getPath(); + allGroupings.put(schemaPath, genType); } return genTypes; } @@ -562,6 +585,8 @@ public final class BindingGeneratorImpl implements BindingGenerator { if (!(targetSchemaNode instanceof ChoiceNode)) { final GeneratedTypeBuilder augTypeBuilder = addRawAugmentGenTypeDefinition(augmentPackageName, targetPackageName, targetSchemaNodeName, augSchema); + addInterfaceDefinition(augSchema, augTypeBuilder); + final GeneratedType augType = augTypeBuilder.toInstance(); genTypes.add(augType); } else { @@ -686,7 +711,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { final GeneratedTypeBuilder typeBuilder, final Set schemaNodes) { if ((schemaNodes != null) && (typeBuilder != null)) { for (final DataSchemaNode schemaNode : schemaNodes) { - if (schemaNode.isAugmenting()) { + if (schemaNode.isAugmenting() || schemaNode.isAddedByUses()) { continue; } addSchemaNodeToBuilderAsMethod(basePackageName, schemaNode, typeBuilder); @@ -737,7 +762,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { } final String choiceName = choiceNode.getQName().getLocalName(); - if (choiceName != null) { + if (choiceName != null && !choiceNode.isAddedByUses()) { final String packageName = packageNameForGeneratedType(basePackageName, choiceNode.getPath()); final GeneratedTypeBuilder choiceType = addDefaultInterfaceDefinition(packageName, choiceNode); constructGetter(typeBuilder, choiceName, choiceNode.getDescription(), choiceType); @@ -780,7 +805,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { final List generatedTypes = new ArrayList<>(); for (final ChoiceCaseNode caseNode : caseNodes) { - if (caseNode != null && !caseNode.isAddedByUses()) { + if (caseNode != null && !caseNode.isAddedByUses() && !caseNode.isAugmenting()) { final String packageName = packageNameForGeneratedType(basePackageName, caseNode.getPath()); final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode); caseTypeBuilder.addImplementsType(refChoiceType); @@ -834,7 +859,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { leafDesc = ""; } - if (leafName != null) { + if (leafName != null && !leaf.isAddedByUses()) { final TypeDefinition typeDef = leaf.getType(); Type returnType = null; @@ -879,7 +904,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { leafDesc = ""; } - if (leafName != null) { + if (leafName != null && !leaf.isAddedByUses()) { final TypeDefinition typeDef = leaf.getType(); // TODO: properly resolve enum types @@ -911,7 +936,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { nodeDesc = ""; } - if (nodeName != null) { + if (nodeName != null && !node.isAddedByUses()) { final TypeDefinition type = node.getType(); final Type listType = Types.listTypeFor(typeProvider.javaTypeForSchemaDefinitionType(type)); @@ -927,7 +952,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { if ((containerNode != null) && (typeBuilder != null)) { final String nodeName = containerNode.getQName().getLocalName(); - if (nodeName != null) { + if (nodeName != null && !containerNode.isAddedByUses()) { final String packageName = packageNameForGeneratedType(basePackageName, containerNode.getPath()); final GeneratedTypeBuilder rawGenType = addDefaultInterfaceDefinition(packageName, containerNode); @@ -944,7 +969,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { if ((schemaNode != null) && (typeBuilder != null)) { final String listName = schemaNode.getQName().getLocalName(); - if (listName != null) { + if (listName != null && !schemaNode.isAddedByUses()) { final String packageName = packageNameForGeneratedType(basePackageName, schemaNode.getPath()); final GeneratedTypeBuilder rawGenType = addDefaultInterfaceDefinition(packageName, schemaNode); constructGetter(typeBuilder, listName, schemaNode.getDescription(), Types.listTypeFor(rawGenType)); @@ -957,7 +982,7 @@ public final class BindingGeneratorImpl implements BindingGenerator { /** * Method instantiates new Generated Type Builder and sets the implements * definitions of Data Object and Augmentable. - * + * * @param packageName * Generated Type Package Name * @param schemaNode @@ -967,12 +992,19 @@ public final class BindingGeneratorImpl implements BindingGenerator { private GeneratedTypeBuilder addDefaultInterfaceDefinition(final String packageName, final SchemaNode schemaNode) { final GeneratedTypeBuilder builder = addRawInterfaceDefinition(packageName, schemaNode, ""); builder.addImplementsType(Types.DATA_OBJECT); - builder.addImplementsType(Types.augmentableTypeFor(builder)); + if (!(schemaNode instanceof GroupingDefinition)) { + builder.addImplementsType(Types.augmentableTypeFor(builder)); + } + + if (schemaNode instanceof DataNodeContainer) { + addInterfaceDefinition((DataNodeContainer) schemaNode, builder); + } + return builder; } /** - * + * * @param packageName * @param schemaNode * @return @@ -1200,4 +1232,27 @@ public final class BindingGeneratorImpl implements BindingGenerator { } + /** + * Adds the implemented types to type builder. The method passes through the + * list of elements which contains {@code dataNodeContainer} and adds them + * as implements type to builder + * + * @param dataNodeContainer + * element which contains the list of used YANG groupings + * @param builder + * builder to which are added implemented types according to + * dataNodeContainer + * @return generated type builder which contains implemented types + */ + private GeneratedTypeBuilder addInterfaceDefinition(final DataNodeContainer dataNodeContainer, + final GeneratedTypeBuilder builder) { + for (UsesNode usesNode : dataNodeContainer.getUses()) { + if (usesNode.getGroupingPath() != null) { + GeneratedType genType = allGroupings.get(usesNode.getGroupingPath()); + builder.addImplementsType(genType); + } + } + return builder; + } + }