Updates to exporter

Getting export capability working in PAMGuard
Updated POM to use more up to date repository
This commit is contained in:
Jamie Mac 2024-05-24 11:30:01 +01:00
parent 7df04d58a2
commit bf20889743
20 changed files with 555 additions and 113 deletions

View File

@ -6,9 +6,8 @@
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk-21.0.2.13-hotspot"> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21">
<attributes> <attributes>
<attribute name="module" value="true"/>
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>

View File

@ -1,5 +1,6 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
encoding//src/rawDeepLearningClassifer/segmenter/SegmenterProcess.java=UTF-8 encoding//src/rawDeepLearningClassifer/segmenter/SegmenterProcess.java=UTF-8
encoding//src/test=UTF-8
encoding//src/test/resources=UTF-8 encoding//src/test/resources=UTF-8
encoding/<project>=UTF-8 encoding/<project>=UTF-8
encoding/src=UTF-8 encoding/src=UTF-8

View File

@ -1,9 +1,9 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=18 org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=18 org.eclipse.jdt.core.compiler.compliance=21
org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@ -13,4 +13,4 @@ org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=enabled org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=18 org.eclipse.jdt.core.compiler.source=21

14
pom.xml
View File

@ -270,14 +270,12 @@
</repository>--> </repository>-->
<!-- Repo for Renjin Script Engine --> <!-- Repo for Renjin Script Engine -->
<repository> <repository>
<snapshots> <id>bedatadriven</id>
<enabled>false</enabled> <name>bedatadriven public repo</name>
</snapshots> <url>https://nexus.bedatadriven.com/content/groups/public/</url>
<id>bedatadriven</id> </repository>
<name>bedatadriven_renjin</name>
<url>https://nexus.bedatadriven.com/content/groups/public/</url>
</repository>
<repository> <repository>
<snapshots> <snapshots>

View File

@ -100,6 +100,7 @@ import PamguardMVC.uid.UIDManager;
import PamguardMVC.uid.UIDOnlineManager; import PamguardMVC.uid.UIDOnlineManager;
import PamguardMVC.uid.UIDViewerManager; import PamguardMVC.uid.UIDViewerManager;
import binaryFileStorage.BinaryStore; import binaryFileStorage.BinaryStore;
import export.ExportOptions;
import PamguardMVC.debug.Debug; import PamguardMVC.debug.Debug;
/** /**
@ -2692,7 +2693,7 @@ public class PamController implements PamControllerInterface, PamSettings {
} }
/** /**
* Respond to storage options dialog. Selects whethere data * Respond to storage options dialog. Selects whether data
* are stored in binary, database or both * are stored in binary, database or both
* @param parentFrame * @param parentFrame
*/ */
@ -2700,6 +2701,16 @@ public class PamController implements PamControllerInterface, PamSettings {
StorageOptions.getInstance().showDialog(parentFrame); StorageOptions.getInstance().showDialog(parentFrame);
} }
/**
* Show export options tp export data to other formats
* @param parentFrame
*/
public void exportData(JFrame parentFrame) {
ExportOptions.getInstance().showDialog(parentFrame);
}
/** /**
* Return a verbose level for debug output * Return a verbose level for debug output
* @return a verbose level for debug output. * @return a verbose level for debug output.
@ -2941,4 +2952,6 @@ public class PamController implements PamControllerInterface, PamSettings {
return pamConfiguration; return pamConfiguration;
} }
} }

View File

@ -1,13 +1,17 @@
package PamView; package PamView;
import java.awt.Component; import java.awt.Component;
import java.awt.Container;
import java.awt.Shape; import java.awt.Shape;
import java.awt.geom.AffineTransform; import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D; import java.awt.geom.Line2D;
import java.awt.geom.PathIterator; import java.awt.geom.PathIterator;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Map;
import java.util.WeakHashMap;
import javax.swing.JComponent;
import javax.swing.JPanel; import javax.swing.JPanel;
/** /**
@ -19,22 +23,52 @@ public class PamAWTUtils {
/** /**
* Disable an entire swing panel including all child components. * Disable an entire swing panel including all child components.
* @param panel - the panel to disable * @param jComponent - the panel to disable
* @param isEnabled true if enabled. * @param isEnabled true if enabled.
*/ */
public static void setPanelEnabled(JPanel panel, Boolean isEnabled) { public static void setPanelEnabled(JComponent jComponent, Boolean isEnabled) {
panel.setEnabled(isEnabled); setPanelEnabled(jComponent, isEnabled? 1 :-1);
Component[] components = panel.getComponents();
for (Component component : components) {
if (component instanceof JPanel) {
setPanelEnabled((JPanel) component, isEnabled);
}
component.setEnabled(isEnabled);
}
} }
// private static final Map<Component, Integer> componentAvailability = new WeakHashMap<Component, Integer>();
public static void setMoreEnabled(Component component) {
setPanelEnabled(component, +1);
}
public static void setMoreDisabled(Component component) {
setPanelEnabled(component, -1);
}
// val = 1 for enabling, val = -1 for disabling
private static void setPanelEnabled(Component component, int val) {
if (component != null) {
// final Integer oldValObj = componentAvailability.get(component);
//
// final int oldVal = (oldValObj == null)
// ? 0
// : oldValObj;
//
// final int newVal = oldVal + val;
// componentAvailability.put(component, newVal);
int newVal = val;
if (newVal >= 0) {
component.setEnabled(true);
} else if (newVal < 0) {
component.setEnabled(false);
}
if (component instanceof Container) {
Container componentAsContainer = (Container) component;
for (Component c : componentAsContainer.getComponents()) {
setPanelEnabled(c,val);
}
}
}
}
/** /**
* Find the closest boundary of a shape to a point. * Find the closest boundary of a shape to a point.
* http://stackoverflow.com/questions/8103451/point-outside-of-area-which-is-closest-to-point-inside * http://stackoverflow.com/questions/8103451/point-outside-of-area-which-is-closest-to-point-inside

View File

@ -668,6 +668,13 @@ public class PamGui extends PamView implements WindowListener, PamSettings {
startMenuEnabler.addMenuItem(menuItem); startMenuEnabler.addMenuItem(menuItem);
fileMenu.add(menuItem); fileMenu.add(menuItem);
if (isViewer) {
menuItem = new JMenuItem("Export Data ...");
menuItem.addActionListener(new ExportData(getGuiFrame()));
startMenuEnabler.addMenuItem(menuItem);
fileMenu.add(menuItem);
}
for (int i = 0; i < pamControllerInterface.getNumControlledUnits(); i++) { for (int i = 0; i < pamControllerInterface.getNumControlledUnits(); i++) {
menuItem = pamControllerInterface.getControlledUnit(i).createFileMenu(frame); menuItem = pamControllerInterface.getControlledUnit(i).createFileMenu(frame);
@ -975,6 +982,19 @@ public class PamGui extends PamView implements WindowListener, PamSettings {
} }
} }
class ExportData implements ActionListener {
private JFrame parentFrame;
public ExportData(JFrame parentFrame) {
super();
this.parentFrame = parentFrame;
}
public void actionPerformed(ActionEvent e) {
PamController.getInstance().exportData(parentFrame);
}
}
class MenuGeneralXMLExport implements ActionListener { class MenuGeneralXMLExport implements ActionListener {
private JFrame parentFrame; private JFrame parentFrame;
public MenuGeneralXMLExport(JFrame parentFrame) { public MenuGeneralXMLExport(JFrame parentFrame) {
@ -1164,6 +1184,7 @@ public class PamGui extends PamView implements WindowListener, PamSettings {
pamControllerInterface.orderModules(frame); pamControllerInterface.orderModules(frame);
} }
} }
class menuArray implements ActionListener { class menuArray implements ActionListener {
public void actionPerformed(ActionEvent ev){ public void actionPerformed(ActionEvent ev){
ArrayManager.getArrayManager().showArrayDialog(getGuiFrame()); ArrayManager.getArrayManager().showArrayDialog(getGuiFrame());

View File

@ -13,6 +13,8 @@ import javax.swing.JRadioButton;
import javax.swing.border.Border; import javax.swing.border.Border;
import javax.swing.border.TitledBorder; import javax.swing.border.TitledBorder;
import PamView.PamAWTUtils;
import PamView.PamView;
import PamView.dialog.PamDialogPanel; import PamView.dialog.PamDialogPanel;
import PamView.dialog.PamGridBagContraints; import PamView.dialog.PamGridBagContraints;
@ -130,7 +132,11 @@ public class DataSelectorDialogPanel implements PamDialogPanel {
public void enableComponent() { public void enableComponent() {
boolean enable = !disableButton.isSelected(); boolean enable = !disableButton.isSelected();
innerPanel.getDialogComponent().setEnabled(enable); // System.out.println("Disable!!! " + enable);
PamAWTUtils.setPanelEnabled(innerPanel.getDialogComponent(), enable);
//disable in swing is not recursive
// innerPanel.getDialogComponent().setEnabled(enable);
} }
@Override @Override

View File

@ -79,7 +79,7 @@ public class CTMSettingsPanel extends TMSettingsPanel {
*/ */
private void setPanelEnabled(boolean enable) { private void setPanelEnabled(boolean enable) {
PamAWTUtils.setPanelEnabled(getFilterPanel(), enable); PamAWTUtils.setPanelEnabled(getFilterPanel(), enable);
PamAWTUtils.setPanelEnabled(getLocPanel(), enable); PamAWTUtils.setPanelEnabled(getLocPanel(), enable);
} }

View File

@ -1,5 +1,38 @@
package export.CSVExport; package export.CSVExport;
public class CSVExportManager { import java.io.File;
import java.util.List;
import PamguardMVC.PamDataUnit;
import export.PamDataUnitExporter;
public class CSVExportManager implements PamDataUnitExporter{
@Override
public boolean hasCompatibleUnits(Class dataUnitType) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean exportData(File fileName, List<PamDataUnit> dataUnits, boolean append) {
// TODO Auto-generated method stub
return false;
}
@Override
public String getFileExtension() {
return "csv";
}
@Override
public String getIconString() {
return "mdi2f-file-table-outline";
}
@Override
public String getName() {
return "CSV Export";
}
} }

View File

@ -84,7 +84,7 @@ public abstract class MLDataUnitExport<T extends PamDataUnit<?, ?>> {
double datenumMT = PamCalendar.millistoDateNum(dataUnit.getTimeMilliseconds()); double datenumMT = PamCalendar.millistoDateNum(dataUnit.getTimeMilliseconds());
Matrix date = Mat5.newScalar(datenumMT); Matrix date = Mat5.newScalar(datenumMT);
mlStruct.set("date", date); mlStruct.set("date", index, date);
//add detection specific data //add detection specific data
mlStruct= addDetectionSpecificFields(mlStruct, index, dataUnit); mlStruct= addDetectionSpecificFields(mlStruct, index, dataUnit);

View File

@ -2,13 +2,20 @@ package export.MLExport;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException;
import java.util.zip.Deflater;
import PamUtils.PamCalendar;
import PamguardMVC.PamDataUnit; import PamguardMVC.PamDataUnit;
import export.PamDataUnitExporter; import export.PamDataUnitExporter;
import us.hebi.matlab.mat.format.Mat5; import us.hebi.matlab.mat.format.Mat5;
import us.hebi.matlab.mat.format.Mat5File; import us.hebi.matlab.mat.format.Mat5File;
import us.hebi.matlab.mat.format.Mat5Writer;
import us.hebi.matlab.mat.types.Matrix; import us.hebi.matlab.mat.types.Matrix;
import us.hebi.matlab.mat.types.Sink; import us.hebi.matlab.mat.types.Sink;
import us.hebi.matlab.mat.types.Sinks; import us.hebi.matlab.mat.types.Sinks;
@ -25,12 +32,20 @@ public class MLDetectionsManager implements PamDataUnitExporter {
public static final String extension = "mat"; public static final String extension = "mat";
// Creating date format
public static SimpleDateFormat dataFormat = new SimpleDateFormat(
"yyyyMMdd_HHmmss_SSS");
/** /**
* *
* All the possible MLDataUnitExport export classes. * All the possible MLDataUnitExport export classes.
*/ */
ArrayList<MLDataUnitExport> mlDataUnitsExport = new ArrayList<MLDataUnitExport>(); ArrayList<MLDataUnitExport> mlDataUnitsExport = new ArrayList<MLDataUnitExport>();
private Sink sink;
private File currentFile;
public MLDetectionsManager(){ public MLDetectionsManager(){
mlDataUnitsExport.add(new MLClickExport()); mlDataUnitsExport.add(new MLClickExport());
@ -55,12 +70,60 @@ public class MLDetectionsManager implements PamDataUnitExporter {
@Override @Override
public boolean exportData(File fileName, List<PamDataUnit> dataUnits, boolean append) { public boolean exportData(File fileName, List<PamDataUnit> dataUnits, boolean append) {
System.out.println("Export: " + dataUnits.size() + " data units " + append);
if (dataUnits==null || dataUnits.size()<1) {
//nothing to write but no error.
return true;
}
try { try {
Mat5File matFile = Mat5.newMatFile();
Sink sink = Sinks.newMappedFile(fileName, Casts.sint32(1000000));
matFile.writeTo(sink);//Streams the data into a MAT file? Struct dataUnitsStruct = dataUnits2MAT(dataUnits);
// then
PamDataUnit minByTime = dataUnits
.stream()
.min(Comparator.comparing(PamDataUnit::getTimeMilliseconds))
.orElseThrow(NoSuchElementException::new);
//matlab struct must start with a letter.
Date date = new Date(minByTime.getTimeMilliseconds());
String entryName = "det_" + dataFormat.format( date);
//is there an existing sink? Is that sink writing to the correct file?
if (sink==null || !fileName.equals(currentFile)) {
System.out.println("Export: " + dataUnitsStruct.getNumDimensions() + entryName);
currentFile = fileName;
//create the sink for the next data so it can be appended to the file.
sink = Sinks.newStreamingFile(fileName);
//create the Mat File - gets all the headers right etc.
Mat5File matFile = Mat5.newMatFile();
matFile.addArray(entryName, dataUnitsStruct);
// matFile.addArray("two", Mat5.newScalar(2));
matFile.writeTo(sink);
matFile.close();
}
else {
//write to the mat file without loading all contents into memory.
Mat5Writer writer = Mat5.newWriter(sink);
writer
.writeArray(entryName, dataUnitsStruct)
.setDeflateLevel(Deflater.NO_COMPRESSION);
// .writeArray("three", Mat5.newScalar(2));
writer.flush();
}
return true;
} catch (IOException e) { } catch (IOException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
@ -68,7 +131,6 @@ public class MLDetectionsManager implements PamDataUnitExporter {
return false; return false;
} }
return false;
} }
/** /**

View File

@ -1,11 +1,14 @@
package export; package export;
import java.io.File; import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import PamUtils.PamCalendar; import PamUtils.PamCalendar;
import PamguardMVC.PamDataBlock; import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit; import PamguardMVC.PamDataUnit;
import export.CSVExport.CSVExportManager;
import export.MLExport.MLDetectionsManager; import export.MLExport.MLDetectionsManager;
import export.RExport.RExportManager; import export.RExport.RExportManager;
import export.layoutFX.ExportParams; import export.layoutFX.ExportParams;
@ -18,9 +21,9 @@ import export.wavExport.WavFileExportManager;
public class PamExporterManager { public class PamExporterManager {
/** /**
* The number of data units to save before saving. * The number of data units to save before saving. This prevents too much being stored in memory
*/ */
private static int BUFFER_SIZE = 1000; private static int BUFFER_SIZE = 10000;
/** /**
* Keep the file size to around 1GB per file * Keep the file size to around 1GB per file
@ -48,6 +51,10 @@ public class PamExporterManager {
*/ */
private ExportParams exportParams = new ExportParams(); private ExportParams exportParams = new ExportParams();
// Creating date format
public static SimpleDateFormat dataFormat = new SimpleDateFormat(
"yyyy_MM_dd_HHmmss");
public PamExporterManager() { public PamExporterManager() {
pamExporters = new ArrayList<PamDataUnitExporter>(); pamExporters = new ArrayList<PamDataUnitExporter>();
@ -55,19 +62,35 @@ public class PamExporterManager {
pamExporters.add(new MLDetectionsManager()); pamExporters.add(new MLDetectionsManager());
pamExporters.add(new RExportManager()); pamExporters.add(new RExportManager());
pamExporters.add(new WavFileExportManager()); pamExporters.add(new WavFileExportManager());
pamExporters.add(new CSVExportManager());
} }
/** /**
* Add a data unit to the export list. * Add a data unit to the export list.
* @param force - true to force saving of data e.g. at the end of processing.
*/ */
public boolean exportDataUnit(PamDataUnit<?, ?> dataUnit) { public boolean exportDataUnit(PamDataUnit<?, ?> dataUnit, boolean force) {
boolean exportOK = true; boolean exportOK = true;
if (dataUnit==null) {
if (force) {
System.out.println("Write data 1!!" + dataUnitBuffer.size());
exportOK = pamExporters.get(exportParams.exportChoice).exportData(currentFile, dataUnitBuffer, true);
dataUnitBuffer.clear();
}
return true;
}
//if the data unit is null then save everything to the buffer. //if the data unit is null then save everything to the buffer.
if (currentFile == null || isFileSizeMax(currentFile)) { if (currentFile == null || isFileSizeMax(currentFile)) {
Date date = new Date(dataUnit.getTimeMilliseconds());
String newFileName = "PAM_" + dataFormat.format(date);
//create a new file - note each exporter is responsible for closing the file after writing //create a new file - note each exporter is responsible for closing the file after writing
//so previous files should already be closed //so previous files should already be closed
String fileName = (exportParams.folder + File.separator + PamCalendar.formatDate2(dataUnit.getTimeMilliseconds(), false) String fileName = (exportParams.folder + File.separator + newFileName
+ "." + pamExporters.get(exportParams.exportChoice).getFileExtension()); + "." + pamExporters.get(exportParams.exportChoice).getFileExtension());
currentFile = new File(fileName); currentFile = new File(fileName);
@ -75,7 +98,11 @@ public class PamExporterManager {
dataUnitBuffer.add(dataUnit); dataUnitBuffer.add(dataUnit);
if (BUFFER_SIZE>=BUFFER_SIZE) { // System.out.println("Write data unit " + dataUnitBuffer.size() + " to: "+ currentFile);
if (dataUnitBuffer.size()>=BUFFER_SIZE || force) {
System.out.println("Write data 2!!" + dataUnitBuffer.size());
exportOK = pamExporters.get(exportParams.exportChoice).exportData(currentFile, dataUnitBuffer, true); exportOK = pamExporters.get(exportParams.exportChoice).exportData(currentFile, dataUnitBuffer, true);
dataUnitBuffer.clear(); dataUnitBuffer.clear();
} }
@ -101,6 +128,8 @@ public class PamExporterManager {
private static double getFileSizeMegaBytes(File file) { private static double getFileSizeMegaBytes(File file) {
return (double) file.length() / (1024 * 1024); return (double) file.length() / (1024 * 1024);
} }
public boolean canExportDataBlock(PamDataBlock dataBlock) { public boolean canExportDataBlock(PamDataBlock dataBlock) {
for (PamDataUnitExporter exporter:pamExporters) { for (PamDataUnitExporter exporter:pamExporters) {
if (exporter.hasCompatibleUnits(dataBlock.getUnitClass())) return true; if (exporter.hasCompatibleUnits(dataBlock.getUnitClass())) return true;
@ -127,5 +156,19 @@ public class PamExporterManager {
} }
public void setCurrentFile(File file) {
this.currentFile=file;
}
public ExportParams getExportParams() {
return exportParams;
}
public void setExportParams(ExportParams currentParams) {
exportParams=currentParams;
}
} }

View File

@ -1,14 +1,20 @@
package export.RExport; package export.RExport;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.zip.GZIPOutputStream;
import org.renjin.eval.Context;
import org.renjin.primitives.io.serialization.RDataWriter;
import org.renjin.sexp.ListVector; import org.renjin.sexp.ListVector;
import org.renjin.sexp.PairList; import org.renjin.sexp.PairList;
import PamguardMVC.PamDataUnit; import PamguardMVC.PamDataUnit;
import export.PamDataUnitExporter; import export.PamDataUnitExporter;
import pamViewFX.fxNodes.pamDialogFX.PamDialogFX;
/** /**
* Handles exporting pam data units into an rdata. * Handles exporting pam data units into an rdata.
@ -24,6 +30,16 @@ public class RExportManager implements PamDataUnitExporter {
*/ */
ArrayList<RDataUnitExport> mlDataUnitsExport = new ArrayList<RDataUnitExport>(); ArrayList<RDataUnitExport> mlDataUnitsExport = new ArrayList<RDataUnitExport>();
private FileOutputStream fos;
private GZIPOutputStream zos;
private File currentFileName ;
private RDataWriter writer;
private Context context;
public RExportManager(){ public RExportManager(){
/***Add more options here to export data units****/ /***Add more options here to export data units****/
@ -32,6 +48,56 @@ public class RExportManager implements PamDataUnitExporter {
mlDataUnitsExport.add(new RRawExport()); //should be last in case raw data holders have specific exporters mlDataUnitsExport.add(new RRawExport()); //should be last in case raw data holders have specific exporters
} }
@Override
public boolean exportData(File fileName, List<PamDataUnit> dataUnits, boolean append) {
//convert the data units to
RData dataUnitsR = dataUnits2R(dataUnits);
// System.out.println("Export R file!!" + dataUnits.size());
//now write the file
try {
//is there an existing writer? Is that writer writing to the correct file?
if (zos==null || fileName.equals(currentFileName)) {
if (zos!=null) {
zos.close();
writer.close();
}
currentFileName = fileName;
// System.out.println("MLDATA size: "+ mlData.size());
// System.out.println("---MLArray----");
// for (int i=0; i<mlData.size(); i++) {
// System.out.println(mlData.get(i));
// System.out.println("-------");
// }
// System.out.println("--------------");
context = Context.newTopLevelContext();
fos = new FileOutputStream(fileName);
zos = new GZIPOutputStream(fos);
return true;
}
writer = new RDataWriter(context, zos);
writer.save(dataUnitsR.rData.build());
return true;
}
catch (IOException e1) {
e1.printStackTrace();
return false;
}
}
/** /**
* Check whether there are compatible data units to be exported. * Check whether there are compatible data units to be exported.
* @param dataUnits - the data unit list * @param dataUnits - the data unit list
@ -64,7 +130,7 @@ public class RExportManager implements PamDataUnitExporter {
* @param dataUnits - a list of data units to convert to matlab structures. * @param dataUnits - a list of data units to convert to matlab structures.
* @return list of list of R strucutures ready for saving to .RData file. * @return list of list of R strucutures ready for saving to .RData file.
*/ */
public RData dataUnits2R(ArrayList<PamDataUnit> dataUnits){ public RData dataUnits2R(List<PamDataUnit> dataUnits){
//if there's a mixed bunch of data units then we want separate arrays of structures. So a structure of arrays of structures. //if there's a mixed bunch of data units then we want separate arrays of structures. So a structure of arrays of structures.
//so, need to sort compatible data units. //so, need to sort compatible data units.
@ -136,12 +202,6 @@ public class RExportManager implements PamDataUnitExporter {
@Override
public boolean exportData(File fileName, List<PamDataUnit> dataUnits, boolean append) {
// TODO Auto-generated method stub
return false;
}
@Override @Override
public String getFileExtension() { public String getFileExtension() {
return "RData"; return "RData";

View File

@ -13,7 +13,7 @@ public class ExportParams implements Serializable, Cloneable {
/** /**
* *
*/ */
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 2L;
/** /**
* The index of the export choice. * The index of the export choice.
@ -25,6 +25,11 @@ public class ExportParams implements Serializable, Cloneable {
*/ */
public String folder = System.getProperty("user.home"); public String folder = System.getProperty("user.home");
/**
* The maximum file size in Megabytes
*/
public Double maximumFileSize = 1000.0;
@Override @Override
public ExportParams clone() { public ExportParams clone() {
try { try {

View File

@ -1,6 +1,5 @@
package export.swing; package export.swing;
import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Frame; import java.awt.Frame;
@ -11,14 +10,10 @@ import java.awt.event.ActionListener;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import javax.swing.Box;
import javax.swing.BoxLayout; import javax.swing.BoxLayout;
import javax.swing.ButtonGroup; import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JSpinner.DefaultEditor; import javax.swing.JSpinner.DefaultEditor;
import javax.swing.JTextField; import javax.swing.JTextField;
@ -29,13 +24,13 @@ import javax.swing.border.TitledBorder;
import org.kordamp.ikonli.Ikon; import org.kordamp.ikonli.Ikon;
import org.kordamp.ikonli.fileicons.FileIcons; import org.kordamp.ikonli.fileicons.FileIcons;
import org.kordamp.ikonli.materialdesign2.MaterialDesignA;
import org.kordamp.ikonli.materialdesign2.MaterialDesignF; import org.kordamp.ikonli.materialdesign2.MaterialDesignF;
import org.kordamp.ikonli.swing.FontIcon; import org.kordamp.ikonli.swing.FontIcon;
import PamController.PamController; import PamController.PamController;
import PamUtils.PamFileChooser; import PamUtils.PamFileChooser;
import PamView.dialog.PamButton; import PamView.dialog.PamButton;
import PamView.dialog.PamDialog;
import PamView.dialog.PamGridBagContraints; import PamView.dialog.PamGridBagContraints;
import PamView.panel.PamPanel; import PamView.panel.PamPanel;
import PamguardMVC.PamDataBlock; import PamguardMVC.PamDataBlock;
@ -43,6 +38,7 @@ import export.PamExporterManager;
import export.layoutFX.ExportParams; import export.layoutFX.ExportParams;
import offlineProcessing.OLProcessDialog; import offlineProcessing.OLProcessDialog;
import offlineProcessing.OfflineTaskGroup; import offlineProcessing.OfflineTaskGroup;
import offlineProcessing.TaskStatus;
/** /**
* Handles an offline dialog for processing offline data and exporting to bespoke file types. * Handles an offline dialog for processing offline data and exporting to bespoke file types.
@ -150,9 +146,15 @@ public class ExportProcessDialog {
public ExportOLDialog(Window parentFrame, OfflineTaskGroup taskGroup, String title) { public ExportOLDialog(Window parentFrame, OfflineTaskGroup taskGroup, String title) {
super(parentFrame, taskGroup, title); super(parentFrame, taskGroup, title);
// TODO Auto-generated constructor stub
//remove the notes panel - don't need this for export.
super.removeNotePanel();
//remove delete database entried - not used.
super.getDeleteOldDataBox().setVisible(false);
//construc tthe panel.
PamPanel mainPanel = new PamPanel(); PamPanel mainPanel = new PamPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS)); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
mainPanel.setBorder(new TitledBorder("Export Settings")); mainPanel.setBorder(new TitledBorder("Export Settings"));
@ -161,9 +163,9 @@ public class ExportProcessDialog {
PamPanel buttonPanel = new PamPanel(); PamPanel buttonPanel = new PamPanel();
ActionListener listener = actionEvent -> { ActionListener listener = actionEvent -> {
System.out.println(actionEvent.getActionCommand() + " Selected"); // System.out.println(actionEvent.getActionCommand() + " Selected");
//TODO set the buttons to be disabled or enabled. //TODO set the buttons to be disabled or enabled.
enableTasks(getExportSelection());
}; };
exportButtons = new JToggleButton[exportManager.getNumExporters()]; exportButtons = new JToggleButton[exportManager.getNumExporters()];
@ -192,8 +194,8 @@ public class ExportProcessDialog {
c.gridy = 0; c.gridy = 0;
addComponent(p, exportTo = new JTextField(), c); addComponent(p, exportTo = new JTextField(), c);
exportTo.setMinimumSize(new Dimension(170, 25)); exportTo.setMinimumSize(new Dimension(180, 25));
exportTo.setPreferredSize(new Dimension(170, 25)); exportTo.setPreferredSize(new Dimension(180, 25));
c.gridx +=3; c.gridx +=3;
c.gridwidth = 1; c.gridwidth = 1;
@ -241,9 +243,26 @@ public class ExportProcessDialog {
//add the main panel at a different index. //add the main panel at a different index.
getMainPanel().add(mainPanel, 1); getMainPanel().add(mainPanel, 1);
pack();
} }
/**
* Enable which task are disables and enabled.
* @param exportSelection
*/
private void enableTasks(int exportSelection) {
this.currentParams = getExportParams();
exportManager.setExportParams(currentParams);
// ExportTask task;
// for (int i=0; i<this.getTaskGroup().getNTasks(); i++) {
// task = (ExportTask) this.getTaskGroup().getTask(i);
// }
enableControls();
}
private Ikon getIconFromString(String iconString) { private Ikon getIconFromString(String iconString) {
@ -262,13 +281,43 @@ public class ExportProcessDialog {
case "mdi2f-file-music": case "mdi2f-file-music":
icon=MaterialDesignF.FILE_MUSIC; icon=MaterialDesignF.FILE_MUSIC;
break; break;
case "mdi2f-file-table-outline":
icon=MaterialDesignF.FILE_TABLE_OUTLINE;
break;
} }
return icon; return icon;
} }
public ExportParams getExportParams() { private int getExportSelection() {
int sel=-1;
for (int i=0; i<exportButtons.length; i++) {
if (this.exportButtons[i].isSelected()) {
sel=i;
break;
}
}
return sel;
}
public ExportParams getExportParams() {
currentParams.folder = null;
if (exportTo.getText().length()>0) {
File file = new File(exportTo.getText());
if (!(file.exists() && file.isDirectory())) {
currentParams.folder = null;
}
else {
currentParams.folder = file.getAbsolutePath();
}
}
currentParams.exportChoice = getExportSelection();
currentParams.maximumFileSize = (Double) spinner.getValue();
return currentParams; return currentParams;
} }
@ -276,6 +325,13 @@ public class ExportProcessDialog {
public boolean getParams() { public boolean getParams() {
//make sure we update the current paramters before processing starts. //make sure we update the current paramters before processing starts.
this.currentParams = getExportParams(); this.currentParams = getExportParams();
exportManager.setExportParams(currentParams);
if (this.currentParams.folder==null) {
return PamDialog.showWarning(super.getOwner(), "No folder or file selected", "You must select an output folder");
}
return super.getParams(); return super.getParams();
} }
@ -286,8 +342,14 @@ public class ExportProcessDialog {
buttonGroup.clearSelection(); buttonGroup.clearSelection();
exportButtons[params.exportChoice].setSelected(true); exportButtons[params.exportChoice].setSelected(true);
exportTo.setText(currentParams.folder);
spinner.setValue(currentParams.maximumFileSize);
} }
} }
@ -312,4 +374,5 @@ public class ExportProcessDialog {
} }

View File

@ -27,11 +27,14 @@ public class ExportTask extends OfflineTask<PamDataUnit<?,?>>{
*/ */
private DataSelector dataSelector; private DataSelector dataSelector;
private boolean canExport;
public ExportTask(PamDataBlock<PamDataUnit<?, ?>> parentDataBlock, PamExporterManager exporter) { public ExportTask(PamDataBlock<PamDataUnit<?, ?>> parentDataBlock, PamExporterManager exporter) {
super(parentDataBlock); super(parentDataBlock);
this.exporter = exporter; this.exporter = exporter;
dataSelector=parentDataBlock.getDataSelectCreator().getDataSelector(this.getUnitName() +"_clicks", false, null); dataSelector=parentDataBlock.getDataSelectCreator().getDataSelector(this.getUnitName() +"_clicks", false, null);
} }
@Override @Override
@ -41,20 +44,25 @@ public class ExportTask extends OfflineTask<PamDataUnit<?,?>>{
@Override @Override
public boolean processDataUnit(PamDataUnit<?, ?> dataUnit) { public boolean processDataUnit(PamDataUnit<?, ?> dataUnit) {
exporter.exportDataUnit(dataUnit); if (dataSelector==null) exporter.exportDataUnit(dataUnit, false);
return true; else if (dataSelector.scoreData(dataUnit)>0) {
exporter.exportDataUnit(dataUnit, false);
}
return false; //we don't need to indicate that anything has changed - we are just exporting.
} }
@Override @Override
public void newDataLoad(long startTime, long endTime, OfflineDataMapPoint mapPoint) { public void newDataLoad(long startTime, long endTime, OfflineDataMapPoint mapPoint) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
// System.out.println("EXPORTER: new data load");
} }
@Override @Override
public void loadedDataComplete() { public void loadedDataComplete() {
//force the exporter so save any remaning data units in the buffer System.out.println("EXPORTER: loaded data complete");
exporter.exportDataUnit(null); //force the exporter so save any renaming data units in the buffer
exporter.exportDataUnit(null, true);
exporter.setCurrentFile(null);
} }
/** /**
@ -79,4 +87,25 @@ public class ExportTask extends OfflineTask<PamDataUnit<?,?>>{
} }
/**
* Set whether the task can export based on the current selection
* @param exportSelection - the index of the selected exporter
*/
public boolean canExport(int exportSelection) {
return exporter.getExporter(exportSelection).hasCompatibleUnits(getDataBlock().getUnitClass());
}
@Override
public boolean canRun() {
boolean can = getDataBlock() != null;
if (can) {
//check whether we can export based on the export selection
can = canExport(exporter.getExportParams().exportChoice);
}
return can;
}
} }

View File

@ -47,20 +47,20 @@ public class FormsTabPanel implements PamTabPanel {
// keyManager=KeyboardFocusManager.getCurrentKeyboardFocusManager(); // keyManager=KeyboardFocusManager.getCurrentKeyboardFocusManager();
// keyManager.addKeyEventDispatcher(new LoggerKeyEventDispatcher()); // keyManager.addKeyEventDispatcher(new LoggerKeyEventDispatcher());
/** Global (OS-level) hotkey manager: // /** Global (OS-level) hotkey manager:
* jnativehook supported systems: Windows, X11, MacOS // * jnativehook supported systems: Windows, X11, MacOS
* // *
*/ // */
try { // try {
LogManager.getLogManager().reset(); // LogManager.getLogManager().reset();
GlobalScreen.setEventDispatcher(new SwingDispatchService()); // GlobalScreen.setEventDispatcher(new SwingDispatchService());
GlobalScreen.registerNativeHook(); // GlobalScreen.registerNativeHook();
GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample()); // GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
} // }
catch (NativeHookException ex) { // catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook."); // System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage()); // System.err.println(ex.getMessage());
} // }
} }
@Override @Override

View File

@ -13,7 +13,6 @@ import java.awt.event.WindowEvent;
import java.util.ArrayList; import java.util.ArrayList;
import javax.swing.BoxLayout; import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JCheckBox; import javax.swing.JCheckBox;
import javax.swing.JComboBox; import javax.swing.JComboBox;
@ -39,7 +38,6 @@ import PamView.panel.PamAlignmentPanel;
import PamView.panel.PamPanel; import PamView.panel.PamPanel;
import PamView.panel.PamProgressBar; import PamView.panel.PamProgressBar;
import PamguardMVC.PamDataBlock; import PamguardMVC.PamDataBlock;
import export.layoutFX.ExportParams;
import offlineProcessing.logging.OldTaskData; import offlineProcessing.logging.OldTaskData;
import offlineProcessing.logging.TaskLogging; import offlineProcessing.logging.TaskLogging;
import offlineProcessing.superdet.OfflineSuperDetFilter; import offlineProcessing.superdet.OfflineSuperDetFilter;
@ -95,7 +93,7 @@ public class OLProcessDialog extends PamDialog {
// public static ImageIcon settings = new ImageIcon(ClassLoader.getSystemResource("Resources/SettingsButtonSmall2.png")); // public static ImageIcon settings = new ImageIcon(ClassLoader.getSystemResource("Resources/SettingsButtonSmall2.png"));
public static FontIcon settings = FontIcon.of(MaterialDesignC.COG, 20, Color.DARK_GRAY); public static FontIcon settings = FontIcon.of(MaterialDesignC.COG, 20, Color.DARK_GRAY);
TaskStatus currentStatus = TaskStatus.IDLE; TaskStatus currentStatus = TaskStatus.IDLE;
@ -105,6 +103,13 @@ public class OLProcessDialog extends PamDialog {
*/ */
private JPanel mainPanel; private JPanel mainPanel;
private JPanel notePanel;
/**
* True if a note is required for the
*/
private boolean isNeedaNote = true;
public OLProcessDialog(Window parentFrame, OfflineTaskGroup taskGroup, String title) { public OLProcessDialog(Window parentFrame, OfflineTaskGroup taskGroup, String title) {
super(parentFrame, title, false); super(parentFrame, title, false);
@ -165,7 +170,7 @@ public class OLProcessDialog extends PamDialog {
c.gridy++; c.gridy++;
} }
JPanel notePanel = new JPanel(new BorderLayout()); notePanel = new JPanel(new BorderLayout());
notePanel.setBorder(new TitledBorder("Notes")); notePanel.setBorder(new TitledBorder("Notes"));
noteText = new DBTextArea(2, 40, TaskLogging.TASK_NOTE_LENGTH); noteText = new DBTextArea(2, 40, TaskLogging.TASK_NOTE_LENGTH);
noteText.getComponent().setToolTipText("Notes to add to database record of complete tasks"); noteText.getComponent().setToolTipText("Notes to add to database record of complete tasks");
@ -185,11 +190,14 @@ public class OLProcessDialog extends PamDialog {
c.gridwidth = 1; c.gridwidth = 1;
addComponent(progressPanel, new JLabel("File ", SwingConstants.RIGHT), c); addComponent(progressPanel, new JLabel("File ", SwingConstants.RIGHT), c);
c.gridx++; c.gridx++;
c.gridwidth = 2;
addComponent(progressPanel, loadedProgress = new PamProgressBar(0, 100), c); addComponent(progressPanel, loadedProgress = new PamProgressBar(0, 100), c);
c.gridx = 0; c.gridx = 0;
c.gridy++; c.gridy++;
c.gridwidth = 1;
addComponent(progressPanel, new JLabel("All Data ", SwingConstants.RIGHT), c); addComponent(progressPanel, new JLabel("All Data ", SwingConstants.RIGHT), c);
c.gridx++; c.gridx++;
c.gridwidth = 2;
addComponent(progressPanel, globalProgress = new PamProgressBar(00, 100), c); addComponent(progressPanel, globalProgress = new PamProgressBar(00, 100), c);
mainPanel.add(dataSelectPanel); mainPanel.add(dataSelectPanel);
@ -220,6 +228,15 @@ public class OLProcessDialog extends PamDialog {
} }
/**
* Remove the notes panel.
*/
public void removeNotePanel() {
isNeedaNote = false;
mainPanel.remove(notePanel);
pack();
}
/** /**
* Get the main panel. This can be used to add additional controls if needed. * Get the main panel. This can be used to add additional controls if needed.
* @return the main panel. * @return the main panel.
@ -310,7 +327,7 @@ public class OLProcessDialog extends PamDialog {
taskCheckBox[i].setSelected(false); taskCheckBox[i].setSelected(false);
} }
if (settingsButton[i] != null) { if (settingsButton[i] != null) {
settingsButton[i].setEnabled(nr); settingsButton[i].setEnabled(aTask.canRun() && nr);
} }
if (taskCheckBox[i].isSelected()) { if (taskCheckBox[i].isSelected()) {
selectedTasks++; selectedTasks++;
@ -368,7 +385,7 @@ public class OLProcessDialog extends PamDialog {
} }
String note = noteText.getText(); String note = noteText.getText();
if (note == null || note.length() == 0) { if ((note == null || note.length() == 0) && isNeedaNote) {
return PamDialog.showWarning(super.getOwner(), "Task note", "you must enter a note about what you are doing"); return PamDialog.showWarning(super.getOwner(), "Task note", "you must enter a note about what you are doing");
} }
taskGroupParams.taskNote = note; taskGroupParams.taskNote = note;
@ -376,6 +393,7 @@ public class OLProcessDialog extends PamDialog {
return true; return true;
} }
public void setTaskToolTips() { public void setTaskToolTips() {
int nTasks = taskGroup.getNTasks(); int nTasks = taskGroup.getNTasks();
@ -844,4 +862,22 @@ public class OLProcessDialog extends PamDialog {
} }
/**
* Check whether a note is required.
* @return true if a note is required.
*/
public boolean isNeedaNote() {
return isNeedaNote;
}
/**
* Set whether a note is required before processing
* @param isNeedaNote - true to require user to input a note.
*/
public void setNeedaNote(boolean isNeedaNote) {
this.isNeedaNote = isNeedaNote;
}
} }

View File

@ -0,0 +1,39 @@
package pamguard;
import java.sql.Connection;
import java.sql.SQLException;
import org.sqlite.SQLiteConfig;
import generalDatabase.sqlite.SqliteSQLTypes;
public class PAMGuard_sqlite {
public static void main(String[] args) {
String dbName = "/Users/jdjm/Desktop/section2_cpod/hyskeir_pamguard.sqlite3";
/*
* Don't use the driver manager, but open from the built in command in
* SQLiteConfig. This will then correctly set the dateformat of the database.
*/
SQLiteConfig config = new SQLiteConfig();
config.setSharedCache(true);
config.enableRecursiveTriggers(true);
config.enableLoadExtension(true);
config.setDateClass(SqliteSQLTypes.dateClass.getValue());
config.setDateStringFormat(SQLiteConfig.DEFAULT_DATE_STRING_FORMAT);
Connection con = null;
try {
con = config.createConnection("jdbc:sqlite:" + dbName);
con.setAutoCommit(false);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Connection: " + con);
}
}