X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fimpl%2FYangParserListenerImpl.java;h=ec5e1f1820aa1bf4b5d72249da782f2cf5ee322b;hb=42abb28b99a02f9580f4676ce5c315628e5bcd24;hp=9de7ce02b4fa5b077b642d1e5214db151b4c7f12;hpb=74a75cfc9a232e70a94b9d496078d3bf5d234377;p=yangtools.git 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 9de7ce02b4..ec5e1f1820 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 @@ -21,7 +21,6 @@ import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.pa 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; - import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.collect.Iterables; @@ -34,7 +33,8 @@ import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.TreeMap; +import java.util.NavigableMap; +import java.util.Set; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTreeWalker; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser; @@ -70,6 +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; @@ -101,24 +102,34 @@ import org.opendaylight.yangtools.yang.parser.util.YangParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - +/** + * @deprecated Pre-Beryllium implementation, scheduled for removal. + */ +@Deprecated 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 static final String IMPORT_STR = "import"; + private static final String UNION_STR = "union"; + private static final String UNKNOWN_NODE_STR = "unknown-node"; + + /** + * Date Format is not thread-safe so we cannot make constant from it. + */ + private final DateFormat revisionFormat = new SimpleDateFormat("yyyy-MM-dd"); private final SchemaPathStack stack = new SchemaPathStack(); - private final Map> namespaceContext; + private final Map> namespaceContext; private final String sourcePath; - private QName moduleQName = new QName(null, new Date(0L), null, "dummy"); + private QName moduleQName = QName.create(null, new Date(0L), "dummy"); private ModuleBuilder moduleBuilder; private String moduleName; private int augmentOrder; private String yangModelPrefix; - public YangParserListenerImpl(final Map> namespaceContext, final String sourcePath) { + public YangParserListenerImpl(final Map> namespaceContext, final String sourcePath) { this.namespaceContext = namespaceContext; this.sourcePath = sourcePath; } @@ -130,21 +141,19 @@ 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 + * @param namespaceContext namespaceContext + * @param sourcePath sourcePath + * @param walker walker + * @param tree tree * @return new instance of YangParserListenerImpl */ - public static YangParserListenerImpl create(final Map> namespaceContext, + 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); @@ -157,7 +166,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { String description = null; String reference = null; for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); + final ParseTree child = ctx.getChild(i); if (child instanceof Description_stmtContext) { description = stringFromNode(child); } else if (child instanceof Reference_stmtContext) { @@ -190,7 +199,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { String description = null; String reference = null; for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); + final ParseTree child = ctx.getChild(i); if (child instanceof Description_stmtContext) { description = stringFromNode(child); } else if (child instanceof Reference_stmtContext) { @@ -214,8 +223,8 @@ public final class YangParserListenerImpl extends YangParserBaseListener { @Override public void enterBelongs_to_stmt(final YangParser.Belongs_to_stmtContext ctx) { final String belongsTo = stringFromNode(ctx); - TreeMap context = namespaceContext.get(belongsTo); - Map.Entry entry = context.firstEntry(); + final NavigableMap context = namespaceContext.get(belongsTo); + final Map.Entry entry = context.firstEntry(); // TODO // Submodule will contain namespace and revision from module to which it // belongs. If there are multiple modules with same name and different @@ -247,7 +256,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { setLog("namespace", namespaceStr); } else if (treeNode instanceof Prefix_stmtContext) { yangModelPrefix = stringFromNode(treeNode); - this.moduleQName = QName.create(moduleQName.getModule(), yangModelPrefix, moduleQName.getLocalName()); + this.moduleQName = QName.create(moduleQName.getModule(), moduleQName.getLocalName()); moduleBuilder.setPrefix(yangModelPrefix); setLog("prefix", yangModelPrefix); } else if (treeNode instanceof Yang_version_stmtContext) { @@ -271,7 +280,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { public void enterMeta_stmts(final YangParser.Meta_stmtsContext ctx) { enterLog("meta_stmt", "", ctx.getStart().getLine()); for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); + final ParseTree child = ctx.getChild(i); if (child instanceof Organization_stmtContext) { final String organization = stringFromNode(child); moduleBuilder.setOrganization(organization); @@ -316,19 +325,19 @@ public final class YangParserListenerImpl extends YangParserBaseListener { private void updateRevisionForRevisionStatement(final ParseTree treeNode) { final String revisionDateStr = stringFromNode(treeNode); try { - final Date revisionDate = SIMPLE_DATE_FORMAT.parse(revisionDateStr); + final Date revisionDate = revisionFormat.parse(revisionDateStr); if ((revisionDate != null) && (this.moduleQName.getRevision().compareTo(revisionDate) < 0)) { 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) { - ParseTree child = treeNode.getChild(i); + final ParseTree child = treeNode.getChild(i); if (child instanceof Reference_stmtContext) { moduleBuilder.setReference(stringFromNode(child)); } } } - } catch (ParseException e) { + } catch (final ParseException e) { LOG.warn("Failed to parse revision string: {}", revisionDateStr, e); } } @@ -337,7 +346,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { public void enterImport_stmt(final Import_stmtContext ctx) { final int line = ctx.getStart().getLine(); final String importName = stringFromNode(ctx); - enterLog("import", importName, line); + enterLog(IMPORT_STR, importName, line); String importPrefix = null; Date importRevision = null; @@ -347,10 +356,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { if (treeNode instanceof Prefix_stmtContext) { importPrefix = stringFromNode(treeNode); } else if (treeNode instanceof Revision_date_stmtContext) { - String importRevisionStr = stringFromNode(treeNode); + final String importRevisionStr = stringFromNode(treeNode); try { - importRevision = SIMPLE_DATE_FORMAT.parse(importRevisionStr); - } catch (ParseException e) { + importRevision = revisionFormat.parse(importRevisionStr); + } catch (final ParseException e) { LOG.warn("Failed to parse import revision-date at line {}: {}", line, importRevisionStr, e); } } @@ -361,23 +370,23 @@ public final class YangParserListenerImpl extends YangParserBaseListener { @Override public void exitImport_stmt(final Import_stmtContext ctx) { - exitLog("import"); + exitLog(IMPORT_STR); } @Override - public void enterInclude_stmt(YangParser.Include_stmtContext ctx) { + public void enterInclude_stmt(final YangParser.Include_stmtContext ctx) { final int line = ctx.getStart().getLine(); final String includeName = stringFromNode(ctx); - enterLog("import", includeName, line); + enterLog(IMPORT_STR, includeName, line); Date includeRevision = null; for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree treeNode = ctx.getChild(i); + final ParseTree treeNode = ctx.getChild(i); if (treeNode instanceof Revision_date_stmtContext) { - String importRevisionStr = stringFromNode(treeNode); + final String importRevisionStr = stringFromNode(treeNode); try { - includeRevision = SIMPLE_DATE_FORMAT.parse(importRevisionStr); - } catch (ParseException e) { + includeRevision = revisionFormat.parse(importRevisionStr); + } catch (final ParseException e) { LOG.warn("Failed to parse import revision-date at line {}: {}", line, importRevisionStr, e); } } @@ -385,7 +394,8 @@ public final class YangParserListenerImpl extends YangParserBaseListener { moduleBuilder.addInclude(includeName, includeRevision); } - @Override public void exitInclude_stmt(YangParser.Include_stmtContext ctx) { + @Override + public void exitInclude_stmt(final YangParser.Include_stmtContext ctx) { exitLog("include"); } @@ -396,11 +406,12 @@ public final class YangParserListenerImpl extends YangParserBaseListener { enterLog(AUGMENT_STR, augmentPath, line); stack.push(); - SchemaPath targetPath = parseXPathString(augmentPath, line); - AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath, targetPath, augmentOrder++); + final SchemaPath targetPath = parseXPathString(augmentPath, line); + final AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath, targetPath, + augmentOrder++); for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); + final ParseTree child = ctx.getChild(i); if (child instanceof Description_stmtContext) { builder.setDescription(stringFromNode(child)); } else if (child instanceof Reference_stmtContext) { @@ -427,16 +438,16 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final int line = ctx.getStart().getLine(); final String extName = stringFromNode(ctx); enterLog("extension", extName, line); - QName qname = QName.create(moduleQName, extName); - SchemaPath path = stack.addNodeToPath(qname); + final QName qname = QName.create(moduleQName, extName); + final SchemaPath path = stack.addNodeToPath(qname); - ExtensionBuilder builder = moduleBuilder.addExtension(qname, line, path); + final ExtensionBuilder builder = moduleBuilder.addExtension(qname, line, path); parseSchemaNodeArgs(ctx, builder); String argument = null; boolean yin = false; for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); + final ParseTree child = ctx.getChild(i); if (child instanceof Argument_stmtContext) { argument = stringFromNode(child); yin = parseYinValue((Argument_stmtContext) child); @@ -460,10 +471,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final int line = ctx.getStart().getLine(); final String typedefName = stringFromNode(ctx); enterLog("typedef", typedefName, line); - QName typedefQName = QName.create(moduleQName, typedefName); - SchemaPath path = stack.addNodeToPath(typedefQName); + final QName typedefQName = QName.create(moduleQName, typedefName); + final SchemaPath path = stack.addNodeToPath(typedefQName); - TypeDefinitionBuilder builder = moduleBuilder.addTypedef(line, typedefQName, path); + final TypeDefinitionBuilder builder = moduleBuilder.addTypedef(line, typedefQName, path); parseSchemaNodeArgs(ctx, builder); builder.setUnits(parseUnits(ctx)); builder.setDefaultValue(parseDefault(ctx)); @@ -506,17 +517,16 @@ public final class YangParserListenerImpl extends YangParserBaseListener { } else { QName qname; switch (typeName) { - case "union": - qname = BaseTypes.UNION_QNAME; - stack.addNodeToPath(qname); - UnionTypeBuilder unionBuilder = moduleBuilder.addUnionType(line, moduleQName.getModule()); - Builder parent = moduleBuilder.getActualNode(); - unionBuilder.setParent(parent); + case UNION_STR: + stack.addNodeToPath(BaseTypes.UNION_QNAME); + final UnionTypeBuilder unionBuilder = moduleBuilder.addUnionType(line, moduleQName.getModule()); + final Builder parentBuilder = moduleBuilder.getActualNode(); + unionBuilder.setParent(parentBuilder); moduleBuilder.enterNode(unionBuilder); break; case "identityref": qname = BaseTypes.IDENTITYREF_QNAME; - SchemaPath path = stack.addNodeToPath(qname); + final SchemaPath path = stack.addNodeToPath(qname); moduleBuilder.addIdentityrefType(line, path, getIdentityrefBase(typeBody)); break; default: @@ -527,28 +537,33 @@ public final class YangParserListenerImpl extends YangParserBaseListener { } } } else { - TypeAwareBuilder parent = (TypeAwareBuilder) moduleBuilder.getActualNode(); + final TypeAwareBuilder parent = (TypeAwareBuilder) moduleBuilder.getActualNode(); if (typeBody == null) { parent.setTypeQName(typeQName); moduleBuilder.markActualNodeDirty(); } else { - ParserListenerUtils.parseUnknownTypeWithBody(typeBody, parent, typeQName, moduleBuilder, - moduleQName, stack.currentSchemaPath()); + ParserListenerUtils.parseUnknownTypeWithBody(typeBody, parent, typeQName, moduleBuilder, moduleQName, + stack.currentSchemaPath()); } stack.addNodeToPath(QName.create(moduleQName.getModule(), typeQName.getLocalName())); } } /** - * Method transforms string representation of yang element (i.e. leaf name, container name etc.) into QName. - * The namespace of QName is assigned from parent module same as revision date of module. If String qname parameter - * contains ":" the string is evaluated as prefix:name of element. In this case method will look into import map - * and extract correct ModuleImport. If such import is not present in import map the method will throw {@link YangParseException} - *
- * If ModuleImport is present but the value of namespace in ModuleImport is null the method will throw {@link YangParseException} + * Method transforms string representation of yang element (i.e. leaf name, + * container name etc.) into QName. The namespace of QName is assigned from + * parent module same as revision date of module. If String qname parameter + * contains ":" the string is evaluated as prefix:name of element. In this + * case method will look into import map and extract correct ModuleImport. + * If such import is not present in import map the method will throw + * {@link YangParseException}
+ * If ModuleImport is present but the value of namespace in ModuleImport is + * null the method will throw {@link YangParseException} * - * @param qnameString QName value as String - * @param line line in Yang model document where QName occur. + * @param qnameString + * QName value as String + * @param line + * line in Yang model document where QName occur. * @return transformed string qname parameter as QName structure. * * @throws YangParseException @@ -556,22 +571,22 @@ public final class YangParserListenerImpl extends YangParserBaseListener { private QName parseQName(final String qnameString, final int line) { final QName qname; if (qnameString.indexOf(':') == -1) { - qname = QName.create(moduleQName.getNamespace(), moduleQName.getRevision(), qnameString); + qname = QName.create(moduleQName, qnameString); } else { final Iterator split = COLON_SPLITTER.split(qnameString).iterator(); final String prefix = split.next(); final String name = split.next(); if (prefix.equals(moduleBuilder.getPrefix())) { - qname = QName.create(moduleQName.getNamespace(), moduleQName.getRevision(), name); + qname = QName.create(moduleQName, name); } else { - ModuleImport imp = moduleBuilder.getImport(prefix); + final ModuleImport imp = moduleBuilder.getImport(prefix); if (imp == null) { LOG.debug("Error in module {} at line {}: No import found with prefix {}", moduleName, line, prefix); throw new YangParseException(moduleName, line, "Error in module " + moduleName - + " No import found with prefix " + prefix + " not found."); + + " No import found with prefix " + prefix + " not found."); } Date revision = imp.getRevision(); - TreeMap namespaces = namespaceContext.get(imp.getModuleName()); + final NavigableMap namespaces = namespaceContext.get(imp.getModuleName()); if (namespaces == null) { throw new YangParseException(moduleName, line, String.format("Imported module %s not found", imp.getModuleName())); @@ -581,9 +596,15 @@ public final class YangParserListenerImpl extends YangParserBaseListener { revision = namespaces.lastEntry().getKey(); namespace = namespaces.lastEntry().getValue(); } else { + // FIXME: this lookup does not look right, as we will end up + // with + // a qname which does not have a namespace. At any rate we + // should arrive at a QNameModule! namespace = namespaces.get(revision); } - qname = QName.create(namespace, revision, name); + + final QNameModule mod = QNameModule.create(namespace, revision).intern(); + qname = QName.create(mod, name); } } return qname; @@ -592,7 +613,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { @Override public void exitType_stmt(final YangParser.Type_stmtContext ctx) { final String typeName = stringFromNode(ctx); - if ("union".equals(typeName)) { + if (UNION_STR.equals(typeName)) { moduleBuilder.exitNode(); } exitLog("type", stack.removeNodeFromPath()); @@ -603,10 +624,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final int line = ctx.getStart().getLine(); final String groupName = stringFromNode(ctx); enterLog("grouping", groupName, line); - QName groupQName = QName.create(moduleQName, groupName); - SchemaPath path = stack.addNodeToPath(groupQName); + final QName groupQName = QName.create(moduleQName, groupName); + final SchemaPath path = stack.addNodeToPath(groupQName); - GroupingBuilder builder = moduleBuilder.addGrouping(ctx.getStart().getLine(), groupQName, path); + final GroupingBuilder builder = moduleBuilder.addGrouping(ctx.getStart().getLine(), groupQName, path); parseSchemaNodeArgs(ctx, builder); moduleBuilder.enterNode(builder); @@ -624,10 +645,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String containerName = stringFromNode(ctx); enterLog("container", containerName, line); - QName containerQName = QName.create(moduleQName, containerName); - SchemaPath path = stack.addNodeToPath(containerQName); + final QName containerQName = QName.create(moduleQName, containerName); + final SchemaPath path = stack.addNodeToPath(containerQName); - ContainerSchemaNodeBuilder builder = moduleBuilder.addContainerNode(line, containerQName, path); + final ContainerSchemaNodeBuilder builder = moduleBuilder.addContainerNode(line, containerQName, path); parseSchemaNodeArgs(ctx, builder); parseConstraints(ctx, builder.getConstraints()); builder.setConfiguration(getConfig(ctx, builder, moduleName, line)); @@ -655,10 +676,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String leafName = stringFromNode(ctx); enterLog("leaf", leafName, line); - QName leafQName = QName.create(moduleQName, leafName); - SchemaPath path = stack.addNodeToPath(leafQName); + final QName leafQName = QName.create(moduleQName, leafName); + final SchemaPath path = stack.addNodeToPath(leafQName); - LeafSchemaNodeBuilder builder = moduleBuilder.addLeafNode(line, leafQName, path); + final LeafSchemaNodeBuilder builder = moduleBuilder.addLeafNode(line, leafQName, path); parseSchemaNodeArgs(ctx, builder); parseConstraints(ctx, builder.getConstraints()); builder.setConfiguration(getConfig(ctx, builder, moduleName, line)); @@ -666,7 +687,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { String defaultStr = null; String unitsStr = null; for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); + final ParseTree child = ctx.getChild(i); if (child instanceof Default_stmtContext) { defaultStr = stringFromNode(child); } else if (child instanceof Units_stmtContext) { @@ -692,7 +713,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final SchemaPath groupingPath = parseXPathString(groupingPathStr, line); enterLog("uses", groupingPathStr, line); - UsesNodeBuilder builder = moduleBuilder.addUsesNode(line, groupingPath); + final UsesNodeBuilder builder = moduleBuilder.addUsesNode(line, groupingPath); moduleBuilder.enterNode(builder); } @@ -710,11 +731,12 @@ public final class YangParserListenerImpl extends YangParserBaseListener { enterLog(AUGMENT_STR, augmentPath, line); stack.push(); - SchemaPath targetPath = parseXPathString(augmentPath, line); - AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath, targetPath, augmentOrder++); + final SchemaPath targetPath = parseXPathString(augmentPath, line); + final AugmentationSchemaBuilder builder = moduleBuilder.addAugment(line, augmentPath, targetPath, + augmentOrder++); for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); + final ParseTree child = ctx.getChild(i); if (child instanceof Description_stmtContext) { builder.setDescription(stringFromNode(child)); } else if (child instanceof Reference_stmtContext) { @@ -741,7 +763,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String refineString = stringFromNode(ctx); enterLog("refine", refineString, ctx.getStart().getLine()); - RefineHolderImpl refine = parseRefine(ctx, moduleName); + final RefineHolderImpl refine = parseRefine(ctx, moduleName); moduleBuilder.addRefine(refine); moduleBuilder.enterNode(refine); } @@ -757,10 +779,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final int line = ctx.getStart().getLine(); final String leafListName = stringFromNode(ctx); enterLog("leaf-list", leafListName, line); - QName leafListQName = QName.create(moduleQName, leafListName); - SchemaPath path = stack.addNodeToPath(leafListQName); + final QName leafListQName = QName.create(moduleQName, leafListName); + final SchemaPath path = stack.addNodeToPath(leafListQName); - LeafListSchemaNodeBuilder builder = moduleBuilder.addLeafListNode(line, leafListQName, path); + final LeafListSchemaNodeBuilder builder = moduleBuilder.addLeafListNode(line, leafListQName, path); moduleBuilder.enterNode(builder); parseSchemaNodeArgs(ctx, builder); @@ -790,10 +812,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String listName = stringFromNode(ctx); enterLog("list", listName, line); - QName listQName = QName.create(moduleQName, listName); - SchemaPath path = stack.addNodeToPath(listQName); + final QName listQName = QName.create(moduleQName, listName); + final SchemaPath path = stack.addNodeToPath(listQName); - ListSchemaNodeBuilder builder = moduleBuilder.addListNode(line, listQName, path); + final ListSchemaNodeBuilder builder = moduleBuilder.addListNode(line, listQName, path); moduleBuilder.enterNode(builder); parseSchemaNodeArgs(ctx, builder); @@ -801,14 +823,17 @@ public final class YangParserListenerImpl extends YangParserBaseListener { builder.setConfiguration(getConfig(ctx, builder, moduleName, line)); for (int i = 0; i < ctx.getChildCount(); ++i) { - ParseTree childNode = ctx.getChild(i); + final ParseTree childNode = ctx.getChild(i); if (childNode instanceof Ordered_by_stmtContext) { final Ordered_by_stmtContext orderedBy = (Ordered_by_stmtContext) childNode; final boolean userOrdered = parseUserOrdered(orderedBy); builder.setUserOrdered(userOrdered); } else if (childNode instanceof Key_stmtContext) { - List key = createListKey((Key_stmtContext) childNode); + final Set key = createListKey((Key_stmtContext) childNode); builder.setKeys(key); + } else if (childNode instanceof YangParser.Identifier_stmtContext + && UNION_STR.equals(childNode.getChild(0).toString())) { + throw new YangParseException(moduleName, line, "Union statement is not allowed inside a list statement"); } } } @@ -825,10 +850,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String anyXmlName = stringFromNode(ctx); enterLog("anyxml", anyXmlName, line); - QName anyXmlQName = QName.create(moduleQName, anyXmlName); - SchemaPath path = stack.addNodeToPath(anyXmlQName); + final QName anyXmlQName = QName.create(moduleQName, anyXmlName); + final SchemaPath path = stack.addNodeToPath(anyXmlQName); - AnyXmlBuilder builder = moduleBuilder.addAnyXml(line, anyXmlQName, path); + final AnyXmlBuilder builder = moduleBuilder.addAnyXml(line, anyXmlQName, path); moduleBuilder.enterNode(builder); parseSchemaNodeArgs(ctx, builder); @@ -848,10 +873,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String choiceName = stringFromNode(ctx); enterLog("choice", choiceName, line); - QName choiceQName = QName.create(moduleQName, choiceName); - SchemaPath path = stack.addNodeToPath(choiceQName); + final QName choiceQName = QName.create(moduleQName, choiceName); + final SchemaPath path = stack.addNodeToPath(choiceQName); - ChoiceBuilder builder = moduleBuilder.addChoice(line, choiceQName, path); + final ChoiceBuilder builder = moduleBuilder.addChoice(line, choiceQName, path); moduleBuilder.enterNode(builder); parseSchemaNodeArgs(ctx, builder); @@ -860,9 +885,9 @@ public final class YangParserListenerImpl extends YangParserBaseListener { // set 'default' case for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); + final ParseTree child = ctx.getChild(i); if (child instanceof Default_stmtContext) { - String defaultCase = stringFromNode(child); + final String defaultCase = stringFromNode(child); builder.setDefaultCase(defaultCase); break; } @@ -881,10 +906,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String caseName = stringFromNode(ctx); enterLog("case", caseName, line); - QName caseQName = QName.create(moduleQName, caseName); - SchemaPath path = stack.addNodeToPath(caseQName); + final QName caseQName = QName.create(moduleQName, caseName); + final SchemaPath path = stack.addNodeToPath(caseQName); - ChoiceCaseBuilder builder = moduleBuilder.addCase(line, caseQName, path); + final ChoiceCaseBuilder builder = moduleBuilder.addCase(line, caseQName, path); moduleBuilder.enterNode(builder); parseSchemaNodeArgs(ctx, builder); @@ -903,10 +928,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String notificationName = stringFromNode(ctx); enterLog("notification", notificationName, line); - QName notificationQName = QName.create(moduleQName, notificationName); - SchemaPath path = stack.addNodeToPath(notificationQName); + final QName notificationQName = QName.create(moduleQName, notificationName); + final SchemaPath path = stack.addNodeToPath(notificationQName); - NotificationBuilder builder = moduleBuilder.addNotification(line, notificationQName, path); + final NotificationBuilder builder = moduleBuilder.addNotification(line, notificationQName, path); moduleBuilder.enterNode(builder); parseSchemaNodeArgs(ctx, builder); @@ -927,16 +952,18 @@ public final class YangParserListenerImpl extends YangParserBaseListener { @Override public void exitIdentifier_stmt(final YangParser.Identifier_stmtContext ctx) { moduleBuilder.exitNode(); - exitLog("unknown-node", stack.removeNodeFromPath()); + exitLog(UNKNOWN_NODE_STR, stack.removeNodeFromPath()); } - @Override public void enterUnknown_statement(final YangParser.Unknown_statementContext ctx) { + @Override + public void enterUnknown_statement(final YangParser.Unknown_statementContext ctx) { handleUnknownNode(ctx.getStart().getLine(), ctx); } - @Override public void exitUnknown_statement(final YangParser.Unknown_statementContext ctx) { + @Override + public void exitUnknown_statement(final YangParser.Unknown_statementContext ctx) { moduleBuilder.exitNode(); - exitLog("unknown-node", stack.removeNodeFromPath()); + exitLog(UNKNOWN_NODE_STR, stack.removeNodeFromPath()); } @Override @@ -945,13 +972,12 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String rpcName = stringFromNode(ctx); enterLog("rpc", rpcName, line); - QName rpcQName = QName.create(moduleQName, rpcName); - SchemaPath path = stack.addNodeToPath(rpcQName); + final QName rpcQName = QName.create(moduleQName, rpcName); + final SchemaPath path = stack.addNodeToPath(rpcQName); - RpcDefinitionBuilder rpcBuilder = moduleBuilder.addRpc(line, rpcQName, path); + final RpcDefinitionBuilder rpcBuilder = moduleBuilder.addRpc(line, rpcQName, path); moduleBuilder.enterNode(rpcBuilder); - parseSchemaNodeArgs(ctx, rpcBuilder); } @@ -967,10 +993,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String input = "input"; enterLog(input, input, line); - QName rpcQName = QName.create(moduleQName, input); - SchemaPath path = stack.addNodeToPath(rpcQName); + final QName rpcQName = QName.create(moduleQName, input); + final SchemaPath path = stack.addNodeToPath(rpcQName); - ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcInput(line, rpcQName, path); + final ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcInput(line, rpcQName, path); moduleBuilder.enterNode(builder); builder.setConfiguration(true); @@ -990,10 +1016,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String output = "output"; enterLog(output, output, line); - QName rpcQName = QName.create(moduleQName, output); - SchemaPath path = stack.addNodeToPath(rpcQName); + final QName rpcQName = QName.create(moduleQName, output); + final SchemaPath path = stack.addNodeToPath(rpcQName); - ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcOutput(path, rpcQName, line); + final ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcOutput(path, rpcQName, line); moduleBuilder.enterNode(builder); builder.setConfiguration(true); @@ -1013,10 +1039,10 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String featureName = stringFromNode(ctx); enterLog("feature", featureName, line); - QName featureQName = QName.create(moduleQName, featureName); - SchemaPath path = stack.addNodeToPath(featureQName); + final QName featureQName = QName.create(moduleQName, featureName); + final SchemaPath path = stack.addNodeToPath(featureQName); - FeatureBuilder featureBuilder = moduleBuilder.addFeature(line, featureQName, path); + final FeatureBuilder featureBuilder = moduleBuilder.addFeature(line, featureQName, path); moduleBuilder.enterNode(featureBuilder); parseSchemaNodeArgs(ctx, featureBuilder); @@ -1041,12 +1067,12 @@ public final class YangParserListenerImpl extends YangParserBaseListener { String reference = null; String deviate = null; - SchemaPath targetPath = parseXPathString(targetPathStr, line); - DeviationBuilder builder = moduleBuilder.addDeviation(line, targetPath); + final SchemaPath targetPath = parseXPathString(targetPathStr, line); + final DeviationBuilder builder = moduleBuilder.addDeviation(line, targetPath); moduleBuilder.enterNode(builder); for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); + final ParseTree child = ctx.getChild(i); if (child instanceof Reference_stmtContext) { reference = stringFromNode(child); } else if (child instanceof Deviate_not_supported_stmtContext) { @@ -1067,7 +1093,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final boolean absolute = !xpathString.isEmpty() && xpathString.charAt(0) == '/'; final List path = new ArrayList<>(); - for (String pathElement : SLASH_SPLITTER.split(xpathString)) { + for (final String pathElement : SLASH_SPLITTER.split(xpathString)) { final Iterator it = COLON_SPLITTER.split(pathElement).iterator(); final String s = it.next(); if (it.hasNext()) { @@ -1092,17 +1118,17 @@ public final class YangParserListenerImpl extends YangParserBaseListener { enterLog("identity", identityName, line); final QName identityQName = QName.create(moduleQName, identityName); - SchemaPath path = stack.addNodeToPath(identityQName); + final SchemaPath path = stack.addNodeToPath(identityQName); - IdentitySchemaNodeBuilder builder = moduleBuilder.addIdentity(identityQName, line, path); + final IdentitySchemaNodeBuilder builder = moduleBuilder.addIdentity(identityQName, line, path); moduleBuilder.enterNode(builder); parseSchemaNodeArgs(ctx, builder); for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); + final ParseTree child = ctx.getChild(i); if (child instanceof Base_stmtContext) { - String baseIdentityName = stringFromNode(child); + final String baseIdentityName = stringFromNode(child); builder.setBaseIdentityName(baseIdentityName); } } @@ -1136,16 +1162,19 @@ public final class YangParserListenerImpl extends YangParserBaseListener { private void handleUnknownNode(final int line, final ParseTree ctx) { final String nodeParameter = stringFromNode(ctx); - enterLog("unknown-node", nodeParameter, line); + enterLog(UNKNOWN_NODE_STR, nodeParameter, line); final String nodeTypeStr = ctx.getChild(0).getText(); - QName nodeType = parseQName(nodeTypeStr, line); + final QName nodeType = parseQName(nodeTypeStr, line); QName qname = null; try { - //FIXME: rewrite whole method to handle unknown nodes properly. - // This should be bugfix for bug https://bugs.opendaylight.org/show_bug.cgi?id=1539 - // After this fix bug https://bugs.opendaylight.org/show_bug.cgi?id=1538 MUST be fixed since + // FIXME: rewrite whole method to handle unknown nodes properly. + // This should be bugfix for bug + // https://bugs.opendaylight.org/show_bug.cgi?id=1539 + // After this fix bug + // https://bugs.opendaylight.org/show_bug.cgi?id=1538 MUST be fixed + // since // they are dependent!!! if (Strings.isNullOrEmpty(nodeParameter)) { qname = nodeType; @@ -1162,9 +1191,9 @@ public final class YangParserListenerImpl extends YangParserBaseListener { qname = nodeType; } - SchemaPath path = stack.addNodeToPath(qname); + final SchemaPath path = stack.addNodeToPath(qname); - UnknownSchemaNodeBuilderImpl builder = moduleBuilder.addUnknownSchemaNode(line, qname, path); + final UnknownSchemaNodeBuilderImpl builder = moduleBuilder.addUnknownSchemaNode(line, qname, path); builder.setNodeType(nodeType); builder.setNodeParameter(nodeParameter);