From f75b7abb9dcc2ba02a14a316212da1c1b434a9b3 Mon Sep 17 00:00:00 2001 From: Martin Vitez Date: Tue, 22 Oct 2013 22:54:19 +0200 Subject: [PATCH] Added getParent() method to DataSchemaNode and DataNodeContainer. Fixed Bugs. Fix for Bug 119. Fix for Bug 120. Fix for Bug 121. Added more tests. Change-Id: I7a88a1dc4b0ff8c277afab0560c89e91c8ff1a21 Signed-off-by: Martin Vitez --- .../generator/impl/BindingGeneratorImpl.xtend | 356 ++++++++++---- .../impl/ChoiceCaseGenTypesTest.java | 5 +- .../generator/impl/SupportTestUtil.java | 2 +- .../api/generator/test/CompilationTest.java | 456 ++++++++++++++---- .../compilation/augment-of-augment/bar.yang | 29 ++ .../compilation/augment-of-augment/baz.yang | 27 ++ .../compilation/augment-of-augment/foo.yang | 23 + .../compilation/augment-under-uses/bar.yang | 22 + .../compilation/augment-under-uses/foo.yang | 51 ++ .../compilation/augment-under-uses/test.yang | 26 - .../augment-uses-to-augment/bar.yang | 28 ++ .../augment-uses-to-augment/baz.yang | 35 ++ .../augment-uses-to-augment/foo.yang | 36 ++ .../binding/yang/types/TypeProviderImpl.java | 7 +- .../yang/model/api/DataNodeContainer.java | 4 +- .../yang/model/api/DataSchemaNode.java | 16 +- .../yangtools/yang/model/api/Deviation.java | 2 +- .../yangtools/yang/model/api/Module.java | 70 +-- .../yang/model/api/RpcDefinition.java | 2 +- .../yangtools/yang/model/api/UsesNode.java | 18 +- .../yangtools/yang/model/api/YangNode.java | 12 + .../yang/model/util/DataNodeIterator.java | 11 + .../parser/builder/api/AbstractBuilder.java | 10 +- .../api/AbstractDataNodeContainerBuilder.java | 51 +- .../api/AbstractSchemaNodeBuilder.java | 9 +- .../api/AugmentationSchemaBuilder.java | 3 +- .../yang/parser/builder/api/Builder.java | 21 +- .../builder/api/DataNodeContainerBuilder.java | 31 +- .../builder/api/DataSchemaNodeBuilder.java | 3 +- .../parser/builder/api/GroupingBuilder.java | 3 +- .../parser/builder/api/SchemaNodeBuilder.java | 3 +- .../builder/api/TypeDefinitionBuilder.java | 3 +- .../parser/builder/api/UsesNodeBuilder.java | 3 +- .../parser/builder/impl/AnyXmlBuilder.java | 28 +- .../impl/AugmentationSchemaBuilderImpl.java | 52 +- .../parser/builder/impl/ChoiceBuilder.java | 75 +-- .../builder/impl/ChoiceCaseBuilder.java | 63 +-- .../builder/impl/ConstraintsBuilder.java | 24 +- .../impl/ContainerSchemaNodeBuilder.java | 112 ++--- .../parser/builder/impl/DeviationBuilder.java | 6 +- .../parser/builder/impl/ExtensionBuilder.java | 13 +- .../parser/builder/impl/FeatureBuilder.java | 13 +- .../builder/impl/GroupingBuilderImpl.java | 89 ++-- .../impl/IdentitySchemaNodeBuilder.java | 19 +- .../builder/impl/IdentityrefTypeBuilder.java | 5 +- .../impl/LeafListSchemaNodeBuilder.java | 32 +- .../builder/impl/LeafSchemaNodeBuilder.java | 32 +- .../builder/impl/ListSchemaNodeBuilder.java | 123 ++--- .../parser/builder/impl/ModuleBuilder.java | 100 ++-- .../builder/impl/NotificationBuilder.java | 81 ++-- .../builder/impl/RpcDefinitionBuilder.java | 34 +- .../impl/TypeDefinitionBuilderImpl.java | 16 +- .../parser/builder/impl/UnionTypeBuilder.java | 5 +- .../impl/UnknownSchemaNodeBuilder.java | 15 +- .../builder/impl/UsesNodeBuilderImpl.java | 37 +- .../yang/parser/impl/YangParserImpl.java | 6 +- .../yangtools/yang/parser/util/CopyUtils.java | 50 +- .../yang/parser/util/GroupingUtils.java | 19 +- .../yang/parser/util/ParserUtils.xtend | 10 +- .../yang/parser/util/RefineHolder.java | 11 +- .../yang/parser/util/RefineUtils.java | 14 +- .../yang/parser/impl/GroupingTest.java | 1 + .../yang/parser/impl/TypesResolutionTest.java | 7 + .../yang/parser/impl/YangParserTest.java | 1 - .../yang/parser/util/BitImplTest.java | 6 +- .../src/test/resources/model/foo.yang | 8 + .../types/custom-types-test@2012-4-4.yang | 4 +- 67 files changed, 1607 insertions(+), 882 deletions(-) create mode 100644 code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/bar.yang create mode 100644 code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/baz.yang create mode 100644 code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/foo.yang create mode 100644 code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/bar.yang create mode 100644 code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/foo.yang delete mode 100644 code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/test.yang create mode 100644 code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/bar.yang create mode 100644 code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/baz.yang create mode 100644 code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/foo.yang create mode 100644 yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangNode.java diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend index 1cc3fb6a37..c0802aecc5 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend @@ -61,13 +61,15 @@ import static org.opendaylight.yangtools.binding.generator.util.BindingGenerator import static org.opendaylight.yangtools.binding.generator.util.BindingTypes.*; import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.*; import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort -import org.opendaylight.yangtools.yang.model.util.ExtendedType; import org.opendaylight.yangtools.yang.common.QName -import org.opendaylight.yangtools.yang.model.api.UsesNode -import java.util.HashSet -import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext -import org.opendaylight.yangtools.sal.binding.model.api.type.builder.AnnotationTypeBuilder -import org.opendaylight.yangtools.yang.model.api.ModuleImport -import org.opendaylight.yangtools.yang.binding.DataContainer +import org.opendaylight.yangtools.yang.model.util.ExtendedType; +import org.opendaylight.yangtools.yang.model.api.UsesNode +import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.AnnotationTypeBuilder +import org.opendaylight.yangtools.yang.model.api.ModuleImport +import org.opendaylight.yangtools.yang.binding.DataContainer import java.util.Iterator +import org.opendaylight.yangtools.yang.model.api.AugmentationTarget +import java.util.Collection +import org.opendaylight.yangtools.yang.model.api.YangNode public class BindingGeneratorImpl implements BindingGenerator { /** @@ -225,7 +227,8 @@ public class BindingGeneratorImpl implements BindingGenerator { private def List allTypeDefinitionsToGenTypes(Module module) { checkArgument(module !== null, "Module reference cannot be NULL."); checkArgument(module.name !== null, "Module name cannot be NULL."); - val Set> typeDefinitions = module.typeDefinitions; + val it = new DataNodeIterator(module); + val List> typeDefinitions = it.allTypedefs; checkState(typeDefinitions !== null, '''Type Definitions for module «module.name» cannot be NULL.'''); val List generatedTypes = new ArrayList(); @@ -284,7 +287,7 @@ public class BindingGeneratorImpl implements BindingGenerator { for (usesNode : node.uses) { for (augment : usesNode.augmentations) { - result.addAll(augmentationToGenTypes(basePackageName, augment, module, true)); + result.addAll(augmentationToGenTypes(basePackageName, augment, module, usesNode)); result.addAll(processUsesAugments(augment, module)); } } @@ -433,7 +436,7 @@ public class BindingGeneratorImpl implements BindingGenerator { val basePackageName = moduleNamespaceToPackageName(module); val List augmentations = resolveAugmentations(module); for (augment : augmentations) { - generatedTypes.addAll(augmentationToGenTypes(basePackageName, augment, module, false)); + generatedTypes.addAll(augmentationToGenTypes(basePackageName, augment, module, null)); } return generatedTypes; } @@ -916,90 +919,225 @@ public class BindingGeneratorImpl implements BindingGenerator { *
  • if target path of augSchema equals null
  • * */ - private def List augmentationToGenTypes(String augmentPackageName, AugmentationSchema augSchema, Module module, boolean addedByUses) { - checkArgument(augmentPackageName !== null, "Package Name cannot be NULL."); - checkArgument(augSchema !== null, "Augmentation Schema cannot be NULL."); - checkState(augSchema.targetPath !== null, - "Augmentation Schema does not contain Target Path (Target Path is NULL)."); - val List genTypes = new ArrayList(); - genTypes.addAll(processUsesAugments(augSchema, module)); - + private def List augmentationToGenTypes(String augmentPackageName, AugmentationSchema augSchema, Module module, + UsesNode parentUsesNode) { + checkArgument(augmentPackageName !== null, "Package Name cannot be NULL."); + checkArgument(augSchema !== null, "Augmentation Schema cannot be NULL."); + checkState(augSchema.targetPath !== null, + "Augmentation Schema does not contain Target Path (Target Path is NULL)."); + val List genTypes = new ArrayList(); + genTypes.addAll(processUsesAugments(augSchema, module)); + // EVERY augmented interface will extends Augmentation interface // and DataObject interface!!! - val targetPath = augSchema.targetPath; - var targetSchemaNode = findDataSchemaNode(schemaContext, targetPath); + val targetPath = augSchema.targetPath; + var targetSchemaNode = findDataSchemaNode(schemaContext, targetPath); if (targetSchemaNode instanceof DataSchemaNode && (targetSchemaNode as DataSchemaNode).isAddedByUses()) { - targetSchemaNode = findOriginalTargetFromGrouping(targetPath, module, targetSchemaNode as DataSchemaNode); - } - - if(targetSchemaNode !== null) { - var targetType = yangToJavaMapping.get(targetSchemaNode.path); - if(targetType == null) { - + if (parentUsesNode == null) { + targetSchemaNode = findOriginal(targetSchemaNode as DataSchemaNode); + } else { + targetSchemaNode = findOriginalTargetFromGrouping(targetSchemaNode.QName.localName, parentUsesNode); + } + if (targetSchemaNode == null) { + throw new NullPointerException( + "Failed to find target node from grouping for augmentation " + augSchema + " in module " + module.name); + } + } + + if (targetSchemaNode !== null) { + var targetType = yangToJavaMapping.get(targetSchemaNode.path); + if (targetType == null) { // FIXME: augmentation should be added as last, all types should already be generated // and have assigned Java Types, - val targetModule = findParentModule(schemaContext, targetSchemaNode); - val targetBasePackage = moduleNamespaceToPackageName(targetModule); - val typePackage = packageNameForGeneratedType(targetBasePackage, targetSchemaNode.getPath()); - val targetSchemaNodeName = targetSchemaNode.getQName().getLocalName(); - val typeName = parseToClassName(targetSchemaNodeName); - targetType = new ReferencedTypeImpl(typePackage, typeName); - } - val augChildNodes = augSchema.childNodes; + val targetModule = findParentModule(schemaContext, targetSchemaNode); + val targetBasePackage = moduleNamespaceToPackageName(targetModule); + val typePackage = packageNameForGeneratedType(targetBasePackage, targetSchemaNode.getPath()); + val targetSchemaNodeName = targetSchemaNode.getQName().getLocalName(); + val typeName = parseToClassName(targetSchemaNodeName); + targetType = new ReferencedTypeImpl(typePackage, typeName); + } + val augChildNodes = augSchema.childNodes; + + if (!(targetSchemaNode instanceof ChoiceNode)) { + var packageName = augmentPackageName; + if (parentUsesNode != null) { + packageName = packageNameForGeneratedType(augmentPackageName, augSchema.targetPath); + } + val augTypeBuilder = addRawAugmentGenTypeDefinition(packageName, augmentPackageName, targetType, + augSchema); + val augType = augTypeBuilder.toInstance(); + genTypes.add(augType); + } else { + genTypes.addAll( + generateTypesFromAugmentedChoiceCases(augmentPackageName, targetType, augChildNodes, + targetSchemaNode as ChoiceNode)); + } + genTypes.addAll(augmentationBodyToGenTypes(augmentPackageName, augChildNodes, module)); + } + + return genTypes; + } - if(!(targetSchemaNode instanceof ChoiceNode)) { - var packageName = augmentPackageName; - if (addedByUses) { - packageName = packageNameForGeneratedType(augmentPackageName, augSchema.targetPath); + /** + * Utility method which search for original node defined in grouping. + */ + private def DataSchemaNode findOriginal(DataSchemaNode node) { + var DataSchemaNode result = findCorrectTargetFromGrouping(node); + if (result == null) { + result = findCorrectTargetFromAugment(node); + if (result != null) { + if (result.addedByUses) { + result = findOriginal(result); } - val augTypeBuilder = addRawAugmentGenTypeDefinition(packageName, augmentPackageName, targetType, augSchema); - val augType = augTypeBuilder.toInstance(); - genTypes.add(augType); - } else { - genTypes.addAll(generateTypesFromAugmentedChoiceCases(augmentPackageName, targetType, augChildNodes, targetSchemaNode as ChoiceNode)); } - genTypes.addAll(augmentationBodyToGenTypes(augmentPackageName, augChildNodes, module)); } - - return genTypes; + return result; } - private def DataSchemaNode findOriginalTargetFromGrouping(SchemaPath targetPath, Module module, DataSchemaNode targetSchemaNode) { - val path = new ArrayList(targetPath.getPath()); - path.remove(path.size()-1); - var DataNodeContainer parent = null; + private def DataSchemaNode findCorrectTargetFromAugment(DataSchemaNode node) { + if (!node.augmenting) { + return null; + } - if (path.isEmpty()) { - parent = module; + var String currentName = node.QName.localName; + var tmpPath = new ArrayList(); + var YangNode parent = node; + var AugmentationSchema augment = null; + do { + parent = (parent as DataSchemaNode).parent; + if (parent instanceof AugmentationTarget) { + tmpPath.add(currentName); + augment = findNodeInAugment((parent as AugmentationTarget).availableAugmentations, currentName); + if (augment == null) { + currentName = (parent as DataSchemaNode).QName.localName; + } + } + } while ((parent as DataSchemaNode).augmenting && augment == null); + + if (augment == null) { + return null; } else { - parent = findNodeInSchemaContext(schemaContext, path) as DataNodeContainer; + Collections.reverse(tmpPath); + var Object actualParent = augment; + var DataSchemaNode result = null; + for (name : tmpPath) { + if (actualParent instanceof DataNodeContainer) { + result = (actualParent as DataNodeContainer).getDataChildByName(name); + actualParent = (actualParent as DataNodeContainer).getDataChildByName(name); + } else { + if (actualParent instanceof ChoiceNode) { + result = (actualParent as ChoiceNode).getCaseNodeByName(name); + actualParent = (actualParent as ChoiceNode).getCaseNodeByName(name); + } + } + } + + if (result.addedByUses) { + result = findCorrectTargetFromGrouping(result); + } + + return result; } + } - val Set usesNodes = parent.getUses(); - if (usesNodes == null || usesNodes.isEmpty()) { - return targetSchemaNode; + private def AugmentationSchema findNodeInAugment(Collection augments, String name) { + for (augment : augments) { + if (augment.getDataChildByName(name) != null) { + return augment; + } } - val Set groupingPaths = new HashSet(); - for (uses : usesNodes) { - groupingPaths.add(uses.getGroupingPath()); + return null; + } + + private def DataSchemaNode findCorrectTargetFromGrouping(DataSchemaNode node) { + if (node.path.path.size == 1) { + // uses is under module statement + val Module m = findParentModule(schemaContext, node); + var DataSchemaNode result = null; + for (u : m.uses) { + var SchemaNode targetGrouping = findNodeInSchemaContext(schemaContext, u.groupingPath.path); + if (!(targetGrouping instanceof GroupingDefinition)) { + throw new IllegalArgumentException("Failed to generate code for augment in " + u); + } + var gr = targetGrouping as GroupingDefinition; + result = gr.getDataChildByName(node.QName.localName); + } + if (result == null) { + throw new IllegalArgumentException("Failed to generate code for augment"); + } + return result; + } else { + var DataSchemaNode result = null; + var String currentName = node.QName.localName; + var tmpPath = new ArrayList(); + var YangNode parent = node.parent; + do { + tmpPath.add(currentName); + val dataNodeParent = parent as DataNodeContainer; + for (u : dataNodeParent.uses) { + var SchemaNode targetGrouping = findNodeInSchemaContext(schemaContext, u.groupingPath.path); + if (!(targetGrouping instanceof GroupingDefinition)) { + throw new IllegalArgumentException("Failed to generate code for augment in " + u); + } + var gr = targetGrouping as GroupingDefinition; + result = gr.getDataChildByName(currentName); + } + if (result == null) { + currentName = (parent as SchemaNode).QName.localName; + if (parent instanceof DataSchemaNode) { + parent = (parent as DataSchemaNode).parent; + } else { + parent = (parent as DataNodeContainer).parent; + } + } + } while (result == null && !(parent instanceof Module)); + + if (result != null) { + if (tmpPath.size == 1) { + return result; + } else { + var DataSchemaNode newParent = result; + Collections.reverse(tmpPath); + tmpPath.remove(0); + for (name : tmpPath) { + newParent = (newParent as DataNodeContainer).getDataChildByName(name); + } + return newParent; + } + } + + return result; } - val Set groupings = new HashSet(); - for (gp : groupingPaths) { - groupings.add(findGrouping(schemaContext, module, gp.getPath())); + } + + /** + * Convenient method to find node added by uses statement. + */ + private def DataSchemaNode findOriginalTargetFromGrouping(String targetSchemaNodeName, UsesNode parentUsesNode) { + var SchemaNode targetGrouping = findNodeInSchemaContext(schemaContext, parentUsesNode.groupingPath.path); + if (!(targetGrouping instanceof GroupingDefinition)) { + throw new IllegalArgumentException("Failed to generate code for augment in " + parentUsesNode); } - var DataSchemaNode result = findNodeInGroupings(groupings, targetSchemaNode.getQName().localName); - return result; - } + var grouping = targetGrouping as GroupingDefinition; + var result = grouping.getDataChildByName(targetSchemaNodeName); + if (result == null) { + return null; + } + var boolean fromUses = result.addedByUses; - private def DataSchemaNode findNodeInGroupings(Set groupings, String name) { - for (gr : groupings) { - var DataSchemaNode node = gr.getDataChildByName(name); - if (node != null) { - return node; + var Iterator groupingUses = grouping.uses.iterator; + while (fromUses) { + if (groupingUses.hasNext()) { + grouping = findNodeInSchemaContext(schemaContext, groupingUses.next().groupingPath.path) as GroupingDefinition; + result = grouping.getDataChildByName(targetSchemaNodeName); + fromUses = result.addedByUses; + } else { + throw new NullPointerException("Failed to generate code for augment in " + parentUsesNode); } } - return null; + + return result; } /** @@ -1021,31 +1159,31 @@ public class BindingGeneratorImpl implements BindingGenerator { * and uses of augment * @return generated type builder for augment */ - private def GeneratedTypeBuilder addRawAugmentGenTypeDefinition(String augmentPackageName, String basePackageName, - Type targetTypeRef, AugmentationSchema augSchema) { - var Map augmentBuilders = genTypeBuilders.get(augmentPackageName); - if (augmentBuilders === null) { - augmentBuilders = new HashMap(); - genTypeBuilders.put(augmentPackageName, augmentBuilders); - } - val augIdentifier = getAugmentIdentifier(augSchema.unknownSchemaNodes); - - val augTypeName = if (augIdentifier !== null) { - parseToClassName(augIdentifier) - } else { - augGenTypeName(augmentBuilders, targetTypeRef.name); - } - - val augTypeBuilder = new GeneratedTypeBuilderImpl(augmentPackageName, augTypeName); - - augTypeBuilder.addImplementsType(DATA_OBJECT); - augTypeBuilder.addImplementsType(Types.augmentationTypeFor(targetTypeRef)); - addImplementedInterfaceFromUses(augSchema, augTypeBuilder); - - augSchemaNodeToMethods(basePackageName, augTypeBuilder, augSchema.childNodes); - augmentBuilders.put(augTypeName, augTypeBuilder); - return augTypeBuilder; - } + private def GeneratedTypeBuilder addRawAugmentGenTypeDefinition(String augmentPackageName, String basePackageName, + Type targetTypeRef, AugmentationSchema augSchema) { + var Map augmentBuilders = genTypeBuilders.get(augmentPackageName); + if (augmentBuilders === null) { + augmentBuilders = new HashMap(); + genTypeBuilders.put(augmentPackageName, augmentBuilders); + } + val augIdentifier = getAugmentIdentifier(augSchema.unknownSchemaNodes); + + val augTypeName = if (augIdentifier !== null) { + parseToClassName(augIdentifier) + } else { + augGenTypeName(augmentBuilders, targetTypeRef.name); + } + + val augTypeBuilder = new GeneratedTypeBuilderImpl(augmentPackageName, augTypeName); + + augTypeBuilder.addImplementsType(DATA_OBJECT); + augTypeBuilder.addImplementsType(Types.augmentationTypeFor(targetTypeRef)); + addImplementedInterfaceFromUses(augSchema, augTypeBuilder); + + augSchemaNodeToMethods(basePackageName, augTypeBuilder, augSchema.childNodes); + augmentBuilders.put(augTypeName, augTypeBuilder); + return augTypeBuilder; + } /** * @@ -1080,6 +1218,9 @@ public class BindingGeneratorImpl implements BindingGenerator { val List genTypes = new ArrayList(); val List augSchemaIts = new ArrayList(); for (childNode : augChildNodes) { + if (!childNode.addedByUses) { + + if(childNode instanceof DataNodeContainer) { augSchemaIts.add(new DataNodeIterator(childNode as DataNodeContainer)); @@ -1095,6 +1236,9 @@ public class BindingGeneratorImpl implements BindingGenerator { } genTypes.addAll(choiceToGeneratedType(augBasePackageName, childNode as ChoiceNode, module)); } + + + } } for (it : augSchemaIts) { @@ -1916,14 +2060,16 @@ public class BindingGeneratorImpl implements BindingGenerator { } else { resolveLeafSchemaNodeAsProperty(genTOBuilder, leaf, true); } - } else if(schemaNode instanceof LeafListSchemaNode) { - resolveLeafListSchemaNode(typeBuilder, schemaNode as LeafListSchemaNode); - } else if(schemaNode instanceof ContainerSchemaNode) { - resolveContainerSchemaNode(basePackageName, typeBuilder, schemaNode as ContainerSchemaNode); - } else if(schemaNode instanceof ChoiceNode) { - resolveChoiceSchemaNode(basePackageName,typeBuilder,schemaNode as ChoiceNode); - } else if(schemaNode instanceof ListSchemaNode) { - resolveListSchemaNode(basePackageName, typeBuilder, schemaNode as ListSchemaNode); + } else if (!schemaNode.addedByUses) { + if (schemaNode instanceof LeafListSchemaNode) { + resolveLeafListSchemaNode(typeBuilder, schemaNode as LeafListSchemaNode); + } else if(schemaNode instanceof ContainerSchemaNode) { + resolveContainerSchemaNode(basePackageName, typeBuilder, schemaNode as ContainerSchemaNode); + } else if(schemaNode instanceof ChoiceNode) { + resolveChoiceSchemaNode(basePackageName,typeBuilder,schemaNode as ChoiceNode); + } else if(schemaNode instanceof ListSchemaNode) { + resolveListSchemaNode(basePackageName, typeBuilder, schemaNode as ListSchemaNode); + } } } diff --git a/code-generator/binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/ChoiceCaseGenTypesTest.java b/code-generator/binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/ChoiceCaseGenTypesTest.java index 3068f46fe6..048de43e71 100644 --- a/code-generator/binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/ChoiceCaseGenTypesTest.java +++ b/code-generator/binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/ChoiceCaseGenTypesTest.java @@ -8,7 +8,8 @@ package org.opendaylight.yangtools.sal.binding.generator.impl; import static org.junit.Assert.*; -import static org.opendaylight.yangtools.sal.binding.generator.impl.SupportTestUtil.*; +import static org.opendaylight.yangtools.sal.binding.generator.impl.SupportTestUtil.containsInterface; +import static org.opendaylight.yangtools.sal.binding.generator.impl.SupportTestUtil.containsMethods; import java.io.File; import java.util.ArrayList; @@ -70,6 +71,7 @@ public class ChoiceCaseGenTypesTest { public void choiceCaseResolvingTypeTest() { final YangModelParser parser = new YangParserImpl(); final Set modules = parser.parseYangModels(yangModels); + final SchemaContext context = parser.resolveSchemaContext(modules); assertNotNull("context is null", context); @@ -141,6 +143,7 @@ public class ChoiceCaseGenTypesTest { genType = checkGeneratedType(genTypes, "LeafAugCase", pcgPref + ".netconf.state.datastores.datastore.locks.lock.type"); // choice + // FIXME containsMethods(genType, new NameTypePattern("getLeafAugCase", "String")); containsInterface("LockType", genType); diff --git a/code-generator/binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/SupportTestUtil.java b/code-generator/binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/SupportTestUtil.java index acaf426cf9..aee0c431d9 100644 --- a/code-generator/binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/SupportTestUtil.java +++ b/code-generator/binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/SupportTestUtil.java @@ -117,7 +117,7 @@ public class SupportTestUtil { break; } } - assertTrue("Generated type " + genType.getName() + " doesn't implement inrerface " + interfaceNameSearched, + assertTrue("Generated type " + genType.getName() + " doesn't implement interface " + interfaceNameSearched, interfaceFound); } diff --git a/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java b/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java index 0581b95ddc..59d4523aff 100644 --- a/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java +++ b/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java @@ -43,14 +43,17 @@ import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; /** * Test correct code generation. - * + * */ public class CompilationTest { private static final String FS = File.separator; - private static final String NS_TEST = "org" + FS + "opendaylight" + FS + "yang" + FS + "gen" + FS + "v1" + FS - + "urn" + FS + "opendaylight" + FS + "test" + FS + "rev131008"; - private static final String NS_FOO = "org" + FS + "opendaylight" + FS + "yang" + FS + "gen" + FS + "v1" + FS - + "urn" + FS + "opendaylight" + FS + "foo" + FS + "rev131008"; + private static final String BASE_PATH = "org" + FS + "opendaylight" + FS + "yang" + FS + "gen" + FS + "v1"; + private static final String NS_TEST = BASE_PATH + FS + "urn" + FS + "opendaylight" + FS + "test" + FS + "rev131008"; + private static final String NS_FOO = BASE_PATH + FS + "urn" + FS + "opendaylight" + FS + "foo" + FS + "rev131008"; + private static final String NS_BAR = BASE_PATH + FS + "urn" + FS + "opendaylight" + FS + "bar" + FS + "rev131008"; + private static final String NS_BAZ = BASE_PATH + FS + "urn" + FS + "opendaylight" + FS + "baz" + FS + "rev131008"; + + private static final String BASE_PKG = "org.opendaylight.yang.gen.v1"; private static final String TEST_PATH = "target" + FS + "test"; private static final File TEST_DIR = new File(TEST_PATH); @@ -62,6 +65,8 @@ public class CompilationTest { private YangParserImpl parser; private BindingGenerator bindingGenerator; + private JavaCompiler compiler; + private StandardJavaFileManager fileManager; @BeforeClass public static void createTestDirs() { @@ -76,6 +81,8 @@ public class CompilationTest { public void init() { parser = new YangParserImpl(); bindingGenerator = new BindingGeneratorImpl(); + compiler = ToolProvider.getSystemJavaCompiler(); + fileManager = compiler.getStandardFileManager(null, null, null); } /** @@ -107,32 +114,63 @@ public class CompilationTest { // Test if all sources are generated File parent = new File(sourcesOutputDir, NS_TEST); - File linksKeyFile = new File(parent, "LinksKey.java"); - assertTrue(new File(parent, "KeyArgs.java").exists()); - assertTrue(new File(parent, "Links.java").exists()); - assertTrue(new File(parent, "LinksBuilder.java").exists()); - assertTrue(linksKeyFile.exists()); - assertTrue(new File(parent, "TestData.java").exists()); - assertTrue(new File(parent, "links" + FS + "Level.java").exists()); - assertTrue(new File(parent, "links" + FS + "LinkGroup.java").exists()); - assertTrue(new File(parent, "links" + FS + "Node.java").exists()); - assertTrue(new File(parent, "links" + FS + "NodeBuilder.java").exists()); - assertTrue(new File(parent, "links" + FS + "NodeList.java").exists()); - assertTrue(new File(parent, "links" + FS + "NodeListBuilder.java").exists()); - assertTrue(linksKeyFile.exists()); + assertEquals(6, parent.listFiles().length); + File keyArgs = new File(parent, "KeyArgs.java"); + File links = new File(parent, "Links.java"); + File linksBuilder = new File(parent, "LinksBuilder.java"); + File linksKey = new File(parent, "LinksKey.java"); + File testData = new File(parent, "TestData.java"); + assertTrue(keyArgs.exists()); + assertTrue(links.exists()); + assertTrue(linksBuilder.exists()); + assertTrue(linksKey.exists()); + assertTrue(testData.exists()); + + parent = new File(sourcesOutputDir, NS_TEST + FS + "links"); + assertEquals(7, parent.listFiles().length); + File level = new File(parent, "Level.java"); + File linkGroup = new File(parent, "LinkGroup.java"); + File node = new File(parent, "Node.java"); + File nodeBuilder = new File(parent, "NodeBuilder.java"); + File nodeList = new File(parent, "NodeList.java"); + File nodeListBuilder = new File(parent, "NodeListBuilder.java"); + File nodesType = new File(parent, "NodesType.java"); + assertTrue(level.exists()); + assertTrue(linkGroup.exists()); + assertTrue(node.exists()); + assertTrue(nodeBuilder.exists()); + assertTrue(nodeList.exists()); + assertTrue(nodeListBuilder.exists()); + assertTrue(nodesType.exists()); // Test if sources are compilable - JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); - StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); - List filesList = getJavaFiles(sourcesOutputDir); - Iterable compilationUnits = fileManager.getJavaFileObjectsFromFiles(filesList); - Iterable options = Arrays.asList("-d", compiledOutputDir.getAbsolutePath()); - boolean compiled = compiler.getTask(null, null, null, options, null, compilationUnits).call(); - assertTrue(compiled); + testCompilation(sourcesOutputDir, compiledOutputDir); ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); - Class linksKeyClass = Class.forName("org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev131008.LinksKey", - true, loader); + Class keyArgsClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.KeyArgs", true, loader); + Class linksClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.Links", true, loader); + Class linksKeyClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.LinksKey", true, loader); + + // Test generated 'grouping key-args' + try { + assertTrue(keyArgsClass.isInterface()); + assertEquals(3, keyArgsClass.getDeclaredMethods().length); + + Method getId = keyArgsClass.getMethod("getId"); + assertEquals(Byte.class, getId.getReturnType()); + Method getName = keyArgsClass.getMethod("getName"); + assertEquals(String.class, getName.getReturnType()); + Method getSize = keyArgsClass.getMethod("getSize"); + assertEquals(Integer.class, getSize.getReturnType()); + } catch (NoSuchMethodException e) { + throw new AssertionError("Required method not found in " + keyArgsClass, e); + } + + // test generated 'list links' + assertTrue(linksClass.isInterface()); + // FIXME: anyxml + assertEquals(5, linksClass.getDeclaredMethods().length); + testImplementIfc(linksClass, keyArgsClass); // Test list key constructor arguments ordering try { @@ -158,26 +196,218 @@ public class CompilationTest { final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types)); generator.generateToFile(sourcesOutputDir); - // Test if all sources are generated - File parent = new File(sourcesOutputDir, NS_TEST); + // Test if all sources were generated from 'module foo' + File parent = new File(sourcesOutputDir, NS_FOO); + assertEquals(7, parent.listFiles().length); assertTrue(new File(parent, "Object.java").exists()); assertTrue(new File(parent, "OpenObject.java").exists()); - assertTrue(new File(parent, "object" + FS + "Nodes.java").exists()); - assertTrue(new File(parent, "object" + FS + "NodesBuilder.java").exists()); - assertTrue(new File(parent, "open" + FS + "object" + FS + "Nodes1.java").exists()); - assertTrue(new File(parent, "open" + FS + "object" + FS + "Nodes1Builder.java").exists()); - assertTrue(new File(parent, "open" + FS + "object" + FS + "nodes" + FS + "Links.java").exists()); - assertTrue(new File(parent, "open" + FS + "object" + FS + "nodes" + FS + "LinksBuilder.java").exists()); + assertTrue(new File(parent, "ExplicitRouteObject.java").exists()); + assertTrue(new File(parent, "PathKeySubobject.java").exists()); + + parent = new File(parent, "object"); + assertEquals(2, parent.listFiles().length); + assertTrue(new File(parent, "Nodes.java").exists()); + assertTrue(new File(parent, "NodesBuilder.java").exists()); + + parent = new File(sourcesOutputDir, NS_FOO + FS + "open"); + assertEquals(1, parent.listFiles().length); + + parent = new File(parent, "object"); + assertEquals(3, parent.listFiles().length); + assertTrue(new File(parent, "Nodes1.java").exists()); + assertTrue(new File(parent, "Nodes1Builder.java").exists()); + + parent = new File(parent, "nodes"); + assertEquals(2, parent.listFiles().length); + assertTrue(new File(parent, "Links.java").exists()); + assertTrue(new File(parent, "LinksBuilder.java").exists()); + + parent = new File(sourcesOutputDir, NS_FOO + FS + "explicit"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "route"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "object"); + assertEquals(3, parent.listFiles().length); + assertTrue(new File(parent, "Subobjects.java").exists()); + assertTrue(new File(parent, "SubobjectsBuilder.java").exists()); + + parent = new File(parent, "subobjects"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "subobject"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "type"); + assertEquals(3, parent.listFiles().length); + assertTrue(new File(parent, "PathKey.java").exists()); + assertTrue(new File(parent, "PathKeyBuilder.java").exists()); + + parent = new File(parent, "path"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "key"); + assertEquals(2, parent.listFiles().length); + assertTrue(new File(parent, "PathKey.java").exists()); + assertTrue(new File(parent, "PathKeyBuilder.java").exists()); + + // Test if all sources were generated from 'module bar' + parent = new File(sourcesOutputDir, NS_BAR); + assertEquals(3, parent.listFiles().length); + assertTrue(new File(parent, "BasicExplicitRouteSubobjects.java").exists()); + assertTrue(new File(parent, "ExplicitRouteSubobjects.java").exists()); + + parent = new File(parent, "basic"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "explicit"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "route"); + assertEquals(1, parent.listFiles().length); + + parent = new File(parent, "subobjects"); + assertEquals(2, parent.listFiles().length); + assertTrue(new File(parent, "SubobjectType.java").exists()); + + parent = new File(parent, "subobject"); + assertEquals(1, parent.listFiles().length); + + parent = new File(parent, "type"); + assertEquals(4, parent.listFiles().length); + assertTrue(new File(parent, "IpPrefix.java").exists()); + assertTrue(new File(parent, "IpPrefixBuilder.java").exists()); + assertTrue(new File(parent, "Label.java").exists()); + assertTrue(new File(parent, "LabelBuilder.java").exists()); // Test if sources are compilable - JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); - StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); + testCompilation(sourcesOutputDir, compiledOutputDir); - List filesList = getJavaFiles(sourcesOutputDir); - Iterable compilationUnits = fileManager.getJavaFileObjectsFromFiles(filesList); - Iterable options = Arrays.asList("-d", compiledOutputDir.getAbsolutePath()); - boolean compiled = compiler.getTask(null, null, null, options, null, compilationUnits).call(); - assertTrue(compiled); + cleanUp(sourcesOutputDir, compiledOutputDir); + } + + @Test + public void testAugmentOfAugmentGeneration() throws Exception { + final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "aug-of-aug"); + assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir()); + final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "aug-of-aug"); + assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); + + final List sourceFiles = getSourceFiles("/compilation/augment-of-augment"); + final Set modulesToBuild = parser.parseYangModels(sourceFiles); + final SchemaContext context = parser.resolveSchemaContext(modulesToBuild); + final List types = bindingGenerator.generateTypes(context); + final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types)); + generator.generateToFile(sourcesOutputDir); + + // Test if all sources were generated from 'module foo' + File parent = new File(sourcesOutputDir, NS_FOO); + assertEquals(6, parent.listFiles().length); + File fooListener = new File(parent, "FooListener.java"); + File pathAttributes = new File(parent, "PathAttributes.java"); + File update = new File(parent, "Update.java"); + File updateBuilder = new File(parent, "UpdateBuilder.java"); + assertTrue(fooListener.exists()); + assertTrue(pathAttributes.exists()); + assertTrue(update.exists()); + assertTrue(updateBuilder.exists()); + + parent = new File(sourcesOutputDir, NS_FOO + FS + "path"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "attributes"); + assertEquals(2, parent.listFiles().length); + File origin = new File(parent, "Origin.java"); + File originBuilder = new File(parent, "OriginBuilder.java"); + assertTrue(origin.exists()); + assertTrue(originBuilder.exists()); + + parent = new File(sourcesOutputDir, NS_FOO + FS + "update"); + assertEquals(2, parent.listFiles().length); + pathAttributes = new File(parent, "PathAttributes.java"); + File pathAttributesBuilder = new File(parent, "PathAttributesBuilder.java"); + assertTrue(pathAttributes.exists()); + assertTrue(pathAttributesBuilder.exists()); + + // Test if all sources were generated from 'module bar' + parent = new File(sourcesOutputDir, NS_BAR); + assertEquals(5, parent.listFiles().length); + File destination = new File(parent, "Destination.java"); + File pathAttributes1 = new File(parent, "PathAttributes1.java"); + File pathAttributes1Builder = new File(parent, "PathAttributes1Builder.java"); + assertTrue(destination.exists()); + assertTrue(pathAttributes1.exists()); + assertTrue(pathAttributes1Builder.exists()); + + parent = new File(sourcesOutputDir, NS_BAR + FS + "destination"); + assertEquals(2, parent.listFiles().length); + File destinationType = new File(parent, "DestinationType.java"); + assertTrue(destinationType.exists()); + + parent = new File(parent, "destination"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "type"); + assertEquals(2, parent.listFiles().length); + File destinationIpv4 = new File(parent, "DestinationIp.java"); + File destinationIpv4Builder = new File(parent, "DestinationIpBuilder.java"); + assertTrue(destinationIpv4.exists()); + assertTrue(destinationIpv4Builder.exists()); + + parent = new File(sourcesOutputDir, NS_BAR + FS + "update"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "path"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "attributes"); + assertEquals(3, parent.listFiles().length); + File mpUnreachNlri = new File(parent, "MpUnreachNlri.java"); + File mpUnreachNlriBuilder = new File(parent, "MpUnreachNlriBuilder.java"); + assertTrue(mpUnreachNlri.exists()); + assertTrue(mpUnreachNlriBuilder.exists()); + + parent = new File(parent, "mp"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "unreach"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "nlri"); + assertEquals(3, parent.listFiles().length); + File withdrawnRoutes = new File(parent, "WithdrawnRoutes.java"); + File withdrawnRoutesBuilder = new File(parent, "WithdrawnRoutesBuilder.java"); + assertTrue(withdrawnRoutes.exists()); + assertTrue(withdrawnRoutesBuilder.exists()); + + parent = new File(parent, "withdrawn"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "routes"); + assertEquals(1, parent.listFiles().length); + destinationType = new File(parent, "DestinationType.java"); + assertTrue(destinationType.exists()); + + // Test if all sources were generated from 'module baz' + parent = new File(sourcesOutputDir, NS_BAZ); + assertEquals(2, parent.listFiles().length); + File linkstateDestination = new File(parent, "LinkstateDestination.java"); + assertTrue(linkstateDestination.exists()); + + parent = new File(sourcesOutputDir, NS_BAZ + FS + "update"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "path"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "attributes"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "mp"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "unreach"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "nlri"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "withdrawn"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "routes"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "destination"); + assertEquals(1, parent.listFiles().length); + parent = new File(parent, "type"); + assertEquals(2, parent.listFiles().length); + File destinationLinkstate = new File(parent, "DestinationLinkstate.java"); + File destinationLinkstateBuilder = new File(parent, "DestinationLinkstateBuilder.java"); + assertTrue(destinationLinkstate.exists()); + assertTrue(destinationLinkstateBuilder.exists()); + + // Test if sources are compilable + testCompilation(sourcesOutputDir, compiledOutputDir); cleanUp(sourcesOutputDir, compiledOutputDir); } @@ -202,40 +432,34 @@ public class CompilationTest { assertTrue(new File(parent, "NodesBuilder.java").exists()); assertTrue(new File(parent, "Alg.java").exists()); - JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); - StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); - - List filesList = getJavaFiles(sourcesOutputDir); - Iterable compilationUnits = fileManager.getJavaFileObjectsFromFiles(filesList); - Iterable options = Arrays.asList("-d", compiledOutputDir.getAbsolutePath()); - boolean compiled = compiler.getTask(null, null, null, options, null, compilationUnits).call(); - assertTrue(compiled); + // Test if sources are compilable + testCompilation(sourcesOutputDir, compiledOutputDir); - String pkg = "org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev131008"; + String pkg = BASE_PKG + ".urn.opendaylight.test.rev131008"; ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); Class nodesClass = Class.forName(pkg + ".Nodes", true, loader); // Test methods return type byte[] b = new byte[] {}; testReturnType(nodesClass, "getIdBinary", b.getClass()); - testReturnType(loader, nodesClass, "getIdBits", pkg + ".Nodes$IdBits"); - testReturnType(loader, nodesClass, "isIdBoolean", "java.lang.Boolean"); - testReturnType(loader, nodesClass, "getIdDecimal64", "java.math.BigDecimal"); - testReturnType(loader, nodesClass, "isIdEmpty", "java.lang.Boolean"); - testReturnType(loader, nodesClass, "getIdEnumeration", pkg + ".Nodes$IdEnumeration"); + testReturnType(nodesClass, "getIdBits", pkg + ".Nodes$IdBits", loader); + testReturnType(nodesClass, "isIdBoolean", "java.lang.Boolean", loader); + testReturnType(nodesClass, "getIdDecimal64", "java.math.BigDecimal", loader); + testReturnType(nodesClass, "isIdEmpty", "java.lang.Boolean", loader); + testReturnType(nodesClass, "getIdEnumeration", pkg + ".Nodes$IdEnumeration", loader); testReturnTypeIdentityref(nodesClass, "getIdIdentityref", pkg + ".Alg"); testReturnTypeInstanceIdentitifer(loader, nodesClass, "getIdInstanceIdentifier"); - testReturnType(loader, nodesClass, "getId8", "java.lang.Byte"); - testReturnType(loader, nodesClass, "getId16", "java.lang.Short"); - testReturnType(loader, nodesClass, "getId32", "java.lang.Integer"); - testReturnType(loader, nodesClass, "getId64", "java.lang.Long"); - testReturnType(loader, nodesClass, "getIdLeafref", "java.lang.Long"); - testReturnType(loader, nodesClass, "getIdString", "java.lang.String"); - testReturnType(loader, nodesClass, "getIdU8", "java.lang.Short"); - testReturnType(loader, nodesClass, "getIdU16", "java.lang.Integer"); - testReturnType(loader, nodesClass, "getIdU32", "java.lang.Long"); - testReturnType(loader, nodesClass, "getIdU64", "java.math.BigInteger"); - testReturnType(loader, nodesClass, "getIdUnion", pkg + ".Nodes$IdUnion"); + testReturnType(nodesClass, "getId8", "java.lang.Byte", loader); + testReturnType(nodesClass, "getId16", "java.lang.Short", loader); + testReturnType(nodesClass, "getId32", "java.lang.Integer", loader); + testReturnType(nodesClass, "getId64", "java.lang.Long", loader); + testReturnType(nodesClass, "getIdLeafref", "java.lang.Long", loader); + testReturnType(nodesClass, "getIdString", "java.lang.String", loader); + testReturnType(nodesClass, "getIdU8", "java.lang.Short", loader); + testReturnType(nodesClass, "getIdU16", "java.lang.Integer", loader); + testReturnType(nodesClass, "getIdU32", "java.lang.Long", loader); + testReturnType(nodesClass, "getIdU64", "java.math.BigInteger", loader); + testReturnType(nodesClass, "getIdUnion", pkg + ".Nodes$IdUnion", loader); cleanUp(sourcesOutputDir, compiledOutputDir); } @@ -256,25 +480,31 @@ public class CompilationTest { // Test if all sources are generated File fooParent = new File(sourcesOutputDir, NS_FOO); - File nodes = new File(fooParent, "Nodes.java"); - File nodesBuilder = new File(fooParent, "NodesBuilder.java"); + assertEquals(3, fooParent.listFiles().length); assertTrue(new File(fooParent, "FooData.java").exists()); - assertTrue(nodes.exists()); - assertTrue(nodesBuilder.exists()); + assertTrue(new File(fooParent, "Nodes.java").exists()); + assertTrue(new File(fooParent, "NodesBuilder.java").exists()); - // Test if sources are compilable - JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); - StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); + File barParent = new File(sourcesOutputDir, NS_BAR); + assertEquals(1, barParent.listFiles().length); + assertTrue(new File(barParent, "IdentityClass.java").exists()); - List filesList = getJavaFiles(sourcesOutputDir); - Iterable compilationUnits = fileManager.getJavaFileObjectsFromFiles(filesList); - Iterable options = Arrays.asList("-d", compiledOutputDir.getAbsolutePath()); - boolean compiled = compiler.getTask(null, null, null, options, null, compilationUnits).call(); - assertTrue(compiled); + // Test if sources are compilable + testCompilation(sourcesOutputDir, compiledOutputDir); ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); - Class nodesClass = Class.forName("org.opendaylight.yang.gen.v1.urn.opendaylight.foo.rev131008.Nodes", true, - loader); + Class nodesClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true, loader); + Class identityClass = Class + .forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.IdentityClass", true, loader); + + // test identity + try { + identityClass.getConstructor(); + Class baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader); + assertEquals(baseIdentity, identityClass.getSuperclass()); + } catch (NoSuchMethodException e) { + throw new AssertionError("IdentityClass must have no-arg constructor"); + } // Test annotation try { @@ -290,6 +520,37 @@ public class CompilationTest { cleanUp(sourcesOutputDir, compiledOutputDir); } + @Test + public void testAugmentToUsesInAugment() throws Exception { + final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "augment-uses-to-augment"); + assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir()); + final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "augment-uses-to-augment"); + assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); + + final List sourceFiles = getSourceFiles("/compilation/augment-uses-to-augment"); + final Set modulesToBuild = parser.parseYangModels(sourceFiles); + final SchemaContext context = parser.resolveSchemaContext(modulesToBuild); + final List types = bindingGenerator.generateTypes(context); + final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types)); + generator.generateToFile(sourcesOutputDir); + + // Test if all sources are generated + File fooParent = new File(sourcesOutputDir, NS_FOO); + assertEquals(4, fooParent.listFiles().length); + assertTrue(new File(fooParent, "IgpLinkAttributes.java").exists()); + assertTrue(new File(fooParent, "Link1.java").exists()); + assertTrue(new File(fooParent, "Link1Builder.java").exists()); + + File bazParent = new File(sourcesOutputDir, NS_BAZ); + assertEquals(4, bazParent.listFiles().length); + assertTrue(new File(bazParent, "IgpLinkAttributes1.java").exists()); + assertTrue(new File(bazParent, "IgpLinkAttributes1Builder.java").exists()); + assertTrue(new File(bazParent, "LinkAttributes.java").exists()); + + // Test if sources are compilable + testCompilation(sourcesOutputDir, compiledOutputDir); + } + @Test public void compilationTest() throws Exception { final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "yang"); @@ -304,16 +565,41 @@ public class CompilationTest { final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types)); generator.generateToFile(sourcesOutputDir); - JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); - StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); + // Test if sources are compilable + testCompilation(sourcesOutputDir, compiledOutputDir); + cleanUp(sourcesOutputDir, compiledOutputDir); + } + + /** + * Test if source code is compilable. + * + * @param sourcesOutputDir + * directory containing source files + * @param compiledOutputDir + * compiler output directory + */ + private void testCompilation(File sourcesOutputDir, File compiledOutputDir) { List filesList = getJavaFiles(sourcesOutputDir); Iterable compilationUnits = fileManager.getJavaFileObjectsFromFiles(filesList); Iterable options = Arrays.asList("-d", compiledOutputDir.getAbsolutePath()); boolean compiled = compiler.getTask(null, null, null, options, null, compilationUnits).call(); assertTrue(compiled); + } - cleanUp(sourcesOutputDir, compiledOutputDir); + private void testImplementIfc(Class classToTest, String ifc, ClassLoader loader) throws ClassNotFoundException { + Class[] interfaces = classToTest.getInterfaces(); + List> ifcsList = Arrays.asList(interfaces); + Class ifcClass = Class.forName(ifc, true, loader); + testImplementIfc(classToTest, ifcClass); + } + + private void testImplementIfc(Class classToTest, Class ifcClass) throws ClassNotFoundException { + Class[] interfaces = classToTest.getInterfaces(); + List> ifcsList = Arrays.asList(interfaces); + if (!ifcsList.contains(ifcClass)) { + throw new AssertionError(classToTest + " should implement " + ifcClass); + } } private void testReturnType(Class clazz, String methodName, Class returnType) throws Exception { @@ -326,7 +612,7 @@ public class CompilationTest { } } - private void testReturnType(ClassLoader loader, Class clazz, String methodName, String returnTypeStr) + private void testReturnType(Class clazz, String methodName, String returnTypeStr, ClassLoader loader) throws Exception { Class returnType; try { diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/bar.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/bar.yang new file mode 100644 index 0000000000..231bb420f1 --- /dev/null +++ b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/bar.yang @@ -0,0 +1,29 @@ +module bar { + yang-version 1; + namespace "urn:opendaylight:bar"; + prefix "bar"; + + import foo { prefix fo; revision-date 2013-10-08; } + + revision "2013-10-08" { + } + + augment "/fo:update/fo:path-attributes" { + container mp-unreach-nlri { + container withdrawn-routes { + uses destination; + } + } + } + + grouping destination { + choice destination-type { + case destination-ip { + leaf-list prefixes { + type string; + } + } + } + } + +} diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/baz.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/baz.yang new file mode 100644 index 0000000000..f361b34b5a --- /dev/null +++ b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/baz.yang @@ -0,0 +1,27 @@ +module baz { + yang-version 1; + namespace "urn:opendaylight:baz"; + prefix "baz"; + + import foo { prefix fo; revision-date 2013-10-08; } + import bar { prefix br; revision-date 2013-10-08; } + + revision "2013-10-08" { + } + + augment "/fo:update/fo:path-attributes/br:mp-unreach-nlri/br:withdrawn-routes/br:destination-type" { + case destination-linkstate { + uses linkstate-destination; + } + } + + grouping linkstate-destination { + leaf nlri-type { + type string; + } + leaf protocol-id { + type string; + } + } + +} diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/foo.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/foo.yang new file mode 100644 index 0000000000..502b29b212 --- /dev/null +++ b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/foo.yang @@ -0,0 +1,23 @@ +module foo { + yang-version 1; + namespace "urn:opendaylight:foo"; + prefix "foo"; + + revision "2013-10-08" { + } + + grouping path-attributes { + container origin { + leaf value { + type string; + } + } + } + + notification update { + container path-attributes { + uses path-attributes; + } + } + +} diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/bar.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/bar.yang new file mode 100644 index 0000000000..e1735b4082 --- /dev/null +++ b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/bar.yang @@ -0,0 +1,22 @@ +module bar { + yang-version 1; + namespace "urn:opendaylight:bar"; + prefix "bar"; + + revision "2013-10-08" { + } + + grouping basic-explicit-route-subobjects { + choice subobject-type { + case ip-prefix { + } + case label { + } + } + } + + grouping explicit-route-subobjects { + uses basic-explicit-route-subobjects; + } + +} diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/foo.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/foo.yang new file mode 100644 index 0000000000..e0d60ac85f --- /dev/null +++ b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/foo.yang @@ -0,0 +1,51 @@ +module foo { + yang-version 1; + namespace "urn:opendaylight:foo"; + prefix "foo"; + + import bar { prefix b; revision-date 2013-10-08; } + + revision "2013-10-08" { + } + + grouping object { + container nodes { + } + } + + grouping open-object { + uses object { + augment "nodes" { + container links { + leaf id { + type string; + } + } + } + } + } + + grouping explicit-route-object { + list subobjects { + leaf loose { + type boolean; + } + uses b:explicit-route-subobjects { + augment "subobject-type" { + case path-key { + container path-key { + uses path-key-subobject; + } + } + } + } + } + } + + grouping path-key-subobject { + leaf path-key { + type string; + } + } + +} diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/test.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/test.yang deleted file mode 100644 index a13c39e59b..0000000000 --- a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/test.yang +++ /dev/null @@ -1,26 +0,0 @@ -module test { - yang-version 1; - namespace "urn:opendaylight:test"; - prefix "t"; - - revision "2013-10-08" { - } - - grouping object { - container nodes { - } - } - - grouping open-object { - uses object { - augment "nodes" { - container links { - leaf id { - type string; - } - } - } - } - } - -} diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/bar.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/bar.yang new file mode 100644 index 0000000000..c4fd4eacf2 --- /dev/null +++ b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/bar.yang @@ -0,0 +1,28 @@ +module bar { + yang-version 1; + namespace "urn:opendaylight.bar"; + prefix "bar"; + + revision "2013-10-08" { + } + + container network-topology { + list topology { + key "topology-id"; + leaf topology-id { + type int32; + } + list link { + key "link-id"; + uses link-attributes; + } + } + } + + grouping link-attributes { + leaf link-id { + type int8; + } + } + +} diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/baz.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/baz.yang new file mode 100644 index 0000000000..0cf07cb4f6 --- /dev/null +++ b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/baz.yang @@ -0,0 +1,35 @@ +module baz { + yang-version 1; + namespace "urn:opendaylight.baz"; + prefix "baz"; + + import foo { + prefix "fo"; + revision-date 2013-10-08; + } + + import bar { + prefix "br"; + revision-date 2013-10-08; + } + + revision "2013-10-08" { + } + + + + augment "/br:network-topology/br:topology/br:link/fo:igp-link-attributes" { + uses link-attributes; + } + + grouping link-attributes { + container ospf-link-attributes { + leaf multi-topology-id { + type uint8 { + range "0..127"; + } + } + } + } + +} diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/foo.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/foo.yang new file mode 100644 index 0000000000..e98201139b --- /dev/null +++ b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/foo.yang @@ -0,0 +1,36 @@ +module foo { + yang-version 1; + namespace "urn:opendaylight.foo"; + prefix "foo"; + + import bar { + prefix "br"; + revision-date 2013-10-08; + } + + revision "2013-10-08" { + } + + + augment "/br:network-topology/br:topology/br:link" { + uses igp-link-attributes; + } + + grouping igp-link-attributes { + container igp-link-attributes { + leaf name { + type string; + } + leaf-list flag { + type string; + } + leaf metric { + type uint32 { + range "0..16777215" { + } + } + } + } + } + +} diff --git a/code-generator/binding-type-provider/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java b/code-generator/binding-type-provider/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java index a8abe38c70..63486ce810 100644 --- a/code-generator/binding-type-provider/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java +++ b/code-generator/binding-type-provider/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java @@ -11,6 +11,7 @@ import static org.opendaylight.yangtools.binding.generator.util.BindingGenerator import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.*; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -50,6 +51,7 @@ import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; 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.DataNodeIterator; import org.opendaylight.yangtools.yang.model.util.ExtendedType; import org.opendaylight.yangtools.yang.model.util.StringType; import org.opendaylight.yangtools.yang.model.util.UnionType; @@ -561,7 +563,8 @@ public final class TypeProviderImpl implements TypeProvider { final String moduleName = module.getName(); final String basePackageName = moduleNamespaceToPackageName(module); - final Set> typeDefinitions = module.getTypeDefinitions(); + final DataNodeIterator it = new DataNodeIterator(module); + final List> typeDefinitions = it.allTypedefs(); final List> listTypeDefinitions = sortTypeDefinitionAccordingDepth(typeDefinitions); final Map typeMap = new HashMap<>(); @@ -1108,7 +1111,7 @@ public final class TypeProviderImpl implements TypeProvider { * definitions are in list behind them). */ private List> sortTypeDefinitionAccordingDepth( - final Set> unsortedTypeDefinitions) { + final Collection> unsortedTypeDefinitions) { List> sortedTypeDefinition = new ArrayList<>(); Map>> typeDefinitionsDepths = new TreeMap<>(); diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java index 20b9ea4d48..6c86c2c303 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java @@ -14,7 +14,9 @@ import org.opendaylight.yangtools.yang.common.QName; /** * Node which can contains other nodes. */ -public interface DataNodeContainer { +public interface DataNodeContainer extends YangNode { + + YangNode getParent(); /** * Returns set of all newly defined types within this DataNodeContainer. diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataSchemaNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataSchemaNode.java index 892a725225..f126a52939 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataSchemaNode.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataSchemaNode.java @@ -8,17 +8,19 @@ package org.opendaylight.yangtools.yang.model.api; /** - * + * * Contains the method which are used for getting metadata from the schema nodes * which contains data. - * + * */ -public interface DataSchemaNode extends SchemaNode { +public interface DataSchemaNode extends SchemaNode, YangNode { + + YangNode getParent(); /** * Returns true if the data node was added by augmentation, * otherwise returns false - * + * * @return true if the data node was added by augmentation, * otherwise returns false */ @@ -27,7 +29,7 @@ public interface DataSchemaNode extends SchemaNode { /** * Returns true if the data node was added by uses statement, * otherwise returns false - * + * * @return true if the data node was added by uses statement, * otherwise returns false */ @@ -36,7 +38,7 @@ public interface DataSchemaNode extends SchemaNode { /** * Returns true if the data represents configuration data, * otherwise returns false - * + * * @return true if the data represents configuration data, * otherwise returns false */ @@ -44,7 +46,7 @@ public interface DataSchemaNode extends SchemaNode { /** * Returns the constraints associated with Data Schema Node - * + * * @return the constraints associated with Data Schema Node */ ConstraintDefinition getConstraints(); diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/Deviation.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/Deviation.java index 3a7cce85b5..639e03ad00 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/Deviation.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/Deviation.java @@ -17,7 +17,7 @@ import java.util.List; * from a standard. *

    */ -public interface Deviation { +public interface Deviation extends YangNode { /** * Enum describing YANG deviation 'deviate' statement. It defines how the diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/Module.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/Module.java index 837f1718db..3d5cdee205 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/Module.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/Module.java @@ -19,51 +19,51 @@ import java.util.Set; * Example of YANG module
    * {@link #getName() module} module_name{
      {@link #getYangVersion() yang-version} "1";

    - +   {@link #getNamespace() namespace} "urn:module:namespace";
      {@link #getPrefix() prefix} "prefix";

    - +   {@link #getDescription() description} "description test";
      {@link #getReference() reference} "reference test";

      {@link #getOrganization() organization} "John Doe, john.doe@email.com";
      {@link #getContact() contact} "http://www.opendaylight.org/";

    - -   {@link #getFeatures() feature} feature-test{
    + +   {@link #getFeatures() feature} feature-test{
         description "description of some feature";
      }
    - +   {@link #getNotifications() notification} notification-test;
    -   {@link #getRpcs() rpc} rpc-test;
    - -   {@link #getIdentities() identity} identity-test;
    -   {@link #getExtensionSchemaNodes() extension} extension-test;
    +   {@link #getRpcs() rpc} rpc-test;
    + +   {@link #getIdentities() identity} identity-test;
    +   {@link #getExtensionSchemaNodes() extension} extension-test;
      {@link #getRevision() revision} 2011-08-27 {
    - +   {@link #getImports() import} other_module {
        prefix "other_module_prefix"
        revision-date 2011-08-27
      }

    - +   container cont {
      }
    - +   {@link #getAugmentations() augment} "/cont" { ;
      }
    } - +
    */ -public interface Module extends DataNodeContainer { +public interface Module extends DataNodeContainer, YangNode { /** * Returns the namespace of the module which is specified as argument of * YANG {@link Module namespace} * keyword. - * + * * @return URI format of the namespace of the module */ URI getNamespace(); @@ -71,14 +71,14 @@ public interface Module extends DataNodeContainer { /** * Returns the name of the module which is specified as argument of YANG * {@link Module module} keyword - * + * * @return string with the name of the module */ String getName(); /** * Returns the revision date for the module. - * + * * @return date of the module revision which is specified as argument of * YANG {@link Module revison} * keyword @@ -87,7 +87,7 @@ public interface Module extends DataNodeContainer { /** * Returns the prefix of the module - * + * * @return string with the module prefix which is specified as argument of * YANG {@link Module prefix} * keyword @@ -96,9 +96,9 @@ public interface Module extends DataNodeContainer { /** * Returns the YANG version. - * + * * Default value is 1. - * + * * @return string with the module YANG version which is specified as * argument of YANG {@link Module yang-version} keyword @@ -107,7 +107,7 @@ public interface Module extends DataNodeContainer { /** * Returns the module description. - * + * * @return string with the module description which is specified as argument * of YANG {@link Module description} keyword @@ -116,7 +116,7 @@ public interface Module extends DataNodeContainer { /** * Returns the module reference. - * + * * @return string with the module reference which is specified as argument * of YANG {@link Module reference} keyword @@ -125,7 +125,7 @@ public interface Module extends DataNodeContainer { /** * Returns the module organization. - * + * * @return string with the name of the organization specified in the module * as the argument of YANG {@link Module organization} keyword @@ -134,11 +134,11 @@ public interface Module extends DataNodeContainer { /** * Returns the module contact. - * + * * The contact represents the person or persons to whom technical queries * concerning this module should be sent, such as their name, postal * address, telephone number, and electronic mail address. - * + * * @return string with the contact data specified in the module as the * argument of YANG {@link Module contact} keyword @@ -148,7 +148,7 @@ public interface Module extends DataNodeContainer { /** * Returns imports which represents YANG modules which are imported to this * module via import statement. - * + * * @return set of module imports which are specified in the module as the * argument of YANG {@link Module import} keywords. @@ -158,10 +158,10 @@ public interface Module extends DataNodeContainer { /** * Returns FeatureDefinition instances which contain data from * feature statements defined in the module. - * + * * The feature is used to define a mechanism by which portions of the schema * are marked as conditional. - * + * * @return feature statements in lexicographical order which are specified * in the module as the argument of YANG {@link Module feature} keywords. @@ -171,7 +171,7 @@ public interface Module extends DataNodeContainer { /** * Returns NotificationDefinition instances which contain data * from notification statements defined in the module. - * + * * @return notification statements in lexicographical order which are * specified in the module as the argument of YANG {@link Module * notification} keywords. @@ -181,7 +181,7 @@ public interface Module extends DataNodeContainer { /** * Returns AugmentationSchema instances which contain data from * augment statements defined in the module. - * + * * @return set of the augmentation schema instances which are specified in * the module as YANG {@link Module augment} keyword and are @@ -192,7 +192,7 @@ public interface Module extends DataNodeContainer { /** * Returns RpcDefinition instances which contain data from * rpc statements defined in the module. - * + * * @return set of the rpc definition instances which are specified in the * module as YANG {@link Module rpc} keywords and are lexicographicaly @@ -203,7 +203,7 @@ public interface Module extends DataNodeContainer { /** * Returns Deviation instances which contain data from * deviation statements defined in the module. - * + * * @return set of the deviation instances */ Set getDeviations(); @@ -211,7 +211,7 @@ public interface Module extends DataNodeContainer { /** * Returns IdentitySchemaNode instances which contain data from * identity statements defined in the module. - * + * * @return set of identity schema node instances which are specified in the * module as YANG {@link Module identity} keywords and are @@ -222,7 +222,7 @@ public interface Module extends DataNodeContainer { /** * Returns ExtensionDefinition instances which contain data * from extension statements defined in the module. - * + * * @return set of extension definition instances which are specified in the * module as YANG {@link Module extension} keyword and are @@ -232,7 +232,7 @@ public interface Module extends DataNodeContainer { /** * Returns unknown nodes defined in module. - * + * * @return unknown nodes in lexicographical order */ List getUnknownSchemaNodes(); diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/RpcDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/RpcDefinition.java index 4be0490586..752f37dded 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/RpcDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/RpcDefinition.java @@ -17,7 +17,7 @@ import java.util.Set; * are also defined. *

    */ -public interface RpcDefinition extends SchemaNode { +public interface RpcDefinition extends SchemaNode, YangNode { /** * @return Set of type definitions declared under this rpc statement. diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UsesNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UsesNode.java index ae9aabae2b..b8042c80bb 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UsesNode.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UsesNode.java @@ -13,21 +13,23 @@ import java.util.Set; /** * Contains the methods for getting data and checking properties of the YANG * uses substatement. - * + * */ -public interface UsesNode { +public interface UsesNode extends YangNode { + + YangNode getParent(); /** * Returns the schema path to used grouping. - * + * * @return schema path to 'grouping' on which this 'uses' statement points */ SchemaPath getGroupingPath(); /** - * + * * Returns agumentations which were specified in this uses node. - * + * * @return Set of augment statements defined under this uses node */ Set getAugmentations(); @@ -35,7 +37,7 @@ public interface UsesNode { /** * Returns true if the data node was added by augmentation, * otherwise returns false - * + * * @return true if the data node was added by augmentation, * otherwise returns false */ @@ -44,7 +46,7 @@ public interface UsesNode { /** * Returns true if the data node was added by uses statement, * otherwise returns false - * + * * @return true if the data node was added by uses statement, * otherwise returns false */ @@ -53,7 +55,7 @@ public interface UsesNode { /** * Some of the properties of each node in the grouping can be refined with * the "refine" statement. - * + * * @return Map, where key is schema path of refined node and value is * refined node */ diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangNode.java new file mode 100644 index 0000000000..acdbf6cbf2 --- /dev/null +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangNode.java @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.model.api; + +public interface YangNode { + +} diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeIterator.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeIterator.java index 518d6d8a89..ed1db9a315 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeIterator.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeIterator.java @@ -22,6 +22,7 @@ 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.TypeDefinition; public class DataNodeIterator implements Iterator { @@ -31,6 +32,7 @@ public class DataNodeIterator implements Iterator { private final List allChoices; private final List allChilds; private final List allGroupings; + private final List> allTypedefs; public DataNodeIterator(final DataNodeContainer container) { if (container == null) { @@ -42,6 +44,7 @@ public class DataNodeIterator implements Iterator { this.allChilds = new ArrayList<>(); this.allChoices = new ArrayList<>(); this.allGroupings = new ArrayList<>(); + this.allTypedefs = new ArrayList<>(); this.container = container; traverse(this.container); @@ -63,6 +66,10 @@ public class DataNodeIterator implements Iterator { return allGroupings; } + public List> allTypedefs() { + return allTypedefs; + } + private void traverse(final DataNodeContainer dataNode) { if (dataNode == null) { return; @@ -96,6 +103,7 @@ public class DataNodeIterator implements Iterator { } } + this.allTypedefs.addAll(dataNode.getTypeDefinitions()); traverseModule(dataNode); traverseGroupings(dataNode); @@ -108,12 +116,15 @@ public class DataNodeIterator implements Iterator { } else { return; } + final Set notifications = module.getNotifications(); for (NotificationDefinition notificationDefinition : notifications) { traverse(notificationDefinition); } + final Set rpcs = module.getRpcs(); for (RpcDefinition rpcDefinition : rpcs) { + this.allTypedefs.addAll(rpcDefinition.getTypeDefinitions()); ContainerSchemaNode input = rpcDefinition.getInput(); if (input != null) { traverse(input); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractBuilder.java index 2fd454c1f0..4abc94cf94 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractBuilder.java @@ -19,9 +19,9 @@ import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuil public abstract class AbstractBuilder implements Builder { protected String moduleName; protected final int line; - protected Builder parent; + protected Builder parentBuilder; - protected List unknownNodes; + protected List unknownNodes = new ArrayList<>(); protected final List addedUnknownNodes = new ArrayList(); protected AbstractBuilder(final String moduleName, final int line) { @@ -46,12 +46,12 @@ public abstract class AbstractBuilder implements Builder { @Override public Builder getParent() { - return parent; + return parentBuilder; } @Override - public void setParent(final Builder parent) { - this.parent = parent; + public void setParent(final Builder parentBuilder) { + this.parentBuilder = parentBuilder; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java index 927c7f7b35..55610d33b6 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java @@ -7,13 +7,20 @@ */ package org.opendaylight.yangtools.yang.parser.builder.api; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.Map; import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; +import org.opendaylight.yangtools.yang.model.api.TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.UsesNode; +import org.opendaylight.yangtools.yang.parser.util.Comparators; import org.opendaylight.yangtools.yang.parser.util.YangParseException; /** @@ -22,12 +29,18 @@ import org.opendaylight.yangtools.yang.parser.util.YangParseException; public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder implements DataNodeContainerBuilder { protected QName qname; - protected Set childNodes; + protected Map childNodes = new TreeMap(Comparators.QNAME_COMP); protected final Set addedChildNodes = new HashSet(); - protected Set groupings; + protected Set groupings = new TreeSet(Comparators.SCHEMA_NODE_COMP); protected final Set addedGroupings = new HashSet(); + protected Set> typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); + protected final Set addedTypedefs = new HashSet<>(); + + protected Set usesNodes = new HashSet<>(); + protected final Set addedUsesNodes = new HashSet<>(); + protected AbstractDataNodeContainerBuilder(final String moduleName, final int line, final QName qname) { super(moduleName, line); this.qname = qname; @@ -39,15 +52,11 @@ public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder i } @Override - public Set getChildNodes() { + public Collection getChildNodes() { if (childNodes == null) { return Collections.emptySet(); } - return childNodes; - } - - public void setChildNodes(Set childNodes) { - this.childNodes = childNodes; + return childNodes.values(); } @Override @@ -78,6 +87,18 @@ public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder i addedChildNodes.add(child); } + @Override + public void addChildNode(DataSchemaNode child) { + QName childName = child.getQName(); + for (QName qname : childNodes.keySet()) { + if (qname.equals(childName)) { + throw new YangParseException(moduleName, line, "Can not add '" + child + "' to '" + this + + "' in module '" + moduleName + "': node with same name already declared"); + } + } + childNodes.put(child.getQName(), child); + } + @Override public Set getGroupings() { if (groupings == null) { @@ -107,4 +128,18 @@ public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder i addedGroupings.add(grouping); } + @Override + public Set getUsesNodes() { + return addedUsesNodes; + } + + public void setUsesnodes(final Set usesNodes) { + this.usesNodes = usesNodes; + } + + @Override + public void addUsesNode(UsesNodeBuilder usesNode) { + addedUsesNodes.add(usesNode); + } + } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractSchemaNodeBuilder.java index 1a1b6b8d4c..34c48192ff 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractSchemaNodeBuilder.java @@ -23,7 +23,6 @@ public abstract class AbstractSchemaNodeBuilder extends AbstractBuilder implemen protected String description; protected String reference; protected Status status = Status.CURRENT; - protected List unknownNodes; protected AbstractSchemaNodeBuilder(final String moduleName, final int line, final QName qname) { super(moduleName, line); @@ -34,7 +33,7 @@ public abstract class AbstractSchemaNodeBuilder extends AbstractBuilder implemen public int hashCode() { final int prime = 31; int result = super.hashCode(); - result = prime * result + ((parent == null) ? 0 : parent.hashCode()); + result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode()); result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode()); return result; } @@ -54,11 +53,11 @@ public abstract class AbstractSchemaNodeBuilder extends AbstractBuilder implemen return false; } AbstractSchemaNodeBuilder other = (AbstractSchemaNodeBuilder) obj; - if (parent == null) { - if (other.parent != null) { + if (parentBuilder == null) { + if (other.parentBuilder != null) { return false; } - } else if (!parent.equals(other.parent)) { + } else if (!parentBuilder.equals(other.parentBuilder)) { return false; } if (schemaPath == null) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java index c8025892c2..903c05e76b 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java @@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.parser.builder.api; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; +import org.opendaylight.yangtools.yang.model.api.YangNode; /** * Interface for builders of 'augment' statement. @@ -65,7 +66,7 @@ public interface AugmentationSchemaBuilder extends DataNodeContainerBuilder { */ void setTargetNodeSchemaPath(SchemaPath path); - AugmentationSchema build(); + AugmentationSchema build(YangNode parent); /** * Get information about augmentation process. diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/Builder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/Builder.java index 05ff7dbf8e..c2647836c7 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/Builder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/Builder.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.builder.api; import java.util.List; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder; /** @@ -18,35 +19,35 @@ public interface Builder { /** * Get name of module in which this node is declared. - * + * * @return module name */ String getModuleName(); /** * Set name of module in which this node is declared. - * + * * @param moduleName */ void setModuleName(String moduleName); /** * Get current line in yang file. - * + * * @return current line in yang file */ int getLine(); /** * Get parent node of this node. - * + * * @return parent node builder or null if this is top level node */ Builder getParent(); /** * Set parent of this node. - * + * * @param parent * parent node builder */ @@ -54,28 +55,28 @@ public interface Builder { /** * Add unknown node to this builder. - * + * * @param unknownNode */ void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode); /** * Get builders of unknown nodes defined in this node. - * + * * @return collection of UnknownSchemaNodeBuilder objects */ List getUnknownNodeBuilders(); /** * Build YANG data model node. - * + * * This method should create an instance of YANG data model node. After * creating an instance, this instance should be returned for each call * without repeating build process. - * + * * @return YANG data model node */ - Object build(); + Object build(YangNode parent); interface Rebuildable { T toBuilder(); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/DataNodeContainerBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/DataNodeContainerBuilder.java index 9bd45768e3..a2ffec1dcf 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/DataNodeContainerBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/DataNodeContainerBuilder.java @@ -7,6 +7,7 @@ */ package org.opendaylight.yangtools.yang.parser.builder.api; +import java.util.Collection; import java.util.Set; import org.opendaylight.yangtools.yang.common.QName; @@ -22,35 +23,35 @@ public interface DataNodeContainerBuilder extends Builder { /** * Get qname of this node. - * + * * @return QName of this node */ QName getQName(); /** * Get schema path of this node. - * + * * @return SchemaPath of this node */ SchemaPath getPath(); /** * Get already built child nodes. - * + * * @return collection of child nodes */ - Set getChildNodes(); + Collection getChildNodes(); /** * Get builders of child nodes. - * + * * @return collection child nodes builders */ Set getChildNodeBuilders(); /** * Get child node by name. - * + * * @param name * name of child to seek * @return child node with given name if present, null otherwise @@ -59,56 +60,58 @@ public interface DataNodeContainerBuilder extends Builder { /** * Add builder of child node to this node. - * + * * @param childNode */ void addChildNode(DataSchemaNodeBuilder childNode); + void addChildNode(DataSchemaNode childNode); + /** * Get already built groupings defined in this node. - * + * * @return collection of GroupingDefinition objects */ Set getGroupings(); /** * Get builders of groupings defined in this node. - * + * * @return collection of grouping builders */ Set getGroupingBuilders(); /** * Add builder of grouping statement to this node. - * + * * @param groupingBuilder */ void addGrouping(GroupingBuilder groupingBuilder); /** * Get builders of uses defined in this node. - * + * * @return collection of uses builders */ Set getUsesNodes(); /** * Add builder of uses statement to this node. - * + * * @param usesBuilder */ void addUsesNode(UsesNodeBuilder usesBuilder); /** * Get builders of typedef statement defined in this node. - * + * * @return typedefBuilder */ Set getTypeDefinitionBuilders(); /** * Add typedef builder to this node. - * + * * @param typedefBuilder */ void addTypedef(TypeDefinitionBuilder typedefBuilder); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/DataSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/DataSchemaNodeBuilder.java index f1622c413b..8d343bb4e0 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/DataSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/DataSchemaNodeBuilder.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.builder.api; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.impl.ConstraintsBuilder; /** @@ -22,7 +23,7 @@ public interface DataSchemaNodeBuilder extends SchemaNodeBuilder, GroupingMember /** * Build DataSchemaNode object from this builder. */ - DataSchemaNode build(); + DataSchemaNode build(YangNode parent); /** * diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/GroupingBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/GroupingBuilder.java index 79b87a7597..f8ad74d4b6 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/GroupingBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/GroupingBuilder.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.builder.api; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; +import org.opendaylight.yangtools.yang.model.api.YangNode; /** * Interface for builders of 'grouping' statement. @@ -18,7 +19,7 @@ public interface GroupingBuilder extends DataNodeContainerBuilder, SchemaNodeBui /** * Build GroupingDefinition object from this builder. */ - GroupingDefinition build(); + GroupingDefinition build(YangNode parent); void setQName(QName qname); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/SchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/SchemaNodeBuilder.java index 102e6a74ad..9e3124c79a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/SchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/SchemaNodeBuilder.java @@ -11,6 +11,7 @@ import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; +import org.opendaylight.yangtools.yang.model.api.YangNode; /** * Interface for all builders of SchemaNode nodes. @@ -83,6 +84,6 @@ public interface SchemaNodeBuilder extends Builder { /** * Build SchemaNode object from this builder. */ - SchemaNode build(); + SchemaNode build(YangNode parent); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/TypeDefinitionBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/TypeDefinitionBuilder.java index d63648d360..27977111fd 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/TypeDefinitionBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/TypeDefinitionBuilder.java @@ -12,6 +12,7 @@ import java.util.List; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; @@ -23,7 +24,7 @@ public interface TypeDefinitionBuilder extends TypeAwareBuilder, SchemaNodeBuild void setQName(QName qname); - TypeDefinition build(); + TypeDefinition build(YangNode parent); List getRanges(); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/UsesNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/UsesNodeBuilder.java index 77c3356f1d..f27af6e0cb 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/UsesNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/UsesNodeBuilder.java @@ -13,6 +13,7 @@ import java.util.Set; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UsesNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.RefineHolder; @@ -154,7 +155,7 @@ public interface UsesNodeBuilder extends GroupingMember, Builder { /** * Build new UsesNode object. */ - UsesNode build(); + UsesNode build(YangNode parent); /** * Get child nodes defined in target grouping. diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AnyXmlBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AnyXmlBuilder.java index aee09cd52e..03389ff48c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AnyXmlBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AnyXmlBuilder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -17,6 +16,7 @@ import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.Comparators; @@ -38,8 +38,9 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da } @Override - public AnyXmlSchemaNode build() { + public AnyXmlSchemaNode build(YangNode parent) { if (!built) { + instance.setParent(parent); instance.setPath(schemaPath); instance.setConstraints(constraints.build()); instance.setDescription(description); @@ -50,11 +51,8 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da instance.setAddedByUses(addedByUses); // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList<>(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(instance)); } Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); @@ -135,11 +133,11 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da } else if (!schemaPath.equals(other.schemaPath)) { return false; } - if (parent == null) { - if (other.parent != null) { + if (parentBuilder == null) { + if (other.parentBuilder != null) { return false; } - } else if (!parent.equals(other.parent)) { + } else if (!parentBuilder.equals(other.parentBuilder)) { return false; } return true; @@ -153,6 +151,7 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da private final class AnyXmlSchemaNodeImpl implements AnyXmlSchemaNode { private final QName qname; private SchemaPath path; + private YangNode parent; private String description; private String reference; private Status status = Status.CURRENT; @@ -180,6 +179,15 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da this.path = path; } + @Override + public YangNode getParent() { + return parent; + } + + private void setParent(YangNode parent) { + this.parent = parent; + } + @Override public String getDescription() { return description; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java index d8b07e64a0..c74dbabc22 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java @@ -7,13 +7,10 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; import java.util.TreeSet; import org.opendaylight.yangtools.yang.common.QName; @@ -26,6 +23,7 @@ import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.UsesNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; @@ -51,7 +49,6 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain private SchemaPath targetPath; private SchemaPath targetNodeSchemaPath; - private final Set usesNodes = new HashSet(); private boolean resolved; public AugmentationSchemaBuilderImpl(final String moduleName, final int line, final String augmentTargetStr) { @@ -76,24 +73,15 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain throw new YangParseException(moduleName, line, "augment can not contains grouping statement"); } - @Override - public Set getUsesNodes() { - return usesNodes; - } - - @Override - public void addUsesNode(UsesNodeBuilder usesBuilder) { - usesNodes.add(usesBuilder); - } - @Override public SchemaPath getPath() { return targetNodeSchemaPath; } @Override - public AugmentationSchema build() { + public AugmentationSchema build(YangNode parent) { if (!built) { + instance.setParent(parent); instance.setDescription(description); instance.setReference(reference); instance.setStatus(status); @@ -108,23 +96,21 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain instance.setWhenCondition(whenStmt); // CHILD NODES - final Map childs = new TreeMap(Comparators.QNAME_COMP); for (DataSchemaNodeBuilder node : addedChildNodes) { - childs.put(node.getQName(), node.build()); + DataSchemaNode child = node.build(instance); + childNodes.put(child.getQName(), child); } - instance.setChildNodes(childs); + instance.setChildNodes(childNodes); // USES - final Set usesNodeDefinitions = new HashSet(); - for (UsesNodeBuilder builder : usesNodes) { - usesNodeDefinitions.add(builder.build()); + for (UsesNodeBuilder builder : addedUsesNodes) { + usesNodes.add(builder.build(instance)); } - instance.setUses(usesNodeDefinitions); + instance.setUses(usesNodes); // UNKNOWN NODES - List unknownNodes = new ArrayList(); for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); + unknownNodes.add(b.build(instance)); } Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); @@ -220,7 +206,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain int result = 1; result = prime * result + ((augmentTargetStr == null) ? 0 : augmentTargetStr.hashCode()); result = prime * result + ((whenCondition == null) ? 0 : whenCondition.hashCode()); - result = prime * result + ((childNodes == null) ? 0 : childNodes.hashCode()); + result = prime * result + ((addedChildNodes == null) ? 0 : addedChildNodes.hashCode()); return result; } @@ -250,11 +236,11 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain } else if (!whenCondition.equals(other.whenCondition)) { return false; } - if (childNodes == null) { - if (other.childNodes != null) { + if (addedChildNodes == null) { + if (other.addedChildNodes != null) { return false; } - } else if (!childNodes.equals(other.childNodes)) { + } else if (!addedChildNodes.equals(other.addedChildNodes)) { return false; } return true; @@ -265,6 +251,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain } private final class AugmentationSchemaImpl implements AugmentationSchema { + private YangNode parent; private SchemaPath targetPath; private RevisionAwareXPath whenCondition; private Map childNodes = Collections.emptyMap(); @@ -278,6 +265,15 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain this.targetPath = targetPath; } + @Override + public YangNode getParent() { + return parent; + } + + private void setParent(YangNode parent) { + this.parent = parent; + } + @Override public SchemaPath getTargetPath() { return targetPath; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java index d226757972..d56a310ac9 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java @@ -22,6 +22,7 @@ import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder; @@ -34,16 +35,18 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da AugmentationTargetBuilder { private boolean isBuilt; private final ChoiceNodeImpl instance; + private YangNode parent; // DataSchemaNode args private boolean augmenting; private boolean addedByUses; private Boolean configuration; private final ConstraintsBuilder constraints; // AugmentationTarget args - private final Set addedAugmentations = new HashSet<>(); + private final List augmentations = new ArrayList<>(); + private final List augmentationBuilders = new ArrayList<>(); // ChoiceNode args - private Set cases; - private final Set addedCases = new HashSet<>(); + private Set cases = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); + private final Set caseBuilders = new HashSet<>(); private String defaultCase; public ChoiceBuilder(final String moduleName, final int line, final QName qname) { @@ -53,8 +56,10 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da } @Override - public ChoiceNode build() { + public ChoiceNode build(YangNode parent) { if (!isBuilt) { + this.parent = parent; + instance.setParent(parent); instance.setPath(schemaPath); instance.setDescription(description); instance.setReference(reference); @@ -66,29 +71,22 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da instance.setDefaultCase(defaultCase); // CASES - if (cases == null) { - cases = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - for (ChoiceCaseBuilder caseBuilder : addedCases) { - cases.add(caseBuilder.build()); - } + for (ChoiceCaseBuilder caseBuilder : caseBuilders) { + cases.add(caseBuilder.build(instance)); } instance.setCases(cases); // AUGMENTATIONS - final Set augmentations = new HashSet<>(); - for (AugmentationSchemaBuilder builder : addedAugmentations) { - augmentations.add(builder.build()); + for (AugmentationSchemaBuilder builder : augmentationBuilders) { + augmentations.add(builder.build(instance)); } - instance.setAvailableAugmentations(augmentations); + instance.setAvailableAugmentations(new HashSet<>(augmentations)); // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList<>(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(instance)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); isBuilt = true; @@ -99,7 +97,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da @Override public void rebuild() { isBuilt = false; - build(); + build(parent); } @Override @@ -108,7 +106,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da } public Set getCases() { - return addedCases; + return caseBuilders; } /** @@ -119,7 +117,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da * @return case with given name if present, null otherwise */ public ChoiceCaseBuilder getCaseNodeByName(String caseName) { - for (ChoiceCaseBuilder addedCase : addedCases) { + for (ChoiceCaseBuilder addedCase : caseBuilders) { if (addedCase.getQName().getLocalName().equals(caseName)) { return addedCase; } @@ -139,7 +137,8 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da public void addCase(DataSchemaNodeBuilder caseNode) { QName caseQName = caseNode.getQName(); String caseName = caseQName.getLocalName(); - for (ChoiceCaseBuilder addedCase : addedCases) { + + for (ChoiceCaseBuilder addedCase : caseBuilders) { if (addedCase.getQName().getLocalName().equals(caseName)) { throw new YangParseException(caseNode.getModuleName(), caseNode.getLine(), "Can not add '" + caseNode + "' to node '" + qname.getLocalName() + "' in module '" + moduleName @@ -148,7 +147,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da } if (caseNode instanceof ChoiceCaseBuilder) { - addedCases.add((ChoiceCaseBuilder) caseNode); + caseBuilders.add((ChoiceCaseBuilder) caseNode); } else { ChoiceCaseBuilder caseBuilder = new ChoiceCaseBuilder(caseNode.getModuleName(), caseNode.getLine(), caseQName); @@ -162,7 +161,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da SchemaPath newPath = ParserUtils.createSchemaPath(caseNode.getPath(), caseQName); caseNode.setPath(newPath); caseBuilder.addChildNode(caseNode); - addedCases.add(caseBuilder); + caseBuilders.add(caseBuilder); } } @@ -204,13 +203,13 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da return constraints; } - public Set getAugmentations() { - return addedAugmentations; - } - @Override public void addAugmentation(AugmentationSchemaBuilder augment) { - addedAugmentations.add(augment); + augmentationBuilders.add(augment); + } + + public List getAugmentationBuilders() { + return augmentationBuilders; } public List getUnknownNodes() { @@ -252,11 +251,11 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da } else if (!schemaPath.equals(other.schemaPath)) { return false; } - if (parent == null) { - if (other.parent != null) { + if (parentBuilder == null) { + if (other.parentBuilder != null) { return false; } - } else if (!parent.equals(other.parent)) { + } else if (!parentBuilder.equals(other.parentBuilder)) { return false; } return true; @@ -270,6 +269,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da public final class ChoiceNodeImpl implements ChoiceNode { private final QName qname; private SchemaPath path; + private YangNode parent; private String description; private String reference; private Status status = Status.CURRENT; @@ -300,6 +300,15 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da this.path = path; } + @Override + public YangNode getParent() { + return parent; + } + + private void setParent(YangNode parent) { + this.parent = parent; + } + @Override public String getDescription() { return description; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java index e2b34fb0d0..aa6d4d7262 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java @@ -6,7 +6,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; @@ -19,6 +18,7 @@ import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.UsesNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder; @@ -32,6 +32,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im AugmentationTargetBuilder { private boolean isBuilt; private final ChoiceCaseNodeImpl instance; + private YangNode parent; // SchemaNode args private SchemaPath schemaPath; private String description; @@ -41,10 +42,9 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im private boolean augmenting; private boolean addedByUses; private final ConstraintsBuilder constraints; - // DataNodeContainer args - private final Set addedUsesNodes = new HashSet<>(); // AugmentationTarget args - private final Set addedAugmentations = new HashSet<>(); + private final List augmentations = new ArrayList<>(); + private final List augmentationBuilders = new ArrayList<>(); public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname) { super(moduleName, line, qname); @@ -53,8 +53,10 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im } @Override - public ChoiceCaseNode build() { + public ChoiceCaseNode build(YangNode parent) { if (!isBuilt) { + this.parent = parent; + instance.setParent(parent); instance.setConstraints(constraints.build()); instance.setPath(schemaPath); instance.setDescription(description); @@ -64,33 +66,30 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im instance.setAddedByUses(addedByUses); // CHILD NODES - final Map childs = new TreeMap<>(Comparators.QNAME_COMP); for (DataSchemaNodeBuilder node : addedChildNodes) { - childs.put(node.getQName(), node.build()); + DataSchemaNode child = node.build(instance); + childNodes.put(child.getQName(), child); } - instance.setChildNodes(childs); + instance.setChildNodes(childNodes); // USES - final Set uses = new HashSet<>(); for (UsesNodeBuilder builder : addedUsesNodes) { - uses.add(builder.build()); + usesNodes.add(builder.build(instance)); } - instance.setUses(uses); + instance.setUses(usesNodes); // UNKNOWN NODES - final List unknownNodes = new ArrayList<>(); for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); + unknownNodes.add(b.build(instance)); } Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); // AUGMENTATIONS - final Set augmentations = new HashSet<>(); - for (AugmentationSchemaBuilder builder : addedAugmentations) { - augmentations.add(builder.build()); + for (AugmentationSchemaBuilder builder : augmentationBuilders) { + augmentations.add(builder.build(instance)); } - instance.setAvailableAugmentations(augmentations); + instance.setAvailableAugmentations(new HashSet<>(augmentations)); isBuilt = true; } @@ -101,7 +100,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im @Override public void rebuild() { isBuilt = false; - build(); + build(parent); } @Override @@ -117,6 +116,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im @Override public void setPath(final SchemaPath schemaPath) { this.schemaPath = schemaPath; + instance.setPath(schemaPath); } public String getDescription() { @@ -168,15 +168,6 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im this.addedByUses = addedByUses; } - public Set getUsesNodes() { - return addedUsesNodes; - } - - @Override - public void addUsesNode(UsesNodeBuilder usesNodeBuilder) { - addedUsesNodes.add(usesNodeBuilder); - } - @Override public Set getTypeDefinitionBuilders() { return Collections.emptySet(); @@ -204,7 +195,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im @Override public void addAugmentation(AugmentationSchemaBuilder augment) { - addedAugmentations.add(augment); + augmentationBuilders.add(augment); } @Override @@ -234,11 +225,11 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im } else if (!schemaPath.equals(other.schemaPath)) { return false; } - if (parent == null) { - if (other.parent != null) { + if (parentBuilder == null) { + if (other.parentBuilder != null) { return false; } - } else if (!parent.equals(other.parent)) { + } else if (!parentBuilder.equals(other.parentBuilder)) { return false; } return true; @@ -252,6 +243,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im public final class ChoiceCaseNodeImpl implements ChoiceCaseNode { private final QName qname; private SchemaPath path; + private YangNode parent; private String description; private String reference; private Status status = Status.CURRENT; @@ -281,6 +273,15 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im this.path = path; } + @Override + public YangNode getParent() { + return parent; + } + + private void setParent(YangNode parent) { + this.parent = parent; + } + @Override public String getDescription() { return description; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ConstraintsBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ConstraintsBuilder.java index b1084e1659..4a95610b36 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ConstraintsBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ConstraintsBuilder.java @@ -9,20 +9,19 @@ package org.opendaylight.yangtools.yang.parser.builder.impl; import java.util.Collections; import java.util.HashSet; -import java.util.List; import java.util.Set; import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; import org.opendaylight.yangtools.yang.model.api.MustDefinition; import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl; -import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder; -import org.opendaylight.yangtools.yang.parser.util.YangParseException; -public final class ConstraintsBuilder extends AbstractBuilder { +public final class ConstraintsBuilder { private static final int HASH_IF_BOOL_TRUE = 1231; private static final int HASH_IF_BOOL_FALSE = 1237; + private final String moduleName; + private final int line; private final ConstraintDefinitionImpl instance; private final Set mustDefinitions; private String whenCondition; @@ -31,13 +30,15 @@ public final class ConstraintsBuilder extends AbstractBuilder { private Integer max; public ConstraintsBuilder(final String moduleName, final int line) { - super(moduleName, line); + this.moduleName = moduleName; + this.line = line; instance = new ConstraintDefinitionImpl(); mustDefinitions = new HashSet(); } ConstraintsBuilder(final ConstraintsBuilder b) { - super(b.getModuleName(), b.getLine()); + this.moduleName = b.getModuleName(); + this.line = b.getLine(); instance = new ConstraintDefinitionImpl(); mustDefinitions = new HashSet(b.getMustDefinitions()); whenCondition = b.getWhenCondition(); @@ -46,7 +47,6 @@ public final class ConstraintsBuilder extends AbstractBuilder { max = b.getMaxElements(); } - @Override public ConstraintDefinition build() { RevisionAwareXPath whenStmt; if (whenCondition == null) { @@ -62,14 +62,12 @@ public final class ConstraintsBuilder extends AbstractBuilder { return instance; } - @Override - public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) { - throw new YangParseException(moduleName, line, "Can not add unknown node to constraints."); + public String getModuleName() { + return moduleName; } - @Override - public List getUnknownNodeBuilders() { - return Collections.emptyList(); + public int getLine() { + return line; } public Integer getMinElements() { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java index 11aee5b62e..9aeabc07cd 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java @@ -13,8 +13,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; @@ -27,6 +25,7 @@ import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.UsesNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder; @@ -41,6 +40,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB AugmentationTargetBuilder, DataSchemaNodeBuilder { private boolean isBuilt; private final ContainerSchemaNodeImpl instance; + private YangNode parent; // SchemaNode args private SchemaPath schemaPath; @@ -52,14 +52,9 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB private boolean addedByUses; private Boolean configuration; private final ConstraintsBuilder constraints; - // DataNodeContainer args - private Set> typedefs; - private final Set addedTypedefs = new HashSet<>(); - private Set usesNodes; - private final Set addedUsesNodes = new HashSet<>(); // AugmentationTarget args - private Set augmentations; - private final Set addedAugmentations = new HashSet<>(); + private final List augmentations = new ArrayList<>(); + private final List augmentationBuilders = new ArrayList<>(); // ContainerSchemaNode args private boolean presence; @@ -72,8 +67,10 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB } @Override - public ContainerSchemaNode build() { + public ContainerSchemaNode build(YangNode parent) { if (!isBuilt) { + this.parent = parent; + instance.setParent(parent); instance.setPath(schemaPath); instance.setDescription(description); instance.setReference(reference); @@ -90,66 +87,44 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB instance.setConfiguration(configuration); // USES - if (usesNodes == null) { - usesNodes = new HashSet<>(); - for (UsesNodeBuilder builder : addedUsesNodes) { - usesNodes.add(builder.build()); - } + for (UsesNodeBuilder builder : addedUsesNodes) { + usesNodes.add(builder.build(instance)); } instance.setUses(usesNodes); // CHILD NODES - final Map childs = new TreeMap<>(Comparators.QNAME_COMP); - if (childNodes == null || childNodes.isEmpty()) { - for (DataSchemaNodeBuilder node : addedChildNodes) { - childs.put(node.getQName(), node.build()); - } - } else { - for (DataSchemaNode node : childNodes) { - childs.put(node.getQName(), node); - } + for (DataSchemaNodeBuilder node : addedChildNodes) { + DataSchemaNode child = node.build(instance); + childNodes.put(child.getQName(), node.build(instance)); } - instance.setChildNodes(childs); + instance.setChildNodes(childNodes); // GROUPINGS - if (groupings == null) { - groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - for (GroupingBuilder builder : addedGroupings) { - groupings.add(builder.build()); - } + for (GroupingBuilder builder : addedGroupings) { + groupings.add(builder.build(instance)); } instance.setGroupings(groupings); // TYPEDEFS - if (typedefs == null) { - typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - for (TypeDefinitionBuilder entry : addedTypedefs) { - typedefs.add(entry.build()); - } + for (TypeDefinitionBuilder entry : addedTypedefs) { + typedefs.add(entry.build(instance)); } instance.setTypeDefinitions(typedefs); // AUGMENTATIONS - if (augmentations == null) { - augmentations = new HashSet<>(); - for (AugmentationSchemaBuilder builder : addedAugmentations) { - augmentations.add(builder.build()); - } + for (AugmentationSchemaBuilder builder : augmentationBuilders) { + augmentations.add(builder.build(instance)); } - instance.setAvailableAugmentations(augmentations); + instance.setAvailableAugmentations(new HashSet<>(augmentations)); // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList<>(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(instance)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); instance.setConstraints(constraints.build()); - instance.setAvailableAugmentations(augmentations); isBuilt = true; } @@ -159,7 +134,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB @Override public void rebuild() { isBuilt = false; - build(); + build(parent); } @Override @@ -188,17 +163,18 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB this.typedefs = typedefs; } - public Set getAugmentations() { - return addedAugmentations; + public List getAugmentations() { + return augmentations; } - @Override - public void addAugmentation(AugmentationSchemaBuilder augment) { - addedAugmentations.add(augment); + public List getAugmentationBuilders() { + return augmentationBuilders; } - public void setAugmentations(final Set augmentations) { - this.augmentations = augmentations; + @Override + public void addAugmentation(AugmentationSchemaBuilder augment) { + augmentationBuilders.add(augment); + System.out.println(); } public SchemaPath getPath() { @@ -277,20 +253,6 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB return constraints; } - @Override - public Set getUsesNodes() { - return addedUsesNodes; - } - - @Override - public void addUsesNode(UsesNodeBuilder usesNodeBuilder) { - addedUsesNodes.add(usesNodeBuilder); - } - - public void setUsesnodes(final Set usesNodes) { - this.usesNodes = usesNodes; - } - public boolean isPresence() { return presence; } @@ -344,6 +306,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB public final class ContainerSchemaNodeImpl implements ContainerSchemaNode { private final QName qname; private SchemaPath path; + private YangNode parent; private String description; private String reference; private Status status = Status.CURRENT; @@ -377,6 +340,15 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB this.path = path; } + @Override + public YangNode getParent() { + return parent; + } + + private void setParent(YangNode parent) { + this.parent = parent; + } + @Override public String getDescription() { return description; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java index 6cef6238d5..af1f799891 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java @@ -15,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.Deviation; import org.opendaylight.yangtools.yang.model.api.Deviation.Deviate; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder; import org.opendaylight.yangtools.yang.parser.util.Comparators; import org.opendaylight.yangtools.yang.parser.util.ParserUtils; @@ -41,7 +42,7 @@ public final class DeviationBuilder extends AbstractBuilder { } @Override - public Deviation build() { + public Deviation build(YangNode parent) { if (targetPath == null) { throw new YangParseException(moduleName, line, "Unresolved deviation target"); } @@ -51,9 +52,8 @@ public final class DeviationBuilder extends AbstractBuilder { instance.setReference(reference); // UNKNOWN NODES - List unknownNodes = new ArrayList(); for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); + unknownNodes.add(b.build(instance)); } Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ExtensionBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ExtensionBuilder.java index f010d2ee1e..401d9d5ece 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ExtensionBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ExtensionBuilder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -16,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.Comparators; @@ -29,7 +29,7 @@ public final class ExtensionBuilder extends AbstractSchemaNodeBuilder { } @Override - public ExtensionDefinition build() { + public ExtensionDefinition build(YangNode parent) { if (!isBuilt) { instance.setPath(schemaPath); instance.setDescription(description); @@ -37,13 +37,10 @@ public final class ExtensionBuilder extends AbstractSchemaNodeBuilder { instance.setStatus(status); // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList(); - for (UnknownSchemaNodeBuilder un : addedUnknownNodes) { - unknownNodes.add(un.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder un : addedUnknownNodes) { + unknownNodes.add(un.build(null)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); isBuilt = true; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/FeatureBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/FeatureBuilder.java index 5a4da1edf0..b0d1fc4fb0 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/FeatureBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/FeatureBuilder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -16,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.FeatureDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.Comparators; @@ -29,7 +29,7 @@ public final class FeatureBuilder extends AbstractSchemaNodeBuilder { } @Override - public FeatureDefinitionImpl build() { + public FeatureDefinitionImpl build(YangNode parent) { if (!isBuilt) { instance.setPath(schemaPath); instance.setDescription(description); @@ -37,13 +37,10 @@ public final class FeatureBuilder extends AbstractSchemaNodeBuilder { instance.setStatus(status); // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(null)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); isBuilt = true; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java index ce15298122..c4f6a23ec6 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java @@ -7,13 +7,10 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; import java.util.TreeSet; import org.opendaylight.yangtools.yang.common.QName; @@ -24,6 +21,7 @@ import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.UsesNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder; @@ -41,20 +39,15 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder private Status status = Status.CURRENT; private boolean addedByUses; - private Set> typedefs; - private final Set addedTypedefs = new HashSet(); - - private Set usesNodes; - private final Set addedUsesNodes = new HashSet(); - public GroupingBuilderImpl(final String moduleName, final int line, final QName qname) { super(moduleName, line, qname); instance = new GroupingDefinitionImpl(qname); } @Override - public GroupingDefinition build() { + public GroupingDefinition build(YangNode parent) { if (!isBuilt) { + instance.setParent(parent); instance.setPath(schemaPath); instance.setDescription(description); instance.setReference(reference); @@ -62,53 +55,35 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder instance.setAddedByUses(addedByUses); // CHILD NODES - final Map childs = new TreeMap(Comparators.QNAME_COMP); - if (childNodes == null || childNodes.isEmpty()) { - for (DataSchemaNodeBuilder node : addedChildNodes) { - childs.put(node.getQName(), node.build()); - } - } else { - for (DataSchemaNode node : childNodes) { - childs.put(node.getQName(), node); - } + for (DataSchemaNodeBuilder node : addedChildNodes) { + DataSchemaNode child = node.build(instance); + childNodes.put(child.getQName(), child); } - instance.setChildNodes(childs); + instance.setChildNodes(childNodes); // GROUPINGS - if (groupings == null) { - groupings = new TreeSet(Comparators.SCHEMA_NODE_COMP); - for (GroupingBuilder builder : addedGroupings) { - groupings.add(builder.build()); - } + for (GroupingBuilder builder : addedGroupings) { + groupings.add(builder.build(instance)); } instance.setGroupings(groupings); // TYPEDEFS - if (typedefs == null) { - typedefs = new TreeSet>(Comparators.SCHEMA_NODE_COMP); - for (TypeDefinitionBuilder entry : addedTypedefs) { - typedefs.add(entry.build()); - } + for (TypeDefinitionBuilder entry : addedTypedefs) { + typedefs.add(entry.build(instance)); } instance.setTypeDefinitions(typedefs); // USES - if (usesNodes == null) { - usesNodes = new HashSet(); - for (UsesNodeBuilder builder : addedUsesNodes) { - usesNodes.add(builder.build()); - } + for (UsesNodeBuilder builder : addedUsesNodes) { + usesNodes.add(builder.build(instance)); } instance.setUses(usesNodes); // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(instance)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); isBuilt = true; @@ -192,20 +167,6 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder this.addedByUses = addedByUses; } - @Override - public Set getUsesNodes() { - return addedUsesNodes; - } - - @Override - public void addUsesNode(final UsesNodeBuilder usesBuilder) { - addedUsesNodes.add(usesBuilder); - } - - public void setUsesnodes(final Set usesNodes) { - this.usesNodes = usesNodes; - } - @Override public String toString() { return "grouping " + qname.getLocalName(); @@ -215,7 +176,7 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((parent == null) ? 0 : parent.hashCode()); + result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode()); result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode()); return result; } @@ -235,11 +196,11 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder return false; } final GroupingBuilderImpl other = (GroupingBuilderImpl) obj; - if (parent == null) { - if (other.parent != null) { + if (parentBuilder == null) { + if (other.parentBuilder != null) { return false; } - } else if (!parent.equals(other.parent)) { + } else if (!parentBuilder.equals(other.parentBuilder)) { return false; } if (schemaPath == null) { @@ -256,6 +217,7 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder private final class GroupingDefinitionImpl implements GroupingDefinition { private final QName qname; private SchemaPath path; + private YangNode parent; private String description; private String reference; private Status status; @@ -284,6 +246,15 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder this.path = path; } + @Override + public YangNode getParent() { + return parent; + } + + private void setParent(YangNode parent) { + this.parent = parent; + } + @Override public String getDescription() { return description; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java index 8bc76ebd28..81e17a63cd 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -18,8 +17,10 @@ import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.Comparators; +import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder { private boolean isBuilt; @@ -36,8 +37,11 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder { } @Override - public IdentitySchemaNode build() { + public IdentitySchemaNode build(YangNode parent) { if (!isBuilt) { + if (!(parentBuilder instanceof ModuleBuilder)) { + throw new YangParseException(moduleName, line, "Identity can be defined only under module (was" + parentBuilder + ")"); + } instance.setPath(schemaPath); instance.setDescription(description); instance.setReference(reference); @@ -46,7 +50,7 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder { if (baseIdentity == null) { if(baseIdentityBuilder != null) { baseIdentityBuilder.addDerivedIdentity(instance); - baseIdentity = baseIdentityBuilder.build(); + baseIdentity = baseIdentityBuilder.build(null); } } else { if(baseIdentity instanceof IdentitySchemaNodeImpl) { @@ -56,13 +60,10 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder { instance.setBaseIdentity(baseIdentity); // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList<>(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(null)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); isBuilt = true; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentityrefTypeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentityrefTypeBuilder.java index b8b77e20c8..617368f9c7 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentityrefTypeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentityrefTypeBuilder.java @@ -15,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; @@ -47,8 +48,8 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple } @Override - public IdentityrefType build() { - return new IdentityrefType(baseIdentity.build(), schemaPath); + public IdentityrefType build(YangNode parent) { + return new IdentityrefType(baseIdentity.build(parent), schemaPath); } public String getBaseString() { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java index ba305b1d92..87681178bf 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -18,6 +17,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractTypeAwareBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.Comparators; @@ -47,8 +47,9 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im } @Override - public LeafListSchemaNode build() { + public LeafListSchemaNode build(YangNode parent) { if (!isBuilt) { + instance.setParent(parent); instance.setConstraints(constraints.build()); instance.setPath(schemaPath); instance.setDescription(description); @@ -60,19 +61,16 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im instance.setUserOrdered(userOrdered); if (type == null) { - instance.setType(typedef.build()); + instance.setType(typedef.build(instance)); } else { instance.setType(type); } // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList<>(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(instance)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); isBuilt = true; @@ -197,11 +195,11 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im } else if (!schemaPath.equals(other.schemaPath)) { return false; } - if (parent == null) { - if (other.parent != null) { + if (parentBuilder == null) { + if (other.parentBuilder != null) { return false; } - } else if (!parent.equals(other.parent)) { + } else if (!parentBuilder.equals(other.parentBuilder)) { return false; } return true; @@ -215,6 +213,7 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im private final class LeafListSchemaNodeImpl implements LeafListSchemaNode { private final QName qname; private SchemaPath path; + private YangNode parent; private String description; private String reference; private Status status = Status.CURRENT; @@ -244,6 +243,15 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im this.path = path; } + @Override + public YangNode getParent() { + return parent; + } + + private void setParent(YangNode parent) { + this.parent = parent; + } + @Override public String getDescription() { return description; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java index ebbc48d56a..cc9d2d7c21 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -18,6 +17,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractTypeAwareBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.Comparators; @@ -48,8 +48,9 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem } @Override - public LeafSchemaNode build() { + public LeafSchemaNode build(YangNode parent) { if (!isBuilt) { + instance.setParent(parent); instance.setPath(schemaPath); instance.setConstraints(constraints.build()); instance.setDescription(description); @@ -67,19 +68,16 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem // TYPE if (type == null) { - instance.setType(typedef.build()); + instance.setType(typedef.build(instance)); } else { instance.setType(type); } // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList<>(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(instance)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); isBuilt = true; @@ -212,11 +210,11 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem } else if (!schemaPath.equals(other.schemaPath)) { return false; } - if (parent == null) { - if (other.parent != null) { + if (parentBuilder == null) { + if (other.parentBuilder != null) { return false; } - } else if (!parent.equals(other.parent)) { + } else if (!parentBuilder.equals(other.parentBuilder)) { return false; } return true; @@ -230,6 +228,7 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem private final class LeafSchemaNodeImpl implements LeafSchemaNode { private final QName qname; private SchemaPath path; + private YangNode parent; private String description; private String reference; private Status status = Status.CURRENT; @@ -260,6 +259,15 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem this.path = path; } + @Override + public YangNode getParent() { + return parent; + } + + private void setParent(YangNode parent) { + this.parent = parent; + } + @Override public String getDescription() { return description; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java index 47323f4cf0..072616c5bc 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java @@ -13,8 +13,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; @@ -27,6 +25,7 @@ import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.UsesNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder; @@ -41,6 +40,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde AugmentationTargetBuilder { private boolean isBuilt; private final ListSchemaNodeImpl instance; + private YangNode parent; // SchemaNode args private SchemaPath schemaPath; private String description; @@ -51,14 +51,9 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde private boolean addedByUses; private Boolean configuration; private final ConstraintsBuilder constraints; - // DataNodeContainer args - private Set> typedefs; - private final Set addedTypedefs = new HashSet<>(); - private Set usesNodes; - private final Set addedUsesNodes = new HashSet<>(); // AugmentationTarget args - private Set augmentations; - private final Set addedAugmentations = new HashSet<>(); + private final List augmentations = new ArrayList<>(); + private final List augmentationBuilders = new ArrayList<>(); // ListSchemaNode args private List keyDefinition = Collections.emptyList(); private boolean userOrdered; @@ -71,8 +66,10 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde } @Override - public ListSchemaNode build() { + public ListSchemaNode build(YangNode parent) { if (!isBuilt) { + this.parent = parent; + instance.setParent(parent); instance.setKeyDefinition(keyDefinition); instance.setPath(schemaPath); instance.setDescription(description); @@ -84,66 +81,44 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde instance.setUserOrdered(userOrdered); // CHILD NODES - final Map childs = new TreeMap<>(Comparators.QNAME_COMP); - if (childNodes == null || childNodes.isEmpty()) { - for (DataSchemaNodeBuilder node : addedChildNodes) { - childs.put(node.getQName(), node.build()); - } - } else { - for (DataSchemaNode node : childNodes) { - childs.put(node.getQName(), node); - } + for (DataSchemaNodeBuilder node : addedChildNodes) { + DataSchemaNode child = node.build(instance); + childNodes.put(child.getQName(), child); } - instance.setChildNodes(childs); + instance.setChildNodes(childNodes); // TYPEDEFS - if (typedefs == null) { - typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - for (TypeDefinitionBuilder entry : addedTypedefs) { - typedefs.add(entry.build()); - } + for (TypeDefinitionBuilder entry : addedTypedefs) { + typedefs.add(entry.build(instance)); } instance.setTypeDefinitions(typedefs); // USES - if (usesNodes == null) { - usesNodes = new HashSet<>(); - for (UsesNodeBuilder builder : addedUsesNodes) { - usesNodes.add(builder.build()); - } + for (UsesNodeBuilder builder : addedUsesNodes) { + usesNodes.add(builder.build(instance)); } instance.setUses(usesNodes); // GROUPINGS - if (groupings == null) { - groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - for (GroupingBuilder builder : addedGroupings) { - groupings.add(builder.build()); - } + for (GroupingBuilder builder : addedGroupings) { + groupings.add(builder.build(instance)); } instance.setGroupings(groupings); // AUGMENTATIONS - if (augmentations == null) { - augmentations = new HashSet<>(); - for (AugmentationSchemaBuilder builder : addedAugmentations) { - augmentations.add(builder.build()); - } + for (AugmentationSchemaBuilder builder : augmentationBuilders) { + augmentations.add(builder.build(instance)); } - instance.setAvailableAugmentations(augmentations); + instance.setAvailableAugmentations(new HashSet<>(augmentations)); // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList<>(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(instance)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); instance.setConstraints(constraints.build()); - instance.setAvailableAugmentations(augmentations); isBuilt = true; } @@ -153,7 +128,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde @Override public void rebuild() { isBuilt = false; - build(); + build(parent); } @Override @@ -225,30 +200,16 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde } @Override - public Set getUsesNodes() { - return addedUsesNodes; - } - - @Override - public void addUsesNode(final UsesNodeBuilder usesBuilder) { - addedUsesNodes.add(usesBuilder); - } - - public void setUsesnodes(final Set usesNodes) { - this.usesNodes = usesNodes; - } - - public Set getAugmentations() { - return addedAugmentations; + public void addAugmentation(AugmentationSchemaBuilder augment) { + augmentationBuilders.add(augment); } - @Override - public void addAugmentation(AugmentationSchemaBuilder augment) { - addedAugmentations.add(augment); + public List getAugmentations() { + return augmentations; } - public void setAugmentations(final Set augmentations) { - this.augmentations = augmentations; + public List getAugmentationBuilders() { + return augmentationBuilders; } public List getKeyDefinition() { @@ -329,11 +290,11 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde } else if (!schemaPath.equals(other.schemaPath)) { return false; } - if (parent == null) { - if (other.parent != null) { + if (parentBuilder == null) { + if (other.parentBuilder != null) { return false; } - } else if (!parent.equals(other.parent)) { + } else if (!parentBuilder.equals(other.parentBuilder)) { return false; } return true; @@ -347,6 +308,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde public final class ListSchemaNodeImpl implements ListSchemaNode { private final QName qname; private SchemaPath path; + private YangNode parent; private String description; private String reference; private Status status = Status.CURRENT; @@ -381,6 +343,15 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde this.path = path; } + @Override + public YangNode getParent() { + return parent; + } + + private void setParent(YangNode parent) { + this.parent = parent; + } + @Override public String getDescription() { return description; @@ -591,11 +562,11 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde @Override public String toString() { - StringBuilder sb = new StringBuilder(ListSchemaNodeImpl.class.getSimpleName()); + StringBuilder sb = new StringBuilder(); + sb.append("list "); + sb.append(qname.getLocalName()); sb.append("["); - sb.append("qname=" + qname); - sb.append(", path=" + path); - sb.append(", keyDefinition=" + keyDefinition); + sb.append(path); sb.append("]"); return sb.toString(); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java index fb9cf06831..a15d9db32f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java @@ -18,7 +18,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; import java.util.TreeSet; import org.opendaylight.yangtools.yang.common.QName; @@ -37,6 +36,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.UsesNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.Builder; @@ -70,17 +70,22 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { private final Set dirtyNodes = new HashSet(); private final Set imports = new HashSet(); - private final List addedAugments = new ArrayList(); + private final Set augments = new HashSet<>(); + private final List augmentBuilders = new ArrayList<>(); private final List allAugments = new ArrayList(); - private final Set addedUsesNodes = new HashSet(); private final List allUsesNodes = new ArrayList(); + private final Set rpcs = new TreeSet(Comparators.SCHEMA_NODE_COMP); private final Set addedRpcs = new HashSet(); + private final Set notifications = new TreeSet(Comparators.SCHEMA_NODE_COMP); private final Set addedNotifications = new HashSet(); + private final Set identities = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); private final Set addedIdentities = new HashSet(); - private final Set addedFeatures = new HashSet(); - private final Set addedDeviations = new HashSet(); - private final Set addedTypedefs = new HashSet(); - private final List addedExtensions = new ArrayList(); + private final Set features = new TreeSet(Comparators.SCHEMA_NODE_COMP); + private final Set addedFeatures = new HashSet<>(); + private final Set deviations = new HashSet<>(); + private final Set deviationBuilders = new HashSet<>(); + private final List extensions = new ArrayList<>(); + private final List addedExtensions = new ArrayList<>(); private final List allUnknownNodes = new ArrayList(); public ModuleBuilder(final String name) { @@ -91,100 +96,93 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { actualPath.push(this); } + public Module build() { + return build(null); + } + /** * Build new Module object based on this builder. */ @Override - public Module build() { + public Module build(YangNode parent) { instance.setPrefix(prefix); instance.setRevision(revision); instance.setImports(imports); instance.setNamespace(namespace); // TYPEDEFS - final Set> typedefs = new TreeSet>(Comparators.SCHEMA_NODE_COMP); for (TypeDefinitionBuilder tdb : addedTypedefs) { - typedefs.add(tdb.build()); + typedefs.add(tdb.build(instance)); } instance.setTypeDefinitions(typedefs); // CHILD NODES - final Map children = new TreeMap(Comparators.QNAME_COMP); for (DataSchemaNodeBuilder child : addedChildNodes) { - children.put(child.getQName(), child.build()); + DataSchemaNode childNode = child.build(instance); + childNodes.put(childNode.getQName(), childNode); } - instance.setChildNodes(children); + instance.setChildNodes(childNodes); // GROUPINGS - final Set groupings = new TreeSet(Comparators.SCHEMA_NODE_COMP); for (GroupingBuilder gb : addedGroupings) { - groupings.add(gb.build()); + groupings.add(gb.build(instance)); } instance.setGroupings(groupings); // USES - final Set usesDefinitions = new HashSet(); for (UsesNodeBuilder unb : addedUsesNodes) { - usesDefinitions.add(unb.build()); + usesNodes.add(unb.build(instance)); } - instance.setUses(usesDefinitions); + instance.setUses(usesNodes); // FEATURES - final Set features = new TreeSet(Comparators.SCHEMA_NODE_COMP); for (FeatureBuilder fb : addedFeatures) { - features.add(fb.build()); + features.add(fb.build(instance)); } instance.setFeatures(features); // NOTIFICATIONS - final Set notifications = new TreeSet( - Comparators.SCHEMA_NODE_COMP); for (NotificationBuilder entry : addedNotifications) { - notifications.add(entry.build()); + notifications.add(entry.build(instance)); } instance.setNotifications(notifications); // AUGMENTATIONS - final Set augmentations = new HashSet(); - for (AugmentationSchemaBuilder builder : addedAugments) { - augmentations.add(builder.build()); + for (AugmentationSchemaBuilder builder : augmentBuilders) { + augments.add(builder.build(instance)); } - instance.setAugmentations(augmentations); + instance.setAugmentations(augments); // RPCs - final Set rpcs = new TreeSet(Comparators.SCHEMA_NODE_COMP); for (RpcDefinitionBuilder rpc : addedRpcs) { - rpcs.add(rpc.build()); + rpcs.add(rpc.build(instance)); } instance.setRpcs(rpcs); // DEVIATIONS - final Set deviations = new HashSet(); - for (DeviationBuilder entry : addedDeviations) { - deviations.add(entry.build()); + for (DeviationBuilder entry : deviationBuilders) { + deviations.add(entry.build(instance)); } instance.setDeviations(deviations); // EXTENSIONS - final List extensions = new ArrayList(); for (ExtensionBuilder eb : addedExtensions) { - extensions.add(eb.build()); + extensions.add(eb.build(instance)); } Collections.sort(extensions, Comparators.SCHEMA_NODE_COMP); instance.setExtensionSchemaNodes(extensions); // IDENTITIES - final Set identities = new TreeSet(Comparators.SCHEMA_NODE_COMP); for (IdentitySchemaNodeBuilder id : addedIdentities) { - identities.add(id.build()); + identities.add(id.build(instance)); } instance.setIdentities(identities); // UNKNOWN NODES - final List unknownNodes = new ArrayList(); for (UnknownSchemaNodeBuilder unb : addedUnknownNodes) { - unknownNodes.add(unb.build()); + unknownNodes.add(unb.build(instance)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); return instance; @@ -258,7 +256,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public Set getDeviations() { - return addedDeviations; + return deviationBuilders; } public List getExtensions() { @@ -332,6 +330,11 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public ExtensionBuilder addExtension(final QName qname, final int line) { + Builder parent = getActualNode(); + if (!(parent.equals(this))) { + throw new YangParseException(name, line, "extension can be defined only in module or submodule"); + } + final String extName = qname.getLocalName(); for (ExtensionBuilder addedExtension : addedExtensions) { if (addedExtension.getQName().getLocalName().equals(extName)) { @@ -339,6 +342,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } } final ExtensionBuilder builder = new ExtensionBuilder(name, line, qname); + builder.setParent(parent); addedExtensions.add(builder); return builder; } @@ -430,7 +434,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { if (parent.equals(this)) { // augment can be declared only under 'module' ... - addedAugments.add(builder); + augmentBuilders.add(builder); } else { // ... or 'uses' statement if (parent instanceof UsesNodeBuilder) { @@ -449,11 +453,6 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return builder; } - @Override - public Set getUsesNodes() { - return addedUsesNodes; - } - @Override public void addUsesNode(UsesNodeBuilder usesBuilder) { addedUsesNodes.add(usesBuilder); @@ -549,6 +548,10 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return outputBuilder; } + public void addNotification(NotificationDefinition notification) { + notifications.add(notification); + } + public NotificationBuilder addNotification(final int line, final QName qname) { final Builder parent = getActualNode(); if (!(parent.equals(this))) { @@ -737,7 +740,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { final DeviationBuilder builder = new DeviationBuilder(name, line, targetPath); builder.setParent(parent); - addedDeviations.add(builder); + deviationBuilders.add(builder); return builder; } @@ -830,6 +833,11 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { this.name = name; } + @Override + public YangNode getParent() { + return null; + } + @Override public URI getNamespace() { return namespace; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java index 371d9c5401..107c0be0c7 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java @@ -13,8 +13,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; @@ -26,6 +24,7 @@ import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.UsesNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder; @@ -35,19 +34,19 @@ import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.Comparators; +import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class NotificationBuilder extends AbstractDataNodeContainerBuilder implements SchemaNodeBuilder, AugmentationTargetBuilder { private boolean isBuilt; private final NotificationDefinitionImpl instance; + private YangNode parent; private SchemaPath schemaPath; private String description; private String reference; private Status status = Status.CURRENT; - private final Set addedTypedefs = new HashSet(); - private final Set addedUsesNodes = new HashSet(); - private Set augmentations; - private final Set addedAugmentations = new HashSet(); + private final List augmentations = new ArrayList<>(); + private final List augmentationBuilders = new ArrayList<>(); NotificationBuilder(final String moduleName, final int line, final QName qname) { super(moduleName, line, qname); @@ -55,54 +54,52 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder } @Override - public NotificationDefinition build() { + public NotificationDefinition build(YangNode parent) { + if (!(parentBuilder instanceof ModuleBuilder)) { + throw new YangParseException(moduleName, line, "Notification can be defined only under module (was " + parentBuilder + ")"); + } if (!isBuilt) { + this.parent = parent; + instance.setParent(parent); instance.setPath(schemaPath); instance.setDescription(description); instance.setReference(reference); instance.setStatus(status); // CHILD NODES - final Map childs = new TreeMap(Comparators.QNAME_COMP); for (DataSchemaNodeBuilder node : addedChildNodes) { - childs.put(node.getQName(), node.build()); + DataSchemaNode child = node.build(instance); + childNodes.put(child.getQName(), child); } - instance.setChildNodes(childs); + instance.setChildNodes(childNodes); // GROUPINGS - final Set groupingDefs = new TreeSet(Comparators.SCHEMA_NODE_COMP); for (GroupingBuilder builder : addedGroupings) { - groupingDefs.add(builder.build()); + groupings.add(builder.build(instance)); } - instance.setGroupings(groupingDefs); + instance.setGroupings(groupings); // TYPEDEFS - final Set> typedefs = new TreeSet>(Comparators.SCHEMA_NODE_COMP); for (TypeDefinitionBuilder entry : addedTypedefs) { - typedefs.add(entry.build()); + typedefs.add(entry.build(instance)); } instance.setTypeDefinitions(typedefs); // USES - final Set uses = new HashSet(); for (UsesNodeBuilder builder : addedUsesNodes) { - uses.add(builder.build()); + usesNodes.add(builder.build(instance)); } - instance.setUses(uses); + instance.setUses(usesNodes); // AUGMENTATIONS - if (augmentations == null) { - augmentations = new HashSet(); - for (AugmentationSchemaBuilder builder : addedAugmentations) { - augmentations.add(builder.build()); - } + for (AugmentationSchemaBuilder builder : augmentationBuilders) { + augmentations.add(builder.build(instance)); } - instance.setAvailableAugmentations(augmentations); + instance.setAvailableAugmentations(new HashSet<>(augmentations)); // UNKNOWN NODES - final List unknownNodes = new ArrayList(); for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); + unknownNodes.add(b.build(instance)); } Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); @@ -116,7 +113,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder @Override public void rebuild() { isBuilt = false; - build(); + build(parent); } @Override @@ -129,16 +126,6 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder addedTypedefs.add(type); } - @Override - public Set getUsesNodes() { - return addedUsesNodes; - } - - @Override - public void addUsesNode(final UsesNodeBuilder usesNodeBuilder) { - addedUsesNodes.add(usesNodeBuilder); - } - @Override public SchemaPath getPath() { return schemaPath; @@ -181,17 +168,9 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder } } - public Set getAugmentations() { - return addedAugmentations; - } - @Override public void addAugmentation(AugmentationSchemaBuilder augment) { - addedAugmentations.add(augment); - } - - public void setAugmentations(final Set augmentations) { - this.augmentations = augmentations; + augmentationBuilders.add(augment); } @Override @@ -202,6 +181,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder public final class NotificationDefinitionImpl implements NotificationDefinition { private final QName qname; private SchemaPath path; + private YangNode parent; private String description; private String reference; private Status status = Status.CURRENT; @@ -230,6 +210,15 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder this.path = path; } + @Override + public YangNode getParent() { + return parent; + } + + private void setParent(YangNode parent) { + this.parent = parent; + } + @Override public String getDescription() { return description; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/RpcDefinitionBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/RpcDefinitionBuilder.java index b9a43a8386..1c839a9320 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/RpcDefinitionBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/RpcDefinitionBuilder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -17,23 +16,28 @@ import java.util.TreeSet; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; +import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.yangtools.yang.parser.util.Comparators; +import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder { private boolean isBuilt; private final RpcDefinitionImpl instance; private ContainerSchemaNodeBuilder inputBuilder; private ContainerSchemaNodeBuilder outputBuilder; - private final Set addedTypedefs = new HashSet(); - private final Set addedGroupings = new HashSet(); + private final Set> typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); + private final Set addedTypedefs = new HashSet<>(); + private final Set groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); + private final Set addedGroupings = new HashSet<>(); public ContainerSchemaNodeBuilder getInput() { return inputBuilder; @@ -49,41 +53,39 @@ public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder { } @Override - public RpcDefinition build() { + public RpcDefinition build(YangNode parent) { + if (!(parent instanceof Module)) { + throw new YangParseException(moduleName, line, "Rpc can be defined only under module"); + } if (!isBuilt) { instance.setDescription(description); instance.setReference(reference); instance.setStatus(status); - final ContainerSchemaNode input = inputBuilder == null ? null : inputBuilder.build(); - final ContainerSchemaNode output = outputBuilder == null ? null : outputBuilder.build(); + final ContainerSchemaNode input = inputBuilder == null ? null : inputBuilder.build(instance); + final ContainerSchemaNode output = outputBuilder == null ? null : outputBuilder.build(instance); instance.setInput(input); instance.setOutput(output); instance.setPath(schemaPath); // TYPEDEFS - final Set> typedefs = new TreeSet>(Comparators.SCHEMA_NODE_COMP); for (TypeDefinitionBuilder entry : addedTypedefs) { - typedefs.add(entry.build()); + typedefs.add(entry.build(instance)); } instance.setTypeDefinitions(typedefs); // GROUPINGS - final Set groupings = new TreeSet(Comparators.SCHEMA_NODE_COMP); for (GroupingBuilder entry : addedGroupings) { - groupings.add(entry.build()); + groupings.add(entry.build(instance)); } instance.setGroupings(groupings); // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(instance)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); isBuilt = true; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java index b2f2c16de6..289d095854 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -16,12 +15,12 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; import org.opendaylight.yangtools.yang.model.util.ExtendedType; import org.opendaylight.yangtools.yang.model.util.UnknownType; -import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractTypeAwareBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.yangtools.yang.parser.util.Comparators; @@ -46,14 +45,14 @@ public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder im } @Override - public TypeDefinition> build() { + public TypeDefinition> build(YangNode parent) { TypeDefinition result = null; ExtendedType.Builder typeBuilder = null; if ((type == null || type instanceof UnknownType) && typedef == null) { throw new YangParseException("Unresolved type: '" + qname.getLocalName() + "'."); } if (type == null || type instanceof UnknownType) { - type = typedef.build(); + type = typedef.build(parent); } typeBuilder = new ExtendedType.Builder(qname, type, description, reference, schemaPath); @@ -69,13 +68,10 @@ public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder im typeBuilder.fractionDigits(fractionDigits); // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(null)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); typeBuilder.unknownSchemaNodes(unknownNodes); result = typeBuilder.build(); return result; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java index 4e913c460f..8c965eaa8a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java @@ -16,6 +16,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; @@ -80,11 +81,11 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements } @Override - public UnionType build() { + public UnionType build(YangNode parent) { if (!isBuilt) { instance = new UnionType(types); for (TypeDefinitionBuilder tdb : typedefs) { - types.add(tdb.build()); + types.add(tdb.build(null)); } isBuilt = true; } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java index 64e35abed8..452660a55e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -16,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.Comparators; @@ -89,7 +89,7 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder { } @Override - public UnknownSchemaNode build() { + public UnknownSchemaNode build(YangNode parent) { if (!isBuilt) { instance.setPath(schemaPath); instance.setNodeType(nodeType); @@ -104,18 +104,15 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder { instance.setExtensionDefinition(extensionDefinition); } else { if (extensionBuilder != null) { - instance.setExtensionDefinition(extensionBuilder.build()); + instance.setExtensionDefinition(extensionBuilder.build(null)); } } // UNKNOWN NODES - if (unknownNodes == null) { - unknownNodes = new ArrayList(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build(null)); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); instance.setUnknownSchemaNodes(unknownNodes); isBuilt = true; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java index 625da75fda..3ca8bd5f0e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java @@ -21,6 +21,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.UsesNode; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.Builder; @@ -36,7 +37,7 @@ import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNodeBuilder { private boolean isBuilt; private UsesNodeImpl instance; - private DataNodeContainerBuilder parent; + private DataNodeContainerBuilder parentBuilder; private final String groupingName; private SchemaPath groupingPath; private GroupingDefinition groupingDefinition; @@ -44,6 +45,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo private boolean addedByUses; private boolean augmenting; private AugmentationSchemaBuilder parentAugment; + private final Set augments = new HashSet<>(); private final Set addedAugments = new HashSet<>(); private final List refineBuilders = new ArrayList<>(); private final List refines = new ArrayList<>(); @@ -99,30 +101,29 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo } @Override - public UsesNode build() { + public UsesNode build(YangNode parent) { if (!isBuilt) { instance = new UsesNodeImpl(groupingPath); instance.setAddedByUses(addedByUses); + instance.setParent(parent); // AUGMENTATIONS - final Set augments = new HashSet<>(); for (AugmentationSchemaBuilder builder : addedAugments) { - augments.add(builder.build()); + augments.add(builder.build(instance)); } instance.setAugmentations(augments); // REFINES final Map refineNodes = new HashMap<>(); for (SchemaNodeBuilder refineBuilder : refineBuilders) { - SchemaNode refineNode = refineBuilder.build(); + SchemaNode refineNode = refineBuilder.build(instance); refineNodes.put(refineNode.getPath(), refineNode); } instance.setRefines(refineNodes); // UNKNOWN NODES - List unknownNodes = new ArrayList<>(); for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); + unknownNodes.add(b.build(instance)); } instance.setUnknownSchemaNodes(unknownNodes); @@ -134,7 +135,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo @Override public DataNodeContainerBuilder getParent() { - return parent; + return parentBuilder; } @Override @@ -143,7 +144,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo throw new YangParseException(moduleName, line, "Parent of 'uses' has to be instance of DataNodeContainerBuilder, but was: '" + parent + "'."); } - this.parent = (DataNodeContainerBuilder) parent; + this.parentBuilder = (DataNodeContainerBuilder) parent; } @Override @@ -267,7 +268,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo final int prime = 31; int result = 1; result = prime * result + ((groupingName == null) ? 0 : groupingName.hashCode()); - result = prime * result + ((parent == null) ? 0 : parent.hashCode()); + result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode()); return result; } @@ -290,11 +291,11 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo } else if (!groupingName.equals(other.groupingName)) { return false; } - if (parent == null) { - if (other.parent != null) { + if (parentBuilder == null) { + if (other.parentBuilder != null) { return false; } - } else if (!parent.equals(other.parent)) { + } else if (!parentBuilder.equals(other.parentBuilder)) { return false; } return true; @@ -306,12 +307,22 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo } public final class UsesNodeImpl implements UsesNode { + private YangNode parent; private final SchemaPath groupingPath; private Set augmentations = Collections.emptySet(); private boolean addedByUses; private Map refines = Collections.emptyMap(); private List unknownNodes = Collections.emptyList(); + @Override + public YangNode getParent() { + return parent; + } + + private void setParent(YangNode parent) { + this.parent = parent; + } + private UsesNodeImpl(final SchemaPath groupingPath) { this.groupingPath = groupingPath; } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java index 38b282de69..4a3701d45f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java @@ -29,7 +29,6 @@ import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; -import com.google.common.base.Preconditions; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; @@ -70,6 +69,7 @@ import org.opendaylight.yangtools.yang.validator.YangModelBasicValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -456,7 +456,7 @@ public final class YangParserImpl implements YangModelParser { throw new YangParseException(module.getName(), idref.getLine(), "Failed to find base identity"); } idref.setBaseIdentity(identity); - nodeToResolve.setType(idref.build()); + nodeToResolve.setType(idref.build(null)); } else { resolveType(nodeToResolve, modules, module); } @@ -478,7 +478,7 @@ public final class YangParserImpl implements YangModelParser { IdentitySchemaNodeBuilder identity = findBaseIdentity(modules, module, idref.getBaseString(), idref.getLine()); idref.setBaseIdentity(identity); - nodeToResolve.setType(idref.build()); + nodeToResolve.setType(idref.build(null)); } else { resolveTypeWithContext(nodeToResolve, modules, module, context); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java index d9858bc3cc..2a3683d1fe 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java @@ -61,7 +61,7 @@ public final class CopyUtils { /** * Create copy of DataSchemaNodeBuilder with new parent. If updateQName is * true, qname of node will be corrected based on new parent. - * + * * @param old * builder to copy * @param newParent @@ -132,7 +132,7 @@ public final class CopyUtils { for (ChoiceCaseBuilder childNode : old.getCases()) { copy.addCase(copy(childNode, copy, updateQName)); } - for (AugmentationSchemaBuilder augment : old.getAugmentations()) { + for (AugmentationSchemaBuilder augment : old.getAugmentationBuilders()) { copy.addAugmentation(copyAugment(augment, copy)); } for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) { @@ -194,7 +194,6 @@ public final class CopyUtils { copy.setAugmenting(old.isAugmenting()); copy.setAddedByUses(old.isAddedByUses()); copy.setConfiguration(old.isConfiguration()); - copy.setChildNodes(old.getChildNodes()); for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) { copy.addChildNode(copy(childNode, copy, updateQName)); } @@ -208,7 +207,7 @@ public final class CopyUtils { for (UsesNodeBuilder oldUses : old.getUsesNodes()) { copy.addUsesNode(copyUses(oldUses, copy)); } - for (AugmentationSchemaBuilder augment : old.getAugmentations()) { + for (AugmentationSchemaBuilder augment : old.getAugmentationBuilders()) { copy.addAugmentation(copyAugment(augment, copy)); } for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) { @@ -297,7 +296,6 @@ public final class CopyUtils { copy.setAugmenting(old.isAugmenting()); copy.setAddedByUses(old.isAddedByUses()); copy.setConfiguration(old.isConfiguration()); - copy.setChildNodes(old.getChildNodes()); for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) { copy.addChildNode(copy(childNode, copy, updateQName)); } @@ -311,7 +309,7 @@ public final class CopyUtils { for (UsesNodeBuilder oldUses : old.getUsesNodes()) { copy.addUsesNode(copyUses(oldUses, copy)); } - for (AugmentationSchemaBuilder augment : old.getAugmentations()) { + for (AugmentationSchemaBuilder augment : old.getAugmentationBuilders()) { copy.addAugmentation(copyAugment(augment, copy)); } for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) { @@ -336,7 +334,6 @@ public final class CopyUtils { copy.setReference(old.getReference()); copy.setStatus(old.getStatus()); copy.setAddedByUses(old.isAddedByUses()); - copy.setChildNodes(old.getChildNodes()); for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) { copy.addChildNode(copy(childNode, copy, updateQName)); } @@ -476,7 +473,6 @@ public final class CopyUtils { copy.setReference(old.getReference()); copy.setStatus(old.getStatus()); copy.addWhenCondition(old.getWhenCondition()); - copy.setChildNodes(old.getChildNodes()); copy.setTargetNodeSchemaPath(old.getTargetNodeSchemaPath()); for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) { copy.addChildNode(copy(childNode, copy, false)); @@ -570,7 +566,7 @@ public final class CopyUtils { /** * Create AnyXmlBuilder from given AnyXmlSchemaNode. - * + * * @param anyxml * base anyxml * @param qname @@ -591,7 +587,7 @@ public final class CopyUtils { /** * Create GroupingBuilder from given GroupingDefinition. - * + * * @param grouping * base grouping * @param qname @@ -605,7 +601,9 @@ public final class CopyUtils { public static GroupingBuilder createGrouping(GroupingDefinition grouping, QName qname, String moduleName, int line) { final GroupingBuilderImpl builder = new GroupingBuilderImpl(moduleName, line, qname); builder.setPath(grouping.getPath()); - builder.setChildNodes(grouping.getChildNodes()); + for (DataSchemaNode child : grouping.getChildNodes()) { + builder.addChildNode(child); + } builder.setGroupings(grouping.getGroupings()); builder.setTypedefs(grouping.getTypeDefinitions()); builder.setUsesnodes(grouping.getUses()); @@ -618,7 +616,7 @@ public final class CopyUtils { /** * Create TypeDefinitionBuilder from given ExtendedType. - * + * * @param typedef * base typedef * @param qname @@ -650,7 +648,7 @@ public final class CopyUtils { /** * Create UnknownSchemaNodeBuilder from given UnknownSchemaNode. - * + * * @param unknownNode * base unknown node * @param qname @@ -677,7 +675,7 @@ public final class CopyUtils { /** * Create LeafSchemaNodeBuilder from given LeafSchemaNode. - * + * * @param leaf * leaf from which to create builder * @param qname @@ -703,7 +701,7 @@ public final class CopyUtils { /** * Create ContainerSchemaNodeBuilder from given ContainerSchemaNode. - * + * * @param container * base container * @param qname @@ -721,10 +719,12 @@ public final class CopyUtils { convertDataSchemaNode(container, builder); builder.setConfiguration(container.isConfiguration()); builder.setUnknownNodes(container.getUnknownSchemaNodes()); - builder.setChildNodes(container.getChildNodes()); + for (DataSchemaNode child : container.getChildNodes()) { + builder.addChildNode(child); + } builder.setGroupings(container.getGroupings()); builder.setTypedefs(container.getTypeDefinitions()); - builder.setAugmentations(container.getAvailableAugmentations()); + builder.getAugmentations().addAll(container.getAvailableAugmentations()); builder.setUsesnodes(container.getUses()); builder.setPresence(container.isPresenceContainer()); return builder; @@ -732,7 +732,7 @@ public final class CopyUtils { /** * Create ListSchemaNodeBuilder from given ListSchemaNode. - * + * * @param list * base list * @param qname @@ -749,9 +749,11 @@ public final class CopyUtils { builder.setConfiguration(list.isConfiguration()); builder.setUnknownNodes(list.getUnknownSchemaNodes()); builder.setTypedefs(list.getTypeDefinitions()); - builder.setChildNodes(list.getChildNodes()); + for (DataSchemaNode child : list.getChildNodes()) { + builder.addChildNode(child); + } builder.setGroupings(list.getGroupings()); - builder.setAugmentations(list.getAvailableAugmentations()); + builder.getAugmentations().addAll(list.getAvailableAugmentations()); builder.setUsesnodes(list.getUses()); builder.setUserOrdered(builder.isUserOrdered()); return builder; @@ -759,7 +761,7 @@ public final class CopyUtils { /** * Create LeafListSchemaNodeBuilder from given LeafListSchemaNode. - * + * * @param leafList * base leaf-list * @param qname @@ -784,7 +786,7 @@ public final class CopyUtils { /** * Create ChoiceBuilder from given ChoiceNode. - * + * * @param choice * base choice * @param qname @@ -807,7 +809,7 @@ public final class CopyUtils { /** * Set DataSchemaNode arguments to builder object - * + * * @param node * node from which arguments should be read * @param builder @@ -824,7 +826,7 @@ public final class CopyUtils { /** * Copy constraints from constraints definition to constraints builder. - * + * * @param nodeConstraints * definition from which constraints will be copied * @param constraints diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/GroupingUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/GroupingUtils.java index 9d5b90eb00..7faef14300 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/GroupingUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/GroupingUtils.java @@ -192,6 +192,20 @@ public final class GroupingUtils { return null; } + private static void setNodeAugmenting(DataSchemaNodeBuilder node) { + node.setAugmenting(true); + if (node instanceof DataNodeContainerBuilder) { + for (DataSchemaNodeBuilder child : ((DataNodeContainerBuilder)node).getChildNodeBuilders()) { + setNodeAugmenting(child); + } + } + if (node instanceof ChoiceBuilder) { + for (ChoiceCaseBuilder child : ((ChoiceBuilder)node).getCases()) { + setNodeAugmenting(child); + } + } + } + /** * Add nodes defined in uses target grouping to uses parent. * @@ -215,7 +229,8 @@ public final class GroupingUtils { setAddedByUsesToNode(child); if (usesNode.isAugmenting()) { - child.setAugmenting(true); + //child.setAugmenting(true); + setNodeAugmenting(child); } if (usesNode.isAugmenting() && !(usesNode.getParentAugment().getParent() instanceof UsesNodeBuilder)) { AugmentationSchemaBuilder parentAugment = usesNode.getParentAugment(); @@ -327,7 +342,7 @@ public final class GroupingUtils { } if (!exists) { DataSchemaNodeBuilder copy = CopyUtils.copy(childNode, parent, true); - setAddedByUsesToNode((GroupingMember) copy); + setAddedByUsesToNode(copy); collection.add(copy); } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.xtend b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.xtend index 124f8c7013..dbd78e582a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.xtend +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.xtend @@ -218,6 +218,7 @@ public final class ParserUtils { } for (UsesNodeBuilder usesNode : augment.getUsesNodes()) { val copy = CopyUtils.copyUses(usesNode, target); + copy.setAugmenting(true); target.addUsesNode(copy); } } @@ -392,7 +393,7 @@ public final class ParserUtils { } public static def getRpc(ModuleBuilder module,String name) { - for(rpc : module.rpcs) { + for(rpc : module.getRpcs()) { if(name == rpc.QName.localName) { return rpc; } @@ -401,7 +402,7 @@ public final class ParserUtils { } public static def getNotification(ModuleBuilder module,String name) { - for(notification : module.notifications) { + for(notification : module.getNotifications()) { if(name == notification.QName.localName) { return notification; } @@ -668,5 +669,6 @@ public final class ParserUtils { } return parent as ModuleBuilder; } - } - \ No newline at end of file + +} + diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/RefineHolder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/RefineHolder.java index 40d47dddd7..f9372d8686 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/RefineHolder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/RefineHolder.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.parser.util; import org.opendaylight.yangtools.yang.model.api.MustDefinition; +import org.opendaylight.yangtools.yang.model.api.YangNode; import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder; public final class RefineHolder extends AbstractBuilder { @@ -104,7 +105,7 @@ public final class RefineHolder extends AbstractBuilder { } @Override - public Object build() { + public Object build(YangNode parent) { return null; } @@ -121,7 +122,7 @@ public final class RefineHolder extends AbstractBuilder { result = prime * result + ((minElements == null) ? 0 : minElements.hashCode()); result = prime * result + ((must == null) ? 0 : must.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((parent == null) ? 0 : parent.hashCode()); + result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode()); result = prime * result + ((presence == null) ? 0 : presence.hashCode()); result = prime * result + ((reference == null) ? 0 : reference.hashCode()); return result; @@ -202,11 +203,11 @@ public final class RefineHolder extends AbstractBuilder { } else if (!name.equals(other.name)) { return false; } - if (parent == null) { - if (other.parent != null) { + if (parentBuilder == null) { + if (other.parentBuilder != null) { return false; } - } else if (!parent.equals(other.parent)) { + } else if (!parentBuilder.equals(other.parentBuilder)) { return false; } if (presence == null) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/RefineUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/RefineUtils.java index b499fdbce4..f3f2def8fe 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/RefineUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/RefineUtils.java @@ -50,6 +50,7 @@ public final class RefineUtils { } if (unknownNodes != null) { for (UnknownSchemaNodeBuilder unknown : unknownNodes) { + unknown.setParent(leaf); leaf.addUnknownNodeBuilder(unknown); } } @@ -68,6 +69,7 @@ public final class RefineUtils { } if (unknownNodes != null) { for (UnknownSchemaNodeBuilder unknown : unknownNodes) { + unknown.setParent(container); container.addUnknownNodeBuilder(unknown); } } @@ -90,6 +92,7 @@ public final class RefineUtils { } if (unknownNodes != null) { for (UnknownSchemaNodeBuilder unknown : unknownNodes) { + unknown.setParent(list); list.addUnknownNodeBuilder(unknown); } } @@ -112,6 +115,7 @@ public final class RefineUtils { } if (unknownNodes != null) { for (UnknownSchemaNodeBuilder unknown : unknownNodes) { + unknown.setParent(leafList); leafList.addUnknownNodeBuilder(unknown); } } @@ -130,6 +134,7 @@ public final class RefineUtils { } if (unknownNodes != null) { for (UnknownSchemaNodeBuilder unknown : unknownNodes) { + unknown.setParent(choice); choice.addUnknownNodeBuilder(unknown); } } @@ -148,6 +153,7 @@ public final class RefineUtils { } if (unknownNodes != null) { for (UnknownSchemaNodeBuilder unknown : unknownNodes) { + unknown.setParent(anyXml); anyXml.addUnknownNodeBuilder(unknown); } } @@ -155,7 +161,7 @@ public final class RefineUtils { /** * Check if refine can be performed on given node. - * + * * @param node * node to refine * @param refine @@ -245,9 +251,9 @@ public final class RefineUtils { *
  • reference
  • *
  • config
  • * - * + * * These parameters may be refined for any node. - * + * * @param node * node to refine * @param refine @@ -291,7 +297,7 @@ public final class RefineUtils { /** * Perform refine operation on given node. - * + * * @param nodeToRefine * builder of node to refine * @param refine diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/GroupingTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/GroupingTest.java index 0f2d1537f5..44cb0d635d 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/GroupingTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/GroupingTest.java @@ -86,6 +86,7 @@ public class GroupingTest { assertEquals(1, leafMustConstraints.size()); MustDefinition leafMust = leafMustConstraints.iterator().next(); assertEquals("\"ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)\"", leafMust.toString()); + assertEquals(1, refineLeaf.getUnknownSchemaNodes().size()); // container port assertNotNull(refineContainer); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/TypesResolutionTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/TypesResolutionTest.java index 9a88a86713..d471d85dbc 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/TypesResolutionTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/TypesResolutionTest.java @@ -161,6 +161,7 @@ public class TypesResolutionTest { LeafSchemaNode leaf = (LeafSchemaNode) tested.getDataChildByName("inst-id-leaf1"); InstanceIdentifier leafType = (InstanceIdentifier) leaf.getType(); assertFalse(leafType.requireInstance()); + assertEquals(1, leaf.getUnknownSchemaNodes().size()); } @Test @@ -178,11 +179,14 @@ public class TypesResolutionTest { assertEquals(5, identities.size()); IdentitySchemaNode cryptoAlg = null; IdentitySchemaNode cryptoBase = null; + IdentitySchemaNode cryptoId = null; for (IdentitySchemaNode id : identities) { if (id.getQName().getLocalName().equals("crypto-alg")) { cryptoAlg = id; } else if ("crypto-base".equals(id.getQName().getLocalName())) { cryptoBase = id; + } else if ("crypto-id".equals(id.getQName().getLocalName())) { + cryptoId = id; } } assertNotNull(cryptoAlg); @@ -194,6 +198,9 @@ public class TypesResolutionTest { assertNotNull(cryptoBase); assertNull(cryptoBase.getBaseIdentity()); assertEquals(3, cryptoBase.getDerivedIdentities().size()); + + assertNotNull(cryptoId); + assertEquals(1, cryptoId.getUnknownSchemaNodes().size()); } @Test diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java index 4662edc11e..0d0ddb47bb 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.parser.impl; import static org.junit.Assert.*; -import static org.junit.Assert.assertEquals; import java.io.File; import java.io.FileNotFoundException; diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/util/BitImplTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/util/BitImplTest.java index d523a2eb77..c93b51c0fd 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/util/BitImplTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/util/BitImplTest.java @@ -13,6 +13,7 @@ import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder; public class BitImplTest { @@ -104,7 +105,10 @@ public class BitImplTest { List unknownNodes = new ArrayList<>(); UnknownSchemaNodeBuilder usnb = new UnknownSchemaNodeBuilder("module", 3, qnameB); - unknownNodes.add(usnb.build()); + ModuleBuilder parent = org.mockito.Mockito.mock(ModuleBuilder.class); + usnb.setParent(parent); + + unknownNodes.add(usnb.build(null)); biA = new BitImpl(55L, qnameA, schemaPathA, "description", "reference", Status.CURRENT, unknownNodes); diff --git a/yang/yang-parser-impl/src/test/resources/model/foo.yang b/yang/yang-parser-impl/src/test/resources/model/foo.yang index 126a977281..0769f4231c 100644 --- a/yang/yang-parser-impl/src/test/resources/model/foo.yang +++ b/yang/yang-parser-impl/src/test/resources/model/foo.yang @@ -173,6 +173,7 @@ module foo { "(ifType = 'ethernet' and ifMTU = 1500)" { error-message "An ethernet MTU must be 1500"; } + mountpoint "mnt-extension"; } refine port { description "description of port defined by refine"; @@ -194,4 +195,11 @@ module foo { } } + extension mountpoint { + description "enter point"; + argument "name" { + yin-element "true"; + } + } + } diff --git a/yang/yang-parser-impl/src/test/resources/types/custom-types-test@2012-4-4.yang b/yang/yang-parser-impl/src/test/resources/types/custom-types-test@2012-4-4.yang index 050d5c0de9..befe0629b7 100644 --- a/yang/yang-parser-impl/src/test/resources/types/custom-types-test@2012-4-4.yang +++ b/yang/yang-parser-impl/src/test/resources/types/custom-types-test@2012-4-4.yang @@ -52,8 +52,9 @@ module custom-types-test { leaf inst-id-leaf1 { type instance-identifier { - require-instance false; + require-instance false; } + iit:mountpoint "mnt-extension"; } leaf inst-id-leaf2 { @@ -67,6 +68,7 @@ module custom-types-test { identity crypto-id { base "crypto-base"; description "crypto-id description"; + iit:mountpoint "mnt-extension"; } identity crypto-base { -- 2.36.6