| java.lang.Object org.mozilla.javascript.ContextFactory
All known Subclasses: org.mozilla.javascript.tools.shell.ShellContextFactory,
ContextFactory | public class ContextFactory (Code) | | Factory class that Rhino runtime uses to create new
Context instances. A ContextFactory can also notify listeners
about context creation and release.
When the Rhino runtime needs to create new
Context instance during
execution of
Context.enter or
Context , it will call
ContextFactory.makeContext() of the current global ContextFactory.
See
ContextFactory.getGlobal() and
ContextFactory.initGlobal(ContextFactory) .
It is also possible to use explicit ContextFactory instances for Context
creation. This is useful to have a set of independent Rhino runtime
instances under single JVM. See
ContextFactory.call(ContextAction) .
The following example demonstrates Context customization to terminate
scripts running more then 10 seconds and to provide better compatibility
with JavaScript code using MSIE-specific features.
import org.mozilla.javascript.*;
class MyFactory extends ContextFactory
{
// Custom
Context to store execution time.
private static class MyContext extends Context
{
long startTime;
}
static {
// Initialize GlobalFactory with custom factory
ContextFactory.initGlobal(new MyFactory());
}
// Override
ContextFactory.makeContext() protected Context makeContext()
{
MyContext cx = new MyContext();
// Use pure interpreter mode to allow for
//
ContextFactory.observeInstructionCount(Context,int) to work
cx.setOptimizationLevel(-1);
// Make Rhino runtime to call observeInstructionCount
// each 10000 bytecode instructions
cx.setInstructionObserverThreshold(10000);
return cx;
}
// Override
ContextFactory.hasFeature(Context,int) public boolean hasFeature(Context cx, int featureIndex)
{
// Turn on maximum compatibility with MSIE scripts
switch (featureIndex) {
case
Context.FEATURE_NON_ECMA_GET_YEAR :
return true;
case
Context.FEATURE_MEMBER_EXPR_AS_FUNCTION_NAME :
return true;
case
Context.FEATURE_RESERVED_KEYWORD_AS_IDENTIFIER :
return true;
case
Context.FEATURE_PARENT_PROTO_PROPERTIES :
return false;
}
return super.hasFeature(cx, featureIndex);
}
// Override
ContextFactory.observeInstructionCount(Context,int) protected void observeInstructionCount(Context cx, int instructionCount)
{
MyContext mcx = (MyContext)cx;
long currentTime = System.currentTimeMillis();
if (currentTime - mcx.startTime > 10*1000) {
// More then 10 seconds from Context creation time:
// it is time to stop the script.
// Throw Error instance to ensure that script will never
// get control back through catch or finally.
throw new Error();
}
}
// Override
ContextFactory.doTopCall(Callable,Context,Scriptable,Scriptable,Object[]) protected Object doTopCall(Callable callable,
Context cx, Scriptable scope,
Scriptable thisObj, Object[] args)
{
MyContext mcx = (MyContext)cx;
mcx.startTime = System.currentTimeMillis();
return super.doTopCall(callable, cx, scope, thisObj, args);
}
}
|
Inner Class :public interface Listener | |
Method Summary | |
final public void | addListener(Listener listener) | final public Object | call(ContextAction action) Call
ContextAction.run(Context cx) using the
Context instance associated with the current thread.
If no Context is associated with the thread, then
ContextFactory.makeContext() will be called to construct
new Context instance. | final protected void | checkNotSealed() | protected GeneratedClassLoader | createClassLoader(ClassLoader parent) Create class loader for generated classes.
This method creates an instance of the default implementation
of
GeneratedClassLoader . | final void | disableContextListening() | protected Object | doTopCall(Callable callable, Context cx, Scriptable scope, Scriptable thisObj, Object[] args) Execute top call to script or function.
When the runtime is about to execute a script or function that will
create the first stack frame with scriptable code, it calls this method
to perform the real call. | final public Context | enter() | public Context | enterContext() Get a context associated with the current thread, creating one if need
be. | final public Context | enterContext(Context cx) Get a Context associated with the current thread, using the given
Context if need be. | final public void | exit() | final public ClassLoader | getApplicationClassLoader() Get ClassLoader to use when searching for Java classes. | protected org.mozilla.javascript.xml.XMLLib.Factory | getE4xImplementationFactory() Provides a default
org.mozilla.javascript.xml.XMLLib.Factory XMLLib.Factory to be used by the Context instances produced by this
factory. | public static ContextFactory | getGlobal() Get global ContextFactory. | public static boolean | hasExplicitGlobal() Check if global factory was set. | protected boolean | hasFeature(Context cx, int featureIndex) Implementation of
Context.hasFeature(int featureIndex) . | final public void | initApplicationClassLoader(ClassLoader loader) Set explicit class loader to use when searching for Java classes. | public static synchronized void | initGlobal(ContextFactory factory) Set global ContextFactory. | final public boolean | isSealed() Checks if this is a sealed ContextFactory. | protected Context | makeContext() Create new
Context instance to be associated with the current
thread.
This is a callback method used by Rhino to create
Context instance when it is necessary to associate one with the current
execution thread. | protected void | observeInstructionCount(Context cx, int instructionCount) Implementation of
Context.observeInstructionCount(int instructionCount) . | protected void | onContextCreated(Context cx) | protected void | onContextReleased(Context cx) | final public void | removeListener(Listener listener) | final public void | seal() Seal this ContextFactory so any attempt to modify it like to add or
remove its listeners will throw an exception. |
addListener | final public void addListener(Listener listener)(Code) | | |
checkNotSealed | final protected void checkNotSealed()(Code) | | |
createClassLoader | protected GeneratedClassLoader createClassLoader(ClassLoader parent)(Code) | | Create class loader for generated classes.
This method creates an instance of the default implementation
of
GeneratedClassLoader . Rhino uses this interface to load
generated JVM classes when no
SecurityController is installed.
Application can override the method to provide custom class loading.
|
disableContextListening | final void disableContextListening()(Code) | | The method is used only to implement
Context.disableStaticContextListening()
|
doTopCall | protected Object doTopCall(Callable callable, Context cx, Scriptable scope, Scriptable thisObj, Object[] args)(Code) | | Execute top call to script or function.
When the runtime is about to execute a script or function that will
create the first stack frame with scriptable code, it calls this method
to perform the real call. In this way execution of any script
happens inside this function.
|
enterContext | public Context enterContext()(Code) | | Get a context associated with the current thread, creating one if need
be. The Context stores the execution state of the JavaScript engine, so
it is required that the context be entered before execution may begin.
Once a thread has entered a Context, then getCurrentContext() may be
called to find the context that is associated with the current thread.
Calling enterContext() will return either the Context
currently associated with the thread, or will create a new context and
associate it with the current thread. Each call to
enterContext() must have a matching call to
Context.exit .
Context cx = contextFactory.enterContext();
try {
...
cx.evaluateString(...);
} finally {
Context.exit();
}
Instead of using enterContext(), exit() pair consider
using
ContextFactory.call(ContextAction) which guarantees proper association
of Context instances with the current thread.
With this method the above example becomes:
ContextFactory.call(new ContextAction() {
public Object run(Context cx) {
...
cx.evaluateString(...);
return null;
}
});
a Context associated with the current thread See Also: Context.getCurrentContext See Also: Context.exit See Also: ContextFactory.call(ContextAction) |
enterContext | final public Context enterContext(Context cx)(Code) | | Get a Context associated with the current thread, using the given
Context if need be.
The same as enterContext() except that cx
is associated with the current thread and returned if the current thread
has no associated context and cx is not associated with any
other thread.
Parameters: cx - a Context to associate with the thread if possible a Context associated with the current thread See Also: ContextFactory.enterContext() See Also: ContextFactory.call(ContextAction) throws: IllegalStateException - if cx is already associatedwith a different thread |
getE4xImplementationFactory | protected org.mozilla.javascript.xml.XMLLib.Factory getE4xImplementationFactory()(Code) | | Provides a default
org.mozilla.javascript.xml.XMLLib.Factory XMLLib.Factory to be used by the Context instances produced by this
factory. See
Context.getE4xImplementationFactory for details.
May return null, in which case E4X functionality is not supported in
Rhino.
The default implementation now prefers the DOM3 E4X implementation.
|
makeContext | protected Context makeContext()(Code) | | Create new
Context instance to be associated with the current
thread.
This is a callback method used by Rhino to create
Context instance when it is necessary to associate one with the current
execution thread. makeContext() is allowed to call
Context.seal(Object) on the result to prevent
Context changes by hostile scripts or applets.
|
onContextCreated | protected void onContextCreated(Context cx)(Code) | | |
onContextReleased | protected void onContextReleased(Context cx)(Code) | | |
removeListener | final public void removeListener(Listener listener)(Code) | | |
seal | final public void seal()(Code) | | Seal this ContextFactory so any attempt to modify it like to add or
remove its listeners will throw an exception.
See Also: ContextFactory.isSealed() |
|
|