/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.supportunit.epl.parse;
import com.espertech.esper.collection.Pair;
import com.espertech.esper.core.support.SupportEngineImportServiceFactory;
import com.espertech.esper.core.support.SupportEventAdapterService;
import com.espertech.esper.epl.core.EngineImportService;
import com.espertech.esper.epl.generated.EsperEPL2GrammarLexer;
import com.espertech.esper.epl.generated.EsperEPL2GrammarParser;
import com.espertech.esper.epl.parse.*;
import com.espertech.esper.epl.variable.VariableService;
import com.espertech.esper.epl.variable.VariableServiceImpl;
import com.espertech.esper.event.EventAdapterService;
import com.espertech.esper.supportunit.bean.SupportBean_N;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import org.antlr.v4.runtime.tree.Tree;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.StringReader;
public class SupportParserHelper {
public static EPLTreeWalkerListener parseAndWalkEPL(String expression) throws Exception {
return parseAndWalkEPL(expression, SupportEngineImportServiceFactory.make(), new VariableServiceImpl(0, null, SupportEventAdapterService.getService(), null));
}
public static EPLTreeWalkerListener parseAndWalkEPL(String expression, EngineImportService engineImportService, VariableService variableService) throws Exception {
log.debug(".parseAndWalk Trying text=" + expression);
Pair<Tree, CommonTokenStream> ast = SupportParserHelper.parseEPL(expression);
log.debug(".parseAndWalk success, tree walking...");
SupportParserHelper.displayAST(ast.getFirst());
EventAdapterService eventAdapterService = SupportEventAdapterService.getService();
eventAdapterService.addBeanType("SupportBean_N", SupportBean_N.class, true, true, true);
EPLTreeWalkerListener listener = SupportEPLTreeWalkerFactory.makeWalker(ast.getSecond(), engineImportService, variableService);
ParseTreeWalker walker = new ParseTreeWalker(); // create standard walker
walker.walk(listener, (ParseTree) ast.getFirst()); // initiate walk of tree with listener
return listener;
}
public static EPLTreeWalkerListener parseAndWalkPattern(String expression) throws Exception {
log.debug(".parseAndWalk Trying text=" + expression);
Pair<Tree, CommonTokenStream> ast = SupportParserHelper.parsePattern(expression);
log.debug(".parseAndWalk success, tree walking...");
SupportParserHelper.displayAST(ast.getFirst());
EPLTreeWalkerListener listener = SupportEPLTreeWalkerFactory.makeWalker(ast.getSecond());
ParseTreeWalker walker = new ParseTreeWalker();
walker.walk(listener, (ParseTree) ast.getFirst());
return listener;
}
public static void displayAST(Tree ast) throws Exception {
log.debug(".displayAST...");
if (log.isDebugEnabled()) {
ASTUtil.dumpAST(ast);
}
}
public static Pair<Tree, CommonTokenStream> parsePattern(String text) throws Exception {
ParseRuleSelector startRuleSelector = new ParseRuleSelector() {
public ParserRuleContext invokeParseRule(EsperEPL2GrammarParser parser) throws RecognitionException {
return parser.startPatternExpressionRule();
}
};
return parse(startRuleSelector, text);
}
public static Pair<Tree, CommonTokenStream> parseEPL(String text) throws Exception {
ParseRuleSelector startRuleSelector = new ParseRuleSelector() {
public ParserRuleContext invokeParseRule(EsperEPL2GrammarParser parser) throws RecognitionException {
return parser.startEPLExpressionRule();
}
};
return parse(startRuleSelector, text);
}
public static Pair<Tree, CommonTokenStream> parseEventProperty(String text) throws Exception {
ParseRuleSelector startRuleSelector = new ParseRuleSelector() {
public ParserRuleContext invokeParseRule(EsperEPL2GrammarParser parser) throws RecognitionException {
return parser.startEventPropertyRule();
}
};
return parse(startRuleSelector, text);
}
public static Pair<Tree, CommonTokenStream> parseJson(String text) throws Exception {
ParseRuleSelector startRuleSelector = new ParseRuleSelector() {
public ParserRuleContext invokeParseRule(EsperEPL2GrammarParser parser) throws RecognitionException {
return parser.startJsonValueRule();
}
};
return parse(startRuleSelector, text);
}
public static Pair<Tree, CommonTokenStream> parse(ParseRuleSelector parseRuleSelector, String text) throws Exception {
CharStream input;
try {
input = new NoCaseSensitiveStream(new StringReader(text));
} catch (IOException ex) {
throw new RuntimeException("IOException parsing text '" + text + '\'', ex);
}
EsperEPL2GrammarLexer lex = ParseHelper.newLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lex);
EsperEPL2GrammarParser g = ParseHelper.newParser(tokens);
Tree ctx = parseRuleSelector.invokeParseRule(g);
return new Pair<Tree, CommonTokenStream>(ctx, tokens);
}
private final static Logger log = LoggerFactory.getLogger(SupportParserHelper.class);
}