Spotfire® Enterprise Runtime for R

A Console Application Using TerrJavaRemote

This is sample Java code for a simple console application using the TerrJavaRemote API.

This is very similar to the code in A console application, except that it uses TerrJavaRemote methods to create and control a spawned process with a TERR engine, rather than creating an embedded engine via TerrJava. Another difference is that the TERR and Java home paths are passed in as arguments, rather than being accessed via environment variables.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import com.tibco.terr.TerrJava;
import com.tibco.terr.TerrJavaRemote;
public class TerrJavaRemoteConsoleExample {
    public static void main(String[] args) throws Throwable {
        System.out.println("TerrJavaRemoteConsoleExample:");
        // create TerrJavaRemote object
        TerrJavaRemote engine = new TerrJavaRemote();

        // set paths for spawned engine
        if (args.length<2) {
            throw new Exception("need two arguments: TERR home and Java home");
        }
        engine.setTerrHome(args[0]);
        engine.setJavaHome(args[1]);

        // set up output/input handlers
        TerrJava.OutputHandler out = new TerrJava.OutputHandler() {
                public void write(String data, boolean prompted) {
                    System.out.print(data);
                }
            };
        TerrJava.InputHandler in = new TerrJava.InputHandler() {
                public String readLine() {
                    try {
                        BufferedReader bin = new BufferedReader(
                              new InputStreamReader(System.in));
                        String cmd = bin.readLine();
                        return cmd;
                    } catch (Exception ex) {
                        return "";
                    }
                }
            };
        engine.setOutputHandler(out);
        engine.setInputHandler(in);
        // start Spotfire Enterprise Runtime for R engine
        engine.startEngine();
        // repeatedly read input lines and evaluate them
        String resultCode = "";
        String prompt = "";
        StringBuffer expression = new StringBuffer();
        while (true) {
            // get prompt string from Spotfire Enterprise Runtime for R
            if (resultCode.equals("IncompleteString")) {
                prompt = engine.evaluateToString("getOption('continueString')");
            } else if (resultCode.equals("IncompleteExpression")) {
                prompt = engine.evaluateToString("getOption('continue')");
            } else {
                prompt = engine.evaluateToString("getOption('prompt')");
                expression.setLength(0);
            }
            out.write(prompt, true);
            String line = in.readLine();
            // ignore empty input lines, except when we are reading a multi-line string
            if (line.isEmpty() && !resultCode.equals("IncompleteString")) {
                continue;
            }
            // accumulate multi-line expression, until we can parse it
            if (expression.length() > 0) {
                expression.append("\n");
            }
            expression.append(line);
            resultCode = engine.evaluateInteractive(expression.toString());
            // exit if engine just evaluated q()
            if (resultCode.equals("Quit")) {
                resultCode = "Success";
                break;
            }
            // print error message if any
            if (resultCode.equals("EvaluationError") ||
                resultCode.equals("ParserError")) {
                String error = engine.getLastErrorMessage();
                if (!error.isEmpty()) {
                    out.write(error + "\n", false);
                }
            }
        }
    }
}