Do not use reflection for injecting the DslQueryProcessors 60/137360/5
authorFiete Ostkamp <Fiete.Ostkamp@telekom.de>
Fri, 23 Feb 2024 16:01:49 +0000 (17:01 +0100)
committerFiete Ostkamp <Fiete.Ostkamp@telekom.de>
Mon, 26 Feb 2024 08:01:48 +0000 (09:01 +0100)
- 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>
14 files changed:
aai-traversal/src/main/java/org/onap/aai/config/DslConfiguration.java [deleted file]
aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java
aai-traversal/src/main/java/org/onap/aai/rest/RecentAPIConsumer.java
aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryProcessor.java
aai-traversal/src/main/java/org/onap/aai/rest/dsl/V1DslQueryProcessor.java [new file with mode: 0644]
aai-traversal/src/main/java/org/onap/aai/rest/dsl/V2DslQueryProcessor.java [new file with mode: 0644]
aai-traversal/src/main/java/org/onap/aai/rest/dsl/v1/DslListener.java
aai-traversal/src/main/java/org/onap/aai/rest/dsl/v2/DslListener.java
aai-traversal/src/main/java/org/onap/aai/rest/search/GenericQueryProcessor.java
aai-traversal/src/main/java/org/onap/aai/service/RetiredService.java
aai-traversal/src/test/java/org/onap/aai/AAISetup.java
aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV1Test.java
aai-traversal/src/test/java/org/onap/aai/rest/dsl/DslQueryProcessorV2Test.java
aai-traversal/src/test/java/org/onap/aai/rest/dsl/ProdDslTest.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 (file)
index 81e96d1..0000000
+++ /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);
-    }
-}
index 7c1411e..78ca452 100644 (file)
@@ -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);
         }
index 5f2f161..a74aeb7 100644 (file)
@@ -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) {
 
index 59d4df1..b280304 100644 (file)
@@ -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.
  * 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 (file)
index 0000000..cc89b7d
--- /dev/null
@@ -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 (file)
index 0000000..28d5ef0
--- /dev/null
@@ -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;
+    }
+}
index 1987310..1ad1292 100644 (file)
@@ -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);
index 5395af0..571f6f6 100644 (file)
@@ -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());
index d63b910..a6f8789 100644 (file)
@@ -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.*;
index b40c328..26f1f5c 100644 (file)
@@ -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;
index e1cbe45..7849671 100644 (file)
@@ -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;
 
index 8d90b5e..d25596d 100644 (file)
@@ -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();
 
index 6d3d69c..944ada3 100644 (file)
@@ -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();
 
index a78bcde..0eccab9 100644 (file)
@@ -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 {