Save This Page
Home » bsf-src-2.4.0 » org.apache.bsf.engines.java » [javadoc | source]
org.apache.bsf.engines.java
public class: JavaEngine [javadoc | source]
java.lang.Object
   org.apache.bsf.util.BSFEngineImpl
      org.apache.bsf.engines.java.JavaEngine

All Implemented Interfaces:
    BSFEngine

This is the interface to Java from the Bean Scripting Framework.

The Java code must be written script-style -- that is, just the body of the function, without class or method headers or footers. The JavaEngine will generate those via a "boilerplate" wrapper:


import java.lang.*;
import java.util.*;
public class $$CLASSNAME$$ {
static public Object BSFJavaEngineEntry(org.apache.bsf.BSFManager bsf) {
// Your code will be placed here
}
}

$$CLASSNAME$$ will be replaced by a generated classname of the form BSFJava*, and the bsf parameter can be used to retrieve application objects registered with the Bean Scripting Framework.

If you use the placeholder string $$CLASSNAME$$ elsewhere in your script -- including within text strings -- BSFJavaEngine will replace it with the generated name of the class before the Java code is compiled.

Hazards:

NOTE that it is your responsibility to convert the code into an acceptable Java string. If you're invoking the JavaEngine directly (as in the JSPLikeInJava example) that means \"quoting\" characters that would otherwise cause trouble.

ALSO NOTE that it is your responsibility to return an object, or null in lieu thereof!

Since the code has to be compiled to a Java classfile, invoking it involves a fair amount of computation to load and execute the compiler. We are currently making an attempt to manage that by caching the class after it has been loaded, but the indexing is fairly primitive. It has been suggested that the Bean Scripting Framework may want to support preload-and-name-script and execute-preloaded-script-by-name options to provide better control over when and how much overhead occurs.

Field Summary
 Class javaclass     
static  Hashtable codeToClass     
static  String serializeCompilation     
static  String placeholder     
 String minorPrefix     
Fields inherited from org.apache.bsf.util.BSFEngineImpl:
mgr,  lang,  declaredBeans,  classPath,  tempDir,  classLoader
Constructor:
 public JavaEngine() 
Method from org.apache.bsf.engines.java.JavaEngine Summary:
call,   compileScript,   eval,   initialize,   internalCall
Methods from org.apache.bsf.util.BSFEngineImpl:
apply,   compileApply,   compileExpr,   compileScript,   declareBean,   exec,   iexec,   initialize,   propertyChange,   terminate,   undeclareBean
Methods from java.lang.Object:
equals,   getClass,   hashCode,   notify,   notifyAll,   toString,   wait,   wait,   wait
Method from org.apache.bsf.engines.java.JavaEngine Detail:
 public Object call(Object object,
    String method,
    Object[] args) throws BSFException 
 public  void compileScript(String source,
    int lineNo,
    int columnNo,
    Object script,
    CodeBuffer cb) throws BSFException 
 public Object eval(String source,
    int lineNo,
    int columnNo,
    Object oscript) throws BSFException 
    This is used by an application to evaluate a string containing some expression. It should store the "bsf" handle where the script can get to it, for callback purposes.

    Note that Java compilation imposes serious overhead, but in exchange you get full Java performance once the classes have been created (minus the cache lookup cost).

    Nobody knows whether javac is threadsafe. I'm going to serialize access to protect it.

    There is no published API for invoking javac as a class. There's a trick that seems to work for Java 1.1.x, but it stopped working in Java 1.2. We will attempt to use it, then if necessary fall back on invoking javac via the command line.

 public  void initialize(BSFManager mgr,
    String lang,
    Vector declaredBeans) throws BSFException 
 Object internalCall(Object object,
    String method,
    Object[] args) throws BSFException 
    Return an object from an extension.