Added more tests.
Signed-off-by: Martin Vitez <mvitez@cisco.com>
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
import org.opendaylight.yangtools.yang.parser.util.RefineHolder;
/**
void addRefine(RefineHolder refine);
- void addRefineNode(SchemaNodeBuilder refineNode);
+ void addRefineNode(DataSchemaNodeBuilder refineNode);
UsesNode build();
+ Set<DataSchemaNodeBuilder> getTargetChildren();
+
+ Set<GroupingBuilder> getTargetGroupings();
+
+ Set<TypeDefinitionBuilder> getTargetTypedefs();
+
+ List<UnknownSchemaNodeBuilder> getTargetUnknownNodes();
+
}
super(builder.getModuleName(), builder.getLine(), builder.getQName());
parent = builder.getParent();
instance = new AnyXmlSchemaNodeImpl(qname);
- constraints = builder.getConstraints();
+ constraints = new ConstraintsBuilder(builder.getConstraints());
schemaPath = builder.getPath();
unknownNodes = builder.unknownNodes;
addedUnknownNodes.addAll(builder.getUnknownNodes());
@Override
public AugmentationSchema build() {
if (!built) {
+ // process uses
+ for(UsesNodeBuilder use : usesNodes) {
+ addedChildNodes.addAll(use.getTargetChildren());
+ addedUnknownNodes.addAll(use.getTargetUnknownNodes());
+ }
+
instance.setDescription(description);
instance.setReference(reference);
instance.setStatus(status);
super(b.getModuleName(), b.getLine(), b.getQName());
parent = b.getParent();
instance = new ChoiceNodeImpl(qname);
- constraints = b.getConstraints();
+ constraints = new ConstraintsBuilder(b.getConstraints());
schemaPath = b.getPath();
description = b.getDescription();
reference = b.getReference();
@Override
public ChoiceCaseNode build() {
if (!isBuilt) {
+ // process uses
+ for(UsesNodeBuilder use : addedUsesNodes) {
+ addedChildNodes.addAll(use.getTargetChildren());
+ addedUnknownNodes.addAll(use.getTargetUnknownNodes());
+ }
+
instance.setConstraints(constraints.build());
instance.setPath(schemaPath);
instance.setDescription(description);
mustDefinitions = new HashSet<MustDefinition>();
}
+ ConstraintsBuilder(final ConstraintsBuilder b) {
+ super(b.getModuleName(), b.getLine());
+ instance = new ConstraintDefinitionImpl();
+ mustDefinitions = new HashSet<MustDefinition>(b.getMustDefinitions());
+ whenCondition = b.getWhenCondition();
+ mandatory = b.isMandatory();
+ min = b.getMinElements();
+ max = b.getMaxElements();
+ }
+
@Override
public ConstraintDefinition build() {
RevisionAwareXPath whenStmt;
public ContainerSchemaNodeBuilder(final ContainerSchemaNodeBuilder b) {
super(b.getModuleName(), b.getLine(), b.getQName());
instance = new ContainerSchemaNodeImpl(b.getQName());
- constraints = b.getConstraints();
+ constraints = new ConstraintsBuilder(b.getConstraints());
schemaPath = b.getPath();
description = b.getDescription();
reference = b.getReference();
@Override
public ContainerSchemaNode build() {
if (!isBuilt) {
+ // process uses
+ for(UsesNodeBuilder use : addedUsesNodes) {
+ addedChildNodes.addAll(use.getTargetChildren());
+ addedGroupings.addAll(use.getTargetGroupings());
+ addedTypedefs.addAll(use.getTargetTypedefs());
+ addedUnknownNodes.addAll(use.getTargetUnknownNodes());
+ }
+
instance.setPath(schemaPath);
instance.setDescription(description);
instance.setReference(reference);
@Override
public GroupingDefinition build() {
if (!isBuilt) {
+ // process uses
+ for(UsesNodeBuilder use : addedUsesNodes) {
+ addedChildNodes.addAll(use.getTargetChildren());
+ addedGroupings.addAll(use.getTargetGroupings());
+ addedTypedefs.addAll(use.getTargetTypedefs());
+ addedUnknownNodes.addAll(use.getTargetUnknownNodes());
+ }
+
instance.setPath(schemaPath);
instance.setDescription(description);
instance.setReference(reference);
type = b.getType();
typedef = b.getTypedef();
- constraints = b.getConstraints();
+ constraints = new ConstraintsBuilder(b.getConstraints());
schemaPath = b.getPath();
description = b.getDescription();
reference = b.getReference();
public LeafSchemaNodeBuilder(final LeafSchemaNodeBuilder b) {
super(b.getModuleName(), b.getLine(), b.getQName());
instance = new LeafSchemaNodeImpl(qname);
- constraints = b.getConstraints();
+ constraints = new ConstraintsBuilder(b.getConstraints());
schemaPath = b.getPath();
type = b.getType();
public ListSchemaNodeBuilder(final ListSchemaNodeBuilder b) {
super(b.getModuleName(), b.getLine(), b.getQName());
instance = new ListSchemaNodeImpl(b.getQName());
- constraints = b.getConstraints();
+ constraints = new ConstraintsBuilder(b.getConstraints());
schemaPath = b.getPath();
description = b.getDescription();
reference = b.getReference();
@Override
public ListSchemaNode build() {
if (!isBuilt) {
+ // process uses
+ for(UsesNodeBuilder use : addedUsesNodes) {
+ addedChildNodes.addAll(use.getTargetChildren());
+ addedGroupings.addAll(use.getTargetGroupings());
+ addedTypedefs.addAll(use.getTargetTypedefs());
+ addedUnknownNodes.addAll(use.getTargetUnknownNodes());
+ }
+
instance.setKeyDefinition(keyDefinition);
instance.setPath(schemaPath);
instance.setDescription(description);
instance.setImports(imports);
instance.setNamespace(namespace);
+ // process uses
+ for(UsesNodeBuilder use : addedUsesNodes) {
+ addedChildNodes.addAll(use.getTargetChildren());
+ addedGroupings.addAll(use.getTargetGroupings());
+ addedTypedefs.addAll(use.getTargetTypedefs());
+ addedUnknownNodes.addAll(use.getTargetUnknownNodes());
+ }
+
// TYPEDEFS
final Set<TypeDefinition<?>> typedefs = new TreeSet<TypeDefinition<?>>(Comparators.SCHEMA_NODE_COMP);
for (TypeDefinitionBuilder tdb : addedTypedefs) {
@Override
public NotificationDefinition build() {
if (!isBuilt) {
+ // process uses
+ for(UsesNodeBuilder use : addedUsesNodes) {
+ addedChildNodes.addAll(use.getTargetChildren());
+ addedGroupings.addAll(use.getTargetGroupings());
+ addedTypedefs.addAll(use.getTargetTypedefs());
+ addedUnknownNodes.addAll(use.getTargetUnknownNodes());
+ }
+
instance.setPath(schemaPath);
instance.setDescription(description);
instance.setReference(reference);
import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;\r
import org.opendaylight.yangtools.yang.parser.builder.api.Builder;\r
import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;\r
import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;\r
import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;\r
import org.opendaylight.yangtools.yang.parser.util.RefineHolder;\r
import org.opendaylight.yangtools.yang.parser.util.YangParseException;\r
private final List<SchemaNodeBuilder> refineBuilders = new ArrayList<SchemaNodeBuilder>();\r
private final List<RefineHolder> refines = new ArrayList<RefineHolder>();\r
\r
+ private final Set<DataSchemaNodeBuilder> targetChildren = new HashSet<>();\r
+ private final Set<GroupingBuilder> targetGroupings = new HashSet<>();\r
+ private final Set<TypeDefinitionBuilder> targetTypedefs = new HashSet<>();\r
+ private final List<UnknownSchemaNodeBuilder> targetUnknownNodes = new ArrayList<>();\r
+\r
public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) {\r
super(moduleName, line);\r
this.groupingName = groupingName;\r
}\r
\r
@Override\r
- public void addRefineNode(SchemaNodeBuilder refineNode) {\r
+ public void addRefineNode(DataSchemaNodeBuilder refineNode) {\r
+ // add to refine nodes\r
refineBuilders.add(refineNode);\r
+ // replace in target children\r
+ DataSchemaNodeBuilder toRemove = null;\r
+ for(DataSchemaNodeBuilder child : targetChildren) {\r
+ if(child.getQName().equals(refineNode.getQName())) {\r
+ toRemove = child;\r
+ break;\r
+ }\r
+ }\r
+ targetChildren.remove(toRemove);\r
+ targetChildren.add(refineNode);\r
}\r
\r
@Override\r
refines.add(refine);\r
}\r
\r
+ @Override\r
+ public Set<DataSchemaNodeBuilder> getTargetChildren() {\r
+ return targetChildren;\r
+ }\r
+\r
+ @Override\r
+ public Set<GroupingBuilder> getTargetGroupings() {\r
+ return targetGroupings;\r
+ }\r
+\r
+ @Override\r
+ public Set<TypeDefinitionBuilder> getTargetTypedefs() {\r
+ return targetTypedefs;\r
+ }\r
+\r
+ @Override\r
+ public List<UnknownSchemaNodeBuilder> getTargetUnknownNodes() {\r
+ return targetUnknownNodes;\r
+ }\r
+\r
@Override\r
public int hashCode() {\r
final int prime = 31;\r
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.parser.api.YangModelParser;
import org.opendaylight.yangtools.yang.model.util.ExtendedType;
import org.opendaylight.yangtools.yang.model.util.IdentityrefType;
import org.opendaylight.yangtools.yang.parser.builder.impl.TypeDefinitionBuilderImpl;
import org.opendaylight.yangtools.yang.parser.builder.impl.UnionTypeBuilder;
import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.UsesNodeBuilderImpl;
-import org.opendaylight.yangtools.yang.parser.builder.impl.UsesNodeBuilderImpl.UsesNodeImpl;
import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort;
import org.opendaylight.yangtools.yang.parser.util.RefineHolder;
import org.opendaylight.yangtools.yang.parser.util.RefineUtils;
private void fixUnresolvedNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder builder) {
resolveDirtyNodes(modules, builder);
resolveIdentities(modules, builder);
- resolveUsesRefine(modules, builder);
+ resolveUsesNodes(modules, builder);
resolveUnknownNodes(modules, builder);
}
final ModuleBuilder builder, final SchemaContext context) {
resolveDirtyNodesWithContext(modules, builder, context);
resolveIdentitiesWithContext(modules, builder, context);
- resolveUsesRefineWithContext(modules, builder, context);
+ resolveUsesNodesWithContext(modules, builder, context);
resolveUnknownNodesWithContext(modules, builder, context);
}
* @param module
* module being resolved
*/
- private void resolveUsesRefine(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
+ private void resolveUsesNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
final List<UsesNodeBuilder> allModuleUses = module.getAllUsesNodes();
for (UsesNodeBuilder usesNode : allModuleUses) {
- // refine
+ // perform uses
final int line = usesNode.getLine();
final GroupingBuilder targetGrouping = getTargetGroupingFromModules(usesNode, modules, module);
usesNode.setGroupingPath(targetGrouping.getPath());
+ processUsesNode(module, usesNode, targetGrouping);
+ // refine
for (RefineHolder refine : usesNode.getRefines()) {
- final SchemaNodeBuilder nodeToRefine = RefineUtils.getRefineNodeFromGroupingBuilder(targetGrouping,
- refine, module.getName());
+ DataSchemaNodeBuilder nodeToRefine = null;
+ for (DataSchemaNodeBuilder dsnb : usesNode.getTargetChildren()) {
+ if (refine.getName().equals(dsnb.getQName().getLocalName())) {
+ nodeToRefine = dsnb;
+ break;
+ }
+ }
+ if (nodeToRefine == null) {
+ throw new YangParseException(refine.getModuleName(), refine.getLine(), "Refine target node '"
+ + refine.getName() + "' not found");
+ }
if (nodeToRefine instanceof GroupingMember) {
((GroupingMember) nodeToRefine).setAddedByUses(true);
}
RefineUtils.performRefine(nodeToRefine, refine, line);
usesNode.addRefineNode(nodeToRefine);
}
-
- // child nodes
- processUsesNode(module, usesNode, targetGrouping);
+ }
+ for (UsesNodeBuilder usesNode : allModuleUses) {
+ final GroupingBuilder targetGrouping = getTargetGroupingFromModules(usesNode, modules, module);
+ processUsesTarget(module, usesNode, targetGrouping);
}
}
* @param context
* SchemaContext containing already resolved modules
*/
- private void resolveUsesRefineWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ private void resolveUsesNodesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
final ModuleBuilder module, final SchemaContext context) {
final List<UsesNodeBuilder> moduleUses = module.getAllUsesNodes();
for (UsesNodeBuilder usesNode : moduleUses) {
if (targetGroupingBuilder == null) {
final GroupingDefinition targetGrouping = getTargetGroupingFromContext(usesNode, module, context);
usesNode.setGroupingPath(targetGrouping.getPath());
+ processUsesNode(usesNode, targetGrouping);
for (RefineHolder refine : usesNode.getRefines()) {
- final SchemaNodeBuilder nodeToRefine = RefineUtils.getRefineNodeFromGroupingDefinition(
- targetGrouping, refine);
+ DataSchemaNodeBuilder nodeToRefine = null;
+ for (DataSchemaNodeBuilder dsnb : usesNode.getTargetChildren()) {
+ if (refine.getName().equals(dsnb.getQName().getLocalName())) {
+ nodeToRefine = dsnb;
+ break;
+ }
+ }
+ if (nodeToRefine == null) {
+ throw new YangParseException(refine.getModuleName(), refine.getLine(), "Refine target node '"
+ + refine.getName() + "' not found");
+ }
if (nodeToRefine instanceof GroupingMember) {
((GroupingMember) nodeToRefine).setAddedByUses(true);
}
RefineUtils.performRefine(nodeToRefine, refine, line);
usesNode.addRefineNode(nodeToRefine);
}
-
- processUsesNode(usesNode, targetGrouping);
} else {
usesNode.setGroupingPath(targetGroupingBuilder.getPath());
+ processUsesNode(module, usesNode, targetGroupingBuilder);
for (RefineHolder refine : usesNode.getRefines()) {
- final SchemaNodeBuilder nodeToRefine = RefineUtils.getRefineNodeFromGroupingBuilder(
- targetGroupingBuilder, refine, module.getName());
+ DataSchemaNodeBuilder nodeToRefine = null;
+ for (DataSchemaNodeBuilder dsnb : usesNode.getTargetChildren()) {
+ if (refine.getName().equals(dsnb.getQName().getLocalName())) {
+ nodeToRefine = dsnb;
+ break;
+ }
+ }
+ if (nodeToRefine == null) {
+ throw new YangParseException(refine.getModuleName(), refine.getLine(), "Refine target node '"
+ + refine.getName() + "' not found");
+ }
if (nodeToRefine instanceof GroupingMember) {
((GroupingMember) nodeToRefine).setAddedByUses(true);
}
RefineUtils.performRefine(nodeToRefine, refine, line);
usesNode.addRefineNode(nodeToRefine);
}
-
- processUsesNode(module, usesNode, targetGroupingBuilder);
}
}
}
}
/**
- * Add nodes defined in target grouping to current context. Refinement has
- * to be already performed.
+ * Add nodes defined in target grouping to current context.
*
- * @param module current module
+ * @param module
+ * current module
* @param usesNode
* @param targetGrouping
*/
- private void processUsesNode(final ModuleBuilder module, final UsesNodeBuilder usesNode, final GroupingBuilder targetGrouping) {
- List<SchemaNodeBuilder> refineNodes = usesNode.getRefineNodes();
+ private void processUsesNode(final ModuleBuilder module, final UsesNodeBuilder usesNode,
+ final GroupingBuilder targetGrouping) {
DataNodeContainerBuilder parent = usesNode.getParent();
URI namespace = null;
Date revision = null;
prefix = parentQName.getPrefix();
}
SchemaPath parentPath = parent.getPath();
+
+ Set<DataSchemaNodeBuilder> newChildren = new HashSet<>();
for (DataSchemaNodeBuilder child : targetGrouping.getChildNodeBuilders()) {
if (child != null) {
- // if node is refined, take it from refined nodes and continue
- SchemaNodeBuilder refined = getRefined(child.getQName(), refineNodes);
- if (refined != null) {
- refined.setPath(createSchemaPath(parentPath, refined.getQName().getLocalName(), namespace,
- revision, prefix));
- parent.addChildNode((DataSchemaNodeBuilder) refined);
- continue;
- }
-
DataSchemaNodeBuilder newChild = null;
if (child instanceof AnyXmlBuilder) {
newChild = new AnyXmlBuilder((AnyXmlBuilder) child);
newChild.setPath(createSchemaPath(parentPath, newChild.getQName().getLocalName(), namespace, revision,
prefix));
- parent.addChildNode(newChild);
+ newChildren.add(newChild);
}
}
+ usesNode.getTargetChildren().addAll(newChildren);
+
+ Set<GroupingBuilder> newGroupings = new HashSet<>();
for (GroupingBuilder g : targetGrouping.getGroupingBuilders()) {
GroupingBuilder newGrouping = new GroupingBuilderImpl(g);
newGrouping.setAddedByUses(true);
newGrouping.setPath(createSchemaPath(parentPath, newGrouping.getQName().getLocalName(), namespace,
revision, prefix));
- parent.addGrouping(newGrouping);
+ newGroupings.add(newGrouping);
}
+ usesNode.getTargetGroupings().addAll(newGroupings);
+
+ Set<TypeDefinitionBuilder> newTypedefs = new HashSet<>();
for (TypeDefinitionBuilder td : targetGrouping.getTypeDefinitionBuilders()) {
TypeDefinitionBuilder newType = new TypeDefinitionBuilderImpl(td);
newType.setAddedByUses(true);
newType.setPath(createSchemaPath(parentPath, newType.getQName().getLocalName(), namespace, revision, prefix));
- parent.addTypedef(newType);
- }
- for (UsesNodeBuilder un : targetGrouping.getUses()) {
- UsesNodeBuilder newUses = new UsesNodeBuilderImpl(un);
- newUses.setAddedByUses(true);
- // uses has not path
- parent.addUsesNode(newUses);
+ newTypedefs.add(newType);
}
+ usesNode.getTargetTypedefs().addAll(newTypedefs);
+
+ List<UnknownSchemaNodeBuilder> newUnknownNodes = new ArrayList<>();
for (UnknownSchemaNodeBuilder un : targetGrouping.getUnknownNodeBuilders()) {
UnknownSchemaNodeBuilder newUn = new UnknownSchemaNodeBuilder(un);
newUn.setAddedByUses(true);
newUn.setPath(createSchemaPath(parentPath, un.getQName().getLocalName(), namespace, revision, prefix));
- parent.addUnknownNodeBuilder(newUn);
+ newUnknownNodes.add(newUn);
+ }
+ usesNode.getTargetUnknownNodes().addAll(newUnknownNodes);
+ }
+
+ /**
+ * Check if target grouping contains uses nodes and if it does, merge
+ * current uses with them.
+ *
+ * @param module
+ * @param usesNode
+ * @param targetGrouping
+ */
+ private void processUsesTarget(final ModuleBuilder module, final UsesNodeBuilder usesNode,
+ final GroupingBuilder targetGrouping) {
+ for (UsesNodeBuilder unb : targetGrouping.getUses()) {
+ usesNode.getTargetChildren().addAll(unb.getTargetChildren());
+ usesNode.getTargetGroupings().addAll(unb.getTargetGroupings());
+ usesNode.getTargetTypedefs().addAll(unb.getTargetTypedefs());
+ usesNode.getTargetUnknownNodes().addAll(unb.getTargetUnknownNodes());
}
}
private void processUsesNode(final UsesNodeBuilder usesNode, final GroupingDefinition targetGrouping) {
final String moduleName = usesNode.getModuleName();
final int line = usesNode.getLine();
- List<SchemaNodeBuilder> refineNodes = usesNode.getRefineNodes();
DataNodeContainerBuilder parent = usesNode.getParent();
URI namespace = null;
Date revision = null;
prefix = parentQName.getPrefix();
}
SchemaPath parentPath = parent.getPath();
+
+ final Set<DataSchemaNodeBuilder> newChildren = new HashSet<>();
for (DataSchemaNode child : targetGrouping.getChildNodes()) {
if (child != null) {
- // if node is refined, take it from refined nodes and continue
- SchemaNodeBuilder refined = getRefined(child.getQName(), refineNodes);
- if (refined != null) {
- refined.setPath(createSchemaPath(parentPath, refined.getQName().getLocalName(), namespace,
- revision, prefix));
- parent.addChildNode((DataSchemaNodeBuilder) refined);
- continue;
- }
-
DataSchemaNodeBuilder newChild = null;
if (child instanceof AnyXmlSchemaNode) {
newChild = createAnyXml((AnyXmlSchemaNode) child, moduleName, line);
}
newChild.setPath(createSchemaPath(parentPath, newChild.getQName().getLocalName(), namespace, revision,
prefix));
- parent.addChildNode(newChild);
+ newChildren.add(newChild);
}
}
+ usesNode.getTargetChildren().addAll(newChildren);
+
+ final Set<GroupingBuilder> newGroupings = new HashSet<>();
for (GroupingDefinition g : targetGrouping.getGroupings()) {
GroupingBuilder newGrouping = createGrouping(g, moduleName, line);
newGrouping.setAddedByUses(true);
newGrouping.setPath(createSchemaPath(parentPath, newGrouping.getQName().getLocalName(), namespace,
revision, prefix));
- parent.addGrouping(newGrouping);
+ newGroupings.add(newGrouping);
}
+ usesNode.getTargetGroupings().addAll(newGroupings);
+
+ final Set<TypeDefinitionBuilder> newTypedefs = new HashSet<>();
for (TypeDefinition<?> td : targetGrouping.getTypeDefinitions()) {
TypeDefinitionBuilder newType = createTypedef((ExtendedType) td, moduleName, line);
newType.setAddedByUses(true);
newType.setPath(createSchemaPath(parentPath, newType.getQName().getLocalName(), namespace, revision, prefix));
- parent.addTypedef(newType);
- }
- for (UsesNode un : targetGrouping.getUses()) {
- if (un instanceof UsesNodeImpl) {
- UsesNodeBuilder newUses = new UsesNodeBuilderImpl(((UsesNodeImpl) un).toBuilder());
- newUses.setAddedByUses(true);
- // uses has not path
- parent.addUsesNode(newUses);
- }
+ newTypedefs.add(newType);
}
+ usesNode.getTargetTypedefs().addAll(newTypedefs);
+
+ final List<UnknownSchemaNodeBuilder> newUnknownNodes = new ArrayList<>();
for (UnknownSchemaNode un : targetGrouping.getUnknownSchemaNodes()) {
UnknownSchemaNodeBuilder newNode = createUnknownSchemaNode(un, moduleName, line);
newNode.setAddedByUses(true);
newNode.setPath(createSchemaPath(parentPath, un.getQName().getLocalName(), namespace, revision, prefix));
- parent.addUnknownNodeBuilder(newNode);
+ newUnknownNodes.add(newNode);
}
+ usesNode.getTargetUnknownNodes().addAll(newUnknownNodes);
}
private QName findFullQName(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module,
/**
* Create new SchemaPath from given path and name.
*
- * Append new qname to schema path created from name argument. New QName
- * gets namespace, revision and prefix same as last qname in current schema
- * path.
+ * Append new qname to schema path created from name argument.
*
* @param schemaPath
* @param name
}
/**
- * Check if node is present in refine nodes.
+ * Get node from collection of refined nodes based on qname.
*
* @param nodeQName
* qname of node
* @param refineNodes
* collections of refined nodes
- * @return true, if node with given qname was found, false otherwise
+ * @return node with given qname if present, null otherwise
*/
public static SchemaNodeBuilder getRefined(QName nodeQName, List<SchemaNodeBuilder> refineNodes) {
for (SchemaNodeBuilder rn : refineNodes) {
}
}
- /**
- * Find node in grouping by name.
- *
- * @param grouping
- * grouping to search
- * @param refineNodeName
- * name of node
- * @return builder of node with given name if present in grouping, null
- * otherwise
- */
- public static Builder findRefineTargetBuilder(final GroupingBuilder grouping, final String refineNodeName) {
- // search child nodes
- Builder result = grouping.getDataChildByName(refineNodeName);
- // search groupings
- if (result == null) {
- Set<GroupingBuilder> grps = grouping.getGroupingBuilders();
- for (GroupingBuilder gr : grps) {
- if (gr.getQName().getLocalName().equals(refineNodeName)) {
- result = gr;
- break;
- }
- }
- }
- // search typedefs
- if (result == null) {
- Set<TypeDefinitionBuilder> typedefs = grouping.getTypeDefinitionBuilders();
- for (TypeDefinitionBuilder typedef : typedefs) {
- if (typedef.getQName().getLocalName().equals(refineNodeName)) {
- result = typedef;
- break;
- }
- }
- }
- return result;
- }
-
- /**
- * Find node in grouping by name.
- *
- * @param builder
- * grouping to search
- * @param refineNodeName
- * name of node
- * @return node with given name if present in grouping, null otherwise
- */
- public static Object findRefineTargetNode(final GroupingDefinition builder, final String refineNodeName) {
- Object result = builder.getDataChildByName(refineNodeName);
- if (result == null) {
- Set<GroupingDefinition> grps = builder.getGroupings();
- for (GroupingDefinition gr : grps) {
- if (gr.getQName().getLocalName().equals(refineNodeName)) {
- result = gr;
- break;
- }
- }
- }
- if (result == null) {
- Set<TypeDefinition<?>> typedefs = builder.getTypeDefinitions();
- for (TypeDefinition<?> typedef : typedefs) {
- if (typedef.getQName().getLocalName().equals(refineNodeName)) {
- result = typedef;
- break;
- }
- }
- }
- return result;
- }
-
/**
* Add all augment's child nodes to given target.
*
import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
import org.opendaylight.yangtools.yang.model.api.MustDefinition;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.util.ExtendedType;
import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
+import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
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.impl.AnyXmlBuilder;
import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceBuilder;
import org.opendaylight.yangtools.yang.parser.builder.impl.ContainerSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.GroupingBuilderImpl;
import org.opendaylight.yangtools.yang.parser.builder.impl.LeafListSchemaNodeBuilder;
import org.opendaylight.yangtools.yang.parser.builder.impl.LeafSchemaNodeBuilder;
import org.opendaylight.yangtools.yang.parser.builder.impl.ListSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.TypeDefinitionBuilderImpl;
import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
/**
* current module name
* @return
*/
- public static SchemaNodeBuilder getRefineNodeFromGroupingBuilder(final GroupingBuilder targetGrouping,
+ public static DataSchemaNodeBuilder getRefineNodeFromGroupingBuilder(final GroupingBuilder targetGrouping,
final RefineHolder refine, final String moduleName) {
- Builder result = null;
- final Builder lookedUpBuilder = findRefineTargetBuilder(targetGrouping, refine.getName());
+ DataSchemaNodeBuilder result = null;
+ final Builder lookedUpBuilder = targetGrouping.getDataChildByName(refine.getName());
+ if (lookedUpBuilder == null) {
+ throw new YangParseException(moduleName, refine.getLine(), "Target node '" + refine.getName()
+ + "' not found");
+ }
if (lookedUpBuilder instanceof LeafSchemaNodeBuilder) {
result = new LeafSchemaNodeBuilder((LeafSchemaNodeBuilder) lookedUpBuilder);
} else if (lookedUpBuilder instanceof ContainerSchemaNodeBuilder) {
result = new ChoiceBuilder((ChoiceBuilder) lookedUpBuilder);
} else if (lookedUpBuilder instanceof AnyXmlBuilder) {
result = new AnyXmlBuilder((AnyXmlBuilder) lookedUpBuilder);
- } else if (lookedUpBuilder instanceof GroupingBuilder) {
- result = new GroupingBuilderImpl((GroupingBuilder) lookedUpBuilder);
- } else if (lookedUpBuilder instanceof TypeDefinitionBuilder) {
- result = new TypeDefinitionBuilderImpl((TypeDefinitionBuilder) lookedUpBuilder);
} else {
throw new YangParseException(moduleName, refine.getLine(), "Target '" + refine.getName()
+ "' can not be refined");
}
- return (SchemaNodeBuilder) result;
+ return result;
}
/**
* refine object containing informations about refine
* @return
*/
- public static SchemaNodeBuilder getRefineNodeFromGroupingDefinition(final GroupingDefinition grouping,
+ public static DataSchemaNodeBuilder getRefineNodeFromGroupingDefinition(final GroupingDefinition grouping,
final RefineHolder refine) {
final String moduleName = refine.getModuleName();
final int line = refine.getLine();
- SchemaNodeBuilder result = null;
- final Object lookedUpNode = findRefineTargetNode(grouping, refine.getName());
+ DataSchemaNodeBuilder result = null;
+ final Object lookedUpNode = grouping.getDataChildByName(refine.getName());
+ if (lookedUpNode == null) {
+ throw new YangParseException(moduleName, line, "Refine target node '" + refine.getName() + "' not found");
+ }
if (lookedUpNode instanceof LeafSchemaNode) {
result = createLeafBuilder((LeafSchemaNode) lookedUpNode, moduleName, line);
} else if (lookedUpNode instanceof ContainerSchemaNode) {
result = createChoice((ChoiceNode) lookedUpNode, moduleName, line);
} else if (lookedUpNode instanceof AnyXmlSchemaNode) {
result = createAnyXml((AnyXmlSchemaNode) lookedUpNode, moduleName, line);
- } else if (lookedUpNode instanceof GroupingDefinition) {
- result = createGrouping((GroupingDefinition) lookedUpNode, moduleName, line);
- } else if (lookedUpNode instanceof TypeDefinition) {
- result = createTypedef((ExtendedType) lookedUpNode, moduleName, line);
} else {
throw new YangParseException(moduleName, line, "Target '" + refine.getName() + "' can not be refined");
}
import org.opendaylight.yangtools.yang.model.api.MustDefinition;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
import org.opendaylight.yangtools.yang.model.api.UsesNode;
-import org.opendaylight.yangtools.yang.model.util.ExtendedType;
public class GroupingTest {
private Set<Module> modules;
assertEquals(1, usesNodes.size());
UsesNode usesNode = usesNodes.iterator().next();
Map<SchemaPath, SchemaNode> refines = usesNode.getRefines();
- assertEquals(5, refines.size());
+ assertEquals(3, refines.size());
LeafSchemaNode refineLeaf = null;
ContainerSchemaNode refineContainer = null;
ListSchemaNode refineList = null;
- GroupingDefinition refineGrouping = null;
- TypeDefinition<?> typedef = null;
for (Map.Entry<SchemaPath, SchemaNode> entry : refines.entrySet()) {
SchemaNode value = entry.getValue();
if (value instanceof LeafSchemaNode) {
refineContainer = (ContainerSchemaNode) value;
} else if (value instanceof ListSchemaNode) {
refineList = (ListSchemaNode) value;
- } else if (value instanceof GroupingDefinition) {
- refineGrouping = (GroupingDefinition) value;
- } else if (value instanceof TypeDefinition<?>) {
- typedef = (TypeDefinition<?>) value;
}
}
assertEquals("IP address of target node", refineLeaf.getDescription());
assertEquals("address reference added by refine", refineLeaf.getReference());
assertFalse(refineLeaf.isConfiguration());
- assertTrue(refineLeaf.getConstraints().isMandatory());
+ assertFalse(refineLeaf.getConstraints().isMandatory());
Set<MustDefinition> leafMustConstraints = refineLeaf.getConstraints().getMustConstraints();
assertEquals(1, leafMustConstraints.size());
MustDefinition leafMust = leafMustConstraints.iterator().next();
assertFalse(refineList.isConfiguration());
assertEquals(2, (int) refineList.getConstraints().getMinElements());
assertEquals(12, (int) refineList.getConstraints().getMaxElements());
-
- // grouping target-inner
- assertNotNull(refineGrouping);
- Set<DataSchemaNode> refineGroupingChildren = refineGrouping.getChildNodes();
- assertEquals(1, refineGroupingChildren.size());
- LeafSchemaNode refineGroupingLeaf = (LeafSchemaNode) refineGroupingChildren.iterator().next();
- assertEquals("inner-grouping-id", refineGroupingLeaf.getQName().getLocalName());
- assertEquals("new target-inner grouping description", refineGrouping.getDescription());
-
- // typedef group-type
- assertNotNull(typedef);
- assertEquals("new group-type description", typedef.getDescription());
- assertEquals("new group-type reference", typedef.getReference());
- assertTrue(typedef.getBaseType() instanceof ExtendedType);
}
@Test
assertEquals("address reference added by refine", address_u.getReference());
assertFalse(address_u.isConfiguration());
assertTrue(address_u.isAddedByUses());
+ assertFalse(address_u.getConstraints().isMandatory());
LeafSchemaNode address_g = (LeafSchemaNode) grouping.getDataChildByName("address");
assertNotNull(address_g);
assertNull(address_g.getReference());
assertTrue(address_g.isConfiguration());
assertFalse(address_u.equals(address_g));
+ assertTrue(address_g.getConstraints().isMandatory());
ContainerSchemaNode port_u = (ContainerSchemaNode) destination.getDataChildByName("port");
assertNotNull(port_u);
assertEquals("name", leaf.getQName().getLocalName());
}
+ @Test
+ public void testCascadeUses() throws FileNotFoundException {
+ modules = TestUtils.loadModules(getClass().getResource("/simple-test").getPath());
+ Module testModule = TestUtils.findModule(modules, "cascade-uses");
+ Set<GroupingDefinition> groupings = testModule.getGroupings();
+
+ GroupingDefinition gu = null;
+ GroupingDefinition gv = null;
+ GroupingDefinition gx = null;
+ GroupingDefinition gy = null;
+ GroupingDefinition gz = null;
+ GroupingDefinition gzz = null;
+ for (GroupingDefinition gd : groupings) {
+ if ("grouping-U".equals(gd.getQName().getLocalName()))
+ gu = gd;
+ if ("grouping-V".equals(gd.getQName().getLocalName()))
+ gv = gd;
+ if ("grouping-X".equals(gd.getQName().getLocalName()))
+ gx = gd;
+ if ("grouping-Y".equals(gd.getQName().getLocalName()))
+ gy = gd;
+ if ("grouping-Z".equals(gd.getQName().getLocalName()))
+ gz = gd;
+ if ("grouping-ZZ".equals(gd.getQName().getLocalName()))
+ gzz = gd;
+ }
+ assertNotNull(gu);
+ assertNotNull(gv);
+ assertNotNull(gx);
+ assertNotNull(gy);
+ assertNotNull(gz);
+ assertNotNull(gzz);
+
+ assertEquals(6, gu.getChildNodes().size());
+ assertEquals(3, gv.getChildNodes().size());
+ assertEquals(2, gx.getChildNodes().size());
+ assertEquals(1, gy.getChildNodes().size());
+ assertEquals(1, gz.getChildNodes().size());
+ assertEquals(1, gzz.getChildNodes().size());
+ }
+
}
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
import org.opendaylight.yangtools.yang.model.api.UsesNode;
import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
// test refine
Map<SchemaPath, SchemaNode> refines = usesNode.getRefines();
- assertEquals(5, refines.size());
+ assertEquals(3, refines.size());
LeafSchemaNode refineLeaf = null;
ContainerSchemaNode refineContainer = null;
ListSchemaNode refineList = null;
- GroupingDefinition refineGrouping = null;
- TypeDefinition<?> typedef = null;
for (Map.Entry<SchemaPath, SchemaNode> entry : refines.entrySet()) {
SchemaNode value = entry.getValue();
if (value instanceof LeafSchemaNode) {
refineContainer = (ContainerSchemaNode) value;
} else if (value instanceof ListSchemaNode) {
refineList = (ListSchemaNode) value;
- } else if (value instanceof GroupingDefinition) {
- refineGrouping = (GroupingDefinition) value;
- } else if (value instanceof TypeDefinition<?>) {
- typedef = (TypeDefinition<?>) value;
}
}
assertFalse(refineList.isConfiguration());
assertEquals(2, (int) refineList.getConstraints().getMinElements());
assertEquals(12, (int) refineList.getConstraints().getMaxElements());
-
- // grouping target-inner
- assertNotNull(refineGrouping);
- Set<DataSchemaNode> refineGroupingChildren = refineGrouping.getChildNodes();
- assertEquals(1, refineGroupingChildren.size());
- LeafSchemaNode refineGroupingLeaf = (LeafSchemaNode) refineGroupingChildren.iterator().next();
- assertEquals("inner-grouping-id", refineGroupingLeaf.getQName().getLocalName());
- assertEquals("new target-inner grouping description", refineGrouping.getDescription());
-
- // typedef group-type
- assertNotNull(typedef);
- assertEquals("new group-type description", typedef.getDescription());
- assertEquals("new group-type reference", typedef.getReference());
- assertTrue(typedef.getBaseType() instanceof ExtendedType);
}
@Test
min-elements 2;
max-elements 12;
}
- refine target-inner {
- description "new target-inner grouping description";
- }
- refine group-type {
- description "new group-type description";
- reference "new group-type reference";
- }
}
}
}
leaf address {
type string;
description "Target IP address";
+ mandatory true;
}
container port {
description "Target port container";
description "IP address of target node";
reference "address reference added by refine";
config false;
- mandatory true;
+ mandatory false;
must "ifType != 'ethernet' or " +
"(ifType = 'ethernet' and ifMTU = 1500)" {
error-message "An ethernet MTU must be 1500";
min-elements 2;
max-elements 12;
}
- refine target-inner {
- description "new target-inner grouping description";
- }
- refine group-type {
- description "new group-type description";
- reference "new group-type reference";
- }
}
}
}
--- /dev/null
+module cascade-uses {\r
+ \r
+ namespace "urn:grouping:dependencies";\r
+ prefix "sbd";\r
+\r
+ organization "OPEN DAYLIGHT";\r
+ contact "http://www.opendaylight.org/";\r
+\r
+ revision 2013-07-18 {\r
+ }\r
+ \r
+ grouping grouping-U {\r
+ leaf leaf-grouping-U {\r
+ type string;\r
+ }\r
+ uses grouping-V;\r
+ uses grouping-X;\r
+ }\r
+\r
+ grouping grouping-V {\r
+ leaf leaf-grouping-V {\r
+ type string;\r
+ }\r
+ uses grouping-Z;\r
+ uses grouping-ZZ;\r
+ }\r
+\r
+ grouping grouping-X {\r
+ leaf leaf-grouping-X {\r
+ type string;\r
+ }\r
+ uses grouping-Y;\r
+ }\r
+\r
+ grouping grouping-Y {\r
+ leaf leaf-grouping-Y {\r
+ type string;\r
+ }\r
+ }\r
+ \r
+ grouping grouping-Z {\r
+ leaf leaf-grouping-Z {\r
+ type string;\r
+ }\r
+ }\r
+ \r
+ grouping grouping-ZZ {\r
+ leaf leaf-grouping-ZZ {\r
+ type string;\r
+ }\r
+ } \r
+}
\ No newline at end of file