package eu.eudat.models.rda.mapper; import eu.eudat.data.entities.*; import eu.eudat.logic.services.ApiContext; import eu.eudat.models.rda.Dmp; import eu.eudat.models.rda.DmpId; import net.minidev.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.transaction.Transactional; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @Component public class DmpRDAMapper { private DatasetRDAMapper datasetRDAMapper; private ApiContext apiContext; @Autowired public DmpRDAMapper(DatasetRDAMapper datasetRDAMapper, ApiContext apiContext) throws IOException { this.datasetRDAMapper = datasetRDAMapper; this.apiContext = apiContext; } @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()); Map extraProperties = new org.json.JSONObject(dmp.getExtraProperties()).toMap(); rda.setLanguage(LanguageRDAMapper.mapLanguageIsoToRDAIso(extraProperties.get("language").toString())); 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 (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())); rda.setDataset(dmp.getDataset().stream().map(dataset -> datasetRDAMapper.toRDA(dataset)).collect(Collectors.toList())); rda.setProject(Collections.singletonList(ProjectRDAMapper.toRDA(dmp.getProject(), dmp.getGrant()))); rda.setAdditionalProperty("templates", dmp.getAssociatedDmps().stream().map(datasetProfile -> datasetProfile.getId().toString()).toArray()); return rda; } public DMP toEntity(Dmp rda, String[] profiles) { DMP entity = new DMP(); entity.setLabel(rda.getTitle()); if (rda.getDmpId().getType() == DmpId.Type.DOI) { entity.setDoi(rda.getDmpId().getIdentifier()); } if (((List) rda.getAdditionalProperties().get("templates")) != null && !((List) rda.getAdditionalProperties().get("templates")).isEmpty()) { entity.setAssociatedDmps(((List) rda.getAdditionalProperties().get("templates")).stream().map(this::getProfile).collect(Collectors.toSet())); } if (entity.getAssociatedDmps() == null) { entity.setAssociatedDmps(new HashSet<>()); } if (profiles != null) { for (String profile : profiles) { DatasetProfile exProfile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(profile)); entity.getAssociatedDmps().add(exProfile); } } if (rda.getContributor() != null && !rda.getContributor().isEmpty()) { entity.setResearchers(rda.getContributor().stream().map(ContributorRDAMapper::toEntity).collect(Collectors.toSet())); } entity.setCreated(rda.getCreated()); entity.setModified(rda.getModified()); entity.setDescription(rda.getDescription()); DatasetProfile defaultProfile = ((DatasetProfile)entity.getAssociatedDmps().toArray()[0]); entity.setDataset(rda.getDataset().stream().map(rda1 -> datasetRDAMapper.toEntity(rda1, defaultProfile)).collect(Collectors.toSet())); Map 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())); Map extraProperties = new HashMap<>(); extraProperties.put("language", LanguageRDAMapper.mapRDAIsoToLanguageIso(rda.getLanguage())); entity.setExtraProperties(JSONObject.toJSONString(extraProperties)); return entity; } private DatasetProfile getProfile(String id) { return apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); } }