r9641 - in helma-ng/trunk: apps/demo modules/helma modules/helma/webapp

[email protected] Tue, 21 Apr 2009 17:25:01 +0200 (CEST)
Newsgroups gmane.comp.java.helma.cvs
Message-ID <20090421152501.6EAA13D0D6@mia>
Author: hannes
Date: 2009-04-21 17:25:01 +0200 (Tue, 21 Apr 2009)
New Revision: 9641

Modified:
   helma-ng/trunk/apps/demo/config.js
   helma-ng/trunk/modules/helma/buffer.js
   helma-ng/trunk/modules/helma/logging.js
   helma-ng/trunk/modules/helma/webapp.js
   helma-ng/trunk/modules/helma/webapp/response.js
Log:
Start converting middleware to new Jack based webapp framework, beginning with helma/logging.

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

Modified: helma-ng/trunk/apps/demo/config.js
===================================================================
--- helma-ng/trunk/apps/demo/config.js	2009-04-21 14:29:50 UTC (rev 9640)
+++ helma-ng/trunk/apps/demo/config.js	2009-04-21 15:25:01 UTC (rev 9641)
@@ -8,7 +8,7 @@
 ];
 
 exports.middleware = [
-    'helma/webapp/continuation',
+    // 'helma/webapp/continuation',
     'helma/logging'
 ];
 

Modified: helma-ng/trunk/modules/helma/buffer.js
===================================================================
--- helma-ng/trunk/modules/helma/buffer.js	2009-04-21 14:29:50 UTC (rev 9640)
+++ helma-ng/trunk/modules/helma/buffer.js	2009-04-21 15:25:01 UTC (rev 9641)
@@ -46,4 +46,10 @@
             }\r\n\
         </script>\r\n";
     }
+
+    if (arguments.length > 0) {
+        this.write.apply(this, arguments);
+    }
+
+    return this;
 }
\ No newline at end of file

Modified: helma-ng/trunk/modules/helma/logging.js
===================================================================
--- helma-ng/trunk/modules/helma/logging.js	2009-04-21 14:29:50 UTC (rev 9640)
+++ helma-ng/trunk/modules/helma/logging.js	2009-04-21 15:25:01 UTC (rev 9641)
@@ -43,51 +43,55 @@
 /**
  * Render log4j messages to response buffer in the style of helma 1 res.debug().
  */
-exports.onRequest = function() {
+exports.handleRequest = function handleRequest(req) {
     // Install list in 'responseLog' threadlocal
-    if (responseLogEnabled) {
-        var cx = system.getRhinoContext();
-        cx.putThreadLocal('responseLog', new java.util.LinkedList());
+    if (!responseLogEnabled) {
+        return req.process();
     }
-}
+    var cx = system.getRhinoContext();
+    cx.putThreadLocal('responseLog', new java.util.LinkedList());
 
-/**
- * Write the log4j response buffer to the main response buffer and reset it.
- * This can either be called manually to insert the log buffer at any given position
- * in the response, or it will called by the log4j response listener after the
- * response has been generated.
- */
-exports.onResponse = exports.onError = function(req, res) {
-    if (!responseLogEnabled || (res.status != 200 && res.status < 400)) {
-        return;
+    var res = req.process();
+
+    if (res && typeof res === 'object' && typeof res.close === 'function') {
+        res = res.close();
     }
-    // flush stuff logged via res.debug()
-    res.flushDebug();
 
+    var [status, headers, body] = res;
+
+    if (status != 200 && status < 400) {
+        return res;
+    }
+
     var cx = system.getRhinoContext();
     var list = cx.getThreadLocal('responseLog');
 
-    if (list) {
+    if (list && !list.isEmpty()) {
+        if (!(body instanceof Buffer)) {
+            body = res[2] = new Buffer(body);
+        }
         for (var i = 0; i < list.size(); i++) {
             var item = list.get(i);
             var msg = item[0];
             var multiline = msg && msg.indexOf('\n') > 0 || msg.indexOf('\r')> 0;
-            res.write("<div class=\"helma-debug-line\" style=\"background: #fc3;");
-            res.write("color: black; border-top: 1px solid black;\">");
+            body.write("<div class=\"helma-debug-line\" style=\"background: #fc3;");
+            body.write("color: black; border-top: 1px solid black;\">");
             if (multiline) {
-                res.write("<pre>").write(msg).write("</pre>");
+                body.write("<pre>").write(msg).write("</pre>");
             } else {
-                res.write(msg);
+                body.write(msg);
             }
             if (item[1]) {
-                res.write("<h4 style='padding-left: 8px; margin: 4px;'>Script Stack</h4>");
-                res.write("<pre style='margin: 0;'>", item[1], "</pre>");
+                body.write("<h4 style='padding-left: 8px; margin: 4px;'>Script Stack</h4>");
+                body.write("<pre style='margin: 0;'>", item[1], "</pre>");
             }
             if (item[2]) {
-                res.write("<h4 style='padding-left: 8px; margin: 4px;'>Java Stack</h4>");
-                res.write("<pre style='margin: 0;'>", item[2], "</pre>");
+                body.write("<h4 style='padding-left: 8px; margin: 4px;'>Java Stack</h4>");
+                body.write("<pre style='margin: 0;'>", item[2], "</pre>");
             }
-            res.writeln("</div>");
+            body.writeln("</div>");
         }
     }
+
+    return res;
 };

Modified: helma-ng/trunk/modules/helma/webapp/response.js
===================================================================
--- helma-ng/trunk/modules/helma/webapp/response.js	2009-04-21 14:29:50 UTC (rev 9640)
+++ helma-ng/trunk/modules/helma/webapp/response.js	2009-04-21 15:25:01 UTC (rev 9641)
@@ -130,6 +130,7 @@
 
     Object.defineProperty(this, 'close', {
         value: function() {
+            this.flushDebug();
             if (charset) {
                 contentType = contentType || HashP.get('content-type') || "text/html";
                 contentType += "; charset=" + charset;

Modified: helma-ng/trunk/modules/helma/webapp.js
===================================================================
--- helma-ng/trunk/modules/helma/webapp.js	2009-04-21 14:29:50 UTC (rev 9640)
+++ helma-ng/trunk/modules/helma/webapp.js	2009-04-21 15:25:01 UTC (rev 9641)
@@ -78,6 +78,8 @@
         return null;
     }
 
+    
+
     try {
         log.debug('resolving path ' + path);
         if (config.urls instanceof Array) {
@@ -103,7 +105,17 @@
                         /* invokeMiddleware('onAction',
                                 config.middleware,
                                 [req, action, actionArgs]); */
-                        res = action.apply(module, args);
+                        var middleware = config.middleware;
+                        var middlewareIndex = 0;
+                        // set up middleware chain in request object
+                        req.process = function() {
+                            if (middlewareIndex < middleware.length) {
+                                return invokeMiddleware(middleware[middlewareIndex++], [req]);
+                            } else {
+                                return action.apply(module, args);
+                            }
+                        }
+                        res = req.process();
                     }
                     break;
                 }
@@ -127,22 +139,25 @@
     return res;
 }
 
-function invokeMiddleware(hook, middleware, args) {
-    for (var i = 0; middleware && i < middleware.length; i++) {
-        var signature = middleware[i] + '.' + hook;
-        try {
-            var module = require(middleware[i]);
-            if (typeof module[hook] == 'function') {
-                log.debug('invoking middleware: ' + signature);
-                module[hook].apply(module, args);
-            }
-        } catch (e) {
-            if (e.retry) {
-                throw e;
-            } else if (!e.redirect) {
-                log.error('Error in ' + signature + ': ' + e);
-            }
+function invokeMiddleware(middleware, args) {
+    var functionName = 'handleRequest';
+    var dot = middleware.indexOf('.');
+    if (dot > -1) {
+        functionName = middleware.substring(dot + 1);
+        middleware = middleware.substring(0, dot);
+    }
+    try {
+        var module = require(middleware);
+        if (typeof module[functionName] !== 'function') {
+            throw new Error('Middleware function ' + functionName + ' is not defined in ' + middleware);
         }
+        log.debug('invoking middleware: ' + middleware);
+        return module[functionName].apply(module, args);
+    } catch (e) {
+        if (!e.retry) {
+            log.error('Error in ' + middleware + ': ' + e);
+        }
+        throw e;
     }
 }