diff --git a/src/tethys/database/TethysActions.java b/src/tethys/database/TethysActions.java new file mode 100644 index 00000000..0c9ece36 --- /dev/null +++ b/src/tethys/database/TethysActions.java @@ -0,0 +1,27 @@ +package tethys.database; + +/** + * Possible document actions + * @author dg50 + * + */ +public enum TethysActions { + + ADDDOCUMENT, DELETEDOCUMENT, UPDATEDOCUMENT; + +// @Override +// public String toString() { +// switch (this) { +// case ADDDOCUMENT: +// return "Add document"; +// case DELETEDOCUMENT: +// return "Delete document"; +// case UPDATEDOCUMENT: +// return "Update document"; +// default: +// return null; +// } +// } + + +} diff --git a/src/tethys/database/TethysLogDataBlock.java b/src/tethys/database/TethysLogDataBlock.java new file mode 100644 index 00000000..7a3639d6 --- /dev/null +++ b/src/tethys/database/TethysLogDataBlock.java @@ -0,0 +1,16 @@ +package tethys.database; + +import PamguardMVC.PamDataBlock; +import PamguardMVC.PamProcess; +import tethys.TethysControl; + +public class TethysLogDataBlock extends PamDataBlock { + + private TethysControl tethysControl; + + public TethysLogDataBlock(TethysControl tethysControl) { + super(TethysLogDataUnit.class, "Tethys Log", null, 0); + this.tethysControl = tethysControl; + } + +} diff --git a/src/tethys/database/TethysLogDataUnit.java b/src/tethys/database/TethysLogDataUnit.java new file mode 100644 index 00000000..e1998c2b --- /dev/null +++ b/src/tethys/database/TethysLogDataUnit.java @@ -0,0 +1,59 @@ +package tethys.database; + +import PamguardMVC.PamDataUnit; + +public class TethysLogDataUnit extends PamDataUnit { + + private String collection; + private String documentId; + private TethysActions action; + private String comment; + private boolean success; + + public TethysLogDataUnit(long timeMilliseconds, String collection, String documentId, TethysActions action, boolean success, String comment) { + super(timeMilliseconds); + this.collection = collection; + this.documentId = documentId; + this.action = action; + this.success = success; + this.comment = comment; + + } + + /** + * @return the collection + */ + public String getCollection() { + return collection; + } + + /** + * @return the documentId + */ + public String getDocumentId() { + return documentId; + } + + /** + * @return the action + */ + public TethysActions getAction() { + return action; + } + + /** + * @return the comment + */ + public String getComment() { + return comment; + } + + /** + * @return the success + */ + public boolean isSuccess() { + return success; + } + + +} diff --git a/src/tethys/database/TethysLogger.java b/src/tethys/database/TethysLogger.java new file mode 100644 index 00000000..9e7ae2ad --- /dev/null +++ b/src/tethys/database/TethysLogger.java @@ -0,0 +1,128 @@ +package tethys.database; + +import java.sql.Types; + +import PamguardMVC.PamDataUnit; +import generalDatabase.DBControlUnit; +import generalDatabase.DBProcess; +import generalDatabase.PamConnection; +import generalDatabase.PamTableDefinition; +import generalDatabase.PamTableItem; +import generalDatabase.SQLLogging; +import generalDatabase.SQLTypes; +import tethys.TethysControl; + +/** + * Logging everything we put into Tethys in our own database. + * @author dg50 + * + */ +public class TethysLogger extends SQLLogging { + + private static TethysLogger tethysLogger; + + private TethysControl tethysControl; + + private TethysLogDataBlock logDataBlock; + + private PamTableDefinition tableDefinition; + + private PamTableItem collection, documentId, action, status, comment; + + private boolean tableChecked = false; + + private TethysLogger(TethysControl tethysControl, TethysLogDataBlock pamDataBlock) { + super(pamDataBlock); + this.tethysControl = tethysControl; + this.logDataBlock = pamDataBlock; + tableDefinition = new PamTableDefinition("TethysLog"); + tableDefinition.addTableItem(collection = new PamTableItem("Collection", Types.VARCHAR)); + tableDefinition.addTableItem(documentId = new PamTableItem("DocumentId", Types.VARCHAR)); + tableDefinition.addTableItem(action = new PamTableItem("Action", Types.VARCHAR)); + tableDefinition.addTableItem(status = new PamTableItem("Status", Types.VARCHAR)); + tableDefinition.addTableItem(comment = new PamTableItem("Comment", Types.VARCHAR)); + tableDefinition.setUpdatePolicy(UPDATE_POLICY_OVERWRITE); + setTableDefinition(tableDefinition); + } + + public static TethysLogger getTethysLogger(TethysControl tethysControl) { + if (tethysLogger == null) { + tethysLogger = createTethysLogger(tethysControl); + } + return tethysLogger; + } + + private boolean checkTable() { + if (tableChecked == true) { + return true; + } + if (findDBProcess() == null) { + return false; + } + else { + tableChecked = findDBProcess().checkTable(tableDefinition); + } + return tableChecked; + } + + public boolean logAction(String collection, String documentId, TethysActions action, boolean success, String comment) { + PamConnection con = findDBConnection(); + if (con == null) { + return false; + } + if (checkTable() == false) { + return false; + } + + TethysLogDataUnit dataUnit = new TethysLogDataUnit(System.currentTimeMillis(), collection, documentId, action, success, comment); + return this.logData(con, dataUnit); + } + + private PamConnection findDBConnection() { + return DBControlUnit.findConnection(); + } + + /** + * Find the database controlled unit.
Must exist in viewer mode surely, but perhaps + * created after the Tethys module if the user is really crafty ! + * @return the DB controlled unit. + */ + private DBControlUnit findDBControl() { + return DBControlUnit.findDatabaseControl(); + } + + /** + * Fine the database process. Should exist. + * @return + */ + private DBProcess findDBProcess() { + DBControlUnit dbControl = findDBControl(); + if (dbControl == null) { + return null; + } + return dbControl.getDbProcess(); + } + + private static TethysLogger createTethysLogger(TethysControl tethysControl) { + TethysLogDataBlock datablock = new TethysLogDataBlock(tethysControl); + TethysLogger newLogger = new TethysLogger(tethysControl, datablock); + return newLogger; + } + + + @Override + public void setTableData(SQLTypes sqlTypes, PamDataUnit pamDataUnit) { + TethysLogDataUnit tldu = (TethysLogDataUnit) pamDataUnit; + collection.setValue(tldu.getCollection()); + documentId.setValue(tldu.getDocumentId()); + action.setValue(tldu.getAction().toString()); + status.setValue(tldu.isSuccess() ? "Success" : "Fail"); + comment.setValue(tldu.getComment()); + } + +// public TethysLogger(TethysControl tethysControl) { +// this.tethysControl = tethysControl; +// } + + +} diff --git a/src/tethys/dbxml/DBXMLConnect.java b/src/tethys/dbxml/DBXMLConnect.java index 7af700d5..aee6dc19 100644 --- a/src/tethys/dbxml/DBXMLConnect.java +++ b/src/tethys/dbxml/DBXMLConnect.java @@ -19,6 +19,8 @@ import dbxml.Queries; import dbxml.uploader.Importer; import nilus.MarshalXML; import tethys.TethysControl; +import tethys.database.TethysActions; +import tethys.database.TethysLogger; import tethys.output.TethysExportParams; /** @@ -123,6 +125,28 @@ public class DBXMLConnect { return retFile; } + + public boolean postAndLog(Object nilusObject) throws TethysException + { + TethysException e = null; + boolean success = false; + try { + success = postToTethys(nilusObject); + } + catch (TethysException ex) { + e = ex; + } + TethysLogger logger = TethysLogger.getTethysLogger(tethysControl); + Class objClass = nilusObject.getClass(); + String collection = getTethysCollection(objClass.getName()); + String documentId = getDocumentId(nilusObject); + logger.logAction(collection, documentId, TethysActions.ADDDOCUMENT, success, ""); + if (e != null) { + throw (e); + } + return success; + } + /** * take a nilus object loaded with PamGuard data and post it to the Tethys database * @@ -130,7 +154,7 @@ public class DBXMLConnect { * @return error string, null string means there are no errors * @throws TethysException */ - public boolean postToTethys(Object nilusObject) throws TethysException + private boolean postToTethys(Object nilusObject) throws TethysException { Class objClass = nilusObject.getClass(); String collection = getTethysCollection(objClass.getName()); diff --git a/src/tethys/dbxml/DBXMLQueries.java b/src/tethys/dbxml/DBXMLQueries.java index 48dd2b7b..5e6fe572 100644 --- a/src/tethys/dbxml/DBXMLQueries.java +++ b/src/tethys/dbxml/DBXMLQueries.java @@ -287,6 +287,23 @@ public class DBXMLQueries { return projectNames; } + /** + * Get project deployments that use a specific instrument id. More use than the call without this + * extra clause since it can handle overlapping deployments. + * @param projectName + * @param instrumentId + * @return + */ + public ArrayList getProjectDeployments(String projectName, String instrumentId) { + if (projectName == null) { + return null; + } + String qBase = "{\"return\":[\"Deployment\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Deployment/Project\",\"%s\"],\"optype\":\"binary\"},{\"op\":\"=\"," + + "\"operands\":[\"Deployment/Instrument/InstrumentId\",\"%s\"],\"optype\":\"binary\"}],\"enclose\":1}"; + String qStr = String.format(qBase, projectName, instrumentId); + + return runProjectDeploymentsQuery(projectName, qStr); + } /** * Get some basic (not all) data for deployments associated with a project. Note that * this may include deployments which are NOT part of the current dataset. That requires @@ -300,7 +317,16 @@ public class DBXMLQueries { } String qBase = "{\"return\":[\"Deployment\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Deployment/Project\",\"%s\"],\"optype\":\"binary\"}],\"enclose\":1}"; String qStr = String.format(qBase, projectName); + return runProjectDeploymentsQuery(projectName, qStr); + } + /** + * Run the actual projects query from either of the two above functions. + * @param projectName + * @param qStr + * @return + */ + private ArrayList runProjectDeploymentsQuery(String projectName, String qStr) { DBQueryResult result = null; try { result = executeQuery(qStr); diff --git a/src/tethys/deployment/DeploymentHandler.java b/src/tethys/deployment/DeploymentHandler.java index 10f95acf..16b63fdb 100644 --- a/src/tethys/deployment/DeploymentHandler.java +++ b/src/tethys/deployment/DeploymentHandler.java @@ -123,7 +123,7 @@ public class DeploymentHandler implements TethysStateObserver { */ public boolean updateProjectDeployments() { DeploymentData projData = tethysControl.getGlobalDeplopymentData(); - ArrayList tethysDocs = tethysControl.getDbxmlQueries().getProjectDeployments(projData.getProject()); + ArrayList tethysDocs = tethysControl.getDbxmlQueries().getProjectDeployments(projData.getProject(), getInstrumentId()); if (tethysDocs == null) { return false; } @@ -326,7 +326,7 @@ public class DeploymentHandler implements TethysStateObserver { dbxmlConnect.updateDocument(deployment); } else { - dbxmlConnect.postToTethys(deployment); + dbxmlConnect.postAndLog(deployment); } } catch (TethysException e) { @@ -363,7 +363,7 @@ public class DeploymentHandler implements TethysStateObserver { dbxmlConnect.updateDocument(deployment); } else { - dbxmlConnect.postToTethys(deployment); + dbxmlConnect.postAndLog(deployment); } } catch (TethysException e) { diff --git a/src/tethys/detection/DetectionsHandler.java b/src/tethys/detection/DetectionsHandler.java index a28ce7e3..659b9c24 100644 --- a/src/tethys/detection/DetectionsHandler.java +++ b/src/tethys/detection/DetectionsHandler.java @@ -41,9 +41,15 @@ import tethys.output.StreamExportParams; import tethys.output.TethysExportParams; import tethys.pamdata.TethysDataProvider; +/** + * Functions for handling output of Detections documents. + * Works closely with a TethysDataProvider and DataBlockSpeciesManager + * to generate Detections elements for an xml doc to export to Tethys. + * @author dg50 + * + */ public class DetectionsHandler { - private TethysControl tethysControl; public int uniqueDetectionsId=1; @@ -53,6 +59,10 @@ public class DetectionsHandler { private ExportWorker exportWorker; + /** + * + * @param tethysControl + */ public DetectionsHandler(TethysControl tethysControl) { super(); this.tethysControl = tethysControl; @@ -96,159 +106,13 @@ public class DetectionsHandler { return new StreamDetectionsSummary(detectionsDocs); } - -// /** -// * Here is where we export data for a specific data stream to Tethys. -// * -// * @param aDataBlock -// * @param aDeployment -// * @param tethysExportParams -// * @param streamExportParams -// */ -// public boolean exportDetections(PamDataBlock aDataBlock, Deployment deployment, DetectionGranularity granularity, TethysExportParams tethysExportParams, -// StreamExportParams streamExportParams) { -// if (granularity == null || granularity.granularity == null) { -// granularity = new DetectionGranularity(GRANULARITY.TIME, 3600); -// } -// switch (granularity.granularity) { -// case BINARYFILE: -// return exportByBinaryFile(aDataBlock, deployment, tethysExportParams, streamExportParams); -// case NONE: -// return exportEverything(aDataBlock, deployment, tethysExportParams, streamExportParams); -// case TIME: -// return exportByTimeChunk(aDataBlock, deployment, granularity.granularityIntervalSeconds, tethysExportParams, streamExportParams); -// default: -// break; -// } -// -// return false; -// -// -// } -// -// private boolean exportByBinaryFile(PamDataBlock dataBlock, Deployment deployment, -// TethysExportParams tethysExportParams, StreamExportParams streamExportParams) { -// long deploymentStart = TethysTimeFuncs.millisFromGregorianXML(deployment.getDeploymentDetails().getAudioTimeStamp()); -// long deploymentStop = TethysTimeFuncs.millisFromGregorianXML(deployment.getRecoveryDetails().getAudioTimeStamp()); -// /* -// * there should be a pretty good correspondence between the start of a binary file and the deploymentStart -// * since they all derived from the same start clock. -// */ -// OfflineDataMap dataMap = dataBlock.getPrimaryDataMap(); -// if (dataMap == null) { -// return false; -// } -// List mapPoints = dataMap.getMapPoints(); -// boolean ok = true; -// for (OfflineDataMapPoint mapPoint : mapPoints) { -// if (mapPoint.getEndTime() < deploymentStart) { -// continue; -// } -// if (mapPoint.getStartTime() >= deploymentStop) { -// continue; -// } -// ok &= loadAndExport(dataBlock, deployment, Math.max(deploymentStart, mapPoint.getStartTime()), -// Math.min(deploymentStop, mapPoint.getEndTime()), tethysExportParams, streamExportParams); -// } -// -// -// return ok; -// } -// -// private boolean exportEverything(PamDataBlock dataBlock, Deployment deployment, -// TethysExportParams tethysExportParams, StreamExportParams streamExportParams) { -// long deploymentStart = TethysTimeFuncs.millisFromGregorianXML(deployment.getDeploymentDetails().getAudioTimeStamp()); -// long deploymentStop = TethysTimeFuncs.millisFromGregorianXML(deployment.getRecoveryDetails().getAudioTimeStamp()); -// return loadAndExport(dataBlock, deployment, deploymentStart, deploymentStop, tethysExportParams, streamExportParams); -// } -// -// private boolean exportByTimeChunk(PamDataBlock dataBlock, Deployment deployment, long granularityIntervalSeconds, -// TethysExportParams tethysExportParams, StreamExportParams streamExportParams) { -// -// long deploymentStart = TethysTimeFuncs.millisFromGregorianXML(deployment.getDeploymentDetails().getAudioTimeStamp()); -// long deploymentStop = TethysTimeFuncs.millisFromGregorianXML(deployment.getRecoveryDetails().getAudioTimeStamp()); -// long chunkMillis = granularityIntervalSeconds*1000; -// long exportStart = deploymentStart / chunkMillis; -// exportStart *= chunkMillis; -// boolean ok = true; -// while (exportStart < deploymentStop) { -// ok &= loadAndExport(dataBlock, deployment, Math.max(deploymentStart, exportStart), -// Math.min(deploymentStop, exportStart + chunkMillis), tethysExportParams, streamExportParams); -// exportStart += chunkMillis; -// } -// -// return ok; -// } -// -///** -// * Load and export data for a given time period. This may be a complete deployment, it may be a short section. Do as told ! -// * Hopefully data interval is small enough to hold all in memory - it needs to be if the document will fit in mempory, so should be OK -// * @param dataBlock -// * @param deployment -// * @param max -// * @param min -// * @param tethysExportParams -// * @param streamExportParams -// */ -// private boolean loadAndExport(PamDataBlock dataBlock, Deployment deployment, long startTimeMillis, long endTimeMillis, -// TethysExportParams tethysExportParams, StreamExportParams streamExportParams) { -// // load the data -// dataBlock.loadViewerData(startTimeMillis, endTimeMillis, null); -// DataSelector dataSelector = dataBlock.getDataSelector(tethysControl.getDataSelectName(), false); -// /* -// * for easier synching, get a copy of the data and also apply the data selector right away so that -// * we've a list of exactly the right data. -// */ -// ArrayList data = dataBlock.getDataCopy(startTimeMillis, endTimeMillis, true, dataSelector); -// /* -// * Here, make Detection object and add the DetectionEffort data. -// */ -// DeploymentData globalDeplData = tethysControl.getGlobalDeplopymentData(); -// TethysDataProvider dataProvider = dataBlock.getTethysDataProvider(); -// Detections detections = new Detections(); -//// String prefix = getDetectionsDocIdPrefix(globalDeplData.getProject(), dataBlock); -// String prefix = deployment.getId(); -// detections.setId(String.format("%s_%d", prefix, uniqueDetectionsId++)); -// detections.setDescription(dataProvider.getDescription(deployment, tethysExportParams)); -// DataSourceType dataSource = new DataSourceType(); -// dataSource.setDeploymentId(deployment.getId()); -//// dataSource.setEnsembleId(""); ToDo -// detections.setDataSource(dataSource); -// detections.setAlgorithm(dataProvider.getAlgorithm()); -// detections.setUserId("Unknown user"); -// detections.setEffort(getDetectorEffort(deployment, startTimeMillis, endTimeMillis)); -// DetectionGroup detectionGroup = new DetectionGroup(); -// detections.setOnEffort(detectionGroup); -// List detectionList = detectionGroup.getDetection(); -// for (int i = 0; i < data.size(); i++) { -// PamDataUnit dataUnit = data.get(i); -// Detection detection = dataProvider.createDetection(dataUnit, tethysExportParams, streamExportParams); -// if (detection != null) { -// detectionList.add(detection); -// } -// } -// System.out.printf("Exporting %d %s detections for time period %s to %s\n", detectionList.size(), dataBlock.getDataName(), -// detections.getEffort().getStart().toString(), detections.getEffort().getEnd().toString()); -// /* -// * We should now have a fully populated Detections object, so write it to the database -// * using functions in DBXMLConnect -// */ -// ArrayList detectionDocuments = new ArrayList(); -// detectionDocuments.add(detections); -// -//// tethysControl.getDbxmlConnect().postToTethys(detectionDocuments); // call whatever you need to call in here to write the Detections. -// -// -// return true; -// -// } - -// private boolean exportByTimeChunk(PamDataBlock aDataBlock, Deployment deployment, long granularityIntervalSeconds, -// TethysExportParams tethysExportParams, StreamExportParams streamExportParams) { -// // TODO Auto-generated method stub -// return false; -// } - + /** + * Get the Detection Effort part of a Detections document + * @param pDeployment + * @param dataBlock + * @param exportParams + * @return + */ private DetectionEffort getDetectorEffort(PDeployment pDeployment, PamDataBlock dataBlock, StreamExportParams exportParams) { DetectionEffort effort = new DetectionEffort(); Deployment deployment = pDeployment.deployment; @@ -312,25 +176,24 @@ public class DetectionsHandler { } } + /** + * + * @param dataBlock + * @return default value is PAMGuard + */ public String getSupportSoftware(PamDataBlock dataBlock) { return "PAMGuard"; } + /** + * + * @param dataBlock + * @return PAMGuard version + */ public String getSupportSoftwareVersion(PamDataBlock dataBlock) { // should try to dig into the binary store and get the version from there. return PamguardVersionInfo.version; } -// /** -// * Get a prefix for a id for a Detections document. This is just the project name -// * and the datablock name. Something may need to be added to allow for multiple -// * analysis going into one database. -// * @param project -// * @param dataBlock -// * @return Detections document prefix. -// */ -// public static final String getDetectionsDocIdPrefix(String project, PamDataBlock dataBlock) { -// return project + "_" + dataBlock.getDataName(); -// } /** * Detections will be exported in a separate worker thread since export may take some time and @@ -375,7 +238,9 @@ public class DetectionsHandler { streamExportParams.granularity = allowed[0]; } - + /** + * send a cancel command to export thread if it's running + */ public void cancelExport() { activeExport = false; } @@ -482,18 +347,6 @@ public class DetectionsHandler { break; } -// if (documentCount > 500000 && mapPoint != dataMap.getLastMapPoint()) { -// prog = new DetectionExportProgress(deployment, currentDetections, -// lastUnitTime, totalCount, exportCount, skipCount, DetectionExportProgress.STATE_WRITING); -// exportObserver.update(prog); -// closeDetectionsDocument(currentDetections, mapPoint.getEndTime()); -// try { -// dbxmlConnect.postToTethys(currentDetections); -// } catch (TethysException e) { -// tethysControl.showException(e); -// } -// currentDetections = null; -// } } Detection dets[] = granularityHandler.cleanup(deployment.getAudioEnd()); if (dets != null) { @@ -504,9 +357,6 @@ public class DetectionsHandler { } -// prog = new DetectionExportProgress(null, null, -// lastUnitTime, totalCount, exportCount, skipCount, DetectionExportProgress.STATE_GATHERING); -// exportObserver.update(prog); return exportCount; }/** * Export detections in all deployments for this PAMGuard dataset. @@ -601,7 +451,7 @@ public class DetectionsHandler { exportObserver.update(prog); closeDetectionsDocument(currentDetections, mapPoint.getEndTime()); try { - dbxmlConnect.postToTethys(currentDetections); + dbxmlConnect.postAndLog(currentDetections); } catch (TethysException e) { tethysControl.showException(e); } @@ -627,7 +477,7 @@ public class DetectionsHandler { lastUnitTime, totalCount, exportCount, skipCount, DetectionExportProgress.STATE_WRITING); closeDetectionsDocument(currentDetections, deployment.getAudioEnd()); try { - dbxmlConnect.postToTethys(currentDetections); + dbxmlConnect.postAndLog(currentDetections); } catch (TethysException e) { tethysControl.showException(e); } @@ -640,6 +490,15 @@ public class DetectionsHandler { exportObserver.update(prog); return DetectionExportProgress.STATE_COMPLETE; } + + /** + * Start a new detections document for the deployment and datablock.
+ * Add all the standard information to the top of the Document + * @param deployment + * @param dataBlock + * @param exportParams + * @return new Detections document + */ private Detections startDetectionsDocument(PDeployment deployment, PamDataBlock dataBlock, StreamExportParams exportParams) { Detections detections = new Detections(); @@ -701,6 +560,14 @@ public class DetectionsHandler { detections.getEffort().setEnd(TethysTimeFuncs.xmlGregCalFromMillis(audioEnd)); } + /** + * Worker thread for exporting detections. + * Currently, it counts them first, then checks the user wants to export + * This requires going through the data twice, but may be sensible to avoid + * people outputting stupidly large documents. + * @author dg50 + * + */ private class ExportWorker extends SwingWorker implements DetectionExportObserver { private PamDataBlock dataBlock; diff --git a/src/tethys/output/TethysExporter.java b/src/tethys/output/TethysExporter.java index a3cc0def..7353f6ce 100644 --- a/src/tethys/output/TethysExporter.java +++ b/src/tethys/output/TethysExporter.java @@ -174,7 +174,7 @@ public class TethysExporter { // System.out.println(deployment.toString()); deploymentDocs.add(deployment); try { - tethysControl.getDbxmlConnect().postToTethys(deployment); + tethysControl.getDbxmlConnect().postAndLog(deployment); } catch (TethysException e) { tethysControl.showException(e); } diff --git a/src/tethys/pamdata/AutoTethysProvider.java b/src/tethys/pamdata/AutoTethysProvider.java index 81c95644..0d7d46e8 100644 --- a/src/tethys/pamdata/AutoTethysProvider.java +++ b/src/tethys/pamdata/AutoTethysProvider.java @@ -60,9 +60,9 @@ import java.io.StringReader; import java.net.URISyntaxException; /** - * Automatically provides Tethys data based on the SQL database interface - * for a data block. does most of what needs to be done, though individual modules - * may want to override this, call the base createDetection function and then add a + * Automatically provides Tethys data for a PAMGuard datablock. + * Does most of what needs to be done, though individual modules + * will want to override this, call the base createDetection function and then add a * few more bespoke elements. * @author dg50 * @@ -86,25 +86,7 @@ abstract public class AutoTethysProvider implements TethysDataProvider { e.printStackTrace(); } } -// -// @Override -// public TethysSchema getSchema() { -// SQLLogging logging = pamDataBlock.getLogging(); -// if (logging == null) { -// return null; -// } -// DBSchemaWriter schemaWriter = new DBSchemaWriter(); -// Document doc = schemaWriter.generateDatabaseSchema(pamDataBlock, logging, logging.getTableDefinition()); -// TethysSchema schema = new TethysSchema(doc); -// return schema; -// } - - // @Override - // public TethysDataPoint getDataPoint(PamDataUnit pamDataUnit) { - // // TODO Auto-generated method stub - // return null; - // } - + @Override public DescriptionType getDescription(Deployment deployment, TethysExportParams tethysExportParams) { DescriptionType description = new DescriptionType(); @@ -155,7 +137,6 @@ abstract public class AutoTethysProvider implements TethysDataProvider { try { paramPacker = new TethysParameterPacker(tethysControl); } catch (JAXBException e) { - // TODO Auto-generated catch block e.printStackTrace(); } List genList = paramPacker.packParameters(pamDataBlock); @@ -164,70 +145,17 @@ abstract public class AutoTethysProvider implements TethysDataProvider { } paramList.addAll(genList); - // Document doc = XMLUtils.createBlankDoc(); - // PamguardXMLWriter pamXMLWriter = PamguardXMLWriter.getXMLWriter(); - // Element dummyEl = doc.createElement("MODULES"); - // doc.appendChild(dummyEl); - // PamSettings[] settingsObjs = getSettingsObjects(); - // if (settingsObjs == null) { - // return null; - // } - //// pamXMLWriter.setStaticNameSpace(TethysControl.xmlNameSpace); - // Element settingsEl = pamXMLWriter.writeUnitSettings(doc, dummyEl, pamSettings, settingsObjs); - // if (settingsEl == null) { - // return null; - // } - // - //// settingsEl = addNameSpaceToElements(doc, settingsEl, TethysControl.xmlNameSpace); - // - // - // dummyEl.appendChild(settingsEl); - // NodeList childs = settingsEl.getChildNodes(); - // for (int i = 0; i < childs.getLength(); i++) { - // Node el = childs.item(i); - // // System.out.println(el.getNodeName()); - // if (el instanceof Element) { - // paramList.add((Element) el); - // } - // } - // - // // Document doc = pamXMLWriter.writeOneModule((PamSettings) pamControlledUnit, System.currentTimeMillis()); - // // String moduleXML = null; - // if (doc != null) { - // // this string should be XML of all the settings for the module controlling this - // // datablock. - // // moduleXML = pamXMLWriter.getAsString(doc, true); // change to false to get smaller xml - // // System.out.printf("Module settings for datablock %s are:\n", moduleXML); - // // System.out.println(moduleXML); - // // Element pamguard = doc.get("PAMGUARD"); - // // Element modules = (Element) pamguard.getElementsByTagName("MODULES"); - // // doc.get - // // NodeList childs = doc.getChildNodes(); - // // for (int i = 0; i < childs.getLength(); i++) { - // // Node el = childs.item(i); - // // System.out.println(el.getNodeName()); - // // if (el instanceof Element) { - // // paramList.add((Element) el); - // // } - // // } - // // String moduleXML = pamXMLWriter.getAsString(doc, true); // change to false to get smaller xml - // // System.out.printf("Module settings for datablock %s are:\n%s", this.pamDataBlock.getDataName(), moduleXML); - // } - // - // // // try the old say - // // Document doc2 = pamXMLWriter.writeOneModule((PamSettings) pamControlledUnit, System.currentTimeMillis()); - // // String moduleXML = null; - // // if (doc2 != null) { - // // // this string should be XML of all the settings for the module controlling this - // // // datablock. - // // moduleXML = pamXMLWriter.getAsString(doc2, true); // change to false to get smaller xml - // // System.out.printf("Module settings for datablock %s are:\n%s", pamDataBlock.getDataName(),moduleXML); - // // } - // // - return parameters; } + /** + * Not used. Was an attempt to automatically add name spaces to the PAMGuard settings + * XML I generate, but we found a better way. + * @param doc + * @param settingsEl + * @param xmlNameSpace + * @return + */ private Element addNameSpaceToElements(Document doc, Element settingsEl, String xmlNameSpace) { diff --git a/src/tethys/pamdata/TethysDataPoint.java b/src/tethys/pamdata/TethysDataPoint.java deleted file mode 100644 index 5eefdae1..00000000 --- a/src/tethys/pamdata/TethysDataPoint.java +++ /dev/null @@ -1,18 +0,0 @@ -package tethys.pamdata; - -import PamguardMVC.PamDataUnit; - -/** - * This will be a unit of Tethys Data, e.g. a Detection. - * Can it also be used for things like GPS data ? - * @author dg50 - * - */ -public class TethysDataPoint { - - public TethysDataPoint(PamDataUnit dataUnit) { - // TODO Auto-generated constructor stub - } - - -} diff --git a/src/tethys/pamdata/TethysParameterPacker.java b/src/tethys/pamdata/TethysParameterPacker.java index c4c7e6f7..892859e1 100644 --- a/src/tethys/pamdata/TethysParameterPacker.java +++ b/src/tethys/pamdata/TethysParameterPacker.java @@ -40,40 +40,6 @@ import tethys.TethysControl; */ public class TethysParameterPacker { -// /** -// * Parameters should look something like below. however, only packing them with a long -// schema name seems to work. -// * -// -//Analyst detections -//Triton -//unknown -// -//0.75 -//0.0 -//5000.0 -//30.0 -// -// - /* - * -// // this works. Can look at the source to see how it's done. -// // may have fun making this work for more complex structures. -// try { -// Helper helper = new Helper(); -// helper.AddAnyElement(paramList, "Threshold", "3.5"); -// -// * and see Matlab code for dbStruct2DOM at C:\Users\dg50\source\repos\TethysMatlab\db -// * for more complex structures -// * This looks like it may be possible to rewrite my functions for -// * writing structures to XML using the helper.AddAnyElement function as -// * an example and I should be able to output my complex structures. -// -// } catch (JAXBException | ParserConfigurationException e) { -// e.printStackTrace(); -// } - */ - private MarshalXML marshaller; private PamguardXMLWriter xmlWriter; @@ -94,6 +60,12 @@ public class TethysParameterPacker { xmlWriter = PamguardXMLWriter.getXMLWriter(); } + /** + * Get a list of elements of parameters for all modules feeding + * the given datablock. These are given in reverse order. + * @param pamDataBlock output datablock + * @return parameters of all modules feeding that datablock. + */ public List packParameters(PamDataBlock pamDataBlock) { PamProcess pamProcess = pamDataBlock.getParentProcess(); PamControlledUnit pamControlledUnit = pamProcess.getPamControlledUnit(); diff --git a/src/tethys/pamdata/TethysSchema.java b/src/tethys/pamdata/TethysSchema.java index 4ddb9b08..324260b8 100644 --- a/src/tethys/pamdata/TethysSchema.java +++ b/src/tethys/pamdata/TethysSchema.java @@ -7,6 +7,7 @@ import org.w3c.dom.Document; * wrapper around an XML string, or a JAXB object or something, * but may get more sophisticated. TBD in discussions with SDSU */ +@Deprecated public class TethysSchema { private Document schemaDoc;