From c54fea45082f87acada7de174fc269affc92a1b7 Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Wed, 18 Dec 2013 17:12:41 +0100 Subject: [PATCH] Fixed parser issue with splitted strings. Signed-off-by: Tony Tkacik --- .../yangtools/yang/common/QName.java | 5 ++++ .../yang/parser/util/ParserListenerUtils.java | 25 ++++++++++++++----- .../validator/YangModelValidationTest.java | 15 ++++++++--- .../resources/simple-test/simple-nodes.yang | 3 ++- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java index 790889a2d7..f52b21495a 100644 --- a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java +++ b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java @@ -17,6 +17,7 @@ import java.util.Date; import org.opendaylight.yangtools.concepts.Immutable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.opendaylight.yangtools.yang.common.QName; /** * The QName from XML consists of local name of element and XML namespace, but @@ -296,4 +297,8 @@ public final class QName implements Immutable,Serializable { public String getFormattedRevision() { return formattedRevision; } + + public QName withoutRevision() { + return QName.create(namespace, null, localName); + } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserListenerUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserListenerUtils.java index a25b627951..ff96d95d82 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserListenerUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserListenerUtils.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Stack; import org.antlr.v4.runtime.tree.ParseTree; +import org.antlr.v4.runtime.tree.TerminalNode; import org.opendaylight.yangtools.antlrv4.code.gen.*; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Argument_stmtContext; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Base_stmtContext; @@ -139,18 +140,30 @@ public final class ParserListenerUtils { if (treeNode.getChild(i) instanceof StringContext) { final StringContext context = (StringContext) treeNode.getChild(i); if (context != null) { - result = context.getChild(0).getText(); - if (!(result.startsWith("\"")) && result.endsWith("\"")) { - LOG.error("Syntax error in module {} at line {}: missing '\"'.", getParentModule(treeNode), - context.getStart().getLine()); - } - return result.replace("\"", ""); + return stringFromStringContext(context,treeNode); + } } } return result; } + private static String stringFromStringContext(StringContext context, ParseTree treeNode) { + StringBuilder str = new StringBuilder(); + for (TerminalNode stringNode : context.STRING()) { + String result = stringNode.getText(); + if(!result.contains("\"")){ + str.append(result); + } else if (!(result.startsWith("\"")) && result.endsWith("\"")) { + LOG.error("Syntax error in module {} at line {}: missing '\"'.", getParentModule(treeNode), + context.getStart().getLine()); + } else { + str.append(result.replace("\"", "")); + } + } + return str.toString(); + } + private static String getParentModule(final ParseTree ctx) { ParseTree current = ctx; while (current != null && !(current instanceof Module_stmtContext)) { diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/validator/YangModelValidationTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/validator/YangModelValidationTest.java index b1d6726194..56f4704f19 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/validator/YangModelValidationTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/validator/YangModelValidationTest.java @@ -15,12 +15,14 @@ import static org.mockito.Mockito.*; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.List; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.tree.ParseTree; +import org.antlr.v4.runtime.tree.TerminalNode; import org.junit.Before; import org.junit.Test; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Augment_stmtContext; @@ -237,12 +239,17 @@ public class YangModelValidationTest { } static void mockName(ParseTree stmt, String name) { - StringContext nameCtx = mock(StringContext.class); - ParseTree internalName = mock(ParseTree.class); doReturn(1).when(stmt).getChildCount(); - doReturn(name).when(internalName).getText(); - doReturn(internalName).when(nameCtx).getChild(0); + + TerminalNode terminalNode = mock(TerminalNode.class); + doReturn(name).when(terminalNode).getText(); + + StringContext nameCtx = mock(StringContext.class); doReturn(nameCtx).when(stmt).getChild(0); + doReturn(terminalNode).when(nameCtx).getChild(0); + doReturn(name).when(terminalNode).getText(); + + doReturn(Collections.singletonList(terminalNode)).when(nameCtx).STRING(); } static T mockStatement(Class stmtType, String name) { diff --git a/yang/yang-parser-impl/src/test/resources/simple-test/simple-nodes.yang b/yang/yang-parser-impl/src/test/resources/simple-test/simple-nodes.yang index 2dc1f89245..38ebfd8277 100644 --- a/yang/yang-parser-impl/src/test/resources/simple-test/simple-nodes.yang +++ b/yang/yang-parser-impl/src/test/resources/simple-test/simple-nodes.yang @@ -1,6 +1,7 @@ module simple-nodes { yang-version 1; - namespace "urn:opendaylight:simple-nodes"; + namespace "urn:opendaylight:"+ + "simple-nodes"; prefix "sn"; organization "opendaylight"; -- 2.36.6