coliver 2004/04/24 10:38:32
Modified: src/java/org/apache/cocoon/components/flow/javascript/fom
FOM_JavaScriptInterpreter.java
Log:
Set up the thread context class loader to be the compiling class loader if
reload-scripts is on: this will allow java code (called from a flowscript) that
does its own dynamic class loading to have access to your source classes
Revision Changes Path
1.26 +120 -99
cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_JavaScriptInterpreter.java
Index: FOM_JavaScriptInterpreter.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_JavaScriptInterpreter.java,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- FOM_JavaScriptInterpreter.java 5 Mar 2004 13:02:46 -0000 1.25
+++ FOM_JavaScriptInterpreter.java 24 Apr 2004 17:38:32 -0000 1.26
@@ -116,7 +116,9 @@
Global scope;
CompilingClassLoader classLoader;
+
MyClassRepository javaClassRepository = new MyClassRepository();
+
String[] javaSourcePath;
/**
@@ -467,6 +469,10 @@
}
}
}
+
+ public ClassLoader getClassLoader() {
+ return classLoader;
+ }
}
private ThreadScope createThreadScope() throws Exception {
@@ -511,8 +517,8 @@
* @exception Exception if an error occurs
*/
private void setupContext(Redirector redirector, Context context,
- ThreadScope thrScope, CompilingClassLoader classLoader)
- throws Exception {
+ ThreadScope thrScope)
+ throws Exception {
// Try to retrieve the scope object from the session instance. If
// no scope is found, we create a new one, but don't place it in
// the session.
@@ -536,7 +542,9 @@
}
// We need to setup the FOM_Cocoon object according to the current
// request. Everything else remains the same.
- thrScope.setupPackages(getClassLoader(needsRefresh));
+ ClassLoader classLoader = getClassLoader(needsRefresh);
+ Thread.currentThread().setContextClassLoader(classLoader);
+ thrScope.setupPackages(classLoader);
cocoon.pushCallContext(this, redirector, manager,
avalonContext, getLogger(), null);
@@ -653,64 +661,69 @@
FOM_Cocoon cocoon = null;
ThreadScope thrScope = getSessionScope();
synchronized (thrScope) {
+ ClassLoader savedClassLoader =
+ Thread.currentThread().getContextClassLoader();
try {
- setupContext(redirector, context, thrScope, classLoader);
- cocoon = (FOM_Cocoon)thrScope.get("cocoon", thrScope);
-
- // Register the current scope for scripts indirectly called
from this function
- cocoon.getRequest().setAttribute(
- FOM_JavaScriptFlowHelper.FOM_SCOPE, thrScope);
- if (enableDebugger) {
- if (!getDebugger().isVisible()) {
- // only raise the debugger window if it isn't
already visible
- getDebugger().setVisible(true);
+ try {
+ setupContext(redirector, context, thrScope);
+ cocoon = (FOM_Cocoon)thrScope.get("cocoon", thrScope);
+
+ // Register the current scope for scripts indirectly
called from this function
+ cocoon.getRequest().setAttribute(
+
FOM_JavaScriptFlowHelper.FOM_SCOPE, thrScope);
+ if (enableDebugger) {
+ if (!getDebugger().isVisible()) {
+ // only raise the debugger window if it isn't
already visible
+ getDebugger().setVisible(true);
+ }
}
- }
- int size = (params != null ? params.size() : 0);
- Object[] funArgs = new Object[size];
- Scriptable parameters = context.newObject(thrScope);
- for (int i = 0; i < size; i++) {
- Interpreter.Argument arg =
(Interpreter.Argument)params.get(i);
- funArgs[i] = arg.value;
- if (arg.name == null) {
- arg.name = "";
+ int size = (params != null ? params.size() : 0);
+ Object[] funArgs = new Object[size];
+ Scriptable parameters = context.newObject(thrScope);
+ for (int i = 0; i < size; i++) {
+ Interpreter.Argument arg =
(Interpreter.Argument)params.get(i);
+ funArgs[i] = arg.value;
+ if (arg.name == null) {
+ arg.name = "";
+ }
+ parameters.put(arg.name, parameters, arg.value);
}
- parameters.put(arg.name, parameters, arg.value);
- }
- cocoon.setParameters(parameters);
- Object fun = ScriptableObject.getProperty(thrScope, funName);
- if (fun == Scriptable.NOT_FOUND) {
- throw new ResourceNotFoundException(
- "Function \"javascript:" + funName + "()\" not
found");
- }
- ScriptRuntime.call(context, fun, thrScope, funArgs,
thrScope);
- } catch (JavaScriptException ex) {
- EvaluatorException ee = Context.reportRuntimeError(
-
ToolErrorReporter.getMessage("msg.uncaughtJSException",
- ex.getMessage()));
- Throwable unwrapped = unwrap(ex);
- if (unwrapped instanceof ProcessingException) {
- throw (ProcessingException)unwrapped;
- }
- throw new CascadingRuntimeException(ee.getMessage(),
- unwrapped);
- } catch (EcmaError ee) {
- String msg = ToolErrorReporter.getMessage(
- "msg.uncaughtJSException", ee.toString());
- if (ee.getSourceName() != null) {
- Context.reportRuntimeError(msg, ee.getSourceName(),
- ee.getLineNumber(), ee.getLineSource(),
- ee.getColumnNumber());
- } else {
- Context.reportRuntimeError(msg);
+ cocoon.setParameters(parameters);
+ Object fun = ScriptableObject.getProperty(thrScope,
funName);
+ if (fun == Scriptable.NOT_FOUND) {
+ throw new ResourceNotFoundException(
+ "Function
\"javascript:" + funName + "()\" not found");
+ }
+ ScriptRuntime.call(context, fun, thrScope, funArgs,
thrScope);
+ } catch (JavaScriptException ex) {
+ EvaluatorException ee = Context.reportRuntimeError(
+
ToolErrorReporter.getMessage("msg.uncaughtJSException",
+
ex.getMessage()));
+ Throwable unwrapped = unwrap(ex);
+ if (unwrapped instanceof ProcessingException) {
+ throw (ProcessingException)unwrapped;
+ }
+ throw new CascadingRuntimeException(ee.getMessage(),
+ unwrapped);
+ } catch (EcmaError ee) {
+ String msg = ToolErrorReporter.getMessage(
+
"msg.uncaughtJSException", ee.toString());
+ if (ee.getSourceName() != null) {
+ Context.reportRuntimeError(msg, ee.getSourceName(),
+ ee.getLineNumber(),
ee.getLineSource(),
+ ee.getColumnNumber());
+ } else {
+ Context.reportRuntimeError(msg);
+ }
+ throw new CascadingRuntimeException(ee.getMessage(), ee);
}
- throw new CascadingRuntimeException(ee.getMessage(), ee);
} finally {
updateSession(thrScope);
if (cocoon != null) {
cocoon.popCallContext();
}
Context.exit();
+
Thread.currentThread().setContextClassLoader(savedClassLoader);
}
}
}
@@ -737,59 +750,66 @@
// FOM_Cocoon object associated in the dynamic scope of the saved
// continuation with the environment and context objects.
Continuation k = (Continuation)wk.getContinuation();
- Scriptable kScope = k.getParentScope();
+ ThreadScope kScope = (ThreadScope)k.getParentScope();
synchronized (kScope) {
- FOM_Cocoon cocoon = (FOM_Cocoon)kScope.get("cocoon", kScope);
- cocoon.pushCallContext(this, redirector, manager,
- avalonContext,
- getLogger(), wk);
- // Register the current scope for scripts indirectly called from
this function
- cocoon.getRequest().setAttribute(
- FOM_JavaScriptFlowHelper.FOM_SCOPE, kScope);
-
- if (enableDebugger) {
- getDebugger().setVisible(true);
- }
- Scriptable parameters = context.newObject(kScope);
- int size = params != null ? params.size() : 0;
- for (int i = 0; i < size; i++) {
- Interpreter.Argument arg =
(Interpreter.Argument)params.get(i);
- parameters.put(arg.name, parameters, arg.value);
- }
- cocoon.setParameters(parameters);
- FOM_WebContinuation fom_wk = new FOM_WebContinuation(wk);
- fom_wk.setParentScope(kScope);
- fom_wk.setPrototype(ScriptableObject.getClassPrototype(kScope,
-
fom_wk.getClassName()));
- Object[] args = new Object[] {k, fom_wk};
+ ClassLoader savedClassLoader =
+ Thread.currentThread().getContextClassLoader();
+ FOM_Cocoon cocoon = null;
try {
- ScriptableObject.callMethod(cocoon,
- "handleContinuation", args);
- } catch (JavaScriptException ex) {
- EvaluatorException ee = Context.reportRuntimeError(
-
ToolErrorReporter.getMessage("msg.uncaughtJSException",
- ex.getMessage()));
- Throwable unwrapped = unwrap(ex);
- if (unwrapped instanceof ProcessingException) {
- throw (ProcessingException)unwrapped;
- }
- throw new CascadingRuntimeException(ee.getMessage(),
- unwrapped);
- } catch (EcmaError ee) {
- String msg = ToolErrorReporter.getMessage(
- "msg.uncaughtJSException", ee.toString());
- if (ee.getSourceName() != null) {
- Context.reportRuntimeError(msg, ee.getSourceName(),
- ee.getLineNumber(), ee.getLineSource(),
- ee.getColumnNumber());
- } else {
- Context.reportRuntimeError(msg);
+
Thread.currentThread().setContextClassLoader(kScope.getClassLoader());
+ cocoon = (FOM_Cocoon)kScope.get("cocoon", kScope);
+ cocoon.pushCallContext(this, redirector, manager,
+ avalonContext,
+ getLogger(), wk);
+ // Register the current scope for scripts indirectly called
from this function
+ cocoon.getRequest().setAttribute(
+
FOM_JavaScriptFlowHelper.FOM_SCOPE, kScope);
+
+ if (enableDebugger) {
+ getDebugger().setVisible(true);
+ }
+ Scriptable parameters = context.newObject(kScope);
+ int size = params != null ? params.size() : 0;
+ for (int i = 0; i < size; i++) {
+ Interpreter.Argument arg =
(Interpreter.Argument)params.get(i);
+ parameters.put(arg.name, parameters, arg.value);
+ }
+ cocoon.setParameters(parameters);
+ FOM_WebContinuation fom_wk = new FOM_WebContinuation(wk);
+ fom_wk.setParentScope(kScope);
+
fom_wk.setPrototype(ScriptableObject.getClassPrototype(kScope,
+
fom_wk.getClassName()));
+ Object[] args = new Object[] {k, fom_wk};
+ try {
+ ScriptableObject.callMethod(cocoon,
+ "handleContinuation", args);
+ } catch (JavaScriptException ex) {
+ EvaluatorException ee = Context.reportRuntimeError(
+
ToolErrorReporter.getMessage("msg.uncaughtJSException",
+
ex.getMessage()));
+ Throwable unwrapped = unwrap(ex);
+ if (unwrapped instanceof ProcessingException) {
+ throw (ProcessingException)unwrapped;
+ }
+ throw new CascadingRuntimeException(ee.getMessage(),
+ unwrapped);
+ } catch (EcmaError ee) {
+ String msg = ToolErrorReporter.getMessage(
+
"msg.uncaughtJSException", ee.toString());
+ if (ee.getSourceName() != null) {
+ Context.reportRuntimeError(msg, ee.getSourceName(),
+ ee.getLineNumber(),
ee.getLineSource(),
+ ee.getColumnNumber());
+ } else {
+ Context.reportRuntimeError(msg);
+ }
+ throw new CascadingRuntimeException(ee.getMessage(), ee);
}
- throw new CascadingRuntimeException(ee.getMessage(), ee);
} finally {
updateSession(kScope);
- cocoon.popCallContext();
+ if (cocoon != null) cocoon.popCallContext();
Context.exit();
+
Thread.currentThread().setContextClassLoader(savedClassLoader);
}
}
}
@@ -846,5 +866,6 @@
if (kont != null) {
FOM_JavaScriptFlowHelper.setFOM_WebContinuation(objectModel,
kont);
}
+
}
}