232 lines
12 KiB
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;
|
|
}
|
|
}
|