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();
               }
           }