19 package org.sleuthkit.autopsy.centralrepository.optionspanel;
 
   21 import java.awt.Color;
 
   22 import java.awt.Cursor;
 
   24 import java.io.IOException;
 
   25 import java.util.ArrayList;
 
   26 import java.util.Collection;
 
   27 import java.util.logging.Level;
 
   28 import javax.swing.JDialog;
 
   29 import javax.swing.JFileChooser;
 
   30 import javax.swing.JFrame;
 
   31 import javax.swing.JOptionPane;
 
   32 import javax.swing.JTextField;
 
   33 import javax.swing.SwingUtilities;
 
   34 import javax.swing.event.DocumentEvent;
 
   35 import javax.swing.event.DocumentListener;
 
   36 import javax.swing.filechooser.FileFilter;
 
   37 import org.netbeans.spi.options.OptionsPanelController;
 
   38 import org.openide.util.NbBundle.Messages;
 
   39 import org.openide.windows.WindowManager;
 
   52 @SuppressWarnings(
"PMD.SingularField") 
 
   56     private static final String CENTRAL_REPO_DB_NAME = 
"central_repository";
 
   57     private static final String CENTRAL_REPO_SQLITE_EXT = 
".db";
 
   58     private static final long serialVersionUID = 1L;
 
   66     private boolean configurationChanged = 
false;
 
   71     @Messages({
"EamDbSettingsDialog.title.text=Central Repository Database Configuration",
 
   72         "EamDbSettingsDialog.lbSingleUserSqLite.text=SQLite should only be used by one examiner at a time.",
 
   73         "EamDbSettingsDialog.lbDatabaseType.text=Database Type :",
 
   74         "EamDbSettingsDialog.fcDatabasePath.title=Select location for central_repository.db"})
 
   77         super((JFrame) WindowManager.getDefault().getMainWindow(),
 
   78                 Bundle.EamDbSettingsDialog_title_text(),
 
   81         textBoxes = 
new ArrayList<>();
 
   91         fcDatabasePath.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
 
   92         fcDatabasePath.setAcceptAllFileFilterUsed(
false);
 
   93         fcDatabasePath.setDialogTitle(Bundle.EamDbSettingsDialog_fcDatabasePath_title());
 
   94         fcDatabasePath.setFileFilter(
new FileFilter() {
 
   96             public boolean accept(File pathname) {
 
   97                 if (pathname.isDirectory()) {
 
  100                 return pathname.getName().toLowerCase().equals((CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT).toLowerCase());
 
  104             public String getDescription() {
 
  105                 return "Directories and Central Repository databases";
 
  108         cbDatabaseType.setSelectedItem(selectedPlatform);
 
  109         customizeComponents();
 
  120     @SuppressWarnings(
"unchecked")
 
  122     private 
void initComponents() {
 
  124         bnGrpDatabasePlatforms = 
new javax.swing.ButtonGroup();
 
  125         fcDatabasePath = 
new javax.swing.JFileChooser();
 
  126         pnButtons = 
new javax.swing.JPanel();
 
  127         bnCancel = 
new javax.swing.JButton();
 
  128         bnOk = 
new javax.swing.JButton();
 
  129         pnSQLiteSettings = 
new javax.swing.JPanel();
 
  130         lbDatabasePath = 
new javax.swing.JLabel();
 
  131         tfDatabasePath = 
new javax.swing.JTextField();
 
  132         bnDatabasePathFileOpen = 
new javax.swing.JButton();
 
  133         lbHostName = 
new javax.swing.JLabel();
 
  134         tbDbHostname = 
new javax.swing.JTextField();
 
  135         lbPort = 
new javax.swing.JLabel();
 
  136         tbDbPort = 
new javax.swing.JTextField();
 
  137         lbUserName = 
new javax.swing.JLabel();
 
  138         tbDbUsername = 
new javax.swing.JTextField();
 
  139         lbUserPassword = 
new javax.swing.JLabel();
 
  140         jpDbPassword = 
new javax.swing.JPasswordField();
 
  141         cbDatabaseType = 
new javax.swing.JComboBox<>();
 
  142         lbSingleUserSqLite = 
new javax.swing.JLabel();
 
  143         lbDatabaseType = 
new javax.swing.JLabel();
 
  144         lbDatabaseDesc = 
new javax.swing.JLabel();
 
  145         lbFullDbPath = 
new javax.swing.JLabel();
 
  146         filler1 = 
new javax.swing.Box.Filler(
new java.awt.Dimension(0, 0), 
new java.awt.Dimension(0, 0), 
new java.awt.Dimension(0, 32767));
 
  148         setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
 
  150         org.openide.awt.Mnemonics.setLocalizedText(bnCancel, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.bnCancel.text")); 
 
  151         bnCancel.addActionListener(
new java.awt.event.ActionListener() {
 
  152             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  153                 bnCancelActionPerformed(evt);
 
  157         org.openide.awt.Mnemonics.setLocalizedText(bnOk, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.bnOk.text")); 
 
  158         bnOk.addActionListener(
new java.awt.event.ActionListener() {
 
  159             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  160                 bnOkActionPerformed(evt);
 
  164         javax.swing.GroupLayout pnButtonsLayout = 
new javax.swing.GroupLayout(pnButtons);
 
  165         pnButtons.setLayout(pnButtonsLayout);
 
  166         pnButtonsLayout.setHorizontalGroup(
 
  167             pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  168             .addGroup(pnButtonsLayout.createSequentialGroup()
 
  169                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  172                 .addComponent(bnCancel)
 
  175         pnButtonsLayout.setVerticalGroup(
 
  176             pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  177             .addGroup(pnButtonsLayout.createSequentialGroup()
 
  179                 .addGroup(pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  181                     .addComponent(bnCancel))
 
  185         pnSQLiteSettings.setBorder(javax.swing.BorderFactory.createEtchedBorder());
 
  187         org.openide.awt.Mnemonics.setLocalizedText(lbDatabasePath, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.lbDatabasePath.text")); 
 
  189         tfDatabasePath.setText(
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.tfDatabasePath.text")); 
 
  190         tfDatabasePath.setToolTipText(
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.tfDatabasePath.toolTipText")); 
 
  192         org.openide.awt.Mnemonics.setLocalizedText(bnDatabasePathFileOpen, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.bnDatabasePathFileOpen.text")); 
 
  193         bnDatabasePathFileOpen.addActionListener(
new java.awt.event.ActionListener() {
 
  194             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  195                 bnDatabasePathFileOpenActionPerformed(evt);
 
  199         org.openide.awt.Mnemonics.setLocalizedText(lbHostName, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.lbHostName.text")); 
 
  201         org.openide.awt.Mnemonics.setLocalizedText(lbPort, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.lbPort.text")); 
 
  203         org.openide.awt.Mnemonics.setLocalizedText(lbUserName, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.lbUserName.text")); 
 
  205         org.openide.awt.Mnemonics.setLocalizedText(lbUserPassword, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.lbUserPassword.text")); 
 
  207         cbDatabaseType.setModel(
new javax.swing.DefaultComboBoxModel<>(
new EamDbPlatformEnum[]{EamDbPlatformEnum.POSTGRESQL, EamDbPlatformEnum.SQLITE}));
 
  208         cbDatabaseType.addActionListener(
new java.awt.event.ActionListener() {
 
  209             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  210                 cbDatabaseTypeActionPerformed(evt);
 
  214         org.openide.awt.Mnemonics.setLocalizedText(lbSingleUserSqLite, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.lbSingleUserSqLite.text")); 
 
  216         org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseType, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.lbDatabaseType.text")); 
 
  218         org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseDesc, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.lbDatabaseDesc.text")); 
 
  220         org.openide.awt.Mnemonics.setLocalizedText(lbFullDbPath, 
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class, 
"EamDbSettingsDialog.lbFullDbPath.text")); 
 
  222         javax.swing.GroupLayout pnSQLiteSettingsLayout = 
new javax.swing.GroupLayout(pnSQLiteSettings);
 
  223         pnSQLiteSettings.setLayout(pnSQLiteSettingsLayout);
 
  224         pnSQLiteSettingsLayout.setHorizontalGroup(
 
  225             pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  226             .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
 
  228                 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  229                     .addComponent(lbHostName)
 
  230                     .addComponent(lbPort)
 
  231                     .addComponent(lbUserName)
 
  232                     .addComponent(lbDatabaseType)
 
  233                     .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, 
false)
 
  234                         .addComponent(lbDatabasePath, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  235                         .addComponent(lbUserPassword, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 
  236                     .addComponent(lbDatabaseDesc))
 
  238                 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  239                     .addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  240                     .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
 
  241                         .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  242                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  243                         .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE)
 
  245                     .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
 
  246                         .addComponent(tfDatabasePath)
 
  247                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  248                         .addComponent(bnDatabasePathFileOpen)
 
  250                     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnSQLiteSettingsLayout.createSequentialGroup()
 
  251                         .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 
  252                             .addComponent(tbDbHostname, javax.swing.GroupLayout.Alignment.LEADING)
 
  253                             .addComponent(jpDbPassword, javax.swing.GroupLayout.Alignment.LEADING)
 
  254                             .addComponent(tbDbUsername)
 
  255                             .addComponent(tbDbPort, javax.swing.GroupLayout.Alignment.LEADING))
 
  256                         .addGap(10, 10, 10))))
 
  257             .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
 
  259                 .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  260                 .addGap(0, 0, Short.MAX_VALUE))
 
  262         pnSQLiteSettingsLayout.setVerticalGroup(
 
  263             pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  264             .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
 
  266                 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  267                     .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  268                         .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  269                         .addComponent(lbSingleUserSqLite))
 
  270                     .addComponent(lbDatabaseType, javax.swing.GroupLayout.Alignment.TRAILING))
 
  271                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  272                 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  273                     .addComponent(lbDatabasePath)
 
  274                     .addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  275                     .addComponent(bnDatabasePathFileOpen))
 
  276                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  277                 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  278                     .addComponent(tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  279                     .addComponent(lbHostName))
 
  280                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  281                 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  282                     .addComponent(tbDbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  283                     .addComponent(lbPort))
 
  284                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  285                 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  286                     .addComponent(tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  287                     .addComponent(lbUserName))
 
  288                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  289                 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  290                     .addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  291                     .addComponent(lbUserPassword))
 
  292                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  293                 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  294                     .addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  295                     .addComponent(lbDatabaseDesc, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 
  296                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  297                 .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  301         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(getContentPane());
 
  302         getContentPane().setLayout(layout);
 
  303         layout.setHorizontalGroup(
 
  304             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  305             .addGroup(layout.createSequentialGroup()
 
  307                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  308                     .addComponent(pnButtons, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  309                     .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 
  312         layout.setVerticalGroup(
 
  313             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  314             .addGroup(layout.createSequentialGroup()
 
  316                 .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  317                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)
 
  318                 .addComponent(pnButtons, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  327         setTextBoxListeners();
 
  328         switch (selectedPlatform) {
 
  331                 updatePostgresFields(
false);
 
  332                 updateSqliteFields(
true);
 
  337                 updatePostgresFields(
true);
 
  338                 updateSqliteFields(
false);
 
  346         this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
 
  350     @Messages({
"EamDbSettingsDialog.chooserPath.failedToGetDbPathMsg=Selected database path is invalid. Try again."})
 
  352         fcDatabasePath.setSelectedFile(
new File(dbSettingsSqlite.
getDbDirectory()));
 
  353         if (fcDatabasePath.showOpenDialog(
this) == JFileChooser.APPROVE_OPTION) {
 
  354             File databaseFile = fcDatabasePath.getSelectedFile();
 
  355             if (databaseFile.isFile()) {
 
  356                 databaseFile = fcDatabasePath.getCurrentDirectory();
 
  359                 tfDatabasePath.setText(databaseFile.getCanonicalPath());
 
  361             } 
catch (IOException ex) {
 
  362                 logger.log(Level.SEVERE, 
"Failed to get path of selected database file", ex); 
 
  368         switch (selectedPlatform) {
 
  404     @Messages({
"EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Database",
 
  405         "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Database, please ensure location exists and you have write permissions and try again.",
 
  406         "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Database, please ensure address, port, and login credentials are correct for Postgres server and try again."})
 
  408         boolean result = 
false;
 
  409         boolean dbCreated = 
true;
 
  410         switch (selectedPlatform) {
 
  425                     JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
 
  426                             Bundle.EamDbSettingsDialog_okButton_createPostgresDbError_message(),
 
  427                             Bundle.EamDbSettingsDialog_okButton_createDbError_title(),
 
  428                             JOptionPane.WARNING_MESSAGE);
 
  429                     logger.severe(
"Unable to initialize database schema or insert contents into central repository.");
 
  446                     JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
 
  447                             Bundle.EamDbSettingsDialog_okButton_createSQLiteDbError_message(),
 
  448                             Bundle.EamDbSettingsDialog_okButton_createDbError_title(),
 
  449                             JOptionPane.WARNING_MESSAGE);
 
  450                     logger.severe(
"Unable to initialize database schema or insert contents into central repository.");
 
  466     boolean wasConfigurationChanged() {
 
  467         return configurationChanged;
 
  470     @Messages({
"EamDbSettingsDialog.okButton.errorTitle.text=Restart Required.",
 
  471         "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.",
 
  472         "EamDbSettingsDialog.okButton.connectionErrorMsg.text=Failed to connect to central repository database.",
 
  473         "EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error Loading Database",
 
  474         "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path (if applicable).",
 
  475         "EamDbSettingsDialog.okButton.createDbDialog.title=Database Does Not Exist",
 
  476         "EamDbSettingsDialog.okButton.createDbDialog.message=Database does not exist, would you like to create it?",
 
  477         "EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Database Connection Failed",
 
  478         "EamDbSettingsDialog.okButton.databaseConnectionFailed.message=Unable to connect to database please check your settings and try again."})
 
  480         setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
 
  483             JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
 
  484                     Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_message(),
 
  485                     Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_title(),
 
  486                     JOptionPane.WARNING_MESSAGE);
 
  489             JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
 
  490                     Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_message(),
 
  491                     Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_title(),
 
  492                     JOptionPane.WARNING_MESSAGE);
 
  495             if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(),
 
  496                     Bundle.EamDbSettingsDialog_okButton_createDbDialog_message(),
 
  497                     Bundle.EamDbSettingsDialog_okButton_createDbDialog_title(),
 
  498                     JOptionPane.YES_NO_OPTION)) {
 
  504             setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 
  518             if (null != previousDbManager) {
 
  523             logger.log(Level.SEVERE, 
"Failed to close database connections in previously selected platform.", ex); 
 
  524             SwingUtilities.invokeLater(() -> {
 
  525                 JOptionPane.showMessageDialog(
this,
 
  526                         Bundle.EamDbSettingsDialog_okButton_errorMsg_text(),
 
  527                         Bundle.EamDbSettingsDialog_okButton_errorTitle_text(),
 
  528                         JOptionPane.WARNING_MESSAGE);
 
  538         switch (selectedPlatform) {
 
  546                     configurationChanged = 
true;
 
  548                     logger.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); 
 
  549                     setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 
  561                     configurationChanged = 
true;
 
  563                     logger.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex);  
 
  564                     setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 
  572         setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
 
  583         customizeComponents();
 
  587         lbFullDbPath.setText(tfDatabasePath.getText() + File.separator + CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT);
 
  591         lbDatabasePath.setVisible(!isPostgres);
 
  592         tfDatabasePath.setVisible(!isPostgres);
 
  593         lbDatabaseDesc.setVisible(!isPostgres);
 
  594         lbFullDbPath.setVisible(!isPostgres);
 
  595         lbSingleUserSqLite.setVisible(!isPostgres);
 
  596         bnDatabasePathFileOpen.setVisible(!isPostgres);
 
  597         lbHostName.setVisible(isPostgres);
 
  598         tbDbHostname.setVisible(isPostgres);
 
  599         lbPort.setVisible(isPostgres);
 
  600         tbDbPort.setVisible(isPostgres);
 
  601         lbUserName.setVisible(isPostgres);
 
  602         tbDbUsername.setVisible(isPostgres);
 
  603         lbUserPassword.setVisible(isPostgres);
 
  604         jpDbPassword.setVisible(isPostgres);
 
  610     @Messages({
"EamDbSettingsDialog.textPrompt.hostnameOrIP=Hostname or IP Address",
 
  611         "EamDbSettingsDialog.textPrompt.port=Port Number",
 
  612         "EamDbSettingsDialog.textPrompt.dbName=Database Name",
 
  613         "EamDbSettingsDialog.textPrompt.user=Database User",
 
  614         "EamDbSettingsDialog.textPrompt.password=Database User's Password"})
 
  616         Collection<TextPrompt> textPrompts = 
new ArrayList<>();
 
  617         textPrompts.add(
new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_hostnameOrIP(), tbDbHostname));
 
  618         textPrompts.add(
new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_port(), tbDbPort));
 
  619         textPrompts.add(
new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_user(), tbDbUsername));
 
  620         configureTextPrompts(textPrompts);
 
  624         tbDbHostname.setText(enabled ? dbSettingsPostgres.
getHost() : 
"");
 
  625         tbDbHostname.setEnabled(enabled);
 
  626         tbDbPort.setText(enabled ? Integer.toString(dbSettingsPostgres.
getPort()) : 
"");
 
  627         tbDbPort.setEnabled(enabled);
 
  628         tbDbUsername.setText(enabled ? dbSettingsPostgres.
getUserName() : 
"");
 
  629         tbDbUsername.setEnabled(enabled);
 
  630         jpDbPassword.setText(enabled ? dbSettingsPostgres.
getPassword() : 
"");
 
  631         jpDbPassword.setEnabled(enabled);
 
  641         tfDatabasePath.setText(enabled ? dbSettingsSqlite.
getDbDirectory() : 
"");
 
  642         tfDatabasePath.setEnabled(enabled);
 
  643         bnDatabasePathFileOpen.setEnabled(enabled);
 
  650         textBoxes.add(tfDatabasePath);
 
  651         textBoxes.add(tbDbHostname);
 
  652         textBoxes.add(tbDbPort);
 
  654         textBoxes.add(tbDbUsername);
 
  655         textBoxes.add(jpDbPassword);
 
  656         addDocumentListeners(textBoxes, textBoxChangedListener);
 
  668             textPrompt.setForeground(Color.LIGHT_GRAY);
 
  669             textPrompt.changeAlpha(alpha);
 
  680         textFields.forEach((textField) -> {
 
  681             textField.getDocument().addDocumentListener(listener);
 
  691     @Messages({
"EamDbSettingsDialog.validation.incompleteFields=Fill in all values for the selected database."})
 
  693         boolean result = 
true;
 
  694         switch (selectedPlatform) {
 
  696                 result = !tbDbHostname.getText().trim().isEmpty()
 
  697                         && !tbDbPort.getText().trim().isEmpty()
 
  699                         && !tbDbUsername.getText().trim().isEmpty()
 
  700                         && 0 < jpDbPassword.getPassword().length;
 
  705                 result = !tfDatabasePath.getText().trim().isEmpty();
 
  721         return databaseFieldsArePopulated()
 
  722                 && databaseSettingsAreValid();
 
  731         boolean result = 
true;
 
  732         StringBuilder guidanceText = 
new StringBuilder();
 
  734         switch (selectedPlatform) {
 
  737                     dbSettingsPostgres.
setHost(tbDbHostname.getText().trim());
 
  739                     guidanceText.append(ex.getMessage());
 
  744                     dbSettingsPostgres.
setPort(Integer.valueOf(tbDbPort.getText().trim()));
 
  746                     guidanceText.append(ex.getMessage());
 
  751                     dbSettingsPostgres.
setDbName(CENTRAL_REPO_DB_NAME);
 
  753                     guidanceText.append(ex.getMessage());
 
  758                     dbSettingsPostgres.
setUserName(tbDbUsername.getText().trim());
 
  760                     guidanceText.append(ex.getMessage());
 
  765                     dbSettingsPostgres.
setPassword(
new String(jpDbPassword.getPassword()));
 
  767                     guidanceText.append(ex.getMessage());
 
  773                     File databasePath = 
new File(tfDatabasePath.getText());
 
  774                     dbSettingsSqlite.
setDbName(CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT);
 
  777                     guidanceText.append(ex.getMessage());
 
  792         return enableOkButton(checkFields());
 
  801     @Messages({
"EamDbSettingsDialog.validation.finished=Click OK to save your database settings and return to the Options. Or select a different database type."})
 
  804             bnOk.setEnabled(
true);
 
  806             bnOk.setEnabled(
false);
 
  820             firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  828             firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  836             firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  856     private javax.swing.JButton 
bnOk;
 
DatabaseTestResult testingStatus
boolean createDbDirectory()
javax.swing.JPasswordField jpDbPassword
boolean insertDefaultDatabaseContent()
void setHost(String host)
javax.swing.JLabel lbHostName
void shutdownConnections()
void displayDatabaseSettings(boolean isPostgres)
javax.swing.JTextField tbDbUsername
boolean insertDefaultDatabaseContent()
boolean verifyDatabaseSchema()
javax.swing.JTextField tbDbPort
final PostgresEamDbSettings dbSettingsPostgres
javax.swing.JPanel pnButtons
javax.swing.JButton bnCancel
final SqliteEamDbSettings dbSettingsSqlite
void setTextBoxListeners()
void bnDatabasePathFileOpenActionPerformed(java.awt.event.ActionEvent evt)
boolean verifyConnection()
javax.swing.JComboBox< EamDbPlatformEnum > cbDatabaseType
boolean initializeDatabaseSchema()
javax.swing.JLabel lbPort
javax.swing.JLabel lbFullDbPath
javax.swing.ButtonGroup bnGrpDatabasePlatforms
javax.swing.JFileChooser fcDatabasePath
javax.swing.JPanel pnSQLiteSettings
void removeUpdate(DocumentEvent e)
static void addDocumentListeners(Collection< JTextField > textFields, TextBoxChangedListener listener)
void updatePostgresFields(boolean enabled)
void setPassword(String password)
EamDbPlatformEnum selectedPlatform
javax.swing.JButton bnDatabasePathFileOpen
void bnOkActionPerformed(java.awt.event.ActionEvent evt)
void changedUpdate(DocumentEvent e)
boolean databaseSettingsAreValid()
static EamDb getInstance()
void bnCancelActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JLabel lbDatabaseDesc
javax.swing.Box.Filler filler1
boolean initializeDatabaseSchema()
final Collection< JTextField > textBoxes
boolean verifyDatabaseExists()
static void configureTextPrompts(Collection< TextPrompt > textPrompts)
boolean verifyDatabaseSchema()
void updateSqliteFields(boolean enabled)
void insertUpdate(DocumentEvent e)
javax.swing.JLabel lbUserPassword
boolean databaseFieldsArePopulated()
boolean verifyConnection()
void setUserName(String userName)
javax.swing.JLabel lbUserName
javax.swing.JLabel lbDatabasePath
void cbDatabaseTypeActionPerformed(java.awt.event.ActionEvent evt)
void setDbName(String dbName)
boolean enableOkButton(boolean isValidInput)
javax.swing.JLabel lbSingleUserSqLite
void setDbName(String dbName)
synchronized static Logger getLogger(String name)
javax.swing.JTextField tbDbHostname
final TextBoxChangedListener textBoxChangedListener
javax.swing.JLabel lbDatabaseType
void setDbDirectory(String dbDirectory)
boolean dbDirectoryExists()
javax.swing.JTextField tfDatabasePath
void customizeComponents()