Return-Path: Delivered-To: apmail-cocoon-cvs-archive@www.apache.org Received: (qmail 95228 invoked from network); 28 Jan 2004 05:46:32 -0000 Received: from daedalus.apache.org (HELO mail.apache.org) (208.185.179.12) by minotaur-2.apache.org with SMTP; 28 Jan 2004 05:46:32 -0000 Received: (qmail 31017 invoked by uid 500); 28 Jan 2004 05:46:10 -0000 Delivered-To: apmail-cocoon-cvs-archive@cocoon.apache.org Received: (qmail 30943 invoked by uid 500); 28 Jan 2004 05:46:09 -0000 Mailing-List: contact cvs-help@cocoon.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@cocoon.apache.org list-help: list-unsubscribe: list-post: Delivered-To: mailing list cvs@cocoon.apache.org Received: (qmail 30895 invoked by uid 500); 28 Jan 2004 05:46:08 -0000 Delivered-To: apmail-cocoon-2.1-cvs@apache.org Received: (qmail 30855 invoked from network); 28 Jan 2004 05:46:08 -0000 Received: from unknown (HELO minotaur.apache.org) (209.237.227.194) by daedalus.apache.org with SMTP; 28 Jan 2004 05:46:08 -0000 Received: (qmail 94888 invoked by uid 1544); 28 Jan 2004 05:46:21 -0000 Date: 28 Jan 2004 05:46:21 -0000 Message-ID: <20040128054621.94887.qmail@minotaur.apache.org> From: coliver@apache.org To: cocoon-2.1-cvs@apache.org Subject: cvs commit: cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom FOM_Cocoon.java FOM_WebContinuation.java fom_system.js X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N coliver 2004/01/27 21:46:21 Modified: src/java/org/apache/cocoon/components/flow AbstractInterpreter.java src/java/org/apache/cocoon/components/flow/javascript/fom FOM_Cocoon.java FOM_WebContinuation.java fom_system.js Log: Added createPageLocal() and createWebContinuation() Revision Changes Path 1.17 +7 -2 cocoon-2.1/src/java/org/apache/cocoon/components/flow/AbstractInterpreter.java Index: AbstractInterpreter.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/AbstractInterpreter.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- AbstractInterpreter.java 19 Jan 2004 13:05:11 -0000 1.16 +++ AbstractInterpreter.java 28 Jan 2004 05:46:21 -0000 1.17 @@ -70,6 +70,7 @@ import org.apache.cocoon.components.CocoonComponentManager; import org.apache.cocoon.environment.Context; import org.apache.cocoon.environment.Environment; +import org.apache.cocoon.environment.Redirector; import org.apache.cocoon.environment.wrapper.EnvironmentWrapper; import org.apache.excalibur.source.SourceUtil; @@ -267,7 +268,11 @@ Map objectModel = environment.getObjectModel(); FlowHelper.setWebContinuation(objectModel, continuation); FlowHelper.setContextObject(objectModel, bizData); - PipelinesNode.getRedirector(environment).redirect(false, uri); + Redirector redirector = PipelinesNode.getRedirector(environment); + if (redirector.hasRedirected()) { + throw new IllegalStateException("Pipeline has already been processed for this request"); + } + redirector.redirect(false, uri); } else { throw new Exception("uri is not allowed to contain a scheme (cocoon:/ is always automatically used)"); } 1.27 +83 -38 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.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- FOM_Cocoon.java 21 Jan 2004 14:31:25 -0000 1.26 +++ FOM_Cocoon.java 28 Jan 2004 05:46:21 -0000 1.27 @@ -115,6 +115,8 @@ Scriptable parameters; FOM_Log log; WebContinuation lastContinuation; + FOM_WebContinuation fwk; + PageLocalScopeImpl currentPageLocal; public CallContext(CallContext caller, FOM_JavaScriptInterpreter interp, @@ -132,6 +134,34 @@ this.avalonContext = avalonContext; this.logger = logger; this.lastContinuation = lastContinuation; + if (lastContinuation != null) { + fwk = new FOM_WebContinuation(lastContinuation); + Scriptable scope = FOM_Cocoon.this.getParentScope(); + fwk.setParentScope(scope); + fwk.setPrototype(getClassPrototype(scope, fwk.getClassName())); + this.currentPageLocal = fwk.getPageLocal(); + } + if (this.currentPageLocal != null) { + // "clone" the page local scope + this.currentPageLocal = this.currentPageLocal.duplicate(); + } else { + this.currentPageLocal = new PageLocalScopeImpl(getTopLevelScope(FOM_Cocoon.this)); + } + pageLocal.setDelegate(this.currentPageLocal); + } + + public FOM_WebContinuation getLastContinuation() { + return fwk; + } + + public void setLastContinuation(FOM_WebContinuation fwk) { + this.fwk = fwk; + if (fwk != null) { + pageLocal.setDelegate(fwk.getPageLocal()); + this.lastContinuation = fwk.getWebContinuation(); + } else { + this.lastContinuation = null; + } } public FOM_Session getSession() { @@ -205,11 +235,13 @@ } private CallContext currentCall; + private PageLocalScopeHolder pageLocal; public String getClassName() { return "FOM_Cocoon"; } + // Called by FOM_JavaScriptInterpreter static void init(Scriptable scope) throws Exception { defineClass(scope, FOM_Cocoon.class); @@ -220,6 +252,7 @@ defineClass(scope, FOM_Context.class); defineClass(scope, FOM_Log.class); defineClass(scope, FOM_WebContinuation.class); + defineClass(scope, PageLocalImpl.class); } void pushCallContext(FOM_JavaScriptInterpreter interp, @@ -229,6 +262,9 @@ Context avalonContext, Logger logger, WebContinuation lastContinuation) { + if (pageLocal == null) { + pageLocal = new PageLocalScopeHolder(getTopLevelScope(this)); + } this.currentCall = new CallContext(currentCall, interp, env, manager, serviceManager, avalonContext, logger, lastContinuation); @@ -241,49 +277,40 @@ request.removeAttribute(FOM_JavaScriptFlowHelper.FOM_SCOPE); } this.currentCall = this.currentCall.caller; + // reset current page locals + if (this.currentCall != null) { + pageLocal.setDelegate(this.currentCall.currentPageLocal); + } else { + pageLocal.setDelegate(null); + } } - private FOM_WebContinuation forwardTo(String uri, Object bizData, - Continuation continuation) - throws Exception { - WebContinuation wk = null; - if (continuation != null) { - ContinuationsManager contMgr = (ContinuationsManager) - getComponentManager().lookup(ContinuationsManager.ROLE); - wk = contMgr.createWebContinuation(continuation, - currentCall.lastContinuation, - 0, - null); - } - - String redUri = uri; - - FOM_WebContinuation fom_wk = - new FOM_WebContinuation(wk); - fom_wk.setParentScope(getParentScope()); - fom_wk.setPrototype(getClassPrototype(getParentScope(), - fom_wk.getClassName())); - getInterpreter().forwardTo(getParentScope(), this, redUri, - bizData, fom_wk, getEnvironment()); - - FOM_WebContinuation result = null; - if (wk != null) { - result = new FOM_WebContinuation(wk); - result.setParentScope(getParentScope()); - result.setPrototype(getClassPrototype(getParentScope(), - result.getClassName())); - } - return result; + public FOM_WebContinuation jsGet_continuation() { + return currentCall.getLastContinuation(); + } + + public void jsSet_continuation(Object obj) { + FOM_WebContinuation fwk = (FOM_WebContinuation)unwrap(obj); + currentCall.setLastContinuation(fwk); } public FOM_WebContinuation jsFunction_sendPage(String uri, Object obj, - Object continuation) + Object wk) throws Exception { - return forwardTo(uri, unwrap(obj), (Continuation)unwrap(continuation)); + FOM_WebContinuation fom_wk = (FOM_WebContinuation)unwrap(wk); + if (fom_wk != null) { + // save page locals + fom_wk.setPageLocal(pageLocal.getDelegate()); + } + forwardTo(uri, unwrap(obj), fom_wk); + return fom_wk; } + public Scriptable jsFunction_createPageLocal() { + return pageLocal.createPageLocal(); + } public void jsFunction_processPipelineTo(String uri, Object map, @@ -1106,10 +1133,7 @@ } public void jsFunction_setAttribute(String name, Object value) { - if (value instanceof NativeJavaObject) { - value = ((NativeJavaObject) value).unwrap(); - } - session.setAttribute(name, value); + session.setAttribute(name, unwrap(value)); } public void jsFunction_removeAttribute(String name) { @@ -1520,6 +1544,27 @@ list.add(arg); } getInterpreter().handleContinuation(kontId, list, getEnvironment()); + } + + /** + * Create a Bookmark WebContinuation from a JS Continuation with the last + * continuation of sendPageAndWait as its parent. + * PageLocal variables will be shared with the continuation of + * the next call to sendPageAndWait(). + * @param k The JS continuation + * @param ttl Lifetime for this continuation (zero means no limit) + */ + public FOM_WebContinuation jsFunction_makeWebContinuation(Object k, + Object ttl) + throws Exception { + double d = org.mozilla.javascript.Context.toNumber(ttl); + FOM_WebContinuation result = + makeWebContinuation((Continuation)unwrap(k), + jsGet_continuation(), + (int)d); + result.setPageLocal(pageLocal.getDelegate()); + currentCall.setLastContinuation(result); + return result; } /** 1.4 +128 -6 cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_WebContinuation.java Index: FOM_WebContinuation.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_WebContinuation.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- FOM_WebContinuation.java 22 Jan 2004 16:53:57 -0000 1.3 +++ FOM_WebContinuation.java 28 Jan 2004 05:46:21 -0000 1.4 @@ -56,9 +56,15 @@ import org.apache.avalon.framework.component.ComponentManager; import org.apache.cocoon.components.flow.ContinuationsManager; import org.apache.cocoon.components.flow.WebContinuation; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.Function; import org.mozilla.javascript.NativeArray; +import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; +import org.mozilla.javascript.Undefined; import org.mozilla.javascript.Wrapper; +import org.mozilla.javascript.continuations.Continuation; + /** * @@ -68,14 +74,63 @@ WebContinuation wk; + + static class UserObject { + boolean isBookmark; + PageLocalScopeImpl pageLocal; + } + + static private boolean isBookmark(WebContinuation wk) { + UserObject userObj = (UserObject)wk.getUserObject(); + if (userObj == null) { + return false; + } + return userObj.isBookmark; + } + public FOM_WebContinuation() { } - public FOM_WebContinuation(Object wk) { - if (wk instanceof Wrapper) { - wk = ((Wrapper)wk).unwrap(); + + public FOM_WebContinuation(WebContinuation wk) { + this.wk = wk; + } + + // new FOM_WebContinuation([Continuation] continuation, + // [FOM_WebContinuation] parent, + // [Number] timeToLive) + public static Object jsConstructor(Context cx, Object[] args, + Function ctorObj, + boolean inNewExpr) + throws Exception { + FOM_WebContinuation result = null; + if (args.length < 1) { + // error } - this.wk = (WebContinuation)wk; + Continuation c = (Continuation)unwrap(args[0]); + FOM_WebContinuation parent = null; + if (args.length > 1) { + parent = (FOM_WebContinuation)args[1]; + } + int timeToLive = 0; + if (args.length > 2) { + timeToLive = + (int)org.mozilla.javascript.Context.toNumber(args[2]); + } + WebContinuation wk; + Scriptable scope = getTopLevelScope(c); + FOM_Cocoon cocoon = (FOM_Cocoon)getProperty(scope, "cocoon"); + ComponentManager componentManager = cocoon.getComponentManager(); + ContinuationsManager contMgr = (ContinuationsManager) + componentManager.lookup(ContinuationsManager.ROLE); + wk = contMgr.createWebContinuation(c, + (parent == null ? null : parent.getWebContinuation()), + timeToLive, + null); + result = new FOM_WebContinuation(wk); + result.setParentScope(getTopLevelScope(scope)); + result.setPrototype(getClassPrototype(scope, result.getClassName())); + return result; } public String getClassName() { @@ -86,6 +141,11 @@ return wk.getId(); } + + public Continuation jsGet_continuation() { + return (Continuation)wk.getContinuation(); + } + public FOM_WebContinuation jsFunction_getParent() { WebContinuation parent = wk.getParentContinuation(); if (parent == null) return null; @@ -95,7 +155,7 @@ pwk.getClassName())); return pwk; } - + public NativeArray jsFunction_getChildren() throws Exception { List list = wk.getChildren(); NativeArray arr = @@ -132,5 +192,67 @@ public WebContinuation getWebContinuation() { return wk; + } + + private static Object unwrap(Object obj) { + if (obj instanceof Wrapper) { + obj = ((Wrapper)obj).unwrap(); + } else if (obj == Undefined.instance) { + obj = null; + } + return obj; + } + + PageLocalScopeImpl getPageLocal() { + UserObject userObj = (UserObject)wk.getUserObject(); + if (userObj == null) return null; + return userObj.pageLocal; + } + + void setPageLocal(PageLocalScopeImpl pageLocal) { + UserObject userObj = (UserObject)wk.getUserObject(); + if (userObj == null) { + userObj = new UserObject(); + wk.setUserObject(userObj); + } + userObj.pageLocal = pageLocal; + } + + public void jsFunction_setBookmark(boolean value) { + UserObject userObj = (UserObject)wk.getUserObject(); + if (userObj == null) { + userObj = new UserObject(); + wk.setUserObject(userObj); + } + userObj.isBookmark = value; + } + + public boolean jsGet_bookmark() { + return isBookmark(wk); + } + + public boolean jsFunction_isBookmark() { + return isBookmark(wk); + } + + public FOM_WebContinuation jsGet_previousBookmark() { + WebContinuation c = wk.getParentContinuation(); + if (c == null) return null; + // If this is a continuation of sendPageAndWait() + // and the immediate parent is a bookmark, then + // it is the bookmark for this page, so skip it. + if (!isBookmark(wk) && isBookmark(c)) { + c = c.getParentContinuation(); + } + while (c != null && !isBookmark(c)) { + c = c.getParentContinuation(); + } + if (c == null) return null; + FOM_WebContinuation pwk = new FOM_WebContinuation(c); + pwk.setParentScope(getParentScope()); + pwk.setPrototype(getClassPrototype(getParentScope(), + pwk.getClassName())); + return pwk; + } } 1.4 +17 -6 cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/fom_system.js Index: fom_system.js =================================================================== RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/fom_system.js,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- fom_system.js 10 Jan 2004 16:53:43 -0000 1.3 +++ fom_system.js 28 Jan 2004 05:46:21 -0000 1.4 @@ -1,12 +1,14 @@ FOM_Cocoon.suicide = new Continuation(); -FOM_Cocoon.prototype.sendPageAndWait = function(uri, bizData, fun) { - this.sendPage(uri, bizData, new Continuation()); +FOM_Cocoon.prototype.sendPageAndWait = function(uri, bizData, fun, ttl) { + this.sendPage(uri, bizData, + new FOM_WebContinuation(new Continuation(), + this.continuation, ttl)); if (fun) { - if (!(fun instanceof Function)) { - throw "Expected a function instead of: " + fun; - } - fun(); + if (!(fun instanceof Function)) { + throw "Expected a function instead of: " + fun; + } + fun(); } FOM_Cocoon.suicide(); } @@ -14,3 +16,12 @@ FOM_Cocoon.prototype.handleContinuation = function(k, wk) { k(wk); } + +FOM_Cocoon.prototype.createWebContinuation = function(ttl) { + var wk = this.makeWebContinuation(new Continuation(), ttl); + wk.setBookmark(true); + return wk; +} + + +