ContainerSchemaNodeBuilder builder = moduleBuilder.addContainerNode(line, containerQName, path);
parseSchemaNodeArgs(ctx, builder);
parseConstraints(ctx, builder.getConstraints());
- builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, line));
+ builder.setConfiguration(getConfig(ctx, builder, moduleName, line));
for (int i = 0; i < ctx.getChildCount(); ++i) {
final ParseTree childNode = ctx.getChild(i);
LeafSchemaNodeBuilder builder = moduleBuilder.addLeafNode(line, leafQName, path);
parseSchemaNodeArgs(ctx, builder);
parseConstraints(ctx, builder.getConstraints());
- builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, line));
+ builder.setConfiguration(getConfig(ctx, builder, moduleName, line));
String defaultStr = null;
String unitsStr = null;
parseSchemaNodeArgs(ctx, builder);
parseConstraints(ctx, builder.getConstraints());
- builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, ctx.getStart().getLine()));
+ builder.setConfiguration(getConfig(ctx, builder, moduleName, ctx.getStart().getLine()));
for (int i = 0; i < ctx.getChildCount(); ++i) {
final ParseTree childNode = ctx.getChild(i);
parseSchemaNodeArgs(ctx, builder);
parseConstraints(ctx, builder.getConstraints());
- builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, line));
+ builder.setConfiguration(getConfig(ctx, builder, moduleName, line));
for (int i = 0; i < ctx.getChildCount(); ++i) {
ParseTree childNode = ctx.getChild(i);
parseSchemaNodeArgs(ctx, builder);
parseConstraints(ctx, builder.getConstraints());
- builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, line));
+ builder.setConfiguration(getConfig(ctx, builder, moduleName, line));
}
@Override
parseSchemaNodeArgs(ctx, builder);
parseConstraints(ctx, builder.getConstraints());
- builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, line));
+ builder.setConfiguration(getConfig(ctx, builder, moduleName, line));
// set 'default' case
for (int i = 0; i < ctx.getChildCount(); i++) {
// 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());
}
ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcInput(line, rpcQName, path);
moduleBuilder.enterNode(builder);
+ builder.setConfiguration(true);
parseSchemaNodeArgs(ctx, builder);
parseConstraints(ctx, builder.getConstraints());
ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcOutput(path, rpcQName, line);
moduleBuilder.enterNode(builder);
+ builder.setConfiguration(true);
parseSchemaNodeArgs(ctx, builder);
parseConstraints(ctx, builder.getConstraints());
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);
+ }
+
}
*
* @param ctx
* context to parse
- * @param parent
- * parent node
+ * @param node
+ * current node
* @param moduleName
* name of current module
* @param line
* line in current module
* @return config statement parsed from given context
*/
- public static Boolean getConfig(final ParseTree ctx, final Builder parent, final String moduleName, final int line) {
- Boolean result;
+ public static boolean getConfig(final ParseTree ctx, final Builder node, final String moduleName, final int line) {
+ boolean result;
// parse configuration statement
Boolean config = null;
for (int i = 0; i < ctx.getChildCount(); i++) {
// If 'config' is not specified, the default is the same as the parent
// schema node's 'config' value
+ boolean parentConfig = getParentConfig(node);
if (config == null) {
- if (parent instanceof DataSchemaNodeBuilder) {
- Boolean parentConfig = ((DataSchemaNodeBuilder) parent).isConfiguration();
- // If the parent node is a rpc input or output, it can has
- // config set to null
- result = parentConfig == null ? true : parentConfig;
- } else {
- result = true;
- }
+ result = parentConfig;
} else {
- // Check first: if a node has 'config' set to 'false', no node
- // underneath it can have 'config' set to 'true'
- if (parent instanceof DataSchemaNodeBuilder && !(parent instanceof ChoiceCaseBuilder)) {
- Boolean parentConfig = ((DataSchemaNodeBuilder) parent).isConfiguration();
- if (!parentConfig && config) {
- throw new YangParseException(moduleName, line,
- "Can not set 'config' to 'true' if parent node has 'config' set to 'false'");
- }
+ // Check: if a node has 'config' set to 'false', no node underneath
+ // it can have 'config' set to 'true'
+ if (!parentConfig && config) {
+ throw new YangParseException(moduleName, line,
+ "Can not set 'config' to 'true' if parent node has 'config' set to 'false'");
}
result = config;
}
return result;
}
+ private static boolean getParentConfig(Builder node) {
+ Builder parent = node.getParent();
+ boolean config = false;
+
+ if (parent instanceof ChoiceCaseBuilder) {
+ parent = parent.getParent();
+ }
+ if (parent instanceof DataSchemaNodeBuilder) {
+ config = ((DataSchemaNodeBuilder) parent).isConfiguration();
+ } else {
+ config = true;
+ }
+ return config;
+ }
+
/**
* Parse config statement.
*
--- /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()));
+ }
+
+}