ovidiu 2002/08/20 18:15:26
Modified: src/java/org/apache/cocoon/components/flow/javascript
JavaScriptInterpreter.java
Log:
Place thrScope in the session object, so that further callFunction()
invocations re-use the same global scope for a given user.
Revision Changes Path
1.6 +67 -20
xml-cocoon2/src/java/org/apache/cocoon/components/flow/javascript/JavaScriptInterpreter.java
Index: JavaScriptInterpreter.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/flow/javascript/JavaScriptInterpreter.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- JavaScriptInterpreter.java 17 Aug 2002 01:20:58 -0000 1.5
+++ JavaScriptInterpreter.java 21 Aug 2002 01:15:26 -0000 1.6
@@ -46,6 +46,7 @@
package org.apache.cocoon.components.flow.javascript;
+
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -54,6 +55,7 @@
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
+import java.util.Map;
import org.apache.avalon.excalibur.collections.ArrayEnumeration;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.configuration.Configurable;
@@ -64,6 +66,9 @@
import org.apache.cocoon.components.flow.WebContinuation;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.ModifiableSource;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.Session;
import org.apache.cocoon.environment.Source;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ErrorReporter;
@@ -84,6 +89,8 @@
public class JavaScriptInterpreter extends AbstractInterpreter
implements Configurable, Initializable
{
+ public static final String USER_GLOBAL_SCOPE = "JavaScript GLOBAL SCOPE";
+
// This is the only optimization level that supports continuations
// in the Christoper Oliver's Rhino JavaScript implementation
static int OPTIMIZATION_LEVEL = -2;
@@ -158,30 +165,70 @@
}
}
- protected Scriptable enterContext(Environment environment)
+ /**
+ * Returns a new Scriptable object to be used as the global scope
+ * when running the JavaScript scripts in the context of a request.
+ *
+ * <p>If <code>createNew</code> is set to true, a new Scriptable
+ * object is always created and setup in the session
+ * object. Otherwise, if <code>createNew</code> is false, a
+ * Scriptable object is looked up in the session object and
+ * returned, if it exists. If no Scriptable object is found, a new
+ * one is created and returned.
+ *
+ * @param environment an <code>Environment</code> value
+ * @param createNew a <code>boolean</code> value
+ * @return a <code>Scriptable</code> value
+ * @exception Exception if an error occurs
+ */
+ protected Scriptable enterContext(Environment environment,
+ boolean createNew)
throws Exception
{
Context context = Context.enter();
context.setOptimizationLevel(OPTIMIZATION_LEVEL);
context.setCompileFunctionsWithDynamicScope(true);
context.setErrorReporter(errorReporter);
- Scriptable thrScope = context.newObject(scope);
+ Scriptable thrScope;
+
+ // Try to retrieve the scope object from the session instance. If
+ // no scope is found, create a new one.
+ Map objectModel = environment.getObjectModel();
+ Request request = ObjectModelHelper.getRequest(objectModel);
+ Session session = request.getSession(true);
+ thrScope = (Scriptable)session.getAttribute(USER_GLOBAL_SCOPE);
+
+ // The Cocoon object exported to JavaScript needs to be setup here
+ JSCocoon cocoon;
+
+ if (thrScope == null || createNew) {
+ thrScope = context.newObject(scope);
+
+ thrScope.setPrototype(scope);
+ // We want 'thrScope' to be a new top-level scope, so set its
+ // parent scope to null. This means that any variables created
+ // by assignments will be properties of "thrScope".
+ thrScope.setParentScope(null);
+
+ // Put in the thread scope the Cocoon object, which gives access
+ // to the interpreter object, and some Cocoon objects. See
+ // JSCocoon for more details.
+ Object args[] = {};
+ cocoon = (JSCocoon)context.newObject(scope, "Cocoon", args);
+ ((JSCocoon)cocoon).setInterpreter(this);
+ ((JSCocoon)cocoon).setScope(thrScope);
+ thrScope.put("cocoon", thrScope, cocoon);
+
+ // Set the newly created Scope object in the session object of
+ // this user.
+ session.setAttribute(USER_GLOBAL_SCOPE, thrScope);
+ }
+ else
+ cocoon = (JSCocoon)thrScope.get("cocoon", thrScope);
- thrScope.setPrototype(scope);
- // We want 'thrScope' to be a new top-level scope, so set its
- // parent scope to null. This means that any variables created
- // by assignments will be properties of "thrScope".
- thrScope.setParentScope(null);
-
- // Put in the thread scope the Cocoon object, which gives access
- // to the interpreter object, and some Cocoon objects. See
- // JSCocoon for more details.
- Object args[] = {};
- Scriptable cocoon = context.newObject(scope, "Cocoon", args);
- ((JSCocoon)cocoon).setInterpreter(this);
- ((JSCocoon)cocoon).setContext(manager, environment);
- ((JSCocoon)cocoon).setScope(thrScope);
- thrScope.put("cocoon", thrScope, cocoon);
+ // We need to setup the JSCocoon object according to the current
+ // request. Everything else remains the same.
+ cocoon.setContext(manager, environment);
return thrScope;
}
@@ -206,12 +253,13 @@
System.out.println("Reading scripts");
try {
- thrScope = enterContext(environment);
+ thrScope = enterContext(environment, true);
Reader reader = new BufferedReader(new InputStreamReader(is));
Context ctx = Context.getCurrentContext();
compiledScript = ctx.compileReader(thrScope, reader,
"(combined)", 1, null);
+ compiledScript.exec(ctx, thrScope);
}
catch (Exception ex) {
ex.printStackTrace();
@@ -310,10 +358,9 @@
checkForModifiedScripts(environment);
try {
- thrScope = enterContext(environment);
+ thrScope = enterContext(environment, false);
Context cx = Context.getCurrentContext();
- compiledScript.exec(cx, thrScope);
JSCocoon cocoon = (JSCocoon)thrScope.get("cocoon", thrScope);
Object callFunction = thrScope.get("callFunction", thrScope);
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]