From 85a9a2f03fba2912e6824d546c7b250c442b201a Mon Sep 17 00:00:00 2001 From: Martin Vitez Date: Wed, 23 Jul 2014 14:52:14 +0200 Subject: [PATCH] BUG-1382: eliminate use of QName.getPrefix from yang parser Updated tests - removed tests on QName's prefix. Please do not merge before https://git.opendaylight.org/gerrit/#/c/9640/ is merged. Change-Id: I41b8940965631609074c5bb8e4c2e0538a33f6a9 Signed-off-by: Martin Vitez --- .../api/AugmentationSchemaBuilder.java | 15 - .../parser/builder/api/TypeAwareBuilder.java | 4 + .../parser/builder/api/UsesNodeBuilder.java | 6 +- .../impl/AugmentationSchemaBuilderImpl.java | 47 +-- .../parser/builder/impl/BuilderUtils.java | 146 ++++++--- .../yang/parser/builder/impl/CopyUtils.java | 7 +- .../parser/builder/impl/DeviationBuilder.java | 33 +- .../parser/builder/impl/GroupingUtils.java | 65 +--- .../parser/builder/impl/ModuleBuilder.java | 16 +- .../impl/TypeDefinitionBuilderImpl.java | 4 +- .../yang/parser/builder/impl/TypeUtils.java | 196 ++--------- .../parser/builder/impl/UnionTypeBuilder.java | 12 +- .../impl/UnknownSchemaNodeBuilderImpl.java | 161 ++++------ .../builder/impl/UsesNodeBuilderImpl.java | 20 +- .../util/AbstractTypeAwareBuilder.java | 12 + .../yang/parser/impl/ParserListenerUtils.java | 89 +++-- .../yang/parser/impl/YangParserImpl.java | 303 ++++++------------ .../parser/impl/YangParserListenerImpl.java | 141 +++++--- .../impl/util/YangModelDependencyInfo.java | 4 +- .../repo/SharedSchemaContextFactory.java | 13 +- .../yang/parser/impl/Bug1412Test.java | 8 +- .../yang/parser/impl/TypesResolutionTest.java | 6 +- .../parser/impl/YangParserSimpleTest.java | 5 +- .../yang/parser/impl/YangParserTest.java | 25 -- .../impl/YangParserWithContextTest.java | 5 - 25 files changed, 545 insertions(+), 798 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java index 696e586122..1699da75ab 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java @@ -60,21 +60,6 @@ public interface AugmentationSchemaBuilder extends DataNodeContainerBuilder,Docu */ SchemaPath getTargetPath(); - /** - * Get schema path of target node. - * - * @return SchemaPath of target node - */ - SchemaPath getTargetNodeSchemaPath(); - - /** - * Set schema path of target node. - * - * @param path - * SchemaPath of target node - */ - void setTargetNodeSchemaPath(SchemaPath path); - @Override AugmentationSchema build(); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/TypeAwareBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/TypeAwareBuilder.java index c4f7e1386a..72a12c5860 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/TypeAwareBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/TypeAwareBuilder.java @@ -17,6 +17,10 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition; */ public interface TypeAwareBuilder extends Builder { + QName getTypeQName(); + + void setTypeQName(QName qname); + /** * Get qname of this node. * 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 f24e1695d8..268ca0cd2a 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 @@ -27,11 +27,11 @@ public interface UsesNodeBuilder extends GroupingMember { DataNodeContainerBuilder getParent(); /** - * Get grouping path as string. + * Get target grouping path. * - * @return grouping path as String + * @return target grouping path */ - String getGroupingPathAsString(); + SchemaPath getTargetGroupingPath(); /** * Get grouping path. diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java index 18497d7f5d..5d93a06579 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java @@ -11,13 +11,10 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; - import java.net.URI; -import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; - import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.NamespaceRevisionAware; @@ -28,7 +25,6 @@ import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl; 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.UnknownSchemaNodeBuilder; -import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainer; import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainerBuilder; @@ -39,16 +35,16 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDocumentedDataN private final String augmentTargetStr; private final SchemaPath targetPath; - private SchemaPath targetNodeSchemaPath; private boolean resolved; private AugmentationSchemaBuilder copyOf; - public AugmentationSchemaBuilderImpl(final String moduleName, final int line, final String augmentTargetStr, final int order) { + public AugmentationSchemaBuilderImpl(final String moduleName, final int line, final String augmentTargetStr, + final SchemaPath targetPath, final int order) { super(moduleName, line, null); this.order = order; this.augmentTargetStr = augmentTargetStr; - targetPath = BuilderUtils.parseXPathString(augmentTargetStr); + this.targetPath = targetPath; } @Override @@ -58,7 +54,12 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDocumentedDataN @Override public SchemaPath getPath() { - return targetNodeSchemaPath; + return targetPath; + } + + @Override + public SchemaPath getTargetPath() { + return targetPath; } @Override @@ -68,6 +69,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDocumentedDataN } buildChildren(); + instance = new AugmentationSchemaImpl(targetPath, order,this); Builder parent = getParent(); @@ -77,18 +79,6 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDocumentedDataN instance.revision = moduleBuilder.getRevision(); } - if (parent instanceof UsesNodeBuilder) { - final ModuleBuilder mb = BuilderUtils.getParentModule(this); - - List newPath = new ArrayList<>(); - for (QName name : targetPath.getPathFromRoot()) { - newPath.add(QName.create(mb.getQNameModule(), name.getPrefix(), name.getLocalName())); - } - instance.targetPath = SchemaPath.create(newPath, false); - } else { - instance.targetPath = targetNodeSchemaPath; - } - if (copyOf != null) { instance.setCopyOf(copyOf.build()); } @@ -135,21 +125,6 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDocumentedDataN return augmentTargetStr; } - @Override - public SchemaPath getTargetPath() { - return targetPath; - } - - @Override - public SchemaPath getTargetNodeSchemaPath() { - return targetNodeSchemaPath; - } - - @Override - public void setTargetNodeSchemaPath(final SchemaPath path) { - this.targetNodeSchemaPath = path; - } - @Override public int getOrder() { return order; @@ -208,7 +183,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDocumentedDataN private static final class AugmentationSchemaImpl extends AbstractDocumentedDataNodeContainer implements AugmentationSchema, NamespaceRevisionAware, Comparable { private final int order; - private SchemaPath targetPath; + private final SchemaPath targetPath; private RevisionAwareXPath whenCondition; private URI namespace; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/BuilderUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/BuilderUtils.java index 2ce662647a..8d86dfd3c4 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/BuilderUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/BuilderUtils.java @@ -12,16 +12,20 @@ import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.Collections2; +import com.google.common.collect.Iterables; import com.google.common.io.ByteSource; - import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.net.URI; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; @@ -29,10 +33,13 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; - +import org.antlr.v4.runtime.tree.ParseTree; import org.apache.commons.io.IOUtils; +import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Module_header_stmtsContext; +import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Module_stmtContext; +import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Namespace_stmtContext; +import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Revision_stmtsContext; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; import org.opendaylight.yangtools.yang.model.api.ChoiceNode; @@ -60,6 +67,8 @@ import org.opendaylight.yangtools.yang.parser.builder.api.GroupingMember; import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder; +import org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils; +import org.opendaylight.yangtools.yang.parser.impl.util.YangModelDependencyInfo; import org.opendaylight.yangtools.yang.parser.util.NamedByteArrayInputStream; import org.opendaylight.yangtools.yang.parser.util.NamedFileInputStream; import org.opendaylight.yangtools.yang.parser.util.YangParseException; @@ -68,6 +77,7 @@ import org.slf4j.LoggerFactory; public final class BuilderUtils { + private static final DateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); private static final Logger LOG = LoggerFactory.getLogger(BuilderUtils.class); private static final Splitter SLASH_SPLITTER = Splitter.on('/').omitEmptyStrings(); private static final Splitter COLON_SPLITTER = Splitter.on(':'); @@ -169,6 +179,26 @@ public final class BuilderUtils { return dependentModule; } + public static ModuleBuilder findModuleFromBuilders(ModuleImport imp, Iterable modules) { + String name = imp.getModuleName(); + Date revision = imp.getRevision(); + TreeMap map = new TreeMap<>(); + for (ModuleBuilder module : modules) { + if (module != null) { + if (module.getName().equals(name)) { + map.put(module.getRevision(), module); + } + } + } + if (map.isEmpty()) { + return null; + } + if (revision == null) { + return map.lastEntry().getValue(); + } + return map.get(revision); + } + /** * Find module from context based on prefix. * @@ -219,32 +249,6 @@ public final class BuilderUtils { return result; } - /** - * Parse XPath string. - * - * @param xpathString - * XPath as String - * @return SchemaPath from given String - */ - public static SchemaPath parseXPathString(final String xpathString) { - final boolean absolute = !xpathString.isEmpty() && xpathString.charAt(0) == '/'; - - final List path = new ArrayList<>(); - for (String pathElement : SLASH_SPLITTER.split(xpathString)) { - final Iterator it = COLON_SPLITTER.split(pathElement).iterator(); - final String s = it.next(); - - final QName name; - if (it.hasNext()) { - name = QName.create(QNameModule.create(null, null), s, it.next()); - } else { - name = QName.create(QNameModule.create(null, null), s); - } - path.add(name); - } - return SchemaPath.create(path, absolute); - } - /** * Add all augment's child nodes to given target. * @@ -357,12 +361,13 @@ public final class BuilderUtils { } } - public static DataSchemaNodeBuilder findSchemaNode(final List path, final SchemaNodeBuilder parentNode) { + public static DataSchemaNodeBuilder findSchemaNode(final Iterable path, final SchemaNodeBuilder parentNode) { DataSchemaNodeBuilder node = null; SchemaNodeBuilder parent = parentNode; + int size = Iterables.size(path); int i = 0; - while (i < path.size()) { - String name = path.get(i).getLocalName(); + for (QName qname : path) { + String name = qname.getLocalName(); if (parent instanceof DataNodeContainerBuilder) { node = ((DataNodeContainerBuilder) parent).getDataChildByName(name); } else if (parent instanceof ChoiceBuilder) { @@ -379,7 +384,7 @@ public final class BuilderUtils { return null; } - if (i < path.size() - 1) { + if (i < size - 1) { parent = node; } i = i + 1; @@ -593,7 +598,7 @@ public final class BuilderUtils { */ public static boolean processAugmentation(final AugmentationSchemaBuilder augment, final ModuleBuilder firstNodeParent) { - Optional potentialTargetNode = findSchemaNodeInModule(augment.getTargetNodeSchemaPath(), + Optional potentialTargetNode = findSchemaNodeInModule(augment.getTargetPath(), firstNodeParent); if (!potentialTargetNode.isPresent()) { return false; @@ -607,8 +612,8 @@ public final class BuilderUtils { return true; } - public static IdentitySchemaNodeBuilder findBaseIdentity(final Map> modules, - final ModuleBuilder module, final String baseString, final int line) { + public static IdentitySchemaNodeBuilder findBaseIdentity(final ModuleBuilder module, final String baseString, + final int line) { // FIXME: optimize indexOf() away? if (baseString.indexOf(':') != -1) { @@ -756,4 +761,73 @@ public final class BuilderUtils { } } + public static ModuleBuilder findModule(final QName qname, final Map> modules) { + TreeMap map = modules.get(qname.getNamespace()); + if (map == null) { + return null; + } + if (qname.getRevision() == null) { + return map.lastEntry().getValue(); + } + return map.get(qname.getRevision()); + } + + public static Map> createYangNamespaceContext( + final Collection modules, final Optional context) { + Map> map = new HashMap<>(); + for (ParseTree module : modules) { + for (int i = 0; i < module.getChildCount(); i++) { + ParseTree moduleTree = module.getChild(i); + if (moduleTree instanceof Module_stmtContext) { + Module_stmtContext moduleCtx = (Module_stmtContext) moduleTree; + final String moduleName = ParserListenerUtils.stringFromNode(moduleCtx); + Date rev = null; + URI namespace = null; + for (int j = 0; j < moduleCtx.getChildCount(); j++) { + ParseTree moduleCtxChildTree = moduleCtx.getChild(j); + if (moduleCtxChildTree instanceof Revision_stmtsContext) { + String revisionDateStr = YangModelDependencyInfo + .getLatestRevision((Revision_stmtsContext) moduleCtxChildTree); + if (revisionDateStr == null) { + rev = new Date(0); + } else { + rev = QName.parseRevision(revisionDateStr); + } + } + if (moduleCtxChildTree instanceof Module_header_stmtsContext) { + Module_header_stmtsContext headerCtx = (Module_header_stmtsContext) moduleCtxChildTree; + for (int k = 0; k < headerCtx.getChildCount(); k++) { + ParseTree ctx = headerCtx.getChild(k); + if (ctx instanceof Namespace_stmtContext) { + final String namespaceStr = ParserListenerUtils.stringFromNode(ctx); + namespace = URI.create(namespaceStr); + break; + } + } + } + } + TreeMap revToNs = map.get(moduleName); + if (revToNs == null) { + revToNs = new TreeMap<>(); + revToNs.put(rev, namespace); + map.put(moduleName, revToNs); + } + revToNs.put(rev, namespace); + } + } + } + if (context.isPresent()) { + for (Module module : context.get().getModules()) { + TreeMap revToNs = map.get(module.getName()); + if (revToNs == null) { + revToNs = new TreeMap<>(); + revToNs.put(module.getRevision(), module.getNamespace()); + map.put(module.getName(), revToNs); + } + revToNs.put(module.getRevision(), module.getNamespace()); + } + } + return map; + } + } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/CopyUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/CopyUtils.java index 365c34379e..cb72d9a2a4 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/CopyUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/CopyUtils.java @@ -389,7 +389,7 @@ public final class CopyUtils { private static UsesNodeBuilder copyUses(final UsesNodeBuilder old, final Builder newParent) { UsesNodeBuilder copy = new UsesNodeBuilderImpl(newParent.getModuleName(), newParent.getLine(), - old.getGroupingPathAsString()); + old.getGroupingPath()); copy.setParent(newParent); copy.setGroupingDefinition(old.getGroupingDefinition()); copy.setGrouping(old.getGroupingBuilder()); @@ -403,14 +403,13 @@ public final class CopyUtils { private static AugmentationSchemaBuilder copyAugment(final AugmentationSchemaBuilder old, final Builder newParent) { AugmentationSchemaBuilderImpl copy = new AugmentationSchemaBuilderImpl(newParent.getModuleName(), - newParent.getLine(), old.getTargetPathAsString(), old.getOrder()); + newParent.getLine(), old.getTargetPathAsString(), old.getTargetPath(), old.getOrder()); copy.setParent(newParent); copy.setCopyOf(old); copy.setDescription(old.getDescription()); copy.setReference(old.getReference()); copy.setStatus(old.getStatus()); copy.addWhenCondition(old.getWhenCondition()); - copy.setTargetNodeSchemaPath(old.getTargetNodeSchemaPath()); for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) { copy.addChildNode(copy(childNode, copy, false)); } @@ -470,7 +469,7 @@ public final class CopyUtils { } else { newQName = old.getQName(); } - newSchemaPath = augment.getTargetNodeSchemaPath().createChild(newQName); + newSchemaPath = augment.getTargetPath().createChild(newQName); } else if (newParent instanceof SchemaNodeBuilder) { SchemaNodeBuilder parent = (SchemaNodeBuilder) newParent; QName parentQName = parent.getQName(); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java index 8b18ba41b7..afc16c5c0b 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java @@ -19,33 +19,25 @@ import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class DeviationBuilder extends AbstractBuilder { private DeviationImpl instance; - private final String targetPathStr; - private SchemaPath targetPath; + private final SchemaPath targetPath; private Deviate deviate; private String reference; - DeviationBuilder(final String moduleName, final int line, final String targetPathStr) { + DeviationBuilder(final String moduleName, final int line, final SchemaPath targetPath) { super(moduleName, line); - if (!targetPathStr.startsWith("/")) { - throw new YangParseException(moduleName, line, - "Deviation argument string must be an absolute schema node identifier."); - } - this.targetPathStr = targetPathStr; - this.targetPath = BuilderUtils.parseXPathString(targetPathStr); + this.targetPath = targetPath; } @Override public Deviation build() { - if (targetPath == null) { - throw new YangParseException(getModuleName(), getLine(), "Unresolved deviation target"); - } - if (instance != null) { return instance; } + if (targetPath == null) { + throw new YangParseException(getModuleName(), getLine(), "Unresolved deviation target"); + } - instance = new DeviationImpl(); - instance.targetPath = targetPath; + instance = new DeviationImpl(targetPath); instance.deviate = deviate; instance.reference = reference; @@ -62,10 +54,6 @@ public final class DeviationBuilder extends AbstractBuilder { return targetPath; } - public void setTargetPath(final SchemaPath targetPath) { - this.targetPath = targetPath; - } - public void setDeviate(final String deviate) { if ("not-supported".equals(deviate)) { this.deviate = Deviate.NOT_SUPPORTED; @@ -86,16 +74,17 @@ public final class DeviationBuilder extends AbstractBuilder { @Override public String toString() { - return "deviation " + targetPathStr; + return "deviation " + targetPath; } private static final class DeviationImpl implements Deviation { - private SchemaPath targetPath; + private final SchemaPath targetPath; private Deviate deviate; private String reference; private ImmutableList unknownNodes; - private DeviationImpl() { + private DeviationImpl(final SchemaPath targetPath) { + this.targetPath = targetPath; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingUtils.java index 12dabc1a6a..8b41ac4f53 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingUtils.java @@ -8,12 +8,14 @@ package org.opendaylight.yangtools.yang.parser.builder.impl; import com.google.common.base.Splitter; +import java.net.URI; import java.util.Comparator; import java.util.Date; -import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.parser.builder.api.Builder; import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder; @@ -23,47 +25,11 @@ import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class GroupingUtils { - private static final Splitter COLON_SPLITTER = Splitter.on(':'); private static final Splitter SLASH_SPLITTER = Splitter.on('/'); private GroupingUtils() { } - /** - * Common string splitter. Given a string representation of a grouping's - * name, it creates a prefix/name pair and returns it. - * - * @param groupingString - * Grouping string reference - * @param module - * Module which we are processing - * @param line - * Module line which we are processing - * @return An array of two strings, first one is the module prefix, the - * second is the grouping name. - */ - private static String[] getPrefixAndName(final String groupingString, final ModuleBuilder module, final int line) { - final String[] ret = new String[2]; - - if (groupingString.indexOf(':') != -1) { - if (groupingString.indexOf('/') != -1) { - throw new YangParseException(module.getName(), line, "Invalid name of target grouping"); - } - - final Iterator split = COLON_SPLITTER.split(groupingString).iterator(); - ret[0] = split.next(); - ret[1] = split.next(); - if (split.hasNext()) { - throw new YangParseException(module.getName(), line, "Invalid name of target grouping"); - } - } else { - ret[0] = module.getPrefix(); - ret[1] = groupingString; - } - - return ret; - } - /** * Search given modules for grouping by name defined in uses node. * @@ -76,28 +42,15 @@ public final class GroupingUtils { * @return grouping with given name if found, null otherwise */ public static GroupingBuilder getTargetGroupingFromModules(final UsesNodeBuilder usesBuilder, - final Map> modules, final ModuleBuilder module) { + final Map> modules, final ModuleBuilder module) { final int line = usesBuilder.getLine(); - final String[] split = getPrefixAndName(usesBuilder.getGroupingPathAsString(), module, line); - final String groupingPrefix = split[0]; - final String groupingName = split[1]; - final ModuleBuilder dependentModule; - - if (groupingPrefix == null) { - dependentModule = module; - } else if (groupingPrefix.equals(module.getPrefix())) { - dependentModule = module; - } else { - dependentModule = BuilderUtils.findModuleFromBuilders(modules, module, groupingPrefix, line); - } - - if (dependentModule == null) { - return null; - } + SchemaPath groupingPath = usesBuilder.getTargetGroupingPath(); + QName groupingName = groupingPath.getPathFromRoot().iterator().next(); + ModuleBuilder dependentModule = BuilderUtils.findModule(groupingName, modules); Set groupings = dependentModule.getGroupingBuilders(); - GroupingBuilder result = findGroupingBuilder(groupings, groupingName); + GroupingBuilder result = findGroupingBuilder(groupings, groupingName.getLocalName()); if (result != null) { return result; } @@ -109,7 +62,7 @@ public final class GroupingUtils { } else if (parent instanceof RpcDefinitionBuilder) { groupings = ((RpcDefinitionBuilder) parent).getGroupings(); } - result = findGroupingBuilder(groupings, groupingName); + result = findGroupingBuilder(groupings, groupingName.getLocalName()); if (result == null) { parent = parent.getParent(); } else { 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 db1babd6dc..12475fd3c1 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 @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.parser.builder.impl; import com.google.common.base.Preconditions; import com.google.common.io.ByteSource; - import java.io.IOException; import java.io.InputStream; import java.net.URI; @@ -24,7 +23,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; - import org.apache.commons.io.IOUtils; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; @@ -528,9 +526,11 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im return builder; } - public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr, final int order) { + public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr, + final SchemaPath targetPath, final int order) { checkNotSealed(); - final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr, order); + final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr, + targetPath, order); Builder parent = getActualNode(); builder.setParent(parent); @@ -562,9 +562,9 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im return builder; } - public UsesNodeBuilder addUsesNode(final int line, final String groupingPathStr) { + public UsesNodeBuilder addUsesNode(final int line, final SchemaPath grouping) { checkNotSealed(); - final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(name, line, groupingPathStr); + final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(name, line, grouping); Builder parent = getActualNode(); usesBuilder.setParent(parent); @@ -573,7 +573,7 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im addUsesNode(usesBuilder); } else { if (!(parent instanceof DataNodeContainerBuilder)) { - throw new YangParseException(name, line, "Unresolved parent of uses '" + groupingPathStr + "'."); + throw new YangParseException(name, line, "Unresolved parent of uses '" + grouping + "'."); } ((DataNodeContainerBuilder) parent).addUsesNode(usesBuilder); } @@ -826,7 +826,7 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im } } - public DeviationBuilder addDeviation(final int line, final String targetPath) { + public DeviationBuilder addDeviation(final int line, final SchemaPath targetPath) { Builder parent = getActualNode(); if (!(parent.equals(this))) { throw new YangParseException(name, line, "deviation can be defined only in module or submodule"); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java index 07afa895d3..2d2b642003 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java @@ -7,6 +7,7 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; import java.util.Collections; import java.util.List; @@ -74,7 +75,8 @@ public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder im type = typedef.build(); } - typeBuilder = new ExtendedType.Builder(qname, type, description, reference, schemaPath); + typeBuilder = ExtendedType.builder(qname, type, Optional.fromNullable(description), + Optional.fromNullable(reference), schemaPath); typeBuilder.status(status); typeBuilder.units(units); typeBuilder.defaultValue(defaultValue); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeUtils.java index d59b0215a6..ad1afc255b 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeUtils.java @@ -9,9 +9,8 @@ package org.opendaylight.yangtools.yang.parser.builder.impl; import static org.opendaylight.yangtools.yang.parser.builder.impl.BuilderUtils.findBaseIdentity; -import java.util.ArrayList; +import java.net.URI; import java.util.Date; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -21,10 +20,8 @@ import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition; import org.opendaylight.yangtools.yang.model.util.ExtendedType; -import org.opendaylight.yangtools.yang.model.util.UnknownType; import org.opendaylight.yangtools.yang.parser.builder.api.Builder; import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.TypeAwareBuilder; @@ -52,13 +49,12 @@ public final class TypeUtils { * current module */ public static void resolveType(final TypeAwareBuilder nodeToResolve, - final Map> modules, final ModuleBuilder module) { - final TypeDefinition nodeToResolveType = nodeToResolve.getType(); - final QName unknownTypeQName = nodeToResolveType.getBaseType().getQName(); - final ModuleBuilder dependentModuleBuilder = BuilderUtils.getModuleByPrefix(module, unknownTypeQName.getPrefix()); + final Map> modules, final ModuleBuilder module) { + QName unknownTypeQName = nodeToResolve.getTypeQName(); + final ModuleBuilder dependentModuleBuilder = BuilderUtils.findModule(unknownTypeQName, modules); if (dependentModuleBuilder == null) { - throw new YangParseException(module.getName(), nodeToResolve.getLine(), "No module found for import " - + unknownTypeQName.getPrefix()); + throw new YangParseException(module.getName(), nodeToResolve.getLine(), "Type not found: " + + unknownTypeQName); } TypeDefinitionBuilder resolvedType = findUnknownTypeDefinition(nodeToResolve, dependentModuleBuilder, modules, module); @@ -76,23 +72,12 @@ public final class TypeUtils { * current module */ public static void resolveTypeUnion(final UnionTypeBuilder union, - final Map> modules, final ModuleBuilder module) { - final List> unionTypes = union.getTypes(); - final List> toRemove = new ArrayList<>(); - for (TypeDefinition unionType : unionTypes) { - if (unionType instanceof UnknownType) { - resolveUnionUnknownType(union, (UnknownType) unionType, modules, module); - toRemove.add(unionType); - } else if (unionType instanceof ExtendedType && unionType.getBaseType() instanceof UnknownType) { - resolveUnionUnknownType(union, (ExtendedType) unionType, modules, module); - toRemove.add(unionType); - } - } + final Map> modules, final ModuleBuilder module) { // special handling for identityref types under union for (TypeDefinitionBuilder unionType : union.getTypedefs()) { if (unionType instanceof IdentityrefTypeBuilder) { IdentityrefTypeBuilder idref = (IdentityrefTypeBuilder) unionType; - IdentitySchemaNodeBuilder identity = findBaseIdentity(modules, module, idref.getBaseString(), + IdentitySchemaNodeBuilder identity = findBaseIdentity(module, idref.getBaseString(), idref.getLine()); if (identity == null) { throw new YangParseException(module.getName(), idref.getLine(), "Failed to find base identity"); @@ -100,34 +85,16 @@ public final class TypeUtils { idref.setBaseIdentity(identity); } } - unionTypes.removeAll(toRemove); - } + for (QName unknownTypeQName : union.getBaseTypeQNames()) { + final ModuleBuilder dependentModuleBuilder = BuilderUtils.findModule(unknownTypeQName, modules); + if (dependentModuleBuilder == null) { + throw new YangParseException(module.getName(), union.getLine(), "Type not found: " + unknownTypeQName); + } - private static void resolveUnionUnknownType(final UnionTypeBuilder union, final UnknownType ut, - final Map> modules, final ModuleBuilder module) { - final QName utQName = ut.getQName(); - final ModuleBuilder dependentModuleBuilder = BuilderUtils.getModuleByPrefix(module, utQName.getPrefix()); - if (dependentModuleBuilder == null) { - throw new YangParseException(module.getName(), union.getLine(), "No module found with prefix " - + utQName.getPrefix()); + final TypeDefinitionBuilder targetTypeBuilder = findTypeDefinitionBuilder(union, dependentModuleBuilder, + unknownTypeQName.getLocalName(), module.getName(), union.getLine()); + union.setTypedef(targetTypeBuilder); } - final TypeDefinitionBuilder resolvedType = findTypeDefinitionBuilder(union, dependentModuleBuilder, - utQName.getLocalName(), module.getName(), union.getLine()); - union.setTypedef(resolvedType); - } - - private static void resolveUnionUnknownType(final UnionTypeBuilder union, final ExtendedType extType, - final Map> modules, final ModuleBuilder module) { - final int line = union.getLine(); - final TypeDefinition extTypeBase = extType.getBaseType(); - final UnknownType ut = (UnknownType) extTypeBase; - final QName utQName = ut.getQName(); - final ModuleBuilder dependentModuleBuilder = BuilderUtils.getModuleByPrefix(module, utQName.getPrefix()); - final TypeDefinitionBuilder targetTypeBuilder = findTypeDefinitionBuilder(union, dependentModuleBuilder, - utQName.getLocalName(), module.getName(), line); - final TypeDefinitionBuilder newType = extendedTypeWithNewBase(targetTypeBuilder, null, extType, modules, - module, line); - union.setTypedef(newType); } /** @@ -144,29 +111,19 @@ public final class TypeUtils { * @return TypeDefinitionBuilder of node type */ private static TypeDefinitionBuilder findUnknownTypeDefinition(final TypeAwareBuilder nodeToResolve, - final ModuleBuilder dependentModuleBuilder, final Map> modules, + final ModuleBuilder dependentModuleBuilder, final Map> modules, final ModuleBuilder module) { final int line = nodeToResolve.getLine(); - final TypeDefinition nodeToResolveType = nodeToResolve.getType(); - final QName unknownTypeQName = nodeToResolveType.getBaseType().getQName(); + final QName unknownTypeQName = nodeToResolve.getTypeQName(); final TypeDefinitionBuilder targetTypeBuilder = findTypeDefinitionBuilder(nodeToResolve, dependentModuleBuilder, unknownTypeQName.getLocalName(), module.getName(), line); - TypeDefinitionBuilder resolvedType; - if (nodeToResolveType instanceof ExtendedType) { - final ExtendedType extType = (ExtendedType) nodeToResolveType; - resolvedType = extendedTypeWithNewBase(targetTypeBuilder, null, extType, modules, module, - nodeToResolve.getLine()); - } else { - resolvedType = targetTypeBuilder; - } - // validate constraints final TypeConstraints constraints = findConstraintsFromTypeBuilder(nodeToResolve, new TypeConstraints(module.getName(), nodeToResolve.getLine()), modules, module); constraints.validateConstraints(); - return resolvedType; + return targetTypeBuilder; } /** @@ -217,91 +174,8 @@ public final class TypeUtils { return constraints; } - /** - * Create new type builder based on old type with new base type. Note: only - * one of newBaseTypeBuilder or newBaseType can be specified. - * - * @param newBaseTypeBuilder - * new base type builder or null - * @param newBaseType - * new base type or null - * @param oldExtendedType - * old type - * @param modules - * all loaded modules - * @param module - * current module - * @param line - * current line in module - * @return new type builder based on old type with new base type - */ - private static TypeDefinitionBuilder extendedTypeWithNewBase(final TypeDefinitionBuilder newBaseTypeBuilder, - final TypeDefinition newBaseType, final ExtendedType oldExtendedType, - final Map> modules, final ModuleBuilder module, final int line) { - if ((newBaseTypeBuilder == null && newBaseType == null) || (newBaseTypeBuilder != null && newBaseType != null)) { - throw new YangParseException(module.getName(), line, - "only one of newBaseTypeBuilder or newBaseType can be specified"); - } - - final TypeDefinitionBuilderImpl newType = new TypeDefinitionBuilderImpl(module.getModuleName(), line, - oldExtendedType.getQName(), oldExtendedType.getPath()); - final TypeConstraints tc = new TypeConstraints(module.getName(), line); - TypeConstraints constraints; - if (newBaseType == null) { - tc.addFractionDigits(oldExtendedType.getFractionDigits()); - tc.addLengths(oldExtendedType.getLengthConstraints()); - tc.addPatterns(oldExtendedType.getPatternConstraints()); - tc.addRanges(oldExtendedType.getRangeConstraints()); - constraints = findConstraintsFromTypeBuilder(newBaseTypeBuilder, tc, modules, module); - newType.setTypedef(newBaseTypeBuilder); - } else { - constraints = findConstraintsFromTypeDefinition(newBaseType, tc); - newType.setType(newBaseType); - } - - newType.setDescription(oldExtendedType.getDescription()); - newType.setReference(oldExtendedType.getReference()); - newType.setStatus(oldExtendedType.getStatus()); - newType.setLengths(constraints.getLength()); - newType.setPatterns(constraints.getPatterns()); - newType.setRanges(constraints.getRange()); - newType.setFractionDigits(constraints.getFractionDigits()); - newType.setUnits(oldExtendedType.getUnits()); - newType.setDefaultValue(oldExtendedType.getDefaultValue()); - return newType; - } - - /** - * Pull restrictions from type and add them to constraints. - * - * @param typeToResolve - * type from which constraints will be read - * @param constraints - * constraints object to which constraints will be added - * @return constraints contstraints object containing constraints from given - * type - */ - private static TypeConstraints findConstraintsFromTypeDefinition(final TypeDefinition typeToResolve, - final TypeConstraints constraints) { - // union type cannot be restricted - if (typeToResolve instanceof UnionTypeDefinition) { - return constraints; - } - if (typeToResolve instanceof ExtendedType) { - ExtendedType extType = (ExtendedType) typeToResolve; - constraints.addFractionDigits(extType.getFractionDigits()); - constraints.addLengths(extType.getLengthConstraints()); - constraints.addPatterns(extType.getPatternConstraints()); - constraints.addRanges(extType.getRangeConstraints()); - return findConstraintsFromTypeDefinition(extType.getBaseType(), constraints); - } else { - mergeConstraints(typeToResolve, constraints); - return constraints; - } - } - private static TypeConstraints findConstraintsFromTypeBuilder(final TypeAwareBuilder nodeToResolve, - final TypeConstraints constraints, final Map> modules, + final TypeConstraints constraints, final Map> modules, final ModuleBuilder builder) { // union and identityref types cannot be restricted @@ -319,27 +193,19 @@ public final class TypeUtils { TypeDefinition type = nodeToResolve.getType(); if (type == null) { - return findConstraintsFromTypeBuilder(nodeToResolve.getTypedef(), constraints, modules, builder); + final QName unknownTypeQName = nodeToResolve.getTypeQName(); + if (unknownTypeQName == null) { + return constraints; + } + final ModuleBuilder dependentModuleBuilder = BuilderUtils.findModule(unknownTypeQName, modules); + final TypeDefinitionBuilder targetTypeBuilder = findTypeDefinitionBuilder(nodeToResolve, + dependentModuleBuilder, unknownTypeQName.getLocalName(), builder.getName(), 0); + return findConstraintsFromTypeBuilder(targetTypeBuilder, constraints, modules, dependentModuleBuilder); } else { - QName qname = type.getQName(); - if (type instanceof UnknownType) { - ModuleBuilder dependentModuleBuilder = BuilderUtils.getModuleByPrefix(builder, qname.getPrefix()); - TypeDefinitionBuilder tdb = findTypeDefinitionBuilder(nodeToResolve, dependentModuleBuilder, - qname.getLocalName(), builder.getName(), nodeToResolve.getLine()); - return findConstraintsFromTypeBuilder(tdb, constraints, modules, dependentModuleBuilder); - } else if (type instanceof ExtendedType) { + if (type instanceof ExtendedType) { mergeConstraints(type, constraints); - - TypeDefinition base = ((ExtendedType) type).getBaseType(); - if (base instanceof UnknownType) { - ModuleBuilder dependentModule = BuilderUtils.getModuleByPrefix(builder, base.getQName().getPrefix()); - TypeDefinitionBuilder tdb = findTypeDefinitionBuilder(nodeToResolve, dependentModule, base - .getQName().getLocalName(), builder.getName(), nodeToResolve.getLine()); - return findConstraintsFromTypeBuilder(tdb, constraints, modules, dependentModule); - } else { - // it has to be base yang type - return mergeConstraints(type, constraints); - } + // it has to be base yang type + return mergeConstraints(type, constraints); } else { // it is base yang type return mergeConstraints(type, constraints); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java index 9d68c53fb0..adb39dce78 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.parser.builder.impl; import java.util.ArrayList; import java.util.Collections; import java.util.List; - import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.Status; @@ -40,12 +39,23 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements private UnionType instance; private boolean isBuilt; + private List baseTypesQNames = new ArrayList<>(); + public UnionTypeBuilder(final String moduleName, final int line) { super(moduleName, line, BaseTypes.UNION_QNAME); types = new ArrayList<>(); typedefs = new ArrayList<>(); } + public List getBaseTypeQNames() { + return baseTypesQNames; + } + + @Override + public void setTypeQName(final QName qname) { + baseTypesQNames.add(qname); + } + public List> getTypes() { return types; } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnknownSchemaNodeBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnknownSchemaNodeBuilderImpl.java index 6b294685a0..e2f85ee435 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnknownSchemaNodeBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnknownSchemaNodeBuilderImpl.java @@ -18,12 +18,18 @@ import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.parser.builder.api.ExtensionBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder; -import org.opendaylight.yangtools.yang.parser.builder.util.AbstractSchemaNodeBuilder; +import org.opendaylight.yangtools.yang.parser.builder.util.AbstractBuilder; import org.opendaylight.yangtools.yang.parser.builder.util.Comparators; -public final class UnknownSchemaNodeBuilderImpl extends AbstractSchemaNodeBuilder implements UnknownSchemaNodeBuilder { - private boolean isBuilt; - private final UnknownSchemaNodeImpl instance; +public final class UnknownSchemaNodeBuilderImpl extends AbstractBuilder implements UnknownSchemaNodeBuilder { + private QName qname; + private SchemaPath schemaPath; + private String description; + private String reference; + private Status status = Status.CURRENT; + private boolean addedByUses; + + private UnknownSchemaNodeImpl instance; private QName nodeType; private String nodeParameter; @@ -31,34 +37,41 @@ public final class UnknownSchemaNodeBuilderImpl extends AbstractSchemaNodeBuilde private ExtensionBuilder extensionBuilder; public UnknownSchemaNodeBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path) { - super(moduleName, line, qname); + super(moduleName, line); + this.qname = qname; this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null"); - instance = new UnknownSchemaNodeImpl(qname, path); } public UnknownSchemaNodeBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path, final UnknownSchemaNode base) { - super(moduleName, line, base.getQName()); + super(moduleName, line); + this.qname = base.getQName(); this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null"); - instance = new UnknownSchemaNodeImpl(qname, path); - - instance.nodeType = base.getNodeType(); - instance.nodeParameter = base.getNodeParameter(); - instance.description = base.getDescription(); - instance.reference = base.getReference(); - instance.status = base.getStatus(); - instance.addedByUses = base.isAddedByUses(); - instance.extension = base.getExtensionDefinition(); - instance.unknownNodes.addAll(base.getUnknownSchemaNodes()); + + this.nodeType = base.getNodeType(); + this.nodeParameter = base.getNodeParameter(); + this.description = base.getDescription(); + this.reference = base.getReference(); + this.status = base.getStatus(); + this.addedByUses = base.isAddedByUses(); + this.extensionDefinition = base.getExtensionDefinition(); + this.unknownNodes.addAll(base.getUnknownSchemaNodes()); + } + + @Override + public QName getQName() { + return qname; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#getPath() - */ @Override public SchemaPath getPath() { return instance.path; } + @Override + public void setPath(SchemaPath schemaPath) { + this.schemaPath = schemaPath; + } + @Override public int hashCode() { final int prime = 31; @@ -113,103 +126,83 @@ public final class UnknownSchemaNodeBuilderImpl extends AbstractSchemaNodeBuilde return true; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#build() - */ @Override public UnknownSchemaNode build() { - if (!isBuilt) { - instance.setNodeType(nodeType); - instance.setNodeParameter(nodeParameter); - - // EXTENSION - if (extensionDefinition != null) { - instance.setExtensionDefinition(extensionDefinition); - } else { - if (extensionBuilder != null) { - instance.setExtensionDefinition(extensionBuilder.build()); - } - } + if (instance != null) { + return instance; + } - // UNKNOWN NODES - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); + instance = new UnknownSchemaNodeImpl(qname, schemaPath); + + instance.setNodeType(nodeType); + instance.setNodeParameter(nodeParameter); + + instance.description = description; + instance.reference = reference; + instance.status = status; + instance.addedByUses = addedByUses; + + // EXTENSION + if (extensionDefinition != null) { + instance.setExtensionDefinition(extensionDefinition); + } else { + if (extensionBuilder != null) { + instance.setExtensionDefinition(extensionBuilder.build()); } - Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); - instance.setUnknownSchemaNodes(unknownNodes); + } - isBuilt = true; + // UNKNOWN NODES + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build()); } + Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); + instance.setUnknownSchemaNodes(unknownNodes); return instance; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#getDescription() - */ @Override public String getDescription() { - return instance.description; + return description; } @Override public void setDescription(final String description) { - instance.description = description; + this.description = description; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#getReference() - */ @Override public String getReference() { - return instance.reference; + return reference; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#setReference(java.lang.String) - */ @Override public void setReference(final String reference) { - instance.reference = reference; + this.reference = reference; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#getStatus() - */ @Override public Status getStatus() { - return instance.status; + return status; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#setStatus(org.opendaylight.yangtools.yang.model.api.Status) - */ @Override public void setStatus(final Status status) { if (status != null) { - instance.status = status; + this.status = status; } } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#isAddedByUses() - */ @Override public boolean isAddedByUses() { - return instance.addedByUses; + return addedByUses; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#setAddedByUses(boolean) - */ @Override public void setAddedByUses(final boolean addedByUses) { - instance.addedByUses = addedByUses; + this.addedByUses = addedByUses; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#getNodeType() - */ @Override public QName getNodeType() { return nodeType; @@ -220,49 +213,31 @@ public final class UnknownSchemaNodeBuilderImpl extends AbstractSchemaNodeBuilde this.nodeType = nodeType; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#getNodeParameter() - */ @Override public String getNodeParameter() { return nodeParameter; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#setNodeParameter(java.lang.String) - */ @Override public void setNodeParameter(final String nodeParameter) { this.nodeParameter = nodeParameter; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#getExtensionDefinition() - */ @Override public ExtensionDefinition getExtensionDefinition() { return extensionDefinition; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#setExtensionDefinition(org.opendaylight.yangtools.yang.model.api.ExtensionDefinition) - */ @Override public void setExtensionDefinition(final ExtensionDefinition extensionDefinition) { this.extensionDefinition = extensionDefinition; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#getExtensionBuilder() - */ @Override public ExtensionBuilder getExtensionBuilder() { return extensionBuilder; } - /* (non-Javadoc) - * @see org.opendaylight.yangtools.yang.parser.builder.impl.IUnkownSchemaNodeBuilder#setExtensionBuilder(org.opendaylight.yangtools.yang.parser.builder.impl.ExtensionBuilder) - */ @Override public void setExtensionBuilder(final ExtensionBuilder extension) { this.extensionBuilder = extension; @@ -271,7 +246,7 @@ public final class UnknownSchemaNodeBuilderImpl extends AbstractSchemaNodeBuilde @Override public String toString() { StringBuilder sb = new StringBuilder(); - sb.append(nodeType.getPrefix()); + sb.append(nodeType.getNamespace()); sb.append(":"); sb.append(nodeType.getLocalName()); sb.append(" "); @@ -367,7 +342,7 @@ public final class UnknownSchemaNodeBuilderImpl extends AbstractSchemaNodeBuilde @Override public String toString() { StringBuilder sb = new StringBuilder(); - sb.append(nodeType.getPrefix()); + sb.append(nodeType.getNamespace()); sb.append(":"); sb.append(nodeType.getLocalName()); sb.append(" "); 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 ffebfd4e86..4cc591f4c4 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 @@ -37,7 +37,7 @@ import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNodeBuilder { private UsesNodeImpl instance; private DataNodeContainerBuilder parentBuilder; - private final String groupingPathString; + private final SchemaPath targetGroupingPath; private SchemaPath groupingPath; private GroupingDefinition groupingDefinition; private GroupingBuilder groupingBuilder; @@ -48,9 +48,9 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo private final List refineBuilders = new ArrayList<>(); private final List refines = new ArrayList<>(); - public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) { + public UsesNodeBuilderImpl(final String moduleName, final int line, final SchemaPath targetGroupingPath) { super(moduleName, line); - this.groupingPathString = groupingName; + this.targetGroupingPath = targetGroupingPath; } @Override @@ -132,8 +132,8 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo } @Override - public String getGroupingPathAsString() { - return groupingPathString; + public SchemaPath getTargetGroupingPath() { + return targetGroupingPath; } @Override @@ -200,7 +200,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((groupingPathString == null) ? 0 : groupingPathString.hashCode()); + result = prime * result + ((groupingPath == null) ? 0 : groupingPath.hashCode()); result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode()); return result; } @@ -217,11 +217,11 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo return false; } UsesNodeBuilderImpl other = (UsesNodeBuilderImpl) obj; - if (groupingPathString == null) { - if (other.groupingPathString != null) { + if (groupingPath == null) { + if (other.groupingPath != null) { return false; } - } else if (!groupingPathString.equals(other.groupingPathString)) { + } else if (!groupingPath.equals(other.groupingPath)) { return false; } if (parentBuilder == null) { @@ -236,7 +236,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo @Override public String toString() { - return "uses '" + groupingPathString + "'"; + return "uses '" + groupingPath + "'"; } private static final class UsesNodeImpl implements UsesNode { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/util/AbstractTypeAwareBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/util/AbstractTypeAwareBuilder.java index 1b2ae200ec..14a22dada2 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/util/AbstractTypeAwareBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/util/AbstractTypeAwareBuilder.java @@ -20,6 +20,8 @@ public abstract class AbstractTypeAwareBuilder extends AbstractBuilder implement protected TypeDefinition type; protected TypeDefinitionBuilder typedef; + private QName baseTypeName; + protected AbstractTypeAwareBuilder(final String moduleName, final int line, final QName qname) { super(moduleName, line); this.qname = qname; @@ -52,4 +54,14 @@ public abstract class AbstractTypeAwareBuilder extends AbstractBuilder implement this.type = null; } + @Override + public QName getTypeQName() { + return baseTypeName; + } + + @Override + public void setTypeQName(QName qname) { + this.baseTypeName = qname; + } + } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/ParserListenerUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/ParserListenerUtils.java index 3ba54e404f..b5f66925e4 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/ParserListenerUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/ParserListenerUtils.java @@ -118,15 +118,17 @@ import org.opendaylight.yangtools.yang.model.util.Uint16; import org.opendaylight.yangtools.yang.model.util.Uint32; import org.opendaylight.yangtools.yang.model.util.Uint64; import org.opendaylight.yangtools.yang.model.util.Uint8; -import org.opendaylight.yangtools.yang.model.util.UnknownType; import org.opendaylight.yangtools.yang.parser.builder.api.Builder; import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.RefineBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder; +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.impl.ChoiceCaseBuilder; +import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.RefineHolderImpl; +import org.opendaylight.yangtools.yang.parser.builder.impl.TypeDefinitionBuilderImpl; import org.opendaylight.yangtools.yang.parser.builder.impl.UnionTypeBuilder; import org.opendaylight.yangtools.yang.parser.util.TypeConstraints; import org.opendaylight.yangtools.yang.parser.util.UnknownBoundaryNumber; @@ -1036,62 +1038,51 @@ public final class ParserListenerUtils { } /** - * Parse type body and create UnknownType definition. + * Parse unknown type with body. * - * @param typedefQName - * qname of current type - * @param ctx + * @param typeBody * type body - * @param actualPath - * actual path in model - * @param namespace - * module namespace - * @param revision - * module revision - * @param prefix - * module prefix * @param parent * current node parent - * @return UnknownType object with constraints from parsed type body + * @param prefixedQName + * type qname with prefix + * @param moduleBuilder + * current module builder + * @param moduleQName + * current module qname + * @param actualPath + * actual path in model */ - public static TypeDefinition parseUnknownTypeWithBody(final QName typedefQName, - final Type_body_stmtsContext ctx, final SchemaPath actualPath, final QName moduleQName, final Builder parent) { - String moduleName = parent.getModuleName(); - String typeName = typedefQName.getLocalName(); - - UnknownType.Builder unknownType = new UnknownType.Builder(typedefQName); - - if (ctx != null) { - List rangeStatements = getRangeConstraints(ctx, moduleName); - List lengthStatements = getLengthConstraints(ctx, moduleName); - List patternStatements = getPatternConstraint(ctx); - Integer fractionDigits = getFractionDigits(ctx, moduleName); - - if (parent instanceof TypeDefinitionBuilder) { - TypeDefinitionBuilder typedef = (TypeDefinitionBuilder) parent; - if (!(typedef instanceof UnionTypeBuilder)) { - typedef.setRanges(rangeStatements); - typedef.setLengths(lengthStatements); - typedef.setPatterns(patternStatements); - typedef.setFractionDigits(fractionDigits); - } - return unknownType.build(); - } else { - TypeDefinition baseType = unknownType.build(); - QName qname = QName.create(moduleQName, typeName); - SchemaPath schemaPath = createTypePath(actualPath, typeName); + public static void parseUnknownTypeWithBody(Type_body_stmtsContext typeBody, TypeAwareBuilder parent, + QName prefixedQName, ModuleBuilder moduleBuilder, QName moduleQName, SchemaPath actualPath) { + final int line = typeBody.getStart().getLine(); - ExtendedType.Builder typeBuilder = ExtendedType.builder(qname, baseType, Optional.absent(), Optional.absent(), schemaPath); - typeBuilder.ranges(rangeStatements); - typeBuilder.lengths(lengthStatements); - typeBuilder.patterns(patternStatements); - typeBuilder.fractionDigits(fractionDigits); + List rangeStatements = getRangeConstraints(typeBody, moduleBuilder.getName()); + List lengthStatements = getLengthConstraints(typeBody, moduleBuilder.getName()); + List patternStatements = getPatternConstraint(typeBody); + Integer fractionDigits = getFractionDigits(typeBody, moduleBuilder.getName()); - return typeBuilder.build(); - } + if (parent instanceof TypeDefinitionBuilder && !(parent instanceof UnionTypeBuilder)) { + TypeDefinitionBuilder typedef = (TypeDefinitionBuilder) parent; + typedef.setRanges(rangeStatements); + typedef.setLengths(lengthStatements); + typedef.setPatterns(patternStatements); + typedef.setFractionDigits(fractionDigits); + typedef.setTypeQName(prefixedQName); + // add parent node of this type statement to dirty nodes + moduleBuilder.markActualNodeDirty(); + } else { + QName qname = QName.create(moduleQName, prefixedQName.getLocalName()); + SchemaPath schemaPath = createTypePath(actualPath, prefixedQName.getLocalName()); + TypeDefinitionBuilder typeBuilder = new TypeDefinitionBuilderImpl(moduleBuilder.getName(), line, qname, schemaPath); + typeBuilder.setRanges(rangeStatements); + typeBuilder.setLengths(lengthStatements); + typeBuilder.setPatterns(patternStatements); + typeBuilder.setFractionDigits(fractionDigits); + typeBuilder.setTypeQName(prefixedQName); + parent.setTypedef(typeBuilder); + moduleBuilder.getDirtyNodes().add(typeBuilder); } - - return unknownType.build(); } /** 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 1d0d48a7dd..161a188185 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 @@ -9,7 +9,6 @@ package org.opendaylight.yangtools.yang.parser.impl; import static com.google.common.base.Preconditions.checkNotNull; import static org.opendaylight.yangtools.yang.parser.builder.impl.BuilderUtils.fillAugmentTarget; import static org.opendaylight.yangtools.yang.parser.builder.impl.BuilderUtils.findBaseIdentity; -import static org.opendaylight.yangtools.yang.parser.builder.impl.BuilderUtils.findModuleFromBuilders; import static org.opendaylight.yangtools.yang.parser.builder.impl.BuilderUtils.findModuleFromContext; import static org.opendaylight.yangtools.yang.parser.builder.impl.BuilderUtils.findSchemaNode; import static org.opendaylight.yangtools.yang.parser.builder.impl.BuilderUtils.findSchemaNodeInModule; @@ -22,10 +21,10 @@ import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.HashBiMap; import com.google.common.io.ByteSource; - import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -38,9 +37,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; - import javax.annotation.concurrent.Immutable; - import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; @@ -72,7 +69,6 @@ import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.BuilderUtils; import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceCaseBuilder; -import org.opendaylight.yangtools.yang.parser.builder.impl.DeviationBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.GroupingUtils; import org.opendaylight.yangtools.yang.parser.builder.impl.IdentitySchemaNodeBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.IdentityrefTypeBuilder; @@ -91,7 +87,6 @@ import org.slf4j.LoggerFactory; @Immutable public final class YangParserImpl implements YangContextParser { private static final Logger LOG = LoggerFactory.getLogger(YangParserImpl.class); - private static final String FAIL_DEVIATION_TARGET = "Failed to find deviation target."; private static final Splitter COLON_SPLITTER = Splitter.on(':'); private static final YangParserImpl INSTANCE = new YangParserImpl(); @@ -132,7 +127,7 @@ public final class YangParserImpl implements YangContextParser { } } - Map sourceToBuilder = parseSourcesToBuilders(sourceToFile.keySet()); + Map sourceToBuilder = parseSourcesToBuilders(sourceToFile.keySet(), null); ModuleBuilder main = sourceToBuilder.get(mainFileSource); List moduleBuilders = new ArrayList<>(); @@ -142,7 +137,7 @@ public final class YangParserImpl implements YangContextParser { // module builders sorted by dependencies List sortedBuilders = ModuleDependencySort.sort(resolved); - LinkedHashMap> modules = resolveModulesWithImports(sortedBuilders, null); + LinkedHashMap> modules = resolveModulesWithImports(sortedBuilders, null); Collection unsorted = build(modules).values(); Set result = new LinkedHashSet<>( ModuleDependencySort.sort(unsorted.toArray(new Module[unsorted.size()]))); @@ -197,7 +192,7 @@ public final class YangParserImpl implements YangContextParser { @Override public SchemaContext parseSources(final Collection sources) throws IOException,YangSyntaxErrorException { - return assembleContext(parseYangModelSources(sources).values()); + return assembleContext(parseYangModelSources(sources, null).values()); } @Override @@ -219,7 +214,7 @@ public final class YangParserImpl implements YangContextParser { } final List sorted = resolveModuleBuilders(sources, context); - final Map> modules = resolveModulesWithImports(sorted, context); + final Map> modules = resolveModulesWithImports(sorted, context); final Set unsorted = new LinkedHashSet<>(build(modules).values()); if (context != null) { @@ -234,14 +229,14 @@ public final class YangParserImpl implements YangContextParser { return resolveSchemaContext(result); } - private static LinkedHashMap> resolveModulesWithImports(final List sorted, + private static LinkedHashMap> resolveModulesWithImports(final List sorted, final SchemaContext context) { - final LinkedHashMap> modules = orderModules(sorted); + final LinkedHashMap> modules = orderModules(sorted); for (ModuleBuilder module : sorted) { if (module != null) { for (ModuleImport imp : module.getImports().values()) { String prefix = imp.getPrefix(); - ModuleBuilder targetModule = findModuleFromBuilders(modules, module, prefix, 0); + ModuleBuilder targetModule = BuilderUtils.findModuleFromBuilders(imp, sorted); if (targetModule == null) { Module result = findModuleFromContext(context, module, prefix, 0); targetModule = new ModuleBuilder(result); @@ -249,7 +244,7 @@ public final class YangParserImpl implements YangContextParser { if (map == null) { map = new TreeMap<>(); map.put(targetModule.getRevision(), targetModule); - modules.put(targetModule.getName(), map); + modules.put(targetModule.getNamespace(), map); } else { map.put(targetModule.getRevision(), targetModule); } @@ -280,7 +275,7 @@ public final class YangParserImpl implements YangContextParser { Map byteSourceToModule; try { - byteSourceToModule = parseYangModelSources(byteSourceToFile.keySet()); + byteSourceToModule = parseYangModelSources(byteSourceToFile.keySet(), null); } catch (IOException | YangSyntaxErrorException e) { throw new YangParseException("Failed to parse yang data", e); } @@ -310,7 +305,7 @@ public final class YangParserImpl implements YangContextParser { Map sourceToModule; try { - sourceToModule = parseYangModelSources(sourceToStream.keySet()); + sourceToModule = parseYangModelSources(sourceToStream.keySet(), null); } catch (IOException | YangSyntaxErrorException e) { throw new YangParseException("Failed to parse yang data", e); } @@ -335,7 +330,7 @@ public final class YangParserImpl implements YangContextParser { public Collection buildModules(final Collection builders) { List sorted = ModuleDependencySort.sort(builders); - Map> modules = resolveModulesWithImports(sorted, null); + Map> modules = resolveModulesWithImports(sorted, null); Map builderToModule = build(modules); return builderToModule.values(); @@ -347,15 +342,15 @@ public final class YangParserImpl implements YangContextParser { return resolveSchemaContext(sorted); } - private Map parseYangModelSources(final Collection sources) throws IOException, YangSyntaxErrorException { + private Map parseYangModelSources(final Collection sources, final SchemaContext context) throws IOException, YangSyntaxErrorException { if (sources == null || sources.isEmpty()) { return Collections.emptyMap(); } - Map sourceToBuilder = resolveSources(sources); + Map sourceToBuilder = resolveSources(sources, context); // sort and check for duplicates List sorted = ModuleDependencySort.sort(sourceToBuilder.values()); - Map> modules = resolveModulesWithImports(sorted, null); + Map> modules = resolveModulesWithImports(sorted, null); Map builderToModule = build(modules); Map builderToSource = HashBiMap.create(sourceToBuilder).inverse(); sorted = ModuleDependencySort.sort(builderToModule.keySet()); @@ -379,13 +374,13 @@ public final class YangParserImpl implements YangContextParser { * @throws YangSyntaxErrorException */ // TODO: remove ByteSource result after removing YangModelParser - private Map resolveSources(final Collection streams) throws IOException, YangSyntaxErrorException { - Map builders = parseSourcesToBuilders(streams); + private Map resolveSources(final Collection streams, final SchemaContext context) throws IOException, YangSyntaxErrorException { + Map builders = parseSourcesToBuilders(streams, context); return resolveSubmodules(builders); } - private Map parseSourcesToBuilders(final Collection sources) - throws IOException, YangSyntaxErrorException { + private Map parseSourcesToBuilders(final Collection sources, + final SchemaContext context) throws IOException, YangSyntaxErrorException { final ParseTreeWalker walker = new ParseTreeWalker(); final Map sourceToTree = parseYangSources(sources); final Map sourceToBuilder = new LinkedHashMap<>(); @@ -393,6 +388,8 @@ public final class YangParserImpl implements YangContextParser { // validate yang new YangModelBasicValidator(walker).validate(sourceToTree.values()); + Map> namespaceContext = BuilderUtils.createYangNamespaceContext( + sourceToTree.values(), Optional.fromNullable(context)); YangParserListenerImpl yangModelParser; for (Map.Entry entry : sourceToTree.entrySet()) { ByteSource source = entry.getKey(); @@ -404,7 +401,7 @@ public final class YangParserImpl implements YangContextParser { path = stream.toString(); } } - yangModelParser = new YangParserListenerImpl(path); + yangModelParser = new YangParserListenerImpl(namespaceContext, path); walker.walk(yangModelParser, entry.getValue()); ModuleBuilder moduleBuilder = yangModelParser.getModuleBuilder(); moduleBuilder.setSource(source); @@ -500,7 +497,7 @@ public final class YangParserImpl implements YangContextParser { private List resolveModuleBuilders(final Collection yangFileStreams, final SchemaContext context) throws IOException, YangSyntaxErrorException { - Map parsedBuilders = resolveSources(yangFileStreams); + Map parsedBuilders = resolveSources(yangFileStreams, context); ModuleBuilder[] builders = new ModuleBuilder[parsedBuilders.size()]; parsedBuilders.values().toArray(builders); @@ -515,31 +512,34 @@ public final class YangParserImpl implements YangContextParser { } /** - * Order modules by name and revision. + * Order modules by namespace and revision. * * @param modules * topologically sorted modules - * @return modules ordered by name and revision + * @return modules ordered by namespace and revision */ - private static LinkedHashMap> orderModules(final List modules) { - final LinkedHashMap> result = new LinkedHashMap<>(); + private static LinkedHashMap> orderModules(final List modules) { + final LinkedHashMap> result = new LinkedHashMap<>(); for (final ModuleBuilder builder : modules) { if (builder == null) { continue; } - final String builderName = builder.getName(); - Date builderRevision = builder.getRevision(); - if (builderRevision == null) { - builderRevision = new Date(0L); + + URI ns = builder.getNamespace(); + Date rev = builder.getRevision(); + if (rev == null) { + rev = new Date(0); } - TreeMap builderByRevision = result.get(builderName); + + TreeMap builderByRevision = result.get(ns); if (builderByRevision == null) { builderByRevision = new TreeMap<>(); - builderByRevision.put(builderRevision, builder); - result.put(builderName, builderByRevision); + builderByRevision.put(rev, builder); + result.put(ns, builderByRevision); } else { - builderByRevision.put(builderRevision, builder); + builderByRevision.put(rev, builder); } + } return result; } @@ -660,7 +660,7 @@ public final class YangParserImpl implements YangContextParser { * all loaded modules * @return modules mapped on their builders */ - private Map build(final Map> modules) { + private Map build(final Map> modules) { resolveDirtyNodes(modules); resolveAugmentsTargetPath(modules); resolveUsesTargetGrouping(modules); @@ -668,11 +668,10 @@ public final class YangParserImpl implements YangContextParser { resolveUsesForNodes(modules); resolveAugments(modules); resolveIdentities(modules); - resolveDeviations(modules); // build final Map result = new LinkedHashMap<>(); - for (Map.Entry> entry : modules.entrySet()) { + for (Map.Entry> entry : modules.entrySet()) { for (Map.Entry childEntry : entry.getValue().entrySet()) { final ModuleBuilder moduleBuilder = childEntry.getValue(); final Module module = moduleBuilder.build(); @@ -688,8 +687,8 @@ public final class YangParserImpl implements YangContextParser { * @param modules * all loaded modules */ - private void resolveDirtyNodes(final Map> modules) { - for (Map.Entry> entry : modules.entrySet()) { + private void resolveDirtyNodes(final Map> modules) { + for (Map.Entry> entry : modules.entrySet()) { for (Map.Entry childEntry : entry.getValue().entrySet()) { final ModuleBuilder module = childEntry.getValue(); resolveUnknownNodes(modules, module); @@ -707,7 +706,7 @@ public final class YangParserImpl implements YangContextParser { * @param module * current module */ - private void resolveDirtyNodes(final Map> modules, final ModuleBuilder module) { + private void resolveDirtyNodes(final Map> modules, final ModuleBuilder module) { final Set dirtyNodes = module.getDirtyNodes(); if (!dirtyNodes.isEmpty()) { for (TypeAwareBuilder nodeToResolve : dirtyNodes) { @@ -717,7 +716,7 @@ public final class YangParserImpl implements YangContextParser { } else if (nodeToResolve.getTypedef() instanceof IdentityrefTypeBuilder) { // special handling for identityref types IdentityrefTypeBuilder idref = (IdentityrefTypeBuilder) nodeToResolve.getTypedef(); - IdentitySchemaNodeBuilder identity = findBaseIdentity(modules, module, idref.getBaseString(), + IdentitySchemaNodeBuilder identity = findBaseIdentity(module, idref.getBaseString(), idref.getLine()); if (identity == null) { throw new YangParseException(module.getName(), idref.getLine(), "Failed to find base identity"); @@ -738,85 +737,58 @@ public final class YangParserImpl implements YangContextParser { * @param modules * all loaded modules */ - private void resolveAugmentsTargetPath(final Map> modules) { + private void resolveAugmentsTargetPath(final Map> modules) { // collect augments from all loaded modules final List allAugments = new ArrayList<>(); - for (Map.Entry> entry : modules.entrySet()) { + for (Map.Entry> entry : modules.entrySet()) { for (Map.Entry inner : entry.getValue().entrySet()) { allAugments.addAll(inner.getValue().getAllAugments()); } } for (AugmentationSchemaBuilder augment : allAugments) { - setCorrectAugmentTargetPath(modules, augment); + setCorrectAugmentTargetPath(augment); } } /** * Find augment target and set correct schema path for all its child nodes. * - * @param modules - * all loaded modules * @param augment * augment to resolve */ - private void setCorrectAugmentTargetPath(final Map> modules, - final AugmentationSchemaBuilder augment) { - ModuleBuilder module = BuilderUtils.getParentModule(augment); - final SchemaPath newSchemaPath; - + private void setCorrectAugmentTargetPath(final AugmentationSchemaBuilder augment) { Builder parent = augment.getParent(); + final SchemaPath targetNodeSchemaPath; + if (parent instanceof UsesNodeBuilder) { - DataNodeContainerBuilder usesParent = ((UsesNodeBuilder) parent).getParent(); - - QName baseQName = usesParent.getQName(); - final QNameModule qnm; - String prefix; - if (baseQName == null) { - ModuleBuilder m = BuilderUtils.getParentModule(usesParent); - qnm = m.getQNameModule(); - prefix = m.getPrefix(); - } else { - qnm = baseQName.getModule(); - prefix = baseQName.getPrefix(); - } + targetNodeSchemaPath = findUsesAugmentTargetNodePath(((UsesNodeBuilder) parent).getParent(), augment); + } else { + targetNodeSchemaPath = augment.getTargetPath(); + } - SchemaPath s = usesParent.getPath(); - for (QName qn : augment.getTargetPath().getPathFromRoot()) { - s = s.createChild(QName.create(qnm, prefix, qn.getLocalName())); - } + for (DataSchemaNodeBuilder childNode : augment.getChildNodeBuilders()) { + correctPathForAugmentNodes(childNode, targetNodeSchemaPath); + } + } - newSchemaPath = s; + private SchemaPath findUsesAugmentTargetNodePath(DataNodeContainerBuilder usesParent, + AugmentationSchemaBuilder augment) { + QName parentQName = usesParent.getQName(); + final QNameModule qnm; + if (parentQName == null) { + ModuleBuilder m = BuilderUtils.getParentModule(usesParent); + qnm = m.getQNameModule(); } else { - final List newPath = new ArrayList<>(); - - for (QName qn : augment.getTargetPath().getPathFromRoot()) { - QNameModule qnm = module.getQNameModule(); - String localPrefix = qn.getPrefix(); - if (localPrefix != null && !localPrefix.isEmpty()) { - ModuleBuilder currentModule = BuilderUtils.getModuleByPrefix(module, localPrefix); - if (currentModule == null) { - throw new YangParseException(module.getName(), augment.getLine(), "Module with prefix " - + localPrefix + " not found."); - } - qnm = currentModule.getQNameModule(); - } - newPath.add(QName.create(qnm, localPrefix, qn.getLocalName())); - } - - /* - * FIXME: this method of SchemaPath construction is highly ineffective. - * It would be great if we could actually dive into the context, - * find the actual target node and reuse its SchemaPath. Can we - * do that? - */ - newSchemaPath = SchemaPath.create(newPath, true); + qnm = parentQName.getModule(); } - augment.setTargetNodeSchemaPath(newSchemaPath); - for (DataSchemaNodeBuilder childNode : augment.getChildNodeBuilders()) { - correctPathForAugmentNodes(childNode, augment.getTargetNodeSchemaPath()); + SchemaPath path = usesParent.getPath(); + for (QName qname : augment.getTargetPath().getPathFromRoot()) { + path = path.createChild(QName.create(qnm, qname.getLocalName())); } + + return path; } /** @@ -853,11 +825,11 @@ public final class YangParserImpl implements YangContextParser { */ private void checkAugmentMandatoryNodes(final Collection augments) { for (AugmentationSchemaBuilder augment : augments) { - String augmentPrefix = augment.getTargetPath().getPathFromRoot().iterator().next().getPrefix(); + URI augmentTargetNs = augment.getTargetPath().getPathFromRoot().iterator().next().getNamespace(); + Date augmentTargetRev = augment.getTargetPath().getPathFromRoot().iterator().next().getRevision(); ModuleBuilder module = BuilderUtils.getParentModule(augment); - String modulePrefix = module.getPrefix(); - if (augmentPrefix == null || augmentPrefix.isEmpty() || augmentPrefix.equals(modulePrefix)) { + if (augmentTargetNs.equals(module.getNamespace()) && augmentTargetRev.equals(module.getRevision())) { continue; } @@ -878,9 +850,9 @@ public final class YangParserImpl implements YangContextParser { * all loaded modules topologically sorted (based on dependencies * between each other) */ - private void resolveAugments(final Map> modules) { + private void resolveAugments(final Map> modules) { List all = new ArrayList<>(); - for (Map.Entry> entry : modules.entrySet()) { + for (Map.Entry> entry : modules.entrySet()) { for (Map.Entry inner : entry.getValue().entrySet()) { all.add(inner.getValue()); } @@ -916,7 +888,7 @@ public final class YangParserImpl implements YangContextParser { * @return true if augment process succeed */ private boolean resolveUsesAugment(final AugmentationSchemaBuilder augment, final ModuleBuilder module, - final Map> modules) { + final Map> modules) { if (augment.isResolved()) { return true; } @@ -924,7 +896,7 @@ public final class YangParserImpl implements YangContextParser { UsesNodeBuilder usesNode = (UsesNodeBuilder) augment.getParent(); DataNodeContainerBuilder parentNode = usesNode.getParent(); Optional potentialTargetNode; - SchemaPath resolvedTargetPath = augment.getTargetNodeSchemaPath(); + SchemaPath resolvedTargetPath = findUsesAugmentTargetNodePath(parentNode, augment); if (parentNode instanceof ModuleBuilder && resolvedTargetPath.isAbsolute()) { // Uses is directly used in module body, we lookup // We lookup in data namespace to find correct augmentation target @@ -939,7 +911,7 @@ public final class YangParserImpl implements YangContextParser { // since resolveUsesAugment occurs before augmenting from external // modules. potentialTargetNode = Optional. fromNullable(findSchemaNode(augment.getTargetPath() - .getPath(), (SchemaNodeBuilder) parentNode)); + .getPathFromRoot(), (SchemaNodeBuilder) parentNode)); } if (potentialTargetNode.isPresent()) { @@ -972,13 +944,13 @@ public final class YangParserImpl implements YangContextParser { * @return true if augment process succeed */ private boolean resolveAugment(final AugmentationSchemaBuilder augment, final ModuleBuilder module, - final Map> modules) { + final Map> modules) { if (augment.isResolved()) { return true; } QName targetModuleName = augment.getTargetPath().getPathFromRoot().iterator().next(); - ModuleBuilder targetModule = BuilderUtils.getModuleByPrefix(module, targetModuleName.getPrefix()); + ModuleBuilder targetModule = BuilderUtils.findModule(targetModuleName, modules); if (targetModule == null) { throw new YangParseException(module.getModuleName(), augment.getLine(), "Failed to resolve augment " + augment); @@ -994,20 +966,19 @@ public final class YangParserImpl implements YangContextParser { * @param modules * all loaded modules */ - private void resolveIdentities(final Map> modules) { - for (Map.Entry> entry : modules.entrySet()) { + private void resolveIdentities(final Map> modules) { + for (Map.Entry> entry : modules.entrySet()) { for (Map.Entry inner : entry.getValue().entrySet()) { ModuleBuilder module = inner.getValue(); final Set identities = module.getAddedIdentities(); for (IdentitySchemaNodeBuilder identity : identities) { - resolveIdentity(modules, module, identity); + resolveIdentity(module, identity); } } } } - private void resolveIdentity(final Map> modules, final ModuleBuilder module, - final IdentitySchemaNodeBuilder identity) { + private void resolveIdentity(final ModuleBuilder module, final IdentitySchemaNodeBuilder identity) { final String baseIdentityName = identity.getBaseIdentityName(); if (baseIdentityName != null) { IdentitySchemaNodeBuilder result = null; @@ -1035,9 +1006,9 @@ public final class YangParserImpl implements YangContextParser { * @param modules * all loaded modules */ - private void resolveUsesTargetGrouping(final Map> modules) { + private void resolveUsesTargetGrouping(final Map> modules) { final List allUses = new ArrayList<>(); - for (Map.Entry> entry : modules.entrySet()) { + for (Map.Entry> entry : modules.entrySet()) { for (Map.Entry inner : entry.getValue().entrySet()) { allUses.addAll(inner.getValue().getAllUsesNodes()); } @@ -1048,7 +1019,7 @@ public final class YangParserImpl implements YangContextParser { module); if (targetGroupingBuilder == null) { throw new YangParseException(module.getName(), usesNode.getLine(), "Referenced grouping '" - + usesNode.getGroupingPathAsString() + "' not found."); + + usesNode.getGroupingPath() + "' not found."); } usesNode.setGrouping(targetGroupingBuilder); } @@ -1060,9 +1031,9 @@ public final class YangParserImpl implements YangContextParser { * @param modules * all loaded modules */ - private void resolveUsesForGroupings(final Map> modules) { + private void resolveUsesForGroupings(final Map> modules) { final Set allGroupings = new HashSet<>(); - for (Map.Entry> entry : modules.entrySet()) { + for (Map.Entry> entry : modules.entrySet()) { for (Map.Entry inner : entry.getValue().entrySet()) { ModuleBuilder module = inner.getValue(); allGroupings.addAll(module.getAllGroupings()); @@ -1084,8 +1055,8 @@ public final class YangParserImpl implements YangContextParser { * @param modules * all loaded modules */ - private void resolveUsesForNodes(final Map> modules) { - for (Map.Entry> entry : modules.entrySet()) { + private void resolveUsesForNodes(final Map> modules) { + for (Map.Entry> entry : modules.entrySet()) { for (Map.Entry inner : entry.getValue().entrySet()) { ModuleBuilder module = inner.getValue(); List usesNodes = module.getAllUsesNodes(); @@ -1106,7 +1077,7 @@ public final class YangParserImpl implements YangContextParser { * @param modules * all loaded modules */ - private void resolveUses(final UsesNodeBuilder usesNode, final Map> modules) { + private void resolveUses(final UsesNodeBuilder usesNode, final Map> modules) { if (!usesNode.isResolved()) { DataNodeContainerBuilder parent = usesNode.getParent(); ModuleBuilder module = BuilderUtils.getParentModule(parent); @@ -1165,32 +1136,30 @@ public final class YangParserImpl implements YangContextParser { * @param module * current module */ - private void resolveUnknownNodes(final Map> modules, final ModuleBuilder module) { + private void resolveUnknownNodes(final Map> modules, final ModuleBuilder module) { for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) { QName nodeType = usnb.getNodeType(); - ModuleBuilder dependentModuleBuilder = BuilderUtils.getModuleByPrefix(module, nodeType.getPrefix()); - if (dependentModuleBuilder == null) { + String localName = usnb.getNodeType().getLocalName(); + ModuleBuilder dependentModule = BuilderUtils.findModule(nodeType, modules); + + if (dependentModule == null) { LOG.warn( "Error in module {} at line {}: Failed to resolve node {}: no such extension definition found.", module.getName(), usnb.getLine(), usnb); continue; } - ExtensionBuilder extBuilder = findExtBuilder(nodeType.getLocalName(), - dependentModuleBuilder.getAddedExtensions()); + + ExtensionBuilder extBuilder = findExtBuilder(localName, dependentModule.getAddedExtensions()); if (extBuilder == null) { - ExtensionDefinition extDef = findExtDef(nodeType.getLocalName(), dependentModuleBuilder.getExtensions()); + ExtensionDefinition extDef = findExtDef(localName, dependentModule.getExtensions()); if (extDef == null) { LOG.warn( "Error in module {} at line {}: Failed to resolve node {}: no such extension definition found.", module.getName(), usnb.getLine(), usnb); } else { - usnb.setNodeType(new QName(extDef.getQName().getNamespace(), extDef.getQName().getRevision(), - nodeType.getPrefix(), extDef.getQName().getLocalName())); usnb.setExtensionDefinition(extDef); } } else { - usnb.setNodeType(QName.create(extBuilder.getQName().getModule(), - nodeType.getPrefix(), extBuilder.getQName().getLocalName())); usnb.setExtensionBuilder(extBuilder); } } @@ -1214,74 +1183,4 @@ public final class YangParserImpl implements YangContextParser { return null; } - /** - * Traverse through modules and resolve their deviation statements. - * - * @param modules - * all loaded modules - */ - private void resolveDeviations(final Map> modules) { - for (Map.Entry> entry : modules.entrySet()) { - for (Map.Entry inner : entry.getValue().entrySet()) { - ModuleBuilder b = inner.getValue(); - resolveDeviation(modules, b); - } - } - } - - /** - * Traverse through module and resolve its deviation statements. - * - * @param modules - * all loaded modules - * @param module - * module in which resolve deviations - */ - private void resolveDeviation(final Map> modules, final ModuleBuilder module) { - for (DeviationBuilder dev : module.getDeviationBuilders()) { - SchemaPath targetPath = dev.getTargetPath(); - Iterable path = targetPath.getPathFromRoot(); - QName q0 = path.iterator().next(); - String prefix = q0.getPrefix(); - if (prefix == null) { - prefix = module.getPrefix(); - } - - ModuleBuilder dependentModuleBuilder = BuilderUtils.getModuleByPrefix(module, prefix); - processDeviation(dev, dependentModuleBuilder, path, module); - } - } - - /** - * Correct deviation target path in deviation builder. - * - * @param dev - * deviation - * @param dependentModuleBuilder - * module containing deviation target - * @param path - * current deviation target path - * @param module - * current module - */ - private void processDeviation(final DeviationBuilder dev, final ModuleBuilder dependentModuleBuilder, - final Iterable path, final ModuleBuilder module) { - final int line = dev.getLine(); - Builder currentParent = dependentModuleBuilder; - - for (QName q : path) { - if (currentParent == null) { - throw new YangParseException(module.getName(), line, FAIL_DEVIATION_TARGET); - } - String name = q.getLocalName(); - if (currentParent instanceof DataNodeContainerBuilder) { - currentParent = ((DataNodeContainerBuilder) currentParent).getDataChildByName(name); - } - } - - if (!(currentParent instanceof SchemaNodeBuilder)) { - throw new YangParseException(module.getName(), line, FAIL_DEVIATION_TARGET); - } - dev.setTargetPath(((SchemaNodeBuilder) currentParent).getPath()); - } } 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 45bedd8c3a..79a5b2682d 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 @@ -18,7 +18,6 @@ import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.pa import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.parseStatus; import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.parseTypeWithBody; import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.parseUnits; -import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.parseUnknownTypeWithBody; import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.parseUserOrdered; import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.parseYinValue; import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.stringFromNode; @@ -26,15 +25,16 @@ import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.st import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.collect.Iterables; - import java.net.URI; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; - +import java.util.Map; +import java.util.TreeMap; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTreeWalker; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser; @@ -70,7 +70,7 @@ import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.When_stmtContext; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Yang_version_stmtContext; import org.opendaylight.yangtools.antlrv4.code.gen.YangParserBaseListener; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.model.api.ModuleImport; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.util.BaseTypes; @@ -78,6 +78,7 @@ import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuil import org.opendaylight.yangtools.yang.parser.builder.api.Builder; import org.opendaylight.yangtools.yang.parser.builder.api.ExtensionBuilder; import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder; +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.AnyXmlBuilder; @@ -96,24 +97,29 @@ import org.opendaylight.yangtools.yang.parser.builder.impl.RefineHolderImpl; import org.opendaylight.yangtools.yang.parser.builder.impl.RpcDefinitionBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.UnionTypeBuilder; import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilderImpl; +import org.opendaylight.yangtools.yang.parser.util.YangParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class YangParserListenerImpl extends YangParserBaseListener { private static final Logger LOG = LoggerFactory.getLogger(YangParserListenerImpl.class); + private static final Splitter SLASH_SPLITTER = Splitter.on('/').omitEmptyStrings(); private static final Splitter COLON_SPLITTER = Splitter.on(':'); private static final String AUGMENT_STR = "augment"; private final DateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); private final SchemaPathStack stack = new SchemaPathStack(); + private final Map> namespaceContext; private final String sourcePath; private QName moduleQName = new QName(null, new Date(0L), null, "dummy"); private ModuleBuilder moduleBuilder; private String moduleName; private int augmentOrder; + private String yangModelPrefix; - public YangParserListenerImpl(final String sourcePath) { + public YangParserListenerImpl(final Map> namespaceContext, final String sourcePath) { + this.namespaceContext = namespaceContext; this.sourcePath = sourcePath; } @@ -124,17 +130,21 @@ public final class YangParserListenerImpl extends YangParserBaseListener { * the "BaseListener" aspect, which need not be exposed to the user. * Maybe factor out a base class into repo.spi? * + * @param namespaceContext * @param sourcePath * @param walker * @param tree * @return */ - public static YangParserListenerImpl create(final String sourcePath, final ParseTreeWalker walker, final ParseTree tree) { - final YangParserListenerImpl ret = new YangParserListenerImpl(sourcePath); + public static YangParserListenerImpl create(final Map> namespaceContext, + final String sourcePath, final ParseTreeWalker walker, final ParseTree tree) { + final YangParserListenerImpl ret = new YangParserListenerImpl(namespaceContext, sourcePath); walker.walk(ret, tree); return ret; } + + @Override public void enterModule_stmt(final YangParser.Module_stmtContext ctx) { moduleName = stringFromNode(ctx); @@ -215,11 +225,11 @@ public final class YangParserListenerImpl extends YangParserBaseListener { if (treeNode instanceof Namespace_stmtContext) { final String namespaceStr = stringFromNode(treeNode); final URI namespace = URI.create(namespaceStr); - this.moduleQName = new QName(namespace, moduleQName.getRevision(), moduleQName.getPrefix(), moduleQName.getLocalName()); + this.moduleQName = QName.create(namespace, moduleQName.getRevision(), moduleQName.getLocalName()); moduleBuilder.setQNameModule(moduleQName.getModule()); setLog("namespace", namespaceStr); } else if (treeNode instanceof Prefix_stmtContext) { - final String yangModelPrefix = stringFromNode(treeNode); + yangModelPrefix = stringFromNode(treeNode); this.moduleQName = QName.create(moduleQName.getModule(), yangModelPrefix, moduleQName.getLocalName()); moduleBuilder.setPrefix(yangModelPrefix); setLog("prefix", yangModelPrefix); @@ -291,7 +301,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { try { final Date revisionDate = SIMPLE_DATE_FORMAT.parse(revisionDateStr); if ((revisionDate != null) && (this.moduleQName.getRevision().compareTo(revisionDate) < 0)) { - this.moduleQName = new QName(moduleQName.getNamespace(), revisionDate, moduleQName.getPrefix(), moduleQName.getLocalName()); + this.moduleQName = QName.create(moduleQName.getNamespace(), revisionDate, moduleQName.getLocalName()); moduleBuilder.setQNameModule(moduleQName.getModule()); setLog("revision", revisionDate.toString()); for (int i = 0; i < treeNode.getChildCount(); ++i) { @@ -345,7 +355,8 @@ public final class YangParserListenerImpl extends YangParserBaseListener { enterLog(AUGMENT_STR, augmentPath, line); stack.push(); - AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath, augmentOrder++); + SchemaPath targetPath = parseXPathString(augmentPath, line); + AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath, targetPath, augmentOrder++); for (int i = 0; i < ctx.getChildCount(); i++) { ParseTree child = ctx.getChild(i); @@ -431,7 +442,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String typeName = stringFromNode(ctx); enterLog("type", typeName, line); - final QName typeQName = parseQName(typeName); + final QName typeQName = parseQName(typeName, line); TypeDefinition type; Type_body_stmtsContext typeBody = null; @@ -468,36 +479,54 @@ public final class YangParserListenerImpl extends YangParserBaseListener { moduleBuilder.addIdentityrefType(line, path, getIdentityrefBase(typeBody)); break; default: - type = parseTypeWithBody(typeName, typeBody, stack.currentSchemaPath(), moduleQName, moduleBuilder.getActualNode()); + type = parseTypeWithBody(typeName, typeBody, stack.currentSchemaPath(), moduleQName, + moduleBuilder.getActualNode()); moduleBuilder.setType(type); stack.addNodeToPath(type.getQName()); } } } else { - type = parseUnknownTypeWithBody(typeQName, typeBody, stack.currentSchemaPath(), moduleQName, moduleBuilder.getActualNode()); - // add parent node of this type statement to dirty nodes - moduleBuilder.markActualNodeDirty(); - moduleBuilder.setType(type); - stack.addNodeToPath(type.getQName()); + TypeAwareBuilder parent = (TypeAwareBuilder) moduleBuilder.getActualNode(); + if (typeBody == null) { + parent.setTypeQName(typeQName); + moduleBuilder.markActualNodeDirty(); + } else { + ParserListenerUtils.parseUnknownTypeWithBody(typeBody, parent, typeQName, moduleBuilder, + moduleQName, stack.currentSchemaPath()); + } + stack.addNodeToPath(QName.create(moduleQName.getModule(), typeQName.getLocalName())); } - } - private QName parseQName(final String typeName) { - final QName typeQName; - if (typeName.indexOf(':') != -1) { - final Iterator split = COLON_SPLITTER.split(typeName).iterator(); + private QName parseQName(final String qnameString, final int line) { + final QName qname; + if (qnameString.indexOf(':') == -1) { + qname = QName.create(moduleQName.getNamespace(), moduleQName.getRevision(), qnameString); + } else { + final Iterator split = COLON_SPLITTER.split(qnameString).iterator(); final String prefix = split.next(); final String name = split.next(); - if (prefix.equals(moduleQName.getPrefix())) { - typeQName = QName.create(moduleQName, name); + if (prefix.equals(moduleBuilder.getPrefix())) { + qname = QName.create(moduleQName.getNamespace(), moduleQName.getRevision(), name); } else { - typeQName = QName.create(QNameModule.create(null, null), prefix, name); + ModuleImport imp = moduleBuilder.getImport(prefix); + if (imp == null) { + LOG.warn("Error in module {} at line {}: No import found with prefix {}", moduleName, line, prefix); + return QName.create(name); + } + Date revision = imp.getRevision(); + TreeMap namespaces = namespaceContext.get(imp.getModuleName()); + URI namespace; + if (revision == null) { + revision = namespaces.lastEntry().getKey(); + namespace = namespaces.lastEntry().getValue(); + } else { + namespace = namespaces.get(revision); + } + qname = QName.create(namespace, revision, name); } - } else { - typeQName = QName.create(moduleQName, typeName); } - return typeQName; + return qname; } @Override @@ -600,9 +629,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { public void enterUses_stmt(final YangParser.Uses_stmtContext ctx) { final int line = ctx.getStart().getLine(); final String groupingPathStr = stringFromNode(ctx); + final SchemaPath groupingPath = parseXPathString(groupingPathStr, line); enterLog("uses", groupingPathStr, line); - UsesNodeBuilder builder = moduleBuilder.addUsesNode(line, groupingPathStr); + UsesNodeBuilder builder = moduleBuilder.addUsesNode(line, groupingPath); moduleBuilder.enterNode(builder); } @@ -620,7 +650,8 @@ public final class YangParserListenerImpl extends YangParserBaseListener { enterLog(AUGMENT_STR, augmentPath, line); stack.push(); - AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath, augmentOrder++); + SchemaPath targetPath = parseXPathString(augmentPath, line); + AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath, targetPath, augmentOrder++); for (int i = 0; i < ctx.getChildCount(); i++) { ParseTree child = ctx.getChild(i); @@ -940,11 +971,17 @@ public final class YangParserListenerImpl extends YangParserBaseListener { @Override public void enterDeviation_stmt(final YangParser.Deviation_stmtContext ctx) { final int line = ctx.getStart().getLine(); - final String targetPath = stringFromNode(ctx); - enterLog("deviation", targetPath, line); + final String targetPathStr = stringFromNode(ctx); + if (!targetPathStr.startsWith("/")) { + throw new YangParseException(moduleName, line, + "Deviation argument string must be an absolute schema node identifier."); + } + enterLog("deviation", targetPathStr, line); String reference = null; String deviate = null; + + SchemaPath targetPath = parseXPathString(targetPathStr, line); DeviationBuilder builder = moduleBuilder.addDeviation(line, targetPath); moduleBuilder.enterNode(builder); @@ -966,6 +1003,22 @@ public final class YangParserListenerImpl extends YangParserBaseListener { builder.setDeviate(deviate); } + public SchemaPath parseXPathString(final String xpathString, final int line) { + final boolean absolute = !xpathString.isEmpty() && xpathString.charAt(0) == '/'; + + final List path = new ArrayList<>(); + for (String pathElement : SLASH_SPLITTER.split(xpathString)) { + final Iterator it = COLON_SPLITTER.split(pathElement).iterator(); + final String s = it.next(); + if (it.hasNext()) { + path.add(parseQName(pathElement, line)); + } else { + path.add(QName.create(moduleQName, s)); + } + } + return SchemaPath.create(path, absolute); + } + @Override public void exitDeviation_stmt(final YangParser.Deviation_stmtContext ctx) { moduleBuilder.exitNode(); @@ -1026,39 +1079,31 @@ public final class YangParserListenerImpl extends YangParserBaseListener { enterLog("unknown-node", nodeParameter, line); final String nodeTypeStr = ctx.getChild(0).getText(); - final Iterator splittedElement = COLON_SPLITTER.split(nodeTypeStr).iterator(); - final String e0 = splittedElement.next(); - final QName nodeType; - if (splittedElement.hasNext()) { - nodeType = QName.create(moduleQName.getModule(), e0, splittedElement.next()); - } else { - nodeType = QName.create(moduleQName, e0); - } + QName nodeType = parseQName(nodeTypeStr, line); - QName qname; + QName qname = null; try { - if (!Strings.isNullOrEmpty(nodeParameter)) { + if (Strings.isNullOrEmpty(nodeParameter)) { + qname = nodeType; + } else { final Iterable splittedName = COLON_SPLITTER.split(nodeParameter); final Iterator it = splittedName.iterator(); - if (Iterables.size(splittedName) == 2) { - qname = QName.create(QNameModule.create(null, null), it.next(), it.next()); + qname = parseQName(nodeParameter, line); } else { qname = QName.create(moduleQName, it.next()); } - } else { - qname = nodeType; } } catch (IllegalArgumentException e) { qname = nodeType; } + SchemaPath path = stack.addNodeToPath(qname); UnknownSchemaNodeBuilderImpl builder = moduleBuilder.addUnknownSchemaNode(line, qname, path); builder.setNodeType(nodeType); builder.setNodeParameter(nodeParameter); - parseSchemaNodeArgs(ctx, builder); moduleBuilder.enterNode(builder); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/util/YangModelDependencyInfo.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/util/YangModelDependencyInfo.java index 97590779b2..69556c3e28 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/util/YangModelDependencyInfo.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/util/YangModelDependencyInfo.java @@ -11,11 +11,9 @@ import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.ge import com.google.common.base.Optional; import com.google.common.collect.ImmutableSet; - import java.io.InputStream; import java.util.Date; import java.util.List; - import org.antlr.v4.runtime.ParserRuleContext; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Belongs_to_stmtContext; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Import_stmtContext; @@ -218,7 +216,7 @@ public abstract class YangModelDependencyInfo { return builder.build(); } - private static String getLatestRevision(final Revision_stmtsContext revision_stmts) { + public static String getLatestRevision(final Revision_stmtsContext revision_stmts) { List revisions = revision_stmts.getRuleContexts(Revision_stmtContext.class); String latestRevision = null; for (Revision_stmtContext revisionStmt : revisions) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/repo/SharedSchemaContextFactory.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/repo/SharedSchemaContextFactory.java index 5873856f00..d40b726a14 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/repo/SharedSchemaContextFactory.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/repo/SharedSchemaContextFactory.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.parser.repo; import com.google.common.base.Function; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -18,13 +19,14 @@ import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; - +import java.net.URI; import java.util.Collection; +import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; - +import java.util.TreeMap; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTreeWalker; import org.opendaylight.yangtools.util.concurrent.ExceptionMapper; @@ -35,6 +37,7 @@ import org.opendaylight.yangtools.yang.model.repo.api.SchemaContextFactory; import org.opendaylight.yangtools.yang.model.repo.api.SchemaResolutionException; import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceFilter; import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; +import org.opendaylight.yangtools.yang.parser.builder.impl.BuilderUtils; import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder; import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; import org.opendaylight.yangtools.yang.parser.impl.YangParserListenerImpl; @@ -77,13 +80,15 @@ final class SharedSchemaContextFactory implements SchemaContextFactory { final Map asts = Maps.transformValues(srcs, ASTSchemaSource.GET_AST); + final Map> namespaceContext = BuilderUtils.createYangNamespaceContext( + asts.values(), Optional. absent()); final ParseTreeWalker walker = new ParseTreeWalker(); final Map sourceToBuilder = new LinkedHashMap<>(); for (Entry entry : asts.entrySet()) { - ModuleBuilder moduleBuilder = - YangParserListenerImpl.create(entry.getKey().getName(), walker, entry.getValue()).getModuleBuilder(); + ModuleBuilder moduleBuilder = YangParserListenerImpl.create(namespaceContext, entry.getKey().getName(), + walker, entry.getValue()).getModuleBuilder(); moduleBuilder.setSource(srcs.get(entry.getKey()).getYangText()); sourceToBuilder.put(entry.getKey(), moduleBuilder); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/Bug1412Test.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/Bug1412Test.java index 1527635d79..da54e9488d 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/Bug1412Test.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/Bug1412Test.java @@ -42,8 +42,8 @@ public class Bug1412Test { Date revision = new SimpleDateFormat("yyyy-MM-dd").parse("2014-07-25"); QNameModule qm = QNameModule.create(URI.create("urn:test:bug1412"), revision); - QName expectedNodeType = QName.create(qm, "action"); - assertEquals(expectedNodeType, action.getNodeType()); + QName expectedNodeType = new QName(null, null, null, "action"); + assertEquals(QName.create(null, (Date) null, "action"), action.getNodeType()); assertEquals("hello", action.getNodeParameter()); QName expectedQName = QName.create(qm, "hello"); assertEquals(expectedQName, action.getQName()); @@ -70,7 +70,7 @@ public class Bug1412Test { assertNotNull(actionPoint); assertNotNull(output); - expectedNodeType = QName.create(qm, "info"); + expectedNodeType = new QName(null, null, null, "info"); assertEquals(expectedNodeType, info.getNodeType()); assertEquals("greeting", info.getNodeParameter()); @@ -78,7 +78,7 @@ public class Bug1412Test { assertEquals(expectedNodeType, description.getNodeType()); assertEquals("say greeting", description.getNodeParameter()); - expectedNodeType = QName.create(qm, "actionpoint"); + expectedNodeType = new QName(null, null, null, "actionpoint"); assertEquals(expectedNodeType, actionPoint.getNodeType()); assertEquals("entry", actionPoint.getNodeParameter()); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/TypesResolutionTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/TypesResolutionTest.java index 53c335b874..2e7f932d3e 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/TypesResolutionTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/TypesResolutionTest.java @@ -262,13 +262,12 @@ public class TypesResolutionTest { String expectedDesc = "A timezone location as defined by the IANA timezone"; assertTrue(testedType.getDescription().contains(expectedDesc)); - assertNull(testedType.getReference()); + assertTrue(testedType.getReference().isEmpty()); assertEquals(Status.CURRENT, testedType.getStatus()); QName testedTypeQName = testedType.getQName(); assertEquals(URI.create("urn:ietf:params:xml:ns:yang:iana-timezones"), testedTypeQName.getNamespace()); assertEquals(TestUtils.createDate("2012-07-09"), testedTypeQName.getRevision()); - assertEquals("ianatz", testedTypeQName.getPrefix()); assertEquals("iana-timezone", testedTypeQName.getLocalName()); EnumerationType enumType = (EnumerationType) testedType.getBaseType(); @@ -300,7 +299,6 @@ public class TypesResolutionTest { QName testedTypeQName = testedType.getQName(); assertEquals(URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types"), testedTypeQName.getNamespace()); assertEquals(TestUtils.createDate("2010-09-24"), testedTypeQName.getRevision()); - assertEquals("yang", testedTypeQName.getPrefix()); assertEquals("object-identifier-128", testedTypeQName.getLocalName()); ExtendedType testedTypeBase = (ExtendedType) testedType.getBaseType(); @@ -314,7 +312,6 @@ public class TypesResolutionTest { QName testedTypeBaseQName = testedTypeBase.getQName(); assertEquals(URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types"), testedTypeBaseQName.getNamespace()); assertEquals(TestUtils.createDate("2010-09-24"), testedTypeBaseQName.getRevision()); - assertEquals("yang", testedTypeBaseQName.getPrefix()); assertEquals("object-identifier", testedTypeBaseQName.getLocalName()); } @@ -327,7 +324,6 @@ public class TypesResolutionTest { QName identity = baseType.getIdentity().getQName(); assertEquals(URI.create("urn:custom.types.demo"), identity.getNamespace()); assertEquals(TestUtils.createDate("2012-04-16"), identity.getRevision()); - assertEquals("iit", identity.getPrefix()); assertEquals("service-type", identity.getLocalName()); LeafSchemaNode type = (LeafSchemaNode) tested.getDataChildByName("type"); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserSimpleTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserSimpleTest.java index c5e86b431b..0320fa123a 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserSimpleTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserSimpleTest.java @@ -60,7 +60,6 @@ public class YangParserSimpleTest { // test SchemaNode args QName qname = data.getQName(); assertEquals("data", qname.getLocalName()); - assertEquals(snPref, qname.getPrefix()); assertEquals(snNS, qname.getNamespace()); assertEquals(snRev, qname.getRevision()); assertEquals("anyxml desc", data.getDescription()); @@ -160,8 +159,8 @@ public class YangParserSimpleTest { assertEquals(typedefQName, nodesType.getQName()); SchemaPath nodesTypePath = TestUtils.createPath(true, snNS, snRev, snPref, "nodes", "nodes-type"); assertEquals(nodesTypePath, nodesType.getPath()); - assertNull(nodesType.getDescription()); - assertNull(nodesType.getReference()); + assertTrue(nodesType.getDescription().isEmpty()); + assertTrue(nodesType.getReference().isEmpty()); assertEquals(Status.CURRENT, nodesType.getStatus()); assertEquals(0, nodesType.getUnknownSchemaNodes().size()); diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java index d59616bf15..f51058594f 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java @@ -176,7 +176,6 @@ public class YangParserTest { ExtendedType leafType = (ExtendedType) int32Leaf.getType(); QName leafTypeQName = leafType.getQName(); assertEquals("int32-ext2", leafTypeQName.getLocalName()); - assertEquals("foo", leafTypeQName.getPrefix()); assertEquals(fooNS, leafTypeQName.getNamespace()); assertEquals(fooRev, leafTypeQName.getRevision()); assertNull(leafType.getUnits()); @@ -192,7 +191,6 @@ public class YangParserTest { ExtendedType baseType = (ExtendedType) leafType.getBaseType(); QName baseTypeQName = baseType.getQName(); assertEquals("int32-ext2", baseTypeQName.getLocalName()); - assertEquals("bar", baseTypeQName.getPrefix()); assertEquals(barNS, baseTypeQName.getNamespace()); assertEquals(barRev, baseTypeQName.getRevision()); assertEquals("mile", baseType.getUnits()); @@ -211,7 +209,6 @@ public class YangParserTest { ExtendedType base = (ExtendedType) baseType.getBaseType(); QName baseQName = base.getQName(); assertEquals("int32-ext1", baseQName.getLocalName()); - assertEquals("bar", baseQName.getPrefix()); assertEquals(barNS, baseQName.getNamespace()); assertEquals(barRev, baseQName.getRevision()); assertNull(base.getUnits()); @@ -235,7 +232,6 @@ public class YangParserTest { ExtendedType type = (ExtendedType) stringleaf.getType(); QName typeQName = type.getQName(); assertEquals("string-ext4", typeQName.getLocalName()); - assertEquals("bar", typeQName.getPrefix()); assertEquals(barNS, typeQName.getNamespace()); assertEquals(barRev, typeQName.getRevision()); assertNull(type.getUnits()); @@ -250,7 +246,6 @@ public class YangParserTest { ExtendedType baseType1 = (ExtendedType) type.getBaseType(); QName baseType1QName = baseType1.getQName(); assertEquals("string-ext3", baseType1QName.getLocalName()); - assertEquals("bar", baseType1QName.getPrefix()); assertEquals(barNS, baseType1QName.getNamespace()); assertEquals(barRev, baseType1QName.getRevision()); assertNull(baseType1.getUnits()); @@ -265,7 +260,6 @@ public class YangParserTest { ExtendedType baseType2 = (ExtendedType) baseType1.getBaseType(); QName baseType2QName = baseType2.getQName(); assertEquals("string-ext2", baseType2QName.getLocalName()); - assertEquals("bar", baseType2QName.getPrefix()); assertEquals(barNS, baseType2QName.getNamespace()); assertEquals(barRev, baseType2QName.getRevision()); assertNull(baseType2.getUnits()); @@ -281,7 +275,6 @@ public class YangParserTest { ExtendedType baseType3 = (ExtendedType) baseType2.getBaseType(); QName baseType3QName = baseType3.getQName(); assertEquals("string-ext1", baseType3QName.getLocalName()); - assertEquals("bar", baseType3QName.getPrefix()); assertEquals(barNS, baseType3QName.getNamespace()); assertEquals(barRev, baseType3QName.getRevision()); assertNull(baseType3.getUnits()); @@ -309,7 +302,6 @@ public class YangParserTest { QName typeQName = type.getQName(); assertEquals("string-ext2", typeQName.getLocalName()); - assertEquals("foo", typeQName.getPrefix()); assertEquals(fooNS, typeQName.getNamespace()); assertEquals(fooRev, typeQName.getRevision()); assertNull(type.getUnits()); @@ -325,7 +317,6 @@ public class YangParserTest { ExtendedType baseType1 = (ExtendedType) type.getBaseType(); QName baseType1QName = baseType1.getQName(); assertEquals("string-ext2", baseType1QName.getLocalName()); - assertEquals("bar", baseType1QName.getPrefix()); assertEquals(barNS, baseType1QName.getNamespace()); assertEquals(barRev, baseType1QName.getRevision()); assertNull(baseType1.getUnits()); @@ -341,7 +332,6 @@ public class YangParserTest { ExtendedType baseType2 = (ExtendedType) baseType1.getBaseType(); QName baseType2QName = baseType2.getQName(); assertEquals("string-ext1", baseType2QName.getLocalName()); - assertEquals("bar", baseType2QName.getPrefix()); assertEquals(barNS, baseType2QName.getNamespace()); assertEquals(barRev, baseType2QName.getRevision()); assertNull(baseType2.getUnits()); @@ -368,7 +358,6 @@ public class YangParserTest { ExtendedType type = (ExtendedType) testleaf.getType(); QName typeQName = type.getQName(); assertEquals("my-decimal-type", typeQName.getLocalName()); - assertEquals("foo", typeQName.getPrefix()); assertEquals(fooNS, typeQName.getNamespace()); assertEquals(fooRev, typeQName.getRevision()); assertNull(type.getUnits()); @@ -381,7 +370,6 @@ public class YangParserTest { ExtendedType typeBase = (ExtendedType) type.getBaseType(); QName typeBaseQName = typeBase.getQName(); assertEquals("my-decimal-type", typeBaseQName.getLocalName()); - assertEquals("bar", typeBaseQName.getPrefix()); assertEquals(barNS, typeBaseQName.getNamespace()); assertEquals(barRev, typeBaseQName.getRevision()); assertNull(typeBase.getUnits()); @@ -403,7 +391,6 @@ public class YangParserTest { ExtendedType type = (ExtendedType) testleaf.getType(); QName typeQName = type.getQName(); assertEquals("my-decimal-type", typeQName.getLocalName()); - assertEquals("bar", typeQName.getPrefix()); assertEquals(barNS, typeQName.getNamespace()); assertEquals(barRev, typeQName.getRevision()); assertNull(type.getUnits()); @@ -425,7 +412,6 @@ public class YangParserTest { ExtendedType type = (ExtendedType) unionleaf.getType(); QName typeQName = type.getQName(); assertEquals("my-union-ext", typeQName.getLocalName()); - assertEquals("bar", typeQName.getPrefix()); assertEquals(barNS, typeQName.getNamespace()); assertEquals(barRev, typeQName.getRevision()); assertNull(type.getUnits()); @@ -438,7 +424,6 @@ public class YangParserTest { ExtendedType baseType = (ExtendedType) type.getBaseType(); QName baseTypeQName = baseType.getQName(); assertEquals("my-union", baseTypeQName.getLocalName()); - assertEquals("bar", baseTypeQName.getPrefix()); assertEquals(barNS, baseTypeQName.getNamespace()); assertEquals(barRev, baseTypeQName.getRevision()); assertNull(baseType.getUnits()); @@ -455,7 +440,6 @@ public class YangParserTest { ExtendedType unionType1 = (ExtendedType) unionTypes.get(0); QName unionType1QName = baseType.getQName(); assertEquals("my-union", unionType1QName.getLocalName()); - assertEquals("bar", unionType1QName.getPrefix()); assertEquals(barNS, unionType1QName.getNamespace()); assertEquals(barRev, unionType1QName.getRevision()); assertNull(unionType1.getUnits()); @@ -482,7 +466,6 @@ public class YangParserTest { QName testleafTypeQName = type.getQName(); assertEquals(bazNS, testleafTypeQName.getNamespace()); assertEquals(bazRev, testleafTypeQName.getRevision()); - assertEquals("baz", testleafTypeQName.getPrefix()); assertEquals("union1", testleafTypeQName.getLocalName()); assertNull(type.getUnits()); assertNull(type.getDefaultValue()); @@ -495,7 +478,6 @@ public class YangParserTest { QName typeBaseQName = typeBase.getQName(); assertEquals(bazNS, typeBaseQName.getNamespace()); assertEquals(bazRev, typeBaseQName.getRevision()); - assertEquals("baz", typeBaseQName.getPrefix()); assertEquals("union2", typeBaseQName.getLocalName()); assertNull(typeBase.getUnits()); assertNull(typeBase.getDefaultValue()); @@ -514,7 +496,6 @@ public class YangParserTest { QName uniontType1QName = unionType1.getQName(); assertEquals(barNS, uniontType1QName.getNamespace()); assertEquals(barRev, uniontType1QName.getRevision()); - assertEquals("bar", uniontType1QName.getPrefix()); assertEquals("nested-union2", uniontType1QName.getLocalName()); assertNull(unionType1.getUnits()); assertNull(unionType1.getDefaultValue()); @@ -533,7 +514,6 @@ public class YangParserTest { QName myUnionExtQName = myUnionExt.getQName(); assertEquals(barNS, myUnionExtQName.getNamespace()); assertEquals(barRev, myUnionExtQName.getRevision()); - assertEquals("bar", myUnionExtQName.getPrefix()); assertEquals("my-union-ext", myUnionExtQName.getLocalName()); assertNull(myUnionExt.getUnits()); assertNull(myUnionExt.getDefaultValue()); @@ -546,7 +526,6 @@ public class YangParserTest { QName myUnionQName = myUnion.getQName(); assertEquals(barNS, myUnionQName.getNamespace()); assertEquals(barRev, myUnionQName.getRevision()); - assertEquals("bar", myUnionQName.getPrefix()); assertEquals("my-union", myUnionQName.getLocalName()); assertNull(myUnion.getUnits()); assertNull(myUnion.getDefaultValue()); @@ -565,7 +544,6 @@ public class YangParserTest { QName int16ExtQName = int16Ext.getQName(); assertEquals(barNS, int16ExtQName.getNamespace()); assertEquals(barRev, int16ExtQName.getRevision()); - assertEquals("bar", int16ExtQName.getPrefix()); assertEquals("int16", int16ExtQName.getLocalName()); assertNull(int16Ext.getUnits()); assertNull(int16Ext.getDefaultValue()); @@ -703,7 +681,6 @@ public class YangParserTest { assertEquals(barNS, int32TypedefQName.getNamespace()); assertEquals(barRev, int32TypedefQName.getRevision()); - assertEquals("bar", int32TypedefQName.getPrefix()); assertEquals("int32-ext1", int32TypedefQName.getLocalName()); SchemaPath typeSchemaPath = int32ext1.getPath(); @@ -728,7 +705,6 @@ public class YangParserTest { assertEquals(barNS, myDecTypeQName.getNamespace()); assertEquals(barRev, myDecTypeQName.getRevision()); - assertEquals("bar", myDecTypeQName.getPrefix()); assertEquals("my-decimal-type", myDecTypeQName.getLocalName()); SchemaPath typeSchemaPath = myDecType.getPath(); @@ -743,7 +719,6 @@ public class YangParserTest { assertEquals(URI.create("urn:ietf:params:xml:ns:yang:1"), dec64QName.getNamespace()); assertNull(dec64QName.getRevision()); - assertEquals("", dec64QName.getPrefix()); assertEquals("decimal64", dec64QName.getLocalName()); SchemaPath dec64SchemaPath = dec64.getPath(); 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 16ebf9e4ce..7b0a59a367 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 @@ -73,14 +73,12 @@ public class YangParserWithContextTest { QName qname = leafType.getQName(); assertEquals(URI.create("urn:simple.demo.test1"), qname.getNamespace()); assertEquals(simpleDateFormat.parse("2013-06-18"), qname.getRevision()); - assertEquals("t1", qname.getPrefix()); assertEquals("port-number", qname.getLocalName()); ExtendedType leafBaseType = (ExtendedType) leafType.getBaseType(); qname = leafBaseType.getQName(); assertEquals(URI.create("urn:ietf:params:xml:ns:yang:ietf-inet-types"), qname.getNamespace()); assertEquals(simpleDateFormat.parse("2010-09-24"), qname.getRevision()); - assertEquals("inet", qname.getPrefix()); assertEquals("port-number", qname.getLocalName()); ExtendedType dscpExt = (ExtendedType) TestUtils.findTypedef(module.getTypeDefinitions(), "dscp-ext"); @@ -294,14 +292,12 @@ public class YangParserWithContextTest { QName idQName = identity.getQName(); assertEquals(URI.create("urn:simple.demo.test3"), idQName.getNamespace()); assertEquals(simpleDateFormat.parse("2013-06-18"), idQName.getRevision()); - assertEquals("t3", idQName.getPrefix()); assertEquals("pt", idQName.getLocalName()); IdentitySchemaNode baseIdentity = identity.getBaseIdentity(); QName idBaseQName = baseIdentity.getQName(); assertEquals(URI.create("urn:custom.types.demo"), idBaseQName.getNamespace()); assertEquals(simpleDateFormat.parse("2012-04-16"), idBaseQName.getRevision()); - assertEquals("iit", idBaseQName.getPrefix()); assertEquals("service-type", idBaseQName.getLocalName()); } @@ -327,7 +323,6 @@ public class YangParserWithContextTest { QName unType = un.getNodeType(); assertEquals(URI.create("urn:custom.types.demo"), unType.getNamespace()); assertEquals(simpleDateFormat.parse("2012-04-16"), unType.getRevision()); - assertEquals("custom", unType.getPrefix()); assertEquals("mountpoint", unType.getLocalName()); assertEquals("point", un.getNodeParameter()); assertNotNull(un.getExtensionDefinition()); -- 2.36.6