class MigrationFailedException extends LiquibaseException {

    private static final long serialVersionUID = 1L;
    private final String failedChangeSetName;
    
    public MigrationFailedException() {
        failedChangeSetName = "(unknown)";
    }

    public MigrationFailedException(ChangeSet failedChangeSet, String message) {
        super(message);
        this.failedChangeSetName = failedChangeSet.toString(false);
    }


    public MigrationFailedException(ChangeSet failedChangeSet, String message, Throwable cause) {
        super(message, cause);
        this.failedChangeSetName = failedChangeSet.toString(false);
    }

    public MigrationFailedException(ChangeSet failedChangeSet, Throwable cause) {
        super(cause);
        this.failedChangeSetName = failedChangeSet.toString(false);
    }

    @Override
    public String getMessage() {<FILL_FUNCTION_BODY>}
}

        String message = "Migration failed";
        if (failedChangeSetName != null) {
            message += " for changeset "+ failedChangeSetName;
        }
        message += ":\n     Reason: "+super.getMessage();

        return message;
    
<methods>public void <init>() ,public void <init>(java.lang.String) ,public void <init>(java.lang.String, java.util.logging.Level) ,public void <init>(java.lang.String, java.lang.Throwable) ,public void <init>(java.lang.Throwable) ,public java.lang.String getDetails() ,public java.util.logging.Level getLogLevel() ,public java.lang.String getTimestamp() ,public void setDetails(java.lang.String) ,public void setTimestamp(java.lang.String) <variables>private java.lang.String details,private java.util.logging.Level logLevel,private static final long serialVersionUID,private java.lang.String timestamp