package eu.eudat.models.deposit.zenodo.mapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.data.entities.DMP; import eu.eudat.data.entities.Organisation; import eu.eudat.data.entities.UserDMP; import eu.eudat.logic.proxy.config.DOIFunder; import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; import eu.eudat.models.deposit.zenodo.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.env.Environment; import java.time.Instant; import java.util.*; import java.util.stream.Collectors; public class DMPToZenodoMapper { private static final ObjectMapper objectmapper = new ObjectMapper(); private static final Logger logger = LoggerFactory.getLogger(DMPToZenodoMapper.class); public static ZenodoDeposit fromDMP(DMP dmp, Environment environment, ConfigLoader configLoader) { Map extraProperties = null; try { extraProperties = dmp.getExtraProperties() != null ? objectmapper.readValue(dmp.getExtraProperties(), LinkedHashMap.class) : new HashMap<>(); } catch (JsonProcessingException e) { logger.error(e.getLocalizedMessage(), e); } ZenodoDeposit deposit = new ZenodoDeposit(); deposit.setMetadata(new ZenodoDepositMetadata()); deposit.getMetadata().setTitle(dmp.getLabel()); deposit.getMetadata().setUploadType("publication"); deposit.getMetadata().setPublicationType("datamanagementplan"); deposit.getMetadata().setDescription((dmp.getDescription() != null && !dmp.getDescription().isEmpty() ? dmp.getDescription() : "

")); deposit.getMetadata().setVersion(dmp.getVersion().toString()); ZenodoComunity community = new ZenodoComunity(); community.setIdentifier(environment.getProperty("zenodo.community")); deposit.getMetadata().setCommunities(Collections.singletonList(community)); if (extraProperties != null && extraProperties.get("visible") == null) { deposit.getMetadata().setAccessRight(ZenodoAccessRight.RESTRICTED); deposit.getMetadata().setAccessConditions(""); } else { if (extraProperties != null && ((Boolean) extraProperties.get("visible"))) { Instant publicationDate = Instant.parse(extraProperties.get("publicDate").toString()); if (publicationDate.isBefore(Instant.now())) { deposit.getMetadata().setAccessRight(ZenodoAccessRight.OPEN); } else { deposit.getMetadata().setAccessRight(ZenodoAccessRight.EMBARGOED); deposit.getMetadata().setEmbargoDate(publicationDate.toString()); } if (extraProperties.get("license") != null) { deposit.getMetadata().setLicense(((Map) extraProperties.get("license")).get("pid").toString()); } } else { deposit.getMetadata().setAccessRight(ZenodoAccessRight.RESTRICTED); deposit.getMetadata().setAccessConditions(""); } } if (dmp.isPublic()) { ZenodoRelator relator = new ZenodoRelator(); relator.setIdentifier((environment.getProperty("dmp.domain") + "/external/zenodo/" + dmp.getId().toString())); relator.setRelation("isIdenticalTo"); deposit.getMetadata().setRelatedIdentifiers(Collections.singletonList(relator)); } deposit.getMetadata().setContributors(new LinkedList<>()); List contributors = dmp.getUsers().stream().map(userDMP -> { ZenodoContributor contributor = new ZenodoContributor(); contributor.setName(userDMP.getUser().getName()); contributor.setType("ProjectMember"); if (dmp.getOrganisations() != null && !dmp.getOrganisations().isEmpty()) { contributor.setAffiliation(dmp.getOrganisations() .stream().map(Organisation::getLabel).collect(Collectors.joining(", "))); } else { contributor.setAffiliation(environment.getProperty("zenodo.affiliation")); } return contributor; }).collect(Collectors.toList()); List researchers = dmp.getResearchers().stream().map(researcher -> { ZenodoContributor contributor = new ZenodoContributor(); contributor.setName(researcher.getLabel()); contributor.setType("Researcher"); String referenceHead = researcher.getReference().split(":")[0]; String referenceTail = researcher.getReference().replace(referenceHead + ":", ""); contributor.setAffiliation(referenceHead); if (referenceHead.equalsIgnoreCase("ORCID")) { contributor.setOrcid(referenceTail); } return contributor; }).collect(Collectors.toList()); deposit.getMetadata().getContributors().addAll(contributors); deposit.getMetadata().getContributors().addAll(researchers); if (dmp.getGrant().getReference() == null) { dmp.getGrant().setReference("dmp:" + dmp.getGrant().getId()); } String grantReferenceHead = dmp.getGrant().getReference().split(":")[0]; if (grantReferenceHead.equals("openaire")) { String grantReferenceTail = dmp.getGrant().getReference().split(":")[3]; DOIFunder doiFunder = configLoader.getDOIFunders().stream() .filter(doiFunder1 -> dmp.getGrant().getFunder().getLabel().contains(doiFunder1.getFunder()) || doiFunder1.getFunder().contains(dmp.getGrant().getFunder().getLabel())) .findFirst().orElse(null); if (doiFunder != null) { String finalId = doiFunder.getDOI() + "::" + grantReferenceTail; ZenodoGrant grant = new ZenodoGrant(); grant.setId(finalId); deposit.getMetadata().setGrants(Collections.singletonList(grant)); } } ZenodoContributor creator = new ZenodoContributor(); creator.setName(dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getName()); if (dmp.getOrganisations() != null && !dmp.getOrganisations().isEmpty()) { creator.setAffiliation(dmp.getOrganisations() .stream().map(Organisation::getLabel).collect(Collectors.joining(", "))); } else { creator.setAffiliation(environment.getProperty("zenodo.affiliation")); } deposit.getMetadata().setCreators(Collections.singletonList(creator)); return deposit; } }