diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index 4eb31711b..f7323b650 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -161,8 +161,8 @@ public class DMPs extends BaseController { @RequestMapping(method = RequestMethod.POST, value = {"/clone/{id}"}, consumes = "application/json", produces = "application/json") public @ResponseBody ResponseEntity> clone(@PathVariable UUID id, @RequestBody eu.eudat.models.data.dmp.DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { - this.dataManagementPlanManager.clone(id, dataManagementPlan, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); + this.dataManagementPlanManager.clone(dataManagementPlan, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); } @Transactional diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 951ec498e..d5d2d1fd6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -455,18 +455,9 @@ public class DataManagementPlanManager { } } - if (newDmp.getGrant().getId() != null) { - Grant grant = apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().find(newDmp.getGrant().getId()); - if (grant.getFunder() != null && newDmp.getGrant().getFunder() != null - && !grant.getFunder().getId().equals(newDmp.getGrant().getFunder().getId()) - && !grant.getCreationUser().getId().equals(user.getId())){ - throw new Exception("User is not the owner of the Grant, therefore, cannot edit it"); - } - } + checkIfUserCanEditGrant(newDmp, user); + checkIfGrandHasCreationUser(newDmp, user); - if (newDmp.getGrant().getCreationUser() == null) { - newDmp.getGrant().setCreationUser(user); - } apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().createOrUpdate(newDmp.getGrant()); newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); @@ -502,77 +493,88 @@ public class DataManagementPlanManager { } if (dataManagementPlan.getAssociatedUsers().size() == 0) - assignUser(newDmp, user, apiContext); + assignUser(newDmp, user); return newDmp; } - public void assignUser(DMP dmp, UserInfo userInfo, ApiContext apiContext) { + public void assignUser(DMP dmp, UserInfo userInfo) { UserDMP userDMP = new UserDMP(); userDMP.setDmp(dmp); userDMP.setUser(userInfo); userDMP.setRole(UserDMP.UserDMPRoles.OWNER.getValue()); - apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP); + databaseRepository.getUserDmpDao().createOrUpdate(userDMP); } public void newVersion(UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { - DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid); + DMP oldDmp = databaseRepository.getDmpDao().find(uuid); DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); LinkedList list = new LinkedList<>(); list.push(oldDmp.getGroupId()); criteria.setGroupIds(list); criteria.setAllVersions(false); - QueryableList dataManagementPlanQueryableList = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria); + QueryableList dataManagementPlanQueryableList = databaseRepository.getDmpDao().getWithCriteria(criteria); List latestVersionDMP = dataManagementPlanQueryableList.toList(); if (latestVersionDMP.get(0).getVersion().equals(oldDmp.getVersion())) { DMP newDmp = dataManagementPlan.toDataModel(); - createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); - createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao()); + + createOrganisationsIfTheyDontExist(newDmp, databaseRepository.getOrganisationDao()); + createResearchersIfTheyDontExist(newDmp, databaseRepository.getResearcherDao()); UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); - createGrantIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getGrantDao()); - createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao()); + + createFunderIfItDoesntExist(newDmp, databaseRepository.getFunderDao()); + createGrantIfItDoesntExist(newDmp, databaseRepository.getGrantDao()); + if (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty()) { + newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + } + createProjectIfItDoesntExist(newDmp, databaseRepository.getProjectDao()); newDmp.setGroupId(oldDmp.getGroupId()); newDmp.setVersion(oldDmp.getVersion() + 1); newDmp.setId(null); - newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); + + checkIfUserCanEditGrant(newDmp, user); + checkIfGrandHasCreationUser(newDmp, user); + databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant()); + newDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp); // Assign creator. - UserDMP userDMP = new UserDMP(); - userDMP.setDmp(newDmp); - userDMP.setUser(user); - userDMP.setRole((UserDMP.UserDMPRoles.OWNER.getValue())); - apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP); + assignUser(newDmp, user); - copyDatasets(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()); + copyDatasets(newDmp, databaseRepository.getDatasetDao()); } else { throw new DMPNewVersionException("Version to update not the latest."); } } - public void clone(UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { + public void clone(DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { DMP newDmp = dataManagementPlan.toDataModel(); - createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); - createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao()); + createOrganisationsIfTheyDontExist(newDmp, databaseRepository.getOrganisationDao()); + createResearchersIfTheyDontExist(newDmp, databaseRepository.getResearcherDao()); UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); - createGrantIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getGrantDao()); - createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao()); + + createFunderIfItDoesntExist(newDmp, databaseRepository.getFunderDao()); + createGrantIfItDoesntExist(newDmp, databaseRepository.getGrantDao()); + if (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty()) { + newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + } + createProjectIfItDoesntExist(newDmp, databaseRepository.getProjectDao()); newDmp.setGroupId(UUID.randomUUID()); newDmp.setVersion(0); newDmp.setId(null); - newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); + + checkIfUserCanEditGrant(newDmp, user); + checkIfGrandHasCreationUser(newDmp, user); + databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant()); + newDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp); // Assign creator. - UserDMP userDMP = new UserDMP(); - userDMP.setDmp(newDmp); - userDMP.setUser(user); - userDMP.setRole((UserDMP.UserDMPRoles.OWNER.getValue())); - apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP); - copyDatasets(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()); + assignUser(newDmp, user); + copyDatasets(newDmp, databaseRepository.getDatasetDao()); } public void delete(UUID uuid) throws DMPWithDatasetsDeleteException { @@ -652,6 +654,21 @@ public class DataManagementPlanManager { } } + private void checkIfUserCanEditGrant(DMP dmp, UserInfo user) throws Exception{ + if (dmp.getGrant().getId() != null) { + Grant grant = apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().find(dmp.getGrant().getId()); + if (grant.getFunder() != null && dmp.getGrant().getFunder() != null + && !grant.getFunder().getId().equals(dmp.getGrant().getFunder().getId())) { + if (grant.getCreationUser() == null) { + throw new Exception("Grant has no user, therefore, cannot be edited."); + } + if (!grant.getCreationUser().getId().equals(user.getId())) { + throw new Exception("User is not the owner of the Grant, therefore, cannot edit it."); + } + } + } + } + private void checkDmpValidationRules(DMP dmp) throws Exception { if (dmp.getLabel() == null || dmp.getLabel().trim().isEmpty()) { throw new Exception("DMP has no label."); @@ -664,6 +681,12 @@ public class DataManagementPlanManager { } } + private void checkIfGrandHasCreationUser(DMP dmp, UserInfo user) { + if (dmp.getGrant().getCreationUser() == null) { + dmp.getGrant().setCreationUser(user); + } + } + private void copyDatasets(DMP newDmp, DatasetDao datasetDao) { List> futures = new LinkedList<>(); for (Dataset dataset : newDmp.getDataset()) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanNewVersionModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanNewVersionModel.java index dc49c14c6..6ed8b89f3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanNewVersionModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanNewVersionModel.java @@ -1,10 +1,11 @@ package eu.eudat.models.data.dmp; -import eu.eudat.data.entities.DMP; -import eu.eudat.data.entities.UserDMP; +import eu.eudat.data.entities.*; import eu.eudat.models.DataModel; import eu.eudat.models.data.dataset.Dataset; -import eu.eudat.models.data.grant.Grant; +import eu.eudat.models.data.funder.FunderDMPEditorModel; +import eu.eudat.models.data.grant.GrantDMPEditorModel; +import eu.eudat.models.data.project.ProjectDMPEditorModel; import eu.eudat.models.data.userinfo.UserInfo; import java.util.*; @@ -21,18 +22,19 @@ public class DataManagementPlanNewVersionModel implements DataModel profiles; - private eu.eudat.models.data.grant.Grant grant; + private eu.eudat.models.data.grant.GrantDMPEditorModel grant; private List organisations; private List researchers; private List associatedUsers; private eu.eudat.models.data.userinfo.UserInfo creator; private Date created; private List datasets; + private ProjectDMPEditorModel project; + private FunderDMPEditorModel funder; public UUID getId() { return id; } - public void setId(UUID id) { this.id = id; } @@ -40,7 +42,6 @@ public class DataManagementPlanNewVersionModel implements DataModel getProfiles() { return profiles; } - public void setProfiles(List profiles) { this.profiles = profiles; } - public Grant getGrant() { + public GrantDMPEditorModel getGrant() { return grant; } - - public void setGrant(Grant grant) { + public void setGrant(GrantDMPEditorModel grant) { this.grant = grant; } public List getOrganisations() { return organisations; } - public void setOrganisations(List organisations) { this.organisations = organisations; } @@ -104,7 +98,6 @@ public class DataManagementPlanNewVersionModel implements DataModel getResearchers() { return researchers; } - public void setResearchers(List researchers) { this.researchers = researchers; } @@ -112,7 +105,6 @@ public class DataManagementPlanNewVersionModel implements DataModel getAssociatedUsers() { return associatedUsers; } - public void setAssociatedUsers(List associatedUsers) { this.associatedUsers = associatedUsers; } @@ -120,7 +112,6 @@ public class DataManagementPlanNewVersionModel implements DataModel getDatasets() { return datasets; } - public void setDatasets(List datasets) { this.datasets = datasets; } + public ProjectDMPEditorModel getProject() { + return project; + } + public void setProject(ProjectDMPEditorModel project) { + this.project = project; + } + + public FunderDMPEditorModel getFunder() { + return funder; + } + public void setFunder(FunderDMPEditorModel funder) { + this.funder = funder; + } + @Override public DataManagementPlanNewVersionModel fromDataModel(DMP entity) { return null; @@ -170,16 +173,76 @@ public class DataManagementPlanNewVersionModel implements DataModel(this.organisations.stream().map(item -> item.toDataModel()).collect(Collectors.toList()))); if (this.researchers != null && !this.researchers.isEmpty()) entity.setResearchers(new HashSet<>(this.researchers.stream().map(item -> item.toDataModel()).collect(Collectors.toList()))); - if (this.grant != null) entity.setGrant(this.grant.toDataModel()); + /*if (this.grant != null) { + entity.setGrant(this.grant.toDataModel()); + }*/ + + if (this.grant != null) { + if (this.grant.getExistGrant() != null && this.grant.getLabel() == null && this.grant.getDescription() == null) + entity.setGrant(this.grant.getExistGrant().toDataModel()); + else { + eu.eudat.data.entities.Grant grant = new eu.eudat.data.entities.Grant(); + grant.setAbbreviation(""); + grant.setLabel(this.grant.getLabel()); + grant.setType(eu.eudat.data.entities.Grant.GrantType.INTERNAL.getValue()); + grant.setReference("dmp:" + this.grant.getLabel()); + grant.setUri(""); + grant.setDefinition(""); + grant.setCreated(new Date()); + grant.setStatus(Grant.Status.ACTIVE.getValue()); + grant.setModified(new Date()); + grant.setDescription(this.grant.getDescription()); + + entity.setGrant(grant); + } + } + + if(this.funder == null && this.funder.getExistFunder() == null && this.funder.getLabel() == null) { + entity.getGrant().setFunder(null); + } + else if (this.funder != null && this.funder.getExistFunder() == null && this.funder.getLabel() == null) { + entity.getGrant().setFunder(null); + } + else { + if (this.funder.getLabel() != null) { + Funder funder = new Funder(); + funder.setLabel(this.funder.getLabel()); + funder.setType(Funder.FunderType.INTERNAL.getValue()); + funder.setReference("dmp:" + this.funder.getLabel()); + funder.setDefinition(""); + funder.setCreated(new Date()); + funder.setStatus(Funder.Status.ACTIVE.getValue()); + funder.setModified(new Date()); + + entity.getGrant().setFunder(funder); + } + else if (this.funder.getExistFunder() != null && this.funder.getLabel() == null){ + entity.getGrant().setFunder(this.funder.getExistFunder().toDataModel()); + } + } + + if (this.project != null) { + if (this.project.getExistProject() != null && this.project.getLabel() == null && this.project.getDescription() == null) + entity.setProject(this.project.getExistProject().toDataModel()); + else { + Project project = new Project(); + project.setAbbreviation(""); + project.setLabel(this.project.getLabel()); + project.setType(Project.ProjectType.INTERNAL.getValue()); + project.setReference("dmp:" + this.project.getLabel()); + project.setUri(""); + project.setDefinition(""); + project.setCreated(new Date()); + project.setStatus(Project.Status.ACTIVE.getValue()); + project.setModified(new Date()); + project.setDescription(this.project.getDescription()); + + entity.setProject(project); + } + } + if (this.profiles != null) entity.setAssociatedDmps(this.profiles.stream().map(x -> x.toData()).collect(Collectors.toSet())); - /*Document associatedProfileDoc = XmlBuilder.getDocument(); - Element associatedProfilesElement = associatedProfileDoc.createElement("profiles"); - for (AssociatedProfile associatedProfile : this.profiles) { - associatedProfilesElement.appendChild(associatedProfile.toXml(associatedProfileDoc)); - } - associatedProfileDoc.appendChild(associatedProfilesElement); - entity.setAssociatedDmps(XmlBuilder.generateXml(associatedProfileDoc));*/ return entity; }