diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java index dc52ea6a1f..d0264eab54 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java @@ -36,8 +36,11 @@ public interface EamDb { * @throws EamDbException */ static EamDb getInstance() throws EamDbException { - EamDbPlatformEnum selectedPlatform = EamDbPlatformEnum.getSelectedPlatform(); + EamDbPlatformEnum selectedPlatform = EamDbPlatformEnum.DISABLED; + if (EamDbUtil.useCentralRepo()) { + selectedPlatform = EamDbPlatformEnum.getSelectedPlatform(); + } switch (selectedPlatform) { case POSTGRESQL: return PostgresEamDb.getInstance(); @@ -86,7 +89,8 @@ public interface EamDb { * @return Is the database enabled */ static boolean isEnabled() { - return EamDbPlatformEnum.getSelectedPlatform() != EamDbPlatformEnum.DISABLED; + return EamDbUtil.useCentralRepo() + && EamDbPlatformEnum.getSelectedPlatform() != EamDbPlatformEnum.DISABLED; } /** diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java index c663fe04f9..489f4cb12e 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java @@ -3,7 +3,6 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ - package org.sleuthkit.autopsy.centralrepository.datamodel; import java.sql.Connection; @@ -15,13 +14,17 @@ import java.util.List; import java.util.logging.Level; import static org.sleuthkit.autopsy.centralrepository.datamodel.EamDb.SCHEMA_VERSION; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.coreutils.ModuleSettings; /** * */ public class EamDbUtil { + private final static Logger LOGGER = Logger.getLogger(EamDbUtil.class.getName()); - + private static final String CENTRAL_REPO_NAME = "CentralRepository"; + private static final String CENTRAL_REPO_USE_KEY = "db.useCentralRepo"; + /** * Close the prepared statement. * @@ -72,11 +75,12 @@ public class EamDbUtil { } } } - + /** * Insert the default correlation types into the database. - * + * * @param conn Open connection to use. + * * @return true on success, else false */ public static boolean insertDefaultCorrelationTypes(Connection conn) { @@ -104,7 +108,7 @@ public class EamDbUtil { } return true; } - + /** * Store the schema version into the db_info table. * @@ -112,6 +116,7 @@ public class EamDbUtil { * loaded. * * @param conn Open connection to use. + * * @return true on success, else false */ public static boolean insertSchemaVersion(Connection conn) { @@ -133,14 +138,14 @@ public class EamDbUtil { /** * Query to see if the SCHEMA_VERSION is set in the db. - * + * * @return true if set, else false. */ public static boolean schemaVersionIsSet(Connection conn) { if (null == conn) { return false; } - + ResultSet resultSet = null; try { Statement tester = conn.createStatement(); @@ -157,17 +162,38 @@ public class EamDbUtil { return true; } - /** - * Use the current settings and the validation query - * to test the connection to the database. - * + /** + * If the Central Repos use has been enabled. + * + * @return true if the Central Repo may be configured, false if it should + * not be able to be + */ + public static boolean useCentralRepo() { + return Boolean.parseBoolean(ModuleSettings.getConfigSetting(CENTRAL_REPO_NAME, CENTRAL_REPO_USE_KEY)); + } + + /** + * Saves the setting for whether the Central Repo should be able to be + * configured. + * + * @param centralRepoCheckBoxIsSelected - true if the central repo can be + * used + */ + public static void setUseCentralRepo(boolean centralRepoCheckBoxIsSelected) { + ModuleSettings.setConfigSetting(CENTRAL_REPO_NAME, CENTRAL_REPO_USE_KEY, Boolean.toString(centralRepoCheckBoxIsSelected)); + } + + /** + * Use the current settings and the validation query to test the connection + * to the database. + * * @return true if successfull query execution, else false. */ public static boolean executeValidationQuery(Connection conn, String validationQuery) { if (null == conn) { return false; } - + ResultSet resultSet = null; try { Statement tester = conn.createStatement(); @@ -183,22 +209,23 @@ public class EamDbUtil { return false; } - /** * Conver thte Type's DbTableName string to the *_instances table name. - * + * * @param type Correlation Type - * @return Instance table name for this Type. + * + * @return Instance table name for this Type. */ public static String correlationTypeToInstanceTableName(EamArtifact.Type type) { return type.getDbTableName() + "_instances"; } - + /** * Convert the Type's DbTableName string to the reference_* table name. - * + * * @param type Correlation Type + * * @return Reference table name for this Type. */ public static String correlationTypeToReferenceTableName(EamArtifact.Type type) { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java index e472a357f1..5c02d17ea0 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.centralrepository.datamodel; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.InvalidPathException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; @@ -93,7 +94,7 @@ public final class SqliteEamDbSettings { if (badTagsStr == null) { badTagsStr = DEFAULT_BAD_TAGS; } - if(badTagsStr.isEmpty()){ + if (badTagsStr.isEmpty()) { badTags = new ArrayList<>(); } else { badTags = new ArrayList<>(Arrays.asList(badTagsStr.split(","))); @@ -111,13 +112,13 @@ public final class SqliteEamDbSettings { /** * Verify that the db directory path exists. - * + * * @return true if exists, else false */ public boolean dbDirectoryExists() { // Ensure dbDirectory is a valid directory File dbDir = new File(getDbDirectory()); - + if (!dbDir.exists()) { return false; } else if (!dbDir.isDirectory()) { @@ -130,7 +131,7 @@ public final class SqliteEamDbSettings { /** * Create the db directory if it does not exist. - * + * * @return true is successfully created or already exists, else false */ public boolean createDbDirectory() { @@ -139,7 +140,7 @@ public final class SqliteEamDbSettings { File dbDir = new File(getDbDirectory()); Files.createDirectories(dbDir.toPath()); LOGGER.log(Level.INFO, "sqlite directory did not exist, created it at {0}.", getDbDirectory()); // NON-NLS - } catch (IOException ex) { + } catch (IOException | InvalidPathException | SecurityException ex) { LOGGER.log(Level.SEVERE, "Failed to create sqlite database directory.", ex); // NON-NLS return false; } @@ -162,10 +163,11 @@ public final class SqliteEamDbSettings { } /** - * Use the current settings to get an ephemeral client connection for testing. - * + * Use the current settings to get an ephemeral client connection for + * testing. + * * If the directory path does not exist, it will return null. - * + * * @return Connection or null. */ private Connection getEphemeralConnection() { @@ -186,9 +188,9 @@ public final class SqliteEamDbSettings { } /** - * Use the current settings and the validation query - * to test the connection to the database. - * + * Use the current settings and the validation query to test the connection + * to the database. + * * @return true if successfull connection, else false. */ public boolean verifyConnection() { @@ -196,16 +198,16 @@ public final class SqliteEamDbSettings { if (null == conn) { return false; } - + boolean result = EamDbUtil.executeValidationQuery(conn, VALIDATION_QUERY); EamDbUtil.closeConnection(conn); return result; } /** - * Use the current settings and the schema version query - * to test the database schema. - * + * Use the current settings and the schema version query to test the + * database schema. + * * @return true if successfull connection, else false. */ public boolean verifyDatabaseSchema() { @@ -247,7 +249,6 @@ public final class SqliteEamDbSettings { // NOTE: The organizations will only have a small number of rows, so // an index is probably not worthwhile. - StringBuilder createCasesTable = new StringBuilder(); createCasesTable.append("CREATE TABLE IF NOT EXISTS cases ("); createCasesTable.append("id integer primary key autoincrement NOT NULL,"); @@ -346,7 +347,6 @@ public final class SqliteEamDbSettings { // NOTE: the db_info table currenly only has 1 row, so having an index // provides no benefit. - Connection conn = null; try { conn = getEphemeralConnection(); @@ -385,7 +385,7 @@ public final class SqliteEamDbSettings { for (EamArtifact.Type type : DEFAULT_CORRELATION_TYPES) { reference_type_dbname = EamDbUtil.correlationTypeToReferenceTableName(type); instance_type_dbname = EamDbUtil.correlationTypeToInstanceTableName(type); - + stmt.execute(String.format(createArtifactInstancesTableTemplate.toString(), instance_type_dbname, instance_type_dbname)); stmt.execute(String.format(instancesIdx1, instance_type_dbname, instance_type_dbname)); stmt.execute(String.format(instancesIdx2, instance_type_dbname, instance_type_dbname)); @@ -397,7 +397,7 @@ public final class SqliteEamDbSettings { stmt.execute(String.format(createReferenceTypesTableTemplate.toString(), reference_type_dbname, reference_type_dbname)); stmt.execute(String.format(referenceTypesIdx1, reference_type_dbname, reference_type_dbname)); stmt.execute(String.format(referenceTypesIdx2, reference_type_dbname, reference_type_dbname)); - } + } } } catch (SQLException ex) { LOGGER.log(Level.SEVERE, "Error initializing db schema.", ex); // NON-NLS @@ -422,7 +422,7 @@ public final class SqliteEamDbSettings { EamDbUtil.closeConnection(conn); return result; } - + public boolean isChanged() { String dbNameString = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.dbName"); // NON-NLS String dbDirectoryString = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.dbDirectory"); // NON-NLS diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties index 22a0ed7a5c..ed1de3ea5b 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties @@ -13,7 +13,7 @@ EamSqliteSettingsDialog.bnCancel.text=Cancel EamSqliteSettingsDialog.lbTestDatabase.text= EamSqliteSettingsDialog.bnTestDatabase.text=Test Connection EamSqliteSettingsDialog.lbTestDatabaseWarning.text= -EamSqliteSettingsDialog.bnDatabasePathFileOpen.text=Open... +EamSqliteSettingsDialog.bnDatabasePathFileOpen.text=Browse... EamSqliteSettingsDialog.tfDatabasePath.toolTipText=Filename and path to store SQLite db file EamSqliteSettingsDialog.tfDatabasePath.text= EamSqliteSettingsDialog.lbDatabasePath.text=Database Path : @@ -52,24 +52,16 @@ ManageTagsDialog.cancelButton.text=Cancel ManageArtifactTypesDialog.taInstructionsMsg.text=Enable one or more correlation properties to use for correlation during ingest. Note, these properties are global and impact all users of the central repository. EamSqliteSettingsDialog.bnOk.text=OK EamPostgresSettingsDialog.bnSave.text=Save -EamDbSettingsDialog.pnDatabaseConnectionSettings.border.title=Database Settings -EamDbSettingsDialog.rdioBnPostgreSQL.text=PostgreSQL -EamDbSettingsDialog.rdioBnSQLite.text=SQLite -EamDbSettingsDialog.bnDatabasePathFileOpen.text=Open... +EamDbSettingsDialog.bnDatabasePathFileOpen.text=Browse... EamDbSettingsDialog.tfDatabasePath.toolTipText=Filename and path to store SQLite db file EamDbSettingsDialog.tfDatabasePath.text= EamDbSettingsDialog.lbDatabasePath.text=Database Path : -EamDbSettingsDialog.rdioBnDisabled.text=Disabled EamDbSettingsDialog.bnCancel.text=Cancel EamDbSettingsDialog.bnOk.text=OK -EamDbSettingsDialog.bnTest.text=Test EamDbSettingsDialog.lbHostName.text=Host Name / IP : -EamDbSettingsDialog.lbDatabaseName.text=Database name : EamDbSettingsDialog.lbUserPassword.text=User Password : EamDbSettingsDialog.lbUserName.text=User Name : EamDbSettingsDialog.lbPort.text=Port : -EamDbSettingsDialog.bnCreateDb.text=Create -EamDbSettingsDialog.pnSetupGuidance.border.title=Setup Guidance GlobalSettingsPanel.pnDatabaseConfiguration.title=Database Configuration GlobalSettingsPanel.lbDbPlatformTypeLabel.text=Type: GlobalSettingsPanel.lbDbNameLabel.text=Name: diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form index 93bfa8f3fd..a3ff6584b0 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form @@ -29,12 +29,11 @@ - - - - - - + + + + + @@ -43,303 +42,22 @@ - - + + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -352,20 +70,11 @@ - - - - - - - - - - - - + + + - + @@ -391,40 +100,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + + @@ -434,55 +116,176 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index b3c282b607..6ef345ac4f 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -14,7 +14,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.logging.Level; -import javax.swing.ImageIcon; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; @@ -24,7 +23,6 @@ import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.netbeans.spi.options.OptionsPanelController; -import org.openide.util.ImageUtilities; import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; @@ -32,6 +30,7 @@ import org.sleuthkit.autopsy.corecomponents.TextPrompt; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbPlatformEnum; +import static org.sleuthkit.autopsy.centralrepository.datamodel.EamDbPlatformEnum.SQLITE; import org.sleuthkit.autopsy.centralrepository.datamodel.PostgresEamDbSettings; import org.sleuthkit.autopsy.centralrepository.datamodel.SqliteEamDbSettings; @@ -40,11 +39,13 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.SqliteEamDbSettings; * @author nick */ 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 ImageIcon goodIcon; - private final ImageIcon badIcon; private final PostgresEamDbSettings dbSettingsPostgres; private final SqliteEamDbSettings dbSettingsSqlite; @@ -54,25 +55,31 @@ public class EamDbSettingsDialog extends JDialog { /** * Creates new form EamDbSettingsDialog */ - @Messages({"EamDbSettingsDialog.title.text=Central Repository Database Configuration"}) + @Messages({"EamDbSettingsDialog.title.text=Central Repository Database Configuration", + "EamDbSettingsDialog.lbSingleUserSqLite.text=SQLite should only be used by one examiner at a time.", + "EamDbSettingsDialog.lbDatabaseType.text=Database type :"}) + public EamDbSettingsDialog() { super((JFrame) WindowManager.getDefault().getMainWindow(), - Bundle.EamDbSettingsDialog_title_text(), - true); // NON-NLS + Bundle.EamDbSettingsDialog_title_text(), + true); textBoxes = new ArrayList<>(); textBoxChangedListener = new TextBoxChangedListener(); - goodIcon = new ImageIcon(ImageUtilities.loadImage("org/sleuthkit/autopsy/images/good.png", false)); // NON-NLS - badIcon = new ImageIcon(ImageUtilities.loadImage("org/sleuthkit/autopsy/images/bad.png", false)); // NON-NLS - dbSettingsPostgres = new PostgresEamDbSettings(); dbSettingsSqlite = new SqliteEamDbSettings(); selectedPlatform = EamDbPlatformEnum.getSelectedPlatform(); - + if (selectedPlatform == null || selectedPlatform.equals(EamDbPlatformEnum.DISABLED)) { + selectedPlatform = EamDbPlatformEnum.POSTGRESQL; + } + initComponents(); + fcDatabasePath.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + cbDatabaseType.setSelectedItem(selectedPlatform); customizeComponents(); valid(); display(); + } /** @@ -86,198 +93,27 @@ public class EamDbSettingsDialog extends JDialog { bnGrpDatabasePlatforms = new javax.swing.ButtonGroup(); fcDatabasePath = new javax.swing.JFileChooser(); - pnDatabaseConnectionSettings = new javax.swing.JPanel(); + pnButtons = new javax.swing.JPanel(); + bnCancel = new javax.swing.JButton(); + bnOk = new javax.swing.JButton(); pnSQLiteSettings = new javax.swing.JPanel(); lbDatabasePath = new javax.swing.JLabel(); tfDatabasePath = new javax.swing.JTextField(); bnDatabasePathFileOpen = new javax.swing.JButton(); - pnPostgreSQLSettings = new javax.swing.JPanel(); lbHostName = new javax.swing.JLabel(); - lbPort = new javax.swing.JLabel(); - lbUserName = new javax.swing.JLabel(); - lbUserPassword = new javax.swing.JLabel(); - lbDatabaseName = new javax.swing.JLabel(); tbDbHostname = new javax.swing.JTextField(); + lbPort = new javax.swing.JLabel(); tbDbPort = new javax.swing.JTextField(); - tbDbName = new javax.swing.JTextField(); + lbUserName = new javax.swing.JLabel(); tbDbUsername = new javax.swing.JTextField(); + lbUserPassword = new javax.swing.JLabel(); jpDbPassword = new javax.swing.JPasswordField(); - rdioBnSQLite = new javax.swing.JRadioButton(); - rdioBnPostgreSQL = new javax.swing.JRadioButton(); - rdioBnDisabled = new javax.swing.JRadioButton(); - pnButtons = new javax.swing.JPanel(); - bnCancel = new javax.swing.JButton(); - bnOk = new javax.swing.JButton(); - bnTest = new javax.swing.JButton(); - bnCreateDb = new javax.swing.JButton(); - lbTestIcon = new javax.swing.JLabel(); - lbCreateIcon = new javax.swing.JLabel(); - pnSetupGuidance = new javax.swing.JPanel(); - jScrollPane1 = new javax.swing.JScrollPane(); - taSetupGuidance = new javax.swing.JTextArea(); + cbDatabaseType = new javax.swing.JComboBox<>(); + lbSingleUserSqLite = new javax.swing.JLabel(); + lbDatabaseType = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - pnDatabaseConnectionSettings.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.pnDatabaseConnectionSettings.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N - pnDatabaseConnectionSettings.setName(""); // NOI18N - - pnSQLiteSettings.setBorder(javax.swing.BorderFactory.createEtchedBorder()); - - org.openide.awt.Mnemonics.setLocalizedText(lbDatabasePath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabasePath.text")); // NOI18N - - tfDatabasePath.setText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.text")); // NOI18N - tfDatabasePath.setToolTipText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.toolTipText")); // NOI18N - tfDatabasePath.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - tfDatabasePathFocusLost(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnDatabasePathFileOpen, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnDatabasePathFileOpen.text")); // NOI18N - bnDatabasePathFileOpen.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnDatabasePathFileOpenActionPerformed(evt); - } - }); - - javax.swing.GroupLayout pnSQLiteSettingsLayout = new javax.swing.GroupLayout(pnSQLiteSettings); - pnSQLiteSettings.setLayout(pnSQLiteSettingsLayout); - pnSQLiteSettingsLayout.setHorizontalGroup( - pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() - .addContainerGap() - .addComponent(lbDatabasePath) - .addGap(18, 18, 18) - .addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 343, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(bnDatabasePathFileOpen) - .addContainerGap()) - ); - pnSQLiteSettingsLayout.setVerticalGroup( - pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() - .addContainerGap() - .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(bnDatabasePathFileOpen)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - pnPostgreSQLSettings.setBorder(javax.swing.BorderFactory.createEtchedBorder()); - - org.openide.awt.Mnemonics.setLocalizedText(lbHostName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbHostName.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbPort, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbPort.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbUserName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserName.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbUserPassword, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserPassword.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseName.text")); // NOI18N - - javax.swing.GroupLayout pnPostgreSQLSettingsLayout = new javax.swing.GroupLayout(pnPostgreSQLSettings); - pnPostgreSQLSettings.setLayout(pnPostgreSQLSettingsLayout); - pnPostgreSQLSettingsLayout.setHorizontalGroup( - pnPostgreSQLSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnPostgreSQLSettingsLayout.createSequentialGroup() - .addContainerGap() - .addGroup(pnPostgreSQLSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbHostName) - .addComponent(lbPort) - .addComponent(lbDatabaseName) - .addComponent(lbUserName) - .addComponent(lbUserPassword)) - .addGap(18, 18, 18) - .addGroup(pnPostgreSQLSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(tbDbUsername, javax.swing.GroupLayout.DEFAULT_SIZE, 439, Short.MAX_VALUE) - .addComponent(tbDbName) - .addComponent(tbDbPort) - .addComponent(tbDbHostname) - .addComponent(jpDbPassword)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - pnPostgreSQLSettingsLayout.setVerticalGroup( - pnPostgreSQLSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnPostgreSQLSettingsLayout.createSequentialGroup() - .addContainerGap() - .addGroup(pnPostgreSQLSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbHostName, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnPostgreSQLSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(tbDbPort) - .addComponent(lbPort, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnPostgreSQLSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(tbDbName) - .addComponent(lbDatabaseName, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnPostgreSQLSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(tbDbUsername) - .addComponent(lbUserName, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnPostgreSQLSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbUserPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(19, Short.MAX_VALUE)) - ); - - org.openide.awt.Mnemonics.setLocalizedText(rdioBnSQLite, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.rdioBnSQLite.text")); // NOI18N - rdioBnSQLite.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - rdioBnSQLiteActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(rdioBnPostgreSQL, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.rdioBnPostgreSQL.text")); // NOI18N - rdioBnPostgreSQL.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - rdioBnPostgreSQLActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(rdioBnDisabled, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.rdioBnDisabled.text")); // NOI18N - rdioBnDisabled.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - rdioBnDisabledActionPerformed(evt); - } - }); - - javax.swing.GroupLayout pnDatabaseConnectionSettingsLayout = new javax.swing.GroupLayout(pnDatabaseConnectionSettings); - pnDatabaseConnectionSettings.setLayout(pnDatabaseConnectionSettingsLayout); - pnDatabaseConnectionSettingsLayout.setHorizontalGroup( - pnDatabaseConnectionSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnDatabaseConnectionSettingsLayout.createSequentialGroup() - .addComponent(rdioBnPostgreSQL) - .addGap(0, 0, Short.MAX_VALUE)) - .addGroup(pnDatabaseConnectionSettingsLayout.createSequentialGroup() - .addGroup(pnDatabaseConnectionSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(rdioBnSQLite) - .addComponent(rdioBnDisabled)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGroup(pnDatabaseConnectionSettingsLayout.createSequentialGroup() - .addContainerGap() - .addGroup(pnDatabaseConnectionSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(pnPostgreSQLSettings, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - ); - pnDatabaseConnectionSettingsLayout.setVerticalGroup( - pnDatabaseConnectionSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnDatabaseConnectionSettingsLayout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(rdioBnDisabled) - .addGap(13, 13, 13) - .addComponent(rdioBnSQLite) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(12, 12, 12) - .addComponent(rdioBnPostgreSQL) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(pnPostgreSQLSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(329, 329, 329)) - ); - org.openide.awt.Mnemonics.setLocalizedText(bnCancel, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnCancel.text")); // NOI18N bnCancel.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -292,34 +128,12 @@ public class EamDbSettingsDialog extends JDialog { } }); - org.openide.awt.Mnemonics.setLocalizedText(bnTest, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnTest.text")); // NOI18N - bnTest.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnTestActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnCreateDb, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnCreateDb.text")); // NOI18N - bnCreateDb.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnCreateDbActionPerformed(evt); - } - }); - javax.swing.GroupLayout pnButtonsLayout = new javax.swing.GroupLayout(pnButtons); pnButtons.setLayout(pnButtonsLayout); pnButtonsLayout.setHorizontalGroup( pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnButtonsLayout.createSequentialGroup() - .addContainerGap() - .addComponent(bnTest) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbTestIcon, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(18, 18, 18) - .addComponent(bnCreateDb) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbCreateIcon, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(bnOk) .addGap(11, 11, 11) .addComponent(bnCancel) @@ -329,154 +143,178 @@ public class EamDbSettingsDialog extends JDialog { pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnButtonsLayout.createSequentialGroup() .addGap(0, 0, 0) - .addGroup(pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbCreateIcon, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbTestIcon, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(pnButtonsLayout.createSequentialGroup() - .addGroup(pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(bnOk) - .addComponent(bnCancel) - .addComponent(bnTest) - .addComponent(bnCreateDb)) - .addGap(0, 0, Short.MAX_VALUE))) - .addContainerGap()) + .addGroup(pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(bnOk) + .addComponent(bnCancel)) + .addGap(0, 0, 0)) ); - pnSetupGuidance.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.pnSetupGuidance.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N + pnSQLiteSettings.setBorder(javax.swing.BorderFactory.createEtchedBorder()); - jScrollPane1.setBorder(null); + org.openide.awt.Mnemonics.setLocalizedText(lbDatabasePath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabasePath.text")); // NOI18N - taSetupGuidance.setEditable(false); - taSetupGuidance.setBackground(new java.awt.Color(240, 240, 240)); - taSetupGuidance.setColumns(20); - taSetupGuidance.setFont(new java.awt.Font("Monospaced", 0, 12)); // NOI18N - taSetupGuidance.setLineWrap(true); - taSetupGuidance.setRows(3); - taSetupGuidance.setTabSize(4); - taSetupGuidance.setWrapStyleWord(true); - taSetupGuidance.setAutoscrolls(false); - taSetupGuidance.setBorder(null); - taSetupGuidance.setRequestFocusEnabled(false); - taSetupGuidance.setVerifyInputWhenFocusTarget(false); - jScrollPane1.setViewportView(taSetupGuidance); + tfDatabasePath.setText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.text")); // NOI18N + tfDatabasePath.setToolTipText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.toolTipText")); // NOI18N - javax.swing.GroupLayout pnSetupGuidanceLayout = new javax.swing.GroupLayout(pnSetupGuidance); - pnSetupGuidance.setLayout(pnSetupGuidanceLayout); - pnSetupGuidanceLayout.setHorizontalGroup( - pnSetupGuidanceLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnSetupGuidanceLayout.createSequentialGroup() + org.openide.awt.Mnemonics.setLocalizedText(bnDatabasePathFileOpen, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnDatabasePathFileOpen.text")); // NOI18N + bnDatabasePathFileOpen.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnDatabasePathFileOpenActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(lbHostName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbHostName.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbPort, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbPort.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbUserName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserName.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbUserPassword, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserPassword.text")); // NOI18N + + cbDatabaseType.setModel(new javax.swing.DefaultComboBoxModel<>(new EamDbPlatformEnum[]{EamDbPlatformEnum.POSTGRESQL, EamDbPlatformEnum.SQLITE})); + cbDatabaseType.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbDatabaseTypeActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(lbSingleUserSqLite, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbSingleUserSqLite.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseType, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseType.text")); // NOI18N + + javax.swing.GroupLayout pnSQLiteSettingsLayout = new javax.swing.GroupLayout(pnSQLiteSettings); + pnSQLiteSettings.setLayout(pnSQLiteSettingsLayout); + pnSQLiteSettingsLayout.setHorizontalGroup( + pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() .addContainerGap() - .addComponent(jScrollPane1) - .addContainerGap()) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbHostName) + .addComponent(lbPort) + .addComponent(lbUserName) + .addComponent(lbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbDatabasePath) + .addComponent(lbUserPassword, javax.swing.GroupLayout.Alignment.TRAILING))) + .addGap(10, 10, 10) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() + .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE) + .addGap(9, 9, 9)) + .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() + .addComponent(tfDatabasePath) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnDatabasePathFileOpen) + .addGap(11, 11, 11)) + .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(tbDbHostname) + .addComponent(jpDbPassword) + .addComponent(tbDbUsername, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(tbDbPort)) + .addGap(10, 10, 10)))) ); - pnSetupGuidanceLayout.setVerticalGroup( - pnSetupGuidanceLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnSetupGuidanceLayout.createSequentialGroup() - .addContainerGap() - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + pnSQLiteSettingsLayout.setVerticalGroup( + pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() + .addGap(6, 6, 6) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbSingleUserSqLite)) + .addComponent(lbDatabaseType, javax.swing.GroupLayout.Alignment.TRAILING)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(bnDatabasePathFileOpen)) + .addGap(0, 0, 0) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbHostName, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(tbDbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbPort, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbUserName, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbUserPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(10, 10, 10)) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createSequentialGroup() .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(pnSetupGuidance, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(pnDatabaseConnectionSettings, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(pnButtons, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(pnButtons, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(pnSetupGuidance, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(10, 10, 10) + .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(pnDatabaseConnectionSettings, javax.swing.GroupLayout.PREFERRED_SIZE, 348, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(pnButtons, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, 0)) + .addGap(10, 10, 10)) ); pack(); }// //GEN-END:initComponents private void customizeComponents() { - bnGrpDatabasePlatforms.add(rdioBnDisabled); - bnGrpDatabasePlatforms.add(rdioBnPostgreSQL); - bnGrpDatabasePlatforms.add(rdioBnSQLite); - + setTextPrompts(); + setTextBoxListeners(); switch (selectedPlatform) { - case POSTGRESQL: - rdioBnPostgreSQL.setSelected(true); - testingStatus = DatabaseTestResult.UNTESTED; - updatePostgresFields(true); - updateSqliteFields(false); - break; case SQLITE: - rdioBnSQLite.setSelected(true); testingStatus = DatabaseTestResult.UNTESTED; updatePostgresFields(false); updateSqliteFields(true); break; default: - rdioBnDisabled.setSelected(true); - testingStatus = DatabaseTestResult.TESTEDOK; - updatePostgresFields(false); + POSTGRESQL: + testingStatus = DatabaseTestResult.UNTESTED; + updatePostgresFields(true); updateSqliteFields(false); break; - } - setTextPrompts(); - setTextBoxListeners(); - lbTestIcon.setIcon(null); + } + displayDatabaseSettings(selectedPlatform.equals(EamDbPlatformEnum.POSTGRESQL)); } - + private void display() { Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); setLocation((screenDimension.width - getSize().width) / 2, (screenDimension.height - getSize().height) / 2); setVisible(true); } - private void setGuidanceMessage(String message, boolean isError) { - taSetupGuidance.setText(message); - if (isError) { - taSetupGuidance.setForeground(new Color(255, 102, 102)); // light red color - } else { - taSetupGuidance.setForeground(new Color(0, 0, 0)); // black color - } - } - - private void clearIcons() { - lbTestIcon.setIcon(null); - lbCreateIcon.setIcon(null); - } - + @Messages({"EamDbSettingsDialog.chooserPath.failedToGetDbPathMsg=Selected database path is invalid. Try again."}) private void bnDatabasePathFileOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDatabasePathFileOpenActionPerformed fcDatabasePath.setCurrentDirectory(new File(dbSettingsSqlite.getDbDirectory())); - fcDatabasePath.setSelectedFile(new File(dbSettingsSqlite.getFileNameWithPath())); + fcDatabasePath.setSelectedFile(new File(dbSettingsSqlite.getDbDirectory())); if (fcDatabasePath.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { File databaseFile = fcDatabasePath.getSelectedFile(); try { - String fullPath = databaseFile.getCanonicalPath(); - if (!fullPath.endsWith(".db")) { - fullPath = fullPath + ".db"; // NON-NLS - } - tfDatabasePath.setText(fullPath); + tfDatabasePath.setText(databaseFile.getCanonicalPath()); valid(); } catch (IOException ex) { LOGGER.log(Level.SEVERE, "Failed to get path of selected database file", ex); // NON-NLS - setGuidanceMessage(Bundle.EamDbSettingsDialog_chooserPath_failedToGetDbPathMsg(), true); } } }//GEN-LAST:event_bnDatabasePathFileOpenActionPerformed - private void bnTestActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnTestActionPerformed - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - + private void testDbSettings() { switch (selectedPlatform) { case POSTGRESQL: if (dbSettingsPostgres.verifyConnection()) { @@ -484,78 +322,110 @@ public class EamDbSettingsDialog extends JDialog { && dbSettingsPostgres.verifyDatabaseSchema()) { testingStatus = DatabaseTestResult.TESTEDOK; } else { - testingStatus = DatabaseTestResult.SCHEMA_INVALID; + testingStatus = DatabaseTestResult.SCHEMA_INVALID; } } else { testingStatus = DatabaseTestResult.CONNECTION_FAILED; - } + } break; case SQLITE: if (dbSettingsSqlite.dbDirectoryExists() && dbSettingsSqlite.verifyConnection()) { if (dbSettingsSqlite.verifyDatabaseSchema()) { - testingStatus = DatabaseTestResult.TESTEDOK; - } else { - testingStatus = DatabaseTestResult.SCHEMA_INVALID; + testingStatus = DatabaseTestResult.TESTEDOK; + } else { + testingStatus = DatabaseTestResult.SCHEMA_INVALID; } } else { - testingStatus = DatabaseTestResult.SCHEMA_INVALID; + testingStatus = DatabaseTestResult.SCHEMA_INVALID; } break; } - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - if (testingStatus == DatabaseTestResult.TESTEDOK) { - lbTestIcon.setIcon(goodIcon); - } else { - lbTestIcon.setIcon(badIcon); - } valid(); - }//GEN-LAST:event_bnTestActionPerformed + } - @Messages({"EamDbSettingsDialog.creation.failed=Database initialization failed."}) - private void bnCreateDbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCreateDbActionPerformed - - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - clearIcons(); + @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()) { - dbSettingsPostgres.createDatabase(); + dbCreated = dbSettingsPostgres.createDatabase(); + } + if (dbCreated) { + result = dbSettingsPostgres.initializeDatabaseSchema() + && dbSettingsPostgres.insertDefaultDatabaseContent(); + } + if (!result) { + 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; } - result = dbSettingsPostgres.initializeDatabaseSchema() - && dbSettingsPostgres.insertDefaultDatabaseContent(); - break; case SQLITE: if (!dbSettingsSqlite.dbDirectoryExists()) { - dbSettingsSqlite.createDbDirectory(); + dbCreated = dbSettingsSqlite.createDbDirectory(); + } + if (dbCreated) { + result = dbSettingsSqlite.initializeDatabaseSchema() + && dbSettingsSqlite.insertDefaultDatabaseContent(); + } + if (!result) { + 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; } - result = dbSettingsSqlite.initializeDatabaseSchema() - && dbSettingsSqlite.insertDefaultDatabaseContent(); break; } - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - if (false == result) { - setGuidanceMessage(Bundle.EamDbSettingsDialog_creation_failed(), true); - lbCreateIcon.setIcon(badIcon); - } else { - testingStatus = DatabaseTestResult.TESTEDOK; - lbCreateIcon.setIcon(goodIcon); - valid(); - } - }//GEN-LAST:event_bnCreateDbActionPerformed + testingStatus = DatabaseTestResult.TESTEDOK; + valid(); + } @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.connectionErrorMsg.text=Failed to connect to Central Repository database.", + "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) { + //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) { + 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. */ @@ -568,7 +438,7 @@ public class EamDbSettingsDialog extends JDialog { } catch (EamDbException ex) { LOGGER.log(Level.SEVERE, "Failed to close database connections in previously selected platform.", ex); // NON-NLS SwingUtilities.invokeLater(() -> { - JOptionPane.showMessageDialog(null, + JOptionPane.showMessageDialog(null, Bundle.EamDbSettingsDialog_okButton_errorMsg_text(), Bundle.EamDbSettingsDialog_okButton_errorTitle_text(), JOptionPane.WARNING_MESSAGE); @@ -590,8 +460,8 @@ public class EamDbSettingsDialog extends JDialog { try { EamDb.getInstance().updateSettings(); } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Failed to connect to Central Repository database.", ex); - setGuidanceMessage(Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), true); + LOGGER.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); return; } @@ -604,8 +474,8 @@ public class EamDbSettingsDialog extends JDialog { try { EamDb.getInstance().updateSettings(); } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Failed to connect to Central Repository database.", ex); - setGuidanceMessage(Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), true); + LOGGER.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); return; } break; @@ -613,6 +483,7 @@ public class EamDbSettingsDialog extends JDialog { break; } + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); dispose(); }//GEN-LAST:event_bnOkActionPerformed @@ -620,71 +491,27 @@ public class EamDbSettingsDialog extends JDialog { dispose(); }//GEN-LAST:event_bnCancelActionPerformed - private void rdioBnDisabledActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rdioBnDisabledActionPerformed - selectedPlatform = EamDbPlatformEnum.DISABLED; - testingStatus = DatabaseTestResult.TESTEDOK; - updateSqliteFields(false); - updatePostgresFields(false); - }//GEN-LAST:event_rdioBnDisabledActionPerformed + private void cbDatabaseTypeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbDatabaseTypeActionPerformed + selectedPlatform = (EamDbPlatformEnum) cbDatabaseType.getSelectedItem(); + customizeComponents(); + }//GEN-LAST:event_cbDatabaseTypeActionPerformed - - private void rdioBnPostgreSQLActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rdioBnPostgreSQLActionPerformed - selectedPlatform = EamDbPlatformEnum.POSTGRESQL; - testingStatus = DatabaseTestResult.UNTESTED; - - updateSqliteFields(false); - updatePostgresFields(true); - }//GEN-LAST:event_rdioBnPostgreSQLActionPerformed - - private void rdioBnSQLiteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rdioBnSQLiteActionPerformed - selectedPlatform = EamDbPlatformEnum.SQLITE; - testingStatus = DatabaseTestResult.UNTESTED; - - updateSqliteFields(true); - updatePostgresFields(false); - - }//GEN-LAST:event_rdioBnSQLiteActionPerformed - - private void tfDatabasePathFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_tfDatabasePathFocusLost - String fullPath = tfDatabasePath.getText(); - if (!fullPath.endsWith(".db")) { - fullPath = fullPath + ".db"; // NON-NLS - } - tfDatabasePath.setText(fullPath); - }//GEN-LAST:event_tfDatabasePathFocusLost - - /** - * Update the fields for the Postgres platform depending on whether the - * Postgres radioButton is enabled. - * - * @param enabled - */ - private void updatePostgresFields(boolean enabled) { - tbDbHostname.setText(enabled ? dbSettingsPostgres.getHost() : ""); - tbDbHostname.setEnabled(enabled); - tbDbPort.setText(enabled ? Integer.toString(dbSettingsPostgres.getPort()) : ""); - tbDbPort.setEnabled(enabled); - tbDbName.setText(enabled ? dbSettingsPostgres.getDbName() : ""); - tbDbName.setEnabled(enabled); - tbDbUsername.setText(enabled ? dbSettingsPostgres.getUserName() : ""); - tbDbUsername.setEnabled(enabled); - jpDbPassword.setText(enabled ? dbSettingsPostgres.getPassword() : ""); - jpDbPassword.setEnabled(enabled); + private void displayDatabaseSettings(boolean isPostgres) { + lbDatabasePath.setVisible(!isPostgres); + tfDatabasePath.setVisible(!isPostgres); + lbSingleUserSqLite.setVisible(!isPostgres); + bnDatabasePathFileOpen.setVisible(!isPostgres); + lbHostName.setVisible(isPostgres); + tbDbHostname.setVisible(isPostgres); + lbPort.setVisible(isPostgres); + tbDbPort.setVisible(isPostgres); + lbUserName.setVisible(isPostgres); + tbDbUsername.setVisible(isPostgres); + lbUserPassword.setVisible(isPostgres); + jpDbPassword.setVisible(isPostgres); } - - /** - * Update the fields for the SQLite platform depending on whether the - * SQLite radioButton is enabled. - * - * @param enabled - */ - private void updateSqliteFields(boolean enabled) { - tfDatabasePath.setText(enabled ? dbSettingsSqlite.getFileNameWithPath() : ""); - tfDatabasePath.setEnabled(enabled); - bnDatabasePathFileOpen.setEnabled(enabled); - } - + /** * Add text prompts to all of the text fields. */ @@ -697,11 +524,33 @@ public class EamDbSettingsDialog extends JDialog { Collection textPrompts = new ArrayList<>(); textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_hostnameOrIP(), tbDbHostname)); textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_port(), tbDbPort)); - textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_dbName(), tbDbName)); textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_user(), tbDbUsername)); configureTextPrompts(textPrompts); } + private void updatePostgresFields(boolean enabled) { + tbDbHostname.setText(enabled ? dbSettingsPostgres.getHost() : ""); + tbDbHostname.setEnabled(enabled); + tbDbPort.setText(enabled ? Integer.toString(dbSettingsPostgres.getPort()) : ""); + tbDbPort.setEnabled(enabled); + tbDbUsername.setText(enabled ? dbSettingsPostgres.getUserName() : ""); + tbDbUsername.setEnabled(enabled); + jpDbPassword.setText(enabled ? dbSettingsPostgres.getPassword() : ""); + jpDbPassword.setEnabled(enabled); + } + + /** + * Update the fields for the SQLite platform depending on whether the SQLite + * radioButton is enabled. + * + * @param enabled + */ + private void updateSqliteFields(boolean enabled) { + tfDatabasePath.setText(enabled ? dbSettingsSqlite.getDbDirectory() : ""); + tfDatabasePath.setEnabled(enabled); + bnDatabasePathFileOpen.setEnabled(enabled); + } + /** * Register for notifications when the text boxes get updated. */ @@ -709,7 +558,7 @@ public class EamDbSettingsDialog extends JDialog { textBoxes.add(tfDatabasePath); textBoxes.add(tbDbHostname); textBoxes.add(tbDbPort); - textBoxes.add(tbDbName); + // textBoxes.add(tbDbName); textBoxes.add(tbDbUsername); textBoxes.add(jpDbPassword); addDocumentListeners(textBoxes, textBoxChangedListener); @@ -754,19 +603,18 @@ public class EamDbSettingsDialog extends JDialog { case POSTGRESQL: result = !tbDbHostname.getText().trim().isEmpty() && !tbDbPort.getText().trim().isEmpty() - && !tbDbName.getText().trim().isEmpty() + // && !tbDbName.getText().trim().isEmpty() && !tbDbUsername.getText().trim().isEmpty() && 0 < jpDbPassword.getPassword().length; break; - + case SQLITE: result = !tfDatabasePath.getText().trim().isEmpty(); break; } - + if (!result) { - setGuidanceMessage(Bundle.EamDbSettingsDialog_validation_incompleteFields(), true); } return result; @@ -808,7 +656,7 @@ public class EamDbSettingsDialog extends JDialog { } try { - dbSettingsPostgres.setDbName(tbDbName.getText().trim()); + dbSettingsPostgres.setDbName(CENTRAL_REPO_DB_NAME); } catch (EamDbException ex) { guidanceText.append(ex.getMessage()); result = false; @@ -831,8 +679,8 @@ public class EamDbSettingsDialog extends JDialog { case SQLITE: try { File databasePath = new File(tfDatabasePath.getText()); - dbSettingsSqlite.setDbName(databasePath.getName()); - dbSettingsSqlite.setDbDirectory(databasePath.getParent()); + dbSettingsSqlite.setDbName(CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT); + dbSettingsSqlite.setDbDirectory(databasePath.getPath()); } catch (EamDbException ex) { guidanceText.append(ex.getMessage()); result = false; @@ -840,7 +688,6 @@ public class EamDbSettingsDialog extends JDialog { break; } - setGuidanceMessage(guidanceText.toString(), true); return result; } @@ -850,65 +697,26 @@ public class EamDbSettingsDialog extends JDialog { * @return true if it's okay, false otherwise. */ private boolean valid() { - taSetupGuidance.setText(""); - return enableTestButton(checkFields()) - && enableCreateButton() - && enableOkButton(); + return enableOkButton(checkFields()); } /** - * Enable the "Test" button once all fields are valid. - * - * @return true - */ - @Messages({"EamDbSettingsDialog.validation.mustTest=Once you are statisfied with the database settings, click the Test button to test the database connection, settings, and schema. SQLite should only be used by one examiner at a time.", - "EamDbSettingsDialog.validation.failedConnection=The connection to the database failed. Update the settings and try the Test again."}) - private boolean enableTestButton(boolean isValidInput) { - if (selectedPlatform != EamDbPlatformEnum.DISABLED && isValidInput) { - bnTest.setEnabled(true); - if (testingStatus == DatabaseTestResult.UNTESTED) { - setGuidanceMessage(Bundle.EamDbSettingsDialog_validation_mustTest(), false); - } else if (testingStatus == DatabaseTestResult.CONNECTION_FAILED) { - setGuidanceMessage(Bundle.EamDbSettingsDialog_validation_failedConnection(), true); - } - } else { - bnTest.setEnabled(false); - } - return true; - } - - /** - * Enable the "Create" button if the db is not created. - * - * @return true if db is created, else false - */ - @Messages({"EamDbSettingsDialog.validation.dbNotCreated=The database does not exist. Click the Create button to create and initialize the database."}) - private boolean enableCreateButton() { - if (testingStatus == DatabaseTestResult.SCHEMA_INVALID) { - bnCreateDb.setEnabled(true); - setGuidanceMessage(Bundle.EamDbSettingsDialog_validation_dbNotCreated(), false); - } else { - bnCreateDb.setEnabled(false); - } - return true; - } - - /** - * Enable the "OK" button if the db test passed. Disabled defaults to db test passed. - * + * 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() { - if (testingStatus == DatabaseTestResult.TESTEDOK || selectedPlatform == EamDbPlatformEnum.DISABLED) { + private boolean enableOkButton(boolean isValidInput) { + if (isValidInput) { bnOk.setEnabled(true); - setGuidanceMessage(Bundle.EamDbSettingsDialog_validation_finished(), false); } 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. @@ -918,7 +726,6 @@ public class EamDbSettingsDialog extends JDialog { @Override public void changedUpdate(DocumentEvent e) { firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); - clearIcons(); testingStatus = DatabaseTestResult.UNTESTED; valid(); } @@ -926,7 +733,6 @@ public class EamDbSettingsDialog extends JDialog { @Override public void insertUpdate(DocumentEvent e) { firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); - clearIcons(); testingStatus = DatabaseTestResult.UNTESTED; valid(); } @@ -934,48 +740,37 @@ public class EamDbSettingsDialog extends JDialog { @Override public void removeUpdate(DocumentEvent e) { firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); - clearIcons(); testingStatus = DatabaseTestResult.UNTESTED; valid(); + } } - + private enum DatabaseTestResult { UNTESTED, CONNECTION_FAILED, SCHEMA_INVALID, - TESTEDOK; + TESTEDOK; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton bnCancel; - private javax.swing.JButton bnCreateDb; private javax.swing.JButton bnDatabasePathFileOpen; private javax.swing.ButtonGroup bnGrpDatabasePlatforms; private javax.swing.JButton bnOk; - private javax.swing.JButton bnTest; + private javax.swing.JComboBox cbDatabaseType; private javax.swing.JFileChooser fcDatabasePath; - private javax.swing.JScrollPane jScrollPane1; private javax.swing.JPasswordField jpDbPassword; - private javax.swing.JLabel lbCreateIcon; - private javax.swing.JLabel lbDatabaseName; private javax.swing.JLabel lbDatabasePath; + private javax.swing.JLabel lbDatabaseType; private javax.swing.JLabel lbHostName; private javax.swing.JLabel lbPort; - private javax.swing.JLabel lbTestIcon; + private javax.swing.JLabel lbSingleUserSqLite; private javax.swing.JLabel lbUserName; private javax.swing.JLabel lbUserPassword; private javax.swing.JPanel pnButtons; - private javax.swing.JPanel pnDatabaseConnectionSettings; - private javax.swing.JPanel pnPostgreSQLSettings; private javax.swing.JPanel pnSQLiteSettings; - private javax.swing.JPanel pnSetupGuidance; - private javax.swing.JRadioButton rdioBnDisabled; - private javax.swing.JRadioButton rdioBnPostgreSQL; - private javax.swing.JRadioButton rdioBnSQLite; - private javax.swing.JTextArea taSetupGuidance; private javax.swing.JTextField tbDbHostname; - private javax.swing.JTextField tbDbName; private javax.swing.JTextField tbDbPort; private javax.swing.JTextField tbDbUsername; private javax.swing.JTextField tfDatabasePath; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form index ec0056d904..2e87f1d5a4 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form @@ -25,6 +25,10 @@ + + + + @@ -33,13 +37,14 @@ - + + - + @@ -240,5 +245,15 @@ + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java index d6e5873319..c0be22bf90 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java @@ -29,6 +29,8 @@ import org.sleuthkit.autopsy.events.AutopsyEvent; import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbPlatformEnum; +import static org.sleuthkit.autopsy.centralrepository.datamodel.EamDbPlatformEnum.DISABLED; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbUtil; import org.sleuthkit.autopsy.centralrepository.datamodel.PostgresEamDbSettings; import org.sleuthkit.autopsy.centralrepository.datamodel.SqliteEamDbSettings; @@ -53,7 +55,8 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i addIngestJobEventsListener(); } - @Messages({"GlobalSettingsPanel.title=Central Repository Settings"}) + @Messages({"GlobalSettingsPanel.title=Central Repository Settings", + "GlobalSettingsPanel.cbUseCentralRepo.text=Use a Central Repository"}) private void customizeComponents() { setName(Bundle.GlobalSettingsPanel_title()); } @@ -85,6 +88,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i bnManageTags = new javax.swing.JButton(); bnManageTypes = new javax.swing.JButton(); tbOops = new javax.swing.JTextField(); + cbUseCentralRepo = new javax.swing.JCheckBox(); setName(""); // NOI18N @@ -198,6 +202,13 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i tbOops.setText(org.openide.util.NbBundle.getMessage(GlobalSettingsPanel.class, "GlobalSettingsPanel.tbOops.text")); // NOI18N tbOops.setBorder(null); + org.openide.awt.Mnemonics.setLocalizedText(cbUseCentralRepo, org.openide.util.NbBundle.getMessage(GlobalSettingsPanel.class, "GlobalSettingsPanel.cbUseCentralRepo.text")); // NOI18N + cbUseCentralRepo.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbUseCentralRepoActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -207,50 +218,65 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(pnDatabaseContentButtons, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(tbOops, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(pnDatabaseConfiguration, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(pnDatabaseConfiguration, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(cbUseCentralRepo, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addContainerGap() + .addComponent(cbUseCentralRepo) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(pnDatabaseConfiguration, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(tbOops, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(pnDatabaseContentButtons, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 18, Short.MAX_VALUE)) + .addContainerGap()) ); }// //GEN-END:initComponents private void bnImportDatabaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnImportDatabaseActionPerformed + store(); ImportHashDatabaseDialog dialog = new ImportHashDatabaseDialog(); firePropertyChange(OptionsPanelController.PROP_VALID, null, null); }//GEN-LAST:event_bnImportDatabaseActionPerformed private void bnManageTagsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnManageTagsActionPerformed + store(); ManageTagsDialog dialog = new ManageTagsDialog(); firePropertyChange(OptionsPanelController.PROP_VALID, null, null); }//GEN-LAST:event_bnManageTagsActionPerformed private void bnManageTypesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnManageTypesActionPerformed + store(); ManageCorrelationPropertiesDialog dialog = new ManageCorrelationPropertiesDialog(); firePropertyChange(OptionsPanelController.PROP_VALID, null, null); }//GEN-LAST:event_bnManageTypesActionPerformed private void bnDbConfigureActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDbConfigureActionPerformed + store(); EamDbSettingsDialog dialog = new EamDbSettingsDialog(); load(); // reload db settings content and update buttons }//GEN-LAST:event_bnDbConfigureActionPerformed + private void cbUseCentralRepoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbUseCentralRepoActionPerformed + //if saved setting is disabled checkbox should be disabled already + enableDatabaseConfigureButton(cbUseCentralRepo.isSelected()); + enableButtonSubComponents(cbUseCentralRepo.isSelected() && !EamDbPlatformEnum.getSelectedPlatform().equals(DISABLED)); + this.ingestStateUpdated(); + firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); + }//GEN-LAST:event_cbUseCentralRepoActionPerformed + @Override @Messages({"GlobalSettingsPanel.validationerrMsg.mustConfigure=Configure the database to enable this module."}) public void load() { tbOops.setText(""); - enableAllSubComponents(false); EamDbPlatformEnum selectedPlatform = EamDbPlatformEnum.getSelectedPlatform(); - + cbUseCentralRepo.setSelected(EamDbUtil.useCentralRepo()); // NON-NLS switch (selectedPlatform) { case POSTGRESQL: PostgresEamDbSettings dbSettingsPg = new PostgresEamDbSettings(); @@ -270,16 +296,16 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i lbDbPlatformValue.setText(EamDbPlatformEnum.DISABLED.toString()); lbDbNameValue.setText(""); lbDbLocationValue.setText(""); - enableDatabaseConfigureButton(true); + enableDatabaseConfigureButton(cbUseCentralRepo.isSelected()); tbOops.setText(Bundle.GlobalSettingsPanel_validationerrMsg_mustConfigure()); break; } - this.ingestStateUpdated(); } @Override public void store() { // Click OK or Apply on Options Panel + EamDbUtil.setUseCentralRepo(cbUseCentralRepo.isSelected()); } /** @@ -293,6 +319,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i @Override public void saveSettings() { // Click OK on Global Settings Panel + store(); } @Override @@ -334,7 +361,10 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i if (IngestManager.getInstance().isIngestRunning()) { tbOops.setText(Bundle.GlobalSettingsPanel_validationErrMsg_ingestRunning()); - enableAllSubComponents(false); + cbUseCentralRepo.setEnabled(false); + } else if (!cbUseCentralRepo.isEnabled()) { + cbUseCentralRepo.setEnabled(true); + load(); } } @@ -347,8 +377,8 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i * @return True */ private boolean enableAllSubComponents(Boolean enable) { - enableDatabaseConfigureButton(enable); - enableButtonSubComponents(enable); + enableDatabaseConfigureButton(cbUseCentralRepo.isSelected() && enable); + enableButtonSubComponents(cbUseCentralRepo.isSelected() && enable); return true; } @@ -359,9 +389,18 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i * * @return True */ - private boolean enableDatabaseConfigureButton(Boolean enable) { - bnDbConfigure.setEnabled(enable); - return true; + private void enableDatabaseConfigureButton(Boolean enable) { + boolean ingestRunning = IngestManager.getInstance().isIngestRunning(); + pnDatabaseConfiguration.setEnabled(enable && !ingestRunning); + pnDatabaseContentButtons.setEnabled(enable && !ingestRunning); + bnDbConfigure.setEnabled(enable && !ingestRunning); + lbDbLocationLabel.setEnabled(enable && !ingestRunning); + lbDbLocationValue.setEnabled(enable && !ingestRunning); + lbDbNameLabel.setEnabled(enable && !ingestRunning); + lbDbNameValue.setEnabled(enable && !ingestRunning); + lbDbPlatformTypeLabel.setEnabled(enable && !ingestRunning); + lbDbPlatformValue.setEnabled(enable && !ingestRunning); + tbOops.setEnabled(enable && !ingestRunning); } /** @@ -373,9 +412,10 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i * @return True */ private boolean enableButtonSubComponents(Boolean enable) { - bnManageTypes.setEnabled(enable); - bnImportDatabase.setEnabled(enable); - bnManageTags.setEnabled(enable); + boolean ingestRunning = IngestManager.getInstance().isIngestRunning(); + bnManageTypes.setEnabled(enable && !ingestRunning); + bnImportDatabase.setEnabled(enable && !ingestRunning); + bnManageTags.setEnabled(enable && !ingestRunning); return true; } @@ -384,6 +424,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i private javax.swing.JButton bnImportDatabase; private javax.swing.JButton bnManageTags; private javax.swing.JButton bnManageTypes; + private javax.swing.JCheckBox cbUseCentralRepo; private javax.swing.JLabel lbDbLocationLabel; private javax.swing.JLabel lbDbLocationValue; private javax.swing.JLabel lbDbNameLabel;