package eu.eudat.models.rda.mapper; import com.fasterxml.jackson.databind.JsonNode; import eu.eudat.logic.utilities.helpers.MyStringUtils; import eu.eudat.models.rda.SecurityAndPrivacy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; public class SecurityAndPrivacyRDAMapper { private static final Logger logger = LoggerFactory.getLogger(SecurityAndPrivacyRDAMapper.class); public static List toRDAList(List nodes) { Map rdaMap = new HashMap<>(); for (JsonNode node: nodes) { String rdaProperty = node.get("rdaProperty").asText(); String rdaValue = node.get("value").asText(); SecurityAndPrivacy rda = getRelative(rdaMap, node.get("numbering").asText()); if (!rdaMap.containsValue(rda)) { rdaMap.put(node.get("numbering").asText(), rda); } for (ExportPropertyName exportPropertyName : ExportPropertyName.values()) { if (rdaProperty.contains(exportPropertyName.getName())) { switch (exportPropertyName) { case TITLE: rda.setTitle(rdaValue); rda.getAdditionalProperties().put(ImportPropertyName.TITLE.getName(), node.get("id").asText()); break; case DESCRIPTION: rda.setDescription(rdaValue); rda.getAdditionalProperties().put(ImportPropertyName.DESCRIPTION.getName(), node.get("id").asText()); break; } } } } return new ArrayList<>(rdaMap.values()); } public static Map toProperties(List rdas) { Map properties = new HashMap<>(); rdas.forEach(rda -> rda.getAdditionalProperties().entrySet().forEach(entry -> { try { ImportPropertyName importPropertyName = ImportPropertyName.fromString(entry.getKey()); switch(importPropertyName) { case TITLE: properties.put(entry.getValue().toString(), rda.getTitle()); break; case DESCRIPTION: properties.put(entry.getValue().toString(), rda.getDescription()); break; } } catch (Exception e) { logger.error(e.getMessage(), e); } })); return properties; } public static SecurityAndPrivacy toRDA(JsonNode node) { SecurityAndPrivacy rda = new SecurityAndPrivacy(); String rdaProperty = node.get("rdaProperty").asText(); String value =node.get("value").asText(); if (rdaProperty.contains("description")) { rda.setDescription(value); } else if (rdaProperty.contains("title")) { rda.setTitle(value); } return rda; } private static SecurityAndPrivacy getRelative(Map rdaMap, String numbering) { return rdaMap.entrySet().stream().filter(entry -> MyStringUtils.getFirstDifference(entry.getKey(), numbering) > 0) .max(Comparator.comparingInt(entry -> MyStringUtils.getFirstDifference(entry.getKey(), numbering))).map(Map.Entry::getValue).orElse(new SecurityAndPrivacy()); } private enum ExportPropertyName { TITLE("title"), DESCRIPTION("description"); private String name; ExportPropertyName(String name) { this.name = name; } public String getName() { return name; } } private enum ImportPropertyName { TITLE("titleId"), DESCRIPTION("descriptionId"); private String name; ImportPropertyName(String name) { this.name = name; } public String getName() { return name; } public static ImportPropertyName fromString(String name) throws Exception { for (ImportPropertyName importPropertyName: ImportPropertyName.values()) { if (importPropertyName.getName().equals(name)) { return importPropertyName; } } throw new Exception("Property not available"); } } }