All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.geomajas.gwt2.client.widget.exception.ExceptionCallbackImpl Maven / Gradle / Ivy

There is a newer version: 2.4.3
Show newest version
/*
 * This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
 *
 * Copyright 2008-2014 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();
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy