210 lines
9.8 KiB
Java
210 lines
9.8 KiB
Java
package eu.eudat.file.transformer.rda.mapper;
|
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import eu.eudat.file.transformer.enums.ReferenceType;
|
|
import eu.eudat.file.transformer.models.descriptiontemplate.DescriptionTemplateFileTransformerModel;
|
|
import eu.eudat.file.transformer.models.dmp.DmpFileTransformerModel;
|
|
import eu.eudat.file.transformer.models.dmp.DmpReferenceFileTransformerModel;
|
|
import eu.eudat.file.transformer.models.dmp.DmpUserFileTransformerModel;
|
|
import eu.eudat.file.transformer.models.entitydoi.EntityDoiFileTransformerModel;
|
|
import eu.eudat.file.transformer.models.reference.ReferenceFileTransformerModel;
|
|
import eu.eudat.file.transformer.models.user.UserFileTransformerModel;
|
|
import eu.eudat.file.transformer.rda.Dmp;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import javax.management.InvalidApplicationException;
|
|
import java.io.IOException;
|
|
import java.util.*;
|
|
|
|
@Component
|
|
public class DmpRDAMapper {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(DmpRDAMapper.class);
|
|
|
|
private DatasetRDAMapper datasetRDAMapper;
|
|
private final ObjectMapper mapper;
|
|
|
|
|
|
@Autowired
|
|
public DmpRDAMapper(DatasetRDAMapper datasetRDAMapper) throws IOException {
|
|
this.datasetRDAMapper = datasetRDAMapper;
|
|
this.mapper = new ObjectMapper();
|
|
}
|
|
|
|
public Dmp toRDA(DmpFileTransformerModel dmp) throws InvalidApplicationException, JsonProcessingException {
|
|
|
|
List<ReferenceFileTransformerModel> grants = new ArrayList<>();
|
|
List<ReferenceFileTransformerModel> researchers = new ArrayList<>();
|
|
List<ReferenceFileTransformerModel> organizations = new ArrayList<>();
|
|
List<ReferenceFileTransformerModel> funders = new ArrayList<>();
|
|
List<ReferenceFileTransformerModel> projects = new ArrayList<>();
|
|
if (dmp.getDmpReferences() != null) {
|
|
grants = dmp.getDmpReferences().stream().map(DmpReferenceFileTransformerModel::getReference).filter(referenceFileModel -> referenceFileModel.getType().equals(ReferenceType.Grants)).toList();
|
|
researchers = dmp.getDmpReferences().stream().map(DmpReferenceFileTransformerModel::getReference).filter(reference -> reference.getType().equals(ReferenceType.Researcher)).toList();
|
|
organizations = dmp.getDmpReferences().stream().map(DmpReferenceFileTransformerModel::getReference).filter(referenceFileModel -> referenceFileModel.getType().equals(ReferenceType.Organizations)).toList();
|
|
funders = dmp.getDmpReferences().stream().map(DmpReferenceFileTransformerModel::getReference).filter(referenceFileModel -> referenceFileModel.getType().equals(ReferenceType.Funder)).toList();
|
|
projects = dmp.getDmpReferences().stream().map(DmpReferenceFileTransformerModel::getReference).filter(reference -> reference.getType().equals(ReferenceType.Project)).toList();
|
|
}
|
|
|
|
if (dmp.getDescriptions() == null || dmp.getDescriptions().isEmpty()) { //TODO
|
|
throw new IllegalArgumentException("DMP has no Datasets");
|
|
}
|
|
Map<String, Object> extraProperties;
|
|
if (dmp.getProperties() == null) {
|
|
throw new IllegalArgumentException("DMP is missing language and contact properties");
|
|
} else {
|
|
extraProperties = mapper.readValue(dmp.getProperties(), HashMap.class);
|
|
/*if (extraProperties.get("language") == null) {
|
|
throw new IllegalArgumentException("DMP must have it's language property defined");
|
|
}*/
|
|
if (extraProperties.get("contacts") == null) {
|
|
throw new IllegalArgumentException("DMP must have it's contact property defined");
|
|
}
|
|
}
|
|
Dmp rda = new Dmp();
|
|
if (dmp.getEntityDois() != null && !dmp.getEntityDois().isEmpty()) {
|
|
for(EntityDoiFileTransformerModel doi: dmp.getEntityDois()){
|
|
if(doi.getRepositoryId().equals("Zenodo")){
|
|
rda.setDmpId(DmpIdRDAMapper.toRDA(doi.getDoi()));
|
|
}
|
|
}
|
|
} else {
|
|
rda.setDmpId(DmpIdRDAMapper.toRDA(dmp.getId()));
|
|
}
|
|
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");
|
|
}
|
|
rda.setCreated(dmp.getCreatedAt()); //TODO
|
|
rda.setDescription(dmp.getDescription());
|
|
rda.setModified(dmp.getUpdatedAt());
|
|
rda.setTitle(dmp.getLabel());
|
|
rda.setLanguage(LanguageRDAMapper.mapLanguageIsoToRDAIso(dmp.getLanguage() != null ? dmp.getLanguage() : "en"));
|
|
|
|
if (!extraProperties.isEmpty()) {
|
|
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);
|
|
}
|
|
});
|
|
}
|
|
|
|
UUID contactId = UUID.fromString((String) ((List<Map<String, Object>>) extraProperties.get("contacts")).get(0).get("userId"));
|
|
if (contactId != null) {
|
|
UserFileTransformerModel userContact = dmp.getDmpUsers().stream().map(DmpUserFileTransformerModel::getUser)
|
|
.filter(userFileModel -> userFileModel.getId().equals(contactId))
|
|
.findFirst().orElse(null);
|
|
if (userContact != null) {
|
|
rda.setContact(ContactRDAMapper.toRDA(userContact));
|
|
}
|
|
}
|
|
}
|
|
|
|
/*UserInfo creator;
|
|
if (dmp.getCreator() != null) {
|
|
creator = dmp.getCreator();
|
|
} else {
|
|
creator = dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).map(UserDMP::getUser).findFirst().orElse(new UserInfo());
|
|
}
|
|
rda.setContact(ContactRDAMapper.toRDA(creator));*/
|
|
rda.setContributor(new ArrayList<>());
|
|
if (!researchers.isEmpty()) {
|
|
rda.getContributor().addAll(researchers.stream().map(ContributorRDAMapper::toRDA).toList());
|
|
}
|
|
rda.getContributor().addAll(dmp.getDmpUsers().stream().map(ContributorRDAMapper::toRDA).toList());
|
|
rda.setDataset(dmp.getDescriptions().stream().map(dataset -> datasetRDAMapper.toRDA(dataset, rda)).toList());
|
|
if (!projects.isEmpty() && !grants.isEmpty() && !funders.isEmpty()) {
|
|
rda.setProject(List.of(ProjectRDAMapper.toRDA(projects.get(0), grants.get(0), funders.get(0))));
|
|
}
|
|
rda.setAdditionalProperty("templates", dmp.getDescriptions().stream().map(descriptionFileTransformerModel -> descriptionFileTransformerModel.getDescriptionTemplate().getId().toString()).toList());
|
|
return rda;
|
|
}
|
|
|
|
public DmpFileTransformerModel toEntity(Dmp rda, List<DescriptionTemplateFileTransformerModel> profiles) throws InvalidApplicationException, JsonProcessingException {
|
|
DmpFileTransformerModel entity = new DmpFileTransformerModel();
|
|
entity.setLabel(rda.getTitle());
|
|
/*if (rda.getDmpId().getType() == DmpId.Type.DOI) { //TODO
|
|
try {
|
|
//TODO: Find from doi = rda.getDmpId().getIdentifier()
|
|
EntityDoi doi = new EntityDoi();
|
|
List<EntityDoi> dois = new ArrayList<>();
|
|
dois.add(doi);
|
|
entity.setEntityDois(dois);
|
|
}
|
|
catch (NoResultException e) {
|
|
logger.warn("No entity doi: " + rda.getDmpId().getIdentifier() + " found in database. No dois are added to dmp.");
|
|
entity.setDois(new HashSet<>());
|
|
}
|
|
}*/
|
|
/*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()));
|
|
}*/
|
|
/*if (entity.getAssociatedDmps() == null) {
|
|
entity.setAssociatedDmps(new HashSet<>());
|
|
}*/
|
|
/*if (profiles != null && entity.getId() != null) {
|
|
for (String profile : profiles) {
|
|
entity.getAssociatedDmps().add(this.getProfile(profile, entity.getId()));
|
|
}
|
|
}*/
|
|
entity.setDmpReferences(new ArrayList<>());
|
|
|
|
if (rda.getContributor() != null && !rda.getContributor().isEmpty() && rda.getContributor().get(0).getContributorId() != null) {
|
|
entity.getDmpReferences().addAll(rda.getContributor().stream().filter(r -> r.getContributorId() != null).map(ContributorRDAMapper::toEntity)
|
|
.map(reference -> {
|
|
DmpReferenceFileTransformerModel dmpReference = new DmpReferenceFileTransformerModel();
|
|
dmpReference.setReference(reference);
|
|
return dmpReference;
|
|
}).toList());
|
|
}
|
|
entity.setCreatedAt(rda.getCreated());
|
|
entity.setUpdatedAt(rda.getModified());
|
|
entity.setDescription(rda.getDescription());
|
|
entity.setDescriptions(rda.getDataset().stream().map(rda1 -> datasetRDAMapper.toEntity(rda1, profiles.get(0))).toList());
|
|
if (!rda.getProject().isEmpty()) {
|
|
entity.getDmpReferences().addAll(ProjectRDAMapper.toEntity(rda.getProject().get(0)).stream()
|
|
.map(reference -> {
|
|
DmpReferenceFileTransformerModel dmpReference = new DmpReferenceFileTransformerModel();
|
|
dmpReference.setReference(reference);
|
|
return dmpReference;
|
|
}).toList());
|
|
}
|
|
|
|
Map<String, Object> extraProperties = new HashMap<>();
|
|
extraProperties.put("language", LanguageRDAMapper.mapRDAIsoToLanguageIso(rda.getLanguage()));
|
|
|
|
entity.setProperties(mapper.writeValueAsString(extraProperties));
|
|
|
|
return entity;
|
|
}
|
|
|
|
// private DmpDescriptionTemplateEntity getProfile(String descriptionTemplateId, UUID dmpId) throws InvalidApplicationException {
|
|
// return this.queryFactory.query(DmpDescriptionTemplateQuery.class).dmpIds(dmpId).descriptionTemplateIds(UUID.fromString(descriptionTemplateId)).first();
|
|
// }
|
|
}
|