From 729d3f9d565c525611e4228cd4881ad794c066d2 Mon Sep 17 00:00:00 2001 From: sgiannopoulos Date: Fri, 3 May 2024 13:31:15 +0300 Subject: [PATCH] update commons --- .../rda/model/rda/mapper/CostRDAMapper.java | 79 ++++--- .../model/rda/mapper/DatasetIdRDAMapper.java | 47 ++-- .../model/rda/mapper/DatasetRDAMapper.java | 208 +++++++++--------- .../rda/mapper/DistributionRDAMapper.java | 161 +++++++------- .../rda/model/rda/mapper/HostRDAMapper.java | 144 ++++++------ .../model/rda/mapper/MetadataRDAMapper.java | 99 ++++----- .../mapper/SecurityAndPrivacyRDAMapper.java | 52 ++--- .../mapper/TechnicalResourceRDAMapper.java | 53 ++--- .../TemplateFieldSearcherService.java | 5 +- .../TemplateFieldSearcherServiceImpl.java | 75 ++++++- pom.xml | 2 +- 11 files changed, 497 insertions(+), 428 deletions(-) diff --git a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/CostRDAMapper.java b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/CostRDAMapper.java index 5926d2c..a95b627 100644 --- a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/CostRDAMapper.java +++ b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/CostRDAMapper.java @@ -15,55 +15,50 @@ import java.util.stream.Collectors; public class CostRDAMapper{ private static final Logger logger = LoggerFactory.getLogger(DatasetRDAMapper.class); - public List toRDA(List nodes, List valueFields ) { + public List toRDA(Map> nodes, List valueFields ) { if (nodes == null) return null; if (valueFields == null) throw new IllegalArgumentException("valueFields is missing"); Map rdaMap = new HashMap<>(); - for(FieldModel node: nodes){ - String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dmp.cost")).findFirst().orElse(""); - org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x-> x.getId().equals(node.getId())).findFirst().orElse(null); - if(rdaValue == null || rdaValue.getTextValue() == null || rdaValue.getTextValue().isBlank()){ - continue; - } - String key = node.getNumbering(); + for(Map.Entry> entry: nodes.entrySet()){ + for(FieldModel node: entry.getValue()) { + String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dmp.cost")).findFirst().orElse(""); + org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x -> x.getId().equals(node.getId())).findFirst().orElse(null); + if (rdaValue == null || rdaValue.getTextValue() == null || rdaValue.getTextValue().isBlank()) { + continue; + } + String key = entry.getKey(); - if(!key.contains("mult")){ - key = "0"; - } - else{ - key = "" + key.charAt(4); - } - Cost rda; - if(rdaMap.containsKey(key)){ - rda = rdaMap.get(key); - } - else{ - rda = new Cost(); - rdaMap.put(key, rda); - } - if(rdaProperty.contains("value")){ - try { - rda.setValue(Double.valueOf(rdaValue.getTextValue())); + if (!key.contains("mult")) { + key = "0"; + } else { + key = "" + key.charAt(4); } - catch (NumberFormatException e) { - logger.warn("Dmp cost value " + rdaValue + " is not valid. Cost value will not be set."); + Cost rda; + if (rdaMap.containsKey(key)) { + rda = rdaMap.get(key); + } else { + rda = new Cost(); + rdaMap.put(key, rda); } - } - else if(rdaProperty.contains("currency_code")){ - try { + if (rdaProperty.contains("value")) { + try { + rda.setValue(Double.valueOf(rdaValue.getTextValue())); + } catch (NumberFormatException e) { + logger.warn("Dmp cost value " + rdaValue + " is not valid. Cost value will not be set."); + } + } else if (rdaProperty.contains("currency_code")) { + try { // HashMap result = // new ObjectMapper().readValue(rdaValue, HashMap.class); // rda.setCurrencyCode(Cost.CurrencyCode.fromValue(result.get("value"))); - rda.setCurrencyCode(Cost.CurrencyCode.fromValue(rdaValue.getTextValue())); //TODO - } - catch (Exception e) { - logger.warn("Dmp cost currency code is not valid and will not be set."); - } - } - else if(rdaProperty.contains("title")){ - rda.setTitle(rdaValue.getTextValue()); - + rda.setCurrencyCode(Cost.CurrencyCode.fromValue(rdaValue.getTextValue())); //TODO + } catch (Exception e) { + logger.warn("Dmp cost currency code is not valid and will not be set."); + } + } else if (rdaProperty.contains("title")) { + rda.setTitle(rdaValue.getTextValue()); + // Iterator iter = mapper.readTree(rdaValue).elements(); //TODO // StringBuilder title = new StringBuilder(); // while(iter.hasNext()){ @@ -84,9 +79,9 @@ public class CostRDAMapper{ // rda.setTitle(t + ", " + rdaValue); // } // } - } - else if(rdaProperty.contains("description")){ - rda.setDescription(rdaValue.getTextValue()); + } else if (rdaProperty.contains("description")) { + rda.setDescription(rdaValue.getTextValue()); + } } } List rdaList = rdaMap.values().stream() diff --git a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DatasetIdRDAMapper.java b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DatasetIdRDAMapper.java index b42190c..342ac96 100644 --- a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DatasetIdRDAMapper.java +++ b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DatasetIdRDAMapper.java @@ -14,34 +14,35 @@ public class DatasetIdRDAMapper{ private static final Logger logger = LoggerFactory.getLogger(DatasetIdRDAMapper.class); - public DatasetId toRDA(List nodes, List valueFields) { + public DatasetId toRDA(Map> nodes, List valueFields) { if (nodes == null) return null; if (valueFields == null) throw new IllegalArgumentException("valueFields is missing"); DatasetId data = new DatasetId(); - for (FieldModel node: nodes) { - String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dataset.dataset_id")).findFirst().orElse(""); - if (node.getData() == null) { - continue; + for (Map.Entry> entry: nodes.entrySet()) { + for (FieldModel node: entry.getValue()) { + String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dataset.dataset_id")).findFirst().orElse(""); + if (node.getData() == null) { + continue; + } + org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x -> x.getId().equals(node.getId())).findFirst().orElse(null); + if (rdaValue == null || rdaValue.getTextValue() == null || rdaValue.getTextValue().isBlank()) { + continue; + } + finalRDAMap(data, rdaProperty, rdaValue.getTextValue()); + // try { //TODO + // Map values = mapper.readValue(rdaValue, HashMap.class); //TODO + // if (!values.isEmpty()) { + // values.entrySet().forEach(entry -> finalRDAMap(data, entry.getKey(), (String) entry.getValue())); + // } else { + // finalRDAMap(data, rdaProperty, rdaValue.getTextValue()); + // } + // } catch (IOException e) { + // logger.warn(e.getMessage() + ".Passing value as is"); + // finalRDAMap(data, rdaProperty, rdaValue.getTextValue()); + // + // } } - org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x-> x.getId().equals(node.getId())).findFirst().orElse(null); - if(rdaValue == null || rdaValue.getTextValue() == null || rdaValue.getTextValue().isBlank()){ - continue; - } - finalRDAMap(data, rdaProperty, rdaValue.getTextValue()); -// try { //TODO -// Map values = mapper.readValue(rdaValue, HashMap.class); //TODO -// if (!values.isEmpty()) { -// values.entrySet().forEach(entry -> finalRDAMap(data, entry.getKey(), (String) entry.getValue())); -// } else { -// finalRDAMap(data, rdaProperty, rdaValue.getTextValue()); -// } -// } catch (IOException e) { -// logger.warn(e.getMessage() + ".Passing value as is"); -// finalRDAMap(data, rdaProperty, rdaValue.getTextValue()); -// -// } - } if (data.getIdentifier() != null && data.getType() != null) { diff --git a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DatasetRDAMapper.java b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DatasetRDAMapper.java index 7ff5fd2..51f7318 100644 --- a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DatasetRDAMapper.java +++ b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DatasetRDAMapper.java @@ -92,39 +92,42 @@ public class DatasetRDAMapper { //Map templateIdsToValues = this.createFieldIdValueMap(descriptionEntity.getDescriptionTemplate()); //rda.setAdditionalProperty("template", descriptionEntity.getDescriptionTemplate()); //TODO try { - List idNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.dataset_id"); + Map> idNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.dataset_id"); if (!idNodes.isEmpty()) { rda.setDatasetId(datasetIdRDAMapper.toRDA(idNodes, this.getAllValueFields(descriptionEntity.getProperties()))); } if (rda.getDatasetId() == null) { rda.setDatasetId(new DatasetId(descriptionEntity.getId().toString(), DatasetId.Type.OTHER)); } - - List typeNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.type"); - for (FieldModel typeNode : typeNodes){ - List fieldValues = this.findValueField(typeNode, descriptionEntity.getProperties()); - if (!fieldValues.isEmpty()) rda.setType(fieldValues.stream().filter(x-> x.getTextValue() != null && x.getTextValue().isBlank()).map(org.opencdmp.commonmodels.models.description.FieldModel::getTextValue).findFirst().orElse(null)); - if (rda.getType() != null && !rda.getType().isBlank()) break;; + + Map> typeNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.type"); + for (Map.Entry> entry : typeNodes.entrySet()){ + for (FieldModel typeNode : entry.getValue()) { + List fieldValues = this.findValueField(typeNode, descriptionEntity.getProperties()); + if (!fieldValues.isEmpty()) rda.setType(fieldValues.stream().filter(x -> x.getTextValue() != null && x.getTextValue().isBlank()).map(org.opencdmp.commonmodels.models.description.FieldModel::getTextValue).findFirst().orElse(null)); + if (rda.getType() != null && !rda.getType().isBlank()) break; + } } if (rda.getType() == null || rda.getType().isBlank()) rda.setType("DMP Dataset"); - - - - List languageNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.language"); - for (FieldModel languageNode : languageNodes){ - List fieldValues = this.findValueField(languageNode, descriptionEntity.getProperties()); - try { - if (!fieldValues.isEmpty()) rda.setLanguage(fieldValues.stream().filter(x -> x.getTextValue() != null && x.getTextValue().isBlank()).map(x -> Language.fromValue(x.getTextValue())).findFirst().orElse(null)); + + + + Map> languageNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.language"); + for (Map.Entry> entry : languageNodes.entrySet()){ + for (FieldModel languageNode : entry.getValue()) { + List fieldValues = this.findValueField(languageNode, descriptionEntity.getProperties()); + try { + if (!fieldValues.isEmpty()) rda.setLanguage(fieldValues.stream().filter(x -> x.getTextValue() != null && x.getTextValue().isBlank()).map(x -> Language.fromValue(x.getTextValue())).findFirst().orElse(null)); + } catch (IllegalArgumentException e) { + logger.warn("Language from semantic rda.dataset.language was not found."); + } + if (rda.getLanguage() != null) break; } - catch (IllegalArgumentException e){ - logger.warn("Language from semantic rda.dataset.language was not found."); - } - if (rda.getLanguage() != null) break;; } if (rda.getLanguage() == null) rda.setLanguage(languageRDAMapper.toRDA(descriptionEntity.getDescriptionTemplate().getLanguage())); - - - List metadataNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.metadata"); + + + Map> metadataNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.metadata"); if (!metadataNodes.isEmpty()) { Map valueFieldsMap = new HashMap<>(); valueFieldsMap.put("valueFields", this.getAllValueFields(descriptionEntity.getProperties())); @@ -173,15 +176,17 @@ public class DatasetRDAMapper { // } - List preservationNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.preservation_statement"); - for (FieldModel preservationNode : preservationNodes){ - List fieldValues = this.findValueField(preservationNode, descriptionEntity.getProperties()); - if (!fieldValues.isEmpty()) rda.setPreservationStatement(fieldValues.stream().filter(x-> x.getTextValue() != null && x.getTextValue().isBlank()).map(org.opencdmp.commonmodels.models.description.FieldModel::getTextValue).findFirst().orElse(null)); - if (rda.getPreservationStatement() != null && !rda.getPreservationStatement().isBlank()) break;; + Map> preservationNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.preservation_statement"); + for (Map.Entry> entry : preservationNodes.entrySet()){ + for (FieldModel preservationNode : entry.getValue()){ + List fieldValues = this.findValueField(preservationNode, descriptionEntity.getProperties()); + if (!fieldValues.isEmpty()) rda.setPreservationStatement(fieldValues.stream().filter(x-> x.getTextValue() != null && x.getTextValue().isBlank()).map(org.opencdmp.commonmodels.models.description.FieldModel::getTextValue).findFirst().orElse(null)); + if (rda.getPreservationStatement() != null && !rda.getPreservationStatement().isBlank()) break; + } } - - List distributionNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.distribution"); + + Map> distributionNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.distribution"); if (!distributionNodes.isEmpty()) { rda.setDistribution(distributionRDAMapper.toRDA(distributionNodes, this.getAllValueFields(descriptionEntity.getProperties()))); }else{ @@ -189,17 +194,19 @@ public class DatasetRDAMapper { } - List keywordNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.keyword"); - for (FieldModel keywordNode : keywordNodes){ - List fieldValues = this.findValueField(keywordNode, descriptionEntity.getProperties()); - if (!fieldValues.isEmpty()) { - rda.setKeyword(fieldValues.stream().filter(x -> (x.getTextValue() != null && x.getTextValue().isBlank()) || (x.getTextListValue() != null && !x.getTextListValue().isEmpty())).map(x -> { - if (x.getTextListValue() != null && !x.getTextListValue().isEmpty()) { - return x.getTextListValue().stream().map(node -> keywordRDAMapper.toRDA(node)).collect(Collectors.toList()); - } else { - return List.of(keywordRDAMapper.toRDA(x.getTextValue())); - } - }).filter(Objects::nonNull).flatMap(Collection::stream).collect(Collectors.toList())); + Map> keywordNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.keyword"); + for (Map.Entry> entry : keywordNodes.entrySet()) { + for (FieldModel keywordNode : entry.getValue()) { + List fieldValues = this.findValueField(keywordNode, descriptionEntity.getProperties()); + if (!fieldValues.isEmpty()) { + rda.setKeyword(fieldValues.stream().filter(x -> (x.getTextValue() != null && x.getTextValue().isBlank()) || (x.getTextListValue() != null && !x.getTextListValue().isEmpty())).map(x -> { + if (x.getTextListValue() != null && !x.getTextListValue().isEmpty()) { + return x.getTextListValue().stream().map(node -> keywordRDAMapper.toRDA(node)).collect(Collectors.toList()); + } else { + return List.of(keywordRDAMapper.toRDA(x.getTextValue())); + } + }).filter(Objects::nonNull).flatMap(Collection::stream).collect(Collectors.toList())); + } } } if (rda.getKeyword() != null){ @@ -214,40 +221,46 @@ public class DatasetRDAMapper { // List tags = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(descriptionEntity.getId().toString()).getTags().stream().map(Tag::getName).collect(Collectors.toList()); // rda.setKeyword(tags); // } - List personalDataNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.sensitive_data"); - for (FieldModel personalDataNode : personalDataNodes){ - List fieldValues = this.findValueField(personalDataNode, descriptionEntity.getProperties()); - if (!fieldValues.isEmpty()) rda.setPersonalData(fieldValues.stream().filter(x-> x.getTextValue() != null && x.getTextValue().isBlank()).map(x-> Dataset.PersonalData.fromValue(x.getTextValue())).findFirst().orElse(null)); - if (rda.getPersonalData() != null) break; + Map> personalDataNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.sensitive_data"); + for (Map.Entry> entry : personalDataNodes.entrySet()) { + for (FieldModel personalDataNode : entry.getValue()) { + List fieldValues = this.findValueField(personalDataNode, descriptionEntity.getProperties()); + if (!fieldValues.isEmpty()) rda.setPersonalData(fieldValues.stream().filter(x -> x.getTextValue() != null && x.getTextValue().isBlank()).map(x -> Dataset.PersonalData.fromValue(x.getTextValue())).findFirst().orElse(null)); + if (rda.getPersonalData() != null) break; + } } if (rda.getPersonalData() != null) rda.setPersonalData(Dataset.PersonalData.UNKNOWN); - - List securityAndPrivacyNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.security_and_privacy"); + + Map> securityAndPrivacyNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.security_and_privacy"); if (!securityAndPrivacyNodes.isEmpty()) { rda.setSecurityAndPrivacy(securityAndPrivacyRDAMapper.toRDA(securityAndPrivacyNodes, this.getAllValueFields(descriptionEntity.getProperties()))); }else{ rda.setSecurityAndPrivacy(new ArrayList<>()); } - List sensitiveDataNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.sensitive_data"); - for (FieldModel sensitiveDataNode : sensitiveDataNodes){ - List fieldValues = this.findValueField(sensitiveDataNode, descriptionEntity.getProperties()); - if (!fieldValues.isEmpty()) rda.setSensitiveData(fieldValues.stream().filter(x-> x.getTextValue() != null && x.getTextValue().isBlank()).map(x-> Dataset.SensitiveData.fromValue(x.getTextValue())).findFirst().orElse(null)); - if (rda.getSensitiveData() != null) break; + Map> sensitiveDataNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.sensitive_data"); + for (Map.Entry> entry : sensitiveDataNodes.entrySet()) { + for (FieldModel sensitiveDataNode : entry.getValue()) { + List fieldValues = this.findValueField(sensitiveDataNode, descriptionEntity.getProperties()); + if (!fieldValues.isEmpty()) rda.setSensitiveData(fieldValues.stream().filter(x -> x.getTextValue() != null && x.getTextValue().isBlank()).map(x -> Dataset.SensitiveData.fromValue(x.getTextValue())).findFirst().orElse(null)); + if (rda.getSensitiveData() != null) break; + } } if (rda.getSensitiveData() != null) rda.setSensitiveData(Dataset.SensitiveData.UNKNOWN); - - List technicalResourceNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.technical_resource"); + + Map> technicalResourceNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.technical_resource"); if (!technicalResourceNodes.isEmpty()) { rda.setTechnicalResource(technicalResourceRDAMapper.toRDA(technicalResourceNodes, this.getAllValueFields(descriptionEntity.getProperties()))); }else{ rda.setTechnicalResource(new ArrayList<>()); } - List issuedNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.issued"); - for (FieldModel issuedNode : issuedNodes){ - List fieldValues = this.findValueField(issuedNode, descriptionEntity.getProperties()); - if (!fieldValues.isEmpty()) rda.setIssued(fieldValues.stream().filter(x-> x.getTextValue() != null && x.getTextValue().isBlank()).map(org.opencdmp.commonmodels.models.description.FieldModel::getTextValue).findFirst().orElse(null)); - if (rda.getIssued() != null && !rda.getIssued().isBlank()) break;; + Map> issuedNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dataset.issued"); + for (Map.Entry> entry : issuedNodes.entrySet()) { + for (FieldModel issuedNode : entry.getValue()) { + List fieldValues = this.findValueField(issuedNode, descriptionEntity.getProperties()); + if (!fieldValues.isEmpty()) rda.setIssued(fieldValues.stream().filter(x -> x.getTextValue() != null && x.getTextValue().isBlank()).map(org.opencdmp.commonmodels.models.description.FieldModel::getTextValue).findFirst().orElse(null)); + if (rda.getIssued() != null && !rda.getIssued().isBlank()) break; + } } //TODO @@ -267,50 +280,49 @@ public class DatasetRDAMapper { // }).filter(Objects::nonNull).flatMap(Collection::stream).toList()); // dmp.setContributor(dmp.getContributor().stream().filter(contributor -> contributor.getContributorId() != null && contributor.getName() != null).collect(Collectors.toList())); // } - List costNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dmp.cost"); + Map> costNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dmp.cost"); if (!costNodes.isEmpty()) { dmp.getCost().addAll(costRDAMapper.toRDA(costNodes, this.getAllValueFields(descriptionEntity.getProperties()))); } - List ethicsNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dmp.ethical_issues"); + Map> ethicsNodes = this.templateFieldSearcherService.searchFieldsBySemantics(descriptionEntity.getDescriptionTemplate(), "rda.dmp.ethical_issues"); if (!ethicsNodes.isEmpty()) { - for(FieldModel node: ethicsNodes){ - List fieldValues = this.findValueField(node, descriptionEntity.getProperties()); - org.opencdmp.commonmodels.models.description.FieldModel fieldValue = fieldValues.getFirst(); - String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dmp.ethical_issues")).findFirst().orElse(""); - if (fieldValue == null) { - continue; - } - String rdaValue = fieldValue.getTextValue(); - if(rdaValue == null || rdaValue.isEmpty()){ - continue; - } - if(rdaProperty.contains("exist")){ - try { - Dmp.EthicalIssuesExist exists = dmp.getEthicalIssuesExist(); - if(exists == null - || ((exists == Dmp.EthicalIssuesExist.NO || exists == Dmp.EthicalIssuesExist.UNKNOWN) && rdaValue.equals("yes")) - || (exists == Dmp.EthicalIssuesExist.YES && !(rdaValue.equals("no") || rdaValue.equals("unknown"))) - || (exists == Dmp.EthicalIssuesExist.UNKNOWN && rdaValue.equals("no"))){ - dmp.setEthicalIssuesExist(Dmp.EthicalIssuesExist.fromValue(rdaValue)); + for(Map.Entry> entry: ethicsNodes.entrySet()) { + for (FieldModel node : entry.getValue()) { + List fieldValues = this.findValueField(node, descriptionEntity.getProperties()); + org.opencdmp.commonmodels.models.description.FieldModel fieldValue = fieldValues.getFirst(); + String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dmp.ethical_issues")).findFirst().orElse(""); + if (fieldValue == null) { + continue; + } + String rdaValue = fieldValue.getTextValue(); + if (rdaValue == null || rdaValue.isEmpty()) { + continue; + } + if (rdaProperty.contains("exist")) { + try { + Dmp.EthicalIssuesExist exists = dmp.getEthicalIssuesExist(); + if (exists == null + || ((exists == Dmp.EthicalIssuesExist.NO || exists == Dmp.EthicalIssuesExist.UNKNOWN) && rdaValue.equals("yes")) + || (exists == Dmp.EthicalIssuesExist.YES && !(rdaValue.equals("no") || rdaValue.equals("unknown"))) + || (exists == Dmp.EthicalIssuesExist.UNKNOWN && rdaValue.equals("no"))) { + dmp.setEthicalIssuesExist(Dmp.EthicalIssuesExist.fromValue(rdaValue)); + } + } catch (IllegalArgumentException e) { + logger.warn(e.getLocalizedMessage() + ". Setting ethical_issues_exist to unknown"); + dmp.setEthicalIssuesExist(Dmp.EthicalIssuesExist.UNKNOWN); + } + } else if (rdaProperty.contains("description")) { + if (dmp.getEthicalIssuesDescription() == null) { + dmp.setEthicalIssuesDescription(rdaValue); + } else { + dmp.setEthicalIssuesDescription(dmp.getEthicalIssuesDescription() + ", " + rdaValue); + } + } else if (rdaProperty.contains("report")) { + try { + dmp.setEthicalIssuesReport(URI.create(rdaValue)); + } catch (IllegalArgumentException e) { + logger.warn(e.getLocalizedMessage() + ". Skipping url parsing"); } - }catch(IllegalArgumentException e){ - logger.warn(e.getLocalizedMessage() + ". Setting ethical_issues_exist to unknown"); - dmp.setEthicalIssuesExist(Dmp.EthicalIssuesExist.UNKNOWN); - } - } - else if(rdaProperty.contains("description")){ - if(dmp.getEthicalIssuesDescription() == null){ - dmp.setEthicalIssuesDescription(rdaValue); - } - else{ - dmp.setEthicalIssuesDescription(dmp.getEthicalIssuesDescription() + ", " + rdaValue); - } - } - else if(rdaProperty.contains("report")){ - try { - dmp.setEthicalIssuesReport(URI.create(rdaValue)); - } catch (IllegalArgumentException e) { - logger.warn(e.getLocalizedMessage() + ". Skipping url parsing"); } } } diff --git a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DistributionRDAMapper.java b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DistributionRDAMapper.java index e439a4c..b03c9fb 100644 --- a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DistributionRDAMapper.java +++ b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DistributionRDAMapper.java @@ -22,84 +22,82 @@ public class DistributionRDAMapper { this.hostRDAMapper = hostRDAMapper; } - public List toRDA(List nodes, List valueFields) { + public List toRDA(Map> nodes, List valueFields) { if (nodes == null) return null; if (valueFields == null) throw new IllegalArgumentException("valueFields is missing"); Map rdaMap = new HashMap<>(); - for (FieldModel node: nodes) { - String rdaProperty = getRdaDistributionProperty(node); - if(rdaProperty.isEmpty() || node.getData() == null){ - continue; - } + for (Map.Entry> entry: nodes.entrySet()) { + for (FieldModel node: entry.getValue()) { + String rdaProperty = getRdaDistributionProperty(node); + if (rdaProperty.isEmpty() || node.getData() == null) { + continue; + } - org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x-> x.getId().equals(node.getId())).findFirst().orElse(null); - if(rdaValue == null || (rdaValue.getTextValue() == null && rdaValue.getReferences() == null)){ - continue; - } - String key = node.getNumbering(); - if(!key.contains("mult")){ - key = "0"; - } - else{ - key = "" + key.charAt(4); - } - Distribution rda; - if(rdaMap.containsKey(key)){ - rda = rdaMap.get(key); - } - else { - rda = new Distribution(); - rdaMap.put(key, rda); - } - for (ExportPropertyName exportPropertyName : ExportPropertyName.values()) { - if (rdaProperty.contains(exportPropertyName.getName())) { - switch (exportPropertyName) { - case ACCESS_URL: - rda.setAccessUrl(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.ACCESS_URL.getName(), node.getId()); - break; - case AVAILABLE_UNTIL: - rda.setAvailableUntil(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.AVAILABLE_UNTIL.getName(), node.getId()); - break; - case DOWNLOAD_URL: - rda.setDownloadUrl(URI.create(rdaValue.getTextValue())); - rda.setAdditionalProperty(ImportPropertyName.DOWNLOAD_URL.getName(), node.getId()); - break; - case DESCRIPTION: - if(!rdaProperty.contains("host")) { - rda.setDescription(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.DESCRIPTION.getName(), node.getId()); - } - break; - case DATA_ACCESS: - try { - rda.setDataAccess(Distribution.DataAccess.fromValue(rdaValue.getTextValue())); - rda.setAdditionalProperty(ImportPropertyName.DATA_ACCESS.getName(), node.getId()); - } - catch (IllegalArgumentException e) { - logger.warn("Distribution data access " + rdaValue + " from semantic distribution.data_access is not valid. Data access will not be set set."); - } - break; - case BYTE_SIZE: - rda.setByteSize(Integer.parseInt(rdaValue.getTextValue())); - rda.setAdditionalProperty(ImportPropertyName.BYTE_SIZE.getName(), node.getId()); - break; - case LICENSE: - List licenseNodes = nodes.stream().filter(lnode -> { - for(String schematic: lnode.getSchematics()){ - if(schematic.startsWith("rda.dataset.distribution.license")){ - return true; - } + org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x -> x.getId().equals(node.getId())).findFirst().orElse(null); + if (rdaValue == null || (rdaValue.getTextValue() == null && rdaValue.getReferences() == null)) { + continue; + } + String key = entry.getKey(); + if (!key.contains("mult")) { + key = "0"; + } else { + key = "" + key.charAt(4); + } + Distribution rda; + if (rdaMap.containsKey(key)) { + rda = rdaMap.get(key); + } else { + rda = new Distribution(); + rdaMap.put(key, rda); + } + for (ExportPropertyName exportPropertyName : ExportPropertyName.values()) { + if (rdaProperty.contains(exportPropertyName.getName())) { + switch (exportPropertyName) { + case ACCESS_URL: + rda.setAccessUrl(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.ACCESS_URL.getName(), node.getId()); + break; + case AVAILABLE_UNTIL: + rda.setAvailableUntil(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.AVAILABLE_UNTIL.getName(), node.getId()); + break; + case DOWNLOAD_URL: + rda.setDownloadUrl(URI.create(rdaValue.getTextValue())); + rda.setAdditionalProperty(ImportPropertyName.DOWNLOAD_URL.getName(), node.getId()); + break; + case DESCRIPTION: + if (!rdaProperty.contains("host")) { + rda.setDescription(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.DESCRIPTION.getName(), node.getId()); + } + break; + case DATA_ACCESS: + try { + rda.setDataAccess(Distribution.DataAccess.fromValue(rdaValue.getTextValue())); + rda.setAdditionalProperty(ImportPropertyName.DATA_ACCESS.getName(), node.getId()); + } catch (IllegalArgumentException e) { + logger.warn("Distribution data access " + rdaValue + " from semantic distribution.data_access is not valid. Data access will not be set set."); + } + break; + case BYTE_SIZE: + rda.setByteSize(Integer.parseInt(rdaValue.getTextValue())); + rda.setAdditionalProperty(ImportPropertyName.BYTE_SIZE.getName(), node.getId()); + break; + case LICENSE: + List licenseNodes = nodes.values().stream().flatMap(Collection::stream).filter(lnode -> { + for (String schematic : lnode.getSchematics()) { + if (schematic.startsWith("rda.dataset.distribution.license")) { + return true; } + } return false; - }).collect(Collectors.toList()); - License license = licenseRDAMapper.toRDA(licenseNodes, valueFields); - rda.setLicense(license != null? Collections.singletonList(license): new ArrayList<>()); - break; - case FORMAT: - //TODO + }).collect(Collectors.toList()); + License license = licenseRDAMapper.toRDA(licenseNodes, valueFields); + rda.setLicense(license != null ? Collections.singletonList(license) : new ArrayList<>()); + break; + case FORMAT: + //TODO // try { // JsonNode valueNode = mapper.readTree(node.getData().getValue()); // if(valueNode.isArray()){ @@ -131,16 +129,17 @@ public class DistributionRDAMapper { // catch(JsonProcessingException e){ // logger.warn(e.getMessage()); // } - break; - case TITLE: - if(!rdaProperty.contains("host")) { - rda.setTitle(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.TITLE.getName(), node.getId()); - } - break; - case HOST: - rda.setHost(hostRDAMapper.toRDA(nodes, valueFields, node.getNumbering())); - break; + break; + case TITLE: + if (!rdaProperty.contains("host")) { + rda.setTitle(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.TITLE.getName(), node.getId()); + } + break; + case HOST: + rda.setHost(hostRDAMapper.toRDA(nodes, valueFields, entry.getKey())); + break; + } } } } diff --git a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/HostRDAMapper.java b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/HostRDAMapper.java index 114509c..1f0162c 100644 --- a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/HostRDAMapper.java +++ b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/HostRDAMapper.java @@ -14,49 +14,49 @@ import java.util.*; public class HostRDAMapper { private static final Logger logger = LoggerFactory.getLogger(HostRDAMapper.class); - public Host toRDA(List nodes, List valueFields, String numbering){ + public Host toRDA(Map> nodes, List valueFields, String numbering){ if (nodes == null) return null; if (valueFields == null) throw new IllegalArgumentException("valueFields is missing"); Host rda = new Host(); - - for (FieldModel node: nodes) { - String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dataset.distribution.host")).findFirst().orElse(""); - if (rdaProperty.contains("host")) { - int firstDiff = MyStringUtils.getFirstDifference(numbering, node.getNumbering()); - if (firstDiff == -1 || firstDiff >= 2) { - org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x-> x.getId().equals(node.getId())).findFirst().orElse(null); - if(rdaValue == null || rdaValue.getTextValue() == null || rdaValue.getTextValue().isBlank()){ - continue; - } - for (ExportPropertyName propertyName: ExportPropertyName.values()) { - if (rdaProperty.contains(propertyName.getName())) { - switch (propertyName) { - case AVAILABILITY: - rda.setAvailability(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.AVAILABILITY.getName(), node.getId()); - break; - case BACKUP_FREQUENCY: - rda.setBackupFrequency(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.BACKUP_FREQUENCY.getName(), node.getId()); - break; - case BACKUP_TYPE: - rda.setBackupType(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.BACKUP_TYPE.getName(), node.getId()); - break; - case CERTIFIED_WITH: - try { - rda.setCertifiedWith(Host.CertifiedWith.fromValue(rdaValue.getTextValue())); - rda.setAdditionalProperty(ImportPropertyName.CERTIFIED_WITH.getName(), node.getId()); - } - catch (IllegalArgumentException e) { - logger.warn("Distribution host certified with " + rdaValue + "from semantic distribution.host.certified_with is not valid. Certified_with will not be set set."); - } - break; - case DESCRIPTION: - rda.setDescription(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.DESCRIPTION.getName(), node.getId()); - break; - case GEO_LOCATION: + + for (Map.Entry> entry: nodes.entrySet()) { + for (FieldModel node: entry.getValue()) { + String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dataset.distribution.host")).findFirst().orElse(""); + if (rdaProperty.contains("host")) { + int firstDiff = MyStringUtils.getFirstDifference(numbering, entry.getKey()); + if (firstDiff == -1 || firstDiff >= 2) { + org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x -> x.getId().equals(node.getId())).findFirst().orElse(null); + if (rdaValue == null || rdaValue.getTextValue() == null || rdaValue.getTextValue().isBlank()) { + continue; + } + for (ExportPropertyName propertyName : ExportPropertyName.values()) { + if (rdaProperty.contains(propertyName.getName())) { + switch (propertyName) { + case AVAILABILITY: + rda.setAvailability(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.AVAILABILITY.getName(), node.getId()); + break; + case BACKUP_FREQUENCY: + rda.setBackupFrequency(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.BACKUP_FREQUENCY.getName(), node.getId()); + break; + case BACKUP_TYPE: + rda.setBackupType(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.BACKUP_TYPE.getName(), node.getId()); + break; + case CERTIFIED_WITH: + try { + rda.setCertifiedWith(Host.CertifiedWith.fromValue(rdaValue.getTextValue())); + rda.setAdditionalProperty(ImportPropertyName.CERTIFIED_WITH.getName(), node.getId()); + } catch (IllegalArgumentException e) { + logger.warn("Distribution host certified with " + rdaValue + "from semantic distribution.host.certified_with is not valid. Certified_with will not be set set."); + } + break; + case DESCRIPTION: + rda.setDescription(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.DESCRIPTION.getName(), node.getId()); + break; + case GEO_LOCATION: // if (rdaValue.getTextValue().startsWith("{")) { // try { // rdaValue = mapper.readValue(rdaValue.getTextValue(), Map.class).get("id").toString(); @@ -71,11 +71,11 @@ public class HostRDAMapper { // catch (IllegalArgumentException e) { // logger.warn("Distribution host geo location " + rdaValue.getTextValue() + "from semantic distribution.host.geo_location is not valid. Geo location will not be set set."); // } - //TODO - rda.setGeoLocation(Host.GeoLocation.fromValue(rdaValue.getTextValue())); - rda.setAdditionalProperty(ImportPropertyName.GEO_LOCATION.getName(), node.getId()); - break; - case PID_SYSTEM: + //TODO + rda.setGeoLocation(Host.GeoLocation.fromValue(rdaValue.getTextValue())); + rda.setAdditionalProperty(ImportPropertyName.GEO_LOCATION.getName(), node.getId()); + break; + case PID_SYSTEM: // try{ // JsonNode valueNode = mapper.readTree(rdaValue.getTextValue()); // Iterator iter = valueNode.elements(); @@ -100,33 +100,33 @@ public class HostRDAMapper { // } catch (JsonProcessingException e) { // throw new RuntimeException(e); // } - //TODO - break; - case STORAGE_TYPE: - rda.setStorageType(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.STORAGE_TYPE.getName(), node.getId()); - break; - case SUPPORT_VERSIONING: - try { - rda.setSupportVersioning(Host.SupportVersioning.fromValue(rdaValue.getTextValue())); - rda.setAdditionalProperty(ImportPropertyName.SUPPORT_VERSIONING.getName(), node.getId()); - } - catch (IllegalArgumentException e) { - logger.warn("Distribution host support versioning " + rdaValue + "from semantic distribution.host.support_versioning is not valid. Support versioning will not be set set."); - } - break; - case TITLE: - rda.setTitle(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.TITLE.getName(), node.getId()); - break; - case URL: - try { - rda.setUrl(URI.create(rdaValue.getTextValue())); - rda.setAdditionalProperty(ImportPropertyName.URL.getName(), node.getId()); - } catch (IllegalArgumentException e) { - logger.warn(e.getLocalizedMessage() + ". Skipping url parsing"); - } - break; + //TODO + break; + case STORAGE_TYPE: + rda.setStorageType(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.STORAGE_TYPE.getName(), node.getId()); + break; + case SUPPORT_VERSIONING: + try { + rda.setSupportVersioning(Host.SupportVersioning.fromValue(rdaValue.getTextValue())); + rda.setAdditionalProperty(ImportPropertyName.SUPPORT_VERSIONING.getName(), node.getId()); + } catch (IllegalArgumentException e) { + logger.warn("Distribution host support versioning " + rdaValue + "from semantic distribution.host.support_versioning is not valid. Support versioning will not be set set."); + } + break; + case TITLE: + rda.setTitle(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.TITLE.getName(), node.getId()); + break; + case URL: + try { + rda.setUrl(URI.create(rdaValue.getTextValue())); + rda.setAdditionalProperty(ImportPropertyName.URL.getName(), node.getId()); + } catch (IllegalArgumentException e) { + logger.warn(e.getLocalizedMessage() + ". Skipping url parsing"); + } + break; + } } } } diff --git a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/MetadataRDAMapper.java b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/MetadataRDAMapper.java index 2d5d308..befec3b 100644 --- a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/MetadataRDAMapper.java +++ b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/MetadataRDAMapper.java @@ -22,68 +22,69 @@ public class MetadataRDAMapper{ this.metadataStandardIdRDAMapper = metadataStandardIdRDAMapper; } - public List toRDA(List nodes, List valueFields) { + public List toRDA(Map> nodes, List valueFields) { if (nodes == null) return null; if (valueFields == null) throw new IllegalArgumentException("valueFields is missing"); Map rdaMap = new HashMap<>(); List rdas = new ArrayList<>(); - for (FieldModel node : nodes) { - String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dataset.metadata")).findFirst().orElse(""); - org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x -> x.getId().equals(node.getId())).findFirst().orElse(null); + for (Map.Entry> entry : nodes.entrySet()) { + for (FieldModel node : entry.getValue()) { + String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dataset.metadata")).findFirst().orElse(""); + org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x -> x.getId().equals(node.getId())).findFirst().orElse(null); - for (PropertyName propertyName : PropertyName.values()) { - if (rdaProperty.contains(propertyName.getName())) { - switch (propertyName) { - case METADATA_STANDARD_ID: - if (rdaValue != null && rdaValue.getReferences() != null) { - for (ReferenceModel referenceModel : rdaValue.getReferences()) { //TODO reference ?? - String uri = referenceModel != null && referenceModel.getDefinition() != null && referenceModel.getDefinition().getFields() != null ? referenceModel.getDefinition().getFields().stream().filter(x-> x.getCode().equals("uri")).map(ReferenceFieldModel::getValue).findFirst().orElse(null) : null; - if (uri!= null && !uri.isBlank()) { //TODO - rdas.add(new Metadatum()); - rdas.getLast().setMetadataStandardId(metadataStandardIdRDAMapper.toRDA(uri)); - rdas.getLast().setDescription(referenceModel.getLabel()); - rdas.getLast().setAdditionalProperty("fieldId", node.getId()); - rdas.getLast().setAdditionalProperty("valueId", referenceModel.getReference()); - rdaMap.put(uri, node.getNumbering()); + for (PropertyName propertyName : PropertyName.values()) { + if (rdaProperty.contains(propertyName.getName())) { + switch (propertyName) { + case METADATA_STANDARD_ID: + if (rdaValue != null && rdaValue.getReferences() != null) { + for (ReferenceModel referenceModel : rdaValue.getReferences()) { //TODO reference ?? + String uri = referenceModel != null && referenceModel.getDefinition() != null && referenceModel.getDefinition().getFields() != null ? referenceModel.getDefinition().getFields().stream().filter(x -> x.getCode().equals("uri")).map(ReferenceFieldModel::getValue).findFirst().orElse(null) : null; + if (uri != null && !uri.isBlank()) { //TODO + rdas.add(new Metadatum()); + rdas.getLast().setMetadataStandardId(metadataStandardIdRDAMapper.toRDA(uri)); + rdas.getLast().setDescription(referenceModel.getLabel()); + rdas.getLast().setAdditionalProperty("fieldId", node.getId()); + rdas.getLast().setAdditionalProperty("valueId", referenceModel.getReference()); + rdaMap.put(uri, entry.getKey()); + } + } + } else if (rdaValue != null && rdaValue.getTextValue() != null && !rdaValue.getTextValue().isEmpty()) { + rdas.add(new Metadatum()); + rdas.getLast().setMetadataStandardId(metadataStandardIdRDAMapper.toRDA(rdaValue.getTextValue())); + rdas.getLast().setAdditionalProperty("identifierId", node.getId()); + rdaMap.put(rdaValue.getTextValue(), entry.getKey()); + } + break; + case DESCRIPTION: + if (rdaValue != null && rdaValue.getTextValue() != null && !rdaValue.getTextValue().isEmpty()) { + Metadatum rda = getRelative(rdas, rdaMap, entry.getKey()); + if (rda != null) { + rda.setDescription(rdaValue.getTextValue()); + rda.setAdditionalProperty("descriptionId", node.getId()); + } else { + rdas.stream().filter(rda1 -> rda1.getDescription() == null || rda1.getDescription().isEmpty()).forEach(rda1 -> rda1.setDescription(rdaValue.getTextValue())); } } - } else if (rdaValue != null && rdaValue.getTextValue() != null && !rdaValue.getTextValue().isEmpty()) { - rdas.add(new Metadatum()); - rdas.getLast().setMetadataStandardId(metadataStandardIdRDAMapper.toRDA(rdaValue.getTextValue())); - rdas.getLast().setAdditionalProperty("identifierId", node.getId()); - rdaMap.put(rdaValue.getTextValue(), node.getNumbering()); - } - break; - case DESCRIPTION: - if (rdaValue != null && rdaValue.getTextValue() != null && !rdaValue.getTextValue().isEmpty()) { - Metadatum rda = getRelative(rdas, rdaMap, node.getNumbering()); - if (rda != null) { - rda.setDescription(rdaValue.getTextValue()); - rda.setAdditionalProperty("descriptionId", node.getId()); - } else { - rdas.stream().filter(rda1 -> rda1.getDescription() == null || rda1.getDescription().isEmpty()).forEach(rda1 -> rda1.setDescription(rdaValue.getTextValue())); + break; + case LANGUAGE: + if (rdaValue != null && rdaValue.getTextValue() != null && !rdaValue.getTextValue().isEmpty()) { + String language = rdaValue.getTextValue(); + Metadatum.Language lang = Metadatum.Language.fromValue(language); + Metadatum rda = getRelative(rdas, rdaMap, entry.getKey()); + if (rda != null) { + rda.setLanguage(lang); + rda.setAdditionalProperty("languageId", node.getId()); + } else { + rdas.forEach(rda1 -> rda1.setLanguage(lang)); + } } - } - break; - case LANGUAGE: - if (rdaValue != null && rdaValue.getTextValue() != null && !rdaValue.getTextValue().isEmpty()) { - String language = rdaValue.getTextValue(); - Metadatum.Language lang = Metadatum.Language.fromValue(language); - Metadatum rda = getRelative(rdas, rdaMap, node.getNumbering()); - if (rda != null) { - rda.setLanguage(lang); - rda.setAdditionalProperty("languageId", node.getId()); - } else { - rdas.forEach(rda1 -> rda1.setLanguage(lang)); - } - } - break; + break; + } } } } - } return rdas; diff --git a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/SecurityAndPrivacyRDAMapper.java b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/SecurityAndPrivacyRDAMapper.java index d3c24e4..c1c972d 100644 --- a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/SecurityAndPrivacyRDAMapper.java +++ b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/SecurityAndPrivacyRDAMapper.java @@ -10,36 +10,38 @@ import java.util.stream.Collectors; @Component public class SecurityAndPrivacyRDAMapper { - public List toRDA(List nodes, List valueFields) { + public List toRDA(Map> nodes, List valueFields) { if (nodes == null) return null; if (valueFields == null) throw new IllegalArgumentException("valueFields is missing"); Map rdaMap = new HashMap<>(); - for (FieldModel node: nodes) { - String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dataset.security_and_privacy")).findFirst().orElse(""); - if (node.getData() == null) { - continue; - } - org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x-> x.getId().equals(node.getId())).findFirst().orElse(null); - if(rdaValue == null || rdaValue.getTextValue() == null || rdaValue.getTextValue().isBlank()){ - continue; - } - SecurityAndPrivacy rda = getRelative(rdaMap, node.getNumbering()); - if (!rdaMap.containsValue(rda)) { - rdaMap.put(node.getNumbering(), rda); - } - for (ExportPropertyName exportPropertyName : ExportPropertyName.values()) { - if (rdaProperty.contains(exportPropertyName.getName())) { - switch (exportPropertyName) { - case TITLE: - rda.setTitle(rdaValue.getTextValue()); - rda.getAdditionalProperties().put(ImportPropertyName.TITLE.getName(), node.getId()); - break; - case DESCRIPTION: - rda.setDescription(rdaValue.getTextValue()); - rda.getAdditionalProperties().put(ImportPropertyName.DESCRIPTION.getName(), node.getId()); - break; + for (Map.Entry> entry: nodes.entrySet()) { + for (FieldModel node : entry.getValue()) { + String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dataset.security_and_privacy")).findFirst().orElse(""); + if (node.getData() == null) { + continue; + } + org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x -> x.getId().equals(node.getId())).findFirst().orElse(null); + if (rdaValue == null || rdaValue.getTextValue() == null || rdaValue.getTextValue().isBlank()) { + continue; + } + SecurityAndPrivacy rda = getRelative(rdaMap, entry.getKey()); + if (!rdaMap.containsValue(rda)) { + rdaMap.put(entry.getKey(), rda); + } + for (ExportPropertyName exportPropertyName : ExportPropertyName.values()) { + if (rdaProperty.contains(exportPropertyName.getName())) { + switch (exportPropertyName) { + case TITLE: + rda.setTitle(rdaValue.getTextValue()); + rda.getAdditionalProperties().put(ImportPropertyName.TITLE.getName(), node.getId()); + break; + case DESCRIPTION: + rda.setDescription(rdaValue.getTextValue()); + rda.getAdditionalProperties().put(ImportPropertyName.DESCRIPTION.getName(), node.getId()); + break; + } } } } diff --git a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/TechnicalResourceRDAMapper.java b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/TechnicalResourceRDAMapper.java index 04d6a50..e92d2bc 100644 --- a/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/TechnicalResourceRDAMapper.java +++ b/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/TechnicalResourceRDAMapper.java @@ -11,40 +11,41 @@ import java.util.stream.Collectors; @Component public class TechnicalResourceRDAMapper { - public List toRDA(List nodes, List valueFields ) { + public List toRDA(Map> nodes, List valueFields ) { if (nodes == null) return null; if (valueFields == null) throw new IllegalArgumentException("valueFields is missing"); Map rdaMap = new HashMap<>(); - for (FieldModel node: nodes) { - String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dataset.technical_resource")).findFirst().orElse(""); - if (node.getData() == null) { - continue; - } - org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x-> x.getId().equals(node.getId())).findFirst().orElse(null); - if(rdaValue == null || rdaValue.getTextValue() == null || rdaValue.getTextValue().isBlank()){ - continue; - } - TechnicalResource rda = getRelative(rdaMap, node.getNumbering()); - if (!rdaMap.containsValue(rda)) { - rdaMap.put(node.getNumbering(), rda); - } - for (ExportPropertyName exportPropertyName : ExportPropertyName.values()) { - if (rdaProperty.contains(exportPropertyName.getName())) { - switch (exportPropertyName) { - case NAME: - rda.setName(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.NAME.getName(), node.getId()); - break; - case DESCRIPTION: - rda.setDescription(rdaValue.getTextValue()); - rda.setAdditionalProperty(ImportPropertyName.DESCRIPTION.getName(), node.getId()); - break; + for (Map.Entry> entry: nodes.entrySet()) { + for (FieldModel node : entry.getValue()) { + String rdaProperty = node.getSchematics().stream().filter(schematic -> schematic.startsWith("rda.dataset.technical_resource")).findFirst().orElse(""); + if (node.getData() == null) { + continue; + } + org.opencdmp.commonmodels.models.description.FieldModel rdaValue = valueFields.stream().filter(x -> x.getId().equals(node.getId())).findFirst().orElse(null); + if (rdaValue == null || rdaValue.getTextValue() == null || rdaValue.getTextValue().isBlank()) { + continue; + } + TechnicalResource rda = getRelative(rdaMap, entry.getKey()); + if (!rdaMap.containsValue(rda)) { + rdaMap.put(entry.getKey(), rda); + } + for (ExportPropertyName exportPropertyName : ExportPropertyName.values()) { + if (rdaProperty.contains(exportPropertyName.getName())) { + switch (exportPropertyName) { + case NAME: + rda.setName(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.NAME.getName(), node.getId()); + break; + case DESCRIPTION: + rda.setDescription(rdaValue.getTextValue()); + rda.setAdditionalProperty(ImportPropertyName.DESCRIPTION.getName(), node.getId()); + break; + } } } } } - return rdaMap.values().stream() .filter(tr -> tr.getName() != null) .collect(Collectors.toList()); diff --git a/core/src/main/java/org/opencdmp/filetransformer/rda/service/descriptiontemplatesearcher/TemplateFieldSearcherService.java b/core/src/main/java/org/opencdmp/filetransformer/rda/service/descriptiontemplatesearcher/TemplateFieldSearcherService.java index d952e97..3a2de3b 100644 --- a/core/src/main/java/org/opencdmp/filetransformer/rda/service/descriptiontemplatesearcher/TemplateFieldSearcherService.java +++ b/core/src/main/java/org/opencdmp/filetransformer/rda/service/descriptiontemplatesearcher/TemplateFieldSearcherService.java @@ -4,9 +4,10 @@ import org.opencdmp.commonmodels.models.descriptiotemplate.DescriptionTemplateMo import org.opencdmp.commonmodels.models.descriptiotemplate.FieldModel; import java.util.List; +import java.util.Map; public interface TemplateFieldSearcherService { - List searchFieldsById(DescriptionTemplateModel template, String value); + Map> searchFieldsById(DescriptionTemplateModel template, String value); - List searchFieldsBySemantics(DescriptionTemplateModel template, String value); + Map> searchFieldsBySemantics(DescriptionTemplateModel template, String value); } diff --git a/core/src/main/java/org/opencdmp/filetransformer/rda/service/descriptiontemplatesearcher/TemplateFieldSearcherServiceImpl.java b/core/src/main/java/org/opencdmp/filetransformer/rda/service/descriptiontemplatesearcher/TemplateFieldSearcherServiceImpl.java index 9268e52..2a1774f 100644 --- a/core/src/main/java/org/opencdmp/filetransformer/rda/service/descriptiontemplatesearcher/TemplateFieldSearcherServiceImpl.java +++ b/core/src/main/java/org/opencdmp/filetransformer/rda/service/descriptiontemplatesearcher/TemplateFieldSearcherServiceImpl.java @@ -3,23 +3,80 @@ package org.opencdmp.filetransformer.rda.service.descriptiontemplatesearcher; import org.opencdmp.commonmodels.models.descriptiotemplate.*; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; @Component public class TemplateFieldSearcherServiceImpl implements TemplateFieldSearcherService { @Override - public List searchFieldsById(DescriptionTemplateModel template, String value) { - if (template == null || template.getDefinition() == null) return new ArrayList<>(); - return template.getDefinition().getFieldById(value); + public Map> searchFieldsById(DescriptionTemplateModel template, String value) { + if (template == null || template.getDefinition() == null) return new HashMap<>(); + List fieldModels = template.getDefinition().getFieldById(value); + Map> response = new HashMap<>(); + for (FieldModel fieldModel : fieldModels){ + String key = this.buildFieldKey(template, fieldModel); + if (!response.containsKey(key)) response.put(key, new ArrayList<>()); + response.get(key).add(fieldModel); + } + return response; } @Override - public List searchFieldsBySemantics(DescriptionTemplateModel template, String value) { - if (template == null || template.getDefinition() == null) return new ArrayList<>(); + public Map> searchFieldsBySemantics(DescriptionTemplateModel template, String value) { + if (template == null || template.getDefinition() == null) return new HashMap<>(); List fieldModels = template.getDefinition().getAllField(); - if (fieldModels == null) return new ArrayList<>(); - return fieldModels.stream().filter(x-> x.getSchematics() != null && x.getSchematics().contains(value)).toList(); + if (fieldModels == null) return new HashMap<>(); + fieldModels = fieldModels.stream().filter(x-> x.getSchematics() != null && x.getSchematics().contains(value)).toList(); + Map> response = new HashMap<>(); + for (FieldModel fieldModel : fieldModels){ + String key = this.buildFieldKey(template, fieldModel); + if (!response.containsKey(key)) response.put(key, new ArrayList<>()); + response.get(key).add(fieldModel); + } + return response; + } + + private String buildFieldKey(DescriptionTemplateModel template, FieldModel fieldModel){ + if (template == null || template.getDefinition() == null || template.getDefinition().getPages() == null) return null; + for (PageModel pageModel : template.getDefinition().getPages().stream().sorted(Comparator.comparing(PageModel::getOrdinal)).toList()){ + String key = this.buildFieldKey(pageModel, fieldModel); + if (key != null) return pageModel.getOrdinal() + "." + key; + } + return null; + } + private String buildFieldKey(PageModel pageModel, FieldModel fieldModel){ + if (pageModel == null || pageModel.getSections() == null) return null; + for (SectionModel sectionModel : pageModel.getSections().stream().sorted(Comparator.comparing(SectionModel::getOrdinal)).toList()){ + String key = this.buildFieldKey(sectionModel, fieldModel); + if (key != null) return sectionModel.getOrdinal() + "." + key; + } + return null; + } + + private String buildFieldKey(SectionModel sectionModel, FieldModel fieldModel){ + if (sectionModel == null) return null; + if (sectionModel.getSections() != null) { + for (SectionModel innerSectionModel : sectionModel.getSections().stream().sorted(Comparator.comparing(SectionModel::getOrdinal)).toList()) { + String key = this.buildFieldKey(innerSectionModel, fieldModel); + if (key != null) return innerSectionModel.getOrdinal() + "." + key; + } + } + if (sectionModel.getFieldSets() != null) { + for (FieldSetModel fieldSetModel : sectionModel.getFieldSets().stream().sorted(Comparator.comparing(FieldSetModel::getOrdinal)).toList()) { + String key = this.buildFieldKey(fieldSetModel, fieldModel); + if (key != null) return fieldSetModel.getOrdinal() + "." + key; + + } + } + return null; + } + + private String buildFieldKey(FieldSetModel fieldSetModel, FieldModel fieldModel){ + if (fieldSetModel == null || fieldSetModel.getFields() == null) return null; + for (FieldModel currentFieldModel : fieldSetModel.getFields().stream().sorted(Comparator.comparing(FieldModel::getOrdinal)).toList()){ + if (currentFieldModel.getId().equals(fieldModel.getId())) return currentFieldModel.getOrdinal().toString(); + } + return null; } } diff --git a/pom.xml b/pom.xml index 2511fb1..638ca41 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ org.opencdmp file-transformer-base - 0.0.15 + 0.0.18