You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by co...@apache.org on 2004/01/19 18:53:38 UTC
cvs commit: cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom FOM_Cocoon.java FOM_JavaScriptInterpreter.java
coliver 2004/01/19 09:53:38
Modified: src/java/org/apache/cocoon/components/flow/javascript/fom
FOM_Cocoon.java FOM_JavaScriptInterpreter.java
Log:
Made FOM_Cocoon reentrant to support e.g. aggregation. This should also fix bugzilla 25951
Revision Changes Path
1.25 +177 -131 cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_Cocoon.java
Index: FOM_Cocoon.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_Cocoon.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- FOM_Cocoon.java 13 Jan 2004 01:40:46 -0000 1.24
+++ FOM_Cocoon.java 19 Jan 2004 17:53:38 -0000 1.25
@@ -100,24 +100,111 @@
*/
public class FOM_Cocoon extends ScriptableObject {
- private Context avalonContext;
+ class CallContext {
+ CallContext caller;
+ Context avalonContext;
+ ServiceManager serviceManager;
+ FOM_JavaScriptInterpreter interpreter;
+ Environment environment;
+ ComponentManager componentManager;
+ Logger logger;
+ FOM_Request request;
+ FOM_Response response;
+ FOM_Session session;
+ FOM_Context context;
+ Scriptable parameters;
+ FOM_Log log;
+ WebContinuation lastContinuation;
+
+ public CallContext(CallContext caller,
+ FOM_JavaScriptInterpreter interp,
+ Environment env,
+ ComponentManager manager,
+ ServiceManager serviceManager,
+ Context avalonContext,
+ Logger logger,
+ WebContinuation lastContinuation) {
+ this.caller = caller;
+ this.interpreter = interp;
+ this.environment = env;
+ this.componentManager = manager;
+ this.serviceManager = serviceManager;
+ this.avalonContext = avalonContext;
+ this.logger = logger;
+ this.lastContinuation = lastContinuation;
+ }
+
+ public FOM_Session getSession() {
+ if (session != null) {
+ return session;
+ }
+ Map objectModel = environment.getObjectModel();
+ session =
+ new FOM_Session(ObjectModelHelper.getRequest(objectModel).getSession(true));
+ session.setParentScope(getParentScope());
+ session.setPrototype(getClassPrototype(getParentScope(),
+ "FOM_Session"));
+ return session;
+ }
+
+ public FOM_Request getRequest() {
+ if (request != null) {
+ return request;
+ }
+ Map objectModel = environment.getObjectModel();
+ request = new FOM_Request(ObjectModelHelper.getRequest(objectModel));
+ request.setParentScope(getParentScope());
+ request.setPrototype(getClassPrototype(getParentScope(),
+ "FOM_Request"));
+ return request;
+ }
- private ServiceManager serviceManager;
+ public FOM_Context getContext() {
+ if (context != null) {
+ return context;
+ }
+ Map objectModel = getEnvironment().getObjectModel();
+ context =
+ new FOM_Context(ObjectModelHelper.getContext(objectModel));
+ context.setParentScope(getParentScope());
+ context.setPrototype(getClassPrototype(getParentScope(),
+ "FOM_Context"));
+ return context;
+ }
- private FOM_JavaScriptInterpreter interpreter;
+ public FOM_Response getResponse() {
+ if (response != null) {
+ return response;
+ }
+ Map objectModel = environment.getObjectModel();
+ response =
+ new FOM_Response(ObjectModelHelper.getResponse(objectModel));
+ response.setParentScope(getParentScope());
+ response.setPrototype(getClassPrototype(getParentScope(),
+ "FOM_Response"));
+ return response;
+ }
+
+ public FOM_Log getLog() {
+ if (log != null) {
+ return log;
+ }
+ log = new FOM_Log(logger);
+ log.setParentScope(getParentScope());
+ log.setPrototype(getClassPrototype(getParentScope(), "FOM_Log"));
+ return log;
+ }
- private Environment environment;
- private ComponentManager componentManager;
- private Logger logger;
+ public Scriptable getParameters() {
+ return parameters;
+ }
- private FOM_Request request;
- private FOM_Response response;
- private FOM_Session session;
- private FOM_Context context;
- private Scriptable parameters;
- private FOM_Log log;
+ public void setParameters(Scriptable parameters) {
+ this.parameters = parameters;
+ }
+ }
- private WebContinuation lastContinuation;
+ private CallContext currentCall;
public String getClassName() {
return "FOM_Cocoon";
@@ -135,41 +222,25 @@
defineClass(scope, FOM_WebContinuation.class);
}
- void setup(FOM_JavaScriptInterpreter interp,
- Environment env,
- ComponentManager manager,
- ServiceManager serviceManager,
- Context avalonContext,
- Logger logger) {
- this.interpreter = interp;
- this.environment = env;
- this.componentManager = manager;
- this.serviceManager = serviceManager;
- this.avalonContext = avalonContext;
- this.logger = logger;
+ void pushCallContext(FOM_JavaScriptInterpreter interp,
+ Environment env,
+ ComponentManager manager,
+ ServiceManager serviceManager,
+ Context avalonContext,
+ Logger logger,
+ WebContinuation lastContinuation) {
+ this.currentCall = new CallContext(currentCall, interp, env, manager,
+ serviceManager, avalonContext,
+ logger, lastContinuation);
}
- void invalidate() {
+ void popCallContext() {
// Clear the scope attribute
Request request = this.getRequest();
if (request != null) {
request.removeAttribute(FOM_JavaScriptFlowHelper.FOM_SCOPE);
}
- else {
- // Cannot use logger here, as it might already be null
- System.err.println("Request is null. Might be trying to invalidate an already invalidated FOM_Cocoon instance.");
- }
-
- // Cleanup everything
- this.request = null;
- this.response = null;
- this.session = null;
- this.context = null;
- this.log = null;
- this.logger = null;
- this.componentManager = null;
- this.environment = null;
- this.interpreter = null;
+ this.currentCall = this.currentCall.caller;
}
@@ -179,12 +250,11 @@
WebContinuation wk = null;
if (continuation != null) {
ContinuationsManager contMgr = (ContinuationsManager)
- componentManager.lookup(ContinuationsManager.ROLE);
- wk = lastContinuation =
- contMgr.createWebContinuation(continuation,
- lastContinuation,
- 0,
- null);
+ getComponentManager().lookup(ContinuationsManager.ROLE);
+ wk = contMgr.createWebContinuation(continuation,
+ currentCall.lastContinuation,
+ 0,
+ null);
}
String redUri = uri;
@@ -194,8 +264,8 @@
fom_wk.setParentScope(getParentScope());
fom_wk.setPrototype(getClassPrototype(getParentScope(),
fom_wk.getClassName()));
- interpreter.forwardTo(getParentScope(), this, redUri,
- bizData, fom_wk, environment);
+ getInterpreter().forwardTo(getParentScope(), this, redUri,
+ bizData, fom_wk, getEnvironment());
FOM_WebContinuation result = null;
if (wk != null) {
@@ -222,19 +292,19 @@
if (!(unwrap(outputStream) instanceof OutputStream)) {
throw new JavaScriptException("expected a java.io.OutputStream instead of " + outputStream);
}
- interpreter.process(getParentScope(), this, uri, map,
- (OutputStream)unwrap(outputStream),
- environment);
+ getInterpreter().process(getParentScope(), this, uri, map,
+ (OutputStream)unwrap(outputStream),
+ getEnvironment());
}
public void jsFunction_redirectTo(String uri) throws Exception {
// Cannot use environment directly as TreeProcessor uses own version of redirector
// environment.redirect(false, uri);
- PipelinesNode.getRedirector(environment).redirect(false, uri);
+ PipelinesNode.getRedirector(getEnvironment()).redirect(false, uri);
}
public void jsFunction_sendStatus(int sc) {
- PipelinesNode.getRedirector(environment).sendStatus(sc);
+ PipelinesNode.getRedirector(getEnvironment()).sendStatus(sc);
}
/*
@@ -264,7 +334,7 @@
*/
public Object jsFunction_getComponent(String id)
throws Exception {
- return componentManager.lookup(id);
+ return getComponentManager().lookup(id);
}
/**
@@ -275,7 +345,7 @@
*/
public void jsFunction_releaseComponent( Object component ) throws Exception {
try {
- this.componentManager.release( (Component) unwrap(component) );
+ this.getComponentManager().release( (Component) unwrap(component) );
} catch( ClassCastException cce ) {
throw new JavaScriptException( "Only components can be released!" );
}
@@ -293,9 +363,9 @@
org.mozilla.javascript.Context cx =
org.mozilla.javascript.Context.getCurrentContext();
Scriptable scope = getParentScope();
- Script script = interpreter.compileScript( cx,
- environment,
- filename );
+ Script script = getInterpreter().compileScript( cx,
+ getEnvironment(),
+ filename );
return script.exec( cx, scope );
}
@@ -318,10 +388,10 @@
public Object jsFunction_setupObject(Object obj) throws Exception {
LifecycleHelper.setupComponent(
unwrap(obj),
- this.logger,
- this.avalonContext,
- this.serviceManager,
- this.componentManager,
+ this.getLogger(),
+ this.getAvalonContext(),
+ this.getServiceManager(),
+ this.getComponentManager(),
null,// roleManager
null,// configuration
true);
@@ -1284,72 +1354,23 @@
}
public FOM_Request jsGet_request() {
- if (request != null) {
- return request;
- }
- if (environment == null) {
- // context has been invalidated
- return null;
- }
- Map objectModel = environment.getObjectModel();
- request = new FOM_Request(ObjectModelHelper.getRequest(objectModel));
- request.setParentScope(getParentScope());
- request.setPrototype(getClassPrototype(getParentScope(), "FOM_Request"));
- return request;
+ return currentCall.getRequest();
}
public FOM_Response jsGet_response() {
- if (response != null) {
- return response;
- }
- if (environment == null) {
- // context has been invalidated
- return null;
- }
- Map objectModel = environment.getObjectModel();
- response =
- new FOM_Response(ObjectModelHelper.getResponse(objectModel));
- response.setParentScope(getParentScope());
- response.setPrototype(getClassPrototype(this, "FOM_Response"));
- return response;
+ return currentCall.getResponse();
}
public FOM_Log jsGet_log() {
- if (log != null) {
- return log;
- }
- log = new FOM_Log(logger);
- log.setParentScope(getParentScope());
- log.setPrototype(getClassPrototype(this, "FOM_Log"));
- return log;
+ return currentCall.getLog();
}
public FOM_Context jsGet_context() {
- if (context != null) {
- return context;
- }
- Map objectModel = environment.getObjectModel();
- context =
- new FOM_Context(ObjectModelHelper.getContext(objectModel));
- context.setParentScope(getParentScope());
- context.setPrototype(getClassPrototype(this, "FOM_Context"));
- return context;
+ return currentCall.getContext();
}
public FOM_Session jsGet_session() {
- if (session != null) {
- return session;
- }
- if (environment == null) {
- // session has been invalidated
- return null;
- }
- Map objectModel = environment.getObjectModel();
- session =
- new FOM_Session(ObjectModelHelper.getRequest(objectModel).getSession(true));
- session.setParentScope(getParentScope());
- session.setPrototype(getClassPrototype(this, "FOM_Session"));
- return session;
+ return currentCall.getSession();
}
/**
@@ -1359,11 +1380,15 @@
* the Sitemap parameters from <map:call>
*/
public Scriptable jsGet_parameters() {
- return parameters;
+ return getParameters();
+ }
+
+ public Scriptable getParameters() {
+ return currentCall.getParameters();
}
void setParameters(Scriptable value) {
- parameters = value;
+ currentCall.setParameters(value);
}
// unwrap Wrapper's and convert undefined to null
@@ -1419,7 +1444,7 @@
* @return The object model
*/
public Map getObjectModel() {
- return environment.getObjectModel();
+ return getEnvironment().getObjectModel();
}
/**
@@ -1428,7 +1453,28 @@
*/
public ComponentManager getComponentManager() {
- return componentManager;
+ return currentCall.componentManager;
+ }
+
+
+ private Environment getEnvironment() {
+ return currentCall.environment;
+ }
+
+ private Context getAvalonContext() {
+ return currentCall.avalonContext;
+ }
+
+ private Logger getLogger() {
+ return currentCall.logger;
+ }
+
+ private ServiceManager getServiceManager() {
+ return currentCall.serviceManager;
+ }
+
+ private FOM_JavaScriptInterpreter getInterpreter() {
+ return currentCall.interpreter;
}
/**
@@ -1442,12 +1488,12 @@
Object bean,
FOM_WebContinuation fom_wk)
throws Exception {
- interpreter.forwardTo(getTopLevelScope(this),
- this,
- uri,
- bean,
- fom_wk,
- environment);
+ getInterpreter().forwardTo(getTopLevelScope(this),
+ this,
+ uri,
+ bean,
+ fom_wk,
+ getEnvironment());
}
/**
@@ -1463,7 +1509,7 @@
throws Exception {
List list = null;
if (parameters == null || parameters == Undefined.instance) {
- parameters = this.parameters;
+ parameters = getParameters();
}
Object[] ids = parameters.getIds();
list = new ArrayList();
@@ -1473,7 +1519,7 @@
org.mozilla.javascript.Context.toString(getProperty(parameters, name)));
list.add(arg);
}
- interpreter.handleContinuation(kontId, list, environment);
+ getInterpreter().handleContinuation(kontId, list, getEnvironment());
}
/**
@@ -1492,7 +1538,7 @@
WebContinuation wk;
ContinuationsManager contMgr;
contMgr = (ContinuationsManager)
- componentManager.lookup(ContinuationsManager.ROLE);
+ getComponentManager().lookup(ContinuationsManager.ROLE);
wk = contMgr.createWebContinuation(unwrap(k),
(parent == null ? null : parent.getWebContinuation()),
timeToLive,
1.19 +8 -8 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.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- FOM_JavaScriptInterpreter.java 6 Jan 2004 12:37:21 -0000 1.18
+++ FOM_JavaScriptInterpreter.java 19 Jan 2004 17:53:38 -0000 1.19
@@ -546,8 +546,8 @@
// We need to setup the FOM_Cocoon object according to the current
// request. Everything else remains the same.
thrScope.setupPackages(getClassLoader(needsRefresh));
- cocoon.setup(this, environment, manager, serviceManager, avalonContext,
- getLogger());
+ cocoon.pushCallContext(this, environment, manager, serviceManager,
+ avalonContext, getLogger(), null);
// Check if we need to compile and/or execute scripts
synchronized (compiledScripts) {
@@ -719,7 +719,7 @@
} finally {
updateSession(environment, thrScope);
if (cocoon != null) {
- cocoon.invalidate();
+ cocoon.popCallContext();
}
Context.exit();
}
@@ -751,9 +751,9 @@
Scriptable kScope = k.getParentScope();
synchronized (kScope) {
FOM_Cocoon cocoon = (FOM_Cocoon)kScope.get("cocoon", kScope);
- cocoon.setup(this, environment, manager,
- serviceManager, avalonContext,
- getLogger());
+ cocoon.pushCallContext(this, environment, manager,
+ serviceManager, avalonContext,
+ getLogger(), wk);
// Register the current scope for scripts indirectly called from this function
cocoon.getRequest().setAttribute(
FOM_JavaScriptFlowHelper.FOM_SCOPE, kScope);
@@ -799,7 +799,7 @@
throw new CascadingRuntimeException(ee.getMessage(), ee);
} finally {
updateSession(environment, kScope);
- cocoon.invalidate();
+ cocoon.popCallContext();
Context.exit();
}
}