package eu.eudat.managers; import java.text.ParseException; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; import eu.eudat.dao.entities.*; import eu.eudat.entities.DMP; import eu.eudat.entities.Project; import eu.eudat.entities.UserInfo; import eu.eudat.exceptions.UnauthorisedException; import eu.eudat.models.HintedModelFactory; import eu.eudat.models.criteria.DataManagementPlanCriteria; import eu.eudat.models.criteria.OrganisationCriteria; import eu.eudat.models.criteria.ProjectCriteria; import eu.eudat.models.criteria.ResearcherCriteria; import eu.eudat.models.dmp.DataManagementPlan; import eu.eudat.models.dmp.DataManagementPlanCriteriaRequest; import eu.eudat.models.dmp.DataManagementPlanTableRequest; import eu.eudat.models.helpers.DataTableData; import eu.eudat.models.listingmodels.DataManagementPlanListingModel; import eu.eudat.models.security.Principal; import eu.eudat.queryable.QueryableList; import eu.eudat.services.ApiContext; import eu.eudat.utilities.builders.DomainModelConverter; public class DataManagementPlanManager { public DataTableData getPaged(ApiContext apiContext, DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal) throws IllegalAccessException, InstantiationException { UserInfo userInfo = new UserInfo(); userInfo.setId(principal.getId()); QueryableList items = apiContext.getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()); QueryableList authItems = apiContext.getDatabaseRepository().getDmpDao().getAuthenticated(items, userInfo); QueryableList pagedItems = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest); List datamanagementPlans = new DomainModelConverter().fromDataModel(pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)).toList(), DataManagementPlanListingModel.class); DataTableData dataTable = new DataTableData(); dataTable.setData(datamanagementPlans); dataTable.setTotalCount(items.count()); return dataTable; } public eu.eudat.models.dmp.DataManagementPlan getSingle(DMPDao dmpsRepository, String id, Principal principal) throws InstantiationException, IllegalAccessException { DMP dataManagementPlanEntity = dmpsRepository.find(UUID.fromString(id)); if (dataManagementPlanEntity.getCreator().getId() != principal.getId() && dataManagementPlanEntity.getUsers().stream().filter(userInfo -> userInfo.getId() == principal.getId()).collect(Collectors.toList()).size() == 0) throw new UnauthorisedException(); eu.eudat.models.dmp.DataManagementPlan datamanagementPlan = new eu.eudat.models.dmp.DataManagementPlan(); datamanagementPlan.fromDataModel(dataManagementPlanEntity); return datamanagementPlan; } public List getWithCriteria(DMPDao dmpsRepository, DataManagementPlanCriteriaRequest dataManagementPlanCriteria) throws IllegalAccessException, InstantiationException { QueryableList items = dmpsRepository.getWithCriteria(dataManagementPlanCriteria.getCriteria()); List datamanagementPlans = new DomainModelConverter().fromDataModel(items.toList(), eu.eudat.models.dmp.DataManagementPlan.class); return datamanagementPlans; } public static void createOrUpdate(ApiContext apiContext, DataManagementPlan dataManagementPlan, Principal principal) throws Exception { DMP newDmp = dataManagementPlan.toDataModel(); createOrganisationsIfTheyDontExist(newDmp, apiContext.getDatabaseRepository().getOrganisationDao()); createResearchersIfTheyDontExist(newDmp, apiContext.getDatabaseRepository().getResearcherDao()); UserInfo user = apiContext.getDatabaseRepository().getUserInfoDao().find(principal.getId()); createProjectIfItDoesntExist(newDmp, apiContext.getDatabaseRepository().getProjectDao(), user); newDmp.setCreator(user); apiContext.getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); } private static void createResearchersIfTheyDontExist(DMP newDmp, ResearcherDao researcherRepository) { if (newDmp.getResearchers() != null && !newDmp.getResearchers().isEmpty()) { for (eu.eudat.entities.Researcher researcher : newDmp.getResearchers()) { ResearcherCriteria criteria = new ResearcherCriteria(); criteria.setLike(researcher.getReference()); List entries = researcherRepository.listBy(criteria); if (entries != null && !entries.isEmpty()) researcher.setId(entries.get(0).getId()); else researcher = researcherRepository.create(researcher); } } } private static void createOrganisationsIfTheyDontExist(DMP newDmp, OrganisationDao organisationRepository) { if (newDmp.getOrganisations() != null && !newDmp.getOrganisations().isEmpty()) { for (eu.eudat.entities.Organisation organisation : newDmp.getOrganisations()) { OrganisationCriteria criteria = new OrganisationCriteria(); criteria.setLike(organisation.getReference()); List entries = organisationRepository.listBy(criteria); if (entries != null && !entries.isEmpty()) organisation.setId(entries.get(0).getId()); else organisation = organisationRepository.create(organisation); } } } private static void createProjectIfItDoesntExist(DMP newDmp, ProjectDao projectDao, UserInfo userInfo) { if (newDmp.getProject() != null) { Project project = newDmp.getProject(); ProjectCriteria criteria = new ProjectCriteria(); criteria.setLike(project.getReference()); List entries = projectDao.getWithCriteria(criteria).toList(); if (entries != null && !entries.isEmpty()) project.setId(entries.get(0).getId()); else { project.setCreationUser(userInfo); projectDao.createOrUpdate(project); } } } }