diff --git a/.gitignore b/.gitignore index e56acf4..5fa7a16 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ *.filecheck .env - +Release_procedure.md diff --git a/README.md b/README.md index 0696599..c1cd9d3 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,9 @@ Vocabularies and format changes are managed on [Argo Vocabs Task Team - AVTT Git - file_checker_spec folder containing all specifications and reference tables. - source code -## Run Argo NetCDF file format checker +## I - Run Argo NetCDF file format checker -### Using file_checker_exec-{version}.jar : +### I.1 - Using file_checker_exec-{version}.jar : ```bash java -jar file_checker_exec-{version}.jar $OPTION $DAC_NAME $SPEC $OUTPUT_DIR $INPUT_DIR [$FILES_NAMES] @@ -27,7 +27,7 @@ java -jar file_checker_exec-{version}.jar $OPTION $DAC_NAME $SPEC $OUTPUT_DIR $I $FILES_NAMES is a list of file's name from the INPUT_DIR. It is optional : without it, all files from INPUT_DIR will be checked. -### Run the application using Docker +### I.2 - Run the application using Docker ```bash docker run --rm -v [ABSOLUTE_PATH_TO_DATA_FOLDER]:/app/data -v [ABSOLUTE_PATH_TO_OUTPUT_DIR]:/app/results ghcr.io/oneargo/argoformatchecker/app:{TAG} [$OPTIONS] $DAC_NAME ./file_checker_spec ./results ./data [$FILES_NAMES] @@ -53,7 +53,7 @@ Example : docker run --rm -v D:\test_file_checker\datatest:/app/data -v D:\test_file_checker\results:/app/results ghcr.io/oneargo/argoformatchecker/app:develop -no-name-check coriolis ./file_checker_spec ./results ./data ``` -### Run the application using Docker Compose +### I.3 - Run the application using Docker Compose To facilitate the use of Argo file checker a compose.yaml and .env files are provided : @@ -89,7 +89,7 @@ FILECHECKER_OPTIONS= FILES_NAMES= ``` -### Run the application on demonstration files +### I.4 - Run the application on demonstration files Demonstration data are availables to run the application locally easily. @@ -113,27 +113,27 @@ or for Windows : output files will be generated in `./demo/outputs`. -### Run File checker using Python and an API +### I.5 - Run File checker using Python and an API In folder /file-checker-python you will find a python wrapper and an API to facilitate the use of Argo FileChecker. See [python.README](./python.README.md) for more informations. -### Test data +### I.6 - Test data To further test the Argo File Checker, you will find argo data here : https://www.argodatamgt.org/DataAccess.html The Argo File Checker is not yet designed to checking *prof.nc and *Sprof.nc. It checks only TRAJ, META, TECH and PROFILES files. -## Run File checker using Python and an API +## II - Run File checker using Python and an API In folder /argo-file-checker-python you will find a python wrapper and an API to facilitate the use of Argo FileChecker. -## TOOLS +## III - TOOLS -### Maven Wrapper +### III.1 - Maven Wrapper Thanks to the wrapper, Maven is embedded in the project (in a defined version). No need to install Maven on your development workstation, just use the wrapper script included in the project. -## Getting Started +## IV - Getting Started - Clone the repository : @@ -141,7 +141,7 @@ Thanks to the wrapper, Maven is embedded in the project (in a defined version). git clone https://github.com/OneArgo/ArgoFormatChecker.git ``` -### building jar +### IV.1 - building jar - Build the application with maven (will requiert Java jdk installed), in file_checker_exec folder : @@ -152,7 +152,7 @@ cd file_checker_exec In target folder you will find both original-file_checker_exec and file_checker_exec-[version]. It is this last one to use. -### build docker image +### IV.2 - build docker image - Build the application with Docker : @@ -160,10 +160,14 @@ In target folder you will find both original-file_checker_exec and file_checker_ docker build -t filechecker_2.8.14 . ``` -### Run integration tests +### IV.3 - Run integration tests The source code comes with some netcdf test files. You can run the integration tests with this following command : ```bash ./mvnw verify ``` + +## V - Making a new release + +The new release procedure is kept internal to Ifremer within Release_procedure.md (not pushed to GitHub) diff --git a/Release_procedure.md b/Release_procedure.md new file mode 100644 index 0000000..df95144 --- /dev/null +++ b/Release_procedure.md @@ -0,0 +1,53 @@ +# Procédure nouvelle release + +Cette procédure explicite quelles étapes réaliser pour diffuser une nouvelle versiion du File Format Checker en opérationel. +Elle n'a pas vocation à se trouver dans le GitHub (ce fichier fait parti du gitIgnore). + +pré-requis: +- code, les fichiers de configuration et/ou les tables NVS mis-à-jour +- JDK installée + +1. Contrôle des tables NVS avec le [script nvs-tables-download](https://gitlab.ifremer.fr/amrit/development/nvs-tables-download). + +2. Création d'une branche sur le Gitlab avec les modifications de la version et réaliser un Pull Request. + - modifier le fichier file_checker_exec/pom.xml avec la nouvelle version du FileChecker en ligne 7: + ``` + x.y.z + ``` + +3. Créer un dépôt local de cette branche gitlab puis + - Depuis /file_checker_exec : execution des test "end-to-end" internes `mvn verify`. + - Depuis /file_checker_exec : Génerer l'executable *.jar `mvn clean package` + +4. Comparaison ancienne version et nouvelle version sur un ensemble de fichiers (typiquement les fichiers mis-à-jour au GDAC sur les 20 derniers jours) en utilisant le script [compare_version.py](https://gitlab.ifremer.fr/amrit/development/format-checker-gdac-audit). Le Readme indique un exemple pour sélectionner l'ensemble de fichier. Cette non-régression exhaustive peut être assez longue (1 journée en faisant tourner en local). On peut raccourcir bien évidemment la période visée au besoin. + +5. Valider les nouveautés de la version (nouvelle entrée table importante, nouvelle fonction) + +6. Tester sur coriolis_dev (/home/coriolis_dev/val/binlx/co03/co0308/co030801/co03080102/) : + - Copier le nouveau .jar et remplacer le file_checker_spec dans /exe + - Modifier le ArgoFileChecker.csh pour faire référence au nouvel executable. + - Modifier le /tst/TU_YL_20241114.csh pour le nom des fichiers logs + - lancer le script /tst/TU_YL_20241114.csh + - Répéter les deux étapes précédentes pour changer le nom du DAC (aoml, coriolis et incois sont disponibles en test) + - Controler la bonne execution du File Checker dans le fichier execution_summary_3.0.4.log et éventuellement dans les erreurs dans les fichiers présents sous /home/coriolis_dev/val/spool/co03/co0308/co030801/co03080102/{DAC_NAME}/output. Pour le DAC Coriolis, 18 fichiers sont acceptés sur les 64. + +7. Accepter et merger la Pull Request sur le Gitlab. + +8. Créer le tag de version sur le gitlab ifremer. + +9. Copie de l'executable et de file_checker_spec sur coriolis_exp /home/coriolis_exp/binlx/co03/co0308/co030801/co03080102/ + - modification du fichier ArgoFileChecker.csh sur coriolis_exp pour faire référence à la nouvelle version. + +10. Modifier le document de suivi coriolis sur le google drive coriolis-doc/modifications -> indiquer les modifications, évolutions, heure locale. + +11. Sur le [repo github](https://github.com/OneArgo/ArgoFormatChecker) public: Créer une branche, faire une PR bien documentée, et fusionner la PR. + +12. Faire une release en ajoutant le .jar en pièce jointe. + +13. Envoyer un message à [Michael Frost](Michael.Frost@nrlmry.navy.mil) en donnant le lien de la nouvelle release et en decrivant en quelques mots ce qu'apporte la nouvelle version, et mettre en copie l'AVTT chair (https://github.com/OneArgo/ArgoVocabs/blob/master/README.md#i-the-argo-vocabulary-task-team). + +14. Faire une news ou amender une news (pour les versions mineures) sur https://www.argodatamgt.org/news/. Par exemple https://www.argodatamgt.org/news/20260421-ArgoFileFormatCheckerV3.html + +15. Faire un message à Argo-dm pour informer tous les DACs de cette nouvelle version. + + diff --git a/file_checker_exec/pom.xml b/file_checker_exec/pom.xml index 2b5e93f..de3b1c0 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.4 + 3.0.5 Argo NetCDF file format checker diff --git a/file_checker_exec/src/main/java/fr/coriolis/checker/specs/ArgoConfigTechParam.java b/file_checker_exec/src/main/java/fr/coriolis/checker/specs/ArgoConfigTechParam.java index 4870c4a..e080561 100644 --- a/file_checker_exec/src/main/java/fr/coriolis/checker/specs/ArgoConfigTechParam.java +++ b/file_checker_exec/src/main/java/fr/coriolis/checker/specs/ArgoConfigTechParam.java @@ -1,1110 +1,1122 @@ -package fr.coriolis.checker.specs; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import fr.coriolis.checker.tables.ArgoNVSReferenceTable; -import fr.coriolis.checker.tables.SkosConcept; -import fr.coriolis.checker.utils.NvsDefinitionParser; - -/** - * Implements features to check the Meta-data CONFIG_PARAMETER_NAME (including - * LAUNCH_...) and TECHNICAL_PARAMETER_NAME. This includes the units - * allowed for both. - * - * @author Mark Ignaszewski - * @version $HeadURL: - * https://inversion.nrlmry.navy.mil/svn/godae/trunk/argo/bin/java/usgdac/ArgoConfigTechParam.java - * $ - * @version $Id: ArgoConfigTechParam.java 1257 2021-04-26 14:09:25Z ignaszewski - * $ - */ -public class ArgoConfigTechParam { -//............................................ -// VARIABLES -//............................................ - - // ..........Class variables.............. - - public static enum ConfigTechValueType { - DATE_TIME("date/time"), FLOAT("float"), HEX("hex"), INTEGER("integer"), LOGICAL("logical"), STRING("string"), - UNKNOWN("unknown"); - - public final String name; - - ConfigTechValueType(String d) { - name = d; - } - - public static ConfigTechValueType getType(String name) { - for (ConfigTechValueType c : ConfigTechValueType.values()) { - if (name.equals(c.name)) { - return c; - } - } - return ConfigTechValueType.UNKNOWN; - } - - @Override - public String toString() { - return name; - } - }; - - // ......define and initialize the template replacement patterns...... - - static final String defaultTemplateReplacement; - static final Map templateReplacement; - static final Set knownTemplates; - static final Set knownTemplatesWithMatchListToCheck; - static { - defaultTemplateReplacement = "(?\\w+)"; - - Map temp = new HashMap(10); - // ..config templates (alphabetical order) - temp.put("D", "(?\\d+?)"); - temp.put("cycle_phase_name", "(?[A-Z][a-z]+(?:[A-Z][a-z]+)*?Phase)"); - temp.put("I", "(?\\d+?)"); - temp.put("N", "(?\\d+?)"); - temp.put("N+1", "(?\\d+?)"); - temp.put("param", "(?[A-Z][a-z]+(?:[A-Z][a-z]+)??)"); - temp.put("PARAM", "(?[A-Z]+?)"); - temp.put("S", "(?\\d+?)"); - temp.put("SubS", "(?\\d+?)"); - temp.put("short_sensor_name", "(?[A-Z][a-z]+?|CTD)"); - // ..tech templates (alphabetical order) - temp.put("digit", "(?\\d)"); - temp.put("int", "(?\\d+?)"); - // ..already defined above - temp.put("Z", "(?\\d+?)"); - templateReplacement = Collections.unmodifiableMap(temp); - - knownTemplates = new HashSet<>(Arrays.asList("D", "horizontalphasename", "I", "N", "N1", "param", "PARAM", "S", - "SubS", "shortsensorname", "verticalphasename", "cyclephasename", "digit", "int", "Z")); - knownTemplatesWithMatchListToCheck = new HashSet<>(Arrays.asList("horizontalphasename", "N", "N1", "digit", - "param", "PARAM", "shortsensorname", "verticalphasename", "cyclephasename")); - - } - // ......define and initialize the pattern matcher objects...... - static Pattern pBlankOrComment; // ..match a blank line or a comment line - static Pattern pComment; // ..comment - - static { - // ..match a blank line (or a line with just comments) - pBlankOrComment = Pattern.compile("^\\s*(?://.*)*"); - - // ..match a comment (any where on the line) - recognize the "//@" comments - // ..group 1: the word following "@"; group 2: the setting - pComment = Pattern.compile("//(?:@\\s*(\\w+)\\s*=\\s*\"(.+)\")?.*$"); - } - - // .....object variables...... - - private String unitFileName; - private String version; - - private LinkedHashSet configParamList; // ..config param fixed names - private LinkedHashSet configParamList_DEP; // ..config param fixed names (deprctd) - // private LinkedHashSet configParamRegex; //..config param variable - // names - // private LinkedHashSet configParamRegex_DEP; //..config param - // variable names - private LinkedHashMap>> configParamRegex; // ..config param variable names - private LinkedHashMap>> configParamRegex_DEP; // ..config param variable - // names - - private LinkedHashSet techParamList; // ..tech param fixed names - private LinkedHashSet techParamCodeList; // ..full tech param names -with unit- : reference table 14a - - private LinkedHashSet techParamList_DEP; // ..tech param fixed names (deprctd) - private LinkedHashSet techParamCodeList_DEP; - - // The following map is needed to check TECH time series variable (same variable - // name but different units and long_name posssible) : - private Map> paramAuthorizedUnits = new HashMap<>(); - private Map> paramAuthorizedLongName = new HashMap<>(); - - // private LinkedHashSet techParamRegex; //..tech param regex names - // private LinkedHashSet techParamRegex_DEP; //..tech param regex names - // (deprctd) - private LinkedHashMap>> techParamRegex; // ..config param variable names - private LinkedHashMap>> techParamRegex_DEP; // ..config param variable - // names - - private LinkedHashMap unitList; // ..config/tech units and type - private LinkedHashMap unitList_DEP; // ..config/tech units - deprecated - - // ..logger - private static final Logger log = LogManager.getLogger("ArgoConfigTechParam"); - -//............................................ -// CONSTRUCTORS -//............................................ - - /** - * Reads the CONFIGURATION_PARAMETER and TECHNICAL_PARAMETER specification - * files.
- * The files must be in specDir and are named - * argo-config_names-spec-v<version> and - * "argo-tech_names-spec-v<version> - * - * @param specDir Path to the specification file directory - * @param version Argo netCDF file version - * @param initConfig true: Read CONFIGURATION_PARAMETER specification file - * @param initTech true: Read TECHNICAL_PARAMETER specification file - * @throws IOException File I/O errors - */ - - public ArgoConfigTechParam(String version, boolean initConfig, boolean initTech) throws IOException { - log.debug("...ArgoConfigTechParam: start..."); - - this.version = version.trim(); - String prefix = "argo-"; - - unitFileName = prefix + "tech_units-spec-v" + this.version; - - if (initConfig) { - parseConfigParamFiles(); - } - if (initTech) { - parseTechParamFile(); - } - - parseUnitFile(); - - if (log.isDebugEnabled()) { - if (configParamList == null) { - log.debug("configParamList size = null"); - } else { - log.debug("configParamList size = {}", configParamList.size()); - } - if (configParamList_DEP == null) { - log.debug("configParamList_DEP size = null"); - } else { - log.debug("configParamList_DEP size = {}", configParamList_DEP.size()); - } - if (techParamList == null) { - log.debug("techParamList size = null"); - } else { - log.debug("techParamList size = {}", techParamList.size()); - } - if (techParamList_DEP == null) { - log.debug("techParamList_DEP size = null"); - } else { - log.debug("techParamList_DEP size = {}", techParamList_DEP.size()); - } - log.debug("...ArgoConfigTechParam: end..."); - } - } - -//............................................ -// METHODS -//............................................ - - /** - * Determines if the name is matched by a REGEX in the set - * - * @param name The parameter name in question. - * @param regexSet The set of REGEXPs to check - * @return An ArgoConfigTechParamMatch containing full information about the - * match (null = NO MATCH) - */ - private ArgoConfigTechParamMatch checkRegex(String name, - HashMap>> regexSet) { - ArgoConfigTechParamMatch match = null; // ..return object - HashMap unMatchedTemplates = null; // ..return templates - HashMap failedMatchedTemplates = null; // ..return templates - - // ..NOTE..NOTE..NOTE.. - // ..Should be able to truncate the loop below on the first match - // ..ie, find a match -> return - // ..However, during development I *really* want to know if there are - // ..multiple matches - which indicates ambiguous regex patterns - // ..So, FOR NOW, complete the looping and report multiple matches - // ..Returns the LAST one matched - - for (Map.Entry>> entry : regexSet.entrySet()) { - Pattern pattern = entry.getKey(); - HashMap> value = entry.getValue(); - - Matcher m = pattern.matcher(name); - - if (m.matches()) { - unMatchedTemplates = new HashMap(m.groupCount()); - failedMatchedTemplates = new HashMap(m.groupCount()); - - for (String key : knownTemplates) { - try { - String str = m.group(key); - - // ..is there a "match-list" for this (regex param and template) - - if (value != null) { - HashSet matchSet = value.get(key); - - if (matchSet == null) { - // ..there was no match-list to compare to - unMatchedTemplates.put(key, str); - - } else { - // ..there is a match-list - compare it - - if (!matchSet.contains(str)) { - failedMatchedTemplates.put(key, str); - log.debug("checkRegex: match-list success: key '{}', matched '{}'", key, str); - - } else if (log.isDebugEnabled()) { - log.debug("checkRegex: match-list failed: key '{}', matched '{}'", key, str); - } - } - } else { - unMatchedTemplates.put(key, str); - } - - } catch (IllegalArgumentException e) { - } - } - - match = new ArgoConfigTechParamMatch(pattern.toString(), false, unMatchedTemplates.size(), - unMatchedTemplates, failedMatchedTemplates.size(), failedMatchedTemplates); - - log.debug("checkRegex: '{}' regex match #{}: '{}', unMatchedTemplates {}" + "failedTemplates {}", - unMatchedTemplates.size(), failedMatchedTemplates.size()); - - // ****temporary**** return match; - } - } - - return match; - } // ..checkRegex - - /** - * Determines if the name is a CONFIG parameter name - * - * @param name the parameter name in question. - * @return An ArgoConfigTechParamMatch containing full information about the - * match (null = NO MATCH) - * - */ - public ArgoConfigTechParamMatch findConfigParam(String name) { - ArgoConfigTechParamMatch match = findParam(name, configParamList, configParamRegex, configParamList_DEP, - configParamRegex_DEP); - return match; - } - - /** - * Determines if the name is a Tech parameter name - * - * @param name the parameter name in question. - * @return An ArgoConfigTechParamMatch containing full information about the - * match (null = NO MATCH) - * - */ - public ArgoConfigTechParamMatch findTechParam(String name) { - ArgoConfigTechParamMatch match = findParam(name, techParamList, techParamRegex, techParamList_DEP, - techParamRegex_DEP); - return match; - } - - /** - * Determines if the name is a valid parameter name within the supplied lists - * - * @param name the parameter name in question. - * @return An ArgoConfigTechParamMatch containing full information about the - * match (null = NO MATCH) - * - */ - private ArgoConfigTechParamMatch findParam(String name, HashSet activeList, - HashMap>> activeRegex, HashSet deprecatedList, - HashMap>> deprecatedRegex) { - boolean literal = false; - HashMap templates = null; - ArgoConfigTechParamMatch match = null; - - if (activeList != null) { - if (activeList.contains(name)) { - match = new ArgoConfigTechParamMatch(name, false); - - log.debug("findParam: '{}': active literal match", name); - return match; - } - } - - // ..did NOT match one of the literal strings - // ..check for a regex match - - if (activeRegex != null) { - // log.debug("findParam: checking active regex"); - - match = checkRegex(name, activeRegex); - - if (match != null) { - match.isDeprecated = false; - log.debug("findParam: '{}': active regex match '{}'", name, match.match); - return match; - } - } - - if (deprecatedList != null) { - if (deprecatedList.contains(name)) { - match = new ArgoConfigTechParamMatch(name, true); - - log.debug("findParam: '{}': deprecated literal match", name); - return match; - } - } - - if (deprecatedRegex != null) { - // log.debug("findParam: checking active regex"); - - match = checkRegex(name, deprecatedRegex); - - if (match != null) { - match.isDeprecated = true; - log.debug("findParam: '{}': deprecated regex match '{}'", name, match.match); - return match; - } - } - - log.debug("findParam: '{}': failed match", name); - return null; - } - - /** - * Return the TechParam list defined in spec files (argo-tech_names-spec-v*) - * - * @return - */ - public LinkedHashSet getTechParamList() { - return techParamList; - } - - public LinkedHashSet getTechCodeList() { - return techParamCodeList; - } - - public Map> getParamAuthorizedUnits() { - return paramAuthorizedUnits; - } - - public Map> getParamAuthorizedLongName() { - return paramAuthorizedLongName; - } - - /** - * Return the TechParam list containing a regex defined in spec files - * (argo-tech_names-spec-v*) - * - * @return - */ - public LinkedHashMap>> getTechParamRegex() { - return techParamRegex; - } - - /** - * Determines if the value is valid for the unit (mapped to data-type) - * - * @param unit the unit name - * @param value the config value - * @return True - value is a valid setting for the given unit (or unit is - * unknown) False - parameter name is NOT valid (or tech spec not - * opened) - * - */ - public boolean isConfigTechValidValue(String unit, String value) { - // ..turn the unit name into a data type - ConfigTechValueType dt = unitList.get(unit); - - if (dt == null || dt == ConfigTechValueType.UNKNOWN) { - // ..unit name is unknown OR the data type for this unit is unkown - // ..can't check the value setting - // ..so blindly return "it's good" (???) - log.debug("isConfigTechValidValue: default to true: unit, data-type, value = '{}', '{}', '{}'", unit, dt, - value); - - return true; - } - - boolean valid = false; - switch (dt) { - case DATE_TIME: - valid = ArgoDate.checkArgoDatePattern(unit, value); - break; - - case FLOAT: - try { - double n = Double.parseDouble(value); - valid = true; - - } catch (NumberFormatException e) { - valid = false; - } - break; - - case HEX: - valid = value.matches("(?i)(0x)?[0-9a-f]+"); - break; - - case INTEGER: - try { - int n = Integer.parseInt(value); - valid = true; - - } catch (NumberFormatException e) { - valid = false; - } - break; - - case LOGICAL: - valid = value.matches("(?i)true|false|yes|no|1|0"); - break; - - case STRING: - valid = true; - break; - - default: - valid = true; - } - - log.debug("isConfigTechValidValue: valid = {}: unit, data-type, value = '{}', '{}', '{}',", valid, unit, dt, - value); - - return valid; - } - - /** - * Determines the data-type of a parameter unit - * - * @param unit the unit name - * @return data-type name - */ - public String getConfigTechDataType(String name) { - ConfigTechValueType dt = unitList.get(name); - if (dt == null) { - return null; - } else { - return dt.toString(); - } - } - - /** - * Determines if the name is a configuration/technical parameter unit - * - * @param name the unit name in question. - * @return True - unit is a valid technical parameter unit; False - parameter - * name is NOT valid (or tech spec not opened) - * - */ - public boolean isConfigTechUnit(String name) { - if (unitList == null) { - return false; - } - return unitList.containsKey(name); - } - - /** - * Determines if the name is a DEPRECATED configuration/technical parameter unit - * - * @param name the unit name in question. - * @return True - unit is a valid technical parameter unit; False - parameter - * name is NOT valid (or tech spec not opened) - * - */ - public boolean isDeprecatedConfigTechUnit(String name) { - if (unitList_DEP == null) { - return false; - } - return unitList_DEP.containsKey(name); - } - - // ............................................................... - // .....................parseConfigParamFiles..................... - // ...........................................,................... - /** - * Parses the list of configurations parameters of the specification - * - * @return True - file parsed; False - failed to parse file - * @throws IOException indicates file read or permission error - */ - public void parseConfigParamFiles() throws IOException { - log.debug(".....parseConfigParamFiles: start....."); - - // ..pattern to recognize/replace templates - Pattern pTemplate = Pattern.compile("<([^>]+?)>"); - log.debug("template regex: '{}'", pTemplate); - - configParamList = new LinkedHashSet(250); - configParamRegex = new LinkedHashMap>>(250); - - configParamList_DEP = new LinkedHashSet(250); - configParamRegex_DEP = new LinkedHashMap>>(250); - - // ....loop over the active and deprecated entries..... - for (SkosConcept configParamEntry : ArgoNVSReferenceTable.CONFIG_PARAMETER_NAME_TABLE - .getConceptMembersByAltLabelMap().values()) { - if (!configParamEntry.isDeprecated()) { - parseParamName(configParamList, configParamRegex, "NVS R18 table", pTemplate, configParamEntry); - - } else { - // it is a deprecated config param - parseParamName(configParamList_DEP, configParamRegex_DEP, "NVS R18 table", pTemplate, configParamEntry); - - } - } - - log.debug("configParamList: {}", configParamList); - - log.debug(".....parseConfigParamFiles: end....."); - - } // ..end parseConfigParamFiles - - /** - * parse a line from the table 18 (ist of configurations parameters) and add - * results (param name, regex pattern if exists) to the corresponding variable. - * - * @param paramList - * @param paramRegex - * @param nFile - * @param fileName - * @param pTemplate - * @param column - */ - private void parseParamName(LinkedHashSet paramList, - LinkedHashMap>> paramRegex, String tableName, Pattern pTemplate, - SkosConcept paramEntry) { - - // ..need to strip off the unit - String paramCode = paramEntry.getPrefLabel(); - String param = extractParamNameAndUnitFromParamCode(tableName, paramCode)[0]; - String unit = extractParamNameAndUnitFromParamCode(tableName, paramCode)[1]; // not useful of the moment as we - // authorize all units from the - // ref list - // ..process parameter - Matcher matcher = pTemplate.matcher(param); - - if (!matcher.find()) { - // ..no <*> structures -- just a straight fixed name - paramList.add(param); - - log.debug("add param: '{}'", param); - - } else { - // ..contains <*> structures -- convert to a regex - // ..convert CONFIG_CpAscentPhaseDepthZoneSampleRate_hertz - // ..to CONFIG_(?\w*)CpAscentPhaseDepthZone(?\w*)SampleRate_hertz - // .. similar for the other templates - - // ........parse all templates off line........ - // ..capture up to first template - String regexString = convertParamStringToRegex(param, matcher); - - log.debug("add regex: '{}'", regexString); - Pattern pRegex = Pattern.compile(regexString); - - // ..........finished parsing templates.......... - - // ..decide if there are "match lists" to compare to - // ..- core_config_name spec does NOT have any match lines - // ..- bio_config_name spec can have "match lists" - // 02/2026 : no distinction between bio and core when using NVS table - - HashMap> matchList = null; - - // if (nFile == 1 || nFile == 3) { // BIO config name files - // ..bio-config file has matching list in these columns - // String[] templates = { "shortsensorname", "param", "cyclephasename" }; - - // int[] nColumn = { 2, 3, 4, 5 }; // .."0-based" - - matchList = new HashMap>(); - - // get template_values defined in Definition field : - Map paramTemplateValues = NvsDefinitionParser.parseAttributes("Template_Values", - paramEntry.getDefinition()); - - buildTemplatesMatchingListFromNVSParamTemplateValues(matchList, paramTemplateValues); - - if (matchList != null && matchList.size() > 0) { - paramRegex.put(pRegex, matchList); - } else { - paramRegex.put(pRegex, null); - log.debug("matchList: null"); - } - } - } - - // ............................................................ - // .....................parseTechParamFile..................... - // ............................................................ - /** - * Parses the list of technical parameter names of the specification There is a - * provision to detect deprecated units and produce warnings. - * - * @return True - file parsed; False - failed to parse file - * @throws IOException indicates file read or permission error - */ - public void parseTechParamFile() throws IOException { - // =========== - // CK_0093 1/2 - // =========== - log.debug(".....parseTechParamFile: start....."); - - techParamList = new LinkedHashSet(250); - techParamRegex = new LinkedHashMap>>(250); - techParamCodeList = new LinkedHashSet(250); - - techParamList_DEP = new LinkedHashSet(250); - techParamRegex_DEP = new LinkedHashMap>>(250); - techParamCodeList_DEP = new LinkedHashSet(250); - - // ..pattern to recognize/replace templates - Pattern pTemplate = Pattern.compile("<([^>]+?)>"); - - // loop over tech paramaters PrefLabel list: - for (SkosConcept techParamEntry : ArgoNVSReferenceTable.TECHNICAL_PARAMETER_NAME_TABLE - .getConceptMembersByAltLabelMap().values()) { - if (!techParamEntry.isDeprecated()) { - parseParamName(techParamList, techParamRegex, "NVS R14 table", pTemplate, techParamEntry); - // We want full - } else { - // it is a deprecated tech param - - parseParamName(techParamList_DEP, techParamRegex_DEP, "NVS R14 table", pTemplate, techParamEntry); - } - } - log.debug(".....parseTechParamFile: end....."); - - } // ..end parseTechParamFile - - /** - * Returns the complete set of all possible parameter names across all patterns - * in configParamRegex. - * - * @return A Set of all concrete parameter names, deduplicated across all - * patterns. - */ - protected Set getAllPossibleParamNames( - LinkedHashMap>> paramRegex) { - return generateParamListsFromConfigRegex(paramRegex).values().stream().flatMap(List::stream) - .collect(Collectors.toCollection(LinkedHashSet::new)); - } - - /** - * Builds, for each Pattern in configParamRegex, the list of all possible - * parameter names by substituting named groups with their allowed values. - * - * @return A map associating each Pattern to its list of concrete parameter - * names. Patterns with no injectable group values are mapped to an - * empty list. - */ - private Map> generateParamListsFromConfigRegex( - LinkedHashMap>> paramRegex) { - Map> result = new LinkedHashMap<>(); - - for (Map.Entry>> entry : paramRegex.entrySet()) { - Pattern pattern = entry.getKey(); - HashMap> groupValues = entry.getValue(); - - List paramList = generateParamListFromPatternAndValues(pattern.pattern(), groupValues); - result.put(pattern, paramList); - } - - return result; - } - - /** - * Generates all concrete strings from a regex pattern by replacing each named - * group with all its allowed values. - * - * @param pRegex The regex pattern string (e.g. - * "(?...)_(?...)"). - * @param groupValues Map of group name -> set of allowed values for that group. - * @return List of concrete strings, or empty list if no group could be - * substituted. - */ - private List generateParamListFromPatternAndValues(String pRegex, - HashMap> groupValues) { - - if (groupValues == null || groupValues.isEmpty()) { - return new ArrayList<>(); - } - - List regexList = new ArrayList<>(Collections.singletonList(pRegex)); - boolean replacedAtLeastOne = false; - - for (Map.Entry> entry : groupValues.entrySet()) { - String groupName = entry.getKey(); - Set values = entry.getValue(); - - if (values == null || values.isEmpty()) { - continue; - } - - // Match the named group in the regex: (?...) - String namedGroupPattern = "\\(\\?<" + groupName + ">.*?\\)"; - - boolean groupFound = regexList.stream().anyMatch(r -> Pattern.compile(namedGroupPattern).matcher(r).find()); - - if (!groupFound) { - continue; - } - - replacedAtLeastOne = true; - - regexList = regexList.stream().flatMap( - currentRegex -> generateStringsFromPattern(currentRegex, values, namedGroupPattern).stream()) - .collect(Collectors.toList()); - } - - return replacedAtLeastOne ? regexList : new ArrayList<>(); - } - - private void buildTemplatesMatchingListFromNVSParamTemplateValues(HashMap> matchList, - Map configParamTemplateValues) { - - for (Map.Entry entry : configParamTemplateValues.entrySet()) { - String normalizedKey = entry.getKey().replace("_", "");// need to replace short_sensor_name, - // cycle_phase_name by shortsensorname and - // cyclephasename - String value = entry.getValue(); - - String[] templateValues = ArgoFileSpecification - .getValuesListFromParameterAttribute(ArgoFileSpecification.getOrEmptyStringFromValue(value)); - - HashSet set = new HashSet<>(Arrays.asList(templateValues)); - - // "CTD" exception (always authorized for short_sensor_name ???) : - if (normalizedKey.equals("shortsensorname")) { - set.add("CTD"); - } - if (!set.isEmpty() && knownTemplatesWithMatchListToCheck.contains(normalizedKey)) { - matchList.put(normalizedKey, set); - // special case for N and N+1 : N+1 has the "N" key in template values so need - // to replicate the set but with +1 to last value - if (normalizedKey.equals("N")) { - // Create a new set for N1 = N values + (max + 1) - HashSet setN1 = new HashSet<>(set); // copy N set - - int maxN = set.stream().mapToInt(Integer::parseInt).max().orElse(0); - - setN1.add(String.valueOf(maxN + 1)); - matchList.put("N1", setN1); - } - } - - } - } - - public String extractSpecificValueFromPattern(String originalPattern, String actualString, Pattern pRegex, - String placeholderName) { - Map values = extractValuesFromPattern(originalPattern, actualString, pRegex); - return values.get(placeholderName); - } - - /** - * Exctract the value which has been used to replace placeholder <*> in a - * string. return a Map with placeholder name as key and exctrated value as - * value. Example : originalPattern : - * "NUMBER_AscentSamplesDepthZone" actual string : - * "NUMBER_CroverAscentSamplesDepthZone1" => result = ["short_sensor_name" - * :"Crover", "Z" : "1"] - * - * @param template - * @param concreteValue - * @param pRegex - * @return - */ - private Map extractValuesFromPattern(String originalPattern, String concreteValue, Pattern pRegex) { - - Map extractedValues = new HashMap<>(); - - List placeholderNames = extractPlaceholderNames(originalPattern); - - // presence of <*> - Matcher matcher = pRegex.matcher(concreteValue); - - if (matcher.matches()) { - // Associate each captured group to his placeholder name - for (int i = 0; i < placeholderNames.size() && i < matcher.groupCount(); i++) { - String placeholderName = placeholderNames.get(i); - String value = matcher.group(i + 1); // group start at 1 - extractedValues.put(placeholderName, value); - } - } - - return extractedValues; - - } - - private List extractPlaceholderNames(String pattern) { - List names = new ArrayList<>(); - Pattern placeholderPattern = Pattern.compile("<([^>]+)>"); - Matcher matcher = placeholderPattern.matcher(pattern); - - while (matcher.find()) { - names.add(matcher.group(1)); - } - - return names; - } - - private List generateStringsFromPattern(String pRegex, Set values, String regexToReplace) { - if (!Pattern.compile(regexToReplace).matcher(pRegex).find()) { - // Pattern not processed (pattern to replace absent) - return Collections.singletonList(pRegex); // return the original pRegex - - } - return values.stream().map(value -> pRegex.toString().replaceAll(regexToReplace, value)) - .collect(Collectors.toList()); - - } - - /** - * contains <*> structures -- convert to a regex convert - * CONFIG_CpAscentPhaseDepthZoneSampleRate_hertz to - * CONFIG_(?\w*)CpAscentPhaseDepthZone(?\w*)SampleRate_hertz - * - * @param param - * @param matcher - * @return - */ - private String convertParamStringToRegex(String param, Matcher matcher) { - StringBuilder regex = new StringBuilder(); - - // ..capture up to first template - int start = matcher.start(); - if (start > 0) { - regex.append(param.substring(0, matcher.start())); - } - - // ..add first group (already matched) - String repl = templateReplacement.get(matcher.group(1)); - - if (repl == null) { - repl = defaultTemplateReplacement; - } - - regex.append(repl); - - // ..loop over remaining templates - - int end_after = matcher.end(); - - while (matcher.find()) { - start = matcher.start(); - // log.debug("...end_after, start = '{}', '{}'", end_after, start); - - if (end_after < start) { - regex.append(param.substring(end_after, start)); - // log.debug ("...add literal: '{}'", regex); - } - - repl = templateReplacement.get(matcher.group(1)); - if (repl == null) { - repl = defaultTemplateReplacement; - // log.warn("*** DEFAULT TEMPLATE ***"); - } - - regex.append(repl); - // log.debug ("...add template: '{}'", regex); - - end_after = matcher.end(); - } - - // ..patch last bit - - if (end_after < param.length()) { - regex.append(param.substring(end_after)); - // log.debug ("...add ending literal: '{}'", regex); - } - return regex.toString(); - } - - /** - * Parameter code in Table 14a or table 18 contain an example unit at the end of - * string. Example : "PRES_SurfaceOffsetTruncatedPlus5dbar_dbar". This method - * extract the tech param name by stripping off the unit. Example : - * "PRES_SurfaceOffsetTruncatedPlus5dbar" - * - * @param fileName - * @param file - * @param parameterCode - * @return parameterName - * @throws IOException - */ - private String[] extractParamNameAndUnitFromParamCode(String fileName, String parameterCode) - throws IllegalArgumentException { - // ..column[0] is the parameter name and includes an example unit - // ..need to strip off the unit - - int index = parameterCode.lastIndexOf('_'); - - if (index <= 0) { - throw new IllegalArgumentException( - "Technical/Config-Param-File '" + fileName + "': Badly formed name '" + parameterCode + "'"); - } - - // ..well formed named, break it apart - - String parameterName = parameterCode.substring(0, index); - String parameterUnit = parameterCode.substring(index + 1, parameterCode.length()); - String[] results = { parameterName, parameterUnit }; - - return results; - - } - - // ............................................................ - // .....................parseUnitFile..................... - // ............................................................ - /** - * Parses the list of configuration/technical parameter units for the - * specification. There is a provision to detect deprecated units and produce - * warnings. - * - * @return True - file parsed; False - failed to parse file - * @throws IOException indicates file read or permission error - */ - public void parseUnitFile() throws IOException { - log.debug(".....parseConfigTechUnitFile: start....."); - // =========== - // CK_0095 1/2 - // =========== - String[] fileNames = { unitFileName, unitFileName + ".deprecated" }; - LinkedHashMap list; - - // ....loop over the active and deprecated files..... - - for (int n = 0; n < fileNames.length; n++) { - String fileName = fileNames[n]; - - // .......parse the param unit file....... - // ..open the file - - try (InputStream in = SpecIO.getInstance().open(fileName); - BufferedReader fileReader = new BufferedReader( - new InputStreamReader(in, StandardCharsets.UTF_8));) { - - // ..create list variables - // ..open file - - if (n == 0) { - unitList = new LinkedHashMap(100); - list = unitList; - - } else { - unitList_DEP = new LinkedHashMap(25); - list = unitList_DEP; - } - - // .....read through the file.... - log.debug("parsing config/tech unit file '" + fileName + "'"); - - String line; - while ((line = fileReader.readLine()) != null) { - if (pBlankOrComment.matcher(line).matches()) { - log.debug("blank/comment: '{}'", line); - continue; - } - - // .....split the line: col 1 = unit name; col 2 = data type..... - String st[] = line.split("\\|"); - - if (st[0].length() > 0) { - String unit_name = st[0].trim(); - - ConfigTechValueType dt; - - if (st.length > 1) { - dt = ConfigTechValueType.getType(st[1].trim()); - } else { - dt = ConfigTechValueType.UNKNOWN; - } - - log.debug("add unit: '{}' / '{}'", unit_name, dt); - - list.put(st[0].trim(), dt); - } - } - - fileReader.close(); - - } catch (FileNotFoundException e) { - if (n == 0) { - // ..primary file MUST exist - log.error("Config-Tech-Unit-file '{}' does not exist", fileName); - throw e; - } else { - // ..deprecated file MAY NOT exist - log.debug("Deprecated-Config-Tech-Unit-file '{}' does not exist (optional)", fileName); - continue; - } - - } catch (IOException e) { - log.error("Config-Tech-Unit-File '{}' cannot be read", fileName); - throw e; - } - - } - - } // ..end parseUnitFile - -//................................................................... -// INNER CLASSES -//................................................................... - - public class ArgoConfigTechParamMatch { - // ......object variables........ - - public boolean isDeprecated; - public String match; - public int nUnMatchedTemplates; - public HashMap unMatchedTemplates; - public int nFailedMatchedTemplates; - public HashMap failedMatchedTemplates; - - // ........constructors.......... - - public ArgoConfigTechParamMatch(String match, boolean isDeprecated) { - this.match = new String(match); - this.isDeprecated = isDeprecated; - this.nUnMatchedTemplates = 0; - this.unMatchedTemplates = null; - this.nFailedMatchedTemplates = 0; - this.failedMatchedTemplates = null; - } - - public ArgoConfigTechParamMatch(String match, boolean isDeprecated, int nUnMatchedTemplates, - HashMap unMatchedTemplates, int nFailedMatchedTemplates, - HashMap failedMatchedTemplates) { - this.match = new String(match); - this.isDeprecated = isDeprecated; - this.nUnMatchedTemplates = nUnMatchedTemplates; - this.unMatchedTemplates = unMatchedTemplates; - this.nFailedMatchedTemplates = nFailedMatchedTemplates; - this.failedMatchedTemplates = failedMatchedTemplates; - } - } - -} // ..end class +package fr.coriolis.checker.specs; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import fr.coriolis.checker.tables.ArgoNVSReferenceTable; +import fr.coriolis.checker.tables.SkosConcept; +import fr.coriolis.checker.utils.NvsDefinitionParser; + +/** + * Implements features to check the Meta-data CONFIG_PARAMETER_NAME (including + * LAUNCH_...) and TECHNICAL_PARAMETER_NAME. This includes the units + * allowed for both. + * + * @author Mark Ignaszewski + * @version $HeadURL: + * https://inversion.nrlmry.navy.mil/svn/godae/trunk/argo/bin/java/usgdac/ArgoConfigTechParam.java + * $ + * @version $Id: ArgoConfigTechParam.java 1257 2021-04-26 14:09:25Z ignaszewski + * $ + */ +public class ArgoConfigTechParam { +//............................................ +// VARIABLES +//............................................ + + // ..........Class variables.............. + + public static enum ConfigTechValueType { + DATE_TIME("date/time"), FLOAT("float"), HEX("hex"), INTEGER("integer"), LOGICAL("logical"), STRING("string"), + UNKNOWN("unknown"); + + public final String name; + + ConfigTechValueType(String d) { + name = d; + } + + public static ConfigTechValueType getType(String name) { + for (ConfigTechValueType c : ConfigTechValueType.values()) { + if (name.equals(c.name)) { + return c; + } + } + return ConfigTechValueType.UNKNOWN; + } + + @Override + public String toString() { + return name; + } + }; + + // ......define and initialize the template replacement patterns...... + + static final String defaultTemplateReplacement; + static final Map templateReplacement; + static final Set knownTemplates; + static final Set knownTemplatesWithMatchListToCheck; + static { + defaultTemplateReplacement = "(?\\w+)"; + + Map temp = new HashMap(10); + // ..config templates (alphabetical order) + temp.put("D", "(?\\d+?)"); + temp.put("cycle_phase_name", "(?[A-Z][a-z]+(?:[A-Z][a-z]+)*?Phase)"); + temp.put("I", "(?\\d+?)"); + temp.put("N", "(?\\d+?)"); + temp.put("N+1", "(?\\d+?)"); + temp.put("param", "(?[A-Z][a-z]+(?:[A-Z][a-z]+)??)"); + temp.put("PARAM", "(?[A-Z]+?)"); + temp.put("S", "(?\\d+?)"); + temp.put("SubS", "(?\\d+?)"); + temp.put("short_sensor_name", "(?[A-Z][a-z]+?|CTD)"); + // ..tech templates (alphabetical order) + temp.put("digit", "(?\\d)"); + temp.put("int", "(?\\d+?)"); + // ..already defined above + temp.put("Z", "(?\\d+?)"); + templateReplacement = Collections.unmodifiableMap(temp); + + knownTemplates = new HashSet<>(Arrays.asList("D", "horizontalphasename", "I", "N", "N1", "param", "PARAM", "S", + "SubS", "shortsensorname", "verticalphasename", "cyclephasename", "digit", "int", "Z")); + knownTemplatesWithMatchListToCheck = new HashSet<>(Arrays.asList("horizontalphasename", "N", "N1", "digit", + "param", "PARAM", "shortsensorname", "verticalphasename", "cyclephasename")); + + } + // ......define and initialize the pattern matcher objects...... + static Pattern pBlankOrComment; // ..match a blank line or a comment line + static Pattern pComment; // ..comment + + static { + // ..match a blank line (or a line with just comments) + pBlankOrComment = Pattern.compile("^\\s*(?://.*)*"); + + // ..match a comment (any where on the line) - recognize the "//@" comments + // ..group 1: the word following "@"; group 2: the setting + pComment = Pattern.compile("//(?:@\\s*(\\w+)\\s*=\\s*\"(.+)\")?.*$"); + } + + // .....object variables...... + + private String unitFileName; + private String version; + + private LinkedHashSet configParamList; // ..config param fixed names + private LinkedHashSet configParamList_DEP; // ..config param fixed names (deprctd) + // private LinkedHashSet configParamRegex; //..config param variable + // names + // private LinkedHashSet configParamRegex_DEP; //..config param + // variable names + private LinkedHashMap>> configParamRegex; // ..config param variable names + private LinkedHashMap>> configParamRegex_DEP; // ..config param variable + // names + + private LinkedHashSet techParamList; // ..tech param fixed names + private LinkedHashSet techParamCodeList; // ..full tech param names -with unit- : reference table 14a + + private LinkedHashSet techParamList_DEP; // ..tech param fixed names (deprctd) + private LinkedHashSet techParamCodeList_DEP; + + // The following map is needed to check TECH time series variable (same variable + // name but different units and long_name posssible) : + private Map> paramAuthorizedUnits = new HashMap<>(); + private Map> paramAuthorizedLongName = new HashMap<>(); + + // private LinkedHashSet techParamRegex; //..tech param regex names + // private LinkedHashSet techParamRegex_DEP; //..tech param regex names + // (deprctd) + private LinkedHashMap>> techParamRegex; // ..config param variable names + private LinkedHashMap>> techParamRegex_DEP; // ..config param variable + // names + + private LinkedHashMap unitList; // ..config/tech units and type + private LinkedHashMap unitList_DEP; // ..config/tech units - deprecated + + // ..logger + private static final Logger log = LogManager.getLogger("ArgoConfigTechParam"); + +//............................................ +// CONSTRUCTORS +//............................................ + + /** + * Reads the CONFIGURATION_PARAMETER and TECHNICAL_PARAMETER specification + * files.
+ * The files must be in specDir and are named + * argo-config_names-spec-v<version> and + * "argo-tech_names-spec-v<version> + * + * @param specDir Path to the specification file directory + * @param version Argo netCDF file version + * @param initConfig true: Read CONFIGURATION_PARAMETER specification file + * @param initTech true: Read TECHNICAL_PARAMETER specification file + * @throws IOException File I/O errors + */ + + public ArgoConfigTechParam(String version, boolean initConfig, boolean initTech) throws IOException { + log.debug("...ArgoConfigTechParam: start..."); + + this.version = version.trim(); + String prefix = "argo-"; + + unitFileName = prefix + "tech_units-spec-v" + this.version; + + if (initConfig) { + parseConfigParamFiles(); + } + if (initTech) { + parseTechParamFile(); + } + + parseUnitFile(); + + if (log.isDebugEnabled()) { + if (configParamList == null) { + log.debug("configParamList size = null"); + } else { + log.debug("configParamList size = {}", configParamList.size()); + } + if (configParamList_DEP == null) { + log.debug("configParamList_DEP size = null"); + } else { + log.debug("configParamList_DEP size = {}", configParamList_DEP.size()); + } + if (techParamList == null) { + log.debug("techParamList size = null"); + } else { + log.debug("techParamList size = {}", techParamList.size()); + } + if (techParamList_DEP == null) { + log.debug("techParamList_DEP size = null"); + } else { + log.debug("techParamList_DEP size = {}", techParamList_DEP.size()); + } + log.debug("...ArgoConfigTechParam: end..."); + } + } + +//............................................ +// METHODS +//............................................ + + /** + * Determines if the name is matched by a REGEX in the set + * + * @param name The parameter name in question. + * @param regexSet The set of REGEXPs to check + * @return An ArgoConfigTechParamMatch containing full information about the + * match (null = NO MATCH) + */ + private ArgoConfigTechParamMatch checkRegex(String name, + HashMap>> regexSet) { + ArgoConfigTechParamMatch match = null; // ..return object + HashMap unMatchedTemplates = null; // ..return templates + HashMap failedMatchedTemplates = null; // ..return templates + + // ..NOTE..NOTE..NOTE.. + // ..Should be able to truncate the loop below on the first match + // ..ie, find a match -> return + // ..However, during development I *really* want to know if there are + // ..multiple matches - which indicates ambiguous regex patterns + // ..So, FOR NOW, complete the looping and report multiple matches + // ..Returns the LAST one matched + + int imatch=0; + + for (Map.Entry>> entry : regexSet.entrySet()) { + Pattern pattern = entry.getKey(); + HashMap> value = entry.getValue(); + + Matcher m = pattern.matcher(name); + log.debug("checkRegex: enter for loop for '{}' for pattern '{}'",name,pattern.toString()); + + if (m.matches()) { + imatch=imatch+1; + unMatchedTemplates = new HashMap(m.groupCount()); + failedMatchedTemplates = new HashMap(m.groupCount()); + + for (String key : knownTemplates) { + try { + String str = m.group(key); + + // ..is there a "match-list" for this (regex param and template) + + if (value != null) { + HashSet matchSet = value.get(key); + + if (matchSet == null) { + // ..there was no match-list to compare to + unMatchedTemplates.put(key, str); + + } else { + // ..there is a match-list - compare it + + if (!matchSet.contains(str)) { + failedMatchedTemplates.put(key, str); + log.debug("checkRegex: match-list failed: key '{}', matched '{}'", key, str); + + } else if (log.isDebugEnabled()) { + log.debug("checkRegex: match-list success: key '{}', matched '{}'", key, str); + } + } + } else { + unMatchedTemplates.put(key, str); + } + + } catch (IllegalArgumentException e) { + } + } + log.debug("checkRegex: exit for loop"); + + match = new ArgoConfigTechParamMatch(pattern.toString(), false, unMatchedTemplates.size(), + unMatchedTemplates, failedMatchedTemplates.size(), failedMatchedTemplates); + + log.debug("checkRegexMatch: '{}' regex match #{}: '{}', unMatchedTemplates: {}, failedMatchedTemplates: {}", + name,imatch,pattern.toString(),unMatchedTemplates.size(), failedMatchedTemplates.size()); + + // Exit the loop as soon as a valid match is found: + if (failedMatchedTemplates.size()==0 && unMatchedTemplates.size()==0) { + break; + } + + + // ****temporary**** return match; + } + + } + + return match; + } // ..checkRegex + + /** + * Determines if the name is a CONFIG parameter name + * + * @param name the parameter name in question. + * @return An ArgoConfigTechParamMatch containing full information about the + * match (null = NO MATCH) + * + */ + public ArgoConfigTechParamMatch findConfigParam(String name) { + ArgoConfigTechParamMatch match = findParam(name, configParamList, configParamRegex, configParamList_DEP, + configParamRegex_DEP); + return match; + } + + /** + * Determines if the name is a Tech parameter name + * + * @param name the parameter name in question. + * @return An ArgoConfigTechParamMatch containing full information about the + * match (null = NO MATCH) + * + */ + public ArgoConfigTechParamMatch findTechParam(String name) { + ArgoConfigTechParamMatch match = findParam(name, techParamList, techParamRegex, techParamList_DEP, + techParamRegex_DEP); + return match; + } + + /** + * Determines if the name is a valid parameter name within the supplied lists + * + * @param name the parameter name in question. + * @return An ArgoConfigTechParamMatch containing full information about the + * match (null = NO MATCH) + * + */ + private ArgoConfigTechParamMatch findParam(String name, HashSet activeList, + HashMap>> activeRegex, HashSet deprecatedList, + HashMap>> deprecatedRegex) { + boolean literal = false; + HashMap templates = null; + ArgoConfigTechParamMatch match = null; + + if (activeList != null) { + if (activeList.contains(name)) { + match = new ArgoConfigTechParamMatch(name, false); + + log.debug("findParam: '{}': active literal match", name); + return match; + } + } + + // ..did NOT match one of the literal strings + // ..check for a regex match + + if (activeRegex != null) { + // log.debug("findParam: checking active regex"); + + match = checkRegex(name, activeRegex); + + if (match != null) { + match.isDeprecated = false; + log.debug("findParam: '{}': active regex match '{}'", name, match.match); + return match; + } + } + + if (deprecatedList != null) { + if (deprecatedList.contains(name)) { + match = new ArgoConfigTechParamMatch(name, true); + + log.debug("findParam: '{}': deprecated literal match", name); + return match; + } + } + + if (deprecatedRegex != null) { + // log.debug("findParam: checking active regex"); + + match = checkRegex(name, deprecatedRegex); + + if (match != null) { + match.isDeprecated = true; + log.debug("findParam: '{}': deprecated regex match '{}'", name, match.match); + return match; + } + } + + log.debug("findParam: '{}': failed match", name); + return null; + } + + /** + * Return the TechParam list defined in spec files (argo-tech_names-spec-v*) + * + * @return + */ + public LinkedHashSet getTechParamList() { + return techParamList; + } + + public LinkedHashSet getTechCodeList() { + return techParamCodeList; + } + + public Map> getParamAuthorizedUnits() { + return paramAuthorizedUnits; + } + + public Map> getParamAuthorizedLongName() { + return paramAuthorizedLongName; + } + + /** + * Return the TechParam list containing a regex defined in spec files + * (argo-tech_names-spec-v*) + * + * @return + */ + public LinkedHashMap>> getTechParamRegex() { + return techParamRegex; + } + + /** + * Determines if the value is valid for the unit (mapped to data-type) + * + * @param unit the unit name + * @param value the config value + * @return True - value is a valid setting for the given unit (or unit is + * unknown) False - parameter name is NOT valid (or tech spec not + * opened) + * + */ + public boolean isConfigTechValidValue(String unit, String value) { + // ..turn the unit name into a data type + ConfigTechValueType dt = unitList.get(unit); + + if (dt == null || dt == ConfigTechValueType.UNKNOWN) { + // ..unit name is unknown OR the data type for this unit is unkown + // ..can't check the value setting + // ..so blindly return "it's good" (???) + log.debug("isConfigTechValidValue: default to true: unit, data-type, value = '{}', '{}', '{}'", unit, dt, + value); + + return true; + } + + boolean valid = false; + switch (dt) { + case DATE_TIME: + valid = ArgoDate.checkArgoDatePattern(unit, value); + break; + + case FLOAT: + try { + double n = Double.parseDouble(value); + valid = true; + + } catch (NumberFormatException e) { + valid = false; + } + break; + + case HEX: + valid = value.matches("(?i)(0x)?[0-9a-f]+"); + break; + + case INTEGER: + try { + int n = Integer.parseInt(value); + valid = true; + + } catch (NumberFormatException e) { + valid = false; + } + break; + + case LOGICAL: + valid = value.matches("(?i)true|false|yes|no|1|0"); + break; + + case STRING: + valid = true; + break; + + default: + valid = true; + } + + log.debug("isConfigTechValidValue: valid = {}: unit, data-type, value = '{}', '{}', '{}',", valid, unit, dt, + value); + + return valid; + } + + /** + * Determines the data-type of a parameter unit + * + * @param unit the unit name + * @return data-type name + */ + public String getConfigTechDataType(String name) { + ConfigTechValueType dt = unitList.get(name); + if (dt == null) { + return null; + } else { + return dt.toString(); + } + } + + /** + * Determines if the name is a configuration/technical parameter unit + * + * @param name the unit name in question. + * @return True - unit is a valid technical parameter unit; False - parameter + * name is NOT valid (or tech spec not opened) + * + */ + public boolean isConfigTechUnit(String name) { + if (unitList == null) { + return false; + } + return unitList.containsKey(name); + } + + /** + * Determines if the name is a DEPRECATED configuration/technical parameter unit + * + * @param name the unit name in question. + * @return True - unit is a valid technical parameter unit; False - parameter + * name is NOT valid (or tech spec not opened) + * + */ + public boolean isDeprecatedConfigTechUnit(String name) { + if (unitList_DEP == null) { + return false; + } + return unitList_DEP.containsKey(name); + } + + // ............................................................... + // .....................parseConfigParamFiles..................... + // ...........................................,................... + /** + * Parses the list of configurations parameters of the specification + * + * @return True - file parsed; False - failed to parse file + * @throws IOException indicates file read or permission error + */ + public void parseConfigParamFiles() throws IOException { + log.debug(".....parseConfigParamFiles: start....."); + + // ..pattern to recognize/replace templates + Pattern pTemplate = Pattern.compile("<([^>]+?)>"); + log.debug("template regex: '{}'", pTemplate); + + configParamList = new LinkedHashSet(250); + configParamRegex = new LinkedHashMap>>(250); + + configParamList_DEP = new LinkedHashSet(250); + configParamRegex_DEP = new LinkedHashMap>>(250); + + // ....loop over the active and deprecated entries..... + for (SkosConcept configParamEntry : ArgoNVSReferenceTable.CONFIG_PARAMETER_NAME_TABLE + .getConceptMembersByAltLabelMap().values()) { + if (!configParamEntry.isDeprecated()) { + parseParamName(configParamList, configParamRegex, "NVS R18 table", pTemplate, configParamEntry); + + } else { + // it is a deprecated config param + parseParamName(configParamList_DEP, configParamRegex_DEP, "NVS R18 table", pTemplate, configParamEntry); + + } + } + + log.debug("configParamList: {}", configParamList); + + log.debug(".....parseConfigParamFiles: end....."); + + } // ..end parseConfigParamFiles + + /** + * parse a line from the table 18 (ist of configurations parameters) and add + * results (param name, regex pattern if exists) to the corresponding variable. + * + * @param paramList + * @param paramRegex + * @param nFile + * @param fileName + * @param pTemplate + * @param column + */ + private void parseParamName(LinkedHashSet paramList, + LinkedHashMap>> paramRegex, String tableName, Pattern pTemplate, + SkosConcept paramEntry) { + + // ..need to strip off the unit + String paramCode = paramEntry.getPrefLabel(); + String param = extractParamNameAndUnitFromParamCode(tableName, paramCode)[0]; + String unit = extractParamNameAndUnitFromParamCode(tableName, paramCode)[1]; // not useful of the moment as we + // authorize all units from the + // ref list + // ..process parameter + Matcher matcher = pTemplate.matcher(param); + + if (!matcher.find()) { + // ..no <*> structures -- just a straight fixed name + paramList.add(param); + + log.debug("add param: '{}'", param); + + } else { + // ..contains <*> structures -- convert to a regex + // ..convert CONFIG_CpAscentPhaseDepthZoneSampleRate_hertz + // ..to CONFIG_(?\w*)CpAscentPhaseDepthZone(?\w*)SampleRate_hertz + // .. similar for the other templates + + // ........parse all templates off line........ + // ..capture up to first template + String regexString = convertParamStringToRegex(param, matcher); + + log.debug("add regex: '{}'", regexString); + Pattern pRegex = Pattern.compile(regexString); + + // ..........finished parsing templates.......... + + // ..decide if there are "match lists" to compare to + // ..- core_config_name spec does NOT have any match lines + // ..- bio_config_name spec can have "match lists" + // 02/2026 : no distinction between bio and core when using NVS table + + HashMap> matchList = null; + + // if (nFile == 1 || nFile == 3) { // BIO config name files + // ..bio-config file has matching list in these columns + // String[] templates = { "shortsensorname", "param", "cyclephasename" }; + + // int[] nColumn = { 2, 3, 4, 5 }; // .."0-based" + + matchList = new HashMap>(); + + // get template_values defined in Definition field : + Map paramTemplateValues = NvsDefinitionParser.parseAttributes("Template_Values", + paramEntry.getDefinition()); + + buildTemplatesMatchingListFromNVSParamTemplateValues(matchList, paramTemplateValues); + + if (matchList != null && matchList.size() > 0) { + paramRegex.put(pRegex, matchList); + } else { + paramRegex.put(pRegex, null); + log.debug("matchList: null"); + } + } + } + + // ............................................................ + // .....................parseTechParamFile..................... + // ............................................................ + /** + * Parses the list of technical parameter names of the specification There is a + * provision to detect deprecated units and produce warnings. + * + * @return True - file parsed; False - failed to parse file + * @throws IOException indicates file read or permission error + */ + public void parseTechParamFile() throws IOException { + // =========== + // CK_0093 1/2 + // =========== + log.debug(".....parseTechParamFile: start....."); + + techParamList = new LinkedHashSet(250); + techParamRegex = new LinkedHashMap>>(250); + techParamCodeList = new LinkedHashSet(250); + + techParamList_DEP = new LinkedHashSet(250); + techParamRegex_DEP = new LinkedHashMap>>(250); + techParamCodeList_DEP = new LinkedHashSet(250); + + // ..pattern to recognize/replace templates + Pattern pTemplate = Pattern.compile("<([^>]+?)>"); + + // loop over tech paramaters PrefLabel list: + for (SkosConcept techParamEntry : ArgoNVSReferenceTable.TECHNICAL_PARAMETER_NAME_TABLE + .getConceptMembersByAltLabelMap().values()) { + if (!techParamEntry.isDeprecated()) { + parseParamName(techParamList, techParamRegex, "NVS R14 table", pTemplate, techParamEntry); + // We want full + } else { + // it is a deprecated tech param + + parseParamName(techParamList_DEP, techParamRegex_DEP, "NVS R14 table", pTemplate, techParamEntry); + } + } + log.debug(".....parseTechParamFile: end....."); + + } // ..end parseTechParamFile + + /** + * Returns the complete set of all possible parameter names across all patterns + * in configParamRegex. + * + * @return A Set of all concrete parameter names, deduplicated across all + * patterns. + */ + protected Set getAllPossibleParamNames( + LinkedHashMap>> paramRegex) { + return generateParamListsFromConfigRegex(paramRegex).values().stream().flatMap(List::stream) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } + + /** + * Builds, for each Pattern in configParamRegex, the list of all possible + * parameter names by substituting named groups with their allowed values. + * + * @return A map associating each Pattern to its list of concrete parameter + * names. Patterns with no injectable group values are mapped to an + * empty list. + */ + private Map> generateParamListsFromConfigRegex( + LinkedHashMap>> paramRegex) { + Map> result = new LinkedHashMap<>(); + + for (Map.Entry>> entry : paramRegex.entrySet()) { + Pattern pattern = entry.getKey(); + HashMap> groupValues = entry.getValue(); + + List paramList = generateParamListFromPatternAndValues(pattern.pattern(), groupValues); + result.put(pattern, paramList); + } + + return result; + } + + /** + * Generates all concrete strings from a regex pattern by replacing each named + * group with all its allowed values. + * + * @param pRegex The regex pattern string (e.g. + * "(?...)_(?...)"). + * @param groupValues Map of group name -> set of allowed values for that group. + * @return List of concrete strings, or empty list if no group could be + * substituted. + */ + private List generateParamListFromPatternAndValues(String pRegex, + HashMap> groupValues) { + + if (groupValues == null || groupValues.isEmpty()) { + return new ArrayList<>(); + } + + List regexList = new ArrayList<>(Collections.singletonList(pRegex)); + boolean replacedAtLeastOne = false; + + for (Map.Entry> entry : groupValues.entrySet()) { + String groupName = entry.getKey(); + Set values = entry.getValue(); + + if (values == null || values.isEmpty()) { + continue; + } + + // Match the named group in the regex: (?...) + String namedGroupPattern = "\\(\\?<" + groupName + ">.*?\\)"; + + boolean groupFound = regexList.stream().anyMatch(r -> Pattern.compile(namedGroupPattern).matcher(r).find()); + + if (!groupFound) { + continue; + } + + replacedAtLeastOne = true; + + regexList = regexList.stream().flatMap( + currentRegex -> generateStringsFromPattern(currentRegex, values, namedGroupPattern).stream()) + .collect(Collectors.toList()); + } + + return replacedAtLeastOne ? regexList : new ArrayList<>(); + } + + private void buildTemplatesMatchingListFromNVSParamTemplateValues(HashMap> matchList, + Map configParamTemplateValues) { + + for (Map.Entry entry : configParamTemplateValues.entrySet()) { + String normalizedKey = entry.getKey().replace("_", "");// need to replace short_sensor_name, + // cycle_phase_name by shortsensorname and + // cyclephasename + String value = entry.getValue(); + + String[] templateValues = ArgoFileSpecification + .getValuesListFromParameterAttribute(ArgoFileSpecification.getOrEmptyStringFromValue(value)); + + HashSet set = new HashSet<>(Arrays.asList(templateValues)); + + // "CTD" exception (always authorized for short_sensor_name ???) : + if (normalizedKey.equals("shortsensorname")) { + set.add("CTD"); + } + if (!set.isEmpty() && knownTemplatesWithMatchListToCheck.contains(normalizedKey)) { + matchList.put(normalizedKey, set); + // special case for N and N+1 : N+1 has the "N" key in template values so need + // to replicate the set but with +1 to last value + if (normalizedKey.equals("N")) { + // Create a new set for N1 = N values + (max + 1) + HashSet setN1 = new HashSet<>(set); // copy N set + + int maxN = set.stream().mapToInt(Integer::parseInt).max().orElse(0); + + setN1.add(String.valueOf(maxN + 1)); + matchList.put("N1", setN1); + } + } + + } + } + + public String extractSpecificValueFromPattern(String originalPattern, String actualString, Pattern pRegex, + String placeholderName) { + Map values = extractValuesFromPattern(originalPattern, actualString, pRegex); + return values.get(placeholderName); + } + + /** + * Exctract the value which has been used to replace placeholder <*> in a + * string. return a Map with placeholder name as key and exctrated value as + * value. Example : originalPattern : + * "NUMBER_AscentSamplesDepthZone" actual string : + * "NUMBER_CroverAscentSamplesDepthZone1" => result = ["short_sensor_name" + * :"Crover", "Z" : "1"] + * + * @param template + * @param concreteValue + * @param pRegex + * @return + */ + private Map extractValuesFromPattern(String originalPattern, String concreteValue, Pattern pRegex) { + + Map extractedValues = new HashMap<>(); + + List placeholderNames = extractPlaceholderNames(originalPattern); + + // presence of <*> + Matcher matcher = pRegex.matcher(concreteValue); + + if (matcher.matches()) { + // Associate each captured group to his placeholder name + for (int i = 0; i < placeholderNames.size() && i < matcher.groupCount(); i++) { + String placeholderName = placeholderNames.get(i); + String value = matcher.group(i + 1); // group start at 1 + extractedValues.put(placeholderName, value); + } + } + + return extractedValues; + + } + + private List extractPlaceholderNames(String pattern) { + List names = new ArrayList<>(); + Pattern placeholderPattern = Pattern.compile("<([^>]+)>"); + Matcher matcher = placeholderPattern.matcher(pattern); + + while (matcher.find()) { + names.add(matcher.group(1)); + } + + return names; + } + + private List generateStringsFromPattern(String pRegex, Set values, String regexToReplace) { + if (!Pattern.compile(regexToReplace).matcher(pRegex).find()) { + // Pattern not processed (pattern to replace absent) + return Collections.singletonList(pRegex); // return the original pRegex + + } + return values.stream().map(value -> pRegex.toString().replaceAll(regexToReplace, value)) + .collect(Collectors.toList()); + + } + + /** + * contains <*> structures -- convert to a regex convert + * CONFIG_CpAscentPhaseDepthZoneSampleRate_hertz to + * CONFIG_(?\w*)CpAscentPhaseDepthZone(?\w*)SampleRate_hertz + * + * @param param + * @param matcher + * @return + */ + private String convertParamStringToRegex(String param, Matcher matcher) { + StringBuilder regex = new StringBuilder(); + + // ..capture up to first template + int start = matcher.start(); + if (start > 0) { + regex.append(param.substring(0, matcher.start())); + } + + // ..add first group (already matched) + String repl = templateReplacement.get(matcher.group(1)); + + if (repl == null) { + repl = defaultTemplateReplacement; + } + + regex.append(repl); + + // ..loop over remaining templates + + int end_after = matcher.end(); + + while (matcher.find()) { + start = matcher.start(); + // log.debug("...end_after, start = '{}', '{}'", end_after, start); + + if (end_after < start) { + regex.append(param.substring(end_after, start)); + // log.debug ("...add literal: '{}'", regex); + } + + repl = templateReplacement.get(matcher.group(1)); + if (repl == null) { + repl = defaultTemplateReplacement; + // log.warn("*** DEFAULT TEMPLATE ***"); + } + + regex.append(repl); + // log.debug ("...add template: '{}'", regex); + + end_after = matcher.end(); + } + + // ..patch last bit + + if (end_after < param.length()) { + regex.append(param.substring(end_after)); + // log.debug ("...add ending literal: '{}'", regex); + } + return regex.toString(); + } + + /** + * Parameter code in Table 14a or table 18 contain an example unit at the end of + * string. Example : "PRES_SurfaceOffsetTruncatedPlus5dbar_dbar". This method + * extract the tech param name by stripping off the unit. Example : + * "PRES_SurfaceOffsetTruncatedPlus5dbar" + * + * @param fileName + * @param file + * @param parameterCode + * @return parameterName + * @throws IOException + */ + private String[] extractParamNameAndUnitFromParamCode(String fileName, String parameterCode) + throws IllegalArgumentException { + // ..column[0] is the parameter name and includes an example unit + // ..need to strip off the unit + + int index = parameterCode.lastIndexOf('_'); + + if (index <= 0) { + throw new IllegalArgumentException( + "Technical/Config-Param-File '" + fileName + "': Badly formed name '" + parameterCode + "'"); + } + + // ..well formed named, break it apart + + String parameterName = parameterCode.substring(0, index); + String parameterUnit = parameterCode.substring(index + 1, parameterCode.length()); + String[] results = { parameterName, parameterUnit }; + + return results; + + } + + // ............................................................ + // .....................parseUnitFile..................... + // ............................................................ + /** + * Parses the list of configuration/technical parameter units for the + * specification. There is a provision to detect deprecated units and produce + * warnings. + * + * @return True - file parsed; False - failed to parse file + * @throws IOException indicates file read or permission error + */ + public void parseUnitFile() throws IOException { + log.debug(".....parseConfigTechUnitFile: start....."); + // =========== + // CK_0095 1/2 + // =========== + String[] fileNames = { unitFileName, unitFileName + ".deprecated" }; + LinkedHashMap list; + + // ....loop over the active and deprecated files..... + + for (int n = 0; n < fileNames.length; n++) { + String fileName = fileNames[n]; + + // .......parse the param unit file....... + // ..open the file + + try (InputStream in = SpecIO.getInstance().open(fileName); + BufferedReader fileReader = new BufferedReader( + new InputStreamReader(in, StandardCharsets.UTF_8));) { + + // ..create list variables + // ..open file + + if (n == 0) { + unitList = new LinkedHashMap(100); + list = unitList; + + } else { + unitList_DEP = new LinkedHashMap(25); + list = unitList_DEP; + } + + // .....read through the file.... + log.debug("parsing config/tech unit file '" + fileName + "'"); + + String line; + while ((line = fileReader.readLine()) != null) { + if (pBlankOrComment.matcher(line).matches()) { + log.debug("blank/comment: '{}'", line); + continue; + } + + // .....split the line: col 1 = unit name; col 2 = data type..... + String st[] = line.split("\\|"); + + if (st[0].length() > 0) { + String unit_name = st[0].trim(); + + ConfigTechValueType dt; + + if (st.length > 1) { + dt = ConfigTechValueType.getType(st[1].trim()); + } else { + dt = ConfigTechValueType.UNKNOWN; + } + + log.debug("add unit: '{}' / '{}'", unit_name, dt); + + list.put(st[0].trim(), dt); + } + } + + fileReader.close(); + + } catch (FileNotFoundException e) { + if (n == 0) { + // ..primary file MUST exist + log.error("Config-Tech-Unit-file '{}' does not exist", fileName); + throw e; + } else { + // ..deprecated file MAY NOT exist + log.debug("Deprecated-Config-Tech-Unit-file '{}' does not exist (optional)", fileName); + continue; + } + + } catch (IOException e) { + log.error("Config-Tech-Unit-File '{}' cannot be read", fileName); + throw e; + } + + } + + } // ..end parseUnitFile + +//................................................................... +// INNER CLASSES +//................................................................... + + public class ArgoConfigTechParamMatch { + // ......object variables........ + + public boolean isDeprecated; + public String match; + public int nUnMatchedTemplates; + public HashMap unMatchedTemplates; + public int nFailedMatchedTemplates; + public HashMap failedMatchedTemplates; + + // ........constructors.......... + + public ArgoConfigTechParamMatch(String match, boolean isDeprecated) { + this.match = new String(match); + this.isDeprecated = isDeprecated; + this.nUnMatchedTemplates = 0; + this.unMatchedTemplates = null; + this.nFailedMatchedTemplates = 0; + this.failedMatchedTemplates = null; + } + + public ArgoConfigTechParamMatch(String match, boolean isDeprecated, int nUnMatchedTemplates, + HashMap unMatchedTemplates, int nFailedMatchedTemplates, + HashMap failedMatchedTemplates) { + this.match = new String(match); + this.isDeprecated = isDeprecated; + this.nUnMatchedTemplates = nUnMatchedTemplates; + this.unMatchedTemplates = unMatchedTemplates; + this.nFailedMatchedTemplates = nFailedMatchedTemplates; + this.failedMatchedTemplates = failedMatchedTemplates; + } + } + +} // ..end class 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 914d336..050f956 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 @@ -262,16 +262,19 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R01/current/METAAUX/", - "pav:authoredOn": "2024-09-11 11:40:41.0", - "pav:hasCurrentVersion": { + "pav:hasVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R01/current/METAAUX/1/" }, + "pav:authoredOn": "2026-04-29 13:04:08.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R01/current/METAAUX/2/" + }, "dce:identifier": "SDN:R01::METAAUX", - "pav:version": "1", + "pav:version": "2", "skos:notation": "SDN:R01::METAAUX", "skos:altLabel": "METAAUX", - "dc:date": "2024-09-11 11:40:41.0", - "owl:versionInfo": "1", + "dc:date": "2026-04-29 13:04:08.0", + "owl:versionInfo": "2", "skos:prefLabel": { "@language": "en", "@value": "Argo auxiliary meta-data" @@ -361,8 +364,8 @@ "dc:description": "Terms describing the type of data contained in an Argo netCDF file. Argo netCDF variable DATA_TYPE is populated by R01 prefLabel.", "dc:title": "Argo data type", "skos:prefLabel": "Argo data type", - "owl:versionInfo": "4", - "dc:date": "2024-09-13 03:00:00.0", + "owl:versionInfo": "5", + "dc:date": "2026-04-30 03:00:00.0", "skos:altLabel": "DATA_TYPE", "dc:creator": "Argo Data Management Team", "dc:alternative": "DATA_TYPE", diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R03.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R03.jsonld index f6aaaf0..4ecdeec 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R03.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R03.jsonld @@ -39,6 +39,37 @@ }, "pav:authoredOn": "2025-11-26 10:16:04.0" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE665/", + "pav:authoredOn": "2026-06-11 09:21:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE665/1/" + }, + "dce:identifier": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE665", + "pav:version": "1", + "skos:notation": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE665", + "skos:altLabel": "RAW_DOWNWELLING_IRRADIANCE665", + "dc:date": "2026-06-11 09:21:52.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Raw downwelling irradiance at 665 nanometers" + }, + "dc:identifier": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE665", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": { + "@language": "en", + "@value": "Raw downwelling irradiance signal at 665 nm wavelength. Local_Attributes:{long_name:Raw downwelling irradiance at 665 nanometers; standard_name:-; units:count; valid_min:-; valid_max:-; fill_value:NC_FILL_DOUBLE}. Properties:{category:ib; data_type:double}" + }, + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_OCR/", "pav:hasVersion": [ @@ -156,45 +187,6 @@ }, "pav:authoredOn": "2025-11-26 10:16:04.0" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/", - "pav:hasVersion": [ - { - "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/1/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/2/" - } - ], - "@type": "skos:Concept", - "skos:definition": { - "@language": "en", - "@value": "Not Used. Number of samples in each pressure bin. Local_Attributes:{long_name:Number of samples in each pressure bin; standard_name:-; units:count; valid_min:-; valid_max:-; fill_value:NC_FILL_SHORT}. Properties:{category:ic; data_type:short}." - }, - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "owl:deprecated": "true", - "skos:note": { - "@language": "en", - "@value": "deprecated" - }, - "dc:identifier": "SDN:R03::NB_SAMPLE_MCOMS", - "skos:prefLabel": { - "@language": "en", - "@value": "Number of MCOMS samples in each pressure bin" - }, - "owl:versionInfo": "3", - "dc:date": "2025-11-26 10:16:04.0", - "skos:altLabel": "NB_SAMPLE_MCOMS", - "skos:notation": "SDN:R03::NB_SAMPLE_MCOMS", - "pav:version": "3", - "dce:identifier": "SDN:R03::NB_SAMPLE_MCOMS", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/3/" - }, - "pav:authoredOn": "2025-11-26 10:16:04.0" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_SFET/", "pav:hasVersion": { @@ -307,6 +299,110 @@ }, "pav:authoredOn": "2025-11-25 10:14:03.0" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE670/", + "pav:authoredOn": "2026-06-11 09:21:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE670/1/" + }, + "dce:identifier": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE670", + "pav:version": "1", + "skos:notation": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE670", + "skos:altLabel": "RAW_DOWNWELLING_IRRADIANCE670", + "dc:date": "2026-06-11 09:21:52.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Raw downwelling irradiance at 670 nanometers" + }, + "dc:identifier": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE670", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": { + "@language": "en", + "@value": "Raw downwelling irradiance signal at 670 nm wavelength. Local_Attributes:{long_name:Raw downwelling irradiance at 670 nanometers; standard_name:-; units:count; valid_min:-; valid_max:-; fill_value:NC_FILL_DOUBLE}. Properties:{category:ib; data_type:double}" + }, + "@type": "skos:Concept" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/", + "pav:hasVersion": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/3/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/2/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/1/" + } + ], + "@type": "skos:Concept", + "skos:definition": { + "@language": "en", + "@value": "Number of samples in each pressure bin. Local_Attributes:{long_name:Number of samples in each pressure bin; standard_name:-; units:count; valid_min:-; valid_max:-; fill_value:NC_FILL_SHORT}. Properties:{category:ic; data_type:short}." + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R03::NB_SAMPLE_MCOMS", + "skos:prefLabel": { + "@language": "en", + "@value": "Number of MCOMS samples in each pressure bin" + }, + "owl:versionInfo": "4", + "dc:date": "2026-05-18 09:45:19.0", + "skos:altLabel": "NB_SAMPLE_MCOMS", + "skos:notation": "SDN:R03::NB_SAMPLE_MCOMS", + "pav:version": "4", + "dce:identifier": "SDN:R03::NB_SAMPLE_MCOMS", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/4/" + }, + "pav:authoredOn": "2026-05-18 09:45:19.0" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/DOWN_IRRADIANCE670/", + "pav:authoredOn": "2026-06-11 09:21:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/DOWN_IRRADIANCE670/1/" + }, + "dce:identifier": "SDN:R03::DOWN_IRRADIANCE670", + "pav:version": "1", + "skos:notation": "SDN:R03::DOWN_IRRADIANCE670", + "skos:altLabel": "DOWN_IRRADIANCE670", + "dc:date": "2026-06-11 09:21:52.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Downwelling irradiance at 670 nanometers" + }, + "dc:identifier": "SDN:R03::DOWN_IRRADIANCE670", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": { + "@language": "en", + "@value": "Downwelling irradiance at 670 nm wavelength, reported by OCR504 sensor (unit conversion). Local_Attributes:{long_name:Downwelling irradiance at 670 nanometers; standard_name:-; units:W/m^2/nm; valid_min:-; valid_max:-; fill_value:99999.f}. Properties:{category:b; data_type:float}" + }, + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_SUNA/", "pav:hasVersion": [ @@ -463,6 +559,37 @@ }, "pav:authoredOn": "2025-11-25 10:14:02.0" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/BDOWN_IRRADIANCE665/", + "pav:authoredOn": "2026-06-11 09:21:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/BDOWN_IRRADIANCE665/1/" + }, + "dce:identifier": "SDN:R03::BDOWN_IRRADIANCE665", + "pav:version": "1", + "skos:notation": "SDN:R03::BDOWN_IRRADIANCE665", + "skos:altLabel": "DOWN_IRRADIANCE665", + "dc:date": "2026-06-11 09:21:52.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Downwelling irradiance at 665 nanometers" + }, + "dc:identifier": "SDN:R03::BDOWN_IRRADIANCE665", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": { + "@language": "en", + "@value": "Downwelling irradiance at 665 nm wavelength, reported by OCR504 sensor (unit conversion). Local_Attributes:{long_name:Downwelling irradiance at 665 nanometers; standard_name:-; units:W/m^2/nm; valid_min:-; valid_max:-; fill_value:99999.f}. Properties:{category:b; data_type:float}" + }, + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_CYC/", "pav:hasVersion": [ @@ -4390,6 +4517,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_DURAFET/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE665/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_OCR/" }, @@ -4399,9 +4529,6 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_STM/" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_SFET/" }, @@ -4411,6 +4538,15 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_CTD/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE670/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/DOWN_IRRADIANCE670/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_SUNA/" }, @@ -4423,6 +4559,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/CHLA_FLUORESCENCE/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/BDOWN_IRRADIANCE665/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_CYC/" }, @@ -4693,8 +4832,8 @@ "dc:description": "Terms describing individual measured parameters or phenomena, used to mark up sets of data in Argo netCDF arrays. Argo netCDF variables PARAMETER, STATION_PARAMETERS, HISTORY_PARAMETER and TRAJECTORY_PARAMETERS are populated by R03 altLabel. R03 altLabel is also used to name netCDF variables. Detailed information (incl. about Local_Attributes and Properties) is in the user manual (https://dx.doi.org/10.13155/29825), in the Reference Table 3 section.", "dc:title": "Argo parameter codes", "skos:prefLabel": "Argo parameter codes", - "owl:versionInfo": "13", - "dc:date": "2026-01-16 02:00:00.0", + "owl:versionInfo": "15", + "dc:date": "2026-06-12 03:00:01.0", "skos:altLabel": "PARAMETER", "dc:creator": "Argo Data Management Team", "dc:alternative": "PARAMETER", 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 44578e6..9465860 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 @@ -32,6 +32,9 @@ "dc:date": "2024-11-11 09:32:23.0", "skos:altLabel": "890", "skos:notation": "SDN:R08::890", + "skos:broader": { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III_JUMBO/" + }, "pav:version": "3", "dce:identifier": "SDN:R08::890", "pav:hasCurrentVersion": { @@ -71,6 +74,9 @@ "dc:date": "2024-11-11 09:32:23.0", "skos:altLabel": "891", "skos:notation": "SDN:R08::891", + "skos:broader": { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III_JUMBO/" + }, "pav:version": "3", "dce:identifier": "SDN:R08::891", "pav:hasCurrentVersion": { @@ -662,6 +668,7 @@ "pav:hasVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R08/current/836/1/" }, + "pav:authoredOn": "2023-10-05 14:39:49.0", "@type": "skos:Concept", "skos:definition": { "@language": "en", @@ -684,7 +691,7 @@ "dc:date": "2023-10-05 14:39:49.0", "skos:altLabel": "836", "skos:notation": "SDN:R08::836", - "skos:broader": [ + "skos:broader": [ { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III/" }, @@ -696,47 +703,46 @@ "dce:identifier": "SDN:R08::836", "pav:hasCurrentVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R08/current/836/2/" - }, - "pav:authoredOn": "2023-10-05 14:39:49.0" + } }, { "@id": "http://vocab.nerc.ac.uk/collection/R08/current/843/", "pav:authoredOn": "2020-05-03 20:28:54.0", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R08/current/843/1/" - }, - "dce:identifier": "SDN:R08::843", - "pav:version": "1", - "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", - "owl:versionInfo": "1", - "skos:prefLabel": { + "@type": "skos:Concept", + "skos:definition": { "@language": "en", - "@value": "POPS ice platform using PROVOR float with SBE conductivity sensor" + "@value": "Polar Ocean Profiling System (POPS) ice platform using PROVOR profiling float with Sea-Bird Scientific (SBE) conductivity sensor" }, - "dc:identifier": "SDN:R08::843", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", "skos:note": { "@language": "en", "@value": "accepted" }, - "owl:deprecated": "false", - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "skos:definition": { + "dc:identifier": "SDN:R08::843", + "skos:prefLabel": { "@language": "en", - "@value": "Polar Ocean Profiling System (POPS) ice platform using PROVOR profiling float with Sea-Bird Scientific (SBE) conductivity sensor" + "@value": "POPS ice platform using PROVOR float with SBE conductivity sensor" }, - "@type": "skos:Concept" + "owl:versionInfo": "1", + "dc:date": "2020-05-03 20:28:54.0", + "skos:altLabel": "843", + "skos:notation": "SDN:R08::843", + "skos:broader": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_NEMO/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_PROVOR/" + } + ], + "pav:version": "1", + "dce:identifier": "SDN:R08::843", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/843/1/" + } }, { "@id": "http://vocab.nerc.ac.uk/collection/R08/current/873/", @@ -777,6 +783,7 @@ "pav:hasVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R08/current/878/1/" }, + "pav:authoredOn": "2024-11-11 09:32:23.0", "@type": "skos:Concept", "skos:definition": { "@language": "en", @@ -799,15 +806,19 @@ "dc:date": "2024-11-11 09:32:23.0", "skos:altLabel": "878", "skos:notation": "SDN:R08::878", - "skos:broader": { - "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR/" - }, + "skos:broader": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR2/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR/" + } + ], "pav:version": "2", "dce:identifier": "SDN:R08::878", "pav:hasCurrentVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R08/current/878/2/" - }, - "pav:authoredOn": "2024-11-11 09:32:23.0" + } }, { "@id": "http://vocab.nerc.ac.uk/collection/R08/current/885/", @@ -883,6 +894,9 @@ "dc:date": "2024-11-11 09:32:23.0", "skos:altLabel": "883", "skos:notation": "SDN:R08::883", + "skos:broader": { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/APEX_D/" + }, "pav:version": "3", "dce:identifier": "SDN:R08::883", "pav:hasCurrentVersion": { @@ -974,36 +988,41 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R08/current/844/", "pav:authoredOn": "2020-05-03 20:28:54.0", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R08/current/844/1/" - }, - "dce:identifier": "SDN:R08::844", - "pav:version": "1", - "skos:broader": { - "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR/" - }, - "skos:notation": "SDN:R08::844", - "skos:altLabel": "844", - "dc:date": "2020-05-03 20:28:54.0", - "owl:versionInfo": "1", - "skos:prefLabel": { + "@type": "skos:Concept", + "skos:definition": { "@language": "en", - "@value": "ARVOR float with SBE conductivity sensor" + "@value": "ARVOR profiling float with Sea-Bird Scientific (SBE) conductivity sensor" }, - "dc:identifier": "SDN:R08::844", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", "skos:note": { "@language": "en", "@value": "accepted" }, - "owl:deprecated": "false", - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "skos:definition": { + "dc:identifier": "SDN:R08::844", + "skos:prefLabel": { "@language": "en", - "@value": "ARVOR profiling float with Sea-Bird Scientific (SBE) conductivity sensor" + "@value": "ARVOR float with SBE conductivity sensor" }, - "@type": "skos:Concept" + "owl:versionInfo": "1", + "dc:date": "2020-05-03 20:28:54.0", + "skos:altLabel": "844", + "skos:notation": "SDN:R08::844", + "skos:broader": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR2/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR/" + } + ], + "pav:version": "1", + "dce:identifier": "SDN:R08::844", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/844/1/" + } }, { "@id": "http://vocab.nerc.ac.uk/collection/R08/current/879/", diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R18.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R18.jsonld index 11e0cf5..b3ed852 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R18.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R18.jsonld @@ -9892,48 +9892,6 @@ }, "@type": "skos:Concept" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/", - "pav:hasVersion": [ - { - "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/2/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/1/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/3/" - } - ], - "@type": "skos:Concept", - "skos:definition": { - "@language": "en", - "@value": "Never used on the GDAC. In case of grounding during the descent to profile depth phase, this parameter (PM18 in float user manual) defines the thickness of a new deep zone (from profile start pressure) for the purpose of data reduction. The thickness of the slices is 1 dbar in this zone. Should be set to 0 to disable this function. Template_Values:{unit:[bar, dbar, cbar, mbar, inHg]}." - }, - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "owl:deprecated": "true", - "skos:note": { - "@language": "en", - "@value": "deprecated" - }, - "dc:identifier": "SDN:R18::CC00062", - "skos:prefLabel": { - "@language": "en", - "@value": "CONFIG_GroundingModeDeepZoneThickness_dbar" - }, - "owl:versionInfo": "4", - "dc:date": "2026-03-09 09:11:25.0", - "skos:altLabel": "Core Config 62", - "skos:notation": "SDN:R18::CC00062", - "pav:version": "4", - "dce:identifier": "SDN:R18::CC00062", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/4/" - }, - "pav:authoredOn": "2026-03-09 09:11:25.0" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00116/", "pav:hasVersion": { @@ -11580,6 +11538,51 @@ }, "@type": "skos:Concept" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/", + "pav:hasVersion": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/2/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/3/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/4/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/1/" + } + ], + "@type": "skos:Concept", + "skos:definition": { + "@language": "en", + "@value": "In case of grounding during the descent to profile depth phase, this parameter (PM18 in float user manual) defines the thickness of a new deep zone (from profile start pressure) for the purpose of data reduction. The thickness of the slices is 1 dbar in this zone. Should be set to 0 to disable this function. Template_Values:{unit:[bar, dbar, cbar, mbar, inHg]}." + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R18::CC00062", + "skos:prefLabel": { + "@language": "en", + "@value": "CONFIG_GroundingModeDeepZoneThickness_dbar" + }, + "owl:versionInfo": "5", + "dc:date": "2026-05-15 10:00:35.0", + "skos:altLabel": "Core Config 62", + "skos:notation": "SDN:R18::CC00062", + "pav:version": "5", + "dce:identifier": "SDN:R18::CC00062", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/5/" + }, + "pav:authoredOn": "2026-05-15 10:00:35.0" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00204/", "pav:hasVersion": { @@ -12866,9 +12869,6 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00135/" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00116/" }, @@ -13004,6 +13004,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00141/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00062/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R18/current/CC00204/" }, @@ -13049,8 +13052,8 @@ "dc:description": "List of float configuration settings selected by the float Principal Investigator (PI). Configuration parameters selected for a float are stored in the float 'meta.nc' file, under CONFIG_PARAMETER_NAME and LAUNCH_CONFIG_PARAMETER_NAME, which are populated by R18 prefLabel. Detailed information (incl. Template_Values explanation) is in the user manual (https://dx.doi.org/10.13155/29825), in the Reference Table 18 section.", "dc:title": "Argo configuration parameter names", "skos:prefLabel": "Argo configuration parameter names", - "owl:versionInfo": "11", - "dc:date": "2026-03-14 02:00:01.0", + "owl:versionInfo": "12", + "dc:date": "2026-05-16 03:00:01.0", "skos:altLabel": "CONFIG_PARAMETER_NAME", "dc:creator": "Argo Data Management Team", "dc:alternative": "CONFIG_PARAMETER_NAME", 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 7d47ce4..4df459d 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 @@ -68,80 +68,6 @@ }, "@type": "skos:Concept" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_NEMO/", - "pav:authoredOn": "2020-05-03 20:30:02.0", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_NEMO/1/" - }, - "dce:identifier": "SDN:R23::POPS_NEMO", - "pav:version": "1", - "skos:notation": "SDN:R23::POPS_NEMO", - "skos:altLabel": "POPS_NEMO", - "dc:date": "2020-05-03 20:30:02.0", - "owl:versionInfo": "1", - "skos:prefLabel": { - "@language": "en", - "@value": "POPS with NEMO float" - }, - "dc:identifier": "SDN:R23::POPS_NEMO", - "skos:note": { - "@language": "en", - "@value": "accepted" - }, - "owl:deprecated": "false", - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "skos:definition": { - "@language": "en", - "@value": "Polar Ocean Profiling System with a NEMO float. PLATFORM_TYPE_KEY = 430" - }, - "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" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III_JUMBO/", - "pav:authoredOn": "2024-09-11 11:40:41.0", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III_JUMBO/1/" - }, - "dce:identifier": "SDN:R23::PROVOR_III_JUMBO", - "pav:version": "1", - "skos:notation": "SDN:R23::PROVOR_III_JUMBO", - "skos:altLabel": "PROVOR_III_JUMBO", - "dc:date": "2024-09-11 11:40:41.0", - "owl:versionInfo": "1", - "skos:prefLabel": { - "@language": "en", - "@value": "PROVOR_III_JUMBO float" - }, - "dc:identifier": "SDN:R23::PROVOR_III_JUMBO", - "skos:note": { - "@language": "en", - "@value": "accepted" - }, - "owl:deprecated": "false", - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "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" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/FLOAT/", "pav:authoredOn": "2020-05-03 20:30:02.0", @@ -331,6 +257,54 @@ "pav:version": "1", "dce:identifier": "SDN:R23::APEX_EM" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III_JUMBO/", + "pav:hasVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III_JUMBO/1/" + }, + "pav:authoredOn": "2026-04-29 13:04:08.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III_JUMBO/2/" + }, + "dce:identifier": "SDN:R23::PROVOR_III_JUMBO", + "@type": "skos:Concept", + "skos:related": { + "@id": "http://vocab.nerc.ac.uk/collection/R24/current/NKE/" + }, + "skos:definition": { + "@language": "en", + "@value": "PROVOR float with additional battery pack. PLATFORM_TYPE_KEY = 108." + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R23::PROVOR_III_JUMBO", + "skos:prefLabel": { + "@language": "en", + "@value": "PROVOR_III_JUMBO float" + }, + "owl:versionInfo": "2", + "skos:narrower": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/836/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/891/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/890/" + } + ], + "dc:date": "2026-04-29 13:04:08.0", + "skos:altLabel": "PROVOR_III_JUMBO", + "skos:notation": "SDN:R23::PROVOR_III_JUMBO", + "pav:version": "2" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_PROVOR/", "pav:authoredOn": "2020-05-03 20:30:02.0", @@ -368,6 +342,43 @@ "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_PROVOR/1/" } }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_NEMO/", + "pav:authoredOn": "2020-05-03 20:30:02.0", + "@type": "skos:Concept", + "skos:related": { + "@id": "http://vocab.nerc.ac.uk/collection/R24/current/OPTIMARE/" + }, + "skos:definition": { + "@language": "en", + "@value": "Polar Ocean Profiling System with a NEMO float. PLATFORM_TYPE_KEY = 430" + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R23::POPS_NEMO", + "skos:prefLabel": { + "@language": "en", + "@value": "POPS with NEMO float" + }, + "owl:versionInfo": "1", + "skos:narrower": { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/843/" + }, + "dc:date": "2020-05-03 20:30:02.0", + "skos:altLabel": "POPS_NEMO", + "skos:notation": "SDN:R23::POPS_NEMO", + "pav:version": "1", + "dce:identifier": "SDN:R23::POPS_NEMO", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_NEMO/1/" + } + }, { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/NAVIS_A/", "pav:authoredOn": "2020-05-03 20:30:02.0", @@ -1164,6 +1175,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/APEX_D/", "pav:authoredOn": "2020-05-03 20:30:02.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/APEX_D/1/" + }, "@type": "skos:Concept", "skos:related": { "@id": "http://vocab.nerc.ac.uk/collection/R24/current/TWR/" @@ -1186,17 +1200,19 @@ "@value": "Deep APEX float" }, "owl:versionInfo": "1", - "skos:narrower": { - "@id": "http://vocab.nerc.ac.uk/collection/R08/current/849/" - }, + "skos:narrower": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/849/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/883/" + } + ], "dc:date": "2020-05-03 20:30:02.0", "skos:altLabel": "APEX_D", "skos:notation": "SDN:R23::APEX_D", "pav:version": "1", - "dce:identifier": "SDN:R23::APEX_D", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R23/current/APEX_D/1/" - } + "dce:identifier": "SDN:R23::APEX_D" }, { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/NINJA/", @@ -1473,6 +1489,53 @@ "skos:altLabel": "ARVOR", "skos:notation": "SDN:R23::ARVOR" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR2/", + "pav:authoredOn": "2026-05-12 09:48:49.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR2/1/" + }, + "dce:identifier": "SDN:R23::ARVOR2", + "@type": "skos:Concept", + "skos:related": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R28/current/CB0013/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R24/current/NKE/" + } + ], + "skos:definition": { + "@language": "en", + "@value": "ARVOR2 float, PFV2 is the controller board type." + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R23::ARVOR2", + "skos:prefLabel": { + "@language": "en", + "@value": "ARVOR 2 float" + }, + "owl:versionInfo": "1", + "skos:narrower": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/844/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R08/current/878/" + } + ], + "dc:date": "2026-05-12 09:48:49.0", + "skos:altLabel": "ARVOR2", + "skos:notation": "SDN:R23::ARVOR2", + "pav:version": "1" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR/", "pav:authoredOn": "2020-05-03 20:30:02.0", @@ -1701,12 +1764,6 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ITP/" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_NEMO/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III_JUMBO/" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/FLOAT/" }, @@ -1722,9 +1779,15 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/APEX_EM/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III_JUMBO/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_PROVOR/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_NEMO/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/NAVIS_A/" }, @@ -1803,6 +1866,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR2/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR/" }, @@ -1821,8 +1887,8 @@ "dc:description": "List of Argo float types. Argo netCDF variable PLATFORM_TYPE is populated by R23 altLabel.", "dc:title": "Argo platform type", "skos:prefLabel": "Argo platform type", - "owl:versionInfo": "9", - "dc:date": "2024-10-25 03:00:00.0", + "owl:versionInfo": "11", + "dc:date": "2026-05-13 03:00:02.0", "skos:altLabel": "PLATFORM_TYPE", "dc:creator": "Argo Data Management Team", "dc:alternative": "PLATFORM_TYPE", diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R24.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R24.jsonld index 8a2e0e5..8f5bf15 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R24.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R24.jsonld @@ -497,6 +497,11 @@ "@language": "en", "@value": "NKE Instrumentation" }, + "dc:identifier": "SDN:R24::NKE", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, "@type": "skos:Concept", "skos:related": [ { @@ -511,6 +516,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR2/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/ARVOR/" }, @@ -528,6 +536,9 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R23/current/POPS_PROVOR/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R23/current/PROVOR_III_JUMBO/" } ], "skos:definition": { @@ -537,12 +548,7 @@ "void:inDataset": { "@id": "http://vocab.nerc.ac.uk/.well-known/void" }, - "owl:deprecated": "false", - "skos:note": { - "@language": "en", - "@value": "accepted" - }, - "dc:identifier": "SDN:R24::NKE" + "owl:deprecated": "false" }, { "@id": "http://vocab.nerc.ac.uk/collection/R24/current/HSOE/", 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 53d7be8..6cec462 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 @@ -34,57 +34,6 @@ }, "@type": "skos:Concept" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/", - "pav:authoredOn": "2023-11-24 09:35:13.0", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/1/" - }, - "dce:identifier": "SDN:R25::CTD_TEMP_CNDC", - "pav:version": "1", - "skos:notation": "SDN:R25::CTD_TEMP_CNDC", - "@type": "skos:Concept", - "skos:related": [ - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP4K/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP6K/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" - } - ], - "skos:definition": { - "@language": "en", - "@value": "Specific temperature sensor used with conductivity to calculate salinity on a CTD" - }, - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "owl:deprecated": "false", - "skos:note": { - "@language": "en", - "@value": "accepted" - }, - "dc:identifier": "SDN:R25::CTD_TEMP_CNDC", - "skos:prefLabel": { - "@language": "en", - "@value": "Temperature sensor for conductivity on a CTD" - }, - "owl:versionInfo": "1", - "dc:date": "2023-11-24 09:35:13.0", - "skos:altLabel": "CTD_TEMP_CNDC" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R25/current/FLUOROMETER_CHLA/", "pav:authoredOn": "2019-10-11 15:06:36.0", @@ -486,10 +435,10 @@ "@type": "skos:Concept", "skos:related": [ { - "@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/OCR504_ICSW/" + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_ICSW/" } ], "skos:definition": { @@ -549,9 +498,6 @@ "@value": "Conductivity Temperature Depth (CTD) sensors package measuring conductivity" }, "skos:related": [ - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/CTD_F01/" }, @@ -564,9 +510,15 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP6K/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3.1/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP4K/" }, @@ -1002,10 +954,10 @@ "@type": "skos:Concept", "skos:related": [ { - "@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/OCR504_ICSW/" + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_ICSW/" } ], "skos:definition": { @@ -1043,11 +995,15 @@ }, "dce:identifier": "SDN:R25::RADIOMETER_PAR", "pav:version": "1", + "skos:notation": "SDN:R25::RADIOMETER_PAR", "@type": "skos:Concept", "skos:related": [ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_PAR/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_ICSW/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_ICSW/" }, @@ -1059,11 +1015,7 @@ }, { "@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", @@ -1084,8 +1036,7 @@ }, "owl:versionInfo": "1", "dc:date": "2019-10-11 15:06:36.0", - "skos:altLabel": "RADIOMETER_PAR", - "skos:notation": "SDN:R25::RADIOMETER_PAR" + "skos:altLabel": "RADIOMETER_PAR" }, { "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP/", @@ -1117,9 +1068,6 @@ "@value": "Conductivity Temperature Depth (CTD) sensors package measuring temperature" }, "skos:related": [ - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/CTD_F01/" }, @@ -1132,9 +1080,15 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP6K/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3.1/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP4K/" }, @@ -1300,10 +1254,10 @@ "@type": "skos:Concept", "skos:related": [ { - "@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/OCR504_ICSW/" + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_ICSW/" } ], "skos:definition": { @@ -1406,6 +1360,63 @@ }, "@type": "skos:Concept" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/", + "pav:hasVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/1/" + }, + "pav:authoredOn": "2026-04-29 13:04:08.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/2/" + }, + "dce:identifier": "SDN:R25::CTD_TEMP_CNDC", + "pav:version": "2", + "skos:notation": "SDN:R25::CTD_TEMP_CNDC", + "skos:altLabel": "CTD_TEMP_CNDC", + "@type": "skos:Concept", + "skos:related": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP4K/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3.1/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP6K/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR/" + } + ], + "skos:definition": { + "@language": "en", + "@value": "Specific temperature sensor used with conductivity to calculate salinity on a CTD" + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R25::CTD_TEMP_CNDC", + "skos:prefLabel": { + "@language": "en", + "@value": "Temperature sensor for conductivity on a CTD" + }, + "owl:versionInfo": "2", + "dc:date": "2026-04-29 13:04:08.0" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R25/current/OPTODE_DOXY/", "pav:authoredOn": "2019-10-11 15:06:36.0", @@ -1433,6 +1444,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/RBR_CODA_T_ODO/" }, @@ -1465,9 +1479,6 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/AANDERAA_OPTODE_4330/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE83_OPTODE/" } ], "skos:definition": { @@ -1484,10 +1495,10 @@ "@type": "skos:Concept", "skos:related": [ { - "@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/OCR504_ICSW/" + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_ICSW/" } ], "skos:definition": { @@ -1547,9 +1558,6 @@ "@value": "Conductivity Temperature Depth (CTD) sensors package measuring pressure" }, "skos:related": [ - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/DSB301-10-C85/" }, @@ -1607,6 +1615,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP6K/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO/" }, @@ -1616,6 +1627,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_PRES_A/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3.1/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP4K/" }, @@ -1947,10 +1961,10 @@ "@type": "skos:Concept", "skos:related": [ { - "@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/OCR504_ICSW/" + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_ICSW/" } ], "skos:definition": { @@ -1986,9 +2000,6 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_DOWN_IRR/" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R25/current/FLUOROMETER_CHLA/" }, @@ -2058,6 +2069,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R25/current/STS_CNDC/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R25/current/OPTODE_DOXY/" }, @@ -2088,8 +2102,8 @@ "dc:description": "Terms describing sensor types mounted on Argo floats. Argo netCDF variable SENSOR is populated by R25 altLabel.", "dc:title": "Argo sensor types", "skos:prefLabel": "Argo sensor types", - "owl:versionInfo": "4", - "dc:date": "2025-08-29 03:00:01.0", + "owl:versionInfo": "5", + "dc:date": "2026-04-30 03:00:00.0", "skos:altLabel": "SENSOR", "dc:creator": "Argo Data Management Team", "dc:alternative": "SENSOR", 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 70efa48..6ddb822 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 @@ -15,6 +15,12 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/ISUS_V3/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR507_ICSW/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_R10W/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_PAR/" }, @@ -24,6 +30,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_R10W/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_ICSW/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_ICSW/" }, @@ -35,9 +44,6 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR507_R10W/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR507_ICSW/" } ], "@type": "skos:Concept", @@ -832,40 +838,27 @@ "skos:notation": "SDN:R26::RBR", "skos:altLabel": "RBR", "dc:date": "2019-10-11 15:08:43.0", - "@type": "skos:Concept", - "skos:definition": { - "@language": "en", - "@value": "A Canadian designer and manufacturer of oceanographic instruments, including sensors, loggers and compact systems." - }, - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "owl:deprecated": "false", - "skos:note": { - "@language": "en", - "@value": "accepted" - }, - "dc:identifier": "SDN:R26::RBR", - "skos:prefLabel": { - "@language": "en", - "@value": "RBR Ltd" - }, - "owl:versionInfo": "1", "skos:narrower": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP6K/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3/" }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP4K/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3.1/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_PRES_A/" }, { "@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/" @@ -874,12 +867,28 @@ "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CODA_T_ODO/" }, { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP6K/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR/" + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" } - ] + ], + "@type": "skos:Concept", + "skos:definition": { + "@language": "en", + "@value": "A Canadian designer and manufacturer of oceanographic instruments, including sensors, loggers and compact systems." + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R26::RBR", + "skos:prefLabel": { + "@language": "en", + "@value": "RBR Ltd" + }, + "owl:versionInfo": "1" }, { "@id": "http://vocab.nerc.ac.uk/collection/R26/current/APL_UW/", @@ -1101,9 +1110,6 @@ }, { "@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/" @@ -1138,6 +1144,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP_V1.4/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_R10W/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/ECO_FLBBFL/" }, @@ -1147,6 +1156,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE61/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE83_OPTODE/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41_V2.5/" }, @@ -1170,9 +1182,6 @@ }, { "@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/" @@ -1222,6 +1231,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41_IDO/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.5/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41_IDO_V3.0/" }, @@ -1281,9 +1293,6 @@ }, { "@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/" @@ -1300,6 +1309,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP_IDO/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_ICSW/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE61_V4.5.2/" }, @@ -1311,9 +1323,6 @@ }, { "@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 b1a5750..627f23a 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 @@ -65,206 +65,6 @@ }, "@type": "skos:Concept" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE83_OPTODE/", - "pav:hasVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE83_OPTODE/1/" - }, - "@type": "skos:Concept", - "skos:related": { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/OPTODE_DOXY/" - }, - "skos:definition": { - "@language": "en", - "@value": "An optical dissolved oxygen sensor, manufactured by Sea-Bird Scientific and designed to be integrated into a pumped CTD system." - }, - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "owl:deprecated": "false", - "skos:note": { - "@language": "en", - "@value": "accepted" - }, - "dc:identifier": "SDN:R27::SBE83_OPTODE", - "skos:prefLabel": { - "@language": "en", - "@value": "Sea-Bird Scientific SBE83 oxygen optode" - }, - "owl:versionInfo": "2", - "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": { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE83_OPTODE/2/" - }, - "pav:authoredOn": "2025-11-18 12:09:41.0" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/", - "pav:authoredOn": "2025-10-08 10:58:28.0", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/1/" - }, - "dce:identifier": "SDN:R27::RBR_CTD", - "@type": "skos:Concept", - "skos:related": [ - { - "@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/" - }, - { - "@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." - }, - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "owl:deprecated": "false", - "skos:note": { - "@language": "en", - "@value": "accepted" - }, - "dc:identifier": "SDN:R27::RBR_CTD", - "skos:prefLabel": { - "@language": "en", - "@value": "RBR CTD" - }, - "owl:versionInfo": "1", - "dc:date": "2025-10-08 10:58:28.0", - "skos:altLabel": "RBR_CTD", - "skos:notation": "SDN:R27::RBR_CTD", - "pav:version": "1" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_R10W/", - "pav:authoredOn": "2025-08-28 11:45:52.0", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_R10W/1/" - }, - "dce:identifier": "SDN:R27::OCR504_R10W", - "@type": "skos:Concept", - "skos:related": [ - { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_UP_RAD443/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_UP_RAD555/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_UP_RAD490/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_UP_RAD412/" - } - ], - "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." - }, - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "owl:deprecated": "false", - "skos:note": { - "@language": "en", - "@value": "accepted" - }, - "dc:identifier": "SDN:R27::OCR504_R10W", - "skos:prefLabel": { - "@language": "en", - "@value": "OCR-504 multispectral radiometer (upwelling radiance)" - }, - "owl:versionInfo": "1", - "dc:date": "2025-08-28 11:45:52.0", - "skos:altLabel": "OCR504_R10W", - "skos:notation": "SDN:R27::OCR504_R10W", - "pav:version": "1" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_ICSW/", - "pav:authoredOn": "2025-08-28 11:45:52.0", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_ICSW/1/" - }, - "dce:identifier": "SDN:R27::OCR504_ICSW", - "pav:version": "1", - "@type": "skos:Concept", - "skos:related": [ - { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_DOWN_IRR380/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_DOWN_IRR555/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_DOWN_IRR412/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_DOWN_IRR443/" - }, - { - "@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/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." - }, - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "owl:deprecated": "false", - "skos:note": { - "@language": "en", - "@value": "accepted" - }, - "dc:identifier": "SDN:R27::OCR504_ICSW", - "skos:prefLabel": { - "@language": "en", - "@value": "OCR-504 multispectral radiometer (downwelling irradiance)" - }, - "owl:versionInfo": "1", - "dc:date": "2025-08-28 11:45:52.0", - "skos:altLabel": "OCR504_ICSW", - "skos:notation": "SDN:R27::OCR504_ICSW" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/DSB301-10-C85/", "pav:authoredOn": "2025-08-20 09:29:53.0", @@ -1566,13 +1366,13 @@ "@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_TEMP_CNDC/" }, { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_CNDC/" + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP/" }, { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/" + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_CNDC/" } ], "skos:definition": { @@ -1614,13 +1414,13 @@ "@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_TEMP_CNDC/" }, { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_CNDC/" + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP/" }, { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/" + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_CNDC/" } ], "skos:definition": { @@ -1648,6 +1448,54 @@ "@id": "http://vocab.nerc.ac.uk/collection/R26/current/RBR/" } }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/", + "pav:authoredOn": "2025-10-08 10:58:28.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/1/" + }, + "dce:identifier": "SDN:R27::RBR_CTD", + "pav:version": "1", + "@type": "skos:Concept", + "skos:related": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_PRES/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/" + }, + { + "@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, 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." + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R27::RBR_CTD", + "skos:prefLabel": { + "@language": "en", + "@value": "RBR CTD" + }, + "owl:versionInfo": "1", + "dc:date": "2025-10-08 10:58:28.0", + "skos:altLabel": "RBR_CTD", + "skos:notation": "SDN:R27::RBR_CTD", + "skos:broader": { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/RBR/" + } + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CODA_T_ODO/", "pav:authoredOn": "2021-05-26 09:01:46.0", @@ -1699,13 +1547,13 @@ "@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_TEMP_CNDC/" }, { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_CNDC/" + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP/" }, { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/" + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_CNDC/" } ], "skos:definition": { @@ -1807,6 +1655,54 @@ "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_PRES_A/1/" } }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3.1/", + "pav:authoredOn": "2026-05-08 11:01:47.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3.1/1/" + }, + "dce:identifier": "SDN:R27::RBR_ARGO3.1", + "pav:version": "1", + "@type": "skos:Concept", + "skos:related": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_PRES/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/" + }, + { + "@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 Computational Fluid Dynamic (CFD) optimised flow path, manufactured by RBR. Salinity is measured by induction of water flushing freely through the conductivity cell, and is accurate to within 10 cm of the air-ocean interface. The unit is designed specifically for profiling floats, including those hosting multiple biogeochemical (BGC) sensors. The system supports both spot and continuous sampling modes, with sampling speeds configurable to up to 8 Hz. The depth rating for a standard profile is 2000 dbar, with energy consumption of approximately 400 J. The ceramic used is a 6k-rated ceramic which differs from the 2k-rated ceramic in the RBR_ARGO3." + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R27::RBR_ARGO3.1", + "skos:prefLabel": { + "@language": "en", + "@value": "RBRargo3.1 CTD" + }, + "owl:versionInfo": "1", + "dc:date": "2026-05-08 11:01:47.0", + "skos:altLabel": "RBR_ARGO3.1", + "skos:notation": "SDN:R27::RBR_ARGO3.1", + "skos:broader": { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/RBR/" + } + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP4K/", "pav:authoredOn": "2021-05-26 09:01:46.0", @@ -1821,13 +1717,13 @@ "@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_TEMP_CNDC/" }, { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_CNDC/" + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP/" }, { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/" + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_CNDC/" } ], "skos:definition": { @@ -1869,13 +1765,13 @@ "@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_TEMP_CNDC/" }, { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_CNDC/" + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP/" }, { - "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_TEMP_CNDC/" + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_CNDC/" } ], "skos:definition": { @@ -2601,64 +2497,13 @@ "pav:authoredOn": "2025-04-03 11:54:29.0", "pav:hasCurrentVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP_V3.0a/3/" - }, - "dce:identifier": "SDN:R27::SBE41CP_V3.0a", - "pav:version": "3", - "@type": "skos:Concept", - "skos:related": [ - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP/" - }, - { - "@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. This CTD operates in continuous profiling (CP) mode, thus sampling at 1 Hz during float ascent, logging the data in internal memory and transmitting to the float controller when the float reaches the surface. This SBE41CP model has firmware version 3.0a." - }, - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "owl:deprecated": "true", - "skos:note": { - "@language": "en", - "@value": "deprecated" - }, - "dc:identifier": "SDN:R27::SBE41CP_V3.0a", - "skos:prefLabel": { - "@language": "en", - "@value": "Sea-Bird Scientific SBE 41CP CTD V3.0a" - }, - "owl:versionInfo": "3", - "dc:date": "2025-04-03 11:54:29.0", - "skos:altLabel": "SBE41CP_V3.0a", - "skos:notation": "SDN:R27::SBE41CP_V3.0a", - "skos:broader": { - "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" - } - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.4/", - "pav:hasVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.4/1/" - }, - "pav:authoredOn": "2025-04-03 11:54:30.0", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.4/2/" - }, - "dce:identifier": "SDN:R27::SBE41N_V5.3.4", - "pav:version": "2", + }, + "dce:identifier": "SDN:R27::SBE41CP_V3.0a", + "pav:version": "3", "@type": "skos:Concept", "skos:related": [ { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N/" + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP/" }, { "@id": "http://vocab.nerc.ac.uk/collection/R25/current/CTD_PRES/" @@ -2672,7 +2517,7 @@ ], "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.4." + "@value": "A system comprising temperature, conductivity and pressure sensors with pump-controlled, T-C ducted flow. This CTD operates in continuous profiling (CP) mode, thus sampling at 1 Hz during float ascent, logging the data in internal memory and transmitting to the float controller when the float reaches the surface. This SBE41CP model has firmware version 3.0a." }, "void:inDataset": { "@id": "http://vocab.nerc.ac.uk/.well-known/void" @@ -2682,29 +2527,29 @@ "@language": "en", "@value": "deprecated" }, - "dc:identifier": "SDN:R27::SBE41N_V5.3.4", + "dc:identifier": "SDN:R27::SBE41CP_V3.0a", "skos:prefLabel": { "@language": "en", - "@value": "Sea-Bird Scientific SBE 41N CTD V5.3.4" + "@value": "Sea-Bird Scientific SBE 41CP CTD V3.0a" }, - "owl:versionInfo": "2", - "dc:date": "2025-04-03 11:54:30.0", - "skos:altLabel": "SBE41N_V5.3.4", - "skos:notation": "SDN:R27::SBE41N_V5.3.4", + "owl:versionInfo": "3", + "dc:date": "2025-04-03 11:54:29.0", + "skos:altLabel": "SBE41CP_V3.0a", + "skos:notation": "SDN:R27::SBE41CP_V3.0a", "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/", + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.4/", "pav:hasVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.5/1/" + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.4/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/" + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.4/2/" }, - "dce:identifier": "SDN:R27::SBE41N_V5.3.5", + "dce:identifier": "SDN:R27::SBE41N_V5.3.4", "pav:version": "2", "@type": "skos:Concept", "skos:related": [ @@ -2723,7 +2568,7 @@ ], "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." + "@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.4." }, "void:inDataset": { "@id": "http://vocab.nerc.ac.uk/.well-known/void" @@ -2733,15 +2578,15 @@ "@language": "en", "@value": "deprecated" }, - "dc:identifier": "SDN:R27::SBE41N_V5.3.5", + "dc:identifier": "SDN:R27::SBE41N_V5.3.4", "skos:prefLabel": { "@language": "en", - "@value": "Sea-Bird Scientific SBE 41N CTD V5.3.5" + "@value": "Sea-Bird Scientific SBE 41N CTD V5.3.4" }, "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:altLabel": "SBE41N_V5.3.4", + "skos:notation": "SDN:R27::SBE41N_V5.3.4", "skos:broader": { "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" } @@ -2761,6 +2606,7 @@ "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" }, "skos:notation": "SDN:R27::SBE41N", + "skos:altLabel": "SBE41N", "@type": "skos:Concept", "skos:related": [ { @@ -2769,6 +2615,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.4.0/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.5/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.4/" }, @@ -2800,8 +2649,7 @@ "@value": "Sea-Bird Scientific SBE 41N CTD" }, "owl:versionInfo": "2", - "dc:date": "2019-10-16 06:35:48.0", - "skos:altLabel": "SBE41N" + "dc:date": "2019-10-16 06:35:48.0" }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP_V1.2/", @@ -3385,6 +3233,59 @@ "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" } }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_R10W/", + "pav:authoredOn": "2025-08-28 11:45:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_R10W/1/" + }, + "dce:identifier": "SDN:R27::OCR504_R10W", + "pav:version": "1", + "skos:broader": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SATLANTIC/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" + } + ], + "@type": "skos:Concept", + "skos:related": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_UP_RAD443/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_UP_RAD555/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_UP_RAD490/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_UP_RAD412/" + } + ], + "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." + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R27::OCR504_R10W", + "skos:prefLabel": { + "@language": "en", + "@value": "OCR-504 multispectral radiometer (upwelling radiance)" + }, + "owl:versionInfo": "1", + "dc:date": "2025-08-28 11:45:52.0", + "skos:altLabel": "OCR504_R10W", + "skos:notation": "SDN:R27::OCR504_R10W" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/ECO_FLBBFL/", "pav:hasVersion": { @@ -3817,6 +3718,46 @@ "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" } }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE83_OPTODE/", + "pav:hasVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE83_OPTODE/1/" + }, + "pav:authoredOn": "2025-11-18 12:09:41.0", + "@type": "skos:Concept", + "skos:related": { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/OPTODE_DOXY/" + }, + "skos:definition": { + "@language": "en", + "@value": "An optical dissolved oxygen sensor, manufactured by Sea-Bird Scientific and designed to be integrated into a pumped CTD system." + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R27::SBE83_OPTODE", + "skos:prefLabel": { + "@language": "en", + "@value": "Sea-Bird Scientific SBE83 oxygen optode" + }, + "owl:versionInfo": "2", + "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": { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE83_OPTODE/2/" + } + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41_V2.5/", "pav:hasVersion": [ @@ -5162,6 +5103,46 @@ "skos:altLabel": "SBE41_IDO_V3.0", "skos:notation": "SDN:R27::SBE41_IDO_V3.0" }, + { + "@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": "2026-05-08 11:01:48.0", + "@type": "skos:Concept", + "skos:related": { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N/" + }, + "skos:definition": { + "@language": "en", + "@value": "A system comprising temperature, conductivity and pressure sensors with pump-controlled, T-C ducted flow. 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": "2026-05-08 11:01:48.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/" + }, + "pav:version": "2", + "dce:identifier": "SDN:R27::SBE41N_V5.3.5", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.5/2/" + } + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP_V3/", "pav:hasVersion": [ @@ -6156,6 +6137,65 @@ "pav:version": "1", "dce:identifier": "SDN:R27::ECO_NTU" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_ICSW/", + "pav:authoredOn": "2025-08-28 11:45:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_ICSW/1/" + }, + "dce:identifier": "SDN:R27::OCR504_ICSW", + "pav:version": "1", + "skos:broader": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SATLANTIC/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R26/current/SBE/" + } + ], + "skos:notation": "SDN:R27::OCR504_ICSW", + "@type": "skos:Concept", + "skos:related": [ + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_DOWN_IRR380/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_DOWN_IRR555/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_DOWN_IRR412/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_PAR/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_DOWN_IRR443/" + }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R25/current/RADIOMETER_DOWN_IRR490/" + } + ], + "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." + }, + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "owl:deprecated": "false", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "dc:identifier": "SDN:R27::OCR504_ICSW", + "skos:prefLabel": { + "@language": "en", + "@value": "OCR-504 multispectral radiometer (downwelling irradiance)" + }, + "owl:versionInfo": "1", + "dc:date": "2025-08-28 11:45:52.0", + "skos:altLabel": "OCR504_ICSW" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SATLANTIC_OCR504_R10W/", "pav:hasVersion": { @@ -6584,18 +6624,6 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RAFOS/" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE83_OPTODE/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_R10W/" - }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_ICSW/" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/DSB301-10-C85/" }, @@ -6701,6 +6729,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP6K/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CTD/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_CODA_T_ODO/" }, @@ -6713,6 +6744,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_PRES_A/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3.1/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/RBR_ARGO3_DEEP4K/" }, @@ -6760,9 +6794,6 @@ }, { "@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/" @@ -6797,6 +6828,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP_V1.4/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_R10W/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/ECO_FLBBFL/" }, @@ -6806,6 +6840,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE61/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE83_OPTODE/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41_V2.5/" }, @@ -6878,6 +6915,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41_IDO/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41N_V5.3.5/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41_IDO_V3.0/" }, @@ -6953,6 +6993,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE41CP_IDO/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R27/current/OCR504_ICSW/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R27/current/SBE61_V4.5.2/" }, @@ -6998,8 +7041,8 @@ "dc:description": "Terms listing models of sensors mounted on Argo floats. Note: avoid using the manufacturer name and sensor firmware version in new entries when possible. Argo netCDF variable SENSOR_MODEL is populated by R27 altLabel.", "dc:title": "Argo sensor models", "skos:prefLabel": "Argo sensor models", - "owl:versionInfo": "25", - "dc:date": "2026-03-10 02:00:00.0", + "owl:versionInfo": "27", + "dc:date": "2026-05-09 03:00:01.0", "skos:altLabel": "SENSOR_MODEL", "dc:creator": "Argo Data Management Team", "dc:alternative": "SENSOR_MODEL", diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R40.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R40.jsonld index cc238ca..a0d97b8 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R40.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R40.jsonld @@ -168,6 +168,34 @@ "skos:definition": "", "@type": "skos:Concept" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0291/", + "pav:authoredOn": "2026-06-11 09:21:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0291/1/" + }, + "dce:identifier": "SDN:R40::PI0291", + "pav:version": "1", + "skos:notation": "SDN:R40::PI0291", + "skos:altLabel": "Xavier COUVELARD", + "dc:date": "2026-06-11 09:21:52.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Xavier COUVELARD" + }, + "dc:identifier": "SDN:R40::PI0291", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": "", + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0176/", "pav:authoredOn": "2023-06-22 12:58:04.0", @@ -1795,6 +1823,34 @@ "skos:definition": "", "@type": "skos:Concept" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0287/", + "pav:authoredOn": "2026-05-19 14:13:12.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0287/1/" + }, + "dce:identifier": "SDN:R40::PI0287", + "pav:version": "1", + "skos:notation": "SDN:R40::PI0287", + "skos:altLabel": "Filipa CARVALHO", + "dc:date": "2026-05-19 14:13:12.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Filipa CARVALHO" + }, + "dc:identifier": "SDN:R40::PI0287", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": "", + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0091/", "pav:authoredOn": "2023-06-22 12:58:04.0", @@ -3677,6 +3733,34 @@ "skos:definition": "", "@type": "skos:Concept" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0289/", + "pav:authoredOn": "2026-05-19 14:13:12.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0289/1/" + }, + "dce:identifier": "SDN:R40::PI0289", + "pav:version": "1", + "skos:notation": "SDN:R40::PI0289", + "skos:altLabel": "Joshua K. WILLIS", + "dc:date": "2026-05-19 14:13:12.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Joshua K. WILLIS" + }, + "dc:identifier": "SDN:R40::PI0289", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": "", + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0058/", "pav:authoredOn": "2023-06-22 12:58:04.0", @@ -5026,19 +5110,22 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0146/", - "pav:authoredOn": "2023-06-22 12:58:04.0", - "pav:hasCurrentVersion": { + "pav:hasVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0146/1/" }, + "pav:authoredOn": "2026-05-12 09:48:49.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0146/2/" + }, "dce:identifier": "SDN:R40::PI0146", - "pav:version": "1", + "pav:version": "2", "skos:notation": "SDN:R40::PI0146", - "skos:altLabel": "Pelle E ROBBINS", - "dc:date": "2023-06-22 12:58:04.0", - "owl:versionInfo": "1", + "skos:altLabel": "Pelle ROBBINS", + "dc:date": "2026-05-12 09:48:49.0", + "owl:versionInfo": "2", "skos:prefLabel": { "@language": "en", - "@value": "Pelle E ROBBINS" + "@value": "Pelle ROBBINS" }, "dc:identifier": "SDN:R40::PI0146", "skos:note": { @@ -5671,6 +5758,34 @@ "skos:definition": "", "@type": "skos:Concept" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0290/", + "pav:authoredOn": "2026-06-02 09:28:32.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0290/1/" + }, + "dce:identifier": "SDN:R40::PI0290", + "pav:version": "1", + "skos:notation": "SDN:R40::PI0290", + "skos:altLabel": "Alexandre BARBONI", + "dc:date": "2026-06-02 09:28:32.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Alexandre BARBONI" + }, + "dc:identifier": "SDN:R40::PI0290", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": "", + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0232/", "pav:authoredOn": "2024-04-25 11:42:03.0", @@ -6598,6 +6713,34 @@ "skos:definition": "", "@type": "skos:Concept" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0288/", + "pav:authoredOn": "2026-05-19 14:13:12.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0288/1/" + }, + "dce:identifier": "SDN:R40::PI0288", + "pav:version": "1", + "skos:notation": "SDN:R40::PI0288", + "skos:altLabel": "Yosuke FUJII", + "dc:date": "2026-05-19 14:13:12.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Yosuke FUJII" + }, + "dc:identifier": "SDN:R40::PI0288", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": "", + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0277/", "pav:authoredOn": "2026-02-24 11:49:21.0", @@ -8059,6 +8202,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0006/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0291/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0176/" }, @@ -8233,6 +8379,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0105/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0287/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0091/" }, @@ -8434,6 +8583,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0111/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0289/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0058/" }, @@ -8647,6 +8799,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0116/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0290/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0232/" }, @@ -8746,6 +8901,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0190/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0288/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0277/" }, @@ -8905,8 +9063,8 @@ "dc:description": "List of Principal Investigator (PI) names in charge of Argo floats. Argo netCDF variable PI_NAME is populated by R40 altLabel.", "dc:title": "Argo Principal Investigator (PI) names", "skos:prefLabel": "Argo Principal Investigator (PI) names", - "owl:versionInfo": "10", - "dc:date": "2026-03-17 02:00:00.0", + "owl:versionInfo": "14", + "dc:date": "2026-06-12 03:00:01.0", "skos:altLabel": "PI_NAME", "dc:creator": "Argo Data Management Team", "dc:alternative": "PI_NAME", diff --git a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R41.jsonld b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R41.jsonld index ba79329..e88da0c 100644 --- a/file_checker_exec/src/main/resources/file_checker_spec/NVS/R41.jsonld +++ b/file_checker_exec/src/main/resources/file_checker_spec/NVS/R41.jsonld @@ -33,19 +33,22 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100033/", - "pav:authoredOn": "2026-03-19 11:04:26.0", - "pav:hasCurrentVersion": { + "pav:hasVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100033/1/" }, + "pav:authoredOn": "2026-04-29 13:56:19.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100033/2/" + }, "dce:identifier": "SDN:R41::R4100033", - "pav:version": "1", + "pav:version": "2", "skos:notation": "SDN:R41::R4100033", - "skos:altLabel": "Argo eq. IRELAND", - "dc:date": "2026-03-19 11:04:26.0", - "owl:versionInfo": "1", + "skos:altLabel": "Argo eq IRELAND", + "dc:date": "2026-04-29 13:56:19.0", + "owl:versionInfo": "2", "skos:prefLabel": { "@language": "en", - "@value": "Argo eq. IRELAND" + "@value": "Argo eq IRELAND" }, "dc:identifier": "SDN:R41::R4100033", "skos:note": { @@ -465,52 +468,24 @@ }, "@type": "skos:Concept" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100061/", - "pav:authoredOn": "2026-03-19 11:04:26.0", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100061/1/" - }, - "dce:identifier": "SDN:R41::R4100061", - "pav:version": "1", - "skos:notation": "SDN:R41::R4100061", - "skos:altLabel": "Argo UK", - "dc:date": "2026-03-19 11:04:26.0", - "owl:versionInfo": "1", - "skos:prefLabel": { - "@language": "en", - "@value": "Argo UK" - }, - "dc:identifier": "SDN:R41::R4100061", - "skos:note": { - "@language": "en", - "@value": "accepted" - }, - "owl:deprecated": "false", - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "skos:definition": { - "@language": "en", - "@value": "UK Argo program led by NOC." - }, - "@type": "skos:Concept" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100003/", - "pav:authoredOn": "2026-03-19 11:04:26.0", - "pav:hasCurrentVersion": { + "pav:hasVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100003/1/" }, + "pav:authoredOn": "2026-04-29 13:56:19.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100003/2/" + }, "dce:identifier": "SDN:R41::R4100003", - "pav:version": "1", + "pav:version": "2", "skos:notation": "SDN:R41::R4100003", - "skos:altLabel": "Argo eq. AUSTRALIA", - "dc:date": "2026-03-19 11:04:26.0", - "owl:versionInfo": "1", + "skos:altLabel": "Argo eq AUSTRALIA", + "dc:date": "2026-04-29 13:56:19.0", + "owl:versionInfo": "2", "skos:prefLabel": { "@language": "en", - "@value": "Argo eq. AUSTRALIA" + "@value": "Argo eq AUSTRALIA" }, "dc:identifier": "SDN:R41::R4100003", "skos:note": { @@ -622,19 +597,22 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100026/", - "pav:authoredOn": "2026-03-19 11:04:26.0", - "pav:hasCurrentVersion": { + "pav:hasVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100026/1/" }, + "pav:authoredOn": "2026-04-29 13:56:19.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100026/2/" + }, "dce:identifier": "SDN:R41::R4100026", - "pav:version": "1", + "pav:version": "2", "skos:notation": "SDN:R41::R4100026", - "skos:altLabel": "Argo eq. UHH", - "dc:date": "2026-03-19 11:04:26.0", - "owl:versionInfo": "1", + "skos:altLabel": "Argo UHH", + "dc:date": "2026-04-29 13:56:19.0", + "owl:versionInfo": "2", "skos:prefLabel": { "@language": "en", - "@value": "Argo eq. UHH" + "@value": "Argo UHH" }, "dc:identifier": "SDN:R41::R4100026", "skos:note": { @@ -647,7 +625,7 @@ }, "skos:definition": { "@language": "en", - "@value": "Equivalent Argo program led by IFM." + "@value": "Argo program led by IFM." }, "@type": "skos:Concept" }, @@ -715,19 +693,22 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100013/", - "pav:authoredOn": "2026-03-19 11:04:26.0", - "pav:hasCurrentVersion": { + "pav:hasVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100013/1/" }, + "pav:authoredOn": "2026-04-29 13:56:19.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100013/2/" + }, "dce:identifier": "SDN:R41::R4100013", - "pav:version": "1", + "pav:version": "2", "skos:notation": "SDN:R41::R4100013", - "skos:altLabel": "Argo eq. CHINA", - "dc:date": "2026-03-19 11:04:26.0", - "owl:versionInfo": "1", + "skos:altLabel": "Argo eq CHINA", + "dc:date": "2026-04-29 13:56:19.0", + "owl:versionInfo": "2", "skos:prefLabel": { "@language": "en", - "@value": "Argo eq. CHINA" + "@value": "Argo eq CHINA" }, "dc:identifier": "SDN:R41::R4100013", "skos:note": { @@ -808,19 +789,22 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100063/", - "pav:authoredOn": "2026-03-19 11:04:26.0", - "pav:hasCurrentVersion": { + "pav:hasVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100063/1/" }, + "pav:authoredOn": "2026-04-29 13:56:19.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100063/2/" + }, "dce:identifier": "SDN:R41::R4100063", - "pav:version": "1", + "pav:version": "2", "skos:notation": "SDN:R41::R4100063", - "skos:altLabel": "Argo eq. UK", - "dc:date": "2026-03-19 11:04:26.0", - "owl:versionInfo": "1", + "skos:altLabel": "Argo eq UK", + "dc:date": "2026-04-29 13:56:19.0", + "owl:versionInfo": "2", "skos:prefLabel": { "@language": "en", - "@value": "Argo eq. UK" + "@value": "Argo eq UK" }, "dc:identifier": "SDN:R41::R4100063", "skos:note": { @@ -1302,52 +1286,24 @@ }, "@type": "skos:Concept" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100053/", - "pav:authoredOn": "2026-03-19 11:04:26.0", - "pav:hasCurrentVersion": { - "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100053/1/" - }, - "dce:identifier": "SDN:R41::R4100053", - "pav:version": "1", - "skos:notation": "SDN:R41::R4100053", - "skos:altLabel": "Argo ROMANIA", - "dc:date": "2026-03-19 11:04:26.0", - "owl:versionInfo": "1", - "skos:prefLabel": { - "@language": "en", - "@value": "Argo ROMANIA" - }, - "dc:identifier": "SDN:R41::R4100053", - "skos:note": { - "@language": "en", - "@value": "accepted" - }, - "owl:deprecated": "false", - "void:inDataset": { - "@id": "http://vocab.nerc.ac.uk/.well-known/void" - }, - "skos:definition": { - "@language": "en", - "@value": "Romanian Argo program led by GEOECOMAR." - }, - "@type": "skos:Concept" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100022/", - "pav:authoredOn": "2026-03-19 11:04:26.0", - "pav:hasCurrentVersion": { + "pav:hasVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100022/1/" }, + "pav:authoredOn": "2026-04-29 13:56:19.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100022/2/" + }, "dce:identifier": "SDN:R41::R4100022", - "pav:version": "1", + "pav:version": "2", "skos:notation": "SDN:R41::R4100022", - "skos:altLabel": "Argo eq. FRANCE", - "dc:date": "2026-03-19 11:04:26.0", - "owl:versionInfo": "1", + "skos:altLabel": "Argo eq FRANCE", + "dc:date": "2026-04-29 13:56:19.0", + "owl:versionInfo": "2", "skos:prefLabel": { "@language": "en", - "@value": "Argo eq. FRANCE" + "@value": "Argo eq FRANCE" }, "dc:identifier": "SDN:R41::R4100022", "skos:note": { @@ -1798,6 +1754,40 @@ }, "@type": "skos:Concept" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100061/", + "pav:hasVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100061/1/" + }, + "pav:authoredOn": "2026-04-30 15:43:48.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100061/2/" + }, + "dce:identifier": "SDN:R41::R4100061", + "pav:version": "2", + "skos:notation": "SDN:R41::R4100061", + "skos:altLabel": "Argo UK", + "dc:date": "2026-04-30 15:43:48.0", + "owl:versionInfo": "2", + "skos:prefLabel": { + "@language": "en", + "@value": "Argo UK" + }, + "dc:identifier": "SDN:R41::R4100061", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": { + "@language": "en", + "@value": "UK Argo program led by Met Office." + }, + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100012/", "pav:hasVersion": { @@ -1896,19 +1886,22 @@ }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100009/", - "pav:authoredOn": "2026-03-19 11:04:26.0", - "pav:hasCurrentVersion": { + "pav:hasVersion": { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100009/1/" }, + "pav:authoredOn": "2026-04-29 13:56:19.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100009/2/" + }, "dce:identifier": "SDN:R41::R4100009", - "pav:version": "1", + "pav:version": "2", "skos:notation": "SDN:R41::R4100009", - "skos:altLabel": "Argo eq. CANADA", - "dc:date": "2026-03-19 11:04:26.0", - "owl:versionInfo": "1", + "skos:altLabel": "Argo eq CANADA", + "dc:date": "2026-04-29 13:56:19.0", + "owl:versionInfo": "2", "skos:prefLabel": { "@language": "en", - "@value": "Argo eq. CANADA" + "@value": "Argo eq CANADA" }, "dc:identifier": "SDN:R41::R4100009", "skos:note": { @@ -2018,6 +2011,40 @@ }, "@type": "skos:Concept" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100053/", + "pav:hasVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100053/1/" + }, + "pav:authoredOn": "2026-04-29 13:06:42.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100053/2/" + }, + "dce:identifier": "SDN:R41::R4100053", + "pav:version": "2", + "skos:notation": "SDN:R41::R4100053", + "skos:altLabel": "", + "dc:date": "2026-04-29 13:06:42.0", + "owl:versionInfo": "2", + "skos:prefLabel": { + "@language": "en", + "@value": "Concept created in error" + }, + "dc:identifier": "SDN:R41::R4100053", + "skos:note": { + "@language": "en", + "@value": "deprecated" + }, + "owl:deprecated": "true", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": { + "@language": "en", + "@value": "Concept created in error" + }, + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100030/", "pav:authoredOn": "2026-03-19 11:04:26.0", @@ -2255,9 +2282,6 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100028/" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100061/" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100003/" }, @@ -2336,9 +2360,6 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100032/" }, - { - "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100053/" - }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100022/" }, @@ -2384,6 +2405,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100016/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100061/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100012/" }, @@ -2405,6 +2429,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100057/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100053/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R41/current/R4100030/" }, @@ -2429,8 +2456,8 @@ "dc:description": "List of Argo floats managed under the same lead agency. A program is bound to one country, one or several agencies with defined roles, and has contact points with defined roles. The same agency can implement multiple programs. Some cases such as EuroArgo (European Research Infrastructure Consortium) use a multinational agency and \"Europe\" as country. Argo netCDF variable PROGRAM_NAME is populated by R41 prefLabel.", "dc:title": "Argo program name", "skos:prefLabel": "Argo program name", - "owl:versionInfo": "3", - "dc:date": "2026-04-10 03:00:01.0", + "owl:versionInfo": "5", + "dc:date": "2026-05-01 03:00:00.0", "skos:altLabel": "PROGRAM_NAME", "dc:creator": "GOOS/OceanOPS Vocabulary Governance", "dc:alternative": "PROGRAM_NAME", 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 a842c6d..e512b7f 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,2 +1 @@ -2026-04-21T09:24:48.256314 -manual fixes done on R01, R08, R23, R25, R27 \ No newline at end of file +2026-06-15T11:11:49.919849 \ No newline at end of file diff --git a/file_checker_spec/NVS/R03.jsonld b/file_checker_spec/NVS/R03.jsonld index d982df3..4ecdeec 100644 --- a/file_checker_spec/NVS/R03.jsonld +++ b/file_checker_spec/NVS/R03.jsonld @@ -39,6 +39,37 @@ }, "pav:authoredOn": "2025-11-26 10:16:04.0" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE665/", + "pav:authoredOn": "2026-06-11 09:21:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE665/1/" + }, + "dce:identifier": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE665", + "pav:version": "1", + "skos:notation": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE665", + "skos:altLabel": "RAW_DOWNWELLING_IRRADIANCE665", + "dc:date": "2026-06-11 09:21:52.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Raw downwelling irradiance at 665 nanometers" + }, + "dc:identifier": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE665", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": { + "@language": "en", + "@value": "Raw downwelling irradiance signal at 665 nm wavelength. Local_Attributes:{long_name:Raw downwelling irradiance at 665 nanometers; standard_name:-; units:count; valid_min:-; valid_max:-; fill_value:NC_FILL_DOUBLE}. Properties:{category:ib; data_type:double}" + }, + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_OCR/", "pav:hasVersion": [ @@ -268,6 +299,37 @@ }, "pav:authoredOn": "2025-11-25 10:14:03.0" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE670/", + "pav:authoredOn": "2026-06-11 09:21:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE670/1/" + }, + "dce:identifier": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE670", + "pav:version": "1", + "skos:notation": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE670", + "skos:altLabel": "RAW_DOWNWELLING_IRRADIANCE670", + "dc:date": "2026-06-11 09:21:52.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Raw downwelling irradiance at 670 nanometers" + }, + "dc:identifier": "SDN:R03::RAW_DOWNWELLING_IRRADIANCE670", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": { + "@language": "en", + "@value": "Raw downwelling irradiance signal at 670 nm wavelength. Local_Attributes:{long_name:Raw downwelling irradiance at 670 nanometers; standard_name:-; units:count; valid_min:-; valid_max:-; fill_value:NC_FILL_DOUBLE}. Properties:{category:ib; data_type:double}" + }, + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/", "pav:hasVersion": [ @@ -310,6 +372,37 @@ }, "pav:authoredOn": "2026-05-18 09:45:19.0" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/DOWN_IRRADIANCE670/", + "pav:authoredOn": "2026-06-11 09:21:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/DOWN_IRRADIANCE670/1/" + }, + "dce:identifier": "SDN:R03::DOWN_IRRADIANCE670", + "pav:version": "1", + "skos:notation": "SDN:R03::DOWN_IRRADIANCE670", + "skos:altLabel": "DOWN_IRRADIANCE670", + "dc:date": "2026-06-11 09:21:52.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Downwelling irradiance at 670 nanometers" + }, + "dc:identifier": "SDN:R03::DOWN_IRRADIANCE670", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": { + "@language": "en", + "@value": "Downwelling irradiance at 670 nm wavelength, reported by OCR504 sensor (unit conversion). Local_Attributes:{long_name:Downwelling irradiance at 670 nanometers; standard_name:-; units:W/m^2/nm; valid_min:-; valid_max:-; fill_value:99999.f}. Properties:{category:b; data_type:float}" + }, + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_SUNA/", "pav:hasVersion": [ @@ -466,6 +559,37 @@ }, "pav:authoredOn": "2025-11-25 10:14:02.0" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/BDOWN_IRRADIANCE665/", + "pav:authoredOn": "2026-06-11 09:21:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/BDOWN_IRRADIANCE665/1/" + }, + "dce:identifier": "SDN:R03::BDOWN_IRRADIANCE665", + "pav:version": "1", + "skos:notation": "SDN:R03::BDOWN_IRRADIANCE665", + "skos:altLabel": "DOWN_IRRADIANCE665", + "dc:date": "2026-06-11 09:21:52.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Downwelling irradiance at 665 nanometers" + }, + "dc:identifier": "SDN:R03::BDOWN_IRRADIANCE665", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": { + "@language": "en", + "@value": "Downwelling irradiance at 665 nm wavelength, reported by OCR504 sensor (unit conversion). Local_Attributes:{long_name:Downwelling irradiance at 665 nanometers; standard_name:-; units:W/m^2/nm; valid_min:-; valid_max:-; fill_value:99999.f}. Properties:{category:b; data_type:float}" + }, + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_CYC/", "pav:hasVersion": [ @@ -4393,6 +4517,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_DURAFET/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE665/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_OCR/" }, @@ -4411,9 +4538,15 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_CTD/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/RAW_DOWNWELLING_IRRADIANCE670/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_MCOMS/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/DOWN_IRRADIANCE670/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_SUNA/" }, @@ -4426,6 +4559,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/CHLA_FLUORESCENCE/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R03/current/BDOWN_IRRADIANCE665/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R03/current/NB_SAMPLE_CYC/" }, @@ -4696,8 +4832,8 @@ "dc:description": "Terms describing individual measured parameters or phenomena, used to mark up sets of data in Argo netCDF arrays. Argo netCDF variables PARAMETER, STATION_PARAMETERS, HISTORY_PARAMETER and TRAJECTORY_PARAMETERS are populated by R03 altLabel. R03 altLabel is also used to name netCDF variables. Detailed information (incl. about Local_Attributes and Properties) is in the user manual (https://dx.doi.org/10.13155/29825), in the Reference Table 3 section.", "dc:title": "Argo parameter codes", "skos:prefLabel": "Argo parameter codes", - "owl:versionInfo": "14", - "dc:date": "2026-05-19 03:00:01.0", + "owl:versionInfo": "15", + "dc:date": "2026-06-12 03:00:01.0", "skos:altLabel": "PARAMETER", "dc:creator": "Argo Data Management Team", "dc:alternative": "PARAMETER", diff --git a/file_checker_spec/NVS/R40.jsonld b/file_checker_spec/NVS/R40.jsonld index ba8f629..a0d97b8 100644 --- a/file_checker_spec/NVS/R40.jsonld +++ b/file_checker_spec/NVS/R40.jsonld @@ -168,6 +168,34 @@ "skos:definition": "", "@type": "skos:Concept" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0291/", + "pav:authoredOn": "2026-06-11 09:21:52.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0291/1/" + }, + "dce:identifier": "SDN:R40::PI0291", + "pav:version": "1", + "skos:notation": "SDN:R40::PI0291", + "skos:altLabel": "Xavier COUVELARD", + "dc:date": "2026-06-11 09:21:52.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Xavier COUVELARD" + }, + "dc:identifier": "SDN:R40::PI0291", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": "", + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0176/", "pav:authoredOn": "2023-06-22 12:58:04.0", @@ -5730,6 +5758,34 @@ "skos:definition": "", "@type": "skos:Concept" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0290/", + "pav:authoredOn": "2026-06-02 09:28:32.0", + "pav:hasCurrentVersion": { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0290/1/" + }, + "dce:identifier": "SDN:R40::PI0290", + "pav:version": "1", + "skos:notation": "SDN:R40::PI0290", + "skos:altLabel": "Alexandre BARBONI", + "dc:date": "2026-06-02 09:28:32.0", + "owl:versionInfo": "1", + "skos:prefLabel": { + "@language": "en", + "@value": "Alexandre BARBONI" + }, + "dc:identifier": "SDN:R40::PI0290", + "skos:note": { + "@language": "en", + "@value": "accepted" + }, + "owl:deprecated": "false", + "void:inDataset": { + "@id": "http://vocab.nerc.ac.uk/.well-known/void" + }, + "skos:definition": "", + "@type": "skos:Concept" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0232/", "pav:authoredOn": "2024-04-25 11:42:03.0", @@ -8146,6 +8202,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0006/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0291/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0176/" }, @@ -8740,6 +8799,9 @@ { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0116/" }, + { + "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0290/" + }, { "@id": "http://vocab.nerc.ac.uk/collection/R40/current/PI0232/" }, @@ -9001,8 +9063,8 @@ "dc:description": "List of Principal Investigator (PI) names in charge of Argo floats. Argo netCDF variable PI_NAME is populated by R40 altLabel.", "dc:title": "Argo Principal Investigator (PI) names", "skos:prefLabel": "Argo Principal Investigator (PI) names", - "owl:versionInfo": "12", - "dc:date": "2026-05-20 03:00:01.0", + "owl:versionInfo": "14", + "dc:date": "2026-06-12 03:00:01.0", "skos:altLabel": "PI_NAME", "dc:creator": "Argo Data Management Team", "dc:alternative": "PI_NAME", diff --git a/file_checker_spec/NVS/dateOfUpdate.txt b/file_checker_spec/NVS/dateOfUpdate.txt index 37b0c04..e512b7f 100644 --- a/file_checker_spec/NVS/dateOfUpdate.txt +++ b/file_checker_spec/NVS/dateOfUpdate.txt @@ -1 +1 @@ -2026-05-20T12:05:36.413359 \ No newline at end of file +2026-06-15T11:11:49.919849 \ No newline at end of file