package dbmigrate.gui;
import java.sql.Connection;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import dbmigrate.app.Application;
import dbmigrate.exceptions.ConnectException;
import dbmigrate.exceptions.HistoryException;
import dbmigrate.executor.ExecutorEngine;
import dbmigrate.logging.HistoryStorage;
import dbmigrate.logging.LoggerFactory;
import dbmigrate.model.db.DbConnector;
import dbmigrate.model.operation.MigrationConfiguration;
public class MigrationRunner extends Thread {
private boolean forwards;
private DbConnector dbConnector;
private final MigrationConfiguration migrationConfiguration;
private String completeMsg;
private IMigrationListener listener;
private HistoryStorage historyStorage;
public MigrationRunner(boolean forwards, DbConnector dbConnector,
MigrationConfiguration migrationConfiguration, String completeMsg,
HistoryStorage storage, IMigrationListener listener) {
this.forwards = forwards;
this.dbConnector = dbConnector;
this.migrationConfiguration = migrationConfiguration;
this.completeMsg = completeMsg;
this.historyStorage = storage;
this.listener = listener;
}
@Override
public void run() {
synchronized (this.migrationConfiguration) {
try {
ExecutorEngine executorEngine = new ExecutorEngine(
this.dbConnector.getConnection(),
this.migrationConfiguration, true);
Application.configureExecutorEngine(executorEngine,
this.dbConnector.getDbType());
executorEngine.setForwards(this.forwards);
executorEngine.setLogger(LoggerFactory.getLogger());
executorEngine.setHistoryStorage(this.historyStorage);
try {
Connection conn = this.dbConnector.getConnection();
this.historyStorage.setConnection(conn);
executorEngine.executeMigration();
this.listener.refreshHistoryModel();
this.listener.setStatusMessage(this.completeMsg);
} catch (HistoryException exception) {
this.listener
.setStatusMessage("A problem occured while registering the migration in the history.");
} catch (SQLException exception) {
this.listener
.setStatusMessage("Migration not registered in the database.");
JOptionPane.showMessageDialog(null,
"A database problem occured while registering the migration in the history: "
+ exception.getMessage(),
"Dbmigrate error", JOptionPane.ERROR_MESSAGE);
}
} catch (ConnectException exception) {
this.listener.handleConnectionProblem(exception);
} finally {
this.listener.unlockButtons();
}
}
}
}