bsh
Class Interpreter

java.lang.Object
  |
  +--bsh.Interpreter
All Implemented Interfaces:
ConsoleInterface, java.lang.Runnable, java.io.Serializable

public class Interpreter
extends java.lang.Object
implements java.lang.Runnable, ConsoleInterface, java.io.Serializable

The BeanShell script interpreter. An instance of Interpreter can be used to source scripts and evaluate statements or expressions.

Here are some examples:

                Interpeter bsh = new Interpreter();

                // Evaluate statements and expressions
                bsh.eval("foo=Math.sin(0.5)");
                bsh.eval("bar=foo*5; bar=Math.cos(bar);");
                bsh.eval("for(i=0; i<10; i++) { print(\"hello\"); }");
                // same as above using java syntax and apis only
                bsh.eval("for(int i=0; i<10; i++) { System.out.println(\"hello\"); }");

                // Source from files or streams
                bsh.source("myscript.bsh");  // or bsh.eval("source(\"myscript.bsh\")");

                // Use set() and get() to pass objects in and out of variables
                bsh.set( "date", new Date() );
                Date date = (Date)bsh.get( "date" );
                // This would also work:
                Date date = (Date)bsh.eval( "date" );

                bsh.eval("year = date.getYear()");
                Integer year = (Integer)bsh.get("year");  // primitives use wrappers

                // With Java1.3+ scripts can implement arbitrary interfaces...
                // Script an awt event handler (or source it from a file, more likely)
                bsh.eval( "actionPerformed( e ) { print( e ); }");
                // Get a reference to the script object (implementing the interface)
                ActionListener scriptedHandler =
                        (ActionListener)bsh.eval("return (ActionListener)this");
                // Use the scripted event handler normally...
                new JButton.addActionListener( script );
        

In the above examples we showed a single interpreter instance, however you may wish to use many instances, depending on the application and how you structure your scripts. Interpreter instances are very light weight to create, however if you are going to execute the same script repeatedly and require maximum performance you should consider scripting the code as a method and invoking the scripted method each time on the same interpreter instance (using eval()).

See the BeanShell User's Manual for more information.

See Also:
Serialized Form

Field Summary
(package private)  ConsoleInterface console
           
(package private) static java.io.PrintStream debug
           
static boolean DEBUG
           
(package private)  java.io.PrintStream err
           
private  boolean evalOnly
           
(package private)  NameSpace globalNameSpace
           
(package private)  java.io.Reader in
           
private  boolean interactive
           
 boolean noExitOnEOF
          Specify whether we override exit on EOF as normally done in iteractive mode.
(package private)  java.io.PrintStream out
           
(package private)  Interpreter parent
          If this interpeter is a child of another, the parent
(package private)  Parser parser
           
(package private)  java.lang.String sourceFileInfo
          The name of the file or other source that this interpreter is reading
static boolean strictJava
          Strict Java mode
(package private) static This systemObject
          Shared system object visible under bsh.system
static boolean TRACE
           
static java.lang.String VERSION
           
 
Constructor Summary
Interpreter()
          Create an interpreter for evaluation only.
Interpreter(ConsoleInterface console)
          Construct a new interactive interpreter attached to the specified console.
Interpreter(ConsoleInterface console, NameSpace globalNameSpace)
          Construct a new interactive interpreter attached to the specified console using the specified parent namespace.
Interpreter(java.io.Reader in, java.io.PrintStream out, java.io.PrintStream err, boolean interactive)
           
Interpreter(java.io.Reader in, java.io.PrintStream out, java.io.PrintStream err, boolean interactive, NameSpace namespace)
           
Interpreter(java.io.Reader in, java.io.PrintStream out, java.io.PrintStream err, boolean interactive, NameSpace namespace, Interpreter parent, java.lang.String sourceFileInfo)
          The main constructor.
 
Method Summary
static void debug(java.lang.String s)
          Print a debug message on debug stream associated with this interpreter only if debugging is turned on.
 void error(java.lang.String s)
          Print an error message in a standard format on the output stream associated with this interpreter.
 java.lang.Object eval(java.io.Reader in)
          Evaluate the inputstream in this interpreter's global namespace.
 java.lang.Object eval(java.io.Reader in, NameSpace nameSpace, java.lang.String sourceFileInfo)
          Spawn a non-interactive local interpreter to evaluate text in the specified namespace.
 java.lang.Object eval(java.lang.String statement)
          Evaluate the string in this interpreter's global namespace.
 java.lang.Object eval(java.lang.String statement, NameSpace nameSpace)
          Evaluate the string in the specified namespace.
private  ASCII_UCodeESC_CharStream get_jj_input_stream()
           
private  JJTParserState get_jjtree()
           
 java.lang.Object get(java.lang.String name)
          Get the value of the name.
 java.io.PrintStream getErr()
          Get the error output stream associated with this interpreter.
 java.io.Reader getIn()
          Get the input stream associated with this interpreter.
 java.lang.Object getInterface(java.lang.Class interf)
          Fetch a reference to the interpreter (global namespace), and cast it to the specified type of interface type.
 NameSpace getNameSpace()
          Get the global namespace of this interpreter.
 java.io.PrintStream getOut()
          Get the outptut stream associated with this interpreter.
 Interpreter getParent()
           
 java.lang.String getSourceFileInfo()
          Specify the source of the text from which this interpreter is reading.
(package private)  java.lang.Object getu(java.lang.String name)
          Unchecked get for internal use
 java.lang.Object getVariable(java.lang.String name)
          Deprecated. does not properly evaluate compound names
private  void initRootSystemObject()
           
private  boolean Line()
           
(package private)  void loadRCFiles()
           
static void main(java.lang.String[] args)
          Run the text only interpreter on the command line or specify a file.
 java.io.File pathToFile(java.lang.String fileName)
          Localize a path to the file name based on the bsh.cwd interpreter working directory.
 void print(java.lang.String s)
           
 void println(java.lang.String s)
           
private  void readObject(java.io.ObjectInputStream stream)
          De-serialization setup.
static void redirectOutputToFile(java.lang.String filename)
           
 void run()
          Run interactively.
 void set(java.lang.String name, boolean value)
           
 void set(java.lang.String name, double value)
           
 void set(java.lang.String name, float value)
           
 void set(java.lang.String name, int value)
           
 void set(java.lang.String name, long value)
           
 void set(java.lang.String name, java.lang.Object value)
          Assign the value to the name.
 void setClassLoader(java.lang.ClassLoader externalCL)
          Set an external class loader to be used for all basic class loading in BeanShell.
 void setConsole(ConsoleInterface console)
          Attach a console Note: this method is incomplete.
 void setErr(java.io.PrintStream out)
           
 void setNameSpace(NameSpace globalNameSpace)
          Set the global namespace for this interpreter.
 void setOut(java.io.PrintStream out)
           
(package private)  void setu(java.lang.String name, java.lang.Object value)
          Unchecked set for internal use
 void setVariable(java.lang.String name, boolean value)
          Deprecated. does not properly evaluate compound names
 void setVariable(java.lang.String name, float value)
          Deprecated. does not properly evaluate compound names
 void setVariable(java.lang.String name, int value)
          Deprecated. does not properly evaluate compound names
 void setVariable(java.lang.String name, java.lang.Object value)
          Deprecated. does not properly evaluate compound names
 java.lang.Object source(java.lang.String filename)
          Read text from fileName and eval it.
 java.lang.Object source(java.lang.String filename, NameSpace nameSpace)
          Read text from fileName and eval it.
(package private) static void staticInit()
           
 void unset(java.lang.String name)
          Unassign the variable name.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

VERSION

public static final java.lang.String VERSION
See Also:
Constant Field Values

DEBUG

public static boolean DEBUG

TRACE

public static boolean TRACE

debug

static transient java.io.PrintStream debug

systemObject

static This systemObject
Shared system object visible under bsh.system


strictJava

public static boolean strictJava
Strict Java mode


parser

transient Parser parser

globalNameSpace

NameSpace globalNameSpace

in

transient java.io.Reader in

out

transient java.io.PrintStream out

err

transient java.io.PrintStream err

console

ConsoleInterface console

parent

Interpreter parent
If this interpeter is a child of another, the parent


sourceFileInfo

java.lang.String sourceFileInfo
The name of the file or other source that this interpreter is reading


noExitOnEOF

public boolean noExitOnEOF
Specify whether we override exit on EOF as normally done in iteractive mode. (This is used by Sessiond)


evalOnly

private boolean evalOnly

interactive

private boolean interactive
Constructor Detail

Interpreter

public Interpreter(java.io.Reader in,
                   java.io.PrintStream out,
                   java.io.PrintStream err,
                   boolean interactive,
                   NameSpace namespace,
                   Interpreter parent,
                   java.lang.String sourceFileInfo)
The main constructor. All constructors should now pass through here.

Parameters:
namespace - If namespace is non-null then this interpreter's root namespace will be set to the one provided. If it is null a new one will be created for it.
parent - The parent interpreter if this interpreter is a child of another. May be null.
sourceFileInfo - An informative string holding the filename or other description of the source from which this interpreter is reading... used for debugging. May be null.

Interpreter

public Interpreter(java.io.Reader in,
                   java.io.PrintStream out,
                   java.io.PrintStream err,
                   boolean interactive,
                   NameSpace namespace)

Interpreter

public Interpreter(java.io.Reader in,
                   java.io.PrintStream out,
                   java.io.PrintStream err,
                   boolean interactive)

Interpreter

public Interpreter(ConsoleInterface console,
                   NameSpace globalNameSpace)
Construct a new interactive interpreter attached to the specified console using the specified parent namespace.


Interpreter

public Interpreter(ConsoleInterface console)
Construct a new interactive interpreter attached to the specified console.


Interpreter

public Interpreter()
Create an interpreter for evaluation only.

Method Detail

setConsole

public void setConsole(ConsoleInterface console)
Attach a console Note: this method is incomplete.


initRootSystemObject

private void initRootSystemObject()

setNameSpace

public void setNameSpace(NameSpace globalNameSpace)
Set the global namespace for this interpreter.

Note: This is here for completeness. If you're using this a lot it may be an indication that you are doing more work than you have to. For example, caching the interpreter instance rather than the namespace should not add a significant overhead. No state other than the debug status is stored in the interpreter.

All features of the namespace can also be accessed using the interpreter via eval() and the script variable 'this.namespace' (or global.namespace as necessary).


getNameSpace

public NameSpace getNameSpace()
Get the global namespace of this interpreter.

Note: This is here for completeness. If you're using this a lot it may be an indication that you are doing more work than you have to. For example, caching the interpreter instance rather than the namespace should not add a significant overhead. No state other than the debug status is stored in the interpreter.

All features of the namespace can also be accessed using the interpreter via eval() and the script variable 'this.namespace' (or global.namespace as necessary).


main

public static void main(java.lang.String[] args)
Run the text only interpreter on the command line or specify a file.


run

public void run()
Run interactively. (printing prompts, etc.)

Specified by:
run in interface java.lang.Runnable

source

public java.lang.Object source(java.lang.String filename,
                               NameSpace nameSpace)
                        throws java.io.FileNotFoundException,
                               java.io.IOException,
                               EvalError
Read text from fileName and eval it.

java.io.FileNotFoundException
java.io.IOException
EvalError

source

public java.lang.Object source(java.lang.String filename)
                        throws java.io.FileNotFoundException,
                               java.io.IOException,
                               EvalError
Read text from fileName and eval it. Convenience method. Use the global namespace.

java.io.FileNotFoundException
java.io.IOException
EvalError

eval

public java.lang.Object eval(java.io.Reader in,
                             NameSpace nameSpace,
                             java.lang.String sourceFileInfo)
                      throws EvalError
Spawn a non-interactive local interpreter to evaluate text in the specified namespace. Return value is the evaluated object (or corresponding primitive wrapper).

Parameters:
sourceFileInfo - is for information purposes only. It is used to display error messages (and in the future may be made available to the script).
Throws:
EvalError - on script problems
TargetError - on unhandled exceptions from the script

eval

public java.lang.Object eval(java.io.Reader in)
                      throws EvalError
Evaluate the inputstream in this interpreter's global namespace.

EvalError

eval

public java.lang.Object eval(java.lang.String statement)
                      throws EvalError
Evaluate the string in this interpreter's global namespace.

EvalError

eval

public java.lang.Object eval(java.lang.String statement,
                             NameSpace nameSpace)
                      throws EvalError
Evaluate the string in the specified namespace.

EvalError

error

public final void error(java.lang.String s)
Print an error message in a standard format on the output stream associated with this interpreter. On the GUI console this will appear in red, etc.

Specified by:
error in interface ConsoleInterface

getIn

public java.io.Reader getIn()
Get the input stream associated with this interpreter. This may be be stdin or the GUI console.

Specified by:
getIn in interface ConsoleInterface

getOut

public java.io.PrintStream getOut()
Get the outptut stream associated with this interpreter. This may be be stdout or the GUI console.

Specified by:
getOut in interface ConsoleInterface

getErr

public java.io.PrintStream getErr()
Get the error output stream associated with this interpreter. This may be be stderr or the GUI console.

Specified by:
getErr in interface ConsoleInterface

println

public final void println(java.lang.String s)
Specified by:
println in interface ConsoleInterface

print

public final void print(java.lang.String s)
Specified by:
print in interface ConsoleInterface

debug

public static final void debug(java.lang.String s)
Print a debug message on debug stream associated with this interpreter only if debugging is turned on.


get

public java.lang.Object get(java.lang.String name)
                     throws EvalError
Get the value of the name. name may be any value. e.g. a variable or field

EvalError

getu

java.lang.Object getu(java.lang.String name)
Unchecked get for internal use


set

public void set(java.lang.String name,
                java.lang.Object value)
         throws EvalError
Assign the value to the name. name may evaluate to anything assignable. e.g. a variable or field.

EvalError

setu

void setu(java.lang.String name,
          java.lang.Object value)
Unchecked set for internal use


set

public void set(java.lang.String name,
                long value)
         throws EvalError
EvalError

set

public void set(java.lang.String name,
                int value)
         throws EvalError
EvalError

set

public void set(java.lang.String name,
                double value)
         throws EvalError
EvalError

set

public void set(java.lang.String name,
                float value)
         throws EvalError
EvalError

set

public void set(java.lang.String name,
                boolean value)
         throws EvalError
EvalError

unset

public void unset(java.lang.String name)
           throws EvalError
Unassign the variable name. Name should evaluate to a variable.

EvalError

getVariable

public java.lang.Object getVariable(java.lang.String name)
Deprecated. does not properly evaluate compound names


setVariable

public void setVariable(java.lang.String name,
                        java.lang.Object value)
Deprecated. does not properly evaluate compound names


setVariable

public void setVariable(java.lang.String name,
                        int value)
Deprecated. does not properly evaluate compound names


setVariable

public void setVariable(java.lang.String name,
                        float value)
Deprecated. does not properly evaluate compound names


setVariable

public void setVariable(java.lang.String name,
                        boolean value)
Deprecated. does not properly evaluate compound names


getInterface

public java.lang.Object getInterface(java.lang.Class interf)
                              throws EvalError
Fetch a reference to the interpreter (global namespace), and cast it to the specified type of interface type. Assuming the appropriate methods of the interface are defined in the interpreter, then you may use this interface from Java, just like any other Java object.

For example:

                        Interpreter interpreter = new Interpreter();
                        // define a method called run()
                        interpreter.eval("run() { ... }");

                        // Fetch a reference to the interpreter as a Runnable
                        Runnable runnable =
                                (Runnable)interpreter.getInterface( Runnable.class );
                

Note that the interpreter does *not* require that any or all of the methods of the interface be defined at the time the interface is generated. However if you attempt to invoke one that is not defined you will get a runtime exception.

Note also that this convenience method has exactly the same effect as evaluating the script:

                        (Type)this;
                

For example, the following is identical to the previous example:

                        // Fetch a reference to the interpreter as a Runnable
                        Runnable runnable =
                                (Runnable)interpreter.eval( "(Runnable)this" );
                

Version requirement Although standard Java interface types are always available, to be used with arbitrary interfaces this feature requires that you are using Java 1.3 or greater.

Throws:
EvalError - if the interface cannot be generated because the version of Java does not support the proxy mechanism.

get_jjtree

private JJTParserState get_jjtree()

get_jj_input_stream

private ASCII_UCodeESC_CharStream get_jj_input_stream()

Line

private boolean Line()
              throws ParseException
ParseException

loadRCFiles

void loadRCFiles()

pathToFile

public java.io.File pathToFile(java.lang.String fileName)
                        throws java.io.IOException
Localize a path to the file name based on the bsh.cwd interpreter working directory.

java.io.IOException

redirectOutputToFile

public static void redirectOutputToFile(java.lang.String filename)

setClassLoader

public void setClassLoader(java.lang.ClassLoader externalCL)
Set an external class loader to be used for all basic class loading in BeanShell.

BeanShell will use this at the same point it would otherwise use the plain Class.forName(). i.e. if no explicit classpath management is done from the script (addClassPath(), setClassPath(), reloadClasses()) then BeanShell will only use the supplied classloader. If additional classpath management is done then BeanShell will perform that in addition to the supplied external classloader. However BeanShell is not currently able to reload classes supplied through the external classloader.

See Also:
BshClassManager.setClassLoader( ClassLoader )

staticInit

static void staticInit()

getSourceFileInfo

public java.lang.String getSourceFileInfo()
Specify the source of the text from which this interpreter is reading. Note: there is a difference between what file the interrpeter is sourcing and from what file a method was originally parsed. One file may call a method sourced from another file. See SimpleNode for origination file info.

See Also:
SimpleNode.getSourceFile()

getParent

public Interpreter getParent()

setOut

public void setOut(java.io.PrintStream out)

setErr

public void setErr(java.io.PrintStream out)

readObject

private void readObject(java.io.ObjectInputStream stream)
                 throws java.io.IOException,
                        java.lang.ClassNotFoundException
De-serialization setup. Default out and err streams to stdout, stderr if they are null.

java.io.IOException
java.lang.ClassNotFoundException