diff options
author | ToineSiebelink <toine.siebelink@est.tech> | 2021-05-20 16:44:21 +0100 |
---|---|---|
committer | ToineSiebelink <toine.siebelink@est.tech> | 2021-06-01 10:12:55 +0100 |
commit | c37678a3eb62685d32a1581729e2a4e26002bffc (patch) | |
tree | 1901f7e3517ae339f99905f7ffc0021553874842 /cps-path-parser/src/main/java/org | |
parent | 9de3b68373dd8554e64f34bb3093403521f8759f (diff) |
Introducing Antlr4 for cpsPath parsing
-created new module for cpPathParser
-added antlr rule for cpsPathWithSingleLeafCondition
-added antlr rule for cpsPathWithDescendant (and with leaf conditions)
-added antlr rule for ancestor axis
-added unit test (copied from existing CpsPathQuerySpec)
-udpated cps-ri to use new cpPathQuery from parser module
-'imported' lexer rules from publix xPath grammar
-Re-used existing CpsPathException but conversion happens in cps-ri to prevent additional dependency in cps-path-parser module
Issue-ID: CPS-376
Change-Id: I2c5df98969402cbf69f6573c52705879450ce606
Signed-off-by: ToineSiebelink <toine.siebelink@est.tech>
Diffstat (limited to 'cps-path-parser/src/main/java/org')
3 files changed, 225 insertions, 0 deletions
diff --git a/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathBuilder.java b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathBuilder.java new file mode 100644 index 0000000000..83e076d53d --- /dev/null +++ b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathBuilder.java @@ -0,0 +1,107 @@ +package org.onap.cps.cpspath.parser; +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +import java.util.HashMap; +import java.util.Map; +import org.onap.cps.cpspath.parser.antlr4.CpsPathBaseListener; +import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.AncestorAxisContext; +import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.CpsPathWithDescendantAndLeafConditionsContext; +import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.CpsPathWithDescendantContext; +import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.CpsPathWithSingleLeafConditionContext; +import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.LeafConditionContext; +import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.MultipleValueConditionsContext; +import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.PrefixContext; +import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.SingleValueConditionContext; + +public class CpsPathBuilder extends CpsPathBaseListener { + + final CpsPathQuery cpsPathQuery = new CpsPathQuery(); + + final Map<String, Object> leavesData = new HashMap<>(); + + @Override + public void exitPrefix(final PrefixContext ctx) { + cpsPathQuery.setXpathPrefix(ctx.getText()); + } + + @Override + public void exitLeafCondition(final LeafConditionContext ctx) { + Object comparisonValue = null; + if (ctx.IntegerLiteral() != null) { + comparisonValue = Integer.valueOf(ctx.IntegerLiteral().getText()); + } + if (ctx.StringLiteral() != null) { + comparisonValue = stripFirstAndLastCharacter(ctx.StringLiteral().getText()); + } else if (comparisonValue == null) { + throw new IllegalStateException("Unsupported comparison value encountered in expression" + ctx.getText()); + } + leavesData.put(ctx.leafName().getText(), comparisonValue); + } + + @Override + public void enterSingleValueCondition(final SingleValueConditionContext ctx) { + leavesData.clear(); + } + + @Override + public void enterMultipleValueConditions(final MultipleValueConditionsContext ctx) { + leavesData.clear(); + } + + @Override + public void exitSingleValueCondition(final SingleValueConditionContext ctx) { + final String leafName = ctx.leafCondition().leafName().getText(); + cpsPathQuery.setLeafName(leafName); + cpsPathQuery.setLeafValue(leavesData.get(leafName)); + } + + @Override + public void exitCpsPathWithSingleLeafCondition(final CpsPathWithSingleLeafConditionContext ctx) { + cpsPathQuery.setCpsPathQueryType(CpsPathQueryType.XPATH_LEAF_VALUE); + } + + @Override + public void exitCpsPathWithDescendant(final CpsPathWithDescendantContext ctx) { + cpsPathQuery.setCpsPathQueryType(CpsPathQueryType.XPATH_HAS_DESCENDANT_ANYWHERE); + cpsPathQuery.setDescendantName(cpsPathQuery.getXpathPrefix().substring(1)); + } + + @Override + public void exitCpsPathWithDescendantAndLeafConditions( + final CpsPathWithDescendantAndLeafConditionsContext ctx) { + cpsPathQuery.setCpsPathQueryType(CpsPathQueryType.XPATH_HAS_DESCENDANT_WITH_LEAF_VALUES); + cpsPathQuery.setDescendantName(cpsPathQuery.getXpathPrefix().substring(1)); + cpsPathQuery.setLeavesData(leavesData); + } + + @Override + public void exitAncestorAxis(final AncestorAxisContext ctx) { + cpsPathQuery.setAncestorSchemaNodeIdentifier(ctx.ancestorPath().getText()); + } + + CpsPathQuery build() { + return cpsPathQuery; + } + + private static String stripFirstAndLastCharacter(final String wrappedString) { + return wrappedString.substring(1, wrappedString.length() - 1); + } + +} diff --git a/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathQuery.java b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathQuery.java new file mode 100644 index 0000000000..32fe0cbb74 --- /dev/null +++ b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathQuery.java @@ -0,0 +1,79 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.cpspath.parser; + + +import java.util.Map; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; +import org.antlr.v4.runtime.BaseErrorListener; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; +import org.onap.cps.cpspath.parser.antlr4.CpsPathLexer; +import org.onap.cps.cpspath.parser.antlr4.CpsPathParser; + +@Getter +@Setter(AccessLevel.PACKAGE) +public class CpsPathQuery { + + private CpsPathQueryType cpsPathQueryType; + private String xpathPrefix; + private String leafName; + private Object leafValue; + private String descendantName; + private Map<String, Object> leavesData; + private String ancestorSchemaNodeIdentifier = ""; + + /** + * Returns a cps path query. + * + * @param cpsPathSource cps path + * @return a CpsPathQuery object. + */ + public static CpsPathQuery createFrom(final String cpsPathSource) { + final var inputStream = CharStreams.fromString(cpsPathSource); + final var cpsPathLexer = new CpsPathLexer(inputStream); + final var cpsPathParser = new CpsPathParser(new CommonTokenStream(cpsPathLexer)); + cpsPathParser.addErrorListener(new BaseErrorListener() { + @Override + public void syntaxError(final Recognizer<?, ?> recognizer, final Object offendingSymbol, final int line, + final int charPositionInLine, final String msg, final RecognitionException e) { + throw new IllegalStateException("failed to parse at line " + line + " due to " + msg, e); + } + }); + final var cpsPathBuilder = new CpsPathBuilder(); + cpsPathParser.addParseListener(cpsPathBuilder); + cpsPathParser.cpsPath(); + return cpsPathBuilder.build(); + } + + /** + * Has ancestor axis been populated. + * + * @return boolean value. + */ + public boolean hasAncestorAxis() { + return !(ancestorSchemaNodeIdentifier.isEmpty()); + } + +} diff --git a/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathQueryType.java b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathQueryType.java new file mode 100644 index 0000000000..bc6b9f0929 --- /dev/null +++ b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathQueryType.java @@ -0,0 +1,39 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation + * Modifications Copyright (C) 2020-2021 Bell Canada. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.cpspath.parser; + +/** + * The enum Cps path query type. + */ +public enum CpsPathQueryType { + /** + * Xpath descendant anywhere type e.g. //nodeName . + */ + XPATH_HAS_DESCENDANT_ANYWHERE, + /** + * Xpath descendant anywhere type e.g. //nodeName[@leafName="value"] . + */ + XPATH_HAS_DESCENDANT_WITH_LEAF_VALUES, + /** + * Xpath leaf value cps path query type e.g. /cps-path[@leaf1="leafValue" and @leaf2=123] . + */ + XPATH_LEAF_VALUE +} |