diff --git a/.classpath b/.classpath index 924124d8..26c568d7 100644 --- a/.classpath +++ b/.classpath @@ -6,8 +6,9 @@ - + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 43939db6..c2082326 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,16 +1,16 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.1 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=21 +org.eclipse.jdt.core.compiler.compliance=1.3 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.assertIdentifier=ignore org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=ignore org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=21 +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.3 diff --git a/pom.xml b/pom.xml index 7f5eb4e8..ef9c2acd 100644 --- a/pom.xml +++ b/pom.xml @@ -888,7 +888,7 @@ tethys.org nilus - 3.0 + 3.1 diff --git a/repo/tethys/org/nilus/3.1/_remote.repositories b/repo/tethys/org/nilus/3.1/_remote.repositories new file mode 100644 index 00000000..e575e75f --- /dev/null +++ b/repo/tethys/org/nilus/3.1/_remote.repositories @@ -0,0 +1,4 @@ +#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. +#Tue Jul 16 19:29:56 BST 2024 +nilus-3.1.jar>= +nilus-3.1.pom>= diff --git a/repo/tethys/org/nilus/3.1/nilus-3.1-javadoc.jar b/repo/tethys/org/nilus/3.1/nilus-3.1-javadoc.jar new file mode 100644 index 00000000..3e6f7e64 Binary files /dev/null and b/repo/tethys/org/nilus/3.1/nilus-3.1-javadoc.jar differ diff --git a/repo/tethys/org/nilus/3.1/nilus-3.1.jar b/repo/tethys/org/nilus/3.1/nilus-3.1.jar new file mode 100644 index 00000000..1436b464 Binary files /dev/null and b/repo/tethys/org/nilus/3.1/nilus-3.1.jar differ diff --git a/repo/tethys/org/nilus/3.1/nilus-3.1.pom b/repo/tethys/org/nilus/3.1/nilus-3.1.pom new file mode 100644 index 00000000..cff3acf1 --- /dev/null +++ b/repo/tethys/org/nilus/3.1/nilus-3.1.pom @@ -0,0 +1,9 @@ + + + 4.0.0 + tethys.org + nilus + 3.1 + POM was created from install:install-file + diff --git a/src/PamView/dialog/PamDialog.java b/src/PamView/dialog/PamDialog.java index 64e7b5f1..cfb42d23 100644 --- a/src/PamView/dialog/PamDialog.java +++ b/src/PamView/dialog/PamDialog.java @@ -306,6 +306,9 @@ abstract public class PamDialog extends JDialog { * put the dialog near the mouse location. */ public void moveToMouseLocation() { + if (MouseInfo.getPointerInfo() == null) { + return; + } Point mouse = MouseInfo.getPointerInfo().getLocation(); moveToLocation(mouse); } diff --git a/src/Spectrogram/SpectrogramDisplay.java b/src/Spectrogram/SpectrogramDisplay.java index 02b0548c..b2cf689b 100644 --- a/src/Spectrogram/SpectrogramDisplay.java +++ b/src/Spectrogram/SpectrogramDisplay.java @@ -2929,7 +2929,7 @@ InternalFrameListener, DisplayPanelContainer, SpectrogramParametersUser, PamSett String name = spectrogramDisplay.getDataSelectorName(panelId); DataSelector dataSelector = usedDataBlock.getDataSelector(name, false); - if (dataSelector.getParams().getCombinationFlag() == DataSelectParams.DATA_SELECT_DISABLE) { + if (dataSelector != null && dataSelector.getParams().getCombinationFlag() == DataSelectParams.DATA_SELECT_DISABLE) { dataSelector = null; } directDrawProjector.setDataSelector(dataSelector); diff --git a/src/tethys/Collection.java b/src/tethys/Collection.java index 93a6acb2..33f5541f 100644 --- a/src/tethys/Collection.java +++ b/src/tethys/Collection.java @@ -89,7 +89,7 @@ public enum Collection { return Calibrations; case "nilus.Ensemble": return Ensembles; - case "nilus.Localization": + case "nilus.Localize": return Localizations; case "nilus.SpeciesAbbreviation": return SpeciesAbbreviations; diff --git a/src/tethys/TethysControl.java b/src/tethys/TethysControl.java index 42889f45..45671af1 100644 --- a/src/tethys/TethysControl.java +++ b/src/tethys/TethysControl.java @@ -49,6 +49,7 @@ import tethys.dbxml.TethysException; import tethys.dbxml.TethysQueryException; import tethys.deployment.DeploymentHandler; import tethys.detection.DetectionsHandler; +import tethys.localization.LocalizationHandler; import tethys.niluswraps.PDeployment; import tethys.output.DatablockSynchInfo; import tethys.output.TethysExportParams; @@ -91,6 +92,7 @@ public class TethysControl extends PamControlledUnit implements PamSettings, Tet private DeploymentHandler deploymentHandler; private DetectionsHandler detectionsHandler; private CalibrationHandler calibrationHandler; + private LocalizationHandler localizationHandler; private ITISFunctions itisFunctions; @@ -102,6 +104,7 @@ public class TethysControl extends PamControlledUnit implements PamSettings, Tet deploymentHandler = new DeploymentHandler(this); detectionsHandler = new DetectionsHandler(this); calibrationHandler = new CalibrationHandler(this); + localizationHandler = new LocalizationHandler(this); serverCheckTimer = new Timer(10000, new ActionListener() { @Override @@ -569,8 +572,8 @@ public class TethysControl extends PamControlledUnit implements PamSettings, Tet int detectionCount = 0; int documentCount = 0; for (PDeployment pDepl : matchedDeployments) { - detectionCount += dbxmlQueries.countData(synchInfo.getDataBlock(), pDepl.deployment.getId()); - ArrayList detectionsNames = getDbxmlQueries().getDetectionsDocuments(synchInfo.getDataBlock(), pDepl.deployment.getId()); + detectionCount += dbxmlQueries.countData(synchInfo.getDataBlock(), pDepl.getDocumentId()); + ArrayList detectionsNames = getDbxmlQueries().getDetectionsDocuments(synchInfo.getDataBlock(), pDepl.getDocumentId()); if (detectionsNames != null) { documentCount += detectionsNames.size(); } @@ -595,6 +598,13 @@ public class TethysControl extends PamControlledUnit implements PamSettings, Tet return detectionsHandler; } + /** + * @return the localizationHandler + */ + public LocalizationHandler getLocalizationHandler() { + return localizationHandler; + } + public void showException(TethysException tethysException) { String title = tethysException.getMessage(); StackTraceElement[] stack = tethysException.getStackTrace(); diff --git a/src/tethys/TethysMenuActions.java b/src/tethys/TethysMenuActions.java index 625096a9..8b686cd5 100644 --- a/src/tethys/TethysMenuActions.java +++ b/src/tethys/TethysMenuActions.java @@ -26,14 +26,14 @@ public class TethysMenuActions { } public void deploymentMouseActions(MouseEvent e, PDeployment pDeployment) { - ArrayList detDocNames = tethysControl.getDbxmlQueries().getDetectionsDocuments(pDeployment.deployment.getId()); + ArrayList detDocNames = tethysControl.getDbxmlQueries().getDetectionsDocuments(pDeployment.nilusObject.getId()); // System.out.println("Detections for deployment " + pDeployment.deployment.getId()); // for (String detName : detDocNames) { // System.out.println(detName); // } JPopupMenu menu = new JPopupMenu(); if (detDocNames.size() == 0) { - JMenuItem menuItem = new JMenuItem("Delete deployment " + pDeployment.deployment.getId()); + JMenuItem menuItem = new JMenuItem("Delete deployment " + pDeployment.nilusObject.getId()); menuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -47,7 +47,7 @@ public class TethysMenuActions { menu.add(menuItem); } else { - String str = String.format("Delete deployment %s and %d Detections documents", pDeployment.deployment.getId(), detDocNames.size()); + String str = String.format("Delete deployment %s and %d Detections documents", pDeployment.nilusObject.getId(), detDocNames.size()); JMenuItem menuItem = new JMenuItem(str); menuItem.addActionListener(new ActionListener() { @Override @@ -65,6 +65,6 @@ public class TethysMenuActions { } protected void deleteDeployment(PDeployment pDeployment) throws TethysException { - tethysControl.getDbxmlConnect().deleteDeployment(pDeployment.deployment.getId()); + tethysControl.getDbxmlConnect().deleteDeployment(pDeployment.nilusObject.getId()); } } diff --git a/src/tethys/calibration/CalibrationHandler.java b/src/tethys/calibration/CalibrationHandler.java index 2aff00d8..b7c21c7f 100644 --- a/src/tethys/calibration/CalibrationHandler.java +++ b/src/tethys/calibration/CalibrationHandler.java @@ -420,10 +420,24 @@ public class CalibrationHandler extends CollectionHandler implements TethysState calibration.setSensitivityDBFS(fullScale); } FrequencyResponse frs = calibration.getFrequencyResponse(); + if (frs == null) { + frs = new FrequencyResponse(); + try { + Helper.createRequiredElements(frs); + } catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) { + e.printStackTrace(); + } + calibration.setFrequencyResponse(frs); + } List hz = frs.getHz(); List db = frs.getDB(); +// if (hz == null) { +// +// } + if (hz != null && db != null) { hz.add(Double.valueOf(0)); db.add(Double.valueOf(hSens+preampGain)); + } if (NilusChecker.isEmpty(calibration.getResponsibleParty())) { calibration.setResponsibleParty(null); diff --git a/src/tethys/dbxml/DBXMLConnect.java b/src/tethys/dbxml/DBXMLConnect.java index 67ae165d..19b6598e 100644 --- a/src/tethys/dbxml/DBXMLConnect.java +++ b/src/tethys/dbxml/DBXMLConnect.java @@ -515,7 +515,7 @@ C:\Users\dg50\AppData\Local\Temp\PAMGuardTethys\20080311_2DSimplex_0.xmlnot: 0 b * @param nilusObject * @return document Id for any type of document, or null if the document doesn't have a getID function */ - private String getDocumentId(Object nilusObject) { + public static String getDocumentId(Object nilusObject) { String tempName = null; Class nilusClass = nilusObject.getClass(); Method getId; diff --git a/src/tethys/dbxml/DBXMLQueries.java b/src/tethys/dbxml/DBXMLQueries.java index d4c0be9a..b3392568 100644 --- a/src/tethys/dbxml/DBXMLQueries.java +++ b/src/tethys/dbxml/DBXMLQueries.java @@ -32,6 +32,7 @@ import nilus.Detections; import nilus.GranularityEnumType; import nilus.GranularityType; import nilus.Helper; +import nilus.Localize; import tethys.Collection; import tethys.DocumentInfo; import tethys.TethysControl; @@ -561,6 +562,63 @@ public class DBXMLQueries { } return detectionsNames; } + /** + * Get a list of Localization documents which associate with a datablock and a deploymentId. + * @param dataBlock + * @param deploymentId can be null to get all docs for data block + * @return + */ + public ArrayList getLocalizationDocuments(PamDataBlock dataBlock, String deploymentId) { + /** + * first query for Detections documents associated with this deployment and datablock. + * updated May 23 + */ + if (dataBlock == null) { + return null; + } + String queryNoDepl = "{\"species\":{\"query\":{\"op\":\"lib:completename2tsn\",\"optype\":\"function\",\"operands\":[\"%s\"]},\"return\":{\"op\":\"lib:tsn2completename\",\"optype\":\"function\",\"operands\":[\"%s\"]}},\"return\":[\"Localize/Id\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Localize/Algorithm/Software\",\"LongDataName\"],\"optype\":\"binary\"}],\"enclose\":1}"; + String queryWithDepl = "{\"species\":{\"query\":{\"op\":\"lib:completename2tsn\",\"optype\":\"function\",\"operands\":[\"%s\"]},\"return\":{\"op\":\"lib:tsn2completename\",\"optype\":\"function\",\"operands\":[\"%s\"]}},\"return\":[\"Localize/Id\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Localize/DataSource/DeploymentId\",\"TheDeploymentId\"],\"optype\":\"binary\"},{\"op\":\"=\",\"operands\":[\"Localize/Algorithm/Software\",\"LongDataName\"],\"optype\":\"binary\"}],\"enclose\":1}"; + String query; + if (deploymentId == null) { + query = queryNoDepl; + } + else { + query = queryWithDepl.replace("TheDeploymentId", deploymentId); + } + query = query.replace("LongDataName", dataBlock.getLongDataName()); + DBQueryResult queryResult = null; + try { + queryResult = executeQuery(query); + } catch (TethysQueryException e1) { + tethysControl.showException(e1); + return null; + } + if (queryResult ==null) { + return null; + } + Document doc; + try { + doc = queryResult.getDocument(); + } catch (ParserConfigurationException | SAXException | IOException e) { + e.printStackTrace(); + return null; + } + if (doc == null) { + return null; + } + ArrayList detectionsNames = new ArrayList(); + int count = 0; + NodeList returns = doc.getElementsByTagName("Localize"); + // if (returns.getLength() == 0) { + // returns = doc.getElementsByTagName("Result"); + // } + for (int i = 0; i < returns.getLength(); i++) { + Node aNode = returns.item(i); + String docName = aNode.getTextContent(); + detectionsNames.add(docName); + } + return detectionsNames; + } /** @@ -727,6 +785,38 @@ public class DBXMLQueries { } return count; } + + /** + * Count on effort detections in a Detections document + * @param docName + * @return + */ + public int countLocalizations2(String docName) { + TethysExportParams params = tethysControl.getTethysExportParams(); + String queryBase = "count(collection(\"Localizations\")/Localize[Id=\"ReplaceDocumentId\"]/Localizations/Localization)"; + String query = queryBase.replace("ReplaceDocumentId", docName); + + String result = null; + try { + Queries queries = dbXMLConnect.getTethysQueries(); + result = queries.QueryTethys(query); + // System.out.println(result); + } + catch (Exception e) { + System.out.println("Error executing " + query); + // e.printStackTrace(); + return -1; + } + int count = 0; + try { + count = Integer.valueOf(result); + } + catch (NumberFormatException e) { + System.out.println("Unable to interpret count data " + result); + return 0; + } + return count; + } // /** // * Get a count of the detections in a detections document. @@ -1024,5 +1114,108 @@ public class DBXMLQueries { // TODO Auto-generated method stub return detections; } + /** + * Get the basic information about a Detections document. This is basically everything apart from + * the actual detections themselves. + * @param aDoc + * @return + */ + public Localize getLocalizationDocInfo(String locDocName) { +// String oldqueryBase = "{\"species\":{\"query\":{\"op\":\"lib:abbrev2tsn\",\"optype\":\"function\",\"operands\":[\"%s\",\"SIO.SWAL.v1\"]},\"return\":{\"op\":\"lib:tsn2abbrev\",\"optype\":\"function\",\"operands\":[\"%s\",\"SIO.SWAL.v1\"]}},\"return\":[\"Detections/Id\",\"Detections/Description\",\"Detections/DataSource\",\"Detections/Algorithm\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Detections/Id\",\"DetectionsDocName\"],\"optype\":\"binary\"}],\"enclose\":1}"; + // updated May 23 +// String queryBase = "{\"species\":{\"query\":{\"op\":\"lib:completename2tsn\",\"optype\":\"function\",\"operands\":[\"%s\"]},\"return\":{\"op\":\"lib:tsn2completename\",\"optype\":\"function\",\"operands\":[\"%s\"]}},\"return\":[\"Localize/Id\",\"Localize/Description\",\"Localize/DataSource\",\"Localize/Algorithm\",\"Localize/QualityAssurance\",\"Localize/UserId\",\"Localize/MetadataInfo\",\"Localize/Effort\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Localize/Id\",\"LocalizationsDocName\"],\"optype\":\"binary\"}],\"enclose\":1}"; + String queryBase = "{\"species\":{\"query\":{\"op\":\"lib:completename2tsn\",\"optype\":\"function\",\"operands\":[\"%s\"]},\"return\":{\"op\":\"lib:tsn2completename\",\"optype\":\"function\",\"operands\":[\"%s\"]}},\"return\":[\"Localize/Id\",\"Localize/Description\",\"Localize/DataSource\",\"Localize/Algorithm\",\"Localize/QualityAssurance\",\"Localize/UserId\",\"Localize/Effort\"],\"select\":[{\"op\":\"=\",\"operands\":[\"Localize/Id\",\"LocalizationsDocName\"],\"optype\":\"binary\"}],\"enclose\":1}"; + String query = queryBase.replace("LocalizationsDocName", locDocName); + DBQueryResult queryResult; + try { + queryResult = executeQuery(query); + } catch (TethysQueryException e) { + tethysControl.showException(e); + return null; + } + Document doc; + try { + doc = queryResult.getDocument(); + } catch (ParserConfigurationException | SAXException | IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + // System.out.println(queryResult.queryResult); + + Localize localize = new Localize(); + try { + Helper.createRequiredElements(localize); + } catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) { + e.printStackTrace(); + } + + NodeList returns = doc.getElementsByTagName("Result"); + // System.out.println("N projects = " + returns.getLength()); + int n = returns.getLength(); + if (n == 0) { + return null; + } + Element result = (Element) returns.item(0); + + DescriptionType description = localize.getDescription(); + if (description == null) { + description = new DescriptionType(); + localize.setDescription(description); + } + localize.setId(getElementData(result, "Id")); + description.setAbstract(getElementData(result, "Description.Abstract")); + description.setMethod(getElementData(result, "Description.Method")); + description.setObjectives(getElementData(result, "Description.Objectives")); + + String deployment = getElementData(result, "DataSource.DeploymentId"); + if (deployment != null) { + DataSourceType dataSource = localize.getDataSource(); + if (dataSource == null) { + dataSource = new DataSourceType(); + localize.setDataSource(dataSource); + } + dataSource.setDeploymentId(deployment); + } + + // get the effort start an end + String effStart = getElementData(result, "Effort.Start"); + String effEnd = getElementData(result, "Effort.End"); + localize.getEffort().setStart(TethysTimeFuncs.fromGregorianXML(effStart)); + localize.getEffort().setEnd(TethysTimeFuncs.fromGregorianXML(effEnd)); + // try to find the granularity. +// String granularityString = getElementData(result, "Effort.Kind.Granularity"); +// GranularityEnumType granularity = null; +// if (granularityString != null) { +// granularity = GranularityEnumType.fromValue(granularityString); +// List kinds = detections.getEffort().getKind(); +// DetectionEffortKind kind = new DetectionEffortKind(); +// GranularityType granularityType = new GranularityType(); +// granularityType.setValue(granularity); +// kind.setGranularity(granularityType); +// // try to find the rest of the granularity information. +// String binSize_m = getElementAttribute(result, "Effort.Kind.Granularity", "BinSize_m"); +// String encounterGap_m = getElementAttribute(result, "Effort.Kind.Granularity", "EncounterGap_m"); +// String firstBinStart = getElementAttribute(result, "Effort.Kind.Granularity", "FirstBinStart"); +// try { +// granularityType.setBinSizeMin(Double.valueOf(binSize_m)); +// } +// catch (NumberFormatException e) { +// } +// try { +// granularityType.setEncounterGapMin(Double.valueOf(encounterGap_m)); +// } +// catch (NumberFormatException e) { +// } +// +// kinds.add(kind); +// } + // String + + + + // TODO Auto-generated method stub + return localize; + } } diff --git a/src/tethys/deployment/DeploymentHandler.java b/src/tethys/deployment/DeploymentHandler.java index 8d82ac48..51768b8f 100644 --- a/src/tethys/deployment/DeploymentHandler.java +++ b/src/tethys/deployment/DeploymentHandler.java @@ -492,7 +492,7 @@ public class DeploymentHandler extends CollectionHandler implements TethysStateO PDeployment exDeploymnet = onePeriod.getMatchedTethysDeployment(); try { if (exDeploymnet != null) { - deployment.setId(exDeploymnet.deployment.getId()); + deployment.setId(exDeploymnet.nilusObject.getId()); dbxmlConnect.updateDocument(deployment); } else { @@ -522,7 +522,7 @@ public class DeploymentHandler extends CollectionHandler implements TethysStateO String id = String.format("%s_%d", exportParams.getDatasetName(), i); if (exDeploymnet != null) { deployment = createDeploymentDocument(freeId, recordPeriod, id); - deployment.setId(exDeploymnet.deployment.getId()); + deployment.setId(exDeploymnet.nilusObject.getId()); } if (deployment == null) { deployment = createDeploymentDocument(freeId++, recordPeriod, id); @@ -646,7 +646,7 @@ public class DeploymentHandler extends CollectionHandler implements TethysStateO } ArrayList instruments = new ArrayList<>(); for (PDeployment aDepl : projectDeployments) { - Instrument intr = aDepl.deployment.getInstrument(); + Instrument intr = aDepl.nilusObject.getInstrument(); if (intr == null) { continue; } @@ -764,7 +764,7 @@ public class DeploymentHandler extends CollectionHandler implements TethysStateO int firstFree = 0; if (projectDeployments != null) { for (PDeployment dep : projectDeployments) { - firstFree = Math.max(firstFree, dep.deployment.getDeploymentId()+1); + firstFree = Math.max(firstFree, dep.nilusObject.getDeploymentId()+1); } } return firstFree; diff --git a/src/tethys/detection/DetectionsHandler.java b/src/tethys/detection/DetectionsHandler.java index 3d3e1c13..8a6f0b88 100644 --- a/src/tethys/detection/DetectionsHandler.java +++ b/src/tethys/detection/DetectionsHandler.java @@ -12,6 +12,8 @@ import javax.xml.datatype.XMLGregorianCalendar; import PamController.PamControlledUnit; import PamController.PamController; import PamController.PamguardVersionInfo; +import PamDetection.LocContents; +import PamDetection.LocalisationInfo; import PamModel.PamPluginInterface; import PamUtils.PamCalendar; import PamView.dialog.PamDialog; @@ -26,6 +28,8 @@ import dataMap.OfflineDataMap; import dataMap.OfflineDataMapPoint; import nilus.AlgorithmType; import nilus.AlgorithmType.SupportSoftware; +import nilus.Localize.Effort; +import nilus.Localize.Effort.CoordinateReferenceSystem; import nilus.Localize.Localizations; import nilus.DataSourceType; import nilus.Deployment; @@ -36,6 +40,7 @@ import nilus.DetectionGroup; import nilus.Detections; import nilus.GranularityEnumType; import nilus.Helper; +import nilus.Localize; import tethys.Collection; import tethys.CollectionHandler; import tethys.TethysControl; @@ -43,6 +48,11 @@ import tethys.TethysTimeFuncs; import tethys.dbxml.DBXMLConnect; import tethys.dbxml.TethysException; import tethys.deployment.DeploymentHandler; +import tethys.localization.CoordinateName; +import tethys.localization.LocalizationSubType; +import tethys.localization.LocalizationType; +import tethys.localization.PLocalization; +import tethys.niluswraps.NilusDataWrapper; import tethys.niluswraps.PDeployment; import tethys.niluswraps.PDetections; import tethys.output.StreamExportParams; @@ -85,7 +95,7 @@ public class DetectionsHandler extends CollectionHandler { * this data set (not the entire project). * @param dataBlock */ - public StreamDetectionsSummary getStreamDetections(PamDataBlock dataBlock) { + public StreamDetectionsSummary> getStreamDetections(PamDataBlock dataBlock) { ArrayList deployments = tethysControl.getDeploymentHandler().getMatchedDeployments(); return getStreamDetections(dataBlock, deployments); } @@ -97,12 +107,12 @@ public class DetectionsHandler extends CollectionHandler { * @param deployments * @return */ - public StreamDetectionsSummary getStreamDetections(PamDataBlock dataBlock, ArrayList deployments) { + public StreamDetectionsSummary> getStreamDetections(PamDataBlock dataBlock, ArrayList deployments) { // get the basic data for each document including it's Description. ArrayList detectionsDocs = new ArrayList<>(); for (PDeployment aDep : deployments) { - ArrayList someNames = tethysControl.getDbxmlQueries().getDetectionsDocuments(dataBlock, aDep.deployment.getId()); + ArrayList someNames = tethysControl.getDbxmlQueries().getDetectionsDocuments(dataBlock, aDep.nilusObject.getId()); if (someNames == null) { continue; } @@ -117,6 +127,7 @@ public class DetectionsHandler extends CollectionHandler { return new StreamDetectionsSummary(detectionsDocs); } + /** * Get the Detection Effort part of a Detections document * @param pDeployment @@ -126,12 +137,12 @@ public class DetectionsHandler extends CollectionHandler { */ private DetectionEffort getDetectorEffort(PDeployment pDeployment, PamDataBlock dataBlock, StreamExportParams exportParams) { DetectionEffort effort = new DetectionEffort(); - Deployment deployment = pDeployment.deployment; + Deployment deployment = pDeployment.nilusObject; Long effortStart = pDeployment.getAudioStart(); Long effortEnd = pDeployment.getAudioEnd(); effort.setStart(TethysTimeFuncs.xmlGregCalFromMillis(effortStart)); effort.setEnd(TethysTimeFuncs.xmlGregCalFromMillis(effortEnd)); -// effort.set // no setter for DetectionEffortKind + // effort.set // no setter for DetectionEffortKind List effortKinds = effort.getKind(); TethysDataProvider dataProvider = dataBlock.getTethysDataProvider(tethysControl); @@ -202,7 +213,7 @@ public class DetectionsHandler extends CollectionHandler { * @return PAMGuard version */ public String getSupportSoftwareVersion(PamDataBlock dataBlock) { -// should try to dig into the binary store and get the version from there. + // should try to dig into the binary store and get the version from there. return PamguardVersionInfo.version; } @@ -256,7 +267,7 @@ public class DetectionsHandler extends CollectionHandler { public void cancelExport() { activeExport = false; } - + /** * Round a bin start so that it's aligned correctly with * day starts. @@ -284,7 +295,7 @@ public class DetectionsHandler extends CollectionHandler { TethysExportParams exportParams = tethysControl.getTethysExportParams(); DeploymentHandler depHandler = tethysControl.getDeploymentHandler(); ArrayList deployments = depHandler.getMatchedDeployments(); -// Detections currentDetections = null; + // Detections currentDetections = null; OfflineDataMap dataMap = dataBlock.getPrimaryDataMap(); DataSelector dataSelector = dataBlock.getDataSelector(tethysControl.getDataSelectName(), false); int totalCount = dataMap.getDataCount(); @@ -315,7 +326,7 @@ public class DetectionsHandler extends CollectionHandler { // export everything in that deployment. // need to loop through all map points in this interval. List mapPoints = dataMap.getMapPoints(); - + for (OfflineDataMapPoint mapPoint : mapPoints) { if (!activeExport) { prog = new DetectionExportProgress(deployment, null,totalMapPoints, doneMapPoints, @@ -346,24 +357,24 @@ public class DetectionsHandler extends CollectionHandler { if (dets != null) { exportCount+=dets.length; documentCount+=dets.length; - + if (exportCount % 100 == 0) { prog = new DetectionExportProgress(deployment, null,totalMapPoints, doneMapPoints, lastUnitTime, totalCount, exportCount, skipCount, DetectionExportProgress.STATE_COUNTING); exportObserver.update(prog); } } -// Detection det = dataProvider.createDetection(dataUnit, exportParams, streamExportParams); -// exportCount++; -// documentCount++; -// onEffort.getDetection().add(det); + // Detection det = dataProvider.createDetection(dataUnit, exportParams, streamExportParams); + // exportCount++; + // documentCount++; + // onEffort.getDetection().add(det); lastUnitTime = dataUnit.getTimeMilliseconds(); } doneMapPoints++; prog = new DetectionExportProgress(deployment, null,totalMapPoints, doneMapPoints, lastUnitTime, totalCount, exportCount, skipCount, DetectionExportProgress.STATE_COUNTING); exportObserver.update(prog); - + if (viewerLoadPolicy == ViewerLoadPolicy.LOAD_ALWAYS_EVERYTHING) { break; } @@ -375,14 +386,14 @@ public class DetectionsHandler extends CollectionHandler { if (dets != null) { exportCount += dets.length; } - + } return exportCount; } - + /** * Export detections and localisations in all deployments for this PAMGuard dataset. * @param dataBlock @@ -399,14 +410,15 @@ public class DetectionsHandler extends CollectionHandler { DBXMLConnect dbxmlConnect = tethysControl.getDbxmlConnect(); DeploymentHandler depHandler = tethysControl.getDeploymentHandler(); ArrayList deployments = depHandler.getMatchedDeployments(); - + /* * The main documents for both dets and locs. */ Detections detectionsDocument = null; - Localizations localisationsDocument = null; + Localize localiseDocument = null; DetectionGroup onEffortDetections = null; - + Localizations localisations = null; + OfflineDataMap dataMap = dataBlock.getPrimaryDataMap(); DataSelector dataSelector = dataBlock.getDataSelector(tethysControl.getDataSelectName(), false); int totalCount = dataMap.getDataCount(); @@ -431,6 +443,8 @@ public class DetectionsHandler extends CollectionHandler { lastUnitTime, totalCount, exportCount, skipCount, DetectionExportProgress.STATE_COUNTING); exportObserver.update(prog); granularityHandler.prepare(deployment.getAudioStart()); + + List detectionList; // export everything in that deployment. // need to loop through all map points in this interval. @@ -448,14 +462,25 @@ public class DetectionsHandler extends CollectionHandler { detectionsDocument = startDetectionsDocument(deployment, dataBlock, streamExportParams); detectionsDocument.getEffort().setStart(TethysTimeFuncs.xmlGregCalFromMillis(deployment.getAudioStart())); onEffortDetections = detectionsDocument.getOnEffort(); + detectionList = onEffortDetections.getDetection(); +// if {detectionList == null) { +// onEffortDetections. +// } } else { onEffortDetections = null; + detectionList = null; } - if (localisationsDocument == null && streamExportParams.exportLocalisations) { - localisationsDocument = startLocalisationDocument(deployment, dataBlock, streamExportParams); + if (localiseDocument == null && streamExportParams.exportLocalisations) { + localiseDocument = startLocalisationDocument(deployment, dataBlock, streamExportParams); + Effort eff = localiseDocument.getEffort(); + localiseDocument.getEffort().setStart(TethysTimeFuncs.xmlGregCalFromMillis(deployment.getAudioStart())); + localisations = localiseDocument.getLocalizations(); } - + else { + localisations = null; + } + if (mapPoint.getEndTime() < deployment.getAudioStart()) { continue; } @@ -476,10 +501,14 @@ public class DetectionsHandler extends CollectionHandler { exportCount++; documentCount++; if (streamExportParams.exportDetections) { - onEffortDetections.getDetection().add(dets[dd]); + detectionList.add(dets[dd]); + } + if (streamExportParams.exportLocalisations) { + // convert the dets into localisations and add them. } } } + if (exportCount % 100 == 0) { prog = new DetectionExportProgress(deployment, detectionsDocument, totalMapPoints, doneMapPoints, lastUnitTime, totalCount, exportCount, skipCount, DetectionExportProgress.STATE_GATHERING); @@ -508,6 +537,17 @@ public class DetectionsHandler extends CollectionHandler { } detectionsDocument = null; } + if (localiseDocument != null) { + closeLocaliseDocument(localiseDocument, mapPoint.getEndTime()); + try { + if (checkLocaliseDocument(localiseDocument, granularityHandler)) { + dbxmlConnect.postAndLog(localiseDocument); + } + } catch (TethysException e) { + tethysControl.showException(e); + } + localiseDocument = null; + } } if (viewerLoadPolicy == ViewerLoadPolicy.LOAD_ALWAYS_EVERYTHING) { @@ -543,6 +583,27 @@ public class DetectionsHandler extends CollectionHandler { } detectionsDocument = null; } + if (localiseDocument != null) { + Detection dets[] = granularityHandler.cleanup(deployment.getAudioEnd()); + if (dets != null) { + for (int dd = 0; dd < dets.length; dd++) { + exportCount++; + documentCount++; + // localiseDocument.getOnEffort().getDetection().add(dets[dd]); + } + } + prog = new DetectionExportProgress(deployment, detectionsDocument,totalMapPoints, doneMapPoints, + lastUnitTime, totalCount, exportCount, skipCount, DetectionExportProgress.STATE_WRITING); + closeLocaliseDocument(localiseDocument, deployment.getAudioEnd()); + try { + if (checkLocaliseDocument(localiseDocument, granularityHandler)) { + dbxmlConnect.postAndLog(localiseDocument); + } + } catch (TethysException e) { + tethysControl.showException(e); + } + localiseDocument = null; + } } prog = new DetectionExportProgress(null, null,totalMapPoints, totalMapPoints, @@ -550,20 +611,6 @@ public class DetectionsHandler extends CollectionHandler { exportObserver.update(prog); return DetectionExportProgress.STATE_COMPLETE; } - - private Localizations startLocalisationDocument(PDeployment deployment, PamDataBlock dataBlock, - StreamExportParams streamExportParams) { - Localizations localisations = new Localizations(); - try { - Helper.createRequiredElements(localisations); - } catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) { - e.printStackTrace(); - return null; - } - - return localisations; - } - /** * Start a new detections document for the deployment and datablock.
@@ -584,7 +631,7 @@ public class DetectionsHandler extends CollectionHandler { } TethysDataProvider dataProvider = dataBlock.getTethysDataProvider(tethysControl); - String prefix = deployment.deployment.getId() + "_" + dataProvider.getDetectionsName(); + String prefix = deployment.nilusObject.getId() + "_" + dataProvider.getDetectionsName(); String fullId = ""; /* * Check the document name isn't already used and increment id as necessary. @@ -596,17 +643,17 @@ public class DetectionsHandler extends CollectionHandler { } } detections.setId(fullId); -// detections.setDescription(dataProvider.getDescription(deployment, tethysExportParams)); + // detections.setDescription(dataProvider.getDescription(deployment, tethysExportParams)); detections.setDescription(exportParams.getNilusDetectionDescription()); DataSourceType dataSource = new DataSourceType(); - dataSource.setDeploymentId(deployment.deployment.getId()); -// dataSource.setEnsembleId(""); ToDo + dataSource.setDeploymentId(deployment.nilusObject.getId()); + // dataSource.setEnsembleId(""); ToDo detections.setDataSource(dataSource); AlgorithmType algorithm = detections.getAlgorithm(); if (dataProvider != null) { algorithm = dataProvider.getAlgorithm(); -// detections.setAlgorithm(algorithm); + // detections.setAlgorithm(algorithm); } algorithm.setMethod(getMethodString(dataBlock)); algorithm.setSoftware(getSoftwareString(dataBlock)); @@ -624,6 +671,141 @@ public class DetectionsHandler extends CollectionHandler { return detections; } + private Localize startLocalisationDocument(PDeployment deployment, PamDataBlock dataBlock, + StreamExportParams exportParams) { + Localize localisations = new Localize(); + try { + Helper.createRequiredElements(localisations); + } catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) { + e.printStackTrace(); + return null; + } + if (localisations.getEffort() == null) { + Effort eff = new Effort(); + try { + Helper.createRequiredElements(eff); + } catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) { + e.printStackTrace(); + return null; + } + localisations.setEffort(eff); + } + TethysDataProvider dataProvider = dataBlock.getTethysDataProvider(tethysControl); + + String prefix = deployment.nilusObject.getId() + "_" + dataProvider.getDetectionsName(); + String fullId = ""; + /* + * Check the document name isn't already used and increment id as necessary. + */ + while (true) { + fullId = String.format("%s_%d", prefix, uniqueDetectionsId++); + if (!tethysControl.getDbxmlQueries().documentExists(Collection.Localizations.toString(), fullId)) { + break; + } + } + localisations.setId(fullId); + // detections.setDescription(dataProvider.getDescription(deployment, tethysExportParams)); + localisations.setDescription(exportParams.getNilusDetectionDescription()); + DataSourceType dataSource = new DataSourceType(); + dataSource.setDeploymentId(deployment.nilusObject.getId()); + // dataSource.setEnsembleId(""); ToDo + localisations.setDataSource(dataSource); + AlgorithmType algorithm = localisations.getAlgorithm(); + + if (dataProvider != null) { + algorithm = dataProvider.getAlgorithm(); + // detections.setAlgorithm(algorithm); + } + algorithm.setMethod(getMethodString(dataBlock)); + algorithm.setSoftware(getSoftwareString(dataBlock)); + algorithm.setVersion(getVersionString(dataBlock)); + + List supSoft = algorithm.getSupportSoftware(); + SupportSoftware supportSoft = new SupportSoftware(); + supportSoft.setSoftware(getSupportSoftware(dataBlock)); + supportSoft.setVersion(getSupportSoftwareVersion(dataBlock)); + supSoft.add(supportSoft); + localisations.setAlgorithm(algorithm); + + localisations.setUserId("PAMGuard user"); + // localisations.setEffort(getLocaliserEffort(deployment, dataBlock, exportParams)); + sortLocaliseCoordinates(dataBlock, localisations); + + // sort out coordinate system. + + return localisations; + } + + private boolean sortLocaliseCoordinates(PamDataBlock dataBlock, Localize localisations) { + LocalisationInfo locInfo = dataBlock.getLocalisationContents(); + Effort locEffort = localisations.getEffort(); + if (locEffort == null) { + locEffort = new Effort(); + localisations.setEffort(locEffort); + } + try { + Helper.createRequiredElements(locEffort); + } catch (IllegalArgumentException | IllegalAccessException | InstantiationException e) { + e.printStackTrace(); + return false; + } + locEffort.setTimeReference("relative"); +// List locTypes = locEffort.getLocalizationType(); + boolean ambiguity = locInfo.hasLocContent(LocContents.HAS_AMBIGUITY); + CoordinateReferenceSystem coordRefs = locEffort.getCoordinateReferenceSystem(); + if (locInfo.getLocContent() == 0) { + return false; + } + else if (locInfo.hasLocContent(LocContents.HAS_LATLONG)) { + coordRefs.setName(CoordinateName.WGS84.toString()); + coordRefs.setSubtype(LocalizationSubType.Geographic.toString()); + locEffort.setLocalizationType(LocalizationType.Point.toString()); +// locEffort.set + if (locInfo.hasLocContent(LocContents.HAS_DEPTH)) { + locEffort.setDimension(3); + } + else { + locEffort.setDimension(2); + } +// locEffort.set + } + else if (locInfo.hasLocContent(LocContents.HAS_XYZ)) { + coordRefs.setName(CoordinateName.Cartesian.toString()); + coordRefs.setSubtype(LocalizationSubType.Engineering.toString()); + locEffort.setLocalizationType(LocalizationType.Point.toString()); + locEffort.setDimension(3); + } + else if (locInfo.hasLocContent(LocContents.HAS_XY)) { + coordRefs.setName(CoordinateName.Cartesian.toString()); + coordRefs.setSubtype(LocalizationSubType.Engineering.toString()); + locEffort.setLocalizationType(LocalizationType.Point.toString()); + locEffort.setDimension(2); + } + else if (locInfo.hasLocContent(LocContents.HAS_BEARING)) { + coordRefs.setName(CoordinateName.Polar.toString()); + coordRefs.setSubtype(LocalizationSubType.Engineering.toString()); + locEffort.setLocalizationType(LocalizationType.Bearing.toString()); + if (ambiguity) { + locEffort.setDimension(1); + } + else { + locEffort.setDimension(2); + } + } + else { + return false; + } + + return true; + } + + + private nilus.Localize.Effort getLocaliserEffort(PDeployment deployment, PamDataBlock dataBlock, StreamExportParams exportParams) { + // TODO Auto-generated method stub + return null; + } + + /** * Close a detections document. This basically just means rewriting the end time and it's only * important in the event that a document got too big and has to be restarted. @@ -633,7 +815,12 @@ public class DetectionsHandler extends CollectionHandler { private void closeDetectionsDocument(Detections detections, Long audioEnd) { detections.getEffort().setEnd(TethysTimeFuncs.xmlGregCalFromMillis(audioEnd)); } - + + private void closeLocaliseDocument(Localize localiseDocument, long endTime) { + localiseDocument.getEffort().setEnd(TethysTimeFuncs.xmlGregCalFromMillis(endTime)); + } + + /** * Run some checks on the Detections document prior to submission.
* Currently, is is just a check that the detections are within the effort times. @@ -678,6 +865,11 @@ public class DetectionsHandler extends CollectionHandler { return true; } + private boolean checkLocaliseDocument(Localize localiseDocument, GranularityHandler granularityHandler) { + // TODO Auto-generated method stub + return true; + } + /** * Worker thread for exporting detections. * Currently, it counts them first, then checks the user wants to export @@ -709,16 +901,16 @@ public class DetectionsHandler extends CollectionHandler { protected Integer doInBackground() throws Exception { Integer ans = null; try { -// int count = countDetections(dataBlock, exportParams, exportObserver); -// if (activeExport == false) { -// return 0; -// } -// String msg = String.format("Do you want to go ahead and output %d %s detections to Tethys?", -// count, exportParams.granularity); -// int doit = WarnOnce.showWarning("Tethys Detections Export", msg, WarnOnce.OK_CANCEL_OPTION); -// if (doit == WarnOnce.OK_OPTION) { - ans = exportDetections(dataBlock, exportParams, this); -// } + // int count = countDetections(dataBlock, exportParams, exportObserver); + // if (activeExport == false) { + // return 0; + // } + // String msg = String.format("Do you want to go ahead and output %d %s detections to Tethys?", + // count, exportParams.granularity); + // int doit = WarnOnce.showWarning("Tethys Detections Export", msg, WarnOnce.OK_CANCEL_OPTION); + // if (doit == WarnOnce.OK_OPTION) { + ans = exportDetections(dataBlock, exportParams, this); + // } } catch (Exception e) { e.printStackTrace(); @@ -728,7 +920,7 @@ public class DetectionsHandler extends CollectionHandler { @Override protected void done() { -// this. + // this. DetectionExportProgress prog = new DetectionExportProgress(null, null, 0, 0, 0, 0, 0, 0, DetectionExportProgress.STATE_COMPLETE); tethysControl.exportedDetections(dataBlock); exportObserver.update(prog); diff --git a/src/tethys/detection/StreamDetectionsSummary.java b/src/tethys/detection/StreamDetectionsSummary.java index 70c11618..28ec72db 100644 --- a/src/tethys/detection/StreamDetectionsSummary.java +++ b/src/tethys/detection/StreamDetectionsSummary.java @@ -2,6 +2,7 @@ package tethys.detection; import java.util.ArrayList; +import tethys.niluswraps.NilusDataWrapper; import tethys.niluswraps.PDetections; /** @@ -10,11 +11,11 @@ import tethys.niluswraps.PDetections; * @author dg50 * */ -public class StreamDetectionsSummary { +public class StreamDetectionsSummary { - public ArrayList detectionsDocs; + public ArrayList detectionsDocs; - public StreamDetectionsSummary(ArrayList detectionsDocs) { + public StreamDetectionsSummary(ArrayList detectionsDocs) { this.detectionsDocs = detectionsDocs; } diff --git a/src/tethys/localization/CoordinateName.java b/src/tethys/localization/CoordinateName.java new file mode 100644 index 00000000..5b948d52 --- /dev/null +++ b/src/tethys/localization/CoordinateName.java @@ -0,0 +1,11 @@ +package tethys.localization; + +/** + * Enumeration of the Name field in nilus.Localize.Effort.CoordinateReferenceSystem
+ * Within Tethys, these are only ever used in their String form. + * @author dg50 + * + */ +public enum CoordinateName { + WGS84, UTM, Cartesian, Polar, Spherical, Cylindrical, Range, PerpindicularRange; +} diff --git a/src/tethys/localization/LocalizationHandler.java b/src/tethys/localization/LocalizationHandler.java index 69105b5e..87c5fe0a 100644 --- a/src/tethys/localization/LocalizationHandler.java +++ b/src/tethys/localization/LocalizationHandler.java @@ -1,17 +1,78 @@ package tethys.localization; +import java.util.ArrayList; + +import PamguardMVC.PamDataBlock; import nilus.CylindricalCoordinateType; import nilus.LocalizationType; +import nilus.Localize; import nilus.Localize.Effort.CoordinateReferenceSystem; +import tethys.Collection; +import tethys.CollectionHandler; +import tethys.TethysControl; +import tethys.detection.StreamDetectionsSummary; +import tethys.niluswraps.NilusDataWrapper; +import tethys.niluswraps.PDeployment; -public class LocalizationHandler { +public class LocalizationHandler extends CollectionHandler { + public LocalizationHandler(TethysControl tethysControl) { + super(tethysControl, Collection.Localizations); + // TODO Auto-generated constructor stub + } + +// public LocalizationType getLoc() { +// LocalizationType lt = new LocalizationType(); +// CylindricalCoordinateType cct = new CylindricalCoordinateType(); +//// cct.set +// CoordinateReferenceSystem cr; +// return null; +// } + + /** + * Get a list of Localization documents associated with a particular data block for all deployments + * documents. Group them by abstract or something + * @param dataBlock + * @return + */ + public StreamDetectionsSummary> getStreamLocalizations(PamDataBlock dataBlock) { + ArrayList deployments = tethysControl.getDeploymentHandler().getMatchedDeployments(); + return getStreamLocalizations(dataBlock, deployments); + } - public LocalizationType getLoc() { - LocalizationType lt = new LocalizationType(); - CylindricalCoordinateType cct = new CylindricalCoordinateType(); -// cct.set - CoordinateReferenceSystem cr; + /** + * Get a list of Localization documents associated with a particular data block for the list of deployments + * documents. Group them by abstract or something + * @param dataBlock + * @param deployments can be null for all deployments. + * @return + */ + public StreamDetectionsSummary> getStreamLocalizations(PamDataBlock dataBlock, ArrayList deployments) { + // get the basic data for each document including it's Description. + + ArrayList localizeDocs = new ArrayList<>(); + for (PDeployment aDep : deployments) { + ArrayList someNames = tethysControl.getDbxmlQueries().getLocalizationDocuments(dataBlock, aDep.getDocumentId()); + if (someNames == null) { + continue; + } +// // no have a list of all the Detections documents of interest for this datablock. + for (String aDoc : someNames) { + Localize localize = tethysControl.getDbxmlQueries().getLocalizationDocInfo(aDoc); + int count = tethysControl.getDbxmlQueries().countLocalizations2(aDoc); + PLocalization pLocalize = new PLocalization(localize, dataBlock, aDep, count); + localizeDocs.add(pLocalize); +// PDetections pDetections = new PDetections(detections, dataBlock, aDep, count); +// detectionsDocs.add(pDetections); + } + } + return new StreamDetectionsSummary(localizeDocs); + } + + @Override + public String getHelpPoint() { + // TODO Auto-generated method stub return null; } + } diff --git a/src/tethys/localization/LocalizationSubType.java b/src/tethys/localization/LocalizationSubType.java new file mode 100644 index 00000000..ce558751 --- /dev/null +++ b/src/tethys/localization/LocalizationSubType.java @@ -0,0 +1,10 @@ +package tethys.localization; +/** + * Enumeration of the ReferenceFrame field in nilus.Localize.Effort.CoordinateReferenceSystem.Subtype
+ * Within Tethys, these are only ever used in their String form. + * @author dg50 + * + */ +public enum LocalizationSubType { + Geographic, Derived, Engineering; +} diff --git a/src/tethys/localization/LocalizationType.java b/src/tethys/localization/LocalizationType.java new file mode 100644 index 00000000..568fc70e --- /dev/null +++ b/src/tethys/localization/LocalizationType.java @@ -0,0 +1,11 @@ +package tethys.localization; + +/** + * Enumeration of the ReferenceFrame field in nilus.Localize.Effort.CoordinateReferenceSystem.Subtype
+ * Within Tethys, these are only ever used in their String form. + * @author dg50 + * + */ +public enum LocalizationType { + Bearing, PerpindicularRange, Point, Range, Track; +} diff --git a/src/tethys/localization/PLocalization.java b/src/tethys/localization/PLocalization.java new file mode 100644 index 00000000..c0cb1d38 --- /dev/null +++ b/src/tethys/localization/PLocalization.java @@ -0,0 +1,14 @@ +package tethys.localization; + +import PamguardMVC.PamDataBlock; +import nilus.Localize; +import tethys.niluswraps.NilusDataWrapper; +import tethys.niluswraps.PDeployment; + +public class PLocalization extends NilusDataWrapper { + + public PLocalization(Localize nilusObject, PamDataBlock dataBlock, PDeployment deployment, Integer count) { + super(nilusObject, dataBlock, deployment, count); + } + +} diff --git a/src/tethys/localization/ReferenceFrame.java b/src/tethys/localization/ReferenceFrame.java new file mode 100644 index 00000000..0233e423 --- /dev/null +++ b/src/tethys/localization/ReferenceFrame.java @@ -0,0 +1,11 @@ +package tethys.localization; + +/** + * Enumeration of the ReferenceFrame field in nilus.Localize.Effort.CoordinateReferenceSystem
+ * Within Tethys, these are only ever used in their String form. + * @author dg50 + * + */ +public enum ReferenceFrame { + UTMZone, WGS84, instrument; +} diff --git a/src/tethys/localization/TimeReference.java b/src/tethys/localization/TimeReference.java new file mode 100644 index 00000000..96bbca70 --- /dev/null +++ b/src/tethys/localization/TimeReference.java @@ -0,0 +1,10 @@ +package tethys.localization; +/** + * Enumeration of the ReferenceFrame field in nilus.Localize.Effort.TimeReference
+ * Within Tethys, these are only ever used in their String form. + * @author dg50 + * + */ +public enum TimeReference { + absolute, channel, relative; +} diff --git a/src/tethys/niluswraps/NilusDataWrapper.java b/src/tethys/niluswraps/NilusDataWrapper.java new file mode 100644 index 00000000..10806b30 --- /dev/null +++ b/src/tethys/niluswraps/NilusDataWrapper.java @@ -0,0 +1,56 @@ +package tethys.niluswraps; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import javax.xml.datatype.XMLGregorianCalendar; + +import PamguardMVC.PamDataBlock; +import nilus.DataSourceType; +import nilus.DescriptionType; +import nilus.QualityAssuranceProcessType; + +/** + * Wrapper for Nilus data objects. This means Detections and Localization documents which + * should have an associated datablock, a deployment wrapper and a data count. + * @author dg50 + * + * @param + */ +public class NilusDataWrapper extends NilusDocumentWrapper { + + public Integer count; + + public PDeployment deployment; + + public PamDataBlock dataBlock; + + public NilusDataWrapper(T nilusObject, PamDataBlock dataBlock, PDeployment deployment, Integer count) { + super(nilusObject); + this.dataBlock = dataBlock; + this.deployment = deployment; + this.count = count; + } + + public DescriptionType getDescription() { + return (DescriptionType) getGotObject("getDescription"); + } + + public DataSourceType getDataSource() { + return (DataSourceType) getGotObject("getDataSource"); + } + + + public QualityAssuranceProcessType getQualityAssurance() { + return (QualityAssuranceProcessType) getGotObject("getQualityAssurance"); + } + + public XMLGregorianCalendar getEffortStart() { + return (XMLGregorianCalendar) getGotObjects("getEffort", "getStart"); + } + + public XMLGregorianCalendar getEffortEnd() { + return (XMLGregorianCalendar) getGotObjects("getEffort", "getEnd"); + } + +} diff --git a/src/tethys/niluswraps/NilusDocumentWrapper.java b/src/tethys/niluswraps/NilusDocumentWrapper.java new file mode 100644 index 00000000..2ca42233 --- /dev/null +++ b/src/tethys/niluswraps/NilusDocumentWrapper.java @@ -0,0 +1,108 @@ +package tethys.niluswraps; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import tethys.Collection; +import tethys.dbxml.DBXMLConnect; + +public class NilusDocumentWrapper { + + public T nilusObject; + + public String documentName; + + public NilusDocumentWrapper(T nilusDocument) { + super(); + this.nilusObject = nilusDocument; + } + + public String getDocumentId() { + if (nilusObject == null) { + return null; + } + return DBXMLConnect.getDocumentId(nilusObject); + } + + /** + * Get an object out of the nilus object using a series of sequential getter functions + * @param getterName function names (any number to work through class list) . + * @return + */ + public Object getGotObjects(String... getterNames) { + /** + * Be aware that this will probably get called in preference to + * the function below, so need to check to see if the + */ + return getGotObjects(nilusObject, getterNames); + } + + /** + * Get an object out of the given object using a series of sequential getter functions + * @param source source object + * @param getterName function names (any number to work through class list) . + * @return + */ + public Object getGotObjects(Object source, String... getterNames) { + Object obj = source; + for (int i = 0; i < getterNames.length; i++) { + obj = getGotObject(obj, getterNames[i]); + if (obj == null) { + break; + } + } + return obj; + } + + /** + * Get an object out of the main nilus object using a getter function (no function parameters). + * @param source source object + * @param getterName function name. + * @return + */ + public Object getGotObject(String getterName) { + return getGotObject(nilusObject, getterName); + } + + /** + * Get an object out of the given object using a getter function (no function parameters). + * @param source source object + * @param getterName function name. + * @return + */ + public Object getGotObject(Object source, String getterName) { + if (source == null) { + return null; + } + Class sourceClass = source.getClass(); + Method getId; + try { + getId = sourceClass.getDeclaredMethod(getterName, null); + Object[] inputs = new Object[0]; + Object res = getId.invoke(source, inputs); + return res; + } + catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + System.err.printf("Unable to find method %s in object %s\n", getterName, source.toString()); + e.printStackTrace(); + } + return null; + } + + /** + * Get the class of the nilus object. + * @return Java class of nilus object. + */ + public Class getNilusClass() { + return nilusObject.getClass(); + } + + /** + * Collection for the nilus object. + * @return + */ + public Collection getCollection() { + return Collection.fromClass(getNilusClass()); + } + +} diff --git a/src/tethys/niluswraps/PDeployment.java b/src/tethys/niluswraps/PDeployment.java index 78e0f60b..29765db7 100644 --- a/src/tethys/niluswraps/PDeployment.java +++ b/src/tethys/niluswraps/PDeployment.java @@ -12,18 +12,16 @@ import tethys.deployment.RecordingPeriod; * @author dg50 * */ -public class PDeployment { - - public Deployment deployment; +public class PDeployment extends NilusDocumentWrapper{ + private RecordingPeriod matchedPAMGaurdPeriod; public PDeployment(Deployment deployment) { - super(); - this.deployment = deployment; + super(deployment); } public Long getAudioStart() { - DeploymentRecoveryDetails detail = deployment.getDeploymentDetails(); + DeploymentRecoveryDetails detail = nilusObject.getDeploymentDetails(); if (detail == null || detail.getAudioTimeStamp() == null) { return null; } @@ -31,7 +29,7 @@ public class PDeployment { } public Long getAudioEnd() { - DeploymentRecoveryDetails detail = deployment.getRecoveryDetails(); + DeploymentRecoveryDetails detail = nilusObject.getRecoveryDetails(); if (detail == null || detail.getAudioTimeStamp() == null) { return null; } @@ -40,7 +38,7 @@ public class PDeployment { @Override public String toString() { - return String.format("%s:%d; %s - %s", deployment.getId(), deployment.getDeploymentId(), + return String.format("%s:%d; %s - %s", nilusObject.getId(), nilusObject.getDeploymentId(), PamCalendar.formatDBDateTime(getAudioStart()), PamCalendar.formatDBDateTime(getAudioEnd())); } @@ -55,10 +53,10 @@ public class PDeployment { public String getShortDescription() { Long audioStart = getAudioStart(); if (audioStart == null) { - return String.format("%s %s", deployment.getId(), "unknown start"); + return String.format("%s %s", nilusObject.getId(), "unknown start"); } else { - return String.format("%s %s", deployment.getId(), PamCalendar.formatDBDate(getAudioStart())); + return String.format("%s %s", nilusObject.getId(), PamCalendar.formatDBDate(getAudioStart())); } } diff --git a/src/tethys/niluswraps/PDetections.java b/src/tethys/niluswraps/PDetections.java index 64602614..4067aa5d 100644 --- a/src/tethys/niluswraps/PDetections.java +++ b/src/tethys/niluswraps/PDetections.java @@ -3,25 +3,12 @@ package tethys.niluswraps; import PamguardMVC.PamDataBlock; import nilus.Detections; -public class PDetections { - - public Detections detections; - - public Integer count; - - public PDeployment deployment; - - public PamDataBlock dataBlock; +public class PDetections extends NilusDataWrapper { public PDetections(Detections detections, PamDataBlock dataBlock, PDeployment deployment, Integer count) { - super(); - this.dataBlock = dataBlock; - this.detections = detections; - this.deployment = deployment; - this.count = count; + super(detections, dataBlock, deployment, count); } - } diff --git a/src/tethys/swing/DatablockDetectionsPanel.java b/src/tethys/swing/DatablockDetectionsPanel.java index 05f05507..8b76920b 100644 --- a/src/tethys/swing/DatablockDetectionsPanel.java +++ b/src/tethys/swing/DatablockDetectionsPanel.java @@ -27,14 +27,20 @@ import PamView.dialog.warn.WarnOnce; import PamView.tables.SwingTableColumnWidths; import PamguardMVC.PamDataBlock; import nilus.DataSourceType; +import nilus.DescriptionType; +import nilus.DetectionEffort; import nilus.DetectionEffortKind; import nilus.Detections; import nilus.GranularityType; +import nilus.Localize.Effort; import tethys.Collection; import tethys.TethysControl; import tethys.TethysState; import tethys.dbxml.TethysException; import tethys.detection.StreamDetectionsSummary; +import tethys.localization.PLocalization; +import tethys.niluswraps.NilusDataWrapper; +import tethys.niluswraps.NilusDocumentWrapper; import tethys.niluswraps.PDeployment; import tethys.niluswraps.PDetections; @@ -57,12 +63,16 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa private PamDataBlock dataBlock; - private StreamDetectionsSummary streamDetectionsSummary; +// private StreamDetectionsSummary> streamDetectionsSummary; +// +// private StreamDetectionsSummary> streamLocalisationsSummary; + + private StreamDetectionsSummary combinedSummary; public DatablockDetectionsPanel(TethysControl tethysControl) { super(tethysControl); mainPanel = new JPanel(new BorderLayout()); - mainPanel.add(BorderLayout.NORTH, dataBlockName = new JLabel("PAMGUard data stream", JLabel.LEFT)); + mainPanel.add(BorderLayout.NORTH, dataBlockName = new JLabel("PAMGuard data stream", JLabel.LEFT)); mainPanel.setBorder(new TitledBorder("Data stream Tethys Detections documents")); tableModel = new TableModel(); @@ -144,7 +154,16 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa @Override public String runBackgroundTask(PamWorker pamWorker) { - streamDetectionsSummary = getTethysControl().getDetectionsHandler().getStreamDetections(dataBlock); + StreamDetectionsSummary> streamDetectionsSummary = getTethysControl().getDetectionsHandler().getStreamDetections(dataBlock); + StreamDetectionsSummary> streamLocalisationsSummary = getTethysControl().getLocalizationHandler().getStreamLocalizations(dataBlock); + ArrayList allDocs = new ArrayList(); + if (streamDetectionsSummary != null) { + allDocs.addAll(streamDetectionsSummary.detectionsDocs); + } + if (streamLocalisationsSummary != null) { + allDocs.addAll(streamLocalisationsSummary.detectionsDocs); + } + combinedSummary = new StreamDetectionsSummary<>(allDocs); return null; } @@ -183,7 +202,7 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa } int[] rows = table.getSelectedRows(); - PDetections pDets = detectionsForRow(row); + NilusDataWrapper pDets = detectionsForRow(row); if (pDets == null) { return; } @@ -193,7 +212,7 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa JMenuItem menuItem; if (rows.length == 1) { - menuItem = new JMenuItem("Display document " + pDets.detections.getId()); + menuItem = new JMenuItem("Display document " + pDets.getDocumentId()); menuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -202,7 +221,7 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa }); popMenu.add(menuItem); - menuItem = new JMenuItem("Export document " + pDets.detections.getId()); + menuItem = new JMenuItem("Export document " + pDets.getDocumentId()); menuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -212,11 +231,11 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa popMenu.add(menuItem); popMenu.addSeparator(); - menuItem = new JMenuItem("Delete document " + pDets.detections.getId()); + menuItem = new JMenuItem("Delete document " + pDets.getDocumentId()); menuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - deleteDocument(pDets); +// deleteDocument(pDets); } }); popMenu.add(menuItem); @@ -247,15 +266,15 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa return; } - ArrayList toDelete = new ArrayList(); + ArrayList toDelete = new ArrayList(); for (int i = 0; i < rows.length; i++) { int row = rows[i]; - PDetections pDets = detectionsForRow(row); + NilusDataWrapper pDets = detectionsForRow(row); if (pDets == null) { continue; } - toDelete.add(pDets.detections); + toDelete.add(pDets); } DeleteDocs dd = new DeleteDocs(toDelete); PamWorker worker = new PamWorker(dd, getTethysControl().getGuiFrame(), 1, "Deleting Detections documents"); @@ -265,18 +284,18 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa private class DeleteDocs implements PamWorkWrapper { - private ArrayList toDelete; + private ArrayList toDelete; - public DeleteDocs(ArrayList toDelete) { + public DeleteDocs(ArrayList toDelete) { this.toDelete = toDelete; } @Override public Integer runBackgroundTask(PamWorker pamWorker) { - for (Detections dets : toDelete) { + for (NilusDocumentWrapper dets : toDelete) { try { - getTethysControl().getDbxmlConnect().deleteDocument(dets); + getTethysControl().getDbxmlConnect().deleteDocument(dets.nilusObject); } catch (TethysException e) { getTethysControl().showException(e); } @@ -293,13 +312,13 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa } protected void deleteDocument(PDetections pDets) { - String msg = String.format("Are you sure you want to delete the Detections document %s ?", pDets.detections.getId()); + String msg = String.format("Are you sure you want to delete the Detections document %s ?", pDets.getDocumentId()); int ans = WarnOnce.showWarning(PamGui.findComponentWindow(mainPanel), "Delete Document", msg, WarnOnce.OK_CANCEL_OPTION); if (ans != WarnOnce.OK_OPTION) { return; } try { - getTethysControl().getDbxmlConnect().deleteDocument(pDets.detections); + getTethysControl().getDbxmlConnect().deleteDocument(pDets.nilusObject); } catch (TethysException e) { getTethysControl().showException(e); } @@ -307,36 +326,35 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa selectDataBlock(dataBlock); // force table update. } - private void displayDocument(PDetections pDets) { - getTethysControl().displayDocument(Collection.Detections.collectionName(), pDets.detections.getId()); + private void displayDocument(NilusDataWrapper pDets) { + getTethysControl().displayDocument(pDets.getCollection().collectionName(), pDets.getDocumentId()); } - private void exportDocument(PDetections pDets) { - getTethysControl().exportDocument(Collection.Detections.toString(), pDets.detections.getId()); - + private void exportDocument(NilusDataWrapper pDets) { + getTethysControl().exportDocument(pDets.getCollection().collectionName(), pDets.getDocumentId()); } - private PDetections detectionsForRow(int iRow) { - if (streamDetectionsSummary == null || streamDetectionsSummary.detectionsDocs == null) { + private NilusDataWrapper detectionsForRow(int iRow) { + if (combinedSummary == null || combinedSummary.detectionsDocs == null) { return null; } - if (iRow < 0 || iRow >= streamDetectionsSummary.detectionsDocs.size()) { + if (iRow < 0 || iRow >= combinedSummary.detectionsDocs.size()) { return null; } - return streamDetectionsSummary.detectionsDocs.get(iRow); + return combinedSummary.detectionsDocs.get(iRow); } private class TableModel extends AbstractTableModel { - private String[] colNames = {"Document", "Detector", "Deployment", "Effort", "Granularity", "Count", "Abstract"}; + private String[] colNames = {"Document", "Detector", "Deployment", "Type", "Effort", "Granularity", "Count", "Abstract"}; @Override public int getRowCount() { - if (streamDetectionsSummary == null || streamDetectionsSummary.detectionsDocs == null) { + if (combinedSummary == null || combinedSummary.detectionsDocs == null) { return 0; } - return streamDetectionsSummary.detectionsDocs.size(); + return combinedSummary.detectionsDocs.size(); } @Override @@ -351,28 +369,28 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa @Override public Object getValueAt(int rowIndex, int columnIndex) { - PDetections pDets = detectionsForRow(rowIndex); + NilusDataWrapper pDets = detectionsForRow(rowIndex); return getValueAt(pDets, columnIndex); } - private Object getValueAt(PDetections pDets, int columnIndex) { + private Object getValueAt(NilusDataWrapper pDets, int columnIndex) { if (pDets == null) { return null; } - Detections dets = pDets.detections; - if (dets == null) { +// PDetections dets = pDets.nilusObject; + if (pDets == null) { return "Error in doc"; } switch (columnIndex) { case 0: - return dets.getId(); + return pDets.getDocumentId(); case 1: if (pDets.dataBlock == null) { return null; } return pDets.dataBlock.getDataName(); case 2: - DataSourceType dataSource = dets.getDataSource(); + DataSourceType dataSource = pDets.getDataSource(); if (dataSource == null) { return null; } @@ -380,28 +398,39 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa return dataSource.getDeploymentId(); } case 3: - XMLGregorianCalendar start = dets.getEffort().getStart(); - XMLGregorianCalendar stop = dets.getEffort().getEnd(); - return start + " to " + stop; + return pDets.getCollection(); case 4: - List kinds = dets.getEffort().getKind(); - if (kinds == null) { - return null; - } - for (DetectionEffortKind kind : kinds) { - if (kind.getGranularity() != null) { - GranularityType granularity = kind.getGranularity(); - return PDeployment.formatGranularity(granularity); - // if (granularity != null) { - // return granularity.getValue(); - // } +// XMLGregorianCalendar start = dets.getEffort().getStart(); +// XMLGregorianCalendar stop = dets.getEffort().getEnd(); + XMLGregorianCalendar start = pDets.getEffortStart(); + XMLGregorianCalendar stop = pDets.getEffortEnd(); + return start + " to " + stop; + case 5: + Object effort = pDets.getGotObjects("getEffort"); + if (effort instanceof DetectionEffort) { + DetectionEffort detectionEffort = (DetectionEffort) effort; + List kinds = detectionEffort.getKind(); + if (kinds == null) { + return null; + } + for (DetectionEffortKind kind : kinds) { + if (kind.getGranularity() != null) { + GranularityType granularity = kind.getGranularity(); + return PDeployment.formatGranularity(granularity); + // if (granularity != null) { + // return granularity.getValue(); + // } + } } } break; - case 5: - return pDets.count; case 6: - return dets.getDescription().getAbstract(); + return pDets.count; + case 7: + DescriptionType desc = pDets.getDescription(); + if (desc != null) { + return desc.getAbstract(); + } } return null; } diff --git a/src/tethys/swing/DeploymentExportPanel.java b/src/tethys/swing/DeploymentExportPanel.java index fd299636..c74bde7c 100644 --- a/src/tethys/swing/DeploymentExportPanel.java +++ b/src/tethys/swing/DeploymentExportPanel.java @@ -124,10 +124,10 @@ public class DeploymentExportPanel extends TethysGUIPanel implements DeploymentT return; } PDeployment deployment = tethysDeploys.get(row); - String msg = "Do you want to copy settings from deploymnet document " + deployment.deployment.getId(); + String msg = "Do you want to copy settings from deploymnet document " + deployment.nilusObject.getId(); int ans = WarnOnce.showWarning("Deployment data", msg, WarnOnce.OK_CANCEL_OPTION); if (ans == WarnOnce.OK_OPTION) { - copyDeploymentData(deployment.deployment); + copyDeploymentData(deployment.nilusObject); } } diff --git a/src/tethys/swing/PAMGuardDeploymentsTable.java b/src/tethys/swing/PAMGuardDeploymentsTable.java index 6d3819d8..cef4d468 100644 --- a/src/tethys/swing/PAMGuardDeploymentsTable.java +++ b/src/tethys/swing/PAMGuardDeploymentsTable.java @@ -229,14 +229,14 @@ private RecordingList masterList; return; } for (PDeployment depl : matchedDeployments) { - if (depl.deployment == null) { + if (depl.nilusObject == null) { continue; } try { - if (checkDetections(depl.deployment) == false) { + if (checkDetections(depl.nilusObject) == false) { continue; } - boolean gone = getTethysControl().getDbxmlConnect().deleteDocument(depl.deployment); + boolean gone = getTethysControl().getDbxmlConnect().deleteDocument(depl.nilusObject); } catch (TethysException e) { getTethysControl().showException(e); } @@ -279,7 +279,7 @@ private RecordingList masterList; } protected void deleteDeployment(PDeployment pDeployment) { - Deployment dep = pDeployment.deployment; + Deployment dep = pDeployment.nilusObject; if (dep == null) { return; } @@ -300,11 +300,11 @@ private RecordingList masterList; } protected void exportDeployment(PDeployment pDeployment) { - getTethysControl().exportDocument(Collection.Deployments.collectionName(), pDeployment.deployment.getId()); + getTethysControl().exportDocument(Collection.Deployments.collectionName(), pDeployment.nilusObject.getId()); } protected void displayDeployment(PDeployment pDeployment) { - getTethysControl().displayDocument(Collection.Deployments.collectionName(), pDeployment.deployment.getId()); + getTethysControl().displayDocument(Collection.Deployments.collectionName(), pDeployment.nilusObject.getId()); } @Override @@ -443,7 +443,7 @@ private RecordingList masterList; if (deployment == null) { return null; } - return deployment.deployment.getId(); + return deployment.nilusObject.getId(); // return makeDeplString(period, deployment); case 8: if (deployment == null) { diff --git a/src/tethys/swing/TethysConnectionPanel.java b/src/tethys/swing/TethysConnectionPanel.java index 5a7cc90b..1fcf3262 100644 --- a/src/tethys/swing/TethysConnectionPanel.java +++ b/src/tethys/swing/TethysConnectionPanel.java @@ -226,7 +226,7 @@ public class TethysConnectionPanel extends TethysGUIPanel { */ ArrayList projectDeployments = getTethysControl().getDeploymentHandler().getProjectDeployments(); if (projectDeployments != null && projectDeployments.size() > 0) { - Deployment dep = projectDeployments.get(0).deployment; + Deployment dep = projectDeployments.get(0).nilusObject; globDeployment.setProject(dep.getProject()); globDeployment.setRegion(dep.getRegion()); getTethysControl().sendStateUpdate(new TethysState(TethysState.StateType.NEWPROJECTSELECTION));