From 79fda8405055115823a515d4e9e4c7e40b8c5d82 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\gregd" Date: Thu, 13 Feb 2020 17:37:55 -0500 Subject: [PATCH] refactoring in EamDbSettingsDialog --- .../datamodel/CentralRepoDbUtil.java | 6 +- .../optionspanel/CentralRepoDbManager.java | 351 ++++++++++++++++++ .../optionspanel/EamDbSettingsDialog.form | 4 +- .../optionspanel/EamDbSettingsDialog.java | 281 ++------------ 4 files changed, 399 insertions(+), 243 deletions(-) create mode 100755 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoDbManager.java diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDbUtil.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDbUtil.java index 4ba8ac579e..4cf0d8af67 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDbUtil.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDbUtil.java @@ -31,6 +31,7 @@ import org.sleuthkit.autopsy.coordinationservice.CoordinationService.Coordinatio import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ModuleSettings; import static org.sleuthkit.autopsy.centralrepository.datamodel.RdbmsCentralRepo.SOFTWARE_CR_DB_SCHEMA_VERSION; +import org.sleuthkit.autopsy.centralrepository.optionspanel.EamDbSettingsDialog; /** * @@ -177,8 +178,11 @@ public class CentralRepoDbUtil { "EamDbUtil.exclusiveLockAquisitionFailure.message=Unable to acquire exclusive lock for Central Repository."}) public static void upgradeDatabase() throws CentralRepoException { if (!CentralRepository.isEnabled()) { - return; + EamDbSettingsDialog dialog = new EamDbSettingsDialog(); + dialog. + promptUserForSetup(); } + CentralRepository db = null; CoordinationService.Lock lock = null; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoDbManager.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoDbManager.java new file mode 100755 index 0000000000..bd1d52b1f0 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoDbManager.java @@ -0,0 +1,351 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.sleuthkit.autopsy.centralrepository.optionspanel; + +import java.awt.Cursor; +import java.io.File; +import java.util.logging.Level; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; +import org.openide.util.NbBundle; +import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException; +import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoPlatforms; +import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository; +import org.sleuthkit.autopsy.centralrepository.datamodel.PostgresCentralRepoSettings; +import org.sleuthkit.autopsy.centralrepository.datamodel.SqliteCentralRepoSettings; +import org.sleuthkit.autopsy.centralrepository.optionspanel.DatabaseTestResult; +import org.sleuthkit.autopsy.coreutils.Logger; + + +public class CentralRepoDbManager { + private static final String CENTRAL_REPO_DB_NAME = "central_repository"; + private static final String CENTRAL_REPO_SQLITE_EXT = ".db"; + + private static final Logger logger = Logger.getLogger(CentralRepoDbManager.class.getName()); + + private DatabaseTestResult testingStatus; + private CentralRepoPlatforms selectedPlatform; + + private PostgresCentralRepoSettings dbSettingsPostgres; + private SqliteCentralRepoSettings dbSettingsSqlite; + + private boolean configurationChanged = false; + + + public CentralRepoDbManager() { + dbSettingsPostgres = new PostgresCentralRepoSettings(); + dbSettingsSqlite = new SqliteCentralRepoSettings(); + selectedPlatform = CentralRepoPlatforms.getSelectedPlatform(); + if (selectedPlatform == null || selectedPlatform.equals(CentralRepoPlatforms.DISABLED)) { + selectedPlatform = CentralRepoPlatforms.POSTGRESQL; + } + } + + /** + * prompts user based on testing status (i.e. failure to connect, invalid schema, db does not exist, etc.) + * @param warnDoesNotExist whether or not to prompt the user should the database not exist (otherwise silently create the db) + * @return whether or not the ultimate status after prompts is okay to continue + */ + @NbBundle.Messages({"EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error Loading Database", + "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path (if applicable).", + "EamDbSettingsDialog.okButton.createDbDialog.title=Database Does Not Exist", + "EamDbSettingsDialog.okButton.createDbDialog.message=Database does not exist, would you like to create it?", + "EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Database Connection Failed", + "EamDbSettingsDialog.okButton.databaseConnectionFailed.message=Unable to connect to database please check your settings and try again."}) + private boolean promptTestStatusWarnings(boolean warnDoesNotExist) { + if (testingStatus == DatabaseTestResult.CONNECTION_FAILED) { + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), + Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_message(), + Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_title(), + JOptionPane.WARNING_MESSAGE); + } else if (testingStatus == DatabaseTestResult.SCHEMA_INVALID) { + // There's an existing database or file, but it's not in our format. + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), + Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_message(), + Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_title(), + JOptionPane.WARNING_MESSAGE); + } else if (testingStatus == DatabaseTestResult.DB_DOES_NOT_EXIST) { + //database doesn't exist do you want to create + boolean createDb = (!warnDoesNotExist || + JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(), + Bundle.EamDbSettingsDialog_okButton_createDbDialog_message(), + Bundle.EamDbSettingsDialog_okButton_createDbDialog_title(), + JOptionPane.YES_NO_OPTION)); + + if (createDb) + createDb(); + } + + return (testingStatus == DatabaseTestResult.TESTEDOK); + } + + + + + + + @NbBundle.Messages({"EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Database", + "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Database, please ensure location exists and you have write permissions and try again.", + "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Database, please ensure address, port, and login credentials are correct for Postgres server and try again."}) + private boolean createDb() { + boolean result = false; + boolean dbCreated = true; + switch (selectedPlatform) { + case POSTGRESQL: + if (!dbSettingsPostgres.verifyDatabaseExists()) { + dbCreated = dbSettingsPostgres.createDatabase(); + } + if (dbCreated) { + result = dbSettingsPostgres.initializeDatabaseSchema() + && dbSettingsPostgres.insertDefaultDatabaseContent(); + } + if (!result) { + // Remove the incomplete database + if (dbCreated) { + dbSettingsPostgres.deleteDatabase(); + } + + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), + Bundle.EamDbSettingsDialog_okButton_createPostgresDbError_message(), + Bundle.EamDbSettingsDialog_okButton_createDbError_title(), + JOptionPane.WARNING_MESSAGE); + logger.severe("Unable to initialize database schema or insert contents into central repository."); + return false; + } + break; + case SQLITE: + if (!dbSettingsSqlite.dbDirectoryExists()) { + dbCreated = dbSettingsSqlite.createDbDirectory(); + } + if (dbCreated) { + result = dbSettingsSqlite.initializeDatabaseSchema() + && dbSettingsSqlite.insertDefaultDatabaseContent(); + } + if (!result) { + if (dbCreated) { + dbSettingsSqlite.deleteDatabase(); + } + + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), + Bundle.EamDbSettingsDialog_okButton_createSQLiteDbError_message(), + Bundle.EamDbSettingsDialog_okButton_createDbError_title(), + JOptionPane.WARNING_MESSAGE); + logger.severe("Unable to initialize database schema or insert contents into central repository."); + return false; + } + break; + } + testingStatus = DatabaseTestResult.TESTEDOK; + return true; + } + + + /** + * saves a new central repository based on current settings + */ + @NbBundle.Messages({"EamDbSettingsDialog.okButton.errorTitle.text=Restart Required.", + "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.", + "EamDbSettingsDialog.okButton.connectionErrorMsg.text=Failed to connect to central repository database."}) + private void saveNewCentralRepo() { + /** + * We have to shutdown the previous platform's connection pool first; + * assuming it wasn't DISABLED. This will close any existing idle + * connections. + * + * The next use of an EamDb API method will start a new connection pool + * using those new settings. + */ + try { + CentralRepository previousDbManager = CentralRepository.getInstance(); + if (null != previousDbManager) { + // NOTE: do not set/save the seleted platform before calling this. + CentralRepository.getInstance().shutdownConnections(); + } + } catch (CentralRepoException ex) { + logger.log(Level.SEVERE, "Failed to close database connections in previously selected platform.", ex); // NON-NLS + SwingUtilities.invokeLater(() -> { + JOptionPane.showMessageDialog(this, + Bundle.EamDbSettingsDialog_okButton_errorMsg_text(), + Bundle.EamDbSettingsDialog_okButton_errorTitle_text(), + JOptionPane.WARNING_MESSAGE); + }); + } + + // Even if we fail to close the existing connections, make sure that we + // save the new connection settings, so an Autopsy restart will correctly + // start with the new settings. + CentralRepoPlatforms.setSelectedPlatform(selectedPlatform.name()); + CentralRepoPlatforms.saveSelectedPlatform(); + + switch (selectedPlatform) { + case POSTGRESQL: + // save the new PostgreSQL settings + dbSettingsPostgres.saveSettings(); + // Load those newly saved settings into the postgres db manager instance + // in case we are still using the same instance. + try { + CentralRepository.getInstance().updateSettings(); + configurationChanged = true; + } catch (CentralRepoException ex) { + logger.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + return; + } + + break; + case SQLITE: + // save the new SQLite settings + dbSettingsSqlite.saveSettings(); + // Load those newly saved settings into the sqlite db manager instance + // in case we are still using the same instance. + try { + CentralRepository.getInstance().updateSettings(); + configurationChanged = true; + } catch (CentralRepoException ex) { + logger.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + return; + } + break; + case DISABLED: + break; + } + } + + + static class DatabaseSettingsValidResult { + private final String errorMessage; + private final boolean success; + + public DatabaseSettingsValidResult(String errorMessage, boolean success) { + this.errorMessage = errorMessage; + this.success = success; + } + + public String getErrorMessage() { + return errorMessage; + } + + public boolean isSuccess() { + return success; + } + } + + + /** + * Tests whether or not the database settings are valid. + * + * @return True or false. + */ + private DatabaseSettingsValidResult databaseSettingsAreValid( + String tbDbHostname, Integer tbDbPort, String tbDbUsername, String tfDatabasePath, String jpDbPassword) { + + boolean result = true; + StringBuilder guidanceText = new StringBuilder(); + + switch (selectedPlatform) { + case POSTGRESQL: + try { + dbSettingsPostgres.setHost(tbDbHostname); + } catch (CentralRepoException ex) { + guidanceText.append(ex.getMessage()); + result = false; + } + + try { + dbSettingsPostgres.setPort(tbDbPort); + } catch (NumberFormatException | CentralRepoException ex) { + guidanceText.append(ex.getMessage()); + result = false; + } + + try { + dbSettingsPostgres.setDbName(CENTRAL_REPO_DB_NAME); + } catch (CentralRepoException ex) { + guidanceText.append(ex.getMessage()); + result = false; + } + + try { + dbSettingsPostgres.setUserName(tbDbUsername); + } catch (CentralRepoException ex) { + guidanceText.append(ex.getMessage()); + result = false; + } + + try { + dbSettingsPostgres.setPassword(jpDbPassword); + } catch (CentralRepoException ex) { + guidanceText.append(ex.getMessage()); + result = false; + } + break; + case SQLITE: + try { + File databasePath = new File(tfDatabasePath); + dbSettingsSqlite.setDbName(CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT); + dbSettingsSqlite.setDbDirectory(databasePath.getPath()); + } catch (CentralRepoException ex) { + guidanceText.append(ex.getMessage()); + result = false; + } + break; + } + + return new DatabaseSettingsValidResult(guidanceText.toString(), result); + } + + + private DatabaseTestResult testDbSettings() { + switch (selectedPlatform) { + case POSTGRESQL: + if (dbSettingsPostgres.verifyConnection()) { + if (dbSettingsPostgres.verifyDatabaseExists()) { + if (dbSettingsPostgres.verifyDatabaseSchema()) { + testingStatus = DatabaseTestResult.TESTEDOK; + } else { + testingStatus = DatabaseTestResult.SCHEMA_INVALID; + } + } else { + testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST; + } + } else { + testingStatus = DatabaseTestResult.CONNECTION_FAILED; + } + break; + case SQLITE: + if (dbSettingsSqlite.dbFileExists()) { + if (dbSettingsSqlite.verifyConnection()) { + if (dbSettingsSqlite.verifyDatabaseSchema()) { + testingStatus = DatabaseTestResult.TESTEDOK; + } else { + testingStatus = DatabaseTestResult.SCHEMA_INVALID; + } + } else { + testingStatus = DatabaseTestResult.SCHEMA_INVALID; + } + } else { + testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST; + } + break; + } + + return testingStatus; + } + + + /** + * Returns if changes to the central repository configuration were + * successfully applied + * + * @return true if the database configuration was successfully changed false + * if it was not + */ + boolean wasConfigurationChanged() { + return configurationChanged; + } +} diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form index 0f39326bec..27eae7629c 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form @@ -133,7 +133,7 @@ - + @@ -410,4 +410,4 @@ - \ No newline at end of file + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index 271a8a4f04..4bd17b561e 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -45,6 +45,7 @@ import static org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoPlatf import org.sleuthkit.autopsy.centralrepository.datamodel.PostgresCentralRepoSettings; import org.sleuthkit.autopsy.centralrepository.datamodel.SqliteCentralRepoSettings; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository; +import org.sleuthkit.autopsy.centralrepository.optionspanel.DatabaseTestResult; /** * Configuration dialog for Central Repository database settings. @@ -53,17 +54,15 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository; public class EamDbSettingsDialog extends JDialog { private static final Logger logger = Logger.getLogger(EamDbSettingsDialog.class.getName()); - private static final String CENTRAL_REPO_DB_NAME = "central_repository"; - private static final String CENTRAL_REPO_SQLITE_EXT = ".db"; + private static final long serialVersionUID = 1L; private final Collection textBoxes; private final TextBoxChangedListener textBoxChangedListener; - private final PostgresCentralRepoSettings dbSettingsPostgres; - private final SqliteCentralRepoSettings dbSettingsSqlite; - private DatabaseTestResult testingStatus; - private CentralRepoPlatforms selectedPlatform; - private boolean configurationChanged = false; + + + + /** * Creates new form EamDbSettingsDialog @@ -80,12 +79,6 @@ public class EamDbSettingsDialog extends JDialog { textBoxes = new ArrayList<>(); textBoxChangedListener = new TextBoxChangedListener(); - dbSettingsPostgres = new PostgresCentralRepoSettings(); - dbSettingsSqlite = new SqliteCentralRepoSettings(); - selectedPlatform = CentralRepoPlatforms.getSelectedPlatform(); - if (selectedPlatform == null || selectedPlatform.equals(CentralRepoPlatforms.DISABLED)) { - selectedPlatform = CentralRepoPlatforms.POSTGRESQL; - } initComponents(); fcDatabasePath.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); @@ -398,215 +391,27 @@ public class EamDbSettingsDialog extends JDialog { } }//GEN-LAST:event_bnDatabasePathFileOpenActionPerformed - private void testDbSettings() { - switch (selectedPlatform) { - case POSTGRESQL: - if (dbSettingsPostgres.verifyConnection()) { - if (dbSettingsPostgres.verifyDatabaseExists()) { - if (dbSettingsPostgres.verifyDatabaseSchema()) { - testingStatus = DatabaseTestResult.TESTEDOK; - } else { - testingStatus = DatabaseTestResult.SCHEMA_INVALID; - } - } else { - testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST; - } - } else { - testingStatus = DatabaseTestResult.CONNECTION_FAILED; - } - break; - case SQLITE: - if (dbSettingsSqlite.dbFileExists()) { - if (dbSettingsSqlite.verifyConnection()) { - if (dbSettingsSqlite.verifyDatabaseSchema()) { - testingStatus = DatabaseTestResult.TESTEDOK; - } else { - testingStatus = DatabaseTestResult.SCHEMA_INVALID; - } - } else { - testingStatus = DatabaseTestResult.SCHEMA_INVALID; - } - } else { - testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST; - } - break; - } - valid(); - } - @Messages({"EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Database", - "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Database, please ensure location exists and you have write permissions and try again.", - "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Database, please ensure address, port, and login credentials are correct for Postgres server and try again."}) - private void createDb() { - boolean result = false; - boolean dbCreated = true; - switch (selectedPlatform) { - case POSTGRESQL: - if (!dbSettingsPostgres.verifyDatabaseExists()) { - dbCreated = dbSettingsPostgres.createDatabase(); - } - if (dbCreated) { - result = dbSettingsPostgres.initializeDatabaseSchema() - && dbSettingsPostgres.insertDefaultDatabaseContent(); - } - if (!result) { - // Remove the incomplete database - if (dbCreated) { - dbSettingsPostgres.deleteDatabase(); - } - JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), - Bundle.EamDbSettingsDialog_okButton_createPostgresDbError_message(), - Bundle.EamDbSettingsDialog_okButton_createDbError_title(), - JOptionPane.WARNING_MESSAGE); - logger.severe("Unable to initialize database schema or insert contents into central repository."); - return; - } - break; - case SQLITE: - if (!dbSettingsSqlite.dbDirectoryExists()) { - dbCreated = dbSettingsSqlite.createDbDirectory(); - } - if (dbCreated) { - result = dbSettingsSqlite.initializeDatabaseSchema() - && dbSettingsSqlite.insertDefaultDatabaseContent(); - } - if (!result) { - if (dbCreated) { - dbSettingsSqlite.deleteDatabase(); - } - - JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), - Bundle.EamDbSettingsDialog_okButton_createSQLiteDbError_message(), - Bundle.EamDbSettingsDialog_okButton_createDbError_title(), - JOptionPane.WARNING_MESSAGE); - logger.severe("Unable to initialize database schema or insert contents into central repository."); - return; - } - break; - } - testingStatus = DatabaseTestResult.TESTEDOK; - valid(); - } - - /** - * Returns if changes to the central repository configuration were - * successfully applied - * - * @return true if the database configuration was successfully changed false - * if it was not - */ - boolean wasConfigurationChanged() { - return configurationChanged; - } - - @Messages({"EamDbSettingsDialog.okButton.errorTitle.text=Restart Required.", - "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.", - "EamDbSettingsDialog.okButton.connectionErrorMsg.text=Failed to connect to central repository database.", - "EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error Loading Database", - "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path (if applicable).", - "EamDbSettingsDialog.okButton.createDbDialog.title=Database Does Not Exist", - "EamDbSettingsDialog.okButton.createDbDialog.message=Database does not exist, would you like to create it?", - "EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Database Connection Failed", - "EamDbSettingsDialog.okButton.databaseConnectionFailed.message=Unable to connect to database please check your settings and try again."}) private void bnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOkActionPerformed setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); testDbSettings(); - if (testingStatus == DatabaseTestResult.CONNECTION_FAILED) { - JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), - Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_message(), - Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_title(), - JOptionPane.WARNING_MESSAGE); - } else if (testingStatus == DatabaseTestResult.SCHEMA_INVALID) { - // There's an existing database or file, but it's not in our format. - JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), - Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_message(), - Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_title(), - JOptionPane.WARNING_MESSAGE); - } else if (testingStatus == DatabaseTestResult.DB_DOES_NOT_EXIST) { - //database doesn't exist do you want to create - if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(), - Bundle.EamDbSettingsDialog_okButton_createDbDialog_message(), - Bundle.EamDbSettingsDialog_okButton_createDbDialog_title(), - JOptionPane.YES_NO_OPTION)) { - createDb(); - } - } - if (testingStatus != DatabaseTestResult.TESTEDOK) { + boolean testedOk = promptTestStatusWarnings(true); + if (!testedOk) { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); return; } - - /** - * We have to shutdown the previous platform's connection pool first; - * assuming it wasn't DISABLED. This will close any existing idle - * connections. - * - * The next use of an EamDb API method will start a new connection pool - * using those new settings. - */ - try { - CentralRepository previousDbManager = CentralRepository.getInstance(); - if (null != previousDbManager) { - // NOTE: do not set/save the seleted platform before calling this. - CentralRepository.getInstance().shutdownConnections(); - } - } catch (CentralRepoException ex) { - logger.log(Level.SEVERE, "Failed to close database connections in previously selected platform.", ex); // NON-NLS - SwingUtilities.invokeLater(() -> { - JOptionPane.showMessageDialog(this, - Bundle.EamDbSettingsDialog_okButton_errorMsg_text(), - Bundle.EamDbSettingsDialog_okButton_errorTitle_text(), - JOptionPane.WARNING_MESSAGE); - }); - } - - // Even if we fail to close the existing connections, make sure that we - // save the new connection settings, so an Autopsy restart will correctly - // start with the new settings. - CentralRepoPlatforms.setSelectedPlatform(selectedPlatform.name()); - CentralRepoPlatforms.saveSelectedPlatform(); - - switch (selectedPlatform) { - case POSTGRESQL: - // save the new PostgreSQL settings - dbSettingsPostgres.saveSettings(); - // Load those newly saved settings into the postgres db manager instance - // in case we are still using the same instance. - try { - CentralRepository.getInstance().updateSettings(); - configurationChanged = true; - } catch (CentralRepoException ex) { - logger.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - return; - } - - break; - case SQLITE: - // save the new SQLite settings - dbSettingsSqlite.saveSettings(); - // Load those newly saved settings into the sqlite db manager instance - // in case we are still using the same instance. - try { - CentralRepository.getInstance().updateSettings(); - configurationChanged = true; - } catch (CentralRepoException ex) { - logger.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - return; - } - break; - case DISABLED: - break; - } + + saveNewCentralRepo(); setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); dispose(); }//GEN-LAST:event_bnOkActionPerformed + + private void bnCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelActionPerformed dispose(); }//GEN-LAST:event_bnCancelActionPerformed @@ -757,6 +562,35 @@ public class EamDbSettingsDialog extends JDialog { && databaseSettingsAreValid(); } + + /** + * Validates that the form is filled out correctly for our usage. + * + * @return true if it's okay, false otherwise. + */ + private boolean valid() { + return enableOkButton(checkFields()); + } + + /** + * Enable the "OK" button if the db test passed. Disabled defaults to db + * test passed. + * + * @return true + */ + @Messages({"EamDbSettingsDialog.validation.finished=Click OK to save your database settings and return to the Options. Or select a different database type."}) + private boolean enableOkButton(boolean isValidInput) { + if (isValidInput) { + bnOk.setEnabled(true); + } else { + bnOk.setEnabled(false); + } + return true; + + } + + + /** * Tests whether or not the database settings are valid. * @@ -818,32 +652,6 @@ public class EamDbSettingsDialog extends JDialog { return result; } - /** - * Validates that the form is filled out correctly for our usage. - * - * @return true if it's okay, false otherwise. - */ - private boolean valid() { - return enableOkButton(checkFields()); - } - - /** - * Enable the "OK" button if the db test passed. Disabled defaults to db - * test passed. - * - * @return true - */ - @Messages({"EamDbSettingsDialog.validation.finished=Click OK to save your database settings and return to the Options. Or select a different database type."}) - private boolean enableOkButton(boolean isValidInput) { - if (isValidInput) { - bnOk.setEnabled(true); - } else { - bnOk.setEnabled(false); - } - return true; - - } - /** * Used to listen for changes in text boxes. It lets the panel know things * have been updated and that validation needs to happen. @@ -876,13 +684,6 @@ public class EamDbSettingsDialog extends JDialog { } } - private enum DatabaseTestResult { - UNTESTED, - CONNECTION_FAILED, - SCHEMA_INVALID, - DB_DOES_NOT_EXIST, - TESTEDOK; - } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton bnCancel;