diff --git a/core/src/main/java/org/opencdmp/deposit/zenodorepository/model/builder/ZenodoBuilder.java b/core/src/main/java/org/opencdmp/deposit/zenodorepository/model/builder/ZenodoBuilder.java index 3955e70..0b6bf1b 100644 --- a/core/src/main/java/org/opencdmp/deposit/zenodorepository/model/builder/ZenodoBuilder.java +++ b/core/src/main/java/org/opencdmp/deposit/zenodorepository/model/builder/ZenodoBuilder.java @@ -1,6 +1,7 @@ package org.opencdmp.deposit.zenodorepository.model.builder; import gr.cite.tools.exception.MyApplicationException; +import gr.cite.tools.logging.LoggerService; import org.opencdmp.commonmodels.enums.DmpAccessType; import org.opencdmp.commonmodels.enums.DmpUserRole; import org.opencdmp.commonmodels.models.DmpUserModel; @@ -8,7 +9,9 @@ import org.opencdmp.commonmodels.models.description.*; import org.opencdmp.commonmodels.models.descriptiotemplate.DefinitionModel; import org.opencdmp.commonmodels.models.descriptiotemplate.fielddata.RadioBoxDataModel; import org.opencdmp.commonmodels.models.descriptiotemplate.fielddata.SelectDataModel; +import org.opencdmp.commonmodels.models.dmp.DmpBlueprintValueModel; import org.opencdmp.commonmodels.models.dmp.DmpModel; +import org.opencdmp.commonmodels.models.dmpblueprint.SectionModel; import org.opencdmp.commonmodels.models.dmpreference.DmpReferenceModel; import org.opencdmp.commonmodels.models.reference.ReferenceFieldModel; import org.opencdmp.commonmodels.models.reference.ReferenceModel; @@ -17,13 +20,18 @@ import org.opencdmp.deposit.zenodorepository.configuration.identifier.Identifier import org.opencdmp.deposit.zenodorepository.configuration.pid.PidProperties; import org.opencdmp.deposit.zenodorepository.enums.ZenodoAccessRight; import org.opencdmp.deposit.zenodorepository.model.*; +import org.opencdmp.deposit.zenodorepository.service.zenodo.ZenodoDepositServiceImpl; import org.opencdmp.deposit.zenodorepository.service.zenodo.ZenodoServiceProperties; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -31,12 +39,14 @@ import java.util.stream.Collectors; @Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ZenodoBuilder { + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(ZenodoDepositServiceImpl.class)); private static final String UPLOAD_TYPE = "publication"; private static final String PUBLICATION_TYPE = "datamanagementplan"; private static final String IS_IDENTICAL_TO = "isIdenticalTo"; private static final String CONTRIBUTOR_TYPE_RESEARCHER = "Researcher"; private static final String CONTRIBUTOR_TYPE_PROJECT_MANAGER = "ProjectMember"; + private static final String SEMANTIC_PUBLICATION_DATE = "zenodo.publication_date"; private final PidProperties pidProperties; private final IdentifierProperties identifierProperties; @@ -66,6 +76,20 @@ public class ZenodoBuilder { community.setIdentifier(zenodoCommunity); deposit.getMetadata().getCommunities().add(community); } + + org.opencdmp.commonmodels.models.dmpblueprint.FieldModel fieldOfSemantic = this.getFieldOfSemantic(dmp, SEMANTIC_PUBLICATION_DATE); + if (fieldOfSemantic != null){ + DmpBlueprintValueModel dmpBlueprintValueModel = this.getDmpBlueprintValue(dmp, fieldOfSemantic.getId()); + + if (dmpBlueprintValueModel != null && dmpBlueprintValueModel.getValue() != null && !dmpBlueprintValueModel.getValue().isBlank()){ + try { + Instant instant = Instant.parse(dmpBlueprintValueModel.getValue()); + deposit.getMetadata().setPublicationDate(DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()).format(instant)); + }catch (Exception e){ + logger.error(e.getMessage(), e); + } + } + } this.applyAccessRight(dmp, deposit); this.applyIsIdenticalTo(dmp, deposit); this.applyLicenses(dmp, deposit); @@ -77,6 +101,22 @@ public class ZenodoBuilder { return deposit; } + private DmpBlueprintValueModel getDmpBlueprintValue(DmpModel dmp, UUID id){ + if (dmp == null || dmp.getProperties() == null || dmp.getProperties().getDmpBlueprintValues() == null) return null; + return dmp.getProperties().getDmpBlueprintValues().stream().filter(x-> x.getFieldId().equals(id)).findFirst().orElse(null); + } + + private org.opencdmp.commonmodels.models.dmpblueprint.FieldModel getFieldOfSemantic(DmpModel dmp, String semanticKey){ + if (dmp == null || dmp.getDmpBlueprint() == null || dmp.getDmpBlueprint().getDefinition() == null || dmp.getDmpBlueprint().getDefinition().getSections() == null) return null; + for (SectionModel sectionModel : dmp.getDmpBlueprint().getDefinition().getSections()){ + if (sectionModel.getFields() != null){ + org.opencdmp.commonmodels.models.dmpblueprint.FieldModel fieldModel = sectionModel.getFields().stream().filter(x-> x.getSemantics() != null && x.getSemantics().contains(semanticKey)).findFirst().orElse(null); + if (fieldModel != null) return fieldModel; + } + } + return null; + } + private List findSchematicValues(String relatedId, DefinitionModel definitionModel){ return definitionModel.getAllField().stream().filter(x-> x.getSchematics() != null && x.getSchematics().contains(relatedId)).toList(); }