00001 import gugga.debug.Debugger;
00002 import gugga.logging.Logger;
00003 import gugga.logging.publishers.SOSPublisher;
00004 import gugga.utils.ReflectUtil;
00005 import gugga.utils.SOSTraceUtil;
00006
00007 class gugga.utils.DebugUtils
00008 {
00009 private static var mSOSTraceSocket : XMLSocket = new XMLSocket();
00010 private static var mSOSCommandSocket : XMLSocket = new XMLSocket();
00011 private static var mSocketsInitialized : Boolean = false;
00012
00013 public static function setDebugMarker(aObject : Object, aMarker : String)
00014 {
00015 aObject["___debug_marker"] = aMarker;
00016 _global.ASSetPropFlags(aObject, "___debug_marker", 1, true);;
00017 }
00018
00019 public static function getDebugMarker(aObject : Object)
00020 {
00021 return aObject["___debug_marker"];
00022 }
00023
00024 public static function getCallContextString(aContextObject, aCallArguments) : String
00025 {
00026 var argumentsArray : Array = aCallArguments;
00027 var argumentsString : String = arrayToString(argumentsArray);
00028
00029 var contextMethod : Function = aCallArguments.callee;
00030 var typeAndMethodInfo : Array;
00031
00032 if(typeof(aContextObject) == "function")
00033 {
00034 typeAndMethodInfo = ReflectUtil.getTypeAndMethodInfoByType(aContextObject, contextMethod);
00035 }
00036 else
00037 {
00038 typeAndMethodInfo = ReflectUtil.getTypeAndMethodInfoByInstance(aContextObject, contextMethod);
00039 }
00040
00041 var contextString : String;
00042 contextString = typeAndMethodInfo[1] + "." + typeAndMethodInfo[2] + "(" + argumentsString + ")";
00043
00044 return contextString;
00045 }
00046
00047 private static function arrayToString(aArray : Array) : String
00048 {
00049 var result : String = "";
00050
00051 for(var i : Number = 0; i < aArray.length; i++)
00052 {
00053 if(result != "")
00054 {
00055 result += ", ";
00056 }
00057
00058 result += objectToString(aArray[i]);
00059 }
00060
00061 return result;
00062 }
00063
00064
00065 public static function objectToString(aObject) : String
00066 {
00067 var result : String = "";
00068
00069 if(aObject instanceof Array)
00070 {
00071 var objectAsArray : Array = aObject;
00072 result = "[" + arrayToString(objectAsArray) + "]";
00073 }
00074 else
00075 {
00076 switch(typeof(aObject))
00077 {
00078 case "string":
00079 result = "\"" + aObject + "\"";
00080 break;
00081
00082 case "function":
00083 if(aObject[ReflectUtil.METHOD_NAME_KEY])
00084 {
00085 result = "[Function: " + aObject[ReflectUtil.METHOD_NAME_KEY] + "]";
00086 }
00087 else
00088 {
00089 result = "[Function]";
00090 }
00091 break;
00092
00093 case "object":
00094 result = aObject.toString();
00095
00096 if(result == "[object Object]")
00097 {
00098 result = ReflectUtil.getTypeNameForInstance(aObject);
00099 }
00100
00101 if(!result)
00102 {
00103 result = "[Object]";
00104 }
00105 break;
00106
00107 case "movieclip":
00108 result = aObject;
00109 break;
00110
00111
00112 default:
00113 result = aObject.toString();
00114 }
00115 }
00116
00117 return result;
00118 }
00119
00120 public static function trace(aTracedObject)
00121 {
00122 if(aTracedObject instanceof Object)
00123 {
00124 dump(aTracedObject);
00125 }
00126 else
00127 {
00128 SOSTraceUtil.trace(aTracedObject);
00129 }
00130 }
00131
00132 public static function traceContext(aTracedObject, contextObject:Object, contextArguments:Object)
00133 {
00134 if(aTracedObject instanceof Object)
00135 {
00136 dump(aTracedObject, null, null, contextObject, contextArguments);
00137 }
00138 else
00139 {
00140 var contextString : String = getCallContextString(contextObject, contextArguments);
00141 var logger : Logger = Logger.getLoggerFor(contextObject);
00142
00143 logger.info(aTracedObject.toString() + " [" + contextString + "]");
00144 }
00145 }
00146
00147 public static function dump(o:Object, marker:String, recurseDepth:Number) : Void
00148 {
00149 var title : String = getDumpTitle(o, marker);
00150 var dumpString : String = getDumpString(o, recurseDepth, 0);
00151
00152 SOSTraceUtil.traceFoldedMessage(title, dumpString);
00153 }
00154
00155 public static function dumpContext(o:Object, marker:String, recurseDepth:Number, contextObject:Object, contextArguments:Object) : Void
00156 {
00157 var title : String = getDumpTitle(o, marker);
00158 var dumpString : String = getDumpString(o, recurseDepth, 0);
00159 var contextString : String = getCallContextString(contextObject, contextArguments);
00160
00161 title += " [" + contextString + "]";
00162
00163 var logger : Logger = Logger.getLoggerFor(contextObject);
00164 var dumpStringPackage : String = SOSPublisher.getFoldedMessagePackage(title, dumpString);
00165
00166 logger.info(dumpStringPackage);
00167 }
00168
00169 public static function getDumpTitle(aObject:Object, aMarker:String) : String
00170 {
00171 var title : String;
00172
00173 var objectAsString : String = objectToString(aObject);
00174
00175 if(aMarker)
00176 {
00177 setDebugMarker(aObject, aMarker);
00178 title = aMarker + " <" + objectAsString + ">";
00179 }
00180 else
00181 {
00182 title = objectAsString;
00183 }
00184
00185 return title;
00186 }
00187
00188 public static function getDumpString(aObject:Object, aRecurseDepth:Number, indent:Number) : String
00189 {
00190 if(aRecurseDepth == undefined)
00191 {
00192 aRecurseDepth = 0;
00193 }
00194
00195 if(indent == undefined)
00196 {
00197 indent = 0;
00198 }
00199
00200 var dumpResult : String = "";
00201
00202 var lead:String = "";
00203 for(var i=0;i<indent;i++)
00204 {
00205 lead += ". ";
00206 }
00207
00208 for (var prop:String in aObject)
00209 {
00210 var obj:String;
00211 if(aObject[prop] instanceof Array)
00212 {
00213 obj = "[Array]";
00214 }
00215 else
00216 {
00217 obj = objectToString(aObject[prop]);
00218 }
00219
00220 dumpResult += lead + prop + ": " + obj + "\n";
00221
00222 if(aRecurseDepth > 0)
00223 {
00224 var typeofObjectProperty : String = typeof(aObject[prop]);
00225 if(typeofObjectProperty == "object" || typeofObjectProperty == "movieclip" || typeofObjectProperty == "function")
00226 {
00227 dumpResult += getDumpString(aObject[prop], aRecurseDepth - 1, indent+1);
00228 }
00229 }
00230 }
00231
00232 return dumpResult;
00233 }
00234 }