Skip to content

Commit

Permalink
Fixes #116 Add parsing of classloader
Browse files Browse the repository at this point in the history
  • Loading branch information
ThomasPohl committed Feb 29, 2020
1 parent f7b3ef1 commit dbdb6d1
Show file tree
Hide file tree
Showing 10 changed files with 137 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<? extends Tree> associatedInterface;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public interface ExternalRoutineBodyTree extends Tree{
SyntaxToken externalKeyword();
SyntaxToken nameKeyword();
SyntaxToken externalRoutineName();
JavaClassloaderServiceTree getJavaClassloaderService();
SyntaxToken semi();

}
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -601,4 +602,8 @@ public void visitNullable(NullableTree tree) {
scanChildren(tree);
}

public void javaClassloaderService(JavaClassloaderServiceTree tree){
scanChildren(tree);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -248,10 +250,17 @@ public ExternalRoutineBodyTreeImpl EXTERNAL_ROUTINE_BODY() {
return b.<ExternalRoutineBodyTreeImpl>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.<JavaClassloaderServiceTreeImpl>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.<CreateProcedureStatementTree>nonterminal(Kind.CREATE_PROCEDURE_STATEMENT)
.is(f.createProcedureStatement(b.token(EsqlNonReservedKeyword.CREATE),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -277,7 +279,7 @@ public DeclareStatementTreeImpl declareStatement(InternalSyntaxToken declareToke
}
}

public static class Tuple<T, U> {
public static class Tuple<T, U> {

private final T first;
private final U second;
Expand Down Expand Up @@ -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<JavaClassloaderServiceTreeImpl> classloader,
InternalSyntaxToken semiToken) {
return new ExternalRoutineBodyTreeImpl(externalKeyword, nameKeyword, externalRoutineName,
/*classloader.isPresent() ? classloader.get() : */null, semiToken);
}

public RoutineBodyTreeImpl routineBody(Tree firstOf) {
Expand Down Expand Up @@ -2091,4 +2096,7 @@ public ListConstructorFunctionTreeImpl listConstructorFunction(InternalSyntaxTok
}


public JavaClassloaderServiceTreeImpl javaClassLoaderService(InternalSyntaxToken classloaderKeyword, InternalSyntaxToken classLoaderConfigurableServiceName) {
return new JavaClassloaderServiceTreeImpl(classloaderKeyword,classLoaderConfigurableServiceName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -55,7 +60,12 @@ public SyntaxToken nameKeyword() {
public InternalSyntaxToken externalRoutineName() {
return externalRoutineName;
}


@Override
public JavaClassloaderServiceTreeImpl getJavaClassloaderService() {
return javaClassloaderService;
}

@Override
public InternalSyntaxToken semi() {
return semi;
Expand All @@ -68,7 +78,7 @@ public Kind getKind() {

@Override
public Iterator<Tree> childrenIterator() {
return Iterators.forArray(externalKeyword, nameKeyword, externalRoutineName, semi);
return Iterators.forArray(externalKeyword, nameKeyword, externalRoutineName, javaClassloaderService, semi);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Tree> childrenIterator() {
return Iterators.forArray(classloaderKeyword, classLoaderConfigurableServiceName);
}
@Override
public void accept(DoubleDispatchVisitor visitor) {
visitor.javaClassloaderService(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ public class CreateFunctionTest extends EsqlTreeModelTest<CreateFunctionStatemen
@Test
public void createProcedureStatement(){
assertThat(Kind.CREATE_FUNCTION_STATEMENT)
.matches("CREATE FUNCTION myProc1( IN P1 INTEGER, OUT P2 INTEGER, INOUT P3 INTEGER ) RETURNS INTEGER LANGUAGE JAVA EXTERNAL NAME \"com.ibm.broker.test.MyClass.myMethod1\";")
.matches("CREATE FUNCTION myProc1( IN P1 INTEGER, OUT P2 INTEGER, INOUT P3 INTEGER ) RETURNS INTEGER LANGUAGE JAVA EXTERNAL NAME \"com.ibm.broker.test.MyClass.myMethod1\";")
.matches("CREATE FUNCTION myProc1( IN P1 INTEGER, OUT P2 INTEGER, INOUT P3 INTEGER ) RETURNS INTEGER LANGUAGE JAVA EXTERNAL NAME \"com.ibm.broker.test.MyClass.myMethod1\" CLASSLOADER \"{My_Java_SharedLib}\";")
.matches("CREATE FUNCTION \"A\"( ) SET a=1;")
;

Expand Down

0 comments on commit dbdb6d1

Please sign in to comment.