file-transformer-rda-json/core/src/main/java/org/opencdmp/filetransformer/rda/model/rda/mapper/DmpRDAMapper.java

232 lines
12 KiB
Java

package org.opencdmp.filetransformer.rda.model.rda.mapper;
import org.opencdmp.commonmodels.enums.DmpAccessType;
import org.opencdmp.commonmodels.enums.DmpUserRole;
import org.opencdmp.commonmodels.models.DmpUserModel;
import org.opencdmp.commonmodels.models.EntityDoiModel;
import org.opencdmp.commonmodels.models.UserModel;
import org.opencdmp.commonmodels.models.descriptiotemplate.DescriptionTemplateModel;
import org.opencdmp.commonmodels.models.descriptiotemplate.FieldModel;
import org.opencdmp.commonmodels.models.dmp.DmpContactModel;
import org.opencdmp.commonmodels.models.dmp.DmpModel;
import org.opencdmp.commonmodels.models.dmp.DmpPropertiesModel;
import org.opencdmp.commonmodels.models.dmpblueprint.DmpBlueprintModel;
import org.opencdmp.commonmodels.models.dmpreference.DmpReferenceModel;
import org.opencdmp.commonmodels.models.reference.ReferenceModel;
import org.opencdmp.filetransformer.rda.model.ProjectModel;
import org.opencdmp.filetransformer.rda.model.rda.DmpId;
import org.opencdmp.filetransformer.rda.model.rda.Dmp;
import org.opencdmp.filetransformer.rda.service.descriptiontemplatesearcher.TemplateFieldSearcherService;
import org.opencdmp.filetransformer.rda.service.json.JsonHandlingService;
import org.opencdmp.filetransformer.rda.service.rdafiletransformer.RdaFileTransformerServiceProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.Instant;
import java.util.*;
@Component
public class DmpRDAMapper{
private final DatasetRDAMapper datasetRDAMapper;
private final DmpIdRDAMapper dmpIdRDAMapper;
private final ContactRDAMapper contactRDAMapper;
private final RdaFileTransformerServiceProperties rdaFileTransformerServiceProperties;
private final DmpContactModelContactRDAMapper dmpContactModelContactRDAMapper;
private final ReferenceContributorRDAMapper referenceContributorRDAMapper;
private final DmpUserContributorRDAMapper dmpUserContributorRDAMapper;
private final ProjectRDAMapper projectRDAMapper;
private final JsonHandlingService jsonHandlingService;
private final LanguageRDAMapper languageRDAMapper;
@Autowired
public DmpRDAMapper(DatasetRDAMapper datasetRDAMapper, DmpIdRDAMapper dmpIdRDAMapper, ContactRDAMapper contactRDAMapper, RdaFileTransformerServiceProperties rdaFileTransformerServiceProperties, DmpContactModelContactRDAMapper dmpContactModelContactRDAMapper, ReferenceContributorRDAMapper referenceContributorRDAMapper, DmpUserContributorRDAMapper dmpUserContributorRDAMapper, ProjectRDAMapper projectRDAMapper, JsonHandlingService jsonHandlingService, LanguageRDAMapper languageRDAMapper) {
this.datasetRDAMapper = datasetRDAMapper;
this.dmpIdRDAMapper = dmpIdRDAMapper;
this.contactRDAMapper = contactRDAMapper;
this.rdaFileTransformerServiceProperties = rdaFileTransformerServiceProperties;
this.dmpContactModelContactRDAMapper = dmpContactModelContactRDAMapper;
this.referenceContributorRDAMapper = referenceContributorRDAMapper;
this.dmpUserContributorRDAMapper = dmpUserContributorRDAMapper;
this.projectRDAMapper = projectRDAMapper;
this.jsonHandlingService = jsonHandlingService;
this.languageRDAMapper = languageRDAMapper;
}
public Dmp toRDA(DmpModel dmp) {
if (dmp == null) throw new IllegalArgumentException("DMP is missing");
if (dmp.getCreatedAt() == null) throw new IllegalArgumentException("DMP Created is missing");
if (dmp.getUpdatedAt() == null) throw new IllegalArgumentException("DMP Modified is missing");
if (dmp.getLabel() == null) throw new IllegalArgumentException("DMP Label is missing");
if (dmp.getProperties() == null) throw new IllegalArgumentException("DMP is missing language and contact properties");
if (dmp.getDescriptions() == null || dmp.getDescriptions().isEmpty()) throw new IllegalArgumentException("DMP has no Datasets");
List<ReferenceModel> grants = this.getReferenceModelOfTypeCode(dmp, this.rdaFileTransformerServiceProperties.getGrantReferenceCode());
List<ReferenceModel> researchers = this.getReferenceModelOfTypeCode(dmp, this.rdaFileTransformerServiceProperties.getResearcherReferenceCode());
List<ReferenceModel> funders = this.getReferenceModelOfTypeCode(dmp, this.rdaFileTransformerServiceProperties.getFunderReferenceCode());
List<ReferenceModel> projects = this.getReferenceModelOfTypeCode(dmp, this.rdaFileTransformerServiceProperties.getProjectReferenceCode());
Dmp rda = new Dmp();
if (dmp.getEntityDois() != null && !dmp.getEntityDois().isEmpty()) {
for(EntityDoiModel doi: dmp.getEntityDois()){
if(doi.getRepositoryId() != null && doi.getRepositoryId().equals("Zenodo")){
rda.setDmpId(dmpIdRDAMapper.toRDA(doi.getDoi()));
}
}
} else {
rda.setDmpId(dmpIdRDAMapper.toRDA(dmp.getId()));
}
rda.setCreated(dmp.getCreatedAt());
rda.setDescription(dmp.getDescription());
rda.setModified(dmp.getUpdatedAt());
rda.setTitle(dmp.getLabel());
rda.setLanguage(languageRDAMapper.toRDA(dmp.getLanguage() != null ? dmp.getLanguage() : "en"));
if (dmp.getProperties() != null) {
//TODO
// if (extraProperties.get("ethicalIssues") != null) {
// rda.setEthicalIssuesExist(Dmp.EthicalIssuesExist.fromValue(extraProperties.get("ethicalIssues").toString()));
// } else {
// rda.setEthicalIssuesExist(Dmp.EthicalIssuesExist.UNKNOWN);
// }
// if (extraProperties.get("costs") != null) {
// rda.setCost(new ArrayList<>());
// ((List) extraProperties.get("costs")).forEach(costl -> {
// try {
// rda.getCost().add(CostRDAMapper.toRDA((Map)costl));
// } catch (JsonProcessingException e) {
// logger.error(e.getMessage(), e);
// }
// });
// }
if (dmp.getProperties().getContacts() != null && !dmp.getProperties().getContacts().isEmpty()){
UserModel userContact = dmp.getProperties().getContacts().stream().filter(x-> x.getUser() != null).map(DmpContactModel::getUser).findFirst().orElse(null);
if (userContact != null) {
rda.setContact(contactRDAMapper.toRDA(userContact));
} else {
rda.setContact(dmpContactModelContactRDAMapper.toRDA(dmp.getProperties().getContacts().getFirst()));
}
}
}
UserModel creator = null;
if (dmp.getCreator() != null) {
creator = dmp.getCreator();
} else if (dmp.getUsers() != null){
creator = dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(DmpUserRole.Owner)).map(DmpUserModel::getUser).findFirst().orElse(null);
}
if (creator != null) rda.setContact(contactRDAMapper.toRDA(creator));
if (!researchers.isEmpty()) rda.setContributor(referenceContributorRDAMapper.toRDAs(researchers));
if (dmp.getUsers() != null && !dmp.getUsers().isEmpty()){
if (rda.getContributor() == null) rda.setContributor(new ArrayList<>());
rda.getContributor().addAll(dmpUserContributorRDAMapper.toRDAs(dmp.getUsers()));
}
if (!projects.isEmpty() && !grants.isEmpty() && !funders.isEmpty()) {
ProjectModel projectModel = new ProjectModel();
projectModel.setFunder(funders.getFirst());
projectModel.setGrant(grants.getFirst());
projectModel.setProject(projects.getFirst());
rda.setProject(List.of(projectRDAMapper.toRDA(projectModel, null))); //TODO
}
if (dmp.getDescriptions() != null) rda.setAdditionalProperty("templates", jsonHandlingService.toJsonSafe(dmp.getDescriptions().stream().filter(x-> x.getDescriptionTemplate() != null && x.getDescriptionTemplate().getId() != null).map(descriptionModel -> descriptionModel.getDescriptionTemplate().getId()).toList()));
if (dmp.getDmpBlueprint() != null) rda.setAdditionalProperty("blueprintId", dmp.getDmpBlueprint().getId().toString());
if (dmp.getPublicAfter() != null) rda.setAdditionalProperty("publicDate", jsonHandlingService.toJsonSafe(dmp.getPublicAfter()));
if (dmp.getAccessType() != null) rda.setAdditionalProperty("visible", dmp.getAccessType());
if (dmp.getProperties() != null) rda.setAdditionalProperty("dmpProperties", jsonHandlingService.toJsonSafe(dmp.getProperties()));
Map<String, Object> datasetExtraData = new HashMap<>();
datasetExtraData.put("dmp", rda);
rda.setDataset(dmp.getDescriptions().stream().map(dataset -> datasetRDAMapper.toRDA(dataset, datasetExtraData)).toList());
return rda;
}
private List<ReferenceModel> getReferenceModelOfTypeCode(DmpModel dmp, String code){
List<ReferenceModel> response = new ArrayList<>();
if (dmp.getReferences() == null) return response;
for (DmpReferenceModel dmpReferenceModel : dmp.getReferences()){
if (dmpReferenceModel.getReference() != null && dmpReferenceModel.getReference().getType() != null && dmpReferenceModel.getReference().getType().getCode() != null && dmpReferenceModel.getReference().getType().getCode().equals(code)){
response.add(dmpReferenceModel.getReference());
}
}
return response;
}
public DmpModel toEntity(Dmp rda, Map<String, Object> extraData) {
if (extraData == null) throw new IllegalArgumentException("profiles is missing");
Object dmpObject = extraData.getOrDefault("profiles", null);
if (dmpObject == null) throw new IllegalArgumentException("profiles is missing");
List<DescriptionTemplateModel> profiles = (List<DescriptionTemplateModel>)dmpObject;
DmpModel entity = new DmpModel();
entity.setLabel(rda.getTitle());
entity.setCreatedAt(rda.getCreated());
entity.setUpdatedAt(rda.getModified());
entity.setDescription(rda.getDescription());
entity.setLanguage(languageRDAMapper.toEntity(rda.getLanguage()));
String dmpProperties = (String) rda.getAdditionalProperties().getOrDefault("dmpProperties", null);
if (dmpProperties != null && !dmpProperties.isBlank()) entity.setProperties(jsonHandlingService.fromJsonSafe(DmpPropertiesModel.class, dmpProperties));
String accessType = (String) rda.getAdditionalProperties().getOrDefault("visible", null);
if (accessType != null && !accessType.isBlank()) entity.setAccessType(DmpAccessType.of((Short.parseShort(accessType))));
String publicDate = (String) rda.getAdditionalProperties().getOrDefault("publicDate", null);
if (publicDate != null && !publicDate.isBlank()) entity.setPublicAfter(jsonHandlingService.fromJsonSafe(Instant.class, publicDate));
String blueprintId = (String) rda.getAdditionalProperties().getOrDefault("blueprintId", null);
if (blueprintId != null && !blueprintId.isBlank()){
DmpBlueprintModel blueprintModel = new DmpBlueprintModel();
blueprintModel.setId(UUID.fromString(blueprintId));
entity.setDmpBlueprint(blueprintModel);
}
if (rda.getDmpId().getType() == DmpId.Type.DOI) {
EntityDoiModel entityDoiModel = new EntityDoiModel();
entityDoiModel.setDoi(rda.getDmpId().getIdentifier());
entity.setEntityDois(List.of(entityDoiModel));
}
//TODO
/*if (((List<String>) rda.getAdditionalProperties().get("templates")) != null && !((List<String>) rda.getAdditionalProperties().get("templates")).isEmpty() && entity.getId() != null) {
entity.setAssociatedDmps(((List<String>) rda.getAdditionalProperties().get("templates")).stream().map(x -> {
try {
return this.getProfile(x, entity.getId());
} catch (InvalidApplicationException e) {
throw new RuntimeException(e);
}
}).filter(Objects::nonNull).collect(Collectors.toSet()));
}*/
entity.setReferences(new ArrayList<>());
if (rda.getContributor() != null && !rda.getContributor().isEmpty()) {
entity.getReferences().addAll(referenceContributorRDAMapper.toEntities(rda.getContributor().stream().filter(r -> r.getContributorId() != null).toList()).stream().map(reference -> {
DmpReferenceModel dmpReference = new DmpReferenceModel();
dmpReference.setReference(reference);
return dmpReference;
}).toList());
}
if (rda.getProject() != null && !rda.getProject().isEmpty()) {
entity.getReferences().addAll(projectRDAMapper.toEntities(rda.getProject()).stream().map(x-> {
List<ReferenceModel> referenceModels = new ArrayList<>();
if (x.getProject() != null) referenceModels.add(x.getProject());
if (x.getFunder() != null) referenceModels.add(x.getFunder());
if (x.getGrant() != null) referenceModels.add(x.getGrant());
return referenceModels;
}).flatMap(Collection::stream)
.map(reference -> {
DmpReferenceModel dmpReference = new DmpReferenceModel();
dmpReference.setReference(reference);
return dmpReference;
}).toList());
}
entity.setDescriptions(rda.getDataset().stream().map(rda1 -> datasetRDAMapper.toEntity(rda1, profiles.getFirst())).toList()); //TODO
return entity;
}
}