2020-03-20 17:20:22 +01:00
|
|
|
package eu.eudat.models.rda.mapper;
|
|
|
|
|
2020-03-26 17:39:25 +01:00
|
|
|
import eu.eudat.data.entities.*;
|
|
|
|
import eu.eudat.logic.services.ApiContext;
|
2020-06-09 16:12:09 +02:00
|
|
|
import eu.eudat.logic.utilities.helpers.StreamDistinctBy;
|
2020-03-20 17:20:22 +01:00
|
|
|
import eu.eudat.models.rda.Dmp;
|
2020-03-26 17:39:25 +01:00
|
|
|
import eu.eudat.models.rda.DmpId;
|
2020-06-03 11:13:31 +02:00
|
|
|
import net.minidev.json.JSONObject;
|
2020-03-20 17:20:22 +01:00
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
|
|
import javax.transaction.Transactional;
|
2020-06-03 11:13:31 +02:00
|
|
|
import java.io.IOException;
|
2020-03-26 17:39:25 +01:00
|
|
|
import java.util.*;
|
2020-03-20 17:20:22 +01:00
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
@Component
|
|
|
|
public class DmpRDAMapper {
|
|
|
|
|
|
|
|
private DatasetRDAMapper datasetRDAMapper;
|
2020-03-26 17:39:25 +01:00
|
|
|
private ApiContext apiContext;
|
2020-03-20 17:20:22 +01:00
|
|
|
|
2020-06-03 11:13:31 +02:00
|
|
|
|
2020-03-20 17:20:22 +01:00
|
|
|
@Autowired
|
2020-06-03 11:13:31 +02:00
|
|
|
public DmpRDAMapper(DatasetRDAMapper datasetRDAMapper, ApiContext apiContext) throws IOException {
|
2020-03-20 17:20:22 +01:00
|
|
|
this.datasetRDAMapper = datasetRDAMapper;
|
2020-03-26 17:39:25 +01:00
|
|
|
this.apiContext = apiContext;
|
2020-06-03 11:13:31 +02:00
|
|
|
|
2020-03-20 17:20:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Transactional
|
|
|
|
public Dmp toRDA(DMP dmp) {
|
|
|
|
Dmp rda = new Dmp();
|
|
|
|
if (dmp.getDoi() != null && !dmp.getDoi().isEmpty()) {
|
|
|
|
rda.setDmpId(DmpIdRDAMapper.toRDA(dmp.getDoi()));
|
|
|
|
} else {
|
|
|
|
rda.setDmpId(DmpIdRDAMapper.toRDA(dmp.getId()));
|
|
|
|
}
|
|
|
|
rda.setCreated(dmp.getCreated());
|
|
|
|
rda.setDescription(dmp.getDescription());
|
|
|
|
rda.setModified(dmp.getModified());
|
|
|
|
rda.setTitle(dmp.getLabel());
|
|
|
|
|
2020-06-03 11:13:31 +02:00
|
|
|
Map<String, Object> extraProperties = new org.json.JSONObject(dmp.getExtraProperties()).toMap();
|
|
|
|
rda.setLanguage(LanguageRDAMapper.mapLanguageIsoToRDAIso(extraProperties.get("language").toString()));
|
|
|
|
|
2020-03-20 17:20:22 +01:00
|
|
|
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));
|
2020-03-30 15:44:49 +02:00
|
|
|
rda.setContributor(new ArrayList<>());
|
|
|
|
if (dmp.getResearchers() != null && !dmp.getResearchers().isEmpty()) {
|
|
|
|
rda.getContributor().addAll(dmp.getResearchers().stream().map(ContributorRDAMapper::toRDA).collect(Collectors.toList()));
|
|
|
|
}
|
|
|
|
// rda.getContributor().addAll(dmp.getUsers().stream().map(ContributorRDAMapper::toRDA).collect(Collectors.toList()));
|
2020-06-09 15:25:50 +02:00
|
|
|
rda.setDataset(dmp.getDataset().stream().map(dataset -> datasetRDAMapper.toRDA(dataset, rda.getContributor())).collect(Collectors.toList()));
|
2020-03-20 17:20:22 +01:00
|
|
|
rda.setProject(Collections.singletonList(ProjectRDAMapper.toRDA(dmp.getProject(), dmp.getGrant())));
|
2020-03-26 17:39:25 +01:00
|
|
|
rda.setAdditionalProperty("templates", dmp.getAssociatedDmps().stream().map(datasetProfile -> datasetProfile.getId().toString()).toArray());
|
|
|
|
return rda;
|
|
|
|
}
|
2020-03-20 17:20:22 +01:00
|
|
|
|
2020-05-29 12:39:18 +02:00
|
|
|
public DMP toEntity(Dmp rda, String[] profiles) {
|
2020-03-26 17:39:25 +01:00
|
|
|
DMP entity = new DMP();
|
|
|
|
entity.setLabel(rda.getTitle());
|
|
|
|
if (rda.getDmpId().getType() == DmpId.Type.DOI) {
|
|
|
|
entity.setDoi(rda.getDmpId().getIdentifier());
|
|
|
|
}
|
2020-05-29 12:39:18 +02:00
|
|
|
if (((List<String>) rda.getAdditionalProperties().get("templates")) != null && !((List<String>) rda.getAdditionalProperties().get("templates")).isEmpty()) {
|
|
|
|
entity.setAssociatedDmps(((List<String>) rda.getAdditionalProperties().get("templates")).stream().map(this::getProfile).collect(Collectors.toSet()));
|
|
|
|
}
|
|
|
|
if (entity.getAssociatedDmps() == null) {
|
|
|
|
entity.setAssociatedDmps(new HashSet<>());
|
|
|
|
}
|
2020-06-03 11:13:31 +02:00
|
|
|
if (profiles != null) {
|
|
|
|
for (String profile : profiles) {
|
|
|
|
DatasetProfile exProfile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(profile));
|
|
|
|
entity.getAssociatedDmps().add(exProfile);
|
|
|
|
}
|
2020-05-29 12:39:18 +02:00
|
|
|
}
|
2020-03-30 15:44:49 +02:00
|
|
|
if (rda.getContributor() != null && !rda.getContributor().isEmpty()) {
|
2020-06-09 16:12:09 +02:00
|
|
|
entity.setResearchers(rda.getContributor().stream().map(ContributorRDAMapper::toEntity).filter(StreamDistinctBy.distinctByKey(Researcher::getReference)).collect(Collectors.toSet()));
|
2020-03-30 15:44:49 +02:00
|
|
|
}
|
2020-03-26 17:39:25 +01:00
|
|
|
entity.setCreated(rda.getCreated());
|
|
|
|
entity.setModified(rda.getModified());
|
|
|
|
entity.setDescription(rda.getDescription());
|
2020-05-29 12:39:18 +02:00
|
|
|
DatasetProfile defaultProfile = ((DatasetProfile)entity.getAssociatedDmps().toArray()[0]);
|
|
|
|
entity.setDataset(rda.getDataset().stream().map(rda1 -> datasetRDAMapper.toEntity(rda1, defaultProfile)).collect(Collectors.toSet()));
|
2020-03-26 17:39:25 +01:00
|
|
|
Map<String, Object> result = ProjectRDAMapper.toEntity(rda.getProject().get(0), apiContext);
|
|
|
|
entity.setProject((Project) result.get("project"));
|
|
|
|
result.entrySet().stream().filter(entry -> entry.getKey().startsWith("grant")).forEach(entry -> entity.setGrant((Grant) entry.getValue()));
|
2020-06-03 11:13:31 +02:00
|
|
|
|
|
|
|
Map<String, Object> extraProperties = new HashMap<>();
|
|
|
|
extraProperties.put("language", LanguageRDAMapper.mapRDAIsoToLanguageIso(rda.getLanguage()));
|
|
|
|
|
|
|
|
entity.setExtraProperties(JSONObject.toJSONString(extraProperties));
|
|
|
|
|
2020-03-26 17:39:25 +01:00
|
|
|
return entity;
|
|
|
|
}
|
2020-03-20 17:20:22 +01:00
|
|
|
|
2020-03-26 17:39:25 +01:00
|
|
|
private DatasetProfile getProfile(String id) {
|
|
|
|
return apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id));
|
2020-03-20 17:20:22 +01:00
|
|
|
}
|
|
|
|
}
|