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 extends JavaFileObject> 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 extends JavaFileObject> 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 extends JavaFileObject> 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 extends JavaFileObject> 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 extends JavaFileObject> 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 extends TypeDefinition>> build() {
+ public TypeDefinition extends 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