OSDN Git Service

Added: logging package
authorNagao Takeyuki <nagaotakeyuki@gmail.com>
Sun, 13 Sep 2009 06:28:02 +0000 (15:28 +0900)
committerNagao Takeyuki <nagaotakeyuki@gmail.com>
Sun, 13 Sep 2009 06:28:02 +0000 (15:28 +0900)
Signed-off-by: Nagao Takeyuki <nagaotakeyuki@gmail.com>
src/js/bundle/jdisp.jsh
src/js/include/jdisp/logging/BasicLogger.jsh [new file with mode: 0644]
src/js/include/jdisp/logging/Counter.jsh [new file with mode: 0644]
src/js/include/jdisp/logging/package.jsh [new file with mode: 0644]

index 780f594..ee7d0e2 100644 (file)
@@ -7,5 +7,6 @@
 #include <jdisp/package.jsh>
 #include <jdisp/text/package.jsh>
 #include <jdisp/util/package.jsh>
+#include <jdisp/logging/package.jsh>
 
 #endif /* _JDISP_H */
diff --git a/src/js/include/jdisp/logging/BasicLogger.jsh b/src/js/include/jdisp/logging/BasicLogger.jsh
new file mode 100644 (file)
index 0000000..f9133ab
--- /dev/null
@@ -0,0 +1,78 @@
+#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
diff --git a/src/js/include/jdisp/logging/Counter.jsh b/src/js/include/jdisp/logging/Counter.jsh
new file mode 100644 (file)
index 0000000..596ca70
--- /dev/null
@@ -0,0 +1,86 @@
+#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
diff --git a/src/js/include/jdisp/logging/package.jsh b/src/js/include/jdisp/logging/package.jsh
new file mode 100644 (file)
index 0000000..7550d65
--- /dev/null
@@ -0,0 +1,16 @@
+#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