From 64bfbcf13fd7b6baae318361a3ffbda94418113b Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 25 Dec 2019 23:52:59 +0100 Subject: [PATCH] Introduce yang-xpath-antlr This splits out ANTLR-generated parser code into a separate artifact, so that it does not interfere with our regular hand-written code. Also fixup the two issues reported by spotbugs and flip the switch on enforcement. JIRA: YANGTOOLS-1055 Change-Id: Ida1c152af8d5e2e235831f1d7b3e272820b085ca Signed-off-by: Robert Varga --- artifacts/pom.xml | 5 ++ docs/pom.xml | 4 ++ yang/pom.xml | 1 + yang/yang-xpath-antlr/pom.xml | 66 +++++++++++++++++++ .../yang/xpath/antlr}/instanceIdentifier.g4 | 0 .../yangtools/yang/xpath/antlr}/xpath.g4 | 0 yang/yang-xpath-impl/pom.xml | 25 +------ .../yang/xpath/impl/AntlrXPathParser.java | 54 +++++++-------- .../xpath/impl/CapturingErrorListener.java | 3 + .../yang/xpath/impl/FunctionSupport.java | 8 +-- .../xpath/impl/InstanceIdentifierParser.java | 24 +++---- 11 files changed, 127 insertions(+), 63 deletions(-) create mode 100644 yang/yang-xpath-antlr/pom.xml rename yang/{yang-xpath-impl/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/impl => yang-xpath-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/antlr}/instanceIdentifier.g4 (100%) rename yang/{yang-xpath-impl/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/impl => yang-xpath-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/antlr}/xpath.g4 (100%) diff --git a/artifacts/pom.xml b/artifacts/pom.xml index ab00687b5a..1eb26fa34c 100644 --- a/artifacts/pom.xml +++ b/artifacts/pom.xml @@ -238,6 +238,11 @@ yang-xpath-api 2.0.4-SNAPSHOT + + org.opendaylight.yangtools + yang-xpath-antlr + 2.0.4-SNAPSHOT + org.opendaylight.yangtools yang-xpath-impl diff --git a/docs/pom.xml b/docs/pom.xml index 2746602b25..1f203f1ba3 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -174,6 +174,10 @@ org.opendaylight.yangtools yang-xpath-api + + org.opendaylight.yangtools + yang-xpath-antlr + org.opendaylight.yangtools yang-xpath-impl diff --git a/yang/pom.xml b/yang/pom.xml index e749ed72cc..9732c75d2c 100644 --- a/yang/pom.xml +++ b/yang/pom.xml @@ -44,6 +44,7 @@ yang-xpath-api + yang-xpath-antlr yang-xpath-impl diff --git a/yang/yang-xpath-antlr/pom.xml b/yang/yang-xpath-antlr/pom.xml new file mode 100644 index 0000000000..0c421e058c --- /dev/null +++ b/yang/yang-xpath-antlr/pom.xml @@ -0,0 +1,66 @@ + + + + + 4.0.0 + + org.opendaylight.yangtools + bundle-parent + 4.0.4-SNAPSHOT + ../../bundle-parent + + + yang-xpath-antlr + 2.0.4-SNAPSHOT + bundle + ${project.artifactId} + YANG XPath ANTLR grammars + + + + true + + + + + org.antlr + antlr4-runtime + + + + + + + org.antlr + antlr4-maven-plugin + + + + antlr4 + + + + + false + + + + org.apache.felix + maven-bundle-plugin + true + + + org.opendaylight.yangtools.yang.xpath.antlr + + + + + + + diff --git a/yang/yang-xpath-impl/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/impl/instanceIdentifier.g4 b/yang/yang-xpath-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/antlr/instanceIdentifier.g4 similarity index 100% rename from yang/yang-xpath-impl/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/impl/instanceIdentifier.g4 rename to yang/yang-xpath-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/antlr/instanceIdentifier.g4 diff --git a/yang/yang-xpath-impl/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/impl/xpath.g4 b/yang/yang-xpath-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/antlr/xpath.g4 similarity index 100% rename from yang/yang-xpath-impl/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/impl/xpath.g4 rename to yang/yang-xpath-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/xpath/antlr/xpath.g4 diff --git a/yang/yang-xpath-impl/pom.xml b/yang/yang-xpath-impl/pom.xml index b3861df233..bed2ce699d 100644 --- a/yang/yang-xpath-impl/pom.xml +++ b/yang/yang-xpath-impl/pom.xml @@ -22,11 +22,6 @@ ${project.artifactId} YANG XPath parser - - - false - - com.google.guava @@ -44,11 +39,11 @@ org.opendaylight.yangtools yang-xpath-api - - org.antlr - antlr4-runtime + org.opendaylight.yangtools + yang-xpath-antlr + org.kohsuke.metainf-services metainf-services @@ -61,20 +56,6 @@ - - org.antlr - antlr4-maven-plugin - - - - antlr4 - - - - - false - - org.apache.felix maven-bundle-plugin diff --git a/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/AntlrXPathParser.java b/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/AntlrXPathParser.java index f89a5aad98..17be3ca2cf 100644 --- a/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/AntlrXPathParser.java +++ b/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/AntlrXPathParser.java @@ -47,6 +47,34 @@ import org.opendaylight.yangtools.yang.common.UnqualifiedQName; import org.opendaylight.yangtools.yang.common.YangConstants; import org.opendaylight.yangtools.yang.common.YangNamespaceContext; import org.opendaylight.yangtools.yang.common.YangVersion; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathLexer; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.AbbreviatedStepContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.AbsoluteLocationPathNorootContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.AdditiveExprContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.AndExprContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.AxisSpecifierContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.EqualityExprContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.ExprContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.FilterExprContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.FunctionCallContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.FunctionNameContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.LocationPathContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.MultiplicativeExprContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.NCNameContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.NameTestContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.NodeTestContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.OrExprContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.PathExprNoRootContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.PredicateContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.PrimaryExprContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.QNameContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.RelationalExprContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.RelativeLocationPathContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.StepContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.UnaryExprNoRootContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.UnionExprNoRootContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathParser.VariableReferenceContext; import org.opendaylight.yangtools.yang.xpath.api.YangBinaryOperator; import org.opendaylight.yangtools.yang.xpath.api.YangBooleanConstantExpr; import org.opendaylight.yangtools.yang.xpath.api.YangExpr; @@ -71,32 +99,6 @@ import org.opendaylight.yangtools.yang.xpath.api.YangXPathMathMode; import org.opendaylight.yangtools.yang.xpath.api.YangXPathMathSupport; import org.opendaylight.yangtools.yang.xpath.api.YangXPathNodeType; import org.opendaylight.yangtools.yang.xpath.api.YangXPathParser; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.AbbreviatedStepContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.AbsoluteLocationPathNorootContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.AdditiveExprContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.AndExprContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.AxisSpecifierContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.EqualityExprContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.ExprContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.FilterExprContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.FunctionCallContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.FunctionNameContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.LocationPathContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.MultiplicativeExprContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.NCNameContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.NameTestContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.NodeTestContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.OrExprContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.PathExprNoRootContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.PredicateContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.PrimaryExprContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.QNameContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.RelationalExprContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.RelativeLocationPathContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.StepContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.UnaryExprNoRootContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.UnionExprNoRootContext; -import org.opendaylight.yangtools.yang.xpath.impl.xpathParser.VariableReferenceContext; /** * ANTLR-based XPath parser. Uses {@code xpath.g4} ANTLR grammar. diff --git a/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/CapturingErrorListener.java b/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/CapturingErrorListener.java index d6a5d312d9..9e356884a0 100644 --- a/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/CapturingErrorListener.java +++ b/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/CapturingErrorListener.java @@ -7,6 +7,7 @@ */ package org.opendaylight.yangtools.yang.xpath.impl; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import javax.xml.xpath.XPathExpressionException; import org.antlr.v4.runtime.BaseErrorListener; import org.antlr.v4.runtime.RecognitionException; @@ -14,6 +15,8 @@ import org.antlr.v4.runtime.Recognizer; import org.eclipse.jdt.annotation.Nullable; final class CapturingErrorListener extends BaseErrorListener { + @SuppressFBWarnings(value = "NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR", + justification = "SB does not grok CDT") private @Nullable XPathExpressionException error; @Override diff --git a/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/FunctionSupport.java b/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/FunctionSupport.java index 74f2dce4b9..f23807631b 100644 --- a/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/FunctionSupport.java +++ b/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/FunctionSupport.java @@ -224,10 +224,10 @@ final class FunctionSupport { if (args.isEmpty()) { return NORMALIZE_SPACE; } - final YangExpr arg = args.get(0); - if (arg instanceof YangLiteralExpr) { - // TODO: normalize value - } + // final YangExpr arg = args.get(0); + // if (arg instanceof YangLiteralExpr) { + // // TODO: normalize value + // } return YangFunctionCallExpr.of(YangFunction.NORMALIZE_SPACE.getIdentifier(), args); } diff --git a/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/InstanceIdentifierParser.java b/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/InstanceIdentifierParser.java index 3c28a1faf4..cadea136ee 100644 --- a/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/InstanceIdentifierParser.java +++ b/yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/InstanceIdentifierParser.java @@ -22,6 +22,19 @@ import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; import org.opendaylight.yangtools.yang.common.QualifiedQName; import org.opendaylight.yangtools.yang.common.YangNamespaceContext; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.EqQuotedStringContext; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.InstanceIdentifierContext; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.KeyPredicateContext; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.KeyPredicateExprContext; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.LeafListPredicateContext; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.LeafListPredicateExprContext; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.NodeIdentifierContext; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.PathArgumentContext; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.PosContext; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.PredicateContext; +import org.opendaylight.yangtools.yang.xpath.antlr.instanceIdentifierParser.QuotedStringContext; +import org.opendaylight.yangtools.yang.xpath.antlr.xpathLexer; import org.opendaylight.yangtools.yang.xpath.api.YangBinaryOperator; import org.opendaylight.yangtools.yang.xpath.api.YangExpr; import org.opendaylight.yangtools.yang.xpath.api.YangLiteralExpr; @@ -33,17 +46,6 @@ import org.opendaylight.yangtools.yang.xpath.api.YangQNameExpr; import org.opendaylight.yangtools.yang.xpath.api.YangXPathAxis; import org.opendaylight.yangtools.yang.xpath.api.YangXPathMathMode; import org.opendaylight.yangtools.yang.xpath.api.YangXPathMathSupport; -import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.EqQuotedStringContext; -import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.InstanceIdentifierContext; -import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.KeyPredicateContext; -import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.KeyPredicateExprContext; -import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.LeafListPredicateContext; -import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.LeafListPredicateExprContext; -import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.NodeIdentifierContext; -import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.PathArgumentContext; -import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.PosContext; -import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.PredicateContext; -import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.QuotedStringContext; abstract class InstanceIdentifierParser { static final class Base extends InstanceIdentifierParser { -- 2.36.6