From 7a2b8cc8408824e107b84f9872ead9267b709bd8 Mon Sep 17 00:00:00 2001 From: Martin Vitez Date: Tue, 20 Aug 2013 12:17:14 +0200 Subject: [PATCH] Fixed path correction process of nodes defined by uses statement. Signed-off-by: Martin Vitez --- .../yang/model/api/UnknownSchemaNode.java | 7 + .../parser/builder/api/UsesNodeBuilder.java | 2 + .../builder/impl/LeafSchemaNodeBuilder.java | 5 + .../parser/builder/impl/ModuleBuilder.java | 4 + .../impl/UnknownSchemaNodeBuilder.java | 39 ++++ .../builder/impl/UsesNodeBuilderImpl.java | 14 ++ .../yang/parser/impl/YangParserImpl.java | 198 ++++++++++-------- .../parser/impl/YangParserListenerImpl.java | 7 +- .../yangtools/yang/parser/util/CopyUtils.java | 41 +--- .../yang/parser/util/GroupingUtils.java | 36 +--- .../yang/parser/util/ParserUtils.java | 4 + .../impl/YangParserWithContextTest.java | 6 +- .../test/resources/context-test/test3.yang | 2 +- 13 files changed, 195 insertions(+), 170 deletions(-) diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UnknownSchemaNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UnknownSchemaNode.java index b279c5c312..e7f5d224b1 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UnknownSchemaNode.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UnknownSchemaNode.java @@ -17,4 +17,11 @@ public interface UnknownSchemaNode extends SchemaNode { boolean isAddedByUses(); + /** + * Get extension definition which identifies this node + * + * @return extension definition if exists, null otherwise + */ + ExtensionDefinition getExtensionDefinition(); + } 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 0965f64213..344d8623dc 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 @@ -71,6 +71,8 @@ public interface UsesNodeBuilder extends GroupingMember, Builder { void setTargetUnknownNodes(List targetUnknownNodes); + boolean isCopy(); + boolean isDataCollected(); void setDataCollected(boolean dataCollected); 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 3b6f2d3f6e..64759bf083 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 @@ -22,6 +22,7 @@ import org.opendaylight.yangtools.yang.parser.builder.api.AbstractTypeAwareBuild import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.GroupingMember; import org.opendaylight.yangtools.yang.parser.util.Comparators; +import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implements DataSchemaNodeBuilder, GroupingMember { @@ -62,6 +63,10 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem instance.setDefault(defaultStr); instance.setUnits(unitsStr); + if (type == null && typedef == null) { + throw new YangParseException(moduleName, line, "Failed to resolve leaf type."); + } + // TYPE if (type == null) { instance.setType(typedef.build()); 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 67471068db..71ff0717b9 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 @@ -255,6 +255,10 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return addedDeviations; } + public List getExtensions() { + return addedExtensions; + } + public List getAllUnknownNodes() { return allUnknownNodes; } 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 9f3855c0af..68e1cf4b74 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 @@ -12,6 +12,7 @@ import java.util.Collections; import java.util.List; import org.opendaylight.yangtools.yang.common.QName; +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; @@ -25,6 +26,9 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder { private QName nodeType; private String nodeParameter; + private ExtensionDefinition extensionDefinition; + private ExtensionBuilder extensionBuilder; + public UnknownSchemaNodeBuilder(final String moduleName, final int line, final QName qname) { super(moduleName, line, qname); instance = new UnknownSchemaNodeImpl(qname); @@ -41,6 +45,15 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder { instance.setStatus(status); instance.setAddedByUses(addedByUses); + // EXTENSION + if (extensionDefinition != null) { + instance.setExtensionDefinition(extensionDefinition); + } else { + if (extensionBuilder != null) { + instance.setExtensionDefinition(extensionBuilder.build()); + } + } + // UNKNOWN NODES if (unknownNodes == null) { unknownNodes = new ArrayList(); @@ -81,9 +94,26 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder { this.nodeParameter = nodeParameter; } + public ExtensionDefinition getExtensionDefinition() { + return extensionDefinition; + } + + public void setExtensionDefinition(final ExtensionDefinition extensionDefinition) { + this.extensionDefinition = extensionDefinition; + } + + public ExtensionBuilder getExtensionBuilder() { + return extensionBuilder; + } + + public void setExtensionBuilder(final ExtensionBuilder extension) { + this.extensionBuilder = extension; + } + private final class UnknownSchemaNodeImpl implements UnknownSchemaNode { private final QName qname; private SchemaPath path; + private ExtensionDefinition extension; private String description; private String reference; private Status status = Status.CURRENT; @@ -110,6 +140,15 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder { this.path = path; } + @Override + public ExtensionDefinition getExtensionDefinition() { + return extension; + } + + private void setExtensionDefinition(final ExtensionDefinition extension) { + this.extension = extension; + } + @Override public String getDescription() { return description; 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 7da9c5edff..05dd940551 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 @@ -52,9 +52,16 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo private Set targetTypedefs = new HashSet<>(); private List targetUnknownNodes = new ArrayList<>(); + private final boolean isCopy; private boolean dataCollected; private boolean parentUpdated; + + @Override + public boolean isCopy() { + return isCopy; + } + @Override public boolean isDataCollected() { return dataCollected; @@ -78,6 +85,13 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) { super(moduleName, line); this.groupingName = groupingName; + isCopy = false; + } + + public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName, final boolean isCopy) { + super(moduleName, line); + this.groupingName = groupingName; + this.isCopy = isCopy; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java index 2eff93d472..1021139555 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java @@ -21,6 +21,7 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -35,6 +36,7 @@ import org.opendaylight.yangtools.antlrv4.code.gen.YangLexer; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; +import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; @@ -53,6 +55,7 @@ import org.opendaylight.yangtools.yang.parser.builder.api.TypeAwareBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.DeviationBuilder; +import org.opendaylight.yangtools.yang.parser.builder.impl.ExtensionBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.IdentitySchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.IdentityrefTypeBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder; @@ -81,39 +84,33 @@ public final class YangParserImpl implements YangModelParser { @Override public Set parseYangModels(final List yangFiles, final SchemaContext context) { - // TODO - throw new YangParseException("Not yet implemented"); - // if (yangFiles != null) { - // final Map inputStreams = Maps.newHashMap(); - // - // for (final File yangFile : yangFiles) { - // try { - // inputStreams.put(new FileInputStream(yangFile), yangFile); - // } catch (FileNotFoundException e) { - // LOG.warn("Exception while reading yang file: " + yangFile.getName(), - // e); - // } - // } - // - // Map builderToStreamMap = - // Maps.newHashMap(); - // - // final Map> modules = - // resolveModuleBuilders( - // Lists.newArrayList(inputStreams.keySet()), builderToStreamMap); - // - // for (InputStream is : inputStreams.keySet()) { - // try { - // is.close(); - // } catch (IOException e) { - // LOG.debug("Failed to close stream."); - // } - // } - // - // return new LinkedHashSet(buildWithContext(modules, - // context).values()); - // } - // return Collections.emptySet(); + if (yangFiles != null) { + final Map inputStreams = Maps.newHashMap(); + + for (final File yangFile : yangFiles) { + try { + inputStreams.put(new FileInputStream(yangFile), yangFile); + } catch (FileNotFoundException e) { + LOG.warn("Exception while reading yang file: " + yangFile.getName(), e); + } + } + + Map builderToStreamMap = Maps.newHashMap(); + + final Map> modules = resolveModuleBuilders( + Lists.newArrayList(inputStreams.keySet()), builderToStreamMap); + + for (InputStream is : inputStreams.keySet()) { + try { + is.close(); + } catch (IOException e) { + LOG.debug("Failed to close stream."); + } + } + + return new LinkedHashSet(buildWithContext(modules, context).values()); + } + return Collections.emptySet(); } @Override @@ -123,18 +120,13 @@ public final class YangParserImpl implements YangModelParser { @Override public Set parseYangModelsFromStreams(final List yangModelStreams, SchemaContext context) { - // TODO - throw new YangParseException("Not yet implemented"); - // if (yangModelStreams != null) { - // Map builderToStreamMap = - // Maps.newHashMap(); - // final Map> modules = - // resolveModuleBuildersWithContext( - // yangModelStreams, builderToStreamMap, context); - // return new LinkedHashSet(buildWithContext(modules, - // context).values()); - // } - // return Collections.emptySet(); + if (yangModelStreams != null) { + Map builderToStreamMap = Maps.newHashMap(); + final Map> modules = resolveModuleBuildersWithContext( + yangModelStreams, builderToStreamMap, context); + return new LinkedHashSet(buildWithContext(modules, context).values()); + } + return Collections.emptySet(); } @Override @@ -228,8 +220,7 @@ public final class YangParserImpl implements YangModelParser { final SchemaContext context) { final ModuleBuilder[] builders = parseModuleBuilders(yangFileStreams, streamToBuilderMap); - // Linked Hash Map MUST be used because Linked Hash Map preserves ORDER - // of items stored in map. + // LinkedHashMap must be used to preserve order final LinkedHashMap> modules = new LinkedHashMap>(); // module dependency graph sorted @@ -294,7 +285,6 @@ public final class YangParserImpl implements YangModelParser { fixUnresolvedNodes(modules, moduleBuilder); } } - finishResolveDirtyNodes(modules); resolveAugments(modules); resolveUses(modules); @@ -325,7 +315,7 @@ public final class YangParserImpl implements YangModelParser { fixUnresolvedNodesWithContext(modules, moduleBuilder, context); } } - // TODO finishResolveDirtyNodesWithContext(modules, context) + finishResolveDirtyNodes(modules); resolveAugmentsWithContext(modules, context); resolveUsesWithContext(modules, context); resolveDeviationsWithContext(modules, context); @@ -409,9 +399,15 @@ public final class YangParserImpl implements YangModelParser { nodeToResolve.getType()); nodeToResolve.setType(idRef); } else { - TypeDefinitionBuilder tdb = CopyUtils.copy(nodeToResolve.getTypedef(), nodeToResolve, false); - ParserUtils.correctTypeAwareNodePath(tdb); - nodeToResolve.setTypedef(tdb); + if (nodeToResolve.getType() == null) { + TypeDefinitionBuilder tdb = CopyUtils.copy(nodeToResolve.getTypedef(), nodeToResolve, false); + ParserUtils.correctTypeAwareNodePath(tdb); + nodeToResolve.setTypedef(tdb); + } else { + TypeDefinition td = ParserUtils.createCorrectTypeDefinition(nodeToResolve.getPath(), + nodeToResolve.getType()); + nodeToResolve.setType(td); + } } } } @@ -567,26 +563,26 @@ public final class YangParserImpl implements YangModelParser { * * @param modules * all loaded modules - * @param augmentBuilder + * @param augment * augment to resolve * @param context * SchemaContext containing already resolved modules * @return true if target node found, false otherwise */ private boolean resolveAugmentWithContext(final Map> modules, - final AugmentationSchemaBuilder augmentBuilder, final SchemaContext context) { - if (augmentBuilder.isResolved()) { + final AugmentationSchemaBuilder augment, final SchemaContext context) { + if (augment.isResolved()) { return true; } - int line = augmentBuilder.getLine(); - ModuleBuilder module = getParentModule(augmentBuilder); - List path = augmentBuilder.getTargetPath().getPath(); + int line = augment.getLine(); + ModuleBuilder module = getParentModule(augment); + List path = augment.getTargetPath().getPath(); final QName firstNameInPath = path.get(0); String prefix = firstNameInPath.getPrefix(); if (prefix == null) { prefix = module.getPrefix(); } - Builder augmentParent = augmentBuilder.getParent(); + Builder augmentParent = augment.getParent(); Builder currentParent = null; if (augmentParent instanceof ModuleBuilder) { @@ -596,14 +592,14 @@ public final class YangParserImpl implements YangModelParser { currentParent = augmentParent.getParent(); } else { // augment can be defined only under module or uses - throw new YangParseException(augmentBuilder.getModuleName(), augmentBuilder.getLine(), + throw new YangParseException(augment.getModuleName(), augment.getLine(), "Error in augment parsing: Unresolved parent of augment: " + augmentParent); } if (currentParent == null) { - return processAugmentationOnContext(augmentBuilder, path, module, prefix, context); + return processAugmentationOnContext(augment, path, module, prefix, context); } else { - return processAugmentation(augmentBuilder, currentParent, path); + return processAugmentation(augment, currentParent, path); } } @@ -702,6 +698,9 @@ public final class YangParserImpl implements YangModelParser { * * @param modules * all loaded modules + * @param context + * SchemaContext containing already resolved modules or null if + * context is not available */ private void findUsesTargets(final Map> modules, final SchemaContext context) { final List allUses = new ArrayList<>(); @@ -773,9 +772,17 @@ public final class YangParserImpl implements YangModelParser { for (UsesNodeBuilder usesNode : allModulesUses) { GroupingUtils.fixUsesNodesPath(usesNode); } + + for (UsesNodeBuilder usesNode : allModulesUses) { + if (usesNode.isCopy()) { + usesNode.getParent().getUsesNodes().remove(usesNode); + } + } } /** + * Copy data from uses target, update uses parent and perform refinement. + * Augmentations have to be resolved already. * * @param modules * all loaded modules @@ -827,46 +834,53 @@ public final class YangParserImpl implements YangModelParser { private void resolveUnknownNodes(final Map> modules, final ModuleBuilder module) { for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) { QName nodeType = usnb.getNodeType(); - if (nodeType.getNamespace() == null || nodeType.getRevision() == null) { - try { - ModuleBuilder dependentModule = findDependentModuleBuilder(modules, module, nodeType.getPrefix(), - usnb.getLine()); - QName newNodeType = new QName(dependentModule.getNamespace(), dependentModule.getRevision(), - nodeType.getPrefix(), nodeType.getLocalName()); - usnb.setNodeType(newNodeType); - } catch (YangParseException e) { - LOG.debug(module.getName(), usnb.getLine(), "Failed to find unknown node type: " + nodeType); + try { + ModuleBuilder dependentModule = findDependentModuleBuilder(modules, module, nodeType.getPrefix(), + usnb.getLine()); + for (ExtensionBuilder extension : dependentModule.getExtensions()) { + if (extension.getQName().getLocalName().equals(nodeType.getLocalName())) { + usnb.setExtensionBuilder(extension); + break; + } } + } catch (YangParseException e) { + LOG.debug(module.getName(), usnb.getLine(), "Failed to find unknown node extension definition: " + + nodeType); } } } private void resolveUnknownNodesWithContext(final Map> modules, final ModuleBuilder module, final SchemaContext context) { - for (UnknownSchemaNodeBuilder unknownNodeBuilder : module.getAllUnknownNodes()) { - QName nodeType = unknownNodeBuilder.getNodeType(); - if (nodeType.getNamespace() == null || nodeType.getRevision() == null) { - try { - ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, - nodeType.getPrefix(), unknownNodeBuilder.getLine()); - - QName newNodeType = null; - if (dependentModuleBuilder == null) { - Module dependentModule = findModuleFromContext(context, module, nodeType.getPrefix(), - unknownNodeBuilder.getLine()); - newNodeType = new QName(dependentModule.getNamespace(), dependentModule.getRevision(), - nodeType.getPrefix(), nodeType.getLocalName()); - } else { - newNodeType = new QName(dependentModuleBuilder.getNamespace(), - dependentModuleBuilder.getRevision(), nodeType.getPrefix(), nodeType.getLocalName()); - } + for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) { + QName nodeType = usnb.getNodeType(); + try { + ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, + nodeType.getPrefix(), usnb.getLine()); - unknownNodeBuilder.setNodeType(newNodeType); - } catch (YangParseException e) { - LOG.debug(module.getName(), unknownNodeBuilder.getLine(), "Failed to find unknown node type: " - + nodeType); + if (dependentModuleBuilder == null) { + Module dependentModule = findModuleFromContext(context, module, nodeType.getPrefix(), + usnb.getLine()); + for (ExtensionDefinition e : dependentModule.getExtensionSchemaNodes()) { + if (e.getQName().getLocalName().equals(nodeType.getLocalName())) { + usnb.setExtensionDefinition(e); + break; + } + } + } else { + for (ExtensionBuilder extension : dependentModuleBuilder.getExtensions()) { + if (extension.getQName().getLocalName().equals(nodeType.getLocalName())) { + usnb.setExtensionBuilder(extension); + break; + } + } } + + } catch (YangParseException e) { + LOG.debug(module.getName(), usnb.getLine(), "Failed to find unknown node extension definition: " + + nodeType); } + } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java index 53ad43a32e..5607f0d53a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java @@ -55,6 +55,7 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.util.BaseTypes; import org.opendaylight.yangtools.yang.model.util.YangTypesConverter; import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.Builder; import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder; @@ -387,6 +388,8 @@ public final class YangParserListenerImpl extends YangParserBaseListener { addNodeToPath(qname); SchemaPath path = createActualSchemaPath(actualPath.peek()); UnionTypeBuilder unionBuilder = moduleBuilder.addUnionType(line, namespace, revision); + Builder parent = moduleBuilder.getActualNode(); + unionBuilder.setParent(parent); moduleBuilder.enterNode(unionBuilder); unionBuilder.setPath(path); } else if ("identityref".equals(typeName)) { @@ -782,9 +785,9 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String nodeTypeStr = ctx.getChild(0).getText(); final String[] splittedElement = nodeTypeStr.split(":"); if (splittedElement.length == 1) { - nodeType = new QName(null, null, yangModelPrefix, splittedElement[0]); + nodeType = new QName(namespace, revision, yangModelPrefix, splittedElement[0]); } else { - nodeType = new QName(null, null, splittedElement[0], splittedElement[1]); + nodeType = new QName(namespace, revision, splittedElement[0], splittedElement[1]); } QName qname; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java index 4b5d8dc566..225b471a55 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java @@ -349,40 +349,6 @@ public class CopyUtils { return copy; } - public static GroupingBuilder copyGroupingWithoutDeep(GroupingBuilder old, Builder newParent, boolean updateQName) { - DataBean data = getdata(old, newParent, updateQName); - QName newQName = data.qname; - SchemaPath newSchemaPath = data.schemaPath; - - GroupingBuilderImpl copy = new GroupingBuilderImpl(newParent.getModuleName(), newParent.getLine(), newQName); - copy.setParent(newParent); - copy.setPath(newSchemaPath); - copy.setDescription(old.getDescription()); - copy.setReference(old.getReference()); - copy.setStatus(old.getStatus()); - copy.setAddedByUses(old.isAddedByUses()); - copy.setChildNodes(old.getChildNodes()); - for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) { - copy.addChildNode(copy(childNode, copy, updateQName)); - } - copy.getGroupings().addAll(old.getGroupings()); - for (GroupingBuilder grouping : old.getGroupingBuilders()) { - copy.addGrouping(copy(grouping, copy, updateQName)); - } - for (TypeDefinitionBuilder tdb : old.getTypeDefinitionBuilders()) { - copy.addTypedef(copy(tdb, copy, updateQName)); - } - for (UsesNodeBuilder oldUses : old.getUsesNodes()) { - copy.addUsesNode(copyUses(oldUses, copy)); - - } - for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) { - copy.addUnknownNodeBuilder((copy(un, copy, updateQName))); - } - - return copy; - } - public static TypeDefinitionBuilder copy(TypeDefinitionBuilder old, Builder newParent, boolean updateQName) { DataBean data = getdata(old, newParent, updateQName); QName newQName = data.qname; @@ -446,7 +412,7 @@ public class CopyUtils { static UsesNodeBuilder copyUses(UsesNodeBuilder old, Builder newParent) { UsesNodeBuilder copy = new UsesNodeBuilderImpl(newParent.getModuleName(), newParent.getLine(), - old.getGroupingName()); + old.getGroupingName(), true); copy.setParent(newParent); copy.setGroupingPath(old.getGroupingPath()); // TODO grouping vs grouping path? @@ -464,7 +430,7 @@ public class CopyUtils { // add new uses to collection of uses in module ModuleBuilder module = ParserUtils.getParentModule(newParent); - module.addUsesNode(copy); + module.getAllUsesNodes().add(copy); return copy; } @@ -546,9 +512,6 @@ public class CopyUtils { newPath = new ArrayList<>(parent.getPath().getPath()); newPath.add(newQName); } else { - if(old == null) { - System.out.println(); - } newQName = old.getQName(); newPath = new ArrayList<>(parent.getPath().getPath()); newPath.add(newQName); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/GroupingUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/GroupingUtils.java index 9dda792c74..76795548d2 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/GroupingUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/GroupingUtils.java @@ -364,68 +364,40 @@ public class GroupingUtils { // child nodes Set currentChildNodes = parent.getChildNodeBuilders(); - Set toRemove = new HashSet<>(); - Set toAdd = new HashSet<>(); for (DataSchemaNodeBuilder child : currentChildNodes) { if (child instanceof GroupingMember) { GroupingMember gm = (GroupingMember) child; if (gm.isAddedByUses()) { - toRemove.add(child); - DataSchemaNodeBuilder copy = CopyUtils.copy(child, parent, true); - ParserUtils.correctNodePath(copy, parent.getPath()); - toAdd.add(copy); + ParserUtils.correctNodePath(child, parent.getPath()); } } } - currentChildNodes.removeAll(toRemove); - currentChildNodes.addAll(toAdd); // groupings Set currentGroupings = parent.getGroupingBuilders(); - Set toRemoveG = new HashSet<>(); - Set toAddG = new HashSet<>(); for (GroupingBuilder child : currentGroupings) { if (child.isAddedByUses()) { - toRemoveG.add(child); - GroupingBuilder copy = CopyUtils.copy(child, parent, true); - ParserUtils.correctNodePath(copy, parent.getPath()); - toAddG.add(copy); + ParserUtils.correctNodePath(child, parent.getPath()); } } - currentGroupings.removeAll(toRemoveG); - currentGroupings.addAll(toAddG); // typedefs Set currentTypedefs = parent.getTypeDefinitionBuilders(); - Set toRemoveTD = new HashSet<>(); - Set toAddTD = new HashSet<>(); for (TypeDefinitionBuilder child : currentTypedefs) { if (child.isAddedByUses()) { - toRemoveTD.add(child); - TypeDefinitionBuilder copy = CopyUtils.copy(child, parent, true); - ParserUtils.correctNodePath(copy, parent.getPath()); - toAddTD.add(copy); + ParserUtils.correctNodePath(child, parent.getPath()); } } - currentTypedefs.removeAll(toRemoveTD); - currentTypedefs.addAll(toAddTD); // unknown nodes List currentUN = parent.getUnknownNodeBuilders(); - List toRemoveUN = new ArrayList<>(); - List toAddUN = new ArrayList<>(); for (UnknownSchemaNodeBuilder un : currentUN) { if (un.isAddedByUses()) { - toRemoveUN.add(un); - UnknownSchemaNodeBuilder copy = CopyUtils.copy(un, parent, true); - ParserUtils.correctNodePath(copy, parent.getPath()); - toAddUN.add(copy); + ParserUtils.correctNodePath(un, parent.getPath()); } } - currentUN.removeAll(toRemoveUN); - currentUN.addAll(toAddUN); } /** diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.java index 2cd239b438..b6ca8583e4 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.java @@ -641,6 +641,10 @@ public final class ParserUtils { * @return builder of module where this node is defined */ public static ModuleBuilder getParentModule(Builder node) { + if(node instanceof ModuleBuilder) { + return (ModuleBuilder)node; + } + Builder parent = node.getParent(); while (!(parent instanceof ModuleBuilder)) { parent = parent.getParent(); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserWithContextTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserWithContextTest.java index 6117b25696..e2b79a989f 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserWithContextTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserWithContextTest.java @@ -20,7 +20,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.junit.Ignore; import org.junit.Test; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode; @@ -45,7 +44,6 @@ import org.opendaylight.yangtools.yang.model.util.ExtendedType; import com.google.common.collect.Lists; -@Ignore public class YangParserWithContextTest { private final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); private final YangParserImpl parser = new YangParserImpl(); @@ -318,8 +316,8 @@ public class YangParserWithContextTest { UnknownSchemaNode un = unknownNodes.get(0); QName unType = un.getNodeType(); - assertEquals(URI.create("urn:custom.types.demo"), unType.getNamespace()); - assertEquals(simpleDateFormat.parse("2012-04-16"), unType.getRevision()); + assertEquals(URI.create("urn:simple.demo.test3"), unType.getNamespace()); + assertEquals(simpleDateFormat.parse("2013-06-18"), unType.getRevision()); assertEquals("custom", unType.getPrefix()); assertEquals("mountpoint", unType.getLocalName()); assertEquals("point", un.getNodeParameter()); diff --git a/yang/yang-parser-impl/src/test/resources/context-test/test3.yang b/yang/yang-parser-impl/src/test/resources/context-test/test3.yang index b597aab478..01e7c7a03d 100644 --- a/yang/yang-parser-impl/src/test/resources/context-test/test3.yang +++ b/yang/yang-parser-impl/src/test/resources/context-test/test3.yang @@ -10,7 +10,7 @@ module test3 { organization "opendaylight"; contact "WILL-BE-DEFINED-LATER"; - revision 2013-06-18 { + revision 2013-06-18 { } identity pt { -- 2.36.6