#include <jdisp/package.jsh>
#include <jdisp/text/package.jsh>
#include <jdisp/util/package.jsh>
+#include <jdisp/logging/package.jsh>
#endif /* _JDISP_H */
--- /dev/null
+#ifndef _JDISP_LOGGING_BASICLOGGER_JS\r
+#define _JDISP_LOGGING_BASICLOGGER_JS\r
+\r
+OOP_CLASS(BasicLogger) = function(id, max, f)\r
+{\r
+ this.lines = new Array();\r
+ if (id) {\r
+ this.setTargetId(id);\r
+ }\r
+ if (max !== null) {\r
+ this.maxLines = Number(max);\r
+ } else {\r
+ this.maxLines = 25;\r
+ }\r
+ if (f !== null) {\r
+ this.setEnabled(f);\r
+ }\r
+};\r
+\r
+OOP_FIELD(BasicLogger, maxLines) = 1024;\r
+OOP_FIELD(BasicLogger, maxLineLength) = 4096;\r
+OOP_FIELD(BasicLogger, digits) = 6;\r
+OOP_FIELD(BasicLogger, lines) = null;\r
+OOP_FIELD(BasicLogger, count) = 0;\r
+OOP_FIELD(BasicLogger, targetId) = null;\r
+OOP_FIELD(BasicLogger, targetNode) = null;\r
+OOP_FIELD(BasicLogger, nodeFetched) = false;\r
+OOP_FIELD(BasicLogger, enabled) = true;\r
+OOP_METHOD(BasicLogger, setEnabled) = function (f)\r
+{\r
+ f = Boolean(f);\r
+ this.enabled = f;\r
+};\r
+\r
+OOP_METHOD(BasicLogger, setMaxLines) = function (n)\r
+{\r
+ if (IS_NUMBER(n) && 0 <= n) {\r
+ this.maxLines = n;\r
+ }\r
+};\r
+\r
+OOP_METHOD(BasicLogger, setTargetId) = function (id)\r
+{\r
+ this.targetId = id;\r
+ this.nodeFetched = false;\r
+ this.update();\r
+};\r
+\r
+OOP_METHOD(BasicLogger, append) = function (msg0)\r
+{\r
+ if (!this.enabled) return;\r
+ var msg = String(msg0);\r
+ msg = msg.slice(0, this.maxLineLength);\r
+ this.count++;\r
+ var s = "[" + PROJECT_PREFIX.global.zeroPrefix(this.count, this.digits) + "] " +\r
+ PROJECT_PREFIX.global.escapeHtml(msg) ;\r
+ var lines = this.lines;\r
+ var max = this.maxLines;\r
+ lines.push(s);\r
+ while (lines.length > max) {\r
+ lines.shift();\r
+ }\r
+ this.update();\r
+};\r
+\r
+OOP_METHOD(BasicLogger, update) = function ()\r
+{\r
+ if (!this.enabled) return;\r
+ if (!this.nodeFetched) {\r
+ this.nodeFetched = true;\r
+ var n = PROJECT_PREFIX.domUtils.getNode(this.targetId);\r
+ this.targetNode = n;\r
+ }\r
+ var html = this.lines.join("<br />\r\n");\r
+ PROJECT_PREFIX.domUtils.setHtml(this.targetNode, html);\r
+};\r
+\r
+#endif /* _JDISP_LOGGING_BASICLOGGER_JS */\r
--- /dev/null
+#ifndef _JDISP_LOGGING_COUNTER_JS\r
+#define _JDISP_LOGGING_COUNTER_JS\r
+\r
+OOP_CLASS(Counter) = function()\r
+{\r
+ this.data = new Object();\r
+};\r
+\r
+OOP_FIELD(Counter, data) = new Object();\r
+\r
+OOP_METHOD(Counter, begin) = function (key)\r
+{\r
+ var rec = this.take(key);\r
+ rec.begin++;\r
+};\r
+\r
+OOP_METHOD(Counter, end) = function (key)\r
+{\r
+ var rec = this.take(key);\r
+ rec.end++;\r
+ this.tick(key);\r
+};\r
+\r
+OOP_METHOD(Counter, tick) = function (key)\r
+{\r
+ var rec = this.take(key);\r
+ rec.count++;\r
+};\r
+\r
+OOP_METHOD(Counter, add) = function (key, value)\r
+{\r
+ var rec = this.take(key);\r
+ rec.sum += value;\r
+ if (!rec.hasValue) {\r
+ rec.max = value;\r
+ rec.min = value;\r
+ } else {\r
+ rec.max = Math.max(rec.max, value);\r
+ rec.min = Math.min(rec.min, value);\r
+ }\r
+ rec.hasValue = true;\r
+ this.tick(key);\r
+};\r
+\r
+\r
+\r
+OOP_METHOD(Counter, take) = function (key)\r
+{\r
+ var rec = null;\r
+ if (key in this.data) {\r
+ rec = this.data[key];\r
+ } else {\r
+ rec = new Object();\r
+ rec.begin = 0;\r
+ rec.end = 0;\r
+ rec.count = 0;\r
+ rec.sum = 0;\r
+ rec.hasValue = false;\r
+ rec.max = 0;\r
+ rec.min = 0;\r
+ this.data[key] = rec;\r
+ }\r
+\r
+ return rec;\r
+};\r
+\r
+OOP_METHOD(Counter, toString) = function ()\r
+{\r
+ var lp = new PROJECT_PREFIX.text.ListPrinter('', ',', '');\r
+ for (var key in this.data) {\r
+ var rec = this.data[key];\r
+ var statistics = '';\r
+ if (rec.count > 0 && rec.hasValue) {\r
+ var avg = rec.sum * 1.0 / rec.count;\r
+ statistics = ',min=' + rec.min +\r
+ ',avg=' + avg.toFixed(3) +\r
+ ',max=' + rec.max ;\r
+ }\r
+ lp.append ( key + '=(' +\r
+ rec.count + ',' +\r
+ rec.begin + ',' + rec.end + statistics + ')');\r
+ }\r
+ return lp.toString();\r
+};\r
+\r
+#endif /* _JDISP_LOGGING_COUNTER_JS */\r
--- /dev/null
+#ifndef _JDISP_LOGGING_PACKAGE_JSH\r
+#define _JDISP_LOGGING_PACKAGE_JSH\r
+\r
+#define OOP_NAMESPACE PROJECT_PREFIX.logging\r
+OOP_DECLARE_NAMESPACE2(PROJECT_PREFIX, logging)\r
+\r
+#include "BasicLogger.jsh"\r
+#include "Counter.jsh"\r
+\r
+PROJECT_PREFIX.logging.stdout = new OOP_CLASS(BasicLogger)();\r
+PROJECT_PREFIX.logging.counter = new OOP_CLASS(Counter)();\r
+\r
+#undef OOP_NAMESPACE\r
+\r
+#endif /* _JDISP_LOGGING_PACKAGE_JSH */\r
+\r