r9654 - in helma-ng/trunk: apps/demo apps/demo/skins modules/helma/webapp

[email protected] Wed, 22 Apr 2009 15:10:01 +0200 (CEST)
Newsgroups gmane.comp.java.helma.cvs
Message-ID <20090422131001.363A53D0D6@mia>
Author: hannes
Date: 2009-04-22 15:10:01 +0200 (Wed, 22 Apr 2009)
New Revision: 9654

Modified:
   helma-ng/trunk/apps/demo/actions.js
   helma-ng/trunk/apps/demo/skins/continuation.html
   helma-ng/trunk/modules/helma/webapp/continuation.js
Log:
Polish continuation support a bit, mostly naming and minor fixes.

Details at http://dev.helma.org/trac/helma/changeset/9654

Modified: helma-ng/trunk/apps/demo/actions.js
===================================================================
--- helma-ng/trunk/apps/demo/actions.js	2009-04-22 13:09:58 UTC (rev 9653)
+++ helma-ng/trunk/apps/demo/actions.js	2009-04-22 13:10:01 UTC (rev 9654)
@@ -47,48 +47,48 @@
     // local data - this is the data that is shared between continuations of this function
     var data = {};
 
-    req = ContinuationMark(req, "start");
+    req = ContinuationMark(req, "welcome");
 
     // render intro page
-    req = ContinuationRequest(req, SkinnedResponse('skins/continuation.html', {
-        skin: "start",
+    req = ContinuationRequest(req, "ask_name", SkinnedResponse('skins/continuation.html', {
+        skin: "welcome",
         title: "Continuations Demo",
         data: data,
-        forward: ContinuationUrl("name")
-    }), "name");
+        forward: ContinuationUrl("ask_name")
+    }));
     
-    req = ContinuationRequest(req, SkinnedResponse('skins/continuation.html', {
-        skin: "name",
+    req = ContinuationRequest(req, "ask_food", SkinnedResponse('skins/continuation.html', {
+        skin: "ask_name",
         title: "Question 1",
         data: data,
-        back: ContinuationUrl("start"),
-        forward: ContinuationUrl("food")
-    }), "food");
+        back: ContinuationUrl("welcome"),
+        forward: ContinuationUrl("ask_food")
+    }));
     data.name = req.params.name || data.name;
 
-    req = ContinuationRequest(req, SkinnedResponse('skins/continuation.html', {
-        skin: "food",
+    req = ContinuationRequest(req, "ask_animal", SkinnedResponse('skins/continuation.html', {
+        skin: "ask_food",
         title: "Question 2",
         data: data,
-        back: ContinuationUrl("name"),
-        forward: ContinuationUrl("animal")
-    }), "animal");
+        back: ContinuationUrl("ask_name"),
+        forward: ContinuationUrl("ask_animal")
+    }));
     data.food = req.params.food || data.food;
 
-    req = ContinuationRequest(req, SkinnedResponse('skins/continuation.html', {
-        skin: "animal",
+    req = ContinuationRequest(req, "result", SkinnedResponse('skins/continuation.html', {
+        skin: "ask_animal",
         title: "Question 3",
         data: data,
-        back: ContinuationUrl("food"),
+        back: ContinuationUrl("ask_food"),
         forward: ContinuationUrl("result")
-    }), "result");
+    }));
     data.animal = req.params.animal || data.animal;
 
     return SkinnedResponse('skins/continuation.html', {
         skin: "result",
         title: "Thank you!",
         data: data,
-        back: ContinuationUrl("animal")
+        back: ContinuationUrl("ask_animal")
     });
 
 }
\ No newline at end of file

Modified: helma-ng/trunk/apps/demo/skins/continuation.html
===================================================================
--- helma-ng/trunk/apps/demo/skins/continuation.html	2009-04-22 13:09:58 UTC (rev 9653)
+++ helma-ng/trunk/apps/demo/skins/continuation.html	2009-04-22 13:10:01 UTC (rev 9654)
@@ -3,7 +3,7 @@
 <% subskin 'content' -------------------------------------------------------------------- %>
 <% render <% skin %> %>
 
-<% subskin 'start' %>
+<% subskin 'welcome' %>
 
     <b><% note %></b>        
 
@@ -20,7 +20,7 @@
 
     <% render 'list' %>
 
-<% subskin 'name' %>
+<% subskin 'ask_name' %>
 
     What is your name? <form method="post" action="<% forward %>">
     <input name="name" value="<% data.name %>">
@@ -31,7 +31,7 @@
 
     <% render 'list' %>
 
-<% subskin 'food' %>
+<% subskin 'ask_food' %>
 
     What is your favorite food? <form method="post" action="<% forward %>">
     <input name="food" value="<% data.food %>">
@@ -42,7 +42,7 @@
 
     <% render 'list' %>
 
-<% subskin 'animal' %>
+<% subskin 'ask_animal' %>
 
     What is your favorite animal? <form method="post" action="<% forward %>">
     <input name="animal" value="<% data.animal %>">

Modified: helma-ng/trunk/modules/helma/webapp/continuation.js
===================================================================
--- helma-ng/trunk/modules/helma/webapp/continuation.js	2009-04-22 13:09:58 UTC (rev 9653)
+++ helma-ng/trunk/modules/helma/webapp/continuation.js	2009-04-22 13:10:01 UTC (rev 9654)
@@ -11,48 +11,61 @@
 
 var ids = {};
 
-function ContinuationUrl(key) {
-    return "?helma_continuation=" + ContinuationId(key);
+function ContinuationUrl(name) {
+    return "?helma_continuation=" + ContinuationId(name);
 }
 
-function ContinuationId(key) {
-    if (!key)
+function ContinuationId(name) {
+    if (!name)
         return generateId();
-    if (!(key in ids))
-        ids[key] = generateId();
-    return ids[key];
+    if (!(name in ids))
+        ids[name] = generateId();
+    return ids[name];
 }
 
 /**
  * Stop current execution and register continuation for later resumption.
  * @param id the continuation id. If not given a new id is generated.
  */
-function ContinuationRequest(req, res, key) {
+function ContinuationRequest(req, name, res) {
     // capture continuation and store it in callback container
-    var id = ContinuationId(key);
-    log.debug("registering callback for id " + id);
-    setCallback(req, id, new Continuation());
-    // trick to exit current context: call empty continuation
-    new org.mozilla.javascript.NativeContinuation()(res);
-};
+    var id = ContinuationId(name);
+    var continuation = createContinuation();
+    if (continuation instanceof Continuation) {
+        log.debug("Registering continuation for id: " + id);
+        setCallback(req, id, continuation);
+        // Exit current js context by calling empty continuation with return value
+        new org.mozilla.javascript.NativeContinuation()(res);
+    } else {
+        return continuation;
+    }
+}
 
-function ContinuationMark(req, key) {
+function ContinuationMark(req, name) {
+    if (!req.params.helma_continuation) {
+        // set query param so helma knows to switch rhino optimization level to -1
+        throw { redirect: ContinuationUrl() };
+    }
     if (system.getOptimizationLevel() > -1) {
         system.setOptimizationLevel(-1);
         throw { retry: true };
     }
-    if (!req.params.helma_continuation) {
-        // set query param so helma knows to switch rhino optimization level to -1
-        throw { redirect: ContinuationUrl() };
+    var id = req.params.helma_continuation;
+    ids[name] = id;
+    var continuation = createContinuation();
+    if (continuation instanceof Continuation) {
+        log.debug("Recording continuation start: " + id);
+        setCallback(req, id, continuation);
+        return req;
+    } else {
+        return continuation;
     }
-    var id = req.params.helma_continuation;
-    ids[key] = id;
-    var cont = new Continuation();
-    log.debug("Recording continuation start: " + id);
-    setCallback(req, id, cont);
-    return req;
 }
 
+function createContinuation() {
+    return new Continuation();
+}
+
 /**
  * Continuation middleware function
  * @param req the request
@@ -62,6 +75,10 @@
     var id = req.params.helma_continuation;
     var continuation = getCallback(req, id);
     if (continuation) {
+        if (system.getOptimizationLevel() > -1) {
+            system.setOptimizationLevel(-1);
+            throw { retry: true };
+        }        
         log.debug("resuming continuation " + id + " with req " + req);
         return continuation(req);
     }