[YANGTOOLS-631] Parser: Backslash double-quote in double-quoted string not recognized Created: 11/Jul/16  Updated: 10/Apr/22  Resolved: 26/Sep/16

Status: Resolved
Project: yangtools
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug
Reporter: Vratko Polak Assignee: Peter Kajsa
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Operating System: All
Platform: All


External issue ID: 6180

 Description   

https://tools.ietf.org/html/rfc6020#section-6.1.3
If a string is enclosed in double-quotes, and the string itself contains a double-quote character, the character should be written as this: \"

But ODL currently seems to misinterpret that, possibly as a single backslash.
Example model to follow shortly.



 Comments   
Comment by Vratko Polak [ 11/Jul/16 ]

> Example model to follow shortly.

https://git.opendaylight.org/gerrit/#/c/41645/1

It shows two symptoms. Warning with TransformerException from usage in "when" statement, and wrong pattern compilation for restricted string type. Neither fault makes the build fail.
There is also a "good" model, showing the symptoms do not happen when single-quoted strings are used.

The pattern:
Good '"."' gets compiled from Yang into Java as "^\".\"$", which is correct.
But "\".\"" gets compiled as "^\\.
$", which is incorrect.

The "when" statement:
Good '/foo != "bar"' is accepted.
But "/foo != \"bar\"" leads to this long stacktrace:

[WARNING] Argument "/foo != \bar\" is not valid XPath string at "META-INF/yang/bug6180.yang:17:4"
javax.xml.transform.TransformerException: A location path was expected, but the following token was enc
ountered: \
at com.sun.org.apache.xpath.internal.compiler.XPathParser.error(XPathParser.java:612)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(XPathParser.java:1603)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(XPathParser.java:1319)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(XPathParser.java:1238)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(XPathParser.java:1144)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(XPathParser.java:1
065)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(XPathParser.java:1007)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(XPathParser.java:932)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(XPathParser.java:872)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(XPathParser.java:884)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(XPathParser.java:836)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(XPathParser.java:809)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(XPathParser.java:792)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(XPathParser.java:131)
at com.sun.org.apache.xpath.internal.XPath.<init>(XPath.java:180)
at com.sun.org.apache.xpath.internal.XPath.<init>(XPath.java:268)
at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.compile(XPathImpl.java:392)
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils.parseXPath(Utils.java:369)
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.WhenStatementImpl$Definition.parseArgume
ntValue(WhenStatementImpl.java:44)
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.WhenStatementImpl$Definition.parseArgume
ntValue(WhenStatementImpl.java:35)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementDefinitionContext.parseArgument
Value(StatementDefinitionContext.java:34)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.SubstatementContext.<init>(SubstatementC
ontext.java:49)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase$1.build(StatementCo
ntextBase.java:327)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextWriter.defferedCreate(St
atementContextWriter.java:45)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextWriter.endStatement(Stat
ementContextWriter.java:52)
at org.opendaylight.yangtools.yang.parser.impl.YangStatementParserListenerImpl.exitStatement(Ya
ngStatementParserListenerImpl.java:105)
at org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser$StatementContext.exitRule(Ya
ngStatementParser.java:117)
at org.antlr.v4.runtime.tree.ParseTreeWalker.exitRule(ParseTreeWalker.java:71)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:54)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:52)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:52)
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl.writeFull(YangSt
atementSourceImpl.java:98)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.SourceSpecificContext.loadStatements(Sou
rceSpecificContext.java:329)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.loadPhaseStatements(B
uildGlobalContext.java:228)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.buildEffective(BuildG
lobalContext.java:196)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor$BuildAction.
buildEffective(CrossSourceStatementReactor.java:134)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor$BuildAction.
buildEffective(CrossSourceStatementReactor.java:151)
at org.opendaylight.yangtools.yang2sources.plugin.YangToSourcesProcessor.processYang(YangToSour
cesProcessor.java:177)
at org.opendaylight.yangtools.yang2sources.plugin.YangToSourcesProcessor.execute(YangToSourcesProcessor.java:93)
at org.opendaylight.yangtools.yang2sources.plugin.YangToSourcesProcessor.conditionalExecute(YangToSourcesProcessor.java:104)
at org.opendaylight.yangtools.yang2sources.plugin.YangToSourcesMojo.execute(YangToSourcesMojo.java:119)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: A location path was expected, but the following token was encountered: \
at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.compile(XPathImpl.java:400)
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils.parseXPath(Utils.java:369)
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.WhenStatementImpl$Definition.parseArgumentValue(WhenStatementImpl.java:44)
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.WhenStatementImpl$Definition.parseArgumentValue(WhenStatementImpl.java:35)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementDefinitionContext.parseArgumentValue(StatementDefinitionContext.java:34)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.SubstatementContext.<init>(SubstatementContext.java:49)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase$1.build(StatementContextBase.java:327)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextWriter.defferedCreate(StatementContextWriter.java:45)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextWriter.endStatement(StatementContextWriter.java:52)
at org.opendaylight.yangtools.yang.parser.impl.YangStatementParserListenerImpl.exitStatement(YangStatementParserListenerImpl.java:105)
at org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser$StatementContext.exitRule(YangStatementParser.java:117)
at org.antlr.v4.runtime.tree.ParseTreeWalker.exitRule(ParseTreeWalker.java:71)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:54)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:52)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:52)
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl.writeFull(YangStatementSourceImpl.java:98)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.SourceSpecificContext.loadStatements(SourceSpecificContext.java:329)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.loadPhaseStatements(BuildGlobalContext.java:228)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.buildEffective(BuildGlobalContext.java:196)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor$BuildAction.buildEffective(CrossSourceStatementReactor.java:134)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor$BuildAction.buildEffective(CrossSourceStatementReactor.java:151)
at org.opendaylight.yangtools.yang2sources.plugin.YangToSourcesProcessor.processYang(YangToSourcesProcessor.java:177)
at org.opendaylight.yangtools.yang2sources.plugin.YangToSourcesProcessor.execute(YangToSourcesProcessor.java:93)
at org.opendaylight.yangtools.yang2sources.plugin.YangToSourcesProcessor.conditionalExecute(YangToSourcesProcessor.java:104)
at org.opendaylight.yangtools.yang2sources.plugin.YangToSourcesMojo.execute(YangToSourcesMojo.java:119)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: javax.xml.transform.TransformerException: A location path was expected, but the following token was encountered: \
at com.sun.org.apache.xpath.internal.compiler.XPathParser.error(XPathParser.java:612)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(XPathParser.java:1603)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(XPathParser.java:1319)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(XPathParser.java:1238)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(XPathParser.java:1144)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(XPathParser.java:1065)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(XPathParser.java:1007)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(XPathParser.java:932)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(XPathParser.java:872)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(XPathParser.java:884)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(XPathParser.java:836)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(XPathParser.java:809)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(XPathParser.java:792)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(XPathParser.java:131)
at com.sun.org.apache.xpath.internal.XPath.<init>(XPath.java:180)
at com.sun.org.apache.xpath.internal.XPath.<init>(XPath.java:268)
at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.compile(XPathImpl.java:392)
... 46 more

Comment by Peter Kajsa [ 14/Jul/16 ]

fix: https://git.opendaylight.org/gerrit/#/c/41828

However, the xpath expression of 'when' statement in the test model 'foo.yang' contains escaped double quotes (\"), which must be unescaped back to double quotes (\" -> ") in order to compile this expression successfully. We could do this by path.replace("\\\"", "\""), what will works fine for almost all cases, but I am not sure whether we really want to do this, because some special cases maybe would not work .. ?

Comment by Vratko Polak [ 22/Aug/16 ]

> fix: https://git.opendaylight.org/gerrit/#/c/41828

Merged.

Waiting for review: cherry-pick to Beryllium
https://git.opendaylight.org/gerrit/44490

Comment by Vratko Polak [ 26/Sep/16 ]

> cherry-pick to Beryllium https://git.opendaylight.org/gerrit/44490

... is merged now.

Generated at Wed Feb 07 20:53:50 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.