From e5b5a5e4d7cae28a72641aae6f5f6099db1ed695 Mon Sep 17 00:00:00 2001 From: Fiete Ostkamp Date: Fri, 23 Feb 2024 17:01:49 +0100 Subject: Do not use reflection for injecting the DslQueryProcessors - trade terseness for easier understanding of the code and maintainability - Split up DslQueryProcessor in two separate classes (v1 and v2) Issue-ID: AAI-3786 Change-Id: I7fe0411f6b694eb82616ac4a61a5376c630b5b2a Signed-off-by: Fiete Ostkamp --- .../java/org/onap/aai/config/DslConfiguration.java | 56 -------- .../main/java/org/onap/aai/rest/DslConsumer.java | 26 ++-- .../java/org/onap/aai/rest/RecentAPIConsumer.java | 6 +- .../org/onap/aai/rest/dsl/DslQueryProcessor.java | 152 +++++---------------- .../org/onap/aai/rest/dsl/V1DslQueryProcessor.java | 99 ++++++++++++++ .../org/onap/aai/rest/dsl/V2DslQueryProcessor.java | 106 ++++++++++++++ .../java/org/onap/aai/rest/dsl/v1/DslListener.java | 5 + .../java/org/onap/aai/rest/dsl/v2/DslListener.java | 5 + .../aai/rest/search/GenericQueryProcessor.java | 2 - .../java/org/onap/aai/service/RetiredService.java | 4 +- .../src/test/java/org/onap/aai/AAISetup.java | 11 +- .../onap/aai/rest/dsl/DslQueryProcessorV1Test.java | 9 +- .../onap/aai/rest/dsl/DslQueryProcessorV2Test.java | 5 + .../java/org/onap/aai/rest/dsl/ProdDslTest.java | 5 + 14 files changed, 289 insertions(+), 202 deletions(-) delete mode 100644 aai-traversal/src/main/java/org/onap/aai/config/DslConfiguration.java create mode 100644 aai-traversal/src/main/java/org/onap/aai/rest/dsl/V1DslQueryProcessor.java create mode 100644 aai-traversal/src/main/java/org/onap/aai/rest/dsl/V2DslQueryProcessor.java diff --git a/aai-traversal/src/main/java/org/onap/aai/config/DslConfiguration.java b/aai-traversal/src/main/java/org/onap/aai/config/DslConfiguration.java deleted file mode 100644 index 81e96d1..0000000 --- a/aai-traversal/src/main/java/org/onap/aai/config/DslConfiguration.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * 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. - * ============LICENSE_END========================================================= - */ -package org.onap.aai.config; - -import java.util.HashMap; -import java.util.Map; - -import org.antlr.v4.runtime.tree.ParseTreeListener; -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.introspection.LoaderFactory; -import org.onap.aai.rest.dsl.DslQueryProcessor; -import org.onap.aai.rest.enums.QueryVersion; -import org.onap.aai.setup.SchemaVersions; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class DslConfiguration { - - @Bean - @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public Map dslListeners(EdgeIngestor edgeIngestor, - SchemaVersions schemaVersions, LoaderFactory loaderFactory) { - Map dslListeners = new HashMap<>(); - dslListeners.put(QueryVersion.V1, - new org.onap.aai.rest.dsl.v1.DslListener(edgeIngestor, schemaVersions, loaderFactory)); - dslListeners.put(QueryVersion.V2, - new org.onap.aai.rest.dsl.v2.DslListener(edgeIngestor, schemaVersions, loaderFactory)); - return dslListeners; - } - - @Bean - @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public DslQueryProcessor dslQueryProcessor(Map dslListeners) { - return new DslQueryProcessor(dslListeners); - } -} diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java b/aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java index 7c1411e..78ca452 100644 --- a/aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java +++ b/aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java @@ -35,7 +35,6 @@ import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; -import org.antlr.v4.runtime.tree.ParseTreeListener; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.onap.aai.edges.EdgeIngestor; import org.onap.aai.exceptions.AAIException; @@ -43,6 +42,9 @@ import org.onap.aai.introspection.LoaderFactory; import org.onap.aai.introspection.ModelType; import org.onap.aai.rest.db.HttpEntry; import org.onap.aai.rest.dsl.DslQueryProcessor; +import org.onap.aai.rest.dsl.V1DslQueryProcessor; +import org.onap.aai.rest.dsl.V2DslQueryProcessor; +import org.onap.aai.rest.dsl.v1.DslListener; import org.onap.aai.rest.enums.QueryVersion; import org.onap.aai.rest.search.GenericQueryProcessor; import org.onap.aai.rest.search.GremlinServerSingleton; @@ -94,25 +96,24 @@ public class DslConsumer extends TraversalConsumer { private final String basePath; private final GremlinServerSingleton gremlinServerSingleton; private final XmlFormatTransformer xmlFormatTransformer; - // private final Map dslListeners; - private final EdgeIngestor edgeIngestor; - private final LoaderFactory loaderFactory; + private final DslListener v1DslListener; + private final org.onap.aai.rest.dsl.v2.DslListener v2DslListener; private QueryVersion dslApiVersion = DEFAULT_VERSION; + Map dslQueryProcessors; @Autowired public DslConsumer(@Qualifier("requestScopedTraversalUriHttpEntry") HttpEntry requestScopedTraversalUriHttpEntry, SchemaVersions schemaVersions, GremlinServerSingleton gremlinServerSingleton, XmlFormatTransformer xmlFormatTransformer, - EdgeIngestor edgeIngestor, LoaderFactory loaderFactory, - @Value("${schema.uri.base.path}") String basePath) { + @Value("${schema.uri.base.path}") String basePath, DslListener v1DslListener, org.onap.aai.rest.dsl.v2.DslListener v2DslListener) { this.httpEntry = requestScopedTraversalUriHttpEntry; this.schemaVersions = schemaVersions; this.gremlinServerSingleton = gremlinServerSingleton; this.xmlFormatTransformer = xmlFormatTransformer; this.basePath = basePath; - this.edgeIngestor = edgeIngestor; - this.loaderFactory = loaderFactory; + this.v1DslListener = v1DslListener; + this.v2DslListener = v2DslListener; } @PutMapping(produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) @@ -192,12 +193,9 @@ public class DslConsumer extends TraversalConsumer { && !AAIConfig.get(TraversalConstants.DSL_OVERRIDE).equals("false") && dslOverride.equals(AAIConfig.get(TraversalConstants.DSL_OVERRIDE)); - Map dslListeners = new HashMap<>(); - dslListeners.put(QueryVersion.V1, - new org.onap.aai.rest.dsl.v1.DslListener(edgeIngestor, schemaVersions, loaderFactory)); - dslListeners.put(QueryVersion.V2, - new org.onap.aai.rest.dsl.v2.DslListener(edgeIngestor, schemaVersions, loaderFactory)); - DslQueryProcessor dslQueryProcessor = new DslQueryProcessor(dslListeners); + DslQueryProcessor dslQueryProcessor = dslApiVersion.equals(QueryVersion.V1) + ? new V1DslQueryProcessor() + : new V2DslQueryProcessor(); if (isDslOverride) { dslQueryProcessor.setStartNodeValidationFlag(false); } diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/RecentAPIConsumer.java b/aai-traversal/src/main/java/org/onap/aai/rest/RecentAPIConsumer.java index 5f2f161..a74aeb7 100644 --- a/aai-traversal/src/main/java/org/onap/aai/rest/RecentAPIConsumer.java +++ b/aai-traversal/src/main/java/org/onap/aai/rest/RecentAPIConsumer.java @@ -103,7 +103,7 @@ public class RecentAPIConsumer extends RESTAPI { @Path("/{nodeType: .+}") @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - public Response getRecentData(String content, @PathParam("version") String versionParam, + public Response getRecentData(@PathParam("version") String versionParam, @PathParam("nodeType") String nodeType, @Context HttpHeaders headers, @Context HttpServletRequest req, @Context UriInfo info) { @@ -113,13 +113,13 @@ public class RecentAPIConsumer extends RESTAPI { new AaiCallable() { @Override public Response process() { - return processRecentData(content, req, versionParam, nodeType, info, headers); + return processRecentData(req, versionParam, nodeType, info, headers); } }); } - public Response processRecentData(String content, HttpServletRequest req, + public Response processRecentData(HttpServletRequest req, @PathParam("version") String versionParam, @PathParam("nodeType") String nodeType, @Context UriInfo info, @Context HttpHeaders headers) { diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryProcessor.java b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryProcessor.java index 59d4df1..b280304 100644 --- a/aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryProcessor.java +++ b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryProcessor.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2024 Deutsche Telekom SA. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,133 +17,35 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.dsl; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.reflect.InvocationTargetException; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.List; +import java.io.IOException; import java.util.Map; -import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.misc.ParseCancellationException; -import org.antlr.v4.runtime.tree.ParseTree; -import org.antlr.v4.runtime.tree.ParseTreeListener; -import org.antlr.v4.runtime.tree.ParseTreeWalker; import org.onap.aai.exceptions.AAIException; -import org.onap.aai.rest.dsl.v2.DslListener; -import org.onap.aai.rest.dsl.validation.DslValidator; import org.onap.aai.rest.enums.QueryVersion; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -/** - * The Class DslQueryProcessor. - */ -public class DslQueryProcessor { +public abstract class DslQueryProcessor { - private static final Logger LOGGER = LoggerFactory.getLogger(DslQueryProcessor.class); - - private Map dslListeners; - private boolean startNodeValidationFlag = true; - private String validationRules = ""; - private static final String DSL_BASE_PACKAGE = "org.onap.aai.dsl."; - private static final String LEXER = "AAIDslLexer"; - private static final String PARSER = "AAIDslParser"; private static final String EOF_TOKEN = ""; + private boolean hasStartNodeValidationFlag = true; private boolean isAggregate = false; + private String validationRules = ""; - public DslQueryProcessor(Map dslListeners) { - this.dslListeners = dslListeners; - } + protected abstract Map getQueryResultMap(String aaiQuery) throws IOException, AAIException; public Map parseAaiQuery(QueryVersion version, String aaiQuery) throws AAIException { - Map resultMap = new HashMap<>(); try { - // Create a input stream that reads our string - InputStream stream = - new ByteArrayInputStream(aaiQuery.getBytes(StandardCharsets.UTF_8)); - - String packageName = DSL_BASE_PACKAGE + version.toString().toLowerCase() + "."; - Class lexerClass = Class.forName(packageName + LEXER); - Class parserClass = Class.forName(packageName + PARSER); - - Lexer lexer = (Lexer) lexerClass.getConstructor(CharStream.class) - .newInstance(CharStreams.fromStream(stream, StandardCharsets.UTF_8)); - lexer.removeErrorListeners(); - lexer.addErrorListener(new AAIDslErrorListener()); - CommonTokenStream tokens = new CommonTokenStream(lexer); - - // Parser that feeds off of the tokens buffer - Parser parser = - (Parser) parserClass.getConstructor(TokenStream.class).newInstance(tokens); - parser.removeErrorListeners(); - parser.addErrorListener(new AAIDslErrorListener()); - ParseTreeListener dslListener = dslListeners.get(version); - dslListener.getClass().getMethod("setValidationFlag", boolean.class).invoke(dslListener, - isStartNodeValidationFlag()); - dslListener.getClass().getMethod("setAggregateFlag", boolean.class).invoke(dslListener, - isAggregate()); - - if (!getValidationRules().isEmpty() && !"none".equals(getValidationRules())) { - DslValidator validator = new DslValidator.Builder().create(); - dslListener.getClass() - .getMethod("setQueryValidator", DslValidator.class, String.class) - .invoke(dslListener, validator, getValidationRules()); - } - - // Specify our entry point - ParseTree ptree = (ParseTree) parserClass.getMethod("aaiquery").invoke(parser); - - // Check if there is no EOF token at the end of the parsed aaiQuery - // If none, DSL query may have not been parsed correctly and omitted part of the query - // out. If so error out. - // If it wasn't expecting a opening parens after a closing bracket for union, it will - // drop the proceeding part of the query. - Token eofToken = tokens.get(tokens.size() - 1); - if (eofToken != null && !eofToken.getText().equals(EOF_TOKEN)) { - if (eofToken.getText().equals("(")) { - throw new AAIException("AAI_6153", - "DSL Syntax Error while processing the query: DSL Query could not be parsed correctly. Please check your syntax."); - } - } - - if (LOGGER.isInfoEnabled()) { - LOGGER.info("QUERY-interim {}", ptree.toStringTree(parser)); - } - - // Walk it and attach our listener - ParseTreeWalker walker = new ParseTreeWalker(); - - walker.walk(dslListener, ptree); - String query = - (String) dslListener.getClass().getMethod("getQuery").invoke(dslListener); - resultMap.put("query", query); - if (version.equals(QueryVersion.V2)) { - Map> selectKeys = ((DslListener) dslListener).getSelectKeys(); - if (selectKeys != null && !selectKeys.isEmpty()) { - resultMap.put("propertiesMap", selectKeys); - } - } - LOGGER.info("Final QUERY {}", query); - return resultMap; - } catch (InvocationTargetException e) { - if (e.getTargetException() instanceof ParseCancellationException) { - throw new AAIException("AAI_6153", "DSL Syntax Error while processing the query :" - + e.getTargetException().getMessage()); - } else if (e.getTargetException() instanceof AAIException) { - AAIException ex = (AAIException) e.getTargetException(); - throw new AAIException((ex.getCode().isEmpty() ? "AAI_6149" : ex.getCode()), - "DSL Error while processing the query :" + ex.getMessage()); - } else { - throw new AAIException("AAI_6152", "Exception while processing DSL query"); - } - + return getQueryResultMap(aaiQuery); + } catch(AAIException ex) { + throw new AAIException((ex.getCode().isEmpty() ? "AAI_6149" : ex.getCode()), + "DSL Error while processing the query :" + ex.getMessage()); } catch (ParseCancellationException e) { throw new AAIException("AAI_6153", "DSL Syntax Error while processing the query: " + e.getMessage()); @@ -151,16 +53,35 @@ public class DslQueryProcessor { } catch (Exception e) { throw new AAIException("AAI_6152", "Error while processing the query: " + e.getMessage()); + } + } + /** + * Check if there is no EOF token at the end of the parsed aaiQuery + * If none, DSL query may have not been parsed correctly and omitted part of the query + * out. If so error out. + * If it wasn't expecting an opening parenthesis after a closing bracket for union, it will + * drop the proceeding part of the query. + * @param tokens + * @throws AAIException + */ + protected void validateQueryIsParsable(CommonTokenStream tokens) throws AAIException { + + Token eofToken = tokens.get(tokens.size() - 1); + if (eofToken != null && !eofToken.getText().equals(EOF_TOKEN)) { + if (eofToken.getText().equals("(")) { + throw new AAIException("AAI_6153", + "DSL Syntax Error while processing the query: DSL Query could not be parsed correctly. Please check your syntax."); + } } } - public boolean isStartNodeValidationFlag() { - return startNodeValidationFlag; + public boolean hasStartNodeValidationFlag() { + return hasStartNodeValidationFlag; } public void setStartNodeValidationFlag(boolean startNodeValidationFlag) { - this.startNodeValidationFlag = startNodeValidationFlag; + this.hasStartNodeValidationFlag = startNodeValidationFlag; } public boolean isAggregate() { @@ -178,4 +99,5 @@ public class DslQueryProcessor { public void setValidationRules(String validationRules) { this.validationRules = validationRules; } -} + +} \ No newline at end of file diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/dsl/V1DslQueryProcessor.java b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/V1DslQueryProcessor.java new file mode 100644 index 0000000..cc89b7d --- /dev/null +++ b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/V1DslQueryProcessor.java @@ -0,0 +1,99 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Modifications Copyright © 2024 Deutsche Telekom SA. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ +package org.onap.aai.rest.dsl; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.ParseCancellationException; +import org.antlr.v4.runtime.tree.ParseTree; +import org.antlr.v4.runtime.tree.ParseTreeWalker; +import org.onap.aai.config.SpringContextAware; +import org.onap.aai.dsl.v1.AAIDslLexer; +import org.onap.aai.dsl.v1.AAIDslParser; +import org.onap.aai.exceptions.AAIException; +import org.onap.aai.rest.dsl.v1.DslListener; +import org.onap.aai.rest.dsl.validation.DslValidator; +import org.onap.aai.rest.enums.QueryVersion; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +/** + * The Class DslQueryProcessor. + */ +@Scope("prototype") +@Component(value = "dslQueryProcessor") +public class V1DslQueryProcessor extends DslQueryProcessor { + + private static final Logger LOGGER = LoggerFactory.getLogger(V1DslQueryProcessor.class); + + @Override + public Map getQueryResultMap(String aaiQuery) throws IOException, AAIException { + Map resultMap = new HashMap<>(); + // Create a input stream that reads our string + InputStream stream = + new ByteArrayInputStream(aaiQuery.getBytes(StandardCharsets.UTF_8)); + + Lexer lexer = new AAIDslLexer(CharStreams.fromStream(stream, StandardCharsets.UTF_8)); + lexer.removeErrorListeners(); + lexer.addErrorListener(new AAIDslErrorListener()); + CommonTokenStream tokens = new CommonTokenStream(lexer); + + // Parser that feeds off of the tokens buffer + AAIDslParser parser = new AAIDslParser(tokens); + parser.removeErrorListeners(); + parser.addErrorListener(new AAIDslErrorListener()); + + ParseTree ptree = parser.aaiquery(); + + validateQueryIsParsable(tokens); + + if (LOGGER.isInfoEnabled()) { + LOGGER.info("QUERY-interim {}", ptree.toStringTree(parser)); + } + + DslListener dslListener = SpringContextAware.getApplicationContext().getBean(DslListener.class); + dslListener.setValidationFlag(hasStartNodeValidationFlag()); + dslListener.setAggregateFlag(isAggregate()); + + if (!getValidationRules().isEmpty() && !"none".equals(getValidationRules())) { + DslValidator validator = new DslValidator.Builder().create(); + dslListener.setQueryValidator(validator, getValidationRules()); + } + + // Walk it and attach our listener + ParseTreeWalker walker = new ParseTreeWalker(); + walker.walk(dslListener, ptree); + String query = dslListener.getQuery(); + resultMap.put("query", query); + + LOGGER.info("Final QUERY {}", query); + return resultMap; + } +} diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/dsl/V2DslQueryProcessor.java b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/V2DslQueryProcessor.java new file mode 100644 index 0000000..28d5ef0 --- /dev/null +++ b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/V2DslQueryProcessor.java @@ -0,0 +1,106 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Modifications Copyright © 2024 Deutsche Telekom SA. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ +package org.onap.aai.rest.dsl; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.ParseCancellationException; +import org.antlr.v4.runtime.tree.ParseTree; +import org.antlr.v4.runtime.tree.ParseTreeWalker; +import org.onap.aai.config.SpringContextAware; +import org.onap.aai.dsl.v2.AAIDslLexer; +import org.onap.aai.dsl.v2.AAIDslParser; +import org.onap.aai.exceptions.AAIException; +import org.onap.aai.rest.dsl.v2.DslListener; +import org.onap.aai.rest.dsl.validation.DslValidator; +import org.onap.aai.rest.enums.QueryVersion; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +/** + * The Class DslQueryProcessor. + */ +@Component +@Scope("prototype") +public class V2DslQueryProcessor extends DslQueryProcessor { + + private static final Logger LOGGER = LoggerFactory.getLogger(V2DslQueryProcessor.class); + + @Override + protected Map getQueryResultMap(String aaiQuery) throws IOException, AAIException { + // Create a input stream that reads our string + InputStream stream = + new ByteArrayInputStream(aaiQuery.getBytes(StandardCharsets.UTF_8)); + + Lexer lexer = new AAIDslLexer(CharStreams.fromStream(stream, StandardCharsets.UTF_8)); + lexer.removeErrorListeners(); + lexer.addErrorListener(new AAIDslErrorListener()); + CommonTokenStream tokens = new CommonTokenStream(lexer); + + // Parser that feeds off of the tokens buffer + AAIDslParser parser = new AAIDslParser(tokens); + parser.removeErrorListeners(); + parser.addErrorListener(new AAIDslErrorListener()); + + ParseTree ptree = parser.aaiquery(); + + validateQueryIsParsable(tokens); + + if (LOGGER.isInfoEnabled()) { + LOGGER.info("QUERY-interim {}", ptree.toStringTree(parser)); + } + + DslListener dslListener = SpringContextAware.getApplicationContext().getBean(DslListener.class); + dslListener.setValidationFlag(hasStartNodeValidationFlag()); + dslListener.setAggregateFlag(isAggregate()); + + if (!getValidationRules().isEmpty() && !"none".equals(getValidationRules())) { + DslValidator validator = new DslValidator.Builder().create(); + dslListener.setQueryValidator(validator, getValidationRules()); + } + + // Walk it and attach our listener + ParseTreeWalker walker = new ParseTreeWalker(); + walker.walk(dslListener, ptree); + String query = dslListener.getQuery(); + + Map resultMap = new HashMap<>(); + resultMap.put("query", query); + + Map> selectKeys = dslListener.getSelectKeys(); + if (selectKeys != null && !selectKeys.isEmpty()) { + resultMap.put("propertiesMap", selectKeys); + } + + LOGGER.info("Final QUERY {}", query); + return resultMap; + } +} diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/dsl/v1/DslListener.java b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/v1/DslListener.java index 1987310..1ad1292 100644 --- a/aai-traversal/src/main/java/org/onap/aai/rest/dsl/v1/DslListener.java +++ b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/v1/DslListener.java @@ -39,10 +39,15 @@ import org.onap.aai.rest.dsl.validation.DslValidatorRule; import org.onap.aai.setup.SchemaVersions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.stereotype.Component; /** * The Class DslListener. */ +@Scope(value = "prototype") +@Component(value = "v1DslListener") public class DslListener extends AAIDslBaseListener { private static final Logger LOGGER = LoggerFactory.getLogger(DslListener.class); diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/dsl/v2/DslListener.java b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/v2/DslListener.java index 5395af0..571f6f6 100644 --- a/aai-traversal/src/main/java/org/onap/aai/rest/dsl/v2/DslListener.java +++ b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/v2/DslListener.java @@ -42,10 +42,15 @@ import org.onap.aai.rest.enums.EdgeDirection; import org.onap.aai.setup.SchemaVersions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.stereotype.Component; /** * The Class DslListener. */ +@Scope(value = "prototype") +@Component(value = "v2DslListener") public class DslListener extends AAIDslBaseListener { private static final Logger LOGGER = LoggerFactory.getLogger(DslListener.class.getName()); diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/search/GenericQueryProcessor.java b/aai-traversal/src/main/java/org/onap/aai/rest/search/GenericQueryProcessor.java index d63b910..a6f8789 100644 --- a/aai-traversal/src/main/java/org/onap/aai/rest/search/GenericQueryProcessor.java +++ b/aai-traversal/src/main/java/org/onap/aai/rest/search/GenericQueryProcessor.java @@ -19,8 +19,6 @@ */ package org.onap.aai.rest.search; -import com.att.eelf.configuration.EELFManager; - import java.io.FileNotFoundException; import java.net.URI; import java.util.*; diff --git a/aai-traversal/src/main/java/org/onap/aai/service/RetiredService.java b/aai-traversal/src/main/java/org/onap/aai/service/RetiredService.java index b40c328..26f1f5c 100644 --- a/aai-traversal/src/main/java/org/onap/aai/service/RetiredService.java +++ b/aai-traversal/src/main/java/org/onap/aai/service/RetiredService.java @@ -31,8 +31,8 @@ import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Service; @Service -@PropertySource("classpath:retired.properties") -@PropertySource(value = "file:${server.local.startpath}/retired.properties") +@PropertySource(value = "classpath:retired.properties", ignoreResourceNotFound = true) +@PropertySource(value = "file:${server.local.startpath}/retired.properties", ignoreResourceNotFound = true) public class RetiredService { private String retiredPatterns; diff --git a/aai-traversal/src/test/java/org/onap/aai/AAISetup.java b/aai-traversal/src/test/java/org/onap/aai/AAISetup.java index e1cbe45..7849671 100644 --- a/aai-traversal/src/test/java/org/onap/aai/AAISetup.java +++ b/aai-traversal/src/test/java/org/onap/aai/AAISetup.java @@ -37,6 +37,9 @@ import org.onap.aai.introspection.MoxyLoader; import org.onap.aai.nodes.NodeIngestor; import org.onap.aai.rest.db.HttpEntry; import org.onap.aai.rest.dsl.DslQueryProcessor; +import org.onap.aai.rest.dsl.V1DslQueryProcessor; +import org.onap.aai.rest.dsl.V2DslQueryProcessor; +import org.onap.aai.rest.dsl.v1.DslListener; import org.onap.aai.rest.search.GremlinServerSingleton; import org.onap.aai.serialization.db.EdgeSerializer; import org.onap.aai.setup.AAIConfigTranslator; @@ -53,9 +56,8 @@ import org.springframework.test.context.junit4.rules.SpringMethodRule; @ContextConfiguration( classes = {ConfigConfiguration.class, AAIConfigTranslator.class, EdgeIngestor.class, EdgeSerializer.class, NodeIngestor.class, SpringContextAware.class, - IntrospectionConfig.class, RestBeanConfig.class, SearchConfiguration.class, - DslConfiguration.class, XmlFormatTransformerConfiguration.class, - GremlinServerSingleton.class}) + IntrospectionConfig.class, RestBeanConfig.class, SearchConfiguration.class, XmlFormatTransformerConfiguration.class, + GremlinServerSingleton.class, V1DslQueryProcessor.class, V2DslQueryProcessor.class, DslListener.class, org.onap.aai.rest.dsl.v2.DslListener.class}) @TestPropertySource( properties = {"schema.uri.base.path = /aai", "schema.ingest.file = src/test/resources/application-test.properties"}) @@ -84,9 +86,6 @@ public abstract class AAISetup { @Autowired protected EdgeIngestor edgeIngestor; - @Autowired - protected DslQueryProcessor dslQueryProcessor; - @Autowired protected SchemaVersions schemaVersions; diff --git a/aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV1Test.java b/aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV1Test.java index 8d90b5e..d25596d 100644 --- a/aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV1Test.java +++ b/aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV1Test.java @@ -22,10 +22,6 @@ package org.onap.aai.rest.dsl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; @@ -33,11 +29,16 @@ import org.junit.rules.ExpectedException; import org.onap.aai.AAISetup; import org.onap.aai.exceptions.AAIException; import org.onap.aai.rest.enums.QueryVersion; +import org.springframework.beans.factory.annotation.Autowired; /** * The Class DslMain. */ public class DslQueryProcessorV1Test extends AAISetup { + + @Autowired + V1DslQueryProcessor dslQueryProcessor; + @Rule public ExpectedException expectedEx = ExpectedException.none(); diff --git a/aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV2Test.java b/aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV2Test.java index 6d3d69c..944ada3 100644 --- a/aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV2Test.java +++ b/aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV2Test.java @@ -28,11 +28,16 @@ import org.junit.rules.ExpectedException; import org.onap.aai.AAISetup; import org.onap.aai.exceptions.AAIException; import org.onap.aai.rest.enums.QueryVersion; +import org.springframework.beans.factory.annotation.Autowired; /** * The Class DslMain. */ public class DslQueryProcessorV2Test extends AAISetup { + + @Autowired + V2DslQueryProcessor dslQueryProcessor; + @Rule public ExpectedException expectedEx = ExpectedException.none(); diff --git a/aai-traversal/src/test/java/org/onap/aai/rest/dsl/ProdDslTest.java b/aai-traversal/src/test/java/org/onap/aai/rest/dsl/ProdDslTest.java index a78bcde..0eccab9 100644 --- a/aai-traversal/src/test/java/org/onap/aai/rest/dsl/ProdDslTest.java +++ b/aai-traversal/src/test/java/org/onap/aai/rest/dsl/ProdDslTest.java @@ -26,11 +26,16 @@ import org.junit.Test; import org.onap.aai.AAISetup; import org.onap.aai.exceptions.AAIException; import org.onap.aai.rest.enums.QueryVersion; +import org.springframework.beans.factory.annotation.Autowired; // TODO: Change this to read queries and their builder equivalent from a file // TODO: Add queries run by SEs public class ProdDslTest extends AAISetup { + + @Autowired + protected V1DslQueryProcessor dslQueryProcessor; + @Ignore @Test public void msoQueryTest1() throws AAIException { -- cgit 1.2.3-korg