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