Batch processing

Updates to support batch processing control
This commit is contained in:
Douglas Gillespie 2023-03-01 16:43:08 +00:00
parent 5f9d29e131
commit 16e8184a23
5 changed files with 85 additions and 15 deletions

View File

@ -460,8 +460,6 @@ final public class PamModel implements PamModelInterface, PamSettings {
mi.setModulesMenuGroup(utilitiesGroup); mi.setModulesMenuGroup(utilitiesGroup);
mi.setMaxNumber(1); mi.setMaxNumber(1);
/* /*
* ************* End Utilities Group ******************* * ************* End Utilities Group *******************
*/ */

View File

@ -5,6 +5,7 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
@ -49,6 +50,14 @@ public abstract class DataBlockTableView<T extends PamDataUnit> {
private SwingTableColumnWidths columnWidths; private SwingTableColumnWidths columnWidths;
/**
* Most work will run off a copy of the data.
* Makes it easier to include data selectors, etc.
*/
private ArrayList<T> dataUnitCopy;
private Object copySynch = new Object();
public DataBlockTableView(PamDataBlock<T> pamDataBlock, String displayName) { public DataBlockTableView(PamDataBlock<T> pamDataBlock, String displayName) {
this.pamDataBlock = pamDataBlock; this.pamDataBlock = pamDataBlock;
this.displayName = displayName; this.displayName = displayName;
@ -141,6 +150,9 @@ public abstract class DataBlockTableView<T extends PamDataUnit> {
String tip = null; String tip = null;
java.awt.Point p = e.getPoint(); java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p); int rowIndex = rowAtPoint(p);
if (rowIndex < 0) {
return null;
}
int colIndex = columnAtPoint(p); int colIndex = columnAtPoint(p);
int realColumnIndex = convertColumnIndexToModel(colIndex); int realColumnIndex = convertColumnIndexToModel(colIndex);
T dataUnit = getDataUnit(rowIndex); T dataUnit = getDataUnit(rowIndex);
@ -201,10 +213,14 @@ public abstract class DataBlockTableView<T extends PamDataUnit> {
* @return data unit for the table row. * @return data unit for the table row.
*/ */
private final T getDataUnit(int tableRow) { private final T getDataUnit(int tableRow) {
synchronized (pamDataBlock.getSynchLock()) { synchronized (copySynch) {
int rowIndex = getDataIndexForRow(tableRow); int rowIndex = getDataIndexForRow(tableRow);
if (rowIndex < 0) return null; if (rowIndex < 0) return null;
return pamDataBlock.getDataUnit(rowIndex, PamDataBlock.REFERENCE_CURRENT); if (dataUnitCopy == null) {
return null;
}
return dataUnitCopy.get(tableRow);
// return pamDataBlock.getDataUnit(rowIndex, PamDataBlock.REFERENCE_CURRENT);
} }
} }
@ -212,10 +228,13 @@ public abstract class DataBlockTableView<T extends PamDataUnit> {
* Get the number of rows in the table - default behaviour is the * Get the number of rows in the table - default behaviour is the
* number of rows in the datablock, but this may be overridded if * number of rows in the datablock, but this may be overridded if
* data are being selected in a different way. * data are being selected in a different way.
* @return numer of table rows to show. * @return number of table rows to show.
*/ */
public int getRowCount() { public int getRowCount() {
return pamDataBlock.getUnitsCount(); if (dataUnitCopy == null) {
return 0;
}
return dataUnitCopy.size();
} }
/** /**
@ -227,7 +246,10 @@ public abstract class DataBlockTableView<T extends PamDataUnit> {
* @return * @return
*/ */
public int getDataIndexForRow(int tableRow) { public int getDataIndexForRow(int tableRow) {
int nRow = pamDataBlock.getUnitsCount(); if (dataUnitCopy == null) {
return tableRow;
}
int nRow = dataUnitCopy.size();
if (!isViewer) { if (!isViewer) {
tableRow = nRow-tableRow-1; tableRow = nRow-tableRow-1;
} }
@ -244,12 +266,14 @@ public abstract class DataBlockTableView<T extends PamDataUnit> {
@Override @Override
public void addData(PamObservable o, PamDataUnit arg) { public void addData(PamObservable o, PamDataUnit arg) {
blockTableModel.fireTableDataChanged(); DataBlockTableView.this.updatePamData();
// blockTableModel.fireTableDataChanged();
} }
@Override @Override
public void updateData(PamObservable observable, PamDataUnit pamDataUnit) { public void updateData(PamObservable observable, PamDataUnit pamDataUnit) {
blockTableModel.fireTableDataChanged(); DataBlockTableView.this.updatePamData();
// blockTableModel.fireTableDataChanged();
} }
@Override @Override
@ -258,6 +282,15 @@ public abstract class DataBlockTableView<T extends PamDataUnit> {
} }
} }
private void updatePamData() {
synchronized (copySynch) {
dataUnitCopy = pamDataBlock.getDataCopy();
}
blockTableModel.fireTableDataChanged();
}
private class MouseAction extends MouseAdapter { private class MouseAction extends MouseAdapter {
/* (non-Javadoc) /* (non-Javadoc)
@ -304,7 +337,11 @@ public abstract class DataBlockTableView<T extends PamDataUnit> {
* @return Array of multiple rows selected. * @return Array of multiple rows selected.
*/ */
public T[] getMultipleSelectedRows() { public T[] getMultipleSelectedRows() {
synchronized(pamDataBlock.getSynchLock()) { if (dataUnitCopy == null) {
return null;
}
// synchronized(pamDataBlock.getSynchLock()) { // synch not needed with data copy.
synchronized (copySynch) {
int[] selRows = testTable.getSelectedRows(); int[] selRows = testTable.getSelectedRows();
if (selRows == null) { if (selRows == null) {
return null; return null;
@ -337,12 +374,14 @@ public abstract class DataBlockTableView<T extends PamDataUnit> {
@Override @Override
public void scrollValueChanged(AbstractPamScroller abstractPamScroller) { public void scrollValueChanged(AbstractPamScroller abstractPamScroller) {
blockTableModel.fireTableDataChanged(); // blockTableModel.fireTableDataChanged();
updatePamData();
} }
@Override @Override
public void scrollRangeChanged(AbstractPamScroller pamScroller) { public void scrollRangeChanged(AbstractPamScroller pamScroller) {
blockTableModel.fireTableDataChanged(); // blockTableModel.fireTableDataChanged();
updatePamData();
} }
} }

View File

@ -13,7 +13,7 @@ import PamUtils.PamCalendar;
* tables. Also used to prepare Sql statements for writing and * tables. Also used to prepare Sql statements for writing and
* reading back data. * reading back data.
* *
* I did a bit of redifining what columns are used for on 4 Oct, 2012. * I did a bit of redefining what columns are used for on 4 Oct, 2012.
* PCLocalTime was a UTC time from the PC of the time analysis took place. * PCLocalTime was a UTC time from the PC of the time analysis took place.
* When running in real time, this would be the same as the data in the UTC column * When running in real time, this would be the same as the data in the UTC column
* (give or take the odd second for data to get through the system). I've now defined * (give or take the odd second for data to get through the system). I've now defined

View File

@ -225,7 +225,10 @@ public class PamTableItem implements Cloneable {
// } // }
public String getDeblankedStringValue() { public String getDeblankedStringValue() {
if (sqlType != Types.CHAR || value == null) { // if (sqlType != Types.CHAR || value == null) {
// return null;
// }
if (value instanceof String == false) {
return null; return null;
} }
return ((String) value).trim(); return ((String) value).trim();

View File

@ -103,7 +103,10 @@ public class SqliteSystem extends DBSystem implements PamSettings {
if (commandName == null) { if (commandName == null) {
return; return;
} }
setDatabaseName(commandName); File commandFile = new File(commandName);
// check the file end is of the right type. Some batch systems may not get this right.
commandFile = PamFileFilter.checkFileEnd(commandFile, "sqlite3", true);
setDatabaseName(commandFile.getAbsolutePath());
} }
/** /**
@ -303,6 +306,30 @@ public class SqliteSystem extends DBSystem implements PamSettings {
return true; return true;
} }
@Override
public boolean checkDatabaseExists(String dbName) {
String commandName = GlobalArguments.getParam(DBControl.GlobalDatabaseNameArg);
if (commandName != null) {
return checkCommandLineDatabase();
}
return super.checkDatabaseExists(dbName);
}
private boolean checkCommandLineDatabase() {
String commandName = GlobalArguments.getParam(DBControl.GlobalDatabaseNameArg);
if (commandName == null) {
return false;
}
File dbFile = new File(commandName);
dbFile = PamFileFilter.checkFileEnd(dbFile, ".sqlite3", true);
commandName = dbFile.getAbsolutePath();
if (dbFile.exists() == false) {
// create a new database without asking.
createNewDatabase(commandName);
}
return dbFile.exists();
}
@Override @Override
public String getDatabaseName() { public String getDatabaseName() {
/* /*
@ -311,6 +338,9 @@ public class SqliteSystem extends DBSystem implements PamSettings {
*/ */
String commandName = GlobalArguments.getParam(DBControl.GlobalDatabaseNameArg); String commandName = GlobalArguments.getParam(DBControl.GlobalDatabaseNameArg);
if (commandName != null) { if (commandName != null) {
File dbFile = new File(commandName);
dbFile = PamFileFilter.checkFileEnd(dbFile, ".sqlite3", true);
commandName = dbFile.getAbsolutePath();
return commandName; return commandName;
} }