/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.gwt2.client.widget.exception;
import org.geomajas.command.CommandResponse;
import org.geomajas.global.ExceptionDto;
import org.geomajas.gwt.client.command.CommandExceptionCallback;
import org.geomajas.gwt.client.command.CommunicationExceptionCallback;
import org.geomajas.gwt.client.util.Log;
import org.geomajas.gwt2.client.i18n.GlobalMessages;
import com.google.gwt.core.client.GWT;
/**
* Callback implementation that writes all exceptions to {@link Log}. It will also show a dialog window.
*
* @author Emiel Ackermann / Jan Venstermans
*/
public class ExceptionCallbackImpl implements CommandExceptionCallback, CommunicationExceptionCallback {
private GlobalMessages messages = GWT.create(GlobalMessages.class);
@Override
public void onCommandException(CommandResponse response) {
String msg = null;
String stack = null;
boolean first = true;
for (ExceptionDto error : response.getExceptions()) {
if (first) {
msg = messages.commandError() + ":\n" + error.getMessage();
first = false;
}
stack = getDetails(error);
}
showDialog(msg, stack);
}
@Override
public void onCommunicationException(Throwable error) {
if (null != error) {
String msg = messages.commandCommunicationError() + ":\n" + error.getMessage();
Log.logWarn(msg, error);
String stack = getDetails(error);
showDialog(msg, stack);
}
}
/**
* Build details message for an exception.
*
* @param error
* error to build message for
* @return string with details message
*/
private String getDetails(ExceptionDto error) {
if (null == error) {
return "";
}
StringBuilder content = new StringBuilder();
content.append(error.getClassName());
if (error.getExceptionCode() != 0) {
content.append(" (");
content.append(error.getExceptionCode());
content.append(")");
}
processStackTrace(error.getStackTrace(), content);
content.append(getDetails(error.getCause()));
return content.toString();
}
/**
* Build details message for an exception.
*
* @param error
* error to build message for
* @return string with details message
*/
private String getDetails(Throwable error) {
if (null == error) {
return "";
}
StringBuilder content = new StringBuilder();
content.append(error.getMessage());
processStackTrace(error.getStackTrace(), content);
content.append(getDetails(error.getCause()));
return content.toString();
}
private void processStackTrace(StackTraceElement[] stackTrace, StringBuilder content) {
for (StackTraceElement el : stackTrace) {
content.append(" ");
content.append(el.toString());
content.append("\n");
}
}
/**
* Makes a dialog box to show exception message and stack trace.
*
* @param msg
* error message
* @param stack
* stack trace
*/
private void showDialog(String msg, String stack) {
ExceptionDialog warning = new ExceptionDialog(msg, stack);
warning.show();
}
}