1
8
9 import com.sekati.log.OutPanel;
10 import com.sekati.log.Inspector;
11 import com.sekati.events.Dispatcher;
12 import com.sekati.events.Event;
13 import com.sekati.time.StopWatch;
14
34 class com.sekati.log.Out {
35 private static var _instance:Out;
36 private static var _levels:Object = {TRACE:true, INFO:true, STATUS:true, WARN:true, ERROR:true, FATAL:true, OBJECT:true};
37 private static var _filters:Array = new Array( );
38 private static var _proxyObj:Object = new Object( );
39 private static var _isEnabled:Boolean = true;
40 private static var _isPanel:Boolean = false;
41 private static var _benchwatch:StopWatch = new StopWatch( false );
42
43 public var trace:Function;
44 public var info:Function;
45 public var status:Function;
46 public var warn:Function;
47 public var error:Function;
48 public var fatal:Function;
49
52 private function Out() {
53 }
54
58 public static function getInstance():Out {
59 if (!_instance) _instance = new Out( );
60 return _instance;
61 }
62
65 public static function get $():Out {
66 return Out.getInstance( );
67 }
68
74 public function createPanel(w:Number, h:Number):Void {
75 _isPanel = true;
76 OutPanel.getInstance( w, h );
77 }
78
79
83 public function set enabled(b:Boolean):Void {
84 _isEnabled = b;
85 }
86
90 public function get enabled():Boolean {
91 return _isEnabled;
92 }
93
97 public function get _status():String {
98 return getLevels( ) + "\n" + getFilters( );
99 }
100
104 public function reset():Void {
105 setAllLevels( true );
106 resetFilters( );
107 }
108
109
115 public function setLevel(level:String, isEnabled:Boolean):Void {
116 _levels[level.toUpperCase( )] = isEnabled;
117 }
118
123 public function setAllLevels(isEnabled:Boolean):Void {
124 for (var i in _levels) {
125 setLevel( _levels[i], isEnabled );
126 }
127 }
128
132 public function getLevels():String {
133 var a:Array = new Array( );
134 for (var i in _levels) {
135 a.push( i + ":" + _levels[i].toString( ) );
136 }
137 return "_levels={" + a.toString( ) + "};";
138 }
139
140
146 public function setFilter(origin:Object, isFiltered:Boolean):Void {
147 if(isFiltered) {
148 filter( origin );
149 } else {
150 unfilter( origin );
151 }
152 }
153
157 public function getFilters():String {
158 return "_filters=[" + _filters.toString( ) + "];";
159 }
160
163 public function resetFilters():Void {
164 _filters = [];
165 }
166 private function filter(origin:Object):Void {
167 var o:String = String( origin );
168 if (!isFiltered( o )) {
169 _filters.push( o );
170 }
171 }
172 private function unfilter(origin:Object):Void {
173 var o:String = String( origin );
174 for (var i:Number = 0; i < _filters.length ; i++) {
175 if (_filters[i] == o) {
176 _filters.splice( i, 1 );
177 break;
178 }
179 }
180 }
181 public function isFiltered(origin:Object):Boolean {
182 var o:String = String( origin );
183 for (var i:Number = 0; i < _filters.length ; i++) {
184 if (_filters[i] == o) {
185 return true;
186 }
187 }
188 return false;
189 }
190
191 private function resolveOrigin($origin:Object):Void {
192 var o:Object = (typeof ($origin) == "string") ? $origin : $origin._classname;
193 if (!o) {
194 o = $origin;
195 }
196 trace( o );
197 }
198
199 private function _output(level:String, origin:Object, msg:Object):Void {
200 if (!_isEnabled || !_levels[level] || isFiltered( origin )) {
201 return;
202 }
203 var o:String = level + ":[" + String( origin ) + "]: " + msg;
204 if(!_isPanel) {
205 trace( o );
206 } else {
207 var e:Event = new Event( "OUT_EVENT", this, {message:o, level:level} );
208 Dispatcher.$.dispatchEvent( e );
209 }
210 }
211
212 private function __resolve(name:String):Function {
213 if (name.indexOf( "OUT_EVENT" ) > 1) {
214 return;
215 }
216 var f:Function = function ():Object {
217 arguments.unshift( name );
218 return __proxy.apply( _proxyObj, arguments );
219 };
220 _proxyObj[name] = f;
221 return f;
222 }
223 private function __proxy(name:String):Void {
224 arguments.shift( );
225 var n:String = String( name ).toUpperCase( );
226 var o:String = String( arguments[0] );
227 var s:String = String( arguments[1] );
228 _instance._output( n, o, s );
229 }
230
236 public function object(origin:Object, obj:Object):Void {
237 var insp:Inspector = new Inspector( obj, origin );
238 _output( "OBJECT", origin, insp );
239 }
240
248 public function benchmark(origin:Object, msg:String, mode:String):Void {
249
250
256 var b:Number;
257 switch (mode.toLowerCase( )) {
258 case "start" :
259 b = _benchwatch.start( );
260 break;
261 case "stop" :
262 b = _benchwatch.stop( );
263 break;
264 case "lap" :
265 b = _benchwatch.lap( );
266 break;
267 default :
268 throw new Error( "@@@ com.sekati.log.Out Error: bench() expects mode param: 'start', 'stop' or 'lap'." );
269 return;
270
271 }
272
273 var bs:String = String( _benchwatch.read( ) );
274 var str:String = String( msg + " | benchmark (" + mode + "): " + bs + "ms" );
275
276 _output( "BENCHMARK", origin, str );
277 }
278 }