1 //jls.loader.provide('jls.lang.Logger');
  2 
  3 /**
  4  * @class Default logger implementation.
  5  * A Logger object is used to log messages for a specific system or application component.
  6  */
  7 jls.lang.Logger = jls.lang.Class.create(/** @lends jls.lang.Logger.prototype */
  8 {
  9     initialize : function(level) {
 10         this._level = level || jls.lang.Logger.INFO;
 11     },
 12     getLogLevel : function() {
 13         return this._level;
 14     },
 15     setLogLevel : function(level) {
 16         if (typeof level == 'number') {
 17             this._level = level;
 18         } else if (typeof level == 'string') {
 19             level = level.toUpperCase();
 20             if (level in jls.lang.Logger) {
 21                 this._level = jls.lang.Logger[level];
 22             }
 23         }
 24     },
 25     isTraceEnabled : function() {
 26         return this.isEnabledFor(jls.lang.Logger.TRACE);
 27     },
 28     isDebugEnabled : function() {
 29         return this.isEnabledFor(jls.lang.Logger.DEBUG);
 30     },
 31     isEnabledFor : function(level) {
 32         return this._level <= level;
 33     },
 34     trace : function(msg) {
 35         this.log(jls.lang.Logger.TRACE, msg);
 36     },
 37     debug : function(msg) {
 38         this.log(jls.lang.Logger.DEBUG, msg);
 39     },
 40     info : function(msg) {
 41         this.log(jls.lang.Logger.INFO, msg);
 42     },
 43     warn : function(msg) {
 44         this.log(jls.lang.Logger.WARN, msg);
 45     },
 46     error : function(msg) {
 47         this.log(jls.lang.Logger.ERROR, msg);
 48     },
 49     logObject : function(level, msg, o) {
 50         if (this._level > level) {
 51             return;
 52         }
 53         this.log(level, msg + ': ' + o);
 54         for (var k in o) {
 55             if (typeof (o[k]) == 'function') {
 56                 this.log(level, ' ' + k + '()');
 57             } else {
 58                 this.log(level, ' ' + k + ': ' + o[k]);
 59             }
 60         }
 61     },
 62     logBuffer : function(level, buffer, message) {
 63         if (this._level > level) {
 64             return;
 65         }
 66         if (message) {
 67             this.log(level, message);
 68         }
 69         var buffer = buffer.slice();
 70         var w = 16;
 71         var hex = '0123456789abcdef';
 72         for (var l = 0; buffer.remaining() > 0; l += w) {
 73             var lineHex = '';
 74             var lineAsc = '';
 75             for (var c = 0; c < w; c++) {
 76                 if (buffer.remaining() == 0) {
 77                     lineHex += '   ';
 78                     lineAsc += ' ';
 79                     continue;
 80                 }
 81                 var b = buffer.getByte();
 82                 lineHex += hex.charAt(b >> 4) + hex.charAt(b & 0x0f) + ' ';
 83                 lineAsc += b > 31 && b < 128 ? String.fromCharCode(b) : ' ';
 84             }
 85             this.log(level, lineHex + lineAsc);
 86         }
 87     },
 88     log : function(level, msg) {
 89         if ((level < jls.lang.Logger.FINEST) || (level > jls.lang.Logger.ERROR)) {
 90             throw new jls.lang.Exception("Invalid log level " + level);
 91         }
 92         _native.core.log(level, msg);
 93     }
 94 });
 95 
 96 /*
 97  * Could be used as the following:
 98  * new jls.lang.Exception().printStackTrace(new jls.lang.Logger.PrintStream(jls.logger, jls.lang.Logger.WARN));
 99  */
100 jls.lang.Logger.PrintStream = jls.lang.Class.create({
101     initialize : function(logger, level) {
102         this._logger = logger;
103         this._level = level || jls.lang.Logger.DEBUG;
104         this._buffer = null;
105     },
106     flush : function() {
107         if (this._buffer != null) {
108             this._logger.log(this._level, this._buffer);
109             this._buffer = null;
110         }
111         return this;
112     },
113     print : function(s) {
114         if (this._buffer == null) {
115             this._buffer = s;
116         } else {
117             this._buffer += s;
118         }
119         if (s.indexOf('\n') >= 0) {
120             this.flush();
121         }
122         return s.length;
123     },
124     println : function(s) {
125         if (s) {
126             return this.print(s + jls.io.PrintStream.separator);
127         } else {
128             return this.print(jls.io.PrintStream.separator);
129         }
130     }
131 });
132 
133 Object.extend(jls.lang.Logger, /** @lends jls.lang.Logger */
134 {
135     FINEST: 1,
136     FINE:   2,
137     TRACE:  3,
138     DEBUG:  4,
139     INFO:   5,
140     WARN:   6,
141     ERROR:  7
142 });
143 
144