aboutsummaryrefslogtreecommitdiffstats
path: root/aai-traversal/src
diff options
context:
space:
mode:
authorFiete Ostkamp <Fiete.Ostkamp@telekom.de>2024-02-23 17:01:49 +0100
committerFiete Ostkamp <Fiete.Ostkamp@telekom.de>2024-02-26 09:01:48 +0100
commite5b5a5e4d7cae28a72641aae6f5f6099db1ed695 (patch)
treea6038e4ae2abd00465697c4e2d2dcdef45aa9dc0 /aai-traversal/src
parent26c4ef2510d0736ae9a18c8eac2ea2406a83092d (diff)
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 <Fiete.Ostkamp@telekom.de>
Diffstat (limited to 'aai-traversal/src')
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/config/DslConfiguration.java56
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java26
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/RecentAPIConsumer.java6
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryProcessor.java152
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/dsl/V1DslQueryProcessor.java99
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/dsl/V2DslQueryProcessor.java106
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/dsl/v1/DslListener.java5
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/dsl/v2/DslListener.java5
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/search/GenericQueryProcessor.java2
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/service/RetiredService.java4
-rw-r--r--aai-traversal/src/test/java/org/onap/aai/AAISetup.java11
-rw-r--r--aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV1Test.java9
-rw-r--r--aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV2Test.java5
-rw-r--r--aai-traversal/src/test/java/org/onap/aai/rest/dsl/ProdDslTest.java5
14 files changed, 289 insertions, 202 deletions
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<QueryVersion, ParseTreeListener> dslListeners(EdgeIngestor edgeIngestor,
- SchemaVersions schemaVersions, LoaderFactory loaderFactory) {
- Map<QueryVersion, ParseTreeListener> 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<QueryVersion, ParseTreeListener> 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<QueryVersion, ParseTreeListener> 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<QueryVersion, DslQueryProcessor> 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<QueryVersion, ParseTreeListener> 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<Response>() {
@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<QueryVersion, ParseTreeListener> 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 = "<EOF>";
+ private boolean hasStartNodeValidationFlag = true;
private boolean isAggregate = false;
+ private String validationRules = "";
- public DslQueryProcessor(Map<QueryVersion, ParseTreeListener> dslListeners) {
- this.dslListeners = dslListeners;
- }
+ protected abstract Map<String, Object> getQueryResultMap(String aaiQuery) throws IOException, AAIException;
public Map<String, Object> parseAaiQuery(QueryVersion version, String aaiQuery)
throws AAIException {
- Map<String, Object> 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<String, List<String>> 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<String, Object> getQueryResultMap(String aaiQuery) throws IOException, AAIException {
+ Map<String, Object> 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<String, Object> 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<String, Object> resultMap = new HashMap<>();
+ resultMap.put("query", query);
+
+ Map<String, List<String>> 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"})
@@ -85,9 +87,6 @@ public abstract class AAISetup {
protected EdgeIngestor edgeIngestor;
@Autowired
- protected DslQueryProcessor dslQueryProcessor;
-
- @Autowired
protected SchemaVersions schemaVersions;
@Autowired
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 {