package jeql.engine;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.util.Iterator;
import java.util.List;
import jeql.JeqlStrings;
import jeql.monitor.Monitor;
import jeql.syntax.ImportNode;
import jeql.syntax.ParseTreeNode;
import jeql.syntax.ProgramNode;
import jeql.syntax.StatementListNode;
import jeql.syntax.parser.ParseException;
import jeql.syntax.parser.Parser;
/**
*
* @author Martin Davis
* @version 1.0
*/
public class JeqlEngine
{
private Scope scope;
private ParseTreeNode scriptNode;
private Object scriptResult = null;
public JeqlEngine(EngineContext context) {
scope = new BasicScope(context);
}
public Object getResult()
{
return scriptResult;
}
public void prepareSelectFromString(String sql) throws ParseException {
Parser parser = new Parser(new StringReader(sql));
scriptNode = parser.SelectStatement();
}
public void prepareScriptFile(String filename) throws ParseException,
FileNotFoundException, IOException {
Reader rdr;
if (filename.equalsIgnoreCase(JeqlStrings.STDIN)) {
rdr = new InputStreamReader(System.in);
} else {
rdr = new FileReader(filename);
}
prepareProgram(rdr);
}
public void prepareScript(String scriptValue)
throws ParseException, FileNotFoundException, IOException {
Reader rdr;
rdr = new StringReader(scriptValue);
prepareProgram(rdr);
}
private void prepareProgram(Reader rdr) throws ParseException,
FileNotFoundException, IOException {
Parser parser = new Parser(rdr);
scriptNode = parser.Program();
rdr.close();
}
public Object evalScript() {
ProgramNode progNode = (ProgramNode) scriptNode;
registerImports(progNode.getImports());
StatementListNode stmts = progNode.getStatements();
scriptResult = stmts.eval(scope);
EngineContext.flush();
return scriptResult;
}
private void registerImports(List imports)
{
for (Iterator i = imports.iterator(); i.hasNext(); ) {
ImportNode importNode = (ImportNode) i.next();
registerImport(importNode);
}
}
private void registerImport(ImportNode importNode)
{
importNode.checkSyntax();
String classname = importNode.getClassname();
Class clazz = null;
try {
clazz = this.getClass().getClassLoader().loadClass(classname);
} catch (ClassNotFoundException ex) {
throw new CompilationException(importNode, "Import " + classname + " not found");
}
// testing
//Package foo = Package.getPackage("test.jeql.function");
scope.getContext().register(clazz);
}
}