argos/dmp-backend/web/src/main/java/eu/eudat/managers/DataManagementPlanManager.java

279 lines
17 KiB
Java
Raw Normal View History

2017-12-15 00:01:26 +01:00
package eu.eudat.managers;
2018-02-16 08:45:18 +01:00
import eu.eudat.builders.entity.UserInfoBuilder;
2018-03-28 15:24:47 +02:00
import eu.eudat.data.dao.criteria.DynamicFieldsCriteria;
import eu.eudat.data.dao.criteria.OrganisationCriteria;
import eu.eudat.data.dao.criteria.ProjectCriteria;
import eu.eudat.data.dao.criteria.ResearcherCriteria;
2018-03-21 11:57:56 +01:00
import eu.eudat.data.dao.entities.*;
import eu.eudat.data.entities.*;
2018-03-28 15:24:47 +02:00
import eu.eudat.data.query.items.item.dmp.DataManagementPlanCriteriaRequest;
import eu.eudat.data.query.items.table.dmp.DataManagementPlanTableRequest;
import eu.eudat.dynamicproject.DynamicProjectConfiguration;
import eu.eudat.dynamicproject.entities.Property;
2018-02-07 10:56:30 +01:00
import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsException;
import eu.eudat.exceptions.security.UnauthorisedException;
2018-01-19 10:31:05 +01:00
import eu.eudat.models.HintedModelFactory;
2017-12-19 09:38:47 +01:00
import eu.eudat.models.dmp.DataManagementPlan;
2018-02-07 10:56:30 +01:00
import eu.eudat.models.dmp.DataManagementPlanNewVersionModel;
2018-03-28 15:24:47 +02:00
import eu.eudat.models.dynamicfields.DynamicFieldWithValue;
import eu.eudat.models.helpermodels.Tuple;
2018-01-25 16:24:21 +01:00
import eu.eudat.models.helpers.common.DataTableData;
2017-12-19 15:09:49 +01:00
import eu.eudat.models.listingmodels.DataManagementPlanListingModel;
2018-02-07 10:56:30 +01:00
import eu.eudat.models.listingmodels.DatasetListingModel;
2017-12-20 15:52:09 +01:00
import eu.eudat.models.security.Principal;
import eu.eudat.queryable.QueryableList;
2018-01-04 10:32:39 +01:00
import eu.eudat.services.ApiContext;
2018-03-28 15:24:47 +02:00
import org.springframework.http.*;
2018-02-07 10:56:30 +01:00
import org.springframework.scheduling.annotation.Async;
2018-03-28 15:24:47 +02:00
import org.springframework.web.client.RestTemplate;
2017-12-15 00:01:26 +01:00
2018-03-28 15:24:47 +02:00
import java.util.*;
2018-02-16 11:34:02 +01:00
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
2017-12-15 00:01:26 +01:00
public class DataManagementPlanManager {
2018-01-25 16:24:21 +01:00
public DataTableData<DataManagementPlanListingModel> getPaged(ApiContext apiContext, DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal) throws Exception {
2018-01-12 09:05:44 +01:00
UserInfo userInfo = new UserInfo();
userInfo.setId(principal.getId());
2018-03-19 13:40:04 +01:00
QueryableList<DMP> items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class));
2018-03-05 17:18:45 +01:00
QueryableList<DMP> authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, userInfo);
2018-01-11 17:19:15 +01:00
QueryableList<DMP> pagedItems = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest);
2018-01-08 15:57:21 +01:00
2018-01-11 17:19:15 +01:00
DataTableData<DataManagementPlanListingModel> dataTable = new DataTableData<DataManagementPlanListingModel>();
2018-02-07 10:56:30 +01:00
2018-03-19 13:40:04 +01:00
CompletableFuture itemsFuture = pagedItems
2018-02-21 11:07:31 +01:00
.selectAsync(item -> new DataManagementPlanListingModel().fromDataModel(item)).whenComplete((resultList, throwable) -> {
dataTable.setData(resultList);
});
2018-02-07 10:56:30 +01:00
2018-03-19 13:40:04 +01:00
CompletableFuture countFuture = authItems.countAsync().whenComplete((count, throwable) -> {
2018-02-07 10:56:30 +01:00
dataTable.setTotalCount(count);
});
CompletableFuture.allOf(itemsFuture, countFuture).join();
2018-01-11 17:19:15 +01:00
return dataTable;
}
2017-12-19 09:38:47 +01:00
2018-03-28 15:24:47 +02:00
public eu.eudat.models.dmp.DataManagementPlan getSingle(DMPDao dmpsRepository, String id, Principal principal, DynamicProjectConfiguration dynamicProjectConfiguration) throws InstantiationException, IllegalAccessException {
2018-01-11 17:19:15 +01:00
DMP dataManagementPlanEntity = dmpsRepository.find(UUID.fromString(id));
2018-01-19 10:31:05 +01:00
if (dataManagementPlanEntity.getCreator().getId() != principal.getId() && dataManagementPlanEntity.getUsers().stream().filter(userInfo -> userInfo.getId() == principal.getId()).collect(Collectors.toList()).size() == 0)
2018-01-11 17:19:15 +01:00
throw new UnauthorisedException();
eu.eudat.models.dmp.DataManagementPlan datamanagementPlan = new eu.eudat.models.dmp.DataManagementPlan();
datamanagementPlan.fromDataModel(dataManagementPlanEntity);
2018-03-28 15:24:47 +02:00
Map dmpProperties = dataManagementPlanEntity.getDmpProperties() != null ? new org.json.JSONObject(dataManagementPlanEntity.getDmpProperties()).toMap() : null;
datamanagementPlan.setDynamicFields(dynamicProjectConfiguration.getFields().stream().map(item -> {
DynamicFieldWithValue fieldWithValue = new DynamicFieldWithValue();
fieldWithValue.setId(item.getId());
fieldWithValue.setDependencies(item.getDependencies());
fieldWithValue.setName(item.getName());
fieldWithValue.setQueryProperty(item.getQueryProperty());
fieldWithValue.setRequired(item.getRequired());
return fieldWithValue;
}).collect(Collectors.toList()));
if (dmpProperties != null && datamanagementPlan.getDynamicFields() != null)
datamanagementPlan.getDynamicFields().forEach(item -> {
Map<String, String> properties = (Map<String, String>) dmpProperties.get(item.getId());
if (properties != null)
item.setValue(new Tuple<String, String>(properties.get("id"), properties.get("label")));
});
2018-01-11 17:19:15 +01:00
return datamanagementPlan;
}
2017-12-20 15:52:09 +01:00
2018-01-11 17:19:15 +01:00
public List<DataManagementPlan> getWithCriteria(DMPDao dmpsRepository, DataManagementPlanCriteriaRequest dataManagementPlanCriteria) throws IllegalAccessException, InstantiationException {
QueryableList<DMP> items = dmpsRepository.getWithCriteria(dataManagementPlanCriteria.getCriteria());
2018-02-21 11:07:31 +01:00
List<eu.eudat.models.dmp.DataManagementPlan> datamanagementPlans = items.select(item -> new DataManagementPlan().fromDataModel(item));
2018-01-11 17:19:15 +01:00
return datamanagementPlans;
}
2017-12-20 15:52:09 +01:00
2018-03-28 15:24:47 +02:00
public List<Tuple<String, String>> getDynamicFields(String id, DynamicProjectConfiguration dynamicProjectConfiguration, DynamicFieldsCriteria criteria) throws IllegalAccessException, InstantiationException {
List<Tuple<String, String>> result = new LinkedList<>();
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
Property property = dynamicProjectConfiguration.getConfiguration().getConfigurationProperties().stream()
.filter(item -> item.getId().equals(id)).findFirst().orElse(null);
StringBuilder stringBuilder = new StringBuilder();
if (criteria.getLike() != null) stringBuilder.append("?search=" + criteria.getLike());
if (property.getDependencies() != null && !property.getDependencies().isEmpty() && criteria.getDynamicFields() != null && !criteria.getDynamicFields().isEmpty()) {
property.getDependencies().stream().forEach(item -> {
DynamicFieldsCriteria.DynamicFieldDependencyCriteria dependencyCriteria = criteria.getDynamicFields().stream().filter(dfield -> dfield.getProperty().equals(item.getId()))
.findFirst().orElse(null);
if (dependencyCriteria != null) {
if (criteria.getLike() != null || property.getDependencies().indexOf(item) > 0)
stringBuilder.append("&");
stringBuilder.append(item.getQueryProperty() + "=" + dependencyCriteria.getValue());
}
});
ResponseEntity<ArrayList> response = restTemplate.exchange(property.getSourceUrl() + stringBuilder.toString(), HttpMethod.GET, entity, ArrayList.class);
response.getBody().forEach(item -> {
Tuple<String, String> tuple = new Tuple<>();
tuple.setId((String) (((Map<String, Object>) item).get(property.getExternalFieldId())));
tuple.setLabel((String) (((Map<String, Object>) item).get(property.getExternalFieldLabel())));
result.add(tuple);
});
} else {
ResponseEntity<ArrayList> response = restTemplate.exchange(property.getSourceUrl() + stringBuilder.toString(), HttpMethod.GET, entity, ArrayList.class);
response.getBody().forEach(item -> {
Tuple<String, String> tuple = new Tuple<>();
tuple.setId((String) (((Map<String, Object>) item).get(property.getExternalFieldId())));
tuple.setLabel((String) (((Map<String, Object>) item).get(property.getExternalFieldLabel())));
result.add(tuple);
});
}
return result;
}
2018-01-17 13:03:51 +01:00
public static void createOrUpdate(ApiContext apiContext, DataManagementPlan dataManagementPlan, Principal principal) throws Exception {
2018-01-11 17:19:15 +01:00
DMP newDmp = dataManagementPlan.toDataModel();
2018-03-05 17:18:45 +01:00
createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao());
createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao());
UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId());
createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user);
2018-01-11 17:19:15 +01:00
newDmp.setCreator(user);
2018-03-05 17:18:45 +01:00
newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp);
2018-02-09 16:54:41 +01:00
if (dataManagementPlan.getAssociatedUsers().stream().filter(item -> item.getId() == principal.getId()).collect(Collectors.toList()).size() == 0)
assignUser(newDmp, user, apiContext);
2018-02-08 16:54:31 +01:00
}
2017-12-20 15:52:09 +01:00
2018-02-09 16:54:41 +01:00
public static void assignUser(DMP dmp, UserInfo userInfo, ApiContext apiContext) {
2018-02-08 16:54:31 +01:00
UserDMP userDMP = new UserDMP();
userDMP.setDmp(dmp);
userDMP.setUser(userInfo);
userDMP.setRole(UserDMP.UserDMPRoles.OWNER.getValue());
2018-03-05 17:18:45 +01:00
apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP);
2018-01-11 17:19:15 +01:00
}
2017-12-20 15:52:09 +01:00
2018-02-07 10:56:30 +01:00
public static void newVersion(ApiContext apiContext, UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception {
2018-03-05 17:18:45 +01:00
DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid);
2018-01-23 16:21:38 +01:00
DMP newDmp = dataManagementPlan.toDataModel();
2018-03-05 17:18:45 +01:00
createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao());
createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao());
UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build();
createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user);
2018-01-23 16:21:38 +01:00
newDmp.setCreator(user);
2018-02-08 09:42:02 +01:00
newDmp.setGroupId(oldDmp.getGroupId());
2018-02-07 10:56:30 +01:00
newDmp.setVersion(oldDmp.getVersion() + 1);
newDmp.setId(null);
2018-03-05 17:18:45 +01:00
newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp);
copyDatasets(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao());
2018-02-08 09:42:02 +01:00
}
2018-02-07 10:56:30 +01:00
2018-02-08 16:54:31 +01:00
public static void clone(ApiContext apiContext, UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception {
DMP newDmp = dataManagementPlan.toDataModel();
2018-03-05 17:18:45 +01:00
createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao());
createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao());
UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build();
createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user);
2018-02-08 09:42:02 +01:00
newDmp.setCreator(user);
newDmp.setGroupId(UUID.randomUUID());
newDmp.setVersion(0);
newDmp.setId(null);
2018-03-05 17:18:45 +01:00
newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp);
copyDatasets(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao());
2018-02-07 10:56:30 +01:00
}
public static void delete(ApiContext apiContext, UUID uuid) throws DMPWithDatasetsException {
2018-03-05 17:18:45 +01:00
DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid);
2018-02-07 10:56:30 +01:00
if (oldDmp.getDataset().size() > 0)
throw new DMPWithDatasetsException("You cannot Remove Datamanagement Plan with Datasets");
oldDmp.setStatus(DMP.DMPStatus.DELETED.getValue());
2018-03-05 17:18:45 +01:00
apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(oldDmp);
2018-01-23 16:21:38 +01:00
}
2018-01-11 17:19:15 +01:00
private static void createResearchersIfTheyDontExist(DMP newDmp, ResearcherDao researcherRepository) {
if (newDmp.getResearchers() != null && !newDmp.getResearchers().isEmpty()) {
2018-03-21 11:57:56 +01:00
for (eu.eudat.data.entities.Researcher researcher : newDmp.getResearchers()) {
2018-01-11 17:19:15 +01:00
ResearcherCriteria criteria = new ResearcherCriteria();
criteria.setLike(researcher.getReference());
2018-03-21 11:57:56 +01:00
List<eu.eudat.data.entities.Researcher> entries = researcherRepository.getWithCriteria(criteria).toList();
2018-03-28 15:24:47 +02:00
if (entries != null && !entries.isEmpty()) researcher.setId(entries.get(0).getId());
2018-01-25 16:24:21 +01:00
else researcher = researcherRepository.createOrUpdate(researcher);
2018-01-11 17:19:15 +01:00
}
}
}
2017-12-22 09:31:05 +01:00
2018-01-11 17:19:15 +01:00
private static void createOrganisationsIfTheyDontExist(DMP newDmp, OrganisationDao organisationRepository) {
if (newDmp.getOrganisations() != null && !newDmp.getOrganisations().isEmpty()) {
2018-03-21 11:57:56 +01:00
for (eu.eudat.data.entities.Organisation organisation : newDmp.getOrganisations()) {
2018-01-11 17:19:15 +01:00
OrganisationCriteria criteria = new OrganisationCriteria();
criteria.setLike(organisation.getReference());
2018-03-21 11:57:56 +01:00
List<eu.eudat.data.entities.Organisation> entries = organisationRepository.getWithCriteria(criteria).toList();
2018-01-11 17:19:15 +01:00
if (entries != null && !entries.isEmpty()) organisation.setId(entries.get(0).getId());
2018-01-25 16:24:21 +01:00
else organisation = organisationRepository.createOrUpdate(organisation);
2018-01-11 17:19:15 +01:00
}
}
}
private static void createProjectIfItDoesntExist(DMP newDmp, ProjectDao projectDao, UserInfo userInfo) {
if (newDmp.getProject() != null) {
Project project = newDmp.getProject();
ProjectCriteria criteria = new ProjectCriteria();
2018-02-02 17:21:46 +01:00
criteria.setReference(project.getReference());
2018-03-21 11:57:56 +01:00
eu.eudat.data.entities.Project projectEntity = projectDao.getWithCriteria(criteria).getSingleOrDefault();
2018-02-02 17:21:46 +01:00
if (projectEntity != null) project.setId(projectEntity.getId());
2018-01-11 17:19:15 +01:00
else {
2018-03-19 13:40:04 +01:00
project.setType(Project.ProjectType.EXTERNAL.getValue());
2018-01-11 17:19:15 +01:00
projectDao.createOrUpdate(project);
}
}
}
2018-02-07 10:56:30 +01:00
@Async
private static void copyDatasets(DMP newDmp, DatasetDao datasetDao) {
List<CompletableFuture<Dataset>> futures = new LinkedList<>();
for (Dataset dataset : newDmp.getDataset()) {
2018-02-09 16:54:41 +01:00
datasetDao.asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class)).where((builder, root) -> builder.equal(root.get("id"), dataset.getId())).getSingleAsync()
.thenApplyAsync(entityDataset -> {
Dataset newDataset = new Dataset();
newDataset.update(entityDataset);
newDataset.setDmp(newDmp);
newDataset.setStatus(Dataset.Status.SAVED.getValue());
if (newDataset.getDataRepositories() != null) {
newDataset.setDataRepositories(newDataset.getDataRepositories().stream().map(item -> {
DataRepository dataRepository = new DataRepository();
dataRepository.setId(item.getId());
return dataRepository;
}).collect(Collectors.toSet()));
}
if (newDataset.getExternalDatasets() != null) {
newDataset.setExternalDatasets(newDataset.getExternalDatasets().stream().map(item -> {
ExternalDataset externalDataset = new ExternalDataset();
externalDataset.setId(item.getId());
return externalDataset;
}).collect(Collectors.toSet()));
}
if (newDataset.getRegistries() != null) {
newDataset.setRegistries(newDataset.getRegistries().stream().map(item -> {
Registry registry = new Registry();
registry.setId(item.getId());
return registry;
}).collect(Collectors.toSet()));
}
if (newDataset.getServices() != null) {
newDataset.setServices(newDataset.getServices().stream().map(item -> {
Service service = new Service();
service.setId(item.getId());
return service;
}).collect(Collectors.toSet()));
}
newDataset.setCreated(new Date());
return newDataset;
}).thenApplyAsync(item -> {
2018-02-07 10:56:30 +01:00
futures.add(datasetDao.createOrUpdateAsync(item));
return futures;
}).join();
}
}
2017-12-15 00:01:26 +01:00
}