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()