// Unknown nodes
@Override
public void enterIdentifier_stmt(YangParser.Identifier_stmtContext ctx) {
- final int line = ctx.getStart().getLine();
- final String nodeParameter = stringFromNode(ctx);
- enterLog("unknown-node", nodeParameter, line);
+ handleUnknownNode(ctx.getStart().getLine(), ctx);
+ }
- QName nodeType;
- final String nodeTypeStr = ctx.getChild(0).getText();
- final String[] splittedElement = nodeTypeStr.split(":");
- if (splittedElement.length == 1) {
- nodeType = new QName(namespace, revision, yangModelPrefix, splittedElement[0]);
- } else {
- nodeType = new QName(namespace, revision, splittedElement[0], splittedElement[1]);
- }
+ @Override
+ public void exitIdentifier_stmt(YangParser.Identifier_stmtContext ctx) {
+ moduleBuilder.exitNode();
+ exitLog("unknown-node", removeNodeFromPath());
+ }
- QName qname = null;
- try {
- if (!Strings.isNullOrEmpty(nodeParameter)) {
- String[] splittedName = nodeParameter.split(":");
- if (splittedName.length == 2) {
- qname = new QName(null, null, splittedName[0], splittedName[1]);
- } else {
- qname = new QName(namespace, revision, yangModelPrefix, splittedName[0]);
- }
- } else {
- qname = nodeType;
- }
- } catch (IllegalArgumentException e) {
- qname = nodeType;
-
- }
- addNodeToPath(qname);
- SchemaPath path = createActualSchemaPath(actualPath.peek());
+ @Override public void enterUnknown_statement(YangParser.Unknown_statementContext ctx) {
+ handleUnknownNode(ctx.getStart().getLine(), ctx);
+ }
- UnknownSchemaNodeBuilder builder = moduleBuilder.addUnknownSchemaNode(line, qname, path);
- builder.setNodeType(nodeType);
- builder.setNodeParameter(nodeParameter);
+ @Override public void exitUnknown_statement(YangParser.Unknown_statementContext ctx) {
+ moduleBuilder.exitNode();
+ exitLog("unknown-node", removeNodeFromPath());
+ }
+ @Override public void enterUnknown_statement2(YangParser.Unknown_statement2Context ctx) {
+ handleUnknownNode(ctx.getStart().getLine(), ctx);
+ }
- parseSchemaNodeArgs(ctx, builder);
- moduleBuilder.enterNode(builder);
+ @Override public void exitUnknown_statement2(YangParser.Unknown_statement2Context ctx) {
+ moduleBuilder.exitNode();
+ exitLog("unknown-node", removeNodeFromPath());
}
- @Override
- public void exitIdentifier_stmt(YangParser.Identifier_stmtContext ctx) {
+ @Override public void enterUnknown_statement3(YangParser.Unknown_statement3Context ctx) {
+ handleUnknownNode(ctx.getStart().getLine(), ctx);
+ }
+
+ @Override public void exitUnknown_statement3(YangParser.Unknown_statement3Context ctx) {
moduleBuilder.exitNode();
exitLog("unknown-node", removeNodeFromPath());
}
LOGGER.trace("setting {} {}", p1, p2);
}
+ private void handleUnknownNode(final int line, final ParseTree ctx) {
+ final String nodeParameter = stringFromNode(ctx);
+ enterLog("unknown-node", nodeParameter, line);
+
+ QName nodeType;
+ final String nodeTypeStr = ctx.getChild(0).getText();
+ final String[] splittedElement = nodeTypeStr.split(":");
+ if (splittedElement.length == 1) {
+ nodeType = new QName(namespace, revision, yangModelPrefix, splittedElement[0]);
+ } else {
+ nodeType = new QName(namespace, revision, splittedElement[0], splittedElement[1]);
+ }
+
+ QName qname = null;
+ try {
+ if (!Strings.isNullOrEmpty(nodeParameter)) {
+ String[] splittedName = nodeParameter.split(":");
+ if (splittedName.length == 2) {
+ qname = new QName(null, null, splittedName[0], splittedName[1]);
+ } else {
+ qname = new QName(namespace, revision, yangModelPrefix, splittedName[0]);
+ }
+ } else {
+ qname = nodeType;
+ }
+ } catch (IllegalArgumentException e) {
+ qname = nodeType;
+
+ }
+ addNodeToPath(qname);
+ SchemaPath path = createActualSchemaPath(actualPath.peek());
+
+ UnknownSchemaNodeBuilder builder = moduleBuilder.addUnknownSchemaNode(line, qname, path);
+ builder.setNodeType(nodeType);
+ builder.setNodeParameter(nodeParameter);
+
+
+ parseSchemaNodeArgs(ctx, builder);
+ moduleBuilder.enterNode(builder);
+ }
+
}
--- /dev/null
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+import java.util.Set;
+
+import org.junit.Test;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+
+/**
+ * Test antlr grammar capability to parse nested unknown nodes.
+ */
+public class Bug394Test {
+
+ @Test
+ public void testParseList() throws Exception {
+ Set<Module> modules = TestUtils.loadModules(getClass().getResource("/bugs/bug394").toURI());
+ Module bug394 = TestUtils.findModule(modules, "bug394");
+ assertNotNull(bug394);
+ Module bug394_ext = TestUtils.findModule(modules, "bug394-ext");
+ assertNotNull(bug394_ext);
+
+ ContainerSchemaNode logrecords = (ContainerSchemaNode) bug394.getDataChildByName("logrecords");
+ assertNotNull(logrecords);
+
+ List<UnknownSchemaNode> nodes = logrecords.getUnknownSchemaNodes();
+ assertEquals(2, nodes.size());
+
+ List<ExtensionDefinition> extensions = bug394_ext.getExtensionSchemaNodes();
+ assertEquals(2, extensions.size());
+
+ assertTrue(extensions.contains(nodes.get(0).getExtensionDefinition()));
+ assertTrue(extensions.contains(nodes.get(1).getExtensionDefinition()));
+ }
+
+}