19 package org.sleuthkit.autopsy.centralrepository.optionspanel;
21 import java.awt.Color;
22 import java.awt.Cursor;
23 import java.awt.Dimension;
24 import java.awt.Toolkit;
26 import java.io.IOException;
27 import java.util.ArrayList;
28 import java.util.Collection;
29 import java.util.logging.Level;
30 import javax.swing.JDialog;
31 import javax.swing.JFileChooser;
32 import javax.swing.JFrame;
33 import javax.swing.JOptionPane;
34 import javax.swing.JTextField;
35 import javax.swing.SwingUtilities;
36 import javax.swing.event.DocumentEvent;
37 import javax.swing.event.DocumentListener;
38 import javax.swing.filechooser.FileFilter;
39 import org.netbeans.spi.options.OptionsPanelController;
40 import org.openide.util.NbBundle.Messages;
41 import org.openide.windows.WindowManager;
73 @Messages({
"EamDbSettingsDialog.title.text=Central Repository Database Configuration",
74 "EamDbSettingsDialog.lbSingleUserSqLite.text=SQLite should only be used by one examiner at a time.",
75 "EamDbSettingsDialog.lbDatabaseType.text=Database Type :",
76 "EamDbSettingsDialog.fcDatabasePath.title=Select location for central_repository.db"})
79 super((JFrame) WindowManager.getDefault().getMainWindow(),
80 Bundle.EamDbSettingsDialog_title_text(),
83 textBoxes =
new ArrayList<>();
93 fcDatabasePath.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
95 fcDatabasePath.setDialogTitle(Bundle.EamDbSettingsDialog_fcDatabasePath_title());
98 public boolean accept(File pathname) {
99 if (pathname.isDirectory()) {
101 }
else if (pathname.getName().toLowerCase().equals((CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT).toLowerCase())) {
109 public String getDescription() {
110 return "Directories and central repository databases";
125 @SuppressWarnings(
"unchecked")
132 bnCancel =
new javax.swing.JButton();
133 bnOk =
new javax.swing.JButton();
140 lbPort =
new javax.swing.JLabel();
141 tbDbPort =
new javax.swing.JTextField();
151 filler1 =
new javax.swing.Box.Filler(
new java.awt.Dimension(0, 0),
new java.awt.Dimension(0, 0),
new java.awt.Dimension(0, 32767));
153 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
156 bnCancel.addActionListener(
new java.awt.event.ActionListener() {
157 public void actionPerformed(java.awt.event.ActionEvent evt) {
162 org.openide.awt.Mnemonics.setLocalizedText(
bnOk,
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class,
"EamDbSettingsDialog.bnOk.text"));
163 bnOk.addActionListener(
new java.awt.event.ActionListener() {
164 public void actionPerformed(java.awt.event.ActionEvent evt) {
169 javax.swing.GroupLayout pnButtonsLayout =
new javax.swing.GroupLayout(
pnButtons);
171 pnButtonsLayout.setHorizontalGroup(
172 pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
173 .addGroup(pnButtonsLayout.createSequentialGroup()
174 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
180 pnButtonsLayout.setVerticalGroup(
181 pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
182 .addGroup(pnButtonsLayout.createSequentialGroup()
184 .addGroup(pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
199 public void actionPerformed(java.awt.event.ActionEvent evt) {
206 org.openide.awt.Mnemonics.setLocalizedText(
lbPort,
org.openide.util.NbBundle.getMessage(
EamDbSettingsDialog.class,
"EamDbSettingsDialog.lbPort.text"));
213 cbDatabaseType.addActionListener(
new java.awt.event.ActionListener() {
214 public void actionPerformed(java.awt.event.ActionEvent evt) {
227 javax.swing.GroupLayout pnSQLiteSettingsLayout =
new javax.swing.GroupLayout(
pnSQLiteSettings);
229 pnSQLiteSettingsLayout.setHorizontalGroup(
230 pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
231 .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
233 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
237 .addComponent(
lbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)
238 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING,
false)
239 .addComponent(
lbDatabasePath, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
240 .addComponent(
lbUserPassword, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
241 .addComponent(
lbDatabaseDesc, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE))
243 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
244 .addComponent(
lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
245 .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
246 .addComponent(
cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
247 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
248 .addComponent(
lbSingleUserSqLite, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE)
250 .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
252 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
255 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnSQLiteSettingsLayout.createSequentialGroup()
256 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
257 .addComponent(
tbDbHostname, javax.swing.GroupLayout.Alignment.LEADING)
258 .addComponent(
jpDbPassword, javax.swing.GroupLayout.Alignment.LEADING)
260 .addComponent(
tbDbPort, javax.swing.GroupLayout.Alignment.LEADING))
261 .addGap(10, 10, 10))))
262 .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
264 .addComponent(
filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
265 .addGap(0, 0, Short.MAX_VALUE))
267 pnSQLiteSettingsLayout.setVerticalGroup(
268 pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
269 .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
271 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
272 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
273 .addComponent(
cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
275 .addComponent(
lbDatabaseType, javax.swing.GroupLayout.Alignment.TRAILING))
276 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
277 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
278 .addComponent(
lbDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
279 .addComponent(
tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
281 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
282 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
283 .addComponent(
tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
284 .addComponent(
lbHostName, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE))
285 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
286 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
287 .addComponent(
tbDbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
288 .addComponent(
lbPort, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
289 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
290 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
291 .addComponent(
tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
292 .addComponent(
lbUserName, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
293 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
294 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
295 .addComponent(
jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
296 .addComponent(
lbUserPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
297 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
298 .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
299 .addComponent(
lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
300 .addComponent(
lbDatabaseDesc, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
301 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
302 .addComponent(
filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
306 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(getContentPane());
307 getContentPane().setLayout(layout);
308 layout.setHorizontalGroup(
309 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
310 .addGroup(layout.createSequentialGroup()
312 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
313 .addComponent(
pnButtons, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
314 .addComponent(
pnSQLiteSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
317 layout.setVerticalGroup(
318 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
319 .addGroup(layout.createSequentialGroup()
321 .addComponent(
pnSQLiteSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
322 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)
323 .addComponent(
pnButtons, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
333 switch (selectedPlatform) {
351 Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
352 setLocation((screenDimension.width - getSize().width) / 2, (screenDimension.height - getSize().height) / 2);
356 @Messages({
"EamDbSettingsDialog.chooserPath.failedToGetDbPathMsg=Selected database path is invalid. Try again."})
359 if (
fcDatabasePath.showOpenDialog(
this) == JFileChooser.APPROVE_OPTION) {
361 if (databaseFile.isFile()) {
367 }
catch (IOException ex) {
368 LOGGER.log(Level.SEVERE,
"Failed to get path of selected database file", ex);
374 switch (selectedPlatform) {
410 @Messages({
"EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Database",
411 "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Database, please ensure location exists and you have write permissions and try again.",
412 "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Database, please ensure address, port, and login credentials are correct for Postgres server and try again."})
414 boolean result =
false;
415 boolean dbCreated =
true;
416 switch (selectedPlatform) {
431 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
432 Bundle.EamDbSettingsDialog_okButton_createPostgresDbError_message(),
433 Bundle.EamDbSettingsDialog_okButton_createDbError_title(),
434 JOptionPane.WARNING_MESSAGE);
435 LOGGER.severe(
"Unable to initialize database schema or insert contents into central repository.");
452 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
453 Bundle.EamDbSettingsDialog_okButton_createSQLiteDbError_message(),
454 Bundle.EamDbSettingsDialog_okButton_createDbError_title(),
455 JOptionPane.WARNING_MESSAGE);
456 LOGGER.severe(
"Unable to initialize database schema or insert contents into central repository.");
469 boolean wasConfigurationChanged() {
473 @Messages({
"EamDbSettingsDialog.okButton.errorTitle.text=Restart Required.",
474 "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.",
475 "EamDbSettingsDialog.okButton.connectionErrorMsg.text=Failed to connect to central repository database.",
476 "EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error Loading Database",
477 "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path (if applicable).",
478 "EamDbSettingsDialog.okButton.createDbDialog.title=Database Does Not Exist",
479 "EamDbSettingsDialog.okButton.createDbDialog.message=Database does not exist, would you like to create it?",
480 "EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Database Connection Failed",
481 "EamDbSettingsDialog.okButton.databaseConnectionFailed.message=Unable to connect to database please check your settings and try again."})
483 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
486 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
487 Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_message(),
488 Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_title(),
489 JOptionPane.WARNING_MESSAGE);
492 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
493 Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_message(),
494 Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_title(),
495 JOptionPane.WARNING_MESSAGE);
498 if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(),
499 Bundle.EamDbSettingsDialog_okButton_createDbDialog_message(),
500 Bundle.EamDbSettingsDialog_okButton_createDbDialog_title(),
501 JOptionPane.YES_NO_OPTION)) {
507 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
521 if (null != previousDbManager) {
526 LOGGER.log(Level.SEVERE,
"Failed to close database connections in previously selected platform.", ex);
527 SwingUtilities.invokeLater(() -> {
528 JOptionPane.showMessageDialog(null,
529 Bundle.EamDbSettingsDialog_okButton_errorMsg_text(),
530 Bundle.EamDbSettingsDialog_okButton_errorTitle_text(),
531 JOptionPane.WARNING_MESSAGE);
541 switch (selectedPlatform) {
549 configurationChanged =
true;
551 LOGGER.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex);
552 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
564 configurationChanged =
true;
566 LOGGER.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex);
567 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
575 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
602 lbPort.setVisible(isPostgres);
613 @Messages({
"EamDbSettingsDialog.textPrompt.hostnameOrIP=Hostname or IP Address",
614 "EamDbSettingsDialog.textPrompt.port=Port Number",
615 "EamDbSettingsDialog.textPrompt.dbName=Database Name",
616 "EamDbSettingsDialog.textPrompt.user=Database User",
617 "EamDbSettingsDialog.textPrompt.password=Database User's Password"})
619 Collection<TextPrompt> textPrompts =
new ArrayList<>();
621 textPrompts.add(
new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_port(),
tbDbPort));
629 tbDbPort.setText(enabled ? Integer.toString(dbSettingsPostgres.
getPort()) :
"");
671 textPrompt.setForeground(Color.LIGHT_GRAY);
672 textPrompt.changeAlpha(alpha);
683 textFields.forEach((textField) -> {
684 textField.getDocument().addDocumentListener(listener);
694 @Messages({
"EamDbSettingsDialog.validation.incompleteFields=Fill in all values for the selected database."})
696 boolean result =
true;
697 switch (selectedPlatform) {
700 && !
tbDbPort.getText().trim().isEmpty()
734 boolean result =
true;
735 StringBuilder guidanceText =
new StringBuilder();
737 switch (selectedPlatform) {
742 guidanceText.append(ex.getMessage());
747 dbSettingsPostgres.
setPort(Integer.valueOf(
tbDbPort.getText().trim()));
749 guidanceText.append(ex.getMessage());
754 dbSettingsPostgres.
setDbName(CENTRAL_REPO_DB_NAME);
756 guidanceText.append(ex.getMessage());
763 guidanceText.append(ex.getMessage());
770 guidanceText.append(ex.getMessage());
777 dbSettingsSqlite.
setDbName(CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT);
780 guidanceText.append(ex.getMessage());
804 @Messages({
"EamDbSettingsDialog.validation.finished=Click OK to save your database settings and return to the Options. Or select a different database type."})
807 bnOk.setEnabled(
true);
809 bnOk.setEnabled(
false);
823 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
831 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
839 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
859 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)
static final String CENTRAL_REPO_DB_NAME
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)
static final String CENTRAL_REPO_SQLITE_EXT
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()
static final Logger LOGGER
void updateSqliteFields(boolean enabled)
void insertUpdate(DocumentEvent e)
javax.swing.JLabel lbUserPassword
boolean databaseFieldsArePopulated()
boolean verifyConnection()
boolean configurationChanged
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
static final long serialVersionUID
void setDbDirectory(String dbDirectory)
boolean dbDirectoryExists()
javax.swing.JTextField tfDatabasePath
void customizeComponents()