From bb3a86c4d48ea87cc0c3613d87dd90a7a6c6e5c3 Mon Sep 17 00:00:00 2001 From: paytoncain Date: Mon, 5 Aug 2024 15:15:15 -0600 Subject: [PATCH] Add support for detections datasets --- .../data/object/dataset/base/BasePackage.java | 2 +- .../location/MobileMarineLocation.java | 2 + .../MobileMarineLocationTranslator.java | 1 + .../metadata/translator/DataQualityEntry.java | 4 +- .../PassivePackerDatasetDetails.java | 2 + .../pace/packaging/PassivePackerFactory.java | 47 ++++++- .../packaging/PassivePackerFactoryTest.java | 70 +++++++++- .../src/test/resources/detections.json | 123 ++++++++++++++++++ .../resources/sound_clips_calibrated.json | 2 +- .../resources/sound_clips_uncalibrated.json | 2 +- .../converter/PackageConverter.java | 1 + 11 files changed, 246 insertions(+), 10 deletions(-) create mode 100644 pace-packaging/src/test/resources/detections.json diff --git a/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/BasePackage.java b/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/BasePackage.java index 1d1715b8..17217441 100644 --- a/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/BasePackage.java +++ b/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/BasePackage.java @@ -36,7 +36,7 @@ public abstract class BasePackage implements AbstractObject, TimeRange, Calib private final Path otherPath; private final Path documentsPath; private final Path calibrationDocumentsPath; - private final Path navigationPath; + private final Path navigationPath; // TODO: Remove this @NotNull private final Path sourcePath; diff --git a/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/location/MobileMarineLocation.java b/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/location/MobileMarineLocation.java index 0f9933ce..8902c562 100644 --- a/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/location/MobileMarineLocation.java +++ b/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/location/MobileMarineLocation.java @@ -15,6 +15,8 @@ public class MobileMarineLocation implements MarineLocation { private final String vessel; @NotBlank private final String locationDerivationDescription; + + // TODO: Add file list (List) @Override public MobileMarineLocation setSeaArea(String seaArea) { diff --git a/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/location/translator/MobileMarineLocationTranslator.java b/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/location/translator/MobileMarineLocationTranslator.java index 7bade48e..3337c0c5 100644 --- a/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/location/translator/MobileMarineLocationTranslator.java +++ b/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/location/translator/MobileMarineLocationTranslator.java @@ -12,5 +12,6 @@ public class MobileMarineLocationTranslator implements LocationDetailTranslator private final String seaArea; private final String vessel; private final String locationDerivationDescription; + // TODO: Add file list mapping (String, value is semi-colon delimited): file-1.txt;file-2.txt;file-3.txt } diff --git a/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/translator/DataQualityEntry.java b/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/translator/DataQualityEntry.java index 234434d2..316f35e6 100644 --- a/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/translator/DataQualityEntry.java +++ b/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/base/metadata/translator/DataQualityEntry.java @@ -4,6 +4,7 @@ import edu.colorado.cires.pace.data.object.dataset.base.metadata.QualityLevel; import edu.colorado.cires.pace.data.object.dataset.base.metadata.TimeRange; import java.time.LocalDateTime; +import java.util.Collections; import java.util.List; import lombok.Builder; import lombok.Data; @@ -20,6 +21,7 @@ public class DataQualityEntry implements TimeRange, FrequencyRange { private final Float maxFrequency; private final QualityLevel qualityLevel; private final String comments; - private final List channelNumbers; + @Builder.Default + private final List channelNumbers = Collections.emptyList(); } diff --git a/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/passivePacker/PassivePackerDatasetDetails.java b/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/passivePacker/PassivePackerDatasetDetails.java index 69ede374..87675426 100644 --- a/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/passivePacker/PassivePackerDatasetDetails.java +++ b/pace-data/src/main/java/edu/colorado/cires/pace/data/object/dataset/passivePacker/PassivePackerDatasetDetails.java @@ -39,6 +39,8 @@ public class PassivePackerDatasetDetails { private final String modelEnd; private final String frequency; private final String dataComment; + private final String species; + private final String scientificName; } diff --git a/pace-packaging/src/test/java/edu/colorado/cires/pace/packaging/PassivePackerFactory.java b/pace-packaging/src/test/java/edu/colorado/cires/pace/packaging/PassivePackerFactory.java index 12f12153..bc8b7191 100644 --- a/pace-packaging/src/test/java/edu/colorado/cires/pace/packaging/PassivePackerFactory.java +++ b/pace-packaging/src/test/java/edu/colorado/cires/pace/packaging/PassivePackerFactory.java @@ -47,12 +47,14 @@ import edu.colorado.cires.pace.data.object.dataset.soundClips.SoundClipsPackage; import edu.colorado.cires.pace.data.object.dataset.soundLevelMetrics.SoundLevelMetricsPackage; import edu.colorado.cires.pace.data.object.dataset.soundPropagationModels.SoundPropagationModelsPackage; +import edu.colorado.cires.pace.data.object.detectionType.DetectionType; import edu.colorado.cires.pace.data.object.position.Position; import edu.colorado.cires.pace.data.object.sensor.audio.AudioSensor; import edu.colorado.cires.pace.data.object.sensor.base.Sensor; import edu.colorado.cires.pace.data.object.sensor.depth.DepthSensor; import edu.colorado.cires.pace.data.object.sensor.other.OtherSensor; import edu.colorado.cires.pace.datastore.DatastoreException; +import edu.colorado.cires.pace.repository.DetectionTypeRepository; import edu.colorado.cires.pace.repository.NotFoundException; import edu.colorado.cires.pace.repository.OrganizationRepository; import edu.colorado.cires.pace.repository.PersonRepository; @@ -73,11 +75,14 @@ public class PassivePackerFactory { private final PersonRepository personRepository; private final OrganizationRepository organizationRepository; private final SensorRepository sensorRepository; + private final DetectionTypeRepository detectionTypeRepository; - public PassivePackerFactory(PersonRepository personRepository, OrganizationRepository organizationRepository, SensorRepository sensorRepository) { + public PassivePackerFactory(PersonRepository personRepository, OrganizationRepository organizationRepository, SensorRepository sensorRepository, + DetectionTypeRepository detectionTypeRepository) { this.personRepository = personRepository; this.organizationRepository = organizationRepository; this.sensorRepository = sensorRepository; + this.detectionTypeRepository = detectionTypeRepository; } public PassivePackerPackage createPackage(Package aPackage) throws NotFoundException, DatastoreException { @@ -115,6 +120,10 @@ public PassivePackerPackage createPackage(Package aPackage) throws NotFoundExcep passivePackerPackage = passivePackerPackage.toBuilder() .qualityDetails(getQualityDetails(soundLevelMetricsPackage)) .build(); + } else if (aPackage instanceof DetectionsPackage detectionsPackage) { + passivePackerPackage = passivePackerPackage.toBuilder() + .qualityDetails(getQualityDetails(detectionsPackage)) + .build(); } return passivePackerPackage; @@ -234,7 +243,7 @@ private String getDeployType(LocationDetail locationDetail) { return null; } - private PassivePackerDatasetDetails getDatasetDetails(Package aPackage) { + private PassivePackerDatasetDetails getDatasetDetails(Package aPackage) throws NotFoundException, DatastoreException { PassivePackerDatasetDetails datasetDetails = PassivePackerDatasetDetails.builder() .type(aPackage.getProcessingLevel().name()) .subType(subtypeFromPackage(aPackage)) @@ -284,6 +293,35 @@ private PassivePackerDatasetDetails getDatasetDetails(Package aPackage) { .modelEnd(serializeDateTime(soundPropagationModelsPackage.getEndTime())) .frequency(String.valueOf(soundPropagationModelsPackage.getModeledFrequency())) .build(); + } else if (aPackage instanceof DetectionsPackage detectionsPackage) { + String sourceName = detectionsPackage.getSoundSource(); + String species = null; + String scientificName = null; + + if (sourceName != null) { + DetectionType detectionType = detectionTypeRepository.getByUniqueField(sourceName); + + species = detectionType.getSource(); + scientificName = detectionType.getScienceName(); + } + + datasetDetails = datasetDetails.toBuilder() + .dataFiles(String.valueOf(detectionsPackage.getSourcePath())) + .analysisStart(serializeDateTime(detectionsPackage.getStartTime())) + .analysisEnd(serializeDateTime(detectionsPackage.getEndTime())) + .analysisTimeZone(String.valueOf(detectionsPackage.getAnalysisTimeZone())) + .analysisEffort(String.valueOf(detectionsPackage.getAnalysisEffort())) + .minAnalysisFrequency(String.valueOf(detectionsPackage.getMinFrequency())) + .maxAnalysisFrequency(String.valueOf(detectionsPackage.getMaxFrequency())) + .analysisSampleRate(String.valueOf(detectionsPackage.getSampleRate())) + .species(species) + .scientificName(scientificName) + .softwareName(detectionsPackage.getSoftwareNames()) + .softwareVersion(detectionsPackage.getSoftwareVersions()) + .protocolReference(detectionsPackage.getSoftwareProtocolCitation()) + .processingStatement(detectionsPackage.getSoftwareProcessingDescription()) + .softwareStatement(detectionsPackage.getSoftwareDescription()) + .build(); } return datasetDetails; @@ -337,7 +375,7 @@ private PassivePackerCalibrationInfo getCalibrationInfo(Package aPackage) { } PassivePackerCalibrationInfo calibrationInfo = PassivePackerCalibrationInfo.builder() - .calDate(String.valueOf(calDate)) + .calDate(calDate == null ? null : String.valueOf(calDate)) .calState(calState) .calDocsPath(aPackage.getCalibrationDocumentsPath().toString()) .comment(aPackage.getCalibrationDescription()) @@ -350,7 +388,8 @@ private PassivePackerCalibrationInfo getCalibrationInfo(Package aPackage) { .gain(String.valueOf(audioDataPackage.getGain())) .calDate2(calDate2 == null ? null : String.valueOf(calDate2)) .build(); - } else if (aPackage instanceof SoundClipsPackage || aPackage instanceof SoundLevelMetricsPackage || aPackage instanceof SoundPropagationModelsPackage) { + } else if (aPackage instanceof SoundClipsPackage || aPackage instanceof SoundLevelMetricsPackage + || aPackage instanceof SoundPropagationModelsPackage || aPackage instanceof DetectionsPackage) { calibrationInfo = calibrationInfo.toBuilder() .calState(aPackage.getPreDeploymentCalibrationDate() != null ? "Calibration applied before processing" : "Not calibrated / not applicable") .calDate(null) diff --git a/pace-packaging/src/test/java/edu/colorado/cires/pace/packaging/PassivePackerFactoryTest.java b/pace-packaging/src/test/java/edu/colorado/cires/pace/packaging/PassivePackerFactoryTest.java index 877cc853..771b818a 100644 --- a/pace-packaging/src/test/java/edu/colorado/cires/pace/packaging/PassivePackerFactoryTest.java +++ b/pace-packaging/src/test/java/edu/colorado/cires/pace/packaging/PassivePackerFactoryTest.java @@ -27,15 +27,18 @@ import edu.colorado.cires.pace.data.object.dataset.base.metadata.location.StationaryMarineLocation; import edu.colorado.cires.pace.data.object.dataset.base.metadata.location.StationaryTerrestrialLocation; import edu.colorado.cires.pace.data.object.dataset.base.metadata.translator.DataQualityEntry; +import edu.colorado.cires.pace.data.object.dataset.detections.DetectionsPackage; import edu.colorado.cires.pace.data.object.dataset.passivePacker.PassivePackerPackage; import edu.colorado.cires.pace.data.object.dataset.soundClips.SoundClipsPackage; import edu.colorado.cires.pace.data.object.dataset.soundLevelMetrics.SoundLevelMetricsPackage; import edu.colorado.cires.pace.data.object.dataset.soundPropagationModels.SoundPropagationModelsPackage; +import edu.colorado.cires.pace.data.object.detectionType.DetectionType; import edu.colorado.cires.pace.data.object.position.Position; import edu.colorado.cires.pace.data.object.sensor.audio.AudioSensor; import edu.colorado.cires.pace.data.object.sensor.depth.DepthSensor; import edu.colorado.cires.pace.data.object.sensor.other.OtherSensor; import edu.colorado.cires.pace.datastore.DatastoreException; +import edu.colorado.cires.pace.repository.DetectionTypeRepository; import edu.colorado.cires.pace.repository.NotFoundException; import edu.colorado.cires.pace.repository.OrganizationRepository; import edu.colorado.cires.pace.repository.PersonRepository; @@ -58,13 +61,15 @@ class PassivePackerFactoryTest { private final ObjectMapper objectMapper = SerializationUtils.createObjectMapper() .configure(SerializationFeature.FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS, false) // for testing only + .configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true) .setPropertyNamingStrategy(PropertyNamingStrategies.UPPER_SNAKE_CASE); private final PersonRepository personRepository = mock(PersonRepository.class); private final OrganizationRepository organizationRepository = mock(OrganizationRepository.class); private final SensorRepository sensorRepository = mock(SensorRepository.class); + private final DetectionTypeRepository detectionTypeRepository = mock(DetectionTypeRepository.class); - private final PassivePackerFactory factory = new PassivePackerFactory(personRepository, organizationRepository, sensorRepository); + private final PassivePackerFactory factory = new PassivePackerFactory(personRepository, organizationRepository, sensorRepository, detectionTypeRepository); @BeforeEach void beforeEach() throws NotFoundException, DatastoreException { @@ -110,6 +115,11 @@ void beforeEach() throws NotFoundException, DatastoreException { .sensorType("sensor type") .properties("sensor properties") .build()); + + when(detectionTypeRepository.getByUniqueField("Blue whale")).thenReturn(DetectionType.builder() + .source("Blue whale") + .scienceName("Balaenoptera musculus") + .build()); } @Test @@ -255,6 +265,62 @@ void testCPODPrePostDeploymentCalibrated() throws IOException, NotFoundException ) ); } + + @Test + void testDetections() throws NotFoundException, DatastoreException, IOException { + assertEquals( + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString( + objectMapper.readValue(new File("src/test/resources/detections.json"), PassivePackerPackage.class) + ), + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString( + factory.createPackage(createDetectionsPackage(createStationaryMarineLocation(), null)) + ) + ); + } + + private Package createDetectionsPackage(LocationDetail locationDetail, LocalDate preDeploymentCalibrationDate) { + return createBasePackage(locationDetail).toInheritingType(DetectionsPackage.builder()).toBuilder() + .processingLevel(ProcessingLevel.Product) + .preDeploymentCalibrationDate(preDeploymentCalibrationDate) + .postDeploymentCalibrationDate(null) + .soundSource("Blue whale") + .qualityAnalyst("Chuck Anderson") + .qualityEntries(List.of( + DataQualityEntry.builder() + .qualityLevel(QualityLevel.good) + .minFrequency(0f) + .maxFrequency(500f) + .startTime(LocalDateTime.of(2011, 1, 1, 13, 0, 0)) + .endTime(LocalDateTime.of(2011, 1, 1, 15, 0,0)) + .comments("quality comments") + .channelNumbers(List.of(1, 2)) + .build(), + DataQualityEntry.builder() + .qualityLevel(QualityLevel.unusable) + .minFrequency(1f) + .maxFrequency(20f) + .startTime(LocalDateTime.of(2011, 1, 6, 13, 0, 0)) + .endTime(LocalDateTime.of(2012, 1, 8, 13, 0, 0)) + .comments("quality comments 2") + .channelNumbers(List.of(2)) + .build() + )).qualityAnalysisMethod("quality method") + .qualityAnalysisObjectives("quality objectives") + .qualityAssessmentDescription("quality assessment description") + .startTime(LocalDateTime.of(2010, 1, 1, 13, 0, 0)) + .endTime(LocalDateTime.of(2011, 1, 2, 13, 0, 0)) + .analysisTimeZone(6) + .analysisEffort(20) + .minFrequency(200f) + .maxFrequency(400f) + .sampleRate(20000f) + .softwareNames("software name") + .softwareVersions("software version") + .softwareProtocolCitation("protocol citation") + .softwareDescription("software statement") + .softwareProcessingDescription("software processing description") + .build(); + } private Package createSoundPropagationModelsPackage(LocationDetail locationDetail, LocalDate preDeploymentCalibrationDate) { return createBasePackage(locationDetail).toInheritingType(SoundPropagationModelsPackage.builder()).toBuilder() @@ -285,7 +351,7 @@ private Package createSoundClipsPackage(LocationDetail locationDetail, LocalDate .softwareProcessingDescription("software processing description") .processingLevel(ProcessingLevel.Product) .audioStartTime(LocalDateTime.of(2010, 1, 1, 13, 0, 0)) - .audioEndTime(LocalDateTime.of(2010, 1, 1, 13, 10, 0)) + .audioEndTime(LocalDateTime.of(2010, 1, 1, 13, 30, 0)) .build(); } diff --git a/pace-packaging/src/test/resources/detections.json b/pace-packaging/src/test/resources/detections.json new file mode 100644 index 00000000..6c5cd6d3 --- /dev/null +++ b/pace-packaging/src/test/resources/detections.json @@ -0,0 +1,123 @@ +{ + "DATA_COLLECTION_NAME": "project_site_deployment-id", + "PUBLISH_DATE": "2024-08-02", + "PROJECT_NAME": [ + "project" + ], + "DEPLOYMENT_NAME": "deployment-id", + "DEPLOYMENT_ALIAS": "alternate deployment name", + "SITE": "site", + "SITE_ALIASES": [ + "alternate site name" + ], + "TITLE": "deployment title", + "ABSTRACT": "deployment abstract", + "PURPOSE": "deployment purpose", + "QUALITY_DETAILS": { + "analyst": "Chuck Anderson", + "analyst_uuid": "ad7776a0-6c05-11e2-bcfd-0800200c9a66", + "quality_details": [ + { + "quality": "Good", + "low_freq": "0.0", + "high_freq": "500.0", + "start": "2011-01-01T13:00:00", + "end": "2011-01-01T15:00:00", + "comments": "quality comments", + "channels": "1,2" + }, + { + "quality": "Unusable", + "low_freq": "1.0", + "high_freq": "20.0", + "start": "2011-01-06T13:00:00", + "end": "2012-01-08T13:00:00", + "comments": "quality comments 2", + "channels": "2" + } + ], + "method": "quality method", + "objectives": "quality objectives", + "abstract": "quality assessment description" + }, + "PLATFORM_NAME": "Drifter", + "INSTRUMENT_TYPE": "AUH", + "INSTRUMENT_ID": "", + "DEPLOYMENT": { + "DEPLOYMENT_TIME": "", + "RECOVERY_TIME": "", + "AUDIO_START": "", + "AUDIO_END": "", + "DEPLOY_TYPE": "Stationary Marine", + "SEA_AREA": "Baltic Sea", + "DEPLOY_LAT": "-80.0", + "DEPLOY_LON": "80.0", + "DEPLOY_SHIP": "", + "DEPLOY_INSTRUMENT_DEPTH": "-100.0", + "DEPLOY_BOTTOM_DEPTH": "-200.0", + "RECOVER_LAT": "-85.0", + "RECOVER_LON": "85.0", + "RECOVER_SHIP": "", + "RECOVER_INSTRUMENT_DEPTH": "-90.0", + "RECOVER_BOTTOM_DEPTH": "-190.0" + }, + "DATASET_DETAILS": { + "TYPE": "Product", + "SUB_TYPE": "Detections", + "SOURCE_PATH": "/Users/paytoncain/Desktop/Project 12_Site 12_12", + "DATA_FILES": "/Users/paytoncain/Desktop/Project 12_Site 12_12", + "ANALYSIS_TIME_ZONE": "6", + "ANALYSIS_EFFORT": "20", + "MIN_ANALYSIS_FREQUENCY": "200.0", + "MAX_ANALYSIS_FREQUENCY": "400.0", + "ANALYSIS_SAMPLE_RATE": "20000.0", + "SOFTWARE_NAME": "software name", + "SOFTWARE_VERSION": "software version", + "PROTOCOL_REFERENCE": "protocol citation", + "PROCESSING_STATEMENT": "software processing description", + "SOFTWARE_STATEMENT": "software statement", + "ANALYSIS_START": "2010-01-01T13:00:00", + "ANALYSIS_END": "2011-01-02T13:00:00", + "SPECIES": "Blue whale", + "SCIENTIFIC_NAME": "Balaenoptera musculus" + }, + "CALIBRATION_INFO": { + "CAL_STATE": "Not calibrated / not applicable", + "CAL_DOCS_PATH" : "/Users/paytoncain/Desktop/Project 10_Site 10_10", + "COMMENT" : "calibration description", + "SENSITIVITY": "", + "FREQUENCY": "", + "GAIN": "" + }, + "SCIENTISTS": [ + { + "name": "Chuck Anderson", + "uuid": "ad7776a0-6c05-11e2-bcfd-0800200c9a66" + } + ], + "SPONSORS": [ + { + "name": "NOAA AFSC", + "uuid": "01082b23-154c-4c2d-bef7-5e35315d41e0" + } + ], + "FUNDERS": [ + { + "name": "BOEM", + "uuid": "fee4d17a-a7dd-4f13-ade5-817b4f1fc86d" + } + ], + "METADATA_AUTHOR": { + "NAME": "Chuck Anderson", + "UUID": "ad7776a0-6c05-11e2-bcfd-0800200c9a66", + "ORGANIZATION": "NESDIS/NCEI", + "POSITION": "Water Column Data Manager", + "STREET": "NOAA/NCEI, 325 Broadway", + "CITY": "Boulder", + "STATE": "CO", + "ZIP": "80305", + "COUNTRY": "USA", + "EMAIL": "", + "PHONE": "" + } +} diff --git a/pace-packaging/src/test/resources/sound_clips_calibrated.json b/pace-packaging/src/test/resources/sound_clips_calibrated.json index 8747fe5d..91ecf309 100644 --- a/pace-packaging/src/test/resources/sound_clips_calibrated.json +++ b/pace-packaging/src/test/resources/sound_clips_calibrated.json @@ -20,7 +20,7 @@ "DEPLOYMENT_TIME": "", "RECOVERY_TIME": "", "AUDIO_START": "2010-01-01T13:00:00", - "AUDIO_END": "2010-01-01T13:10:00", + "AUDIO_END": "2010-01-01T13:30:00", "DEPLOY_TYPE": "Stationary Marine", "SEA_AREA": "Baltic Sea", "DEPLOY_LAT": "-80.0", diff --git a/pace-packaging/src/test/resources/sound_clips_uncalibrated.json b/pace-packaging/src/test/resources/sound_clips_uncalibrated.json index 88b64b34..65fd95b5 100644 --- a/pace-packaging/src/test/resources/sound_clips_uncalibrated.json +++ b/pace-packaging/src/test/resources/sound_clips_uncalibrated.json @@ -20,7 +20,7 @@ "DEPLOYMENT_TIME": "", "RECOVERY_TIME": "", "AUDIO_START": "2010-01-01T13:00:00", - "AUDIO_END": "2010-01-01T13:00:00", + "AUDIO_END": "2010-01-01T13:30:00", "DEPLOY_TYPE": "Stationary Marine", "SEA_AREA": "Baltic Sea", "DEPLOY_LAT": "-80.0", diff --git a/pace-translator/src/main/java/edu/colorado/cires/pace/translator/converter/PackageConverter.java b/pace-translator/src/main/java/edu/colorado/cires/pace/translator/converter/PackageConverter.java index e1607b6c..e4fa46dc 100644 --- a/pace-translator/src/main/java/edu/colorado/cires/pace/translator/converter/PackageConverter.java +++ b/pace-translator/src/main/java/edu/colorado/cires/pace/translator/converter/PackageConverter.java @@ -335,6 +335,7 @@ private static MobileMarineLocation mobileMarineLocationFromMap(MobileMarineLoca .locationDerivationDescription(stringFromMap(properties, mobileMarineLocationTranslator.getLocationDerivationDescription())) .vessel(stringFromMap(properties, mobileMarineLocationTranslator.getVessel())) .seaArea(stringFromMap(properties, mobileMarineLocationTranslator.getSeaArea())) + // TODO handle file lists here (split by ;) .build(); }