Removed the db calls for the sql viewer from the edt

This commit is contained in:
Kelly Kelly 2021-05-24 14:31:06 -04:00
parent 775e28a99f
commit 917acfd1d2

View File

@ -32,11 +32,13 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.ExecutionException;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Level; import java.util.logging.Level;
import javax.swing.JComboBox; import javax.swing.JComboBox;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.filechooser.FileNameExtensionFilter;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
@ -71,6 +73,8 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
private int numRows; // num of rows in the selected table private int numRows; // num of rows in the selected table
private int currPage = 0; // curr page of rows being displayed private int currPage = 0; // curr page of rows being displayed
SwingWorker<?, ?> worker;
/** /**
* Constructs a file content viewer for SQLite database files. * Constructs a file content viewer for SQLite database files.
*/ */
@ -326,11 +330,17 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
@Override @Override
public void setFile(AbstractFile file) { public void setFile(AbstractFile file) {
WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); if (worker != null) {
sqliteDbFile = file; worker.cancel(true);
initReader(); worker = null;
processSQLiteFile(); }
WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); resetComponent();
if (file == null) {
return;
}
processSQLiteFile(file);
} }
@Override @Override
@ -367,25 +377,40 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
"SQLiteViewer.errorMessage.failedToQueryDatabase=The database tables in the file could not be read.", "SQLiteViewer.errorMessage.failedToQueryDatabase=The database tables in the file could not be read.",
"SQLiteViewer.errorMessage.failedToinitJDBCDriver=The JDBC driver for SQLite could not be loaded.", "SQLiteViewer.errorMessage.failedToinitJDBCDriver=The JDBC driver for SQLite could not be loaded.",
"# {0} - exception message", "SQLiteViewer.errorMessage.unexpectedError=An unexpected error occurred:\n{0).",}) "# {0} - exception message", "SQLiteViewer.errorMessage.unexpectedError=An unexpected error occurred:\n{0).",})
private void processSQLiteFile() { private void processSQLiteFile(final AbstractFile file) {
try {
tablesDropdownList.removeAllItems();
Collection<String> dbTablesMap = viewReader.getTableNames(); WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
if (dbTablesMap.isEmpty()) { worker = new SQLiteViewerWorker(file) {
tablesDropdownList.addItem(Bundle.SQLiteViewer_comboBox_noTableEntry()); @Override
tablesDropdownList.setEnabled(false); public void done() {
} else { if (isCancelled()) {
dbTablesMap.forEach((tableName) -> { return;
tablesDropdownList.addItem(tableName); }
});
WorkerResults results;
try {
results = get();
sqliteDbFile = file;
viewReader = results.getReader();
tablesDropdownList.removeAllItems();
Collection<String> dbTablesMap = results.getDbTablesMap();
if (dbTablesMap.isEmpty()) {
tablesDropdownList.addItem(Bundle.SQLiteViewer_comboBox_noTableEntry());
tablesDropdownList.setEnabled(false);
} else {
dbTablesMap.forEach((tableName) -> {
tablesDropdownList.addItem(tableName);
});
}
WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} catch (InterruptedException | ExecutionException ex) {
logger.log(Level.SEVERE, String.format("Failed to display SQL Viewer for file (%d)", file.getId()), ex);
}
} }
} catch (SQLiteTableReaderException ex) { };
logger.log(Level.WARNING, String.format("Unable to get table names "
+ "from sqlite file [%s] with id=[%d].", sqliteDbFile.getName(), worker.execute();
sqliteDbFile.getId(), ex.getMessage()));
MessageNotifyUtil.Message.error(Bundle.SQLiteViewer_errorMessage_failedToQueryDatabase());
}
} }
@NbBundle.Messages({"# {0} - tableName", @NbBundle.Messages({"# {0} - tableName",
@ -455,8 +480,8 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
* data type. For our use, we want to define an action when encountering * data type. For our use, we want to define an action when encountering
* column names and an action for all other data types. * column names and an action for all other data types.
*/ */
private void initReader() { private SQLiteTableReader initReader(AbstractFile sqliteFile) {
viewReader = new SQLiteTableReader.Builder(sqliteDbFile) return new SQLiteTableReader.Builder(sqliteFile)
.forAllColumnNames((columnName) -> { .forAllColumnNames((columnName) -> {
currentTableHeader.add(columnName); currentTableHeader.add(columnName);
}) })
@ -506,21 +531,44 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
"SQLiteViewer.exportTableToCsv.TableName=Table name: " "SQLiteViewer.exportTableToCsv.TableName=Table name: "
}) })
private void exportTableToCsv(File file) { private void exportTableToCsv(File file) {
File csvFile = new File(file.toString() + ".csv"); final File csvFile = new File(file.toString() + ".csv");
String tableName = (String) this.tablesDropdownList.getSelectedItem(); final String tableName = (String) this.tablesDropdownList.getSelectedItem();
try (FileOutputStream out = new FileOutputStream(csvFile, false)) {
try (SQLiteTableReader sqliteStream = new SQLiteTableReader.Builder(sqliteDbFile) SwingWorker<String, Void> csvWorker = new SwingWorker<String, Void>() {
.forAllColumnNames(getColumnNameCSVStrategy(out)) @Override
.forAllTableValues(getForAllCSVStrategy(out)).build()) { protected String doInBackground() throws Exception {
totalColumnCount = sqliteStream.getColumnCount(tableName); try (FileOutputStream out = new FileOutputStream(csvFile, false)) {
sqliteStream.read(tableName); try (SQLiteTableReader sqliteStream = new SQLiteTableReader.Builder(sqliteDbFile)
.forAllColumnNames(getColumnNameCSVStrategy(out))
.forAllTableValues(getForAllCSVStrategy(out)).build()) {
totalColumnCount = sqliteStream.getColumnCount(tableName);
sqliteStream.read(tableName);
}
} catch (IOException | SQLiteTableReaderException | RuntimeException ex) {
logger.log(Level.WARNING, String.format("Failed to export table [%s]"
+ " to CSV in sqlite file '%s' (objId=%d)", tableName, sqliteDbFile.getName(),
sqliteDbFile.getId()), ex.getMessage()); //NON-NLS
return Bundle.SQLiteViewer_exportTableToCsv_write_errText();
}
return "";
} }
} catch (IOException | SQLiteTableReaderException | RuntimeException ex) {
logger.log(Level.WARNING, String.format("Failed to export table [%s]" @Override
+ " to CSV in sqlite file '%s' (objId=%d)", tableName, sqliteDbFile.getName(), public void done() {
sqliteDbFile.getId()), ex.getMessage()); //NON-NLS try {
MessageNotifyUtil.Message.error(Bundle.SQLiteViewer_exportTableToCsv_write_errText()); String message = get();
} if (!message.isEmpty()) {
MessageNotifyUtil.Message.error(message);
}
} catch (InterruptedException | ExecutionException ex) {
logger.log(Level.SEVERE, "Failure occurred writing sql csv file.", ex);
}
}
};
csvWorker.execute();
} }
/** /**
@ -622,4 +670,49 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
public boolean isSupported(AbstractFile file) { public boolean isSupported(AbstractFile file) {
return true; return true;
} }
/**
* SwingWorker that will gather the data needed to display the given
* file in the SQL viewer.
*/
private class SQLiteViewerWorker extends SwingWorker<WorkerResults, Void> {
private final AbstractFile file;
SQLiteViewerWorker(AbstractFile file) {
this.file = file;
}
@Override
protected WorkerResults doInBackground() throws Exception {
SQLiteTableReader reader = initReader(file);
Collection<String> dbTablesMap = reader.getTableNames();
return new WorkerResults(reader, dbTablesMap);
}
}
/*
* Stores the data gather from the
*/
private class WorkerResults {
private final SQLiteTableReader reader;
private final Collection<String> dbTablesMap;
WorkerResults(SQLiteTableReader reader, Collection<String> dbTablesMap) {
this.reader = reader;
this.dbTablesMap = dbTablesMap;
}
SQLiteTableReader getReader() {
return reader;
}
Collection<String> getDbTablesMap() {
return dbTablesMap;
}
}
} }