package com.tinkerpop.gremlin.groovy.console;
import com.tinkerpop.gremlin.Imports;
import com.tinkerpop.gremlin.groovy.Gremlin;
import jline.History;
import org.codehaus.groovy.tools.shell.Groovysh;
import org.codehaus.groovy.tools.shell.IO;
import org.codehaus.groovy.tools.shell.InteractiveShellRunner;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
public class Console {
private static final String HISTORY_FILE = ".gremlin_groovy_history";
private static final String STANDARD_INPUT_PROMPT = "gremlin> ";
public static final String STANDARD_RESULT_PROMPT = "==>";
private static final IO STANDARD_IO = new IO(System.in, System.out, System.err);
private static final Groovysh GROOVYSH = new Groovysh();
public Console(final String initScriptFile) {
STANDARD_IO.out.println();
STANDARD_IO.out.println(" \\,,,/");
STANDARD_IO.out.println(" (o o)");
STANDARD_IO.out.println("-----oOOo-(_)-oOOo-----");
GROOVYSH.setResultHook(new NullResultHookClosure(GROOVYSH));
for (String imps : Imports.getImports()) {
GROOVYSH.execute("import " + imps);
}
GROOVYSH.execute("import com.tinkerpop.gremlin.Tokens.T");
GROOVYSH.execute("import com.tinkerpop.gremlin.groovy.*");
GROOVYSH.execute("import groovy.grape.Grape");
GROOVYSH.setResultHook(new ResultHookClosure(GROOVYSH, STANDARD_IO, STANDARD_RESULT_PROMPT));
GROOVYSH.setHistory(new History());
final InteractiveShellRunner runner = new InteractiveShellRunner(GROOVYSH, new PromptClosure(GROOVYSH, STANDARD_INPUT_PROMPT));
runner.setErrorHandler(new ErrorHookClosure(runner, STANDARD_IO));
try {
runner.setHistory(new History(new File(System.getProperty("user.home") + "/" + HISTORY_FILE)));
} catch (IOException e) {
STANDARD_IO.err.println("Unable to create history file: " + HISTORY_FILE);
}
Gremlin.load();
initializeShellWithScript(STANDARD_IO, initScriptFile, GROOVYSH);
try {
runner.run();
} catch (Error e) {
//System.err.println(e.getMessage());
}
}
/**
* Used by the Gremlin.use() function to send Groovysh instance to the plugin.
*/
public static Groovysh getGroovysh() {
return GROOVYSH;
}
/**
* Used by the Gremlin.use() function to send IO instance to the plugin.
*/
public static IO getStandardIo() {
return STANDARD_IO;
}
private void initializeShellWithScript(final IO io, final String initScriptFile, final Groovysh groovy) {
if (initScriptFile != null) {
String line = "";
try {
final BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(initScriptFile), Charset.forName("UTF-8")));
while ((line = reader.readLine()) != null) {
groovy.execute(line);
}
reader.close();
} catch (FileNotFoundException fnfe) {
io.err.println(String.format("Gremlin initialization file not found at [%s].", initScriptFile));
System.exit(1);
} catch (IOException ioe) {
io.err.println(String.format("Bad line in Gremlin initialization file at [%s].", line));
System.exit(1);
}
}
}
public static void main(final String[] args) {
new Console(args.length == 1 ? args[0] : null);
}
}