From dbdb6d17a00d7db97756c28c6b3c79756f2a633c Mon Sep 17 00:00:00 2001 From: Thomas Pohl Date: Sat, 29 Feb 2020 07:37:00 +0100 Subject: [PATCH] Fixes #116 Add parsing of classloader --- .../esql/api/EsqlNonReservedKeyword.java | 3 +- .../exxeta/iss/sonar/esql/api/tree/Tree.java | 4 +- .../statement/ExternalRoutineBodyTree.java | 1 + .../statement/JavaClassloaderServiceTree.java | 28 +++++++++ .../api/visitors/DoubleDispatchVisitor.java | 5 ++ .../iss/sonar/esql/parser/EsqlGrammar.java | 9 +++ .../iss/sonar/esql/parser/TreeFactory.java | 14 ++++- .../ExternalRoutineBodyTreeImpl.java | 16 ++++- .../JavaClassloaderServiceTreeImpl.java | 63 +++++++++++++++++++ .../api/tree/function/CreateFunctionTest.java | 3 +- 10 files changed, 137 insertions(+), 9 deletions(-) create mode 100644 esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/statement/JavaClassloaderServiceTree.java create mode 100644 esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/tree/impl/statement/JavaClassloaderServiceTreeImpl.java diff --git a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/EsqlNonReservedKeyword.java b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/EsqlNonReservedKeyword.java index 52e1ad88..403edac0 100644 --- a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/EsqlNonReservedKeyword.java +++ b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/EsqlNonReservedKeyword.java @@ -237,7 +237,8 @@ public enum EsqlNonReservedKeyword implements TokenType, GrammarRuleKey { ALL("ALL"), CAST("CAST"), SYMMERTIC("SYMMERTIC"), - ASYMMERTIC("ASYMMERTIC") + ASYMMERTIC("ASYMMERTIC"), + CLASSLOADER("CLASSLOADER") ; private final String value; diff --git a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/Tree.java b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/Tree.java index f30feadf..119e66b5 100644 --- a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/Tree.java +++ b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/Tree.java @@ -19,6 +19,7 @@ import java.util.stream.Stream; +import com.exxeta.iss.sonar.esql.api.tree.statement.JavaClassloaderServiceTree; import org.sonar.sslr.grammar.GrammarRuleKey; import com.exxeta.iss.sonar.esql.api.tree.expression.BetweenExpressionTree; @@ -264,7 +265,8 @@ public enum Kind implements GrammarRuleKey, Kinds { PROPERTY_IDENTIFIER(IdentifierTree.class), VARIABLE_REFERENCE(VariableReferenceTree.class), LIST_CONSTRUCTOR_FUNCTION(ListConstructorFunctionTree.class), - NULLABLE(NullableTree.class); + NULLABLE(NullableTree.class), + JAVA_CLASSLOADER_SERVICE(JavaClassloaderServiceTree.class); final Class associatedInterface; diff --git a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/statement/ExternalRoutineBodyTree.java b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/statement/ExternalRoutineBodyTree.java index 80fca8dd..f0b4226e 100644 --- a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/statement/ExternalRoutineBodyTree.java +++ b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/statement/ExternalRoutineBodyTree.java @@ -25,6 +25,7 @@ public interface ExternalRoutineBodyTree extends Tree{ SyntaxToken externalKeyword(); SyntaxToken nameKeyword(); SyntaxToken externalRoutineName(); + JavaClassloaderServiceTree getJavaClassloaderService(); SyntaxToken semi(); } diff --git a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/statement/JavaClassloaderServiceTree.java b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/statement/JavaClassloaderServiceTree.java new file mode 100644 index 00000000..753c2fe1 --- /dev/null +++ b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/tree/statement/JavaClassloaderServiceTree.java @@ -0,0 +1,28 @@ +/* + * Sonar ESQL Plugin + * Copyright (C) 2013-2020 Thomas Pohl and EXXETA AG + * http://www.exxeta.com + * + * 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. + */ + +package com.exxeta.iss.sonar.esql.api.tree.statement; + +import com.exxeta.iss.sonar.esql.api.tree.Tree; +import com.exxeta.iss.sonar.esql.api.tree.lexical.SyntaxToken; + +public interface JavaClassloaderServiceTree extends Tree { + SyntaxToken classloaderKeyword(); + + SyntaxToken classLoaderConfigurableServiceName(); +} diff --git a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/visitors/DoubleDispatchVisitor.java b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/visitors/DoubleDispatchVisitor.java index 91c1913b..8ba3d4f3 100644 --- a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/visitors/DoubleDispatchVisitor.java +++ b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/api/visitors/DoubleDispatchVisitor.java @@ -95,6 +95,7 @@ import com.exxeta.iss.sonar.esql.api.tree.statement.IfStatementTree; import com.exxeta.iss.sonar.esql.api.tree.statement.InsertStatementTree; import com.exxeta.iss.sonar.esql.api.tree.statement.IterateStatementTree; +import com.exxeta.iss.sonar.esql.api.tree.statement.JavaClassloaderServiceTree; import com.exxeta.iss.sonar.esql.api.tree.statement.LabelTree; import com.exxeta.iss.sonar.esql.api.tree.statement.LanguageTree; import com.exxeta.iss.sonar.esql.api.tree.statement.LeaveStatementTree; @@ -601,4 +602,8 @@ public void visitNullable(NullableTree tree) { scanChildren(tree); } + public void javaClassloaderService(JavaClassloaderServiceTree tree){ + scanChildren(tree); + } + } diff --git a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/parser/EsqlGrammar.java b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/parser/EsqlGrammar.java index bddc2633..950c7c3b 100644 --- a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/parser/EsqlGrammar.java +++ b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/parser/EsqlGrammar.java @@ -42,6 +42,7 @@ import com.exxeta.iss.sonar.esql.api.tree.function.NumericFunctionTree; import com.exxeta.iss.sonar.esql.api.tree.function.StringManipulationFunctionTree; import com.exxeta.iss.sonar.esql.api.tree.statement.CreateProcedureStatementTree; +import com.exxeta.iss.sonar.esql.api.tree.statement.JavaClassloaderServiceTree; import com.exxeta.iss.sonar.esql.api.tree.statement.StatementTree; import com.exxeta.iss.sonar.esql.lexer.EsqlPunctuator; import com.exxeta.iss.sonar.esql.lexer.EsqlReservedKeyword; @@ -110,6 +111,7 @@ import com.exxeta.iss.sonar.esql.tree.impl.statement.IfStatementTreeImpl; import com.exxeta.iss.sonar.esql.tree.impl.statement.InsertStatementTreeImpl; import com.exxeta.iss.sonar.esql.tree.impl.statement.IterateStatementTreeImpl; +import com.exxeta.iss.sonar.esql.tree.impl.statement.JavaClassloaderServiceTreeImpl; import com.exxeta.iss.sonar.esql.tree.impl.statement.LabelTreeImpl; import com.exxeta.iss.sonar.esql.tree.impl.statement.LanguageTreeImpl; import com.exxeta.iss.sonar.esql.tree.impl.statement.LeaveStatementTreeImpl; @@ -248,10 +250,17 @@ public ExternalRoutineBodyTreeImpl EXTERNAL_ROUTINE_BODY() { return b.nonterminal(Kind.EXTERNAL_ROUTINE_BODY) .is(f.externalRoutineBody(b.token(EsqlNonReservedKeyword.EXTERNAL), b.token(EsqlNonReservedKeyword.NAME), b.token(EsqlLegacyGrammar.IDENTIFIER_NAME_WITH_QUOTES), + b.optional(JAVA_CLASSLOADER_SERVICE()), b.token(EsqlLegacyGrammar.EOS) )); } + public JavaClassloaderServiceTreeImpl JAVA_CLASSLOADER_SERVICE() { + return b.nonterminal(Kind.JAVA_CLASSLOADER_SERVICE) + .is(f.javaClassLoaderService(b.token(EsqlNonReservedKeyword.CLASSLOADER), + b.token(EsqlLegacyGrammar.IDENTIFIER_NAME_WITH_QUOTES))); + } + public CreateProcedureStatementTree CREATE_PROCEDURE_STATEMENT() { return b.nonterminal(Kind.CREATE_PROCEDURE_STATEMENT) .is(f.createProcedureStatement(b.token(EsqlNonReservedKeyword.CREATE), diff --git a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/parser/TreeFactory.java b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/parser/TreeFactory.java index f93e4825..23f43119 100644 --- a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/parser/TreeFactory.java +++ b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/parser/TreeFactory.java @@ -38,6 +38,7 @@ import com.exxeta.iss.sonar.esql.api.tree.function.AliasedFieldReferenceTree; import com.exxeta.iss.sonar.esql.api.tree.function.FunctionTree; import com.exxeta.iss.sonar.esql.api.tree.statement.ElseifClauseTree; +import com.exxeta.iss.sonar.esql.api.tree.statement.JavaClassloaderServiceTree; import com.exxeta.iss.sonar.esql.api.tree.statement.NameClausesTree; import com.exxeta.iss.sonar.esql.api.tree.statement.ParameterTree; import com.exxeta.iss.sonar.esql.api.tree.statement.SetColumnTree; @@ -119,6 +120,7 @@ import com.exxeta.iss.sonar.esql.tree.impl.statement.IfStatementTreeImpl; import com.exxeta.iss.sonar.esql.tree.impl.statement.InsertStatementTreeImpl; import com.exxeta.iss.sonar.esql.tree.impl.statement.IterateStatementTreeImpl; +import com.exxeta.iss.sonar.esql.tree.impl.statement.JavaClassloaderServiceTreeImpl; import com.exxeta.iss.sonar.esql.tree.impl.statement.LabelTreeImpl; import com.exxeta.iss.sonar.esql.tree.impl.statement.LanguageTreeImpl; import com.exxeta.iss.sonar.esql.tree.impl.statement.LeaveStatementTreeImpl; @@ -277,7 +279,7 @@ public DeclareStatementTreeImpl declareStatement(InternalSyntaxToken declareToke } } - public static class Tuple { + public static class Tuple { private final T first; private final U second; @@ -1030,8 +1032,11 @@ public CreateProcedureStatementTreeImpl createProcedureStatement(InternalSyntaxT } public ExternalRoutineBodyTreeImpl externalRoutineBody(InternalSyntaxToken externalKeyword, - InternalSyntaxToken nameKeyword, InternalSyntaxToken externalRoutineName, InternalSyntaxToken semiToken) { - return new ExternalRoutineBodyTreeImpl(externalKeyword, nameKeyword, externalRoutineName, semiToken); + InternalSyntaxToken nameKeyword, InternalSyntaxToken externalRoutineName, + Optional classloader, + InternalSyntaxToken semiToken) { + return new ExternalRoutineBodyTreeImpl(externalKeyword, nameKeyword, externalRoutineName, + /*classloader.isPresent() ? classloader.get() : */null, semiToken); } public RoutineBodyTreeImpl routineBody(Tree firstOf) { @@ -2091,4 +2096,7 @@ public ListConstructorFunctionTreeImpl listConstructorFunction(InternalSyntaxTok } + public JavaClassloaderServiceTreeImpl javaClassLoaderService(InternalSyntaxToken classloaderKeyword, InternalSyntaxToken classLoaderConfigurableServiceName) { + return new JavaClassloaderServiceTreeImpl(classloaderKeyword,classLoaderConfigurableServiceName); + } } diff --git a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/tree/impl/statement/ExternalRoutineBodyTreeImpl.java b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/tree/impl/statement/ExternalRoutineBodyTreeImpl.java index 53a61f20..e626f0d1 100644 --- a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/tree/impl/statement/ExternalRoutineBodyTreeImpl.java +++ b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/tree/impl/statement/ExternalRoutineBodyTreeImpl.java @@ -32,15 +32,20 @@ public class ExternalRoutineBodyTreeImpl extends EsqlTree implements ExternalRou private final InternalSyntaxToken externalKeyword; private final InternalSyntaxToken nameKeyword; private final InternalSyntaxToken externalRoutineName; + private final JavaClassloaderServiceTreeImpl javaClassloaderService; private final InternalSyntaxToken semi; - public ExternalRoutineBodyTreeImpl(InternalSyntaxToken externalKeyword, InternalSyntaxToken nameKeyword, InternalSyntaxToken externalRoutineName, InternalSyntaxToken semi) { + public ExternalRoutineBodyTreeImpl(InternalSyntaxToken externalKeyword, InternalSyntaxToken nameKeyword, + InternalSyntaxToken externalRoutineName, + JavaClassloaderServiceTreeImpl javaClassloaderService, InternalSyntaxToken semi) { this.externalKeyword = externalKeyword; this.nameKeyword = nameKeyword; this.externalRoutineName = externalRoutineName; + this.javaClassloaderService = javaClassloaderService; this.semi=semi; } + @Override public SyntaxToken externalKeyword() { return externalKeyword; @@ -55,7 +60,12 @@ public SyntaxToken nameKeyword() { public InternalSyntaxToken externalRoutineName() { return externalRoutineName; } - + + @Override + public JavaClassloaderServiceTreeImpl getJavaClassloaderService() { + return javaClassloaderService; + } + @Override public InternalSyntaxToken semi() { return semi; @@ -68,7 +78,7 @@ public Kind getKind() { @Override public Iterator childrenIterator() { - return Iterators.forArray(externalKeyword, nameKeyword, externalRoutineName, semi); + return Iterators.forArray(externalKeyword, nameKeyword, externalRoutineName, javaClassloaderService, semi); } @Override diff --git a/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/tree/impl/statement/JavaClassloaderServiceTreeImpl.java b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/tree/impl/statement/JavaClassloaderServiceTreeImpl.java new file mode 100644 index 00000000..ee9777c6 --- /dev/null +++ b/esql-frontend/src/main/java/com/exxeta/iss/sonar/esql/tree/impl/statement/JavaClassloaderServiceTreeImpl.java @@ -0,0 +1,63 @@ +/* + * Sonar ESQL Plugin + * Copyright (C) 2013-2020 Thomas Pohl and EXXETA AG + * http://www.exxeta.com + * + * 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. + */ + +package com.exxeta.iss.sonar.esql.tree.impl.statement; + +import com.exxeta.iss.sonar.esql.api.tree.Tree; +import com.exxeta.iss.sonar.esql.api.tree.expression.ExpressionTree; +import com.exxeta.iss.sonar.esql.api.tree.statement.JavaClassloaderServiceTree; +import com.exxeta.iss.sonar.esql.api.visitors.DoubleDispatchVisitor; +import com.exxeta.iss.sonar.esql.tree.impl.EsqlTree; +import com.exxeta.iss.sonar.esql.tree.impl.lexical.InternalSyntaxToken; +import com.google.common.collect.Iterators; + +import java.util.Iterator; + +public class JavaClassloaderServiceTreeImpl extends EsqlTree implements JavaClassloaderServiceTree { + private final InternalSyntaxToken classloaderKeyword; + private final InternalSyntaxToken classLoaderConfigurableServiceName; + + public JavaClassloaderServiceTreeImpl(InternalSyntaxToken classloaderKeyword, InternalSyntaxToken classLoaderConfigurableServiceName) { + this.classloaderKeyword = classloaderKeyword; + this.classLoaderConfigurableServiceName = classLoaderConfigurableServiceName; + } + + @Override + public InternalSyntaxToken classloaderKeyword(){ + return classloaderKeyword; + } + + @Override + public InternalSyntaxToken classLoaderConfigurableServiceName(){ + return classLoaderConfigurableServiceName; + } + + @Override + public Kind getKind() { + return Kind.JAVA_CLASSLOADER_SERVICE; + } + + @Override + public Iterator childrenIterator() { + return Iterators.forArray(classloaderKeyword, classLoaderConfigurableServiceName); + } + @Override + public void accept(DoubleDispatchVisitor visitor) { + visitor.javaClassloaderService(this); + } +} diff --git a/esql-frontend/src/test/java/com/exxeta/iss/sonar/esql/api/tree/function/CreateFunctionTest.java b/esql-frontend/src/test/java/com/exxeta/iss/sonar/esql/api/tree/function/CreateFunctionTest.java index ab21ff6b..1da4ccea 100644 --- a/esql-frontend/src/test/java/com/exxeta/iss/sonar/esql/api/tree/function/CreateFunctionTest.java +++ b/esql-frontend/src/test/java/com/exxeta/iss/sonar/esql/api/tree/function/CreateFunctionTest.java @@ -35,7 +35,8 @@ public class CreateFunctionTest extends EsqlTreeModelTest