From: Martin Vitez Date: Mon, 27 May 2013 15:10:16 +0000 (+0200) Subject: Fixed yang grouping resolution. X-Git-Tag: releasepom-0.1.0~417^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=53e740af349a154f3f1a6b8c041303446f599718 Fixed yang grouping resolution. Fixed refine parsing. Updated tests. Change-Id: I1d0b27458fde7b7b78cbaff6af210b5885493506 Signed-off-by: Martin Vitez --- diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4 b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4 index 36aff55124..c814831253 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4 +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4 @@ -79,7 +79,7 @@ require_instance_stmt : REQUIRE_INSTANCE_KEYWORD require_instance_arg stmtend; path_stmt : PATH_KEYWORD string stmtend; leafref_specification : path_stmt; enum_stmt : ENUM_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |value_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); -enum_specification : enum_stmt (identifier_stmt | enum_stmt )+; +enum_specification : enum_stmt (identifier_stmt | enum_stmt )*; default_stmt : DEFAULT_KEYWORD string stmtend; pattern_stmt : PATTERN_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); length_stmt : LENGTH_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingBuilder.java index 7d94cd97ac..2c1f94da83 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingBuilder.java @@ -7,7 +7,12 @@ */ package org.opendaylight.controller.yang.parser.builder.api; +import java.util.List; +import java.util.Set; + import org.opendaylight.controller.yang.model.api.GroupingDefinition; +import org.opendaylight.controller.yang.model.api.Status; +import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder; /** * Interface for builders of 'grouping' statement. @@ -15,8 +20,22 @@ import org.opendaylight.controller.yang.model.api.GroupingDefinition; public interface GroupingBuilder extends ChildNodeBuilder, SchemaNodeBuilder, TypeDefinitionAwareBuilder { - DataSchemaNodeBuilder getChildNode(String name); + String getDescription(); + + String getReference(); + + Status getStatus(); GroupingDefinition build(); + DataSchemaNodeBuilder getChildNode(String name); + + List getUnknownNodes(); + + Set getGroupings(); + + Set getTypedefs(); + + Set getUses(); + } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/UsesNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/UsesNodeBuilder.java index 7ac4ec01be..1c4a4acde4 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/UsesNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/UsesNodeBuilder.java @@ -8,6 +8,7 @@ package org.opendaylight.controller.yang.parser.builder.api; import java.util.List; +import java.util.Set; import org.opendaylight.controller.yang.model.api.SchemaPath; import org.opendaylight.controller.yang.model.api.UsesNode; @@ -18,14 +19,22 @@ import org.opendaylight.controller.yang.parser.util.RefineHolder; */ public interface UsesNodeBuilder extends Builder { + String getGroupingPathString(); + SchemaPath getGroupingPath(); + Set getAugmentations(); + void addAugment(AugmentationSchemaBuilder builder); + boolean isAugmenting(); + void setAugmenting(boolean augmenting); List getRefines(); + List getRefineNodes(); + void addRefine(RefineHolder refine); void addRefineNode(SchemaNodeBuilder refineNode); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java index 19c94a3f33..759f54ec6f 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java @@ -29,58 +29,71 @@ import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder; public class GroupingBuilderImpl implements GroupingBuilder { + private boolean built; private final GroupingDefinitionImpl instance; private final int line; + private final QName qname; private SchemaPath schemaPath; + private String description; + private String reference; + private Status status; private final Set childNodes = new HashSet(); private final Set groupings = new HashSet(); private final Set addedTypedefs = new HashSet(); private final Set usesNodes = new HashSet(); private final List addedUnknownNodes = new ArrayList(); - GroupingBuilderImpl(final QName qname, final int line) { + public GroupingBuilderImpl(final QName qname, final int line) { + this.qname = qname; this.instance = new GroupingDefinitionImpl(qname); this.line = line; } @Override public GroupingDefinition build() { - instance.setPath(schemaPath); + if (!built) { + instance.setPath(schemaPath); + instance.setDescription(description); + instance.setReference(reference); + instance.setStatus(status); + + // CHILD NODES + final Map childs = new HashMap(); + for (DataSchemaNodeBuilder node : childNodes) { + childs.put(node.getQName(), node.build()); + } + instance.setChildNodes(childs); - // CHILD NODES - final Map childs = new HashMap(); - for (DataSchemaNodeBuilder node : childNodes) { - childs.put(node.getQName(), node.build()); - } - instance.setChildNodes(childs); + // GROUPINGS + final Set groupingDefs = new HashSet(); + for (GroupingBuilder builder : groupings) { + groupingDefs.add(builder.build()); + } + instance.setGroupings(groupingDefs); - // GROUPINGS - final Set groupingDefs = new HashSet(); - for (GroupingBuilder builder : groupings) { - groupingDefs.add(builder.build()); - } - instance.setGroupings(groupingDefs); + // TYPEDEFS + final Set> typedefs = new HashSet>(); + for (TypeDefinitionBuilder entry : addedTypedefs) { + typedefs.add(entry.build()); + } + instance.setTypeDefinitions(typedefs); - // TYPEDEFS - final Set> typedefs = new HashSet>(); - for (TypeDefinitionBuilder entry : addedTypedefs) { - typedefs.add(entry.build()); - } - instance.setTypeDefinitions(typedefs); + // USES + final Set usesNodeDefs = new HashSet(); + for (UsesNodeBuilder builder : usesNodes) { + usesNodeDefs.add(builder.build()); + } + instance.setUses(usesNodeDefs); - // USES - final Set usesNodeDefs = new HashSet(); - for (UsesNodeBuilder builder : usesNodes) { - usesNodeDefs.add(builder.build()); - } - instance.setUses(usesNodeDefs); + // UNKNOWN NODES + final List unknownNodes = new ArrayList(); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build()); + } + instance.setUnknownSchemaNodes(unknownNodes); - // UNKNOWN NODES - final List unknownNodes = new ArrayList(); - for(UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); + built = true; } - instance.setUnknownSchemaNodes(unknownNodes); return instance; } @@ -90,12 +103,14 @@ public class GroupingBuilderImpl implements GroupingBuilder { return line; } - /** - * Always returns null. - */ @Override public QName getQName() { - return null; + return qname; + } + + @Override + public Set getTypedefs() { + return addedTypedefs; } @Override @@ -113,26 +128,41 @@ public class GroupingBuilderImpl implements GroupingBuilder { this.schemaPath = schemaPath; } + @Override + public String getDescription() { + return description; + } + @Override public void setDescription(final String description) { - instance.setDescription(description); + this.description = description; + } + + @Override + public String getReference() { + return reference; } @Override public void setReference(final String reference) { - instance.setReference(reference); + this.reference = reference; + } + + @Override + public Status getStatus() { + return status; } @Override public void setStatus(final Status status) { - instance.setStatus(status); + this.status = status; } @Override public DataSchemaNodeBuilder getChildNode(String name) { DataSchemaNodeBuilder result = null; - for(DataSchemaNodeBuilder node : childNodes) { - if(node.getQName().getLocalName().equals(name)) { + for (DataSchemaNodeBuilder node : childNodes) { + if (node.getQName().getLocalName().equals(name)) { result = node; break; } @@ -150,16 +180,31 @@ public class GroupingBuilderImpl implements GroupingBuilder { return childNodes; } + @Override + public Set getGroupings() { + return groupings; + } + @Override public void addGrouping(final GroupingBuilder grouping) { groupings.add(grouping); } + @Override + public Set getUses() { + return usesNodes; + } + @Override public void addUsesNode(final UsesNodeBuilder usesBuilder) { usesNodes.add(usesBuilder); } + @Override + public List getUnknownNodes() { + return addedUnknownNodes; + } + @Override public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) { addedUnknownNodes.add(unknownNode); @@ -264,7 +309,7 @@ public class GroupingBuilderImpl implements GroupingBuilder { } private void setUnknownSchemaNodes(List unknownNodes) { - if(unknownNodes != null) { + if (unknownNodes != null) { this.unknownNodes = unknownNodes; } } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java index 740f399168..4865178d27 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java @@ -1119,7 +1119,7 @@ public class ModuleBuilder implements Builder { final Set groupings = new HashSet(); for (Map.Entry, GroupingBuilder> entry : addedGroupings .entrySet()) { - if (entry.getKey().size() == 2) { + if (entry.getKey().size() == 3) { groupings.add(entry.getValue().build()); } } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java index 0534f9def0..6943b66156 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java @@ -25,16 +25,19 @@ import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder; import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.controller.yang.parser.util.RefineHolder; -final class UsesNodeBuilderImpl implements UsesNodeBuilder { +public final class UsesNodeBuilderImpl implements UsesNodeBuilder { private boolean built; private final UsesNodeImpl instance; private final int line; + private final String groupingPathStr; private final SchemaPath groupingPath; + private boolean augmenting; private final Set addedAugments = new HashSet(); private List refineBuilders = new ArrayList(); private List refines = new ArrayList(); - UsesNodeBuilderImpl(final String groupingPathStr, final int line) { + public UsesNodeBuilderImpl(final String groupingPathStr, final int line) { + this.groupingPathStr = groupingPathStr; this.groupingPath = parseUsesPath(groupingPathStr); this.line = line; instance = new UsesNodeImpl(groupingPath); @@ -42,7 +45,9 @@ final class UsesNodeBuilderImpl implements UsesNodeBuilder { @Override public UsesNode build() { - if(!built) { + if (!built) { + instance.setAugmenting(augmenting); + // AUGMENTATIONS final Set augments = new HashSet(); for (AugmentationSchemaBuilder builder : addedAugments) { @@ -68,19 +73,39 @@ final class UsesNodeBuilderImpl implements UsesNodeBuilder { return line; } + @Override + public String getGroupingPathString() { + return groupingPathStr; + } + @Override public SchemaPath getGroupingPath() { return groupingPath; } + @Override + public Set getAugmentations() { + return addedAugments; + } + @Override public void addAugment(final AugmentationSchemaBuilder augmentBuilder) { addedAugments.add(augmentBuilder); } + @Override + public boolean isAugmenting() { + return augmenting; + } + @Override public void setAugmenting(final boolean augmenting) { - instance.setAugmenting(augmenting); + this.augmenting = augmenting; + } + + @Override + public List getRefineNodes() { + return refineBuilders; } @Override diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java index 85ca36791d..ec46831b4f 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java @@ -800,8 +800,7 @@ public class YangParserImpl implements YangModelParser { ParserUtils.refineList(list, refine, line); usesNode.addRefineNode(list); } else if (refineTarget instanceof LeafListSchemaNodeBuilder) { - final LeafListSchemaNodeBuilder leafList = (LeafListSchemaNodeBuilder) getRefineNodeBuilderCopy( - groupingName, refine, modules, module); + final LeafListSchemaNodeBuilder leafList = (LeafListSchemaNodeBuilder) refineTarget; ParserUtils.refineLeafList(leafList, refine, line); usesNode.addRefineNode(leafList); } else if (refineTarget instanceof ChoiceBuilder) { @@ -812,6 +811,10 @@ public class YangParserImpl implements YangModelParser { final AnyXmlBuilder anyXml = (AnyXmlBuilder) refineTarget; ParserUtils.refineAnyxml(anyXml, refine, line); usesNode.addRefineNode(anyXml); + } else if(refineTarget instanceof GroupingBuilder) { + usesNode.addRefineNode((GroupingBuilder)refineTarget); + } else if(refineTarget instanceof TypedefBuilder) { + usesNode.addRefineNode((TypedefBuilder)refineTarget); } } } @@ -861,6 +864,12 @@ public class YangParserImpl implements YangModelParser { } else if (lookedUpBuilder instanceof AnyXmlBuilder) { result = ParserUtils .copyAnyXmlBuilder((AnyXmlBuilder) lookedUpBuilder); + } else if (lookedUpBuilder instanceof GroupingBuilder) { + result = ParserUtils + .copyGroupingBuilder((GroupingBuilder) lookedUpBuilder); + } else if (lookedUpBuilder instanceof TypeDefinitionBuilder) { + result = ParserUtils + .copyTypedefBuilder((TypedefBuilder) lookedUpBuilder); } else { throw new YangParseException(module.getName(), refine.getLine(), "Target '" + refine.getName() + "' can not be refined"); @@ -873,8 +882,8 @@ public class YangParserImpl implements YangModelParser { * * @param groupingPath * path to grouping which contains node to refine - * @param refineNodeName - * name of node to be refined + * @param refine + * object containing refine information * @param modules * all loaded modules * @param module @@ -886,6 +895,7 @@ public class YangParserImpl implements YangModelParser { final RefineHolder refine, final Map> modules, final ModuleBuilder module) { + final String refineNodeName = refine.getName(); final SchemaPath path = ParserUtils.parseUsesPath(groupingPath); final List builderPath = new ArrayList(); String prefix = null; @@ -904,7 +914,26 @@ public class YangParserImpl implements YangModelParser { final GroupingBuilder builder = (GroupingBuilder) dependentModule .getNode(builderPath); - return builder.getChildNode(refine.getName()); + Builder result = builder.getChildNode(refineNodeName); + if(result == null) { + Set grps = builder.getGroupings(); + for(GroupingBuilder gr : grps) { + if(gr.getQName().getLocalName().equals(refineNodeName)) { + result = gr; + break; + } + } + } + if(result == null) { + Set typedefs = builder.getTypedefs(); + for(TypeDefinitionBuilder typedef : typedefs) { + if(typedef.getQName().getLocalName().equals(refineNodeName)) { + result = typedef; + break; + } + } + } + return result; } private QName findFullQName( diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java index 84e0b041e6..05f9c6519f 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java @@ -21,6 +21,7 @@ import org.opendaylight.controller.yang.parser.builder.api.Builder; import org.opendaylight.controller.yang.parser.builder.api.ChildNodeBuilder; import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder; import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder; +import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder; import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.controller.yang.parser.builder.impl.AnyXmlBuilder; @@ -28,11 +29,14 @@ import org.opendaylight.controller.yang.parser.builder.impl.ChoiceBuilder; import org.opendaylight.controller.yang.parser.builder.impl.ChoiceCaseBuilder; import org.opendaylight.controller.yang.parser.builder.impl.ConstraintsBuilder; import org.opendaylight.controller.yang.parser.builder.impl.ContainerSchemaNodeBuilder; +import org.opendaylight.controller.yang.parser.builder.impl.GroupingBuilderImpl; import org.opendaylight.controller.yang.parser.builder.impl.LeafListSchemaNodeBuilder; import org.opendaylight.controller.yang.parser.builder.impl.LeafSchemaNodeBuilder; import org.opendaylight.controller.yang.parser.builder.impl.ListSchemaNodeBuilder; import org.opendaylight.controller.yang.parser.builder.impl.ModuleBuilder; +import org.opendaylight.controller.yang.parser.builder.impl.TypedefBuilder; import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder; +import org.opendaylight.controller.yang.parser.builder.impl.UsesNodeBuilderImpl; public final class ParserUtils { @@ -264,8 +268,7 @@ public final class ParserUtils { * @param line * current line in yang model */ - public static void refineDefault(Builder node, RefineHolder refine, - int line) { + public static void refineDefault(Builder node, RefineHolder refine, int line) { Class cls = node.getClass(); String description = refine.getDescription(); @@ -355,9 +358,6 @@ public final class ParserUtils { for (UsesNodeBuilder use : old.getUsesNodes()) { copy.addUsesNode(use); } - for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) { - copy.addUnknownSchemaNode(unknown); - } copy.setDescription(old.getDescription()); copy.setReference(old.getReference()); copy.setStatus(old.getStatus()); @@ -391,9 +391,6 @@ public final class ParserUtils { for (UsesNodeBuilder use : old.getUsesNodes()) { copy.addUsesNode(use); } - for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) { - copy.addUnknownSchemaNode(unknown); - } copy.setDescription(old.getDescription()); copy.setReference(old.getReference()); copy.setStatus(old.getStatus()); @@ -418,9 +415,6 @@ public final class ParserUtils { for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) { copy.addUnknownSchemaNode(unknown); } - for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) { - copy.addUnknownSchemaNode(unknown); - } copy.setDescription(old.getDescription()); copy.setReference(old.getReference()); copy.setStatus(old.getStatus()); @@ -447,9 +441,6 @@ public final class ParserUtils { for (UsesNodeBuilder use : old.getUsesNodes()) { copy.addUsesNode(use); } - for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) { - copy.addUnknownSchemaNode(unknown); - } copy.setDefaultCase(old.getDefaultCase()); copy.setDescription(old.getDescription()); copy.setReference(old.getReference()); @@ -474,6 +465,72 @@ public final class ParserUtils { return copy; } + public static GroupingBuilder copyGroupingBuilder(final GroupingBuilder old) { + final GroupingBuilder copy = new GroupingBuilderImpl(old.getQName(), + old.getLine()); + copy.setPath(old.getPath()); + for (DataSchemaNodeBuilder child : old.getChildNodes()) { + copy.addChildNode(child); + } + for (GroupingBuilder grouping : old.getGroupings()) { + copy.addGrouping(grouping); + } + for (TypeDefinitionBuilder typedef : old.getTypedefs()) { + copy.addTypedef(typedef); + } + for (UsesNodeBuilder use : old.getUses()) { + copy.addUsesNode(use); + } + for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) { + copy.addUnknownSchemaNode(unknown); + } + copy.setDescription(old.getDescription()); + copy.setReference(old.getReference()); + copy.setStatus(old.getStatus()); + return copy; + } + + public static TypedefBuilder copyTypedefBuilder(TypedefBuilder old) { + final TypedefBuilder copy = new TypedefBuilder(old.getQName(), + old.getLine()); + copy.setPath(old.getPath()); + copy.setDefaultValue(old.getDefaultValue()); + copy.setUnits(old.getUnits()); + copy.setDescription(old.getDescription()); + copy.setReference(old.getReference()); + copy.setStatus(old.getStatus()); + + copy.setRanges(old.getRanges()); + copy.setLengths(old.getLengths()); + copy.setPatterns(old.getPatterns()); + copy.setFractionDigits(old.getFractionDigits()); + + TypeDefinition type = old.getType(); + if(type == null) { + copy.setType(old.getTypedef()); + } else { + copy.setType(old.getType()); + } + copy.setUnits(old.getUnits()); + for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) { + copy.addUnknownSchemaNode(unknown); + } + return copy; + } + + public static UsesNodeBuilder copyUsesNodeBuilder(UsesNodeBuilder old) { + final UsesNodeBuilder copy = new UsesNodeBuilderImpl( + old.getGroupingPathString(), old.getLine()); + for (AugmentationSchemaBuilder augment : old.getAugmentations()) { + copy.addAugment(augment); + } + copy.setAugmenting(old.isAugmenting()); + for (SchemaNodeBuilder refineNode : old.getRefineNodes()) { + copy.addRefineNode(refineNode); + } + return copy; + } + private static void copyConstraints(final DataSchemaNodeBuilder oldBuilder, final DataSchemaNodeBuilder newBuilder) { final ConstraintsBuilder oldConstraints = oldBuilder.getConstraints(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java index fe358995fa..910a360c9b 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java @@ -26,10 +26,12 @@ import org.opendaylight.controller.yang.model.api.ChoiceCaseNode; import org.opendaylight.controller.yang.model.api.ChoiceNode; import org.opendaylight.controller.yang.model.api.ConstraintDefinition; import org.opendaylight.controller.yang.model.api.ContainerSchemaNode; +import org.opendaylight.controller.yang.model.api.DataSchemaNode; import org.opendaylight.controller.yang.model.api.Deviation; import org.opendaylight.controller.yang.model.api.Deviation.Deviate; import org.opendaylight.controller.yang.model.api.ExtensionDefinition; import org.opendaylight.controller.yang.model.api.FeatureDefinition; +import org.opendaylight.controller.yang.model.api.GroupingDefinition; import org.opendaylight.controller.yang.model.api.LeafSchemaNode; import org.opendaylight.controller.yang.model.api.ListSchemaNode; import org.opendaylight.controller.yang.model.api.Module; @@ -551,11 +553,13 @@ public class YangParserTest { assertEquals(1, usesNodes.size()); UsesNode usesNode = usesNodes.iterator().next(); Map refines = usesNode.getRefines(); - assertEquals(3, refines.size()); + assertEquals(5, refines.size()); LeafSchemaNode refineLeaf = null; ContainerSchemaNode refineContainer = null; ListSchemaNode refineList = null; + GroupingDefinition refineGrouping = null; + TypeDefinition typedef = null; for (Map.Entry entry : refines.entrySet()) { SchemaNode value = entry.getValue(); if (value instanceof LeafSchemaNode) { @@ -564,6 +568,10 @@ public class YangParserTest { 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; } } @@ -607,6 +615,20 @@ public class YangParserTest { assertFalse(refineList.isConfiguration()); assertEquals(2, (int)refineList.getConstraints().getMinElements()); assertEquals(12, (int)refineList.getConstraints().getMaxElements()); + + // grouping target-inner + assertNotNull(refineGrouping); + Set 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 @@ -729,4 +751,14 @@ public class YangParserTest { assertNotNull(output.getDataChildByName("data")); } + @Test + public void testGrouping() { + Module testModule = TestUtils.findModule(modules, "types2"); + Set groupings = testModule.getGroupings(); + assertEquals(1, groupings.size()); + GroupingDefinition grouping = groupings.iterator().next(); + Set children = grouping.getChildNodes(); + assertEquals(5, children.size()); + } + } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang index a4e5868c4f..d75fc63296 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang @@ -136,6 +136,36 @@ module types2 { } grouping target { + anyxml data { + config true; + description "Copy of the source datastore subset."; + mandatory false; + must "test-condition-text"; + reference "test-no-reference"; + status "obsolete"; + when "test-when-text"; + } + choice how { + description "test choice description"; + default interval; + case interval { + leaf interval { + type uint16; + default 30; + units minutes; + } + } + case daily { + leaf daily { + type empty; + } + leaf time-of-day { + type string; + units 24-hour-clock; + default 1am; + } + } + } leaf address { type string; description "Target IP address"; @@ -143,13 +173,21 @@ module types2 { container port { description "Target port container"; } - list addresses { key "id"; leaf id { type int8; } } + grouping target-inner { + description "target-inner default description"; + leaf inner-grouping-id { + type int8; + } + } + typedef group-type { + type my-decimal-type; + } } container peer { @@ -183,6 +221,13 @@ module types2 { 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"; + } } } }