00001 import gugga.debug.MethodCallInfo;
00002 import gugga.logging.Level;
00003 import gugga.logging.Logger;
00004 import gugga.utils.DebugUtils;
00005 import gugga.utils.Weaver;
00006 import gugga.logging.publishers.SOSPublisher;
00007 import gugga.utils.ReflectUtil;
00008 import gugga.events.EventDispatcher;
00012 class gugga.debug.Debugger
00013 {
00014 private var mDebuggedObject : Object;
00015 public function get DebuggedObject() : Object { return mDebuggedObject; }
00016
00017 private function Debugger(aDebuggedObject : Object)
00018 {
00019 mDebuggedObject = aDebuggedObject;
00020
00021 Weaver.weaveToAllAccessors(mDebuggedObject, traceContextFiner, traceContextFinished);
00022
00023 var methodNames : Array = ReflectUtil.getMethodNames(mDebuggedObject);
00024
00025 var methodName : String;
00026 for(var i : Number = 1; i < methodNames.length; i++)
00027 {
00028 methodName = methodNames[i];
00029 if(methodName != "addEventListener" && methodName != "dispatchEvent" && methodName != "dispatchEventLater")
00030 {
00031 if(methodName.indexOf("on") == 0 && methodName.charCodeAt(2) >= 65 && methodName.charCodeAt(2) <= 90)
00032 {
00033 Weaver.weaveToMethod(aDebuggedObject, methodName, traceEventHandler, traceContextFinished);
00034 }
00035 else
00036 {
00037 Weaver.weaveToMethod(aDebuggedObject, methodName, traceContextFine, traceContextFinished);
00038 }
00039 }
00040 }
00041
00042 if(aDebuggedObject["addEventListener"])
00043 {
00044 Weaver.weaveToMethod(aDebuggedObject, "addEventListener", traceContextFinest, traceContextFinished);
00045 }
00046 if(aDebuggedObject["dispatchEvent"])
00047 {
00048 Weaver.weaveToMethod(aDebuggedObject, "dispatchEvent", traceDispatchEvent, traceContextFinished);
00049 }
00050 if(aDebuggedObject["dispatchEventLater"])
00051 {
00052 Weaver.weaveToMethod(aDebuggedObject, "dispatchEventLater", traceDispatchEvent, traceContextFinished);
00053 }
00054 }
00055
00056 public static function create(aDebuggedObject : Object) : Debugger
00057 {
00058 return new Debugger(aDebuggedObject);
00059 }
00060
00061 private function traceEventHandler(aCallData:MethodCallInfo)
00062 {
00063 var logger : Logger = Logger.getLoggerFor(aCallData.ScopeObject);
00064 var contextString : String = DebugUtils.getCallContextString(aCallData.ScopeObject, aCallData.Arguments);
00065 var eventInfo : String = DebugUtils.getDumpString(aCallData.Arguments[0]);
00066
00067 var logString:String = SOSPublisher.getFoldedMessagePackage(contextString, eventInfo);
00068
00069 logger.log(Level.FINER, logString);
00070 }
00071
00072 private function traceDispatchEvent(aCallData:MethodCallInfo)
00073 {
00074 var logger : Logger = Logger.getLoggerFor(aCallData.ScopeObject);
00075 var contextString : String = DebugUtils.getCallContextString(aCallData.ScopeObject, aCallData.Arguments);
00076 var eventInfo : String = DebugUtils.getDumpString(aCallData.Arguments[0]);
00077
00078 var logString:String = SOSPublisher.getFoldedMessagePackage(contextString, eventInfo);
00079
00080 logger.log(Level.FINER, logString);
00081 }
00082
00083 private function traceContextFinished(aCallData:MethodCallInfo, aMethodResult)
00084 {
00085 var logger : Logger = Logger.getLoggerFor(aCallData.ScopeObject);
00086 var logText : String = DebugUtils.getCallContextString(aCallData.ScopeObject, aCallData.Arguments);
00087
00088 var methodResultString : String = DebugUtils.objectToString(aMethodResult);
00089 logText = logText + " finished! Returned: " + methodResultString;
00090
00091 var typeofMethodResult : String = typeof(aMethodResult);
00092 if(typeofMethodResult == "object" || typeofMethodResult == "movieclip" || typeofMethodResult == "function")
00093 {
00094 var methodResultDump : String = DebugUtils.getDumpString(aMethodResult, 0);
00095 var logTextBody : String = "Returned result dump:\n" + methodResultDump;
00096
00097 logText = SOSPublisher.getFoldedMessagePackage(logText, logTextBody);
00098 }
00099
00100 logger.log(Level.FINEST, logText);
00101 }
00102
00103 private static function traceContext(aCallData:MethodCallInfo, aLogLevel:Level)
00104 {
00105 var logger : Logger = Logger.getLoggerFor(aCallData.ScopeObject);
00106 var contextString : String = DebugUtils.getCallContextString(aCallData.ScopeObject, aCallData.Arguments);
00107
00108 if(aCallData.Arguments.length > 0)
00109 {
00110 var argumentsDump : String = DebugUtils.getDumpString(aCallData.Arguments, 1);
00111 var logTextBody : String = "Arguments dump:\n" + argumentsDump;
00112
00113 contextString = SOSPublisher.getFoldedMessagePackage(contextString, logTextBody);
00114 }
00115
00116 logger.log(aLogLevel, contextString);
00117 }
00118
00119 private function traceContextFine(aCallData:MethodCallInfo)
00120 {
00121 Debugger.traceContext(aCallData, Level.FINE);
00122 }
00123
00124 private function traceContextFiner(aCallData:MethodCallInfo)
00125 {
00126 Debugger.traceContext(aCallData, Level.FINER);
00127 }
00128
00129 private function traceContextFinest(aCallData:MethodCallInfo)
00130 {
00131 Debugger.traceContext(aCallData, Level.FINEST);
00132 }
00133 }