/*
* Copyright (c) 2000-2009 by Rodney Kinney, Brent Easton
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.build;
import VASSAL.configure.ConfigureTree;
import VASSAL.counters.Decorator;
import VASSAL.counters.EditablePiece;
/**
* General-purpose condition indicating that VASSAL has encountered data that's inconsistent with the current module.
* A typical example would be failing to find a map/board/image/prototype from the supplied name. Covers a variety of
* situations where the most likely cause is a module version compatibility issue.
*
* This is for recoverable errors that occur during game play, as opposed to {@link IllegalBuildException},
* which covers errors when building a module
* @see ErrorDialog.dataError()
* @author rodneykinney
*
*/
public class BadDataReport {
private String message;
private String data;
private Throwable cause;
public BadDataReport() {
}
/**
* Basic Bad Data Report
*
* @param message Message to display
* @param data Data causing error
* @param cause Throwable that generated error
*/
public BadDataReport(String message, String data, Throwable cause) {
this(null, null, message, data, cause);
}
public BadDataReport(String message, String data) {
this(message, data, null);
}
/**
* Expanded Bad Data Report called by Traits.
* Display additional information to aid debugging
*
* NB. Note use of piece.getLocalizedName() rather than
* Decorator.getOuterMost().getLocalizedName() which can result in infinite
* BadData reporting loops.
* @param piece Trait that generated the error
* @param message Resource message key to display
* @param data Data causing error
* @param cause Throwable that generated error
*/
public BadDataReport(EditablePiece piece, String message, String data, Throwable cause) {
this(getPieceName(piece), piece.getDescription(), message, data, cause);
}
public BadDataReport(EditablePiece piece, String message, String data) {
this(getPieceName(piece), piece.getDescription(), message, data, null);
}
public BadDataReport(EditablePiece piece, String message) {
this(getPieceName(piece), piece.getDescription(), message, "", null);
}
public BadDataReport(String pieceName, String traitDesc, String message, String data, Throwable cause) {
String m = ((pieceName != null && pieceName.length() > 0) ? pieceName+" " : "");
m += ((traitDesc != null && traitDesc.length() > 0) ? "["+traitDesc+"] " : "");
m += m.length() > 0 ? "- " : "";
m += message;
this.message = m;
this.cause = cause;
this.data = data;
}
/**
* Return the name of the piece. For Decorators, return the name of the inner piece as
* the Bad Data Report may have been generated by the call to get the name of the Decorator
* in the first place.
*
* @param piece
* @return
*/
protected static String getPieceName(EditablePiece piece) {
if (piece instanceof Decorator) {
return ((Decorator) piece).getInner().getLocalizedName();
}
else {
return piece.getLocalizedName();
}
}
/**
* Expanded Bad Data Report for AbstractConfigurables.
* Display the name and type of the Configurable
*
* @param c AbstractConfigurable that generated the error
* @param message Resource message key to display
* @param data Data causing error
* @param cause Throwable that generated error
*/
public BadDataReport(AbstractConfigurable c, String message, String data, Throwable cause) {
this.message = c.getConfigureName() + "[" + ConfigureTree.getConfigureName(c.getClass())+"]: "+message;
this.cause = cause;
this.data = data;
}
public BadDataReport(AbstractConfigurable c, String messageKey, String data) {
this(c, messageKey, data, null);
}
public String getMessage() {
return message;
}
public Throwable getCause() {
return cause;
}
public String getData() {
return data;
}
}