/*
* Smart GWT (GWT for SmartClient)
* Copyright 2014 and beyond, Isomorphic Software, Inc.
*
* Smart GWT is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License version 3
* is published by the Free Software Foundation. Smart GWT is also
* available under typical commercial license terms - see
* http://smartclient.com/license
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package com.smartgwt.client;
import com.google.gwt.regexp.shared.RegExp;
public class SmartGwtExceptionUtil {
// handle and attach GWT-generated Throwable stack
private static final String UNKNOWN = "Unknown";
private static boolean hasStackTrace(String message) {
RegExp expression = RegExp.compile("stack:\\s+");
return expression.test(message);
}
// handle dumping GWT-specific StackTraceElements
private static String stackTraceElementToString(StackTraceElement element) {
String methodName = element.getMethodName();
if (methodName == null || UNKNOWN.equals(methodName)) return null;
String frame = " at ";
String className = element.getClassName();
if (className != null && !UNKNOWN.equals(className)) frame += className + ".";
frame += methodName + "(";
String fileName = element.getFileName();
if (fileName != null && !UNKNOWN.equals(fileName)) {
frame += fileName;
int lineNumber = element.getLineNumber();
if (lineNumber >= 0) frame += ":" + lineNumber;
}
frame += ")";
return frame;
}
private static String getStackTrace(Throwable throwable) {
String trace = "";
for (StackTraceElement element : throwable.getStackTrace()) {
String frame = stackTraceElementToString(element);
if (frame != null) {
if (trace.length() > 0) trace += "\n";
trace += frame;
}
}
return trace;
}
protected static native String toString(String message, Throwable throwable) /*-{
if (!@com.smartgwt.client.SmartGwtExceptionUtil::hasStackTrace(Ljava/lang/String;)(message)) {
var stackTrace = @com.smartgwt.client.SmartGwtExceptionUtil::getStackTrace(Ljava/lang/Throwable;)(throwable);
return message + "\n" + stackTrace;
}
// Fix Chrome bug where description appears again at the end of stack
if ($wnd.isc.Browser.isChrome && $wnd.isc.Browser.version >= 35) {
message = message.replace(/\)[^)\r\n]*$/, ")");
}
return message;
}-*/;
protected static String toString(Throwable throwable) {
return toString(throwable.toString(), throwable);
}
}