From 4729fcfc92e29e6ecb7a0fa664573f00b7f990a4 Mon Sep 17 00:00:00 2001 From: LUBAC Date: Thu, 23 Apr 2026 17:16:36 +0200 Subject: [PATCH 1/6] fix VERTICAL_SAMPLING_SCHEME check --- file_checker_exec/pom.xml | 2 +- .../validators/ArgoProfileFileValidator.java | 2 +- .../file_checker_spec/NVS/R01.jsonld | 2 +- .../file_checker_spec/NVS/R08.jsonld | 22 ++++-- .../file_checker_spec/NVS/R23.jsonld | 11 ++- .../file_checker_spec/NVS/R25.jsonld | 6 +- .../file_checker_spec/NVS/R26.jsonld | 15 ++++ .../file_checker_spec/NVS/R27.jsonld | 71 ++++++++++++++++++- .../file_checker_spec/NVS/dateOfUpdate.txt | 3 +- 9 files changed, 121 insertions(+), 13 deletions(-) diff --git a/file_checker_exec/pom.xml b/file_checker_exec/pom.xml index c6d3623..c460250 100644 --- a/file_checker_exec/pom.xml +++ b/file_checker_exec/pom.xml @@ -4,7 +4,7 @@ 4.0.0 fr.ifremer file_checker_exec - 3.0.2 + 3.0.3 Argo NetCDF file format checker diff --git a/file_checker_exec/src/main/java/fr/coriolis/checker/validators/ArgoProfileFileValidator.java b/file_checker_exec/src/main/java/fr/coriolis/checker/validators/ArgoProfileFileValidator.java index 5b4cf5d..de957e6 100644 --- a/file_checker_exec/src/main/java/fr/coriolis/checker/validators/ArgoProfileFileValidator.java +++ b/file_checker_exec/src/main/java/fr/coriolis/checker/validators/ArgoProfileFileValidator.java @@ -880,7 +880,7 @@ public boolean validateMetaData(int nProf, ArgoReferenceTable.DACS dac, boolean } else { // need to delete optionnal free text ([free text]) : - s = s.replaceAll("\\s*\\[[^\\]]*\\]\\s*", "").trim(); + s = s.replaceAll("\\s*\\[.*\\]\\s*", "").trim(); tableEntry = ArgoNVSReferenceTable.VERTICAL_SAMPLING_SCHEME_TABLE.getConceptMembersByPrefLabelMap() .get(s); diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R01.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R01.jsonld index d30227b..914d336 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R01.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R01.jsonld @@ -269,7 +269,7 @@ "dce:identifier": "SDN:R01::METAAUX", "pav:version": "1", "skos:notation": "SDN:R01::METAAUX", - "skos:altLabel": "", + "skos:altLabel": "METAAUX", "dc:date": "2024-09-11 11:40:41.0", "owl:versionInfo": "1", "skos:prefLabel": { diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R08.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R08.jsonld index 6bebf73..44578e6 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R08.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R08.jsonld @@ -684,9 +684,14 @@ "dc:date": "2023-10-05 14:39:49.0", "skos:altLabel": "836", "skos:notation": "SDN:R08::836", - "skos:broader": { - "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III/" - }, + "skos:broader": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III_JUMBO/" + } + ], "pav:version": "2", "dce:identifier": "SDN:R08::836", "pav:hasCurrentVersion": { @@ -702,9 +707,14 @@ }, "dce:identifier": "SDN:R08::843", "pav:version": "1", - "skos:broader": { - "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_PROVOR/" - }, + "skos:broader": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_PROVOR/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_NEMO/" + } + ], "skos:notation": "SDN:R08::843", "skos:altLabel": "843", "dc:date": "2020-05-03 20:28:54.0", diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R23.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R23.jsonld index 9ae248b..7d47ce4 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R23.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R23.jsonld @@ -99,6 +99,9 @@ }, "skos:related": { "@id": "http://vocab.nerc.ac.uk/collection/R24/current/OPTIMARE/" + }, + "skos:narrower": { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/843/" }, "@type": "skos:Concept" }, @@ -111,7 +114,7 @@ "dce:identifier": "SDN:R23::PROVOR_III_JUMBO", "pav:version": "1", "skos:notation": "SDN:R23::PROVOR_III_JUMBO", - "skos:altLabel": "", + "skos:altLabel": "PROVOR_III_JUMBO", "dc:date": "2024-09-11 11:40:41.0", "owl:versionInfo": "1", "skos:prefLabel": { @@ -130,6 +133,12 @@ "skos:definition": { "@language": "en", "@value": "PROVOR float with additional battery pack. PLATFORM_ TYPE_ KEY = 108." + }, + "skos:related": { + "@id": "http://vocab.nerc.ac.uk/collection/R24/current/NKE/" + }, + "skos:narrower": { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/836/" }, "@type": "skos:Concept" }, diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R25.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R25.jsonld index 1ee94ff..53d7be8 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R25.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R25.jsonld @@ -83,7 +83,7 @@ }, "owl:versionInfo": "1", "dc:date": "2023-11-24 09:35:13.0", - "skos:altLabel": "" + "skos:altLabel": "CTD_TEMP_CNDC" }, { "@id": "http://vocab.nerc.ac.uk/collection/R25/current/FLUOROMETER_CHLA/", @@ -1059,7 +1059,11 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RAMSES_ACC/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_ICSW/" } + ], "skos:definition": { "@language": "en", diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R26.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R26.jsonld index 0f5d539..70efa48 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R26.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R26.jsonld @@ -863,6 +863,9 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_PRES/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO/" @@ -1098,6 +1101,9 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.4/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.5/" }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP_V1.2/" @@ -1164,6 +1170,9 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE63_OPTODE/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE83_OPTODE/" }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP_V1/" @@ -1272,6 +1281,9 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_ICSW/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_ICSW/" }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP_V1.9/" @@ -1299,6 +1311,9 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_R10W/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_R10W/" }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/C_ROVER/" diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R27.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R27.jsonld index ee675fb..006c2b8 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R27.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R27.jsonld @@ -95,6 +95,9 @@ "dc:date": "2025-11-18 12:09:41.0", "skos:altLabel": "SBE83_OPTODE", "skos:notation": "SDN:R27::SBE83_OPTODE", + "skos:broader": { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" + }, "pav:version": "2", "dce:identifier": "SDN:R27::SBE83_OPTODE", "pav:hasCurrentVersion": { @@ -124,6 +127,9 @@ "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/" } ], + "skos:broader": { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/RBR/" + }, "skos:definition": { "@language": "en", "@value": "A system comprising temperature, conductivity and pressure sensors, manufactured by RBR for moored applications. This cell was not optimized for use on profiling floats, and this was used in only one test deployment. The system supports both spot and continuous sampling modes, with sampling speeds configurable to up to 12 Hz. The depth rating for a standard profile is 2000 dbar, with energy consumption of approximately 700 J." @@ -169,6 +175,9 @@ "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_UP_RAD412/" } ], + "skos:broader": { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" + }, "skos:definition": { "@language": "en", "@value": "Replaces deprecated term 'http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_R10W'. A cosine-response, multispectral radiometer configured to measure upwelling radiance in water. Number of channels: 4; field of view: 10 deg (half angle, half maximum); bandwidth range: 400 nm to 865 nm (standard), or 305 nm, 325 nm, 340 nm, 380 nm (UV); sampling rate: 7 Hz - 24 Hz; spectral bandwidth: 10 nm or 20 nm. The instrument was originally developed and manufactured at Satlantic, and was rebranded as a Sea-Bird Scientific product following the company's acquisition by Danaher in 2011." @@ -216,8 +225,14 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_DOWN_IRR490/" - } + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_PAR/" + } ], + "skos:broader": { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" + }, "skos:definition": { "@language": "en", "@value": "Replaces deprecated term 'http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_ICSW'. A cosine-response, multispectral radiometer configured to measure downwelling irradiance in water. Number of channels: 4; bandwidth range: 400 nm to 865 nm (standard), or 305 nm, 325 nm, 340 nm, 380 nm (UV); sampling rate: 7 Hz - 24 Hz; spectral bandwidth: 10 nm or 20 nm. The instrument was originally developed and manufactured at Satlantic, and was rebranded as a Sea-Bird Scientific product following the company's acquisition by Danaher in 2011." @@ -2669,6 +2684,57 @@ "skos:broader": { "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" } + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.5/", + "pav:hasVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.5/1/" + }, + "pav:authoredOn": "2025-04-03 11:54:30.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.5/2/" + }, + "dce:identifier": "SDN:R27::SBE41N_V5.3.5", + "pav:version": "2", + "@type": "skos:Concept", + "skos:related": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_PRES/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_CNDC/" + } + ], + "skos:definition": { + "@language": "en", + "@value": "A system comprising temperature, conductivity and pressure sensors with pump-controlled, T-C ducted flow, manufactured by Sea-Bir Scientific. The unit is designed for deployment on profiling floats hosting multiple biogeochemical (BGC) sensors. This CTD operates in continuous profiling (CP) mode, thus sampling at 1 Hz during float ascent. Data from all the float's sensors, including the optional bolt-on ones, are integrated in the data stream and transmitted to the float controller when the float reaches the surface. This SBE41N model has firmware version 5.3.5." + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "true", + "skos:note": { + "@language": "en", + "@value": "deprecated" + }, + "dc:identifier": "SDN:R27::SBE41N_V5.3.5", + "skos:prefLabel": { + "@language": "en", + "@value": "Sea-Bird Scientific SBE 41N CTD V5.3.5" + }, + "owl:versionInfo": "2", + "dc:date": "2025-04-03 11:54:30.0", + "skos:altLabel": "SBE41N_V5.3.5", + "skos:notation": "SDN:R27::SBE41N_V5.3.5", + "skos:broader": { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" + } }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N/", @@ -6684,6 +6750,9 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.4/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.5/" }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP_V1.2/" diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/dateOfUpdate.txt b/file_checker_exec/src/main/resources/file_checker_spec/NVS/dateOfUpdate.txt index 4225209..a842c6d 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/dateOfUpdate.txt +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/dateOfUpdate.txt @@ -1 +1,2 @@ -2026-04-21T09:24:48.256314 \ No newline at end of file +2026-04-21T09:24:48.256314 +manual fixes done on R01, R08, R23, R25, R27 \ No newline at end of file From c9b6a5552a03b3d2b1314572fb16b64a8f56c4a8 Mon Sep 17 00:00:00 2001 From: LUBAC Date: Thu, 23 Apr 2026 18:10:28 +0200 Subject: [PATCH 2/6] add basic e2e check for vertical sampling scheme --- .../validateVerticalSampingSchemeIT.java | 29 ++++++++++++++++++ .../BR6990526_136_imbricatedBrackets.nc | Bin 0 -> 189616 bytes 2 files changed, 29 insertions(+) create mode 100644 file_checker_exec/src/test/java/fr/coriolis/checker/e2etests/validateVerticalSampingSchemeIT.java create mode 100644 file_checker_exec/src/test/netcdf-test-files/TEST_PROFILE_0006/BR6990526_136_imbricatedBrackets.nc diff --git a/file_checker_exec/src/test/java/fr/coriolis/checker/e2etests/validateVerticalSampingSchemeIT.java b/file_checker_exec/src/test/java/fr/coriolis/checker/e2etests/validateVerticalSampingSchemeIT.java new file mode 100644 index 0000000..2939664 --- /dev/null +++ b/file_checker_exec/src/test/java/fr/coriolis/checker/e2etests/validateVerticalSampingSchemeIT.java @@ -0,0 +1,29 @@ +package fr.coriolis.checker.e2etests; + +import java.io.IOException; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class validateVerticalSampingSchemeIT { + + private final String TEST_DIR_NAME = "TEST_PROFILE_0006"; + + @BeforeAll + public static void init() { + TestsUtils.init(validateVerticalSampingSchemeIT.class); + } + + @Tag(TEST_DIR_NAME) + @ParameterizedTest(name = "{0} from dac {1} should have status {2} at phase {3}") + @CsvSource({ "BR6990526_136_imbricatedBrackets.nc,coriolis" }) + void fileChecker_shouldNotRaiseWarning_WhenImbricatedBracketsInOptText(String fileName, String dac) + throws IOException, InterruptedException { + + TestsUtils.e2eTestWarningAbsence(fileName, dac, TEST_DIR_NAME); + + } + +} diff --git a/file_checker_exec/src/test/netcdf-test-files/TEST_PROFILE_0006/BR6990526_136_imbricatedBrackets.nc b/file_checker_exec/src/test/netcdf-test-files/TEST_PROFILE_0006/BR6990526_136_imbricatedBrackets.nc new file mode 100644 index 0000000000000000000000000000000000000000..b5ca35eb390d1f70a81b3b8870e62cfd3b743cd6 GIT binary patch literal 189616 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 l0WuNZSK-fD@z1Ya8^3EyuVnEdflk4cD&7a Date: Mon, 27 Apr 2026 15:17:29 +0200 Subject: [PATCH 3/6] add internal copy of specs during build process --- file_checker_exec/pom.xml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/file_checker_exec/pom.xml b/file_checker_exec/pom.xml index c460250..8b57f84 100644 --- a/file_checker_exec/pom.xml +++ b/file_checker_exec/pom.xml @@ -161,6 +161,33 @@ + + + org.apache.maven.plugins + maven-resources-plugin + 3.3.1 + + + copy-external-folder + generate-resources + + copy-resources + + + + ${project.basedir}/src/main/resources/file_checker_spec + + true + + + ${project.basedir}/../file_checker_spec + false + + + + + + org.apache.maven.plugins From 64853b0932a02ca2d041066b3919a3da5f9fa5cd Mon Sep 17 00:00:00 2001 From: Yvan Lubac Date: Mon, 27 Apr 2026 15:47:06 +0200 Subject: [PATCH 4/6] add clean resources/file_checker_spec before copying it from ../file_checker_spec source folder during the build process --- file_checker_exec/pom.xml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/file_checker_exec/pom.xml b/file_checker_exec/pom.xml index 8b57f84..9ce0552 100644 --- a/file_checker_exec/pom.xml +++ b/file_checker_exec/pom.xml @@ -161,6 +161,31 @@ + + + org.apache.maven.plugins + maven-clean-plugin + 3.4.0 + + + delete-spec-folder + initialize + + clean + + + true + + + + ${project.basedir}/src/main/resources/file_checker_spec + + + + + + + org.apache.maven.plugins From f47cb0bc2f17d27302cd326c8f3c27c7408fac65 Mon Sep 17 00:00:00 2001 From: Yvan Lubac Date: Tue, 28 Apr 2026 09:45:24 +0200 Subject: [PATCH 5/6] add missing mapping in R27 table --- file_checker_spec/NVS/R27.jsonld | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/file_checker_spec/NVS/R27.jsonld b/file_checker_spec/NVS/R27.jsonld index 006c2b8..b1a5750 100644 --- a/file_checker_spec/NVS/R27.jsonld +++ b/file_checker_spec/NVS/R27.jsonld @@ -175,9 +175,14 @@ "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_UP_RAD412/" } ], - "skos:broader": { - "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" - }, + "skos:broader": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SATLANTIC/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" + } + ], "skos:definition": { "@language": "en", "@value": "Replaces deprecated term 'http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_R10W'. A cosine-response, multispectral radiometer configured to measure upwelling radiance in water. Number of channels: 4; field of view: 10 deg (half angle, half maximum); bandwidth range: 400 nm to 865 nm (standard), or 305 nm, 325 nm, 340 nm, 380 nm (UV); sampling rate: 7 Hz - 24 Hz; spectral bandwidth: 10 nm or 20 nm. The instrument was originally developed and manufactured at Satlantic, and was rebranded as a Sea-Bird Scientific product following the company's acquisition by Danaher in 2011." @@ -230,9 +235,14 @@ "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_PAR/" } ], - "skos:broader": { - "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" - }, + "skos:broader": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SATLANTIC/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" + } + ], "skos:definition": { "@language": "en", "@value": "Replaces deprecated term 'http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_ICSW'. A cosine-response, multispectral radiometer configured to measure downwelling irradiance in water. Number of channels: 4; bandwidth range: 400 nm to 865 nm (standard), or 305 nm, 325 nm, 340 nm, 380 nm (UV); sampling rate: 7 Hz - 24 Hz; spectral bandwidth: 10 nm or 20 nm. The instrument was originally developed and manufactured at Satlantic, and was rebranded as a Sea-Bird Scientific product following the company's acquisition by Danaher in 2011." From e278853c7ab8035814ec0812e2e7d71f61fe9076 Mon Sep 17 00:00:00 2001 From: Yvan Lubac Date: Tue, 28 Apr 2026 09:57:10 +0200 Subject: [PATCH 6/6] update ressources folder --- .../file_checker_spec/NVS/R27.jsonld | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R27.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R27.jsonld index 006c2b8..b1a5750 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R27.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R27.jsonld @@ -175,9 +175,14 @@ "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_UP_RAD412/" } ], - "skos:broader": { - "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" - }, + "skos:broader": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SATLANTIC/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" + } + ], "skos:definition": { "@language": "en", "@value": "Replaces deprecated term 'http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_R10W'. A cosine-response, multispectral radiometer configured to measure upwelling radiance in water. Number of channels: 4; field of view: 10 deg (half angle, half maximum); bandwidth range: 400 nm to 865 nm (standard), or 305 nm, 325 nm, 340 nm, 380 nm (UV); sampling rate: 7 Hz - 24 Hz; spectral bandwidth: 10 nm or 20 nm. The instrument was originally developed and manufactured at Satlantic, and was rebranded as a Sea-Bird Scientific product following the company's acquisition by Danaher in 2011." @@ -230,9 +235,14 @@ "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_PAR/" } ], - "skos:broader": { - "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" - }, + "skos:broader": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SATLANTIC/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" + } + ], "skos:definition": { "@language": "en", "@value": "Replaces deprecated term 'http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_ICSW'. A cosine-response, multispectral radiometer configured to measure downwelling irradiance in water. Number of channels: 4; bandwidth range: 400 nm to 865 nm (standard), or 305 nm, 325 nm, 340 nm, 380 nm (UV); sampling rate: 7 Hz - 24 Hz; spectral bandwidth: 10 nm or 20 nm. The instrument was originally developed and manufactured at Satlantic, and was rebranded as a Sea-Bird Scientific product following the company's acquisition by Danaher in 2011."