2018-06-27 12:29:21 +02:00
|
|
|
package eu.eudat.logic.managers;
|
2017-12-15 00:01:26 +01:00
|
|
|
|
2019-12-11 11:55:40 +01:00
|
|
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
2020-03-19 11:50:23 +01:00
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
2019-06-04 16:04:04 +02:00
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
2019-07-31 16:57:34 +02:00
|
|
|
import eu.eudat.configurations.dynamicgrant.DynamicGrantConfiguration;
|
|
|
|
import eu.eudat.configurations.dynamicgrant.entities.Property;
|
2019-02-15 16:11:38 +01:00
|
|
|
import eu.eudat.data.dao.criteria.*;
|
2018-03-21 11:57:56 +01:00
|
|
|
import eu.eudat.data.dao.entities.*;
|
2019-03-05 12:59:34 +01:00
|
|
|
import eu.eudat.data.entities.Organisation;
|
|
|
|
import eu.eudat.data.entities.Researcher;
|
2019-06-04 16:16:12 +02:00
|
|
|
import eu.eudat.data.entities.*;
|
2020-02-14 17:40:34 +01:00
|
|
|
import eu.eudat.data.enumeration.notification.ActiveStatus;
|
|
|
|
import eu.eudat.data.enumeration.notification.ContactType;
|
|
|
|
import eu.eudat.data.enumeration.notification.NotificationType;
|
|
|
|
import eu.eudat.data.enumeration.notification.NotifyState;
|
2018-03-28 15:24:47 +02:00
|
|
|
import eu.eudat.data.query.items.item.dmp.DataManagementPlanCriteriaRequest;
|
2019-06-12 11:13:50 +02:00
|
|
|
import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem;
|
2018-03-28 15:24:47 +02:00
|
|
|
import eu.eudat.data.query.items.table.dmp.DataManagementPlanTableRequest;
|
2019-04-26 16:05:15 +02:00
|
|
|
import eu.eudat.data.query.items.table.dmp.DataManagmentPlanPublicTableRequest;
|
2020-04-01 17:16:06 +02:00
|
|
|
import eu.eudat.elastic.criteria.DmpCriteria;
|
2020-03-13 11:02:19 +01:00
|
|
|
import eu.eudat.elastic.entities.Collaborator;
|
2020-04-01 17:16:06 +02:00
|
|
|
import eu.eudat.elastic.entities.Dmp;
|
2020-03-13 11:02:19 +01:00
|
|
|
import eu.eudat.elastic.entities.Organization;
|
2020-04-01 17:16:06 +02:00
|
|
|
import eu.eudat.elastic.entities.Tag;
|
2019-03-26 15:52:19 +01:00
|
|
|
import eu.eudat.exceptions.datamanagementplan.DMPNewVersionException;
|
2018-11-30 15:57:20 +01:00
|
|
|
import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsDeleteException;
|
2020-04-22 17:40:43 +02:00
|
|
|
import eu.eudat.exceptions.security.ForbiddenException;
|
2020-04-06 17:31:12 +02:00
|
|
|
import eu.eudat.exceptions.security.NonValidTokenException;
|
2018-02-07 10:56:30 +01:00
|
|
|
import eu.eudat.exceptions.security.UnauthorisedException;
|
2018-07-23 15:09:19 +02:00
|
|
|
import eu.eudat.logic.builders.entity.UserInfoBuilder;
|
2020-04-01 17:16:06 +02:00
|
|
|
import eu.eudat.logic.mapper.elastic.DmpMapper;
|
|
|
|
import eu.eudat.logic.mapper.elastic.criteria.DmpCriteriaMapper;
|
2019-11-11 09:40:12 +01:00
|
|
|
import eu.eudat.logic.proxy.config.configloaders.ConfigLoader;
|
2018-07-23 15:09:19 +02:00
|
|
|
import eu.eudat.logic.services.ApiContext;
|
2018-10-08 17:14:27 +02:00
|
|
|
import eu.eudat.logic.services.forms.VisibilityRuleService;
|
2019-03-05 16:33:59 +01:00
|
|
|
import eu.eudat.logic.services.operations.DatabaseRepository;
|
|
|
|
import eu.eudat.logic.services.utilities.UtilitiesService;
|
2018-10-08 17:14:27 +02:00
|
|
|
import eu.eudat.logic.utilities.builders.XmlBuilder;
|
|
|
|
import eu.eudat.logic.utilities.documents.helpers.FileEnvelope;
|
2018-10-18 11:33:13 +02:00
|
|
|
import eu.eudat.logic.utilities.documents.types.ParagraphStyle;
|
|
|
|
import eu.eudat.logic.utilities.documents.word.WordBuilder;
|
2018-10-08 17:14:27 +02:00
|
|
|
import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder;
|
2018-01-19 10:31:05 +01:00
|
|
|
import eu.eudat.models.HintedModelFactory;
|
2019-06-12 11:13:50 +02:00
|
|
|
import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel;
|
2018-10-08 17:14:27 +02:00
|
|
|
import eu.eudat.models.data.datasetwizard.DatasetWizardModel;
|
2019-06-28 14:58:25 +02:00
|
|
|
import eu.eudat.models.data.datasetwizard.DatasetsToBeFinalized;
|
2019-03-05 12:59:34 +01:00
|
|
|
import eu.eudat.models.data.dmp.*;
|
2018-06-27 12:29:21 +02:00
|
|
|
import eu.eudat.models.data.dynamicfields.DynamicFieldWithValue;
|
2019-03-26 15:52:19 +01:00
|
|
|
import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.DataManagementPlanProfile;
|
|
|
|
import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.Field;
|
2020-03-03 10:16:02 +01:00
|
|
|
import eu.eudat.models.data.funder.FunderDMPEditorModel;
|
|
|
|
import eu.eudat.models.data.grant.GrantDMPEditorModel;
|
2018-06-27 12:29:21 +02:00
|
|
|
import eu.eudat.models.data.helpermodels.Tuple;
|
|
|
|
import eu.eudat.models.data.helpers.common.DataTableData;
|
|
|
|
import eu.eudat.models.data.listingmodels.DataManagementPlanListingModel;
|
2019-05-17 17:21:56 +02:00
|
|
|
import eu.eudat.models.data.listingmodels.DataManagementPlanOverviewModel;
|
2018-06-27 12:29:21 +02:00
|
|
|
import eu.eudat.models.data.listingmodels.DatasetListingModel;
|
2019-05-29 16:58:23 +02:00
|
|
|
import eu.eudat.models.data.listingmodels.UserInfoListingModel;
|
2020-03-03 10:16:02 +01:00
|
|
|
import eu.eudat.models.data.project.ProjectDMPEditorModel;
|
2018-06-27 12:29:21 +02:00
|
|
|
import eu.eudat.models.data.security.Principal;
|
2018-10-08 17:14:27 +02:00
|
|
|
import eu.eudat.models.data.user.composite.PagedDatasetProfile;
|
2019-05-10 10:33:48 +02:00
|
|
|
import eu.eudat.models.data.userinfo.UserListingModel;
|
2017-12-17 22:34:24 +01:00
|
|
|
import eu.eudat.queryable.QueryableList;
|
2020-04-01 17:16:06 +02:00
|
|
|
import eu.eudat.types.Authorities;
|
2018-10-18 11:33:13 +02:00
|
|
|
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
2019-05-22 10:53:30 +02:00
|
|
|
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
|
|
|
import org.apache.poi.xwpf.usermodel.XWPFRun;
|
2018-10-08 17:14:27 +02:00
|
|
|
import org.json.JSONObject;
|
2020-01-16 16:46:24 +01:00
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
2019-03-05 16:33:59 +01:00
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
2018-10-18 11:33:13 +02:00
|
|
|
import org.springframework.core.env.Environment;
|
2019-07-04 16:30:15 +02:00
|
|
|
import org.springframework.core.io.FileSystemResource;
|
2018-03-28 15:24:47 +02:00
|
|
|
import org.springframework.http.*;
|
2019-01-29 12:05:36 +01:00
|
|
|
import org.springframework.stereotype.Component;
|
2019-07-04 16:30:15 +02:00
|
|
|
import org.springframework.util.LinkedMultiValueMap;
|
|
|
|
import org.springframework.util.MultiValueMap;
|
2020-03-19 11:50:23 +01:00
|
|
|
import org.springframework.web.client.HttpClientErrorException;
|
|
|
|
import org.springframework.web.client.HttpServerErrorException;
|
2018-03-28 15:24:47 +02:00
|
|
|
import org.springframework.web.client.RestTemplate;
|
2019-03-05 12:59:34 +01:00
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
2018-10-08 17:14:27 +02:00
|
|
|
import org.w3c.dom.Document;
|
|
|
|
import org.w3c.dom.Element;
|
2017-12-15 00:01:26 +01:00
|
|
|
|
2019-09-26 17:33:41 +02:00
|
|
|
import javax.persistence.criteria.Join;
|
|
|
|
import javax.persistence.criteria.JoinType;
|
2019-03-05 12:59:34 +01:00
|
|
|
import javax.xml.bind.JAXBContext;
|
|
|
|
import javax.xml.bind.JAXBException;
|
|
|
|
import javax.xml.bind.Unmarshaller;
|
2018-10-18 11:33:13 +02:00
|
|
|
import java.io.*;
|
|
|
|
import java.math.BigInteger;
|
2019-02-06 11:46:14 +01:00
|
|
|
import java.nio.file.Files;
|
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;
|
2020-02-17 11:41:01 +01:00
|
|
|
import java.util.stream.Stream;
|
2018-02-16 11:34:02 +01:00
|
|
|
|
2019-01-29 12:05:36 +01:00
|
|
|
@Component
|
2017-12-15 00:01:26 +01:00
|
|
|
public class DataManagementPlanManager {
|
2020-01-16 16:46:24 +01:00
|
|
|
private static final Logger logger = LoggerFactory.getLogger(DataManagementPlanManager.class);
|
2017-12-15 00:01:26 +01:00
|
|
|
|
2020-02-17 11:41:01 +01:00
|
|
|
private final Map<NotificationType, String> notificationPaths = Stream.of(new Object[][] {
|
|
|
|
{NotificationType.DMP_MODIFIED, "/plans/edit"},
|
|
|
|
{NotificationType.DMP_PUBLISH, "/plans/publicEdit"},
|
|
|
|
{NotificationType.DMP_FINALISED, "/plans/edit"},
|
|
|
|
{NotificationType.DMP_MODIFIED_FINALISED, "/plans/edit"}
|
|
|
|
}).collect(Collectors.toMap(data -> (NotificationType) data[0], data -> (String) data[1]));
|
|
|
|
|
2019-03-05 16:33:59 +01:00
|
|
|
private ApiContext apiContext;
|
|
|
|
private DatasetManager datasetManager;
|
|
|
|
private UtilitiesService utilitiesService;
|
|
|
|
private DatabaseRepository databaseRepository;
|
|
|
|
private Environment environment;
|
2020-03-20 17:20:22 +01:00
|
|
|
private RDAManager rdaManager;
|
2020-04-06 17:31:12 +02:00
|
|
|
private UserManager userManager;
|
2019-03-05 16:33:59 +01:00
|
|
|
|
|
|
|
@Autowired
|
2020-04-06 17:31:12 +02:00
|
|
|
public DataManagementPlanManager(ApiContext apiContext, DatasetManager datasetManager, Environment environment, RDAManager rdaManager, UserManager userManager) {
|
2019-03-05 16:33:59 +01:00
|
|
|
this.apiContext = apiContext;
|
|
|
|
this.datasetManager = datasetManager;
|
|
|
|
this.utilitiesService = apiContext.getUtilitiesService();
|
|
|
|
this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository();
|
|
|
|
this.environment = environment;
|
2020-03-20 17:20:22 +01:00
|
|
|
this.rdaManager = rdaManager;
|
2020-04-06 17:31:12 +02:00
|
|
|
this.userManager = userManager;
|
2019-03-05 16:33:59 +01:00
|
|
|
}
|
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
/*
|
|
|
|
* Data Retrieval
|
|
|
|
* */
|
|
|
|
|
2019-03-05 16:33:59 +01:00
|
|
|
public DataTableData<DataManagementPlanListingModel> getPaged(DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal, String fieldsGroup) throws Exception {
|
2019-05-10 10:33:48 +02:00
|
|
|
UUID principalID = principal.getId();
|
2020-04-01 17:16:06 +02:00
|
|
|
List<Dmp> dmps = null;
|
|
|
|
QueryableList<DMP> items = null;
|
|
|
|
QueryableList<DMP> authItems = null;
|
|
|
|
if (apiContext.getOperationsContext().getElasticRepository().getDmpRepository() != null) {
|
|
|
|
DmpCriteria criteria = DmpCriteriaMapper.toElasticCriteria(dataManagementPlanTableRequest.getCriteria());
|
|
|
|
dmps = apiContext.getOperationsContext().getElasticRepository().getDmpRepository().query(criteria);
|
|
|
|
if (dmps != null && !dmps.isEmpty()) {
|
|
|
|
List<Dmp> finalDmps = dmps;
|
|
|
|
items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable().where((builder, root) -> root.get("id").in(finalDmps.stream().map(Dmp::getId).collect(Collectors.toList())));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (items == null) {
|
|
|
|
items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria());
|
|
|
|
}
|
2019-09-26 11:44:39 +02:00
|
|
|
List<Integer> roles = new LinkedList<>();
|
2020-04-01 17:16:06 +02:00
|
|
|
if (!dataManagementPlanTableRequest.getCriteria().isOnlyPublic()) {
|
|
|
|
if (dataManagementPlanTableRequest.getCriteria().getRole() != null)
|
|
|
|
roles.add(dataManagementPlanTableRequest.getCriteria().getRole());
|
|
|
|
authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, principalID, roles);
|
|
|
|
} else {
|
|
|
|
authItems = items;
|
|
|
|
}
|
2018-01-11 17:19:15 +01:00
|
|
|
QueryableList<DMP> pagedItems = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest);
|
2018-01-08 15:57:21 +01:00
|
|
|
|
2018-07-23 15:09:19 +02:00
|
|
|
DataTableData<DataManagementPlanListingModel> dataTable = new DataTableData<>();
|
2018-02-07 10:56:30 +01:00
|
|
|
|
2019-01-31 14:56:53 +01:00
|
|
|
CompletableFuture itemsFuture;
|
2019-06-21 13:04:29 +02:00
|
|
|
if (fieldsGroup.equals("listing")) {
|
2020-04-01 17:16:06 +02:00
|
|
|
if (!dataManagementPlanTableRequest.getCriteria().isOnlyPublic()) {
|
|
|
|
itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class))
|
|
|
|
.selectAsync(item -> {
|
|
|
|
item.setDataset(
|
|
|
|
item.getDataset().stream()
|
|
|
|
.filter(dataset -> !dataset.getStatus().equals(Dataset.Status.DELETED.getValue()) && !dataset.getStatus().equals(Dataset.Status.CANCELED.getValue())).collect(Collectors.toList()).stream()
|
2020-04-21 16:54:00 +02:00
|
|
|
.filter(dataset -> dataset.getDmp().getUsers().stream()
|
2020-04-01 17:16:06 +02:00
|
|
|
.filter(x -> x.getUser().getId().equals(principalID))
|
|
|
|
.collect(Collectors.toList()).size() > 0)
|
|
|
|
.collect(Collectors.toSet()));
|
|
|
|
return new DataManagementPlanListingModel().fromDataModelDatasets(item);
|
|
|
|
})
|
|
|
|
.whenComplete((resultList, throwable) -> dataTable.setData(resultList));
|
|
|
|
} else {
|
|
|
|
itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class))
|
|
|
|
.selectAsync(item -> {
|
|
|
|
item.setDataset(
|
|
|
|
item.getDataset().stream()
|
|
|
|
.filter(dataset -> dataset.getStatus().equals(Dataset.Status.FINALISED.getValue())).collect(Collectors.toSet()));
|
|
|
|
return new DataManagementPlanListingModel().fromDataModelDatasets(item);
|
|
|
|
})
|
|
|
|
.whenComplete((resultList, throwable) -> dataTable.setData(resultList));
|
|
|
|
}
|
2020-01-21 11:40:15 +01:00
|
|
|
} else if (fieldsGroup.equals("autocomplete")) {
|
|
|
|
itemsFuture = pagedItems
|
|
|
|
.selectAsync(item -> new DataManagementPlanListingModel().fromDataModelAutoComplete(item))
|
2020-01-21 11:48:19 +01:00
|
|
|
.whenComplete((resultList, throwable) -> dataTable.setData(resultList));
|
2019-06-21 13:04:29 +02:00
|
|
|
} else {
|
2019-01-31 14:56:53 +01:00
|
|
|
itemsFuture = pagedItems
|
2019-11-07 15:37:07 +01:00
|
|
|
.selectAsync(item -> new DataManagementPlanListingModel().fromDataModelAssociatedProfiles(item))
|
2020-01-21 11:48:19 +01:00
|
|
|
.whenComplete((resultList, throwable) -> dataTable.setData(resultList));
|
2019-01-31 14:56:53 +01:00
|
|
|
}
|
2018-02-07 10:56:30 +01:00
|
|
|
|
2020-01-21 11:48:19 +01:00
|
|
|
CompletableFuture countFuture = authItems.countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count));
|
2018-02-07 10:56:30 +01:00
|
|
|
CompletableFuture.allOf(itemsFuture, countFuture).join();
|
2018-01-11 17:19:15 +01:00
|
|
|
return dataTable;
|
|
|
|
}
|
2017-12-19 09:38:47 +01:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
public eu.eudat.models.data.dmp.DataManagementPlan getSingle(String id, Principal principal, boolean isPublic) throws Exception {
|
|
|
|
eu.eudat.models.data.dmp.DataManagementPlan dataManagementPlan = new eu.eudat.models.data.dmp.DataManagementPlan();
|
2019-03-05 16:33:59 +01:00
|
|
|
DMP dataManagementPlanEntity = databaseRepository.getDmpDao().find(UUID.fromString(id));
|
2020-04-22 17:40:43 +02:00
|
|
|
if (!isPublic && principal == null) {
|
|
|
|
throw new UnauthorisedException();
|
|
|
|
} else if (!isPublic && (dataManagementPlanEntity.getUsers().stream().noneMatch(userInfo -> userInfo.getUser().getId() == principal.getId()))) {
|
2020-01-07 17:17:21 +01:00
|
|
|
if (!dataManagementPlanEntity.isPublic()) {
|
|
|
|
throw new UnauthorisedException();
|
|
|
|
}
|
2020-04-22 17:40:43 +02:00
|
|
|
} else if (isPublic && !dataManagementPlanEntity.isPublic()) {
|
|
|
|
throw new ForbiddenException("Selected DMP is not public");
|
2020-01-07 17:17:21 +01:00
|
|
|
}
|
|
|
|
dataManagementPlan.fromDataModel(dataManagementPlanEntity);
|
2020-04-22 17:40:43 +02:00
|
|
|
if (isPublic) {
|
|
|
|
dataManagementPlan.setDatasets(dataManagementPlan.getDatasets().stream().filter(dataset -> dataset.getStatus() == Dataset.Status.FINALISED.getValue()).collect(Collectors.toList()));
|
|
|
|
}
|
2018-03-28 15:24:47 +02:00
|
|
|
Map dmpProperties = dataManagementPlanEntity.getDmpProperties() != null ? new org.json.JSONObject(dataManagementPlanEntity.getDmpProperties()).toMap() : null;
|
2020-01-07 17:17:21 +01:00
|
|
|
|
|
|
|
if (dmpProperties != null && dataManagementPlan.getDynamicFields() != null)
|
|
|
|
dataManagementPlan.getDynamicFields().forEach(item -> {
|
2018-03-28 15:24:47 +02:00
|
|
|
Map<String, String> properties = (Map<String, String>) dmpProperties.get(item.getId());
|
|
|
|
if (properties != null)
|
2018-10-18 11:33:13 +02:00
|
|
|
item.setValue(new Tuple<>(properties.get("id"), properties.get("label")));
|
2018-03-28 15:24:47 +02:00
|
|
|
});
|
2020-01-07 17:17:21 +01:00
|
|
|
return dataManagementPlan;
|
2018-01-11 17:19:15 +01:00
|
|
|
}
|
2017-12-20 15:52:09 +01:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
public DataManagementPlanOverviewModel getOverviewSingle(String id, Principal principal, boolean isPublic) throws Exception {
|
2019-05-17 17:21:56 +02:00
|
|
|
DMP dataManagementPlanEntity = databaseRepository.getDmpDao().find(UUID.fromString(id));
|
2020-01-16 16:14:50 +01:00
|
|
|
if (dataManagementPlanEntity.getStatus() == DMP.DMPStatus.DELETED.getValue()) {
|
|
|
|
throw new Exception("DMP is deleted.");
|
|
|
|
}
|
2020-04-22 17:40:43 +02:00
|
|
|
if (!isPublic && principal == null) {
|
|
|
|
throw new UnauthorisedException();
|
|
|
|
} else
|
|
|
|
if (!isPublic && dataManagementPlanEntity.getUsers()
|
|
|
|
.stream().noneMatch(userInfo -> userInfo.getUser().getId() == principal.getId())) {
|
2019-05-17 17:21:56 +02:00
|
|
|
throw new UnauthorisedException();
|
2020-04-22 17:40:43 +02:00
|
|
|
} else if (isPublic && !dataManagementPlanEntity.isPublic()) {
|
|
|
|
throw new ForbiddenException("Selected DMP is not public");
|
|
|
|
}
|
2019-05-17 17:21:56 +02:00
|
|
|
DataManagementPlanOverviewModel datamanagementPlan = new DataManagementPlanOverviewModel();
|
|
|
|
datamanagementPlan.fromDataModelDatasets(dataManagementPlanEntity);
|
2020-04-22 17:40:43 +02:00
|
|
|
if (isPublic) {
|
2019-06-10 11:27:16 +02:00
|
|
|
datamanagementPlan.setDatasets(datamanagementPlan.getDatasets().stream().filter(dataset -> dataset.getStatus() == Dataset.Status.FINALISED.getValue()).collect(Collectors.toList()));
|
|
|
|
}
|
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
return datamanagementPlan;
|
2018-01-11 17:19:15 +01:00
|
|
|
}
|
2017-12-20 15:52:09 +01:00
|
|
|
|
2019-07-31 16:57:34 +02:00
|
|
|
public List<Tuple<String, String>> getDynamicFields(String id, DynamicGrantConfiguration dynamicGrantConfiguration, DynamicFieldsCriteria criteria) throws IllegalAccessException, InstantiationException {
|
2018-03-28 15:24:47 +02:00
|
|
|
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);
|
|
|
|
|
2019-07-31 16:57:34 +02:00
|
|
|
Property property = dynamicGrantConfiguration.getConfiguration().getConfigurationProperties().stream()
|
2020-04-22 17:40:43 +02:00
|
|
|
.filter(item -> item.getId().equals(id)).findFirst().orElse(null);
|
2018-03-28 15:24:47 +02:00
|
|
|
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()))
|
2020-04-22 17:40:43 +02:00
|
|
|
.findFirst().orElse(null);
|
2018-03-28 15:24:47 +02:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
public DataTableData<DatasetProfileListingModel> getDatasetProfilesUsedByDMP(DatasetProfileTableRequestItem datasetProfileTableRequestItem, Principal principal) {
|
|
|
|
datasetProfileTableRequestItem.getCriteria().setFilter(DatasetProfileCriteria.DatasetProfileFilter.DMPs.getValue());
|
|
|
|
datasetProfileTableRequestItem.getCriteria().setUserId(principal.getId());
|
|
|
|
|
|
|
|
QueryableList<DatasetProfile> items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(datasetProfileTableRequestItem.getCriteria());
|
|
|
|
List<DatasetProfileListingModel> listingModels = items.select(item -> new DatasetProfileListingModel().fromDataModel(item));
|
|
|
|
|
|
|
|
DataTableData<DatasetProfileListingModel> data = new DataTableData<>();
|
|
|
|
data.setData(listingModels);
|
|
|
|
data.setTotalCount((long) listingModels.size());
|
|
|
|
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Management
|
|
|
|
* */
|
|
|
|
|
2019-07-02 11:36:25 +02:00
|
|
|
public DMP createOrUpdate(ApiContext apiContext, DataManagementPlanEditorModel dataManagementPlan, Principal principal) throws Exception {
|
2020-02-14 17:40:34 +01:00
|
|
|
boolean setNotification = false;
|
2019-07-19 10:55:08 +02:00
|
|
|
if (dataManagementPlan.getId() != null) {
|
2019-06-24 10:01:28 +02:00
|
|
|
DMP dmp1 = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(dataManagementPlan.getId());
|
2019-07-19 10:55:08 +02:00
|
|
|
|
2019-12-18 11:38:04 +01:00
|
|
|
if (!isUserOwnerOfDmp(dmp1, principal)) {
|
|
|
|
throw new Exception("User not being the creator is not authorized to edit this DMP.");
|
|
|
|
}
|
2020-02-10 17:21:06 +01:00
|
|
|
if (dmp1.getModified().getTime() != dataManagementPlan.getModified().getTime()) {
|
|
|
|
throw new Exception("Another user have already edit that DMP.");
|
|
|
|
}
|
2019-07-19 10:55:08 +02:00
|
|
|
List<Dataset> datasetList = new ArrayList<>(dmp1.getDataset());
|
|
|
|
for (Dataset dataset : datasetList) {
|
2020-04-22 17:40:43 +02:00
|
|
|
if (dataManagementPlan.getProfiles().stream().filter(associatedProfile -> dataset.getProfile().getId().equals(associatedProfile.getId())).findAny().orElse(null) == null)
|
|
|
|
throw new Exception("Dataset Template for Dataset Description is missing from the DMP.");
|
2019-07-19 10:55:08 +02:00
|
|
|
}
|
|
|
|
if (dataManagementPlan.getStatus() == (int) DMP.DMPStatus.FINALISED.getValue() && dmp1.getStatus().equals(DMP.DMPStatus.FINALISED.getValue()))
|
2019-06-24 10:01:28 +02:00
|
|
|
throw new Exception("DMP is finalized, therefore cannot be edited.");
|
2020-02-14 17:40:34 +01:00
|
|
|
|
|
|
|
setNotification = true;
|
2019-06-21 16:47:06 +02:00
|
|
|
}
|
|
|
|
|
2018-01-11 17:19:15 +01:00
|
|
|
DMP newDmp = dataManagementPlan.toDataModel();
|
2019-08-22 16:15:16 +02:00
|
|
|
if (newDmp.getStatus() == (int) DMP.DMPStatus.FINALISED.getValue()) {
|
|
|
|
checkDmpValidationRules(newDmp);
|
|
|
|
}
|
2019-05-30 14:41:23 +02:00
|
|
|
UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId());
|
|
|
|
|
2018-03-05 17:18:45 +01:00
|
|
|
createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao());
|
2019-09-30 16:42:01 +02:00
|
|
|
createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao(), user);
|
2019-08-26 15:55:30 +02:00
|
|
|
createFunderIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getFunderDao());
|
2019-08-28 15:20:55 +02:00
|
|
|
createGrantIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getGrantDao());
|
2019-08-26 15:55:30 +02:00
|
|
|
if (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty()) {
|
2019-08-22 13:29:33 +02:00
|
|
|
newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant()));
|
|
|
|
}
|
2019-08-02 10:27:12 +02:00
|
|
|
createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao());
|
2019-06-21 13:04:29 +02:00
|
|
|
|
2019-07-02 11:36:25 +02:00
|
|
|
DMP dmp;
|
|
|
|
if (dataManagementPlan.getId() != null) {
|
|
|
|
dmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(dataManagementPlan.getId());
|
|
|
|
} else dmp = new DMP();
|
|
|
|
|
|
|
|
newDmp.setCreated(dmp.getCreated() == null ? new Date() : dmp.getCreated());
|
|
|
|
if (newDmp.getUsers()!= null && newDmp.getUsers().stream().filter(userInfo -> userInfo.getUser().getId() == principal.getId())
|
2020-04-22 17:40:43 +02:00
|
|
|
.collect(Collectors.toList()).size() == 0) {
|
2019-10-30 13:30:31 +01:00
|
|
|
List<UserDMP> userDMPList = new ArrayList<>(newDmp.getUsers());
|
2019-07-02 11:36:25 +02:00
|
|
|
for (UserInfoListingModel userInfoListingModel : dataManagementPlan.getUsers()) {
|
|
|
|
for (UserDMP userDMP : userDMPList) {
|
|
|
|
if (!(userDMP.getUser().getId().equals(userInfoListingModel.getId()))) {
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().delete(userDMP);
|
2019-05-29 16:58:23 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-07-02 11:36:25 +02:00
|
|
|
}
|
2019-08-26 15:52:05 +02:00
|
|
|
|
2019-08-29 16:45:47 +02:00
|
|
|
checkIfUserCanEditGrant(newDmp, user);
|
2019-09-24 16:40:53 +02:00
|
|
|
assignGrandUserIfInternal(newDmp, user);
|
|
|
|
assignFunderUserIfInternal(newDmp, user);
|
|
|
|
assignProjectUserIfInternal(newDmp, user);
|
2019-08-26 15:52:05 +02:00
|
|
|
|
2019-08-27 16:00:09 +02:00
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().createOrUpdate(newDmp.getGrant());
|
2019-07-02 11:36:25 +02:00
|
|
|
newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp);
|
|
|
|
|
|
|
|
// Dataset manipulation for when the DMP is set to be finalized.
|
|
|
|
if (dataManagementPlan.getStatus() == DMP.DMPStatus.FINALISED.getValue()) {
|
|
|
|
if (dataManagementPlan.getDatasetsToBeFinalized() != null && !dataManagementPlan.getDatasetsToBeFinalized().isEmpty()) {
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()
|
2020-04-22 17:40:43 +02:00
|
|
|
.asQueryable().where((builder, root) -> root.get("id").in(dataManagementPlan.getDatasetsToBeFinalized()))
|
|
|
|
.update(root -> root.<Integer>get("status"), Dataset.Status.FINALISED.getValue());
|
2019-07-02 11:36:25 +02:00
|
|
|
|
|
|
|
List<UUID> datasetsToBeCanceled = new LinkedList<>();
|
|
|
|
for (DatasetListingModel dataset : dataManagementPlan.getDatasets()) {
|
|
|
|
if (!(dataset.getStatus() == (int) Dataset.Status.FINALISED.getValue()) && !dataManagementPlan.getDatasetsToBeFinalized().contains(UUID.fromString(dataset.getId()))) {
|
|
|
|
datasetsToBeCanceled.add(UUID.fromString(dataset.getId()));
|
2019-06-21 16:16:45 +02:00
|
|
|
}
|
|
|
|
}
|
2019-07-02 11:36:25 +02:00
|
|
|
if (!datasetsToBeCanceled.isEmpty())
|
2019-06-21 16:16:45 +02:00
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()
|
2020-04-22 17:40:43 +02:00
|
|
|
.asQueryable().where((builder, root) -> root.get("id").in(datasetsToBeCanceled))
|
|
|
|
.update(root -> root.<Integer>get("status"), Dataset.Status.CANCELED.getValue());
|
2019-07-02 11:36:25 +02:00
|
|
|
} else {
|
|
|
|
List<UUID> datasetsToBeCanceled = new LinkedList<>();
|
|
|
|
for (DatasetListingModel dataset : dataManagementPlan.getDatasets()) {
|
|
|
|
if (!(dataset.getStatus() == (int) Dataset.Status.FINALISED.getValue())) {
|
|
|
|
datasetsToBeCanceled.add(UUID.fromString(dataset.getId()));
|
2019-06-21 16:16:45 +02:00
|
|
|
}
|
2019-06-21 13:04:29 +02:00
|
|
|
}
|
2019-07-02 11:36:25 +02:00
|
|
|
if (!datasetsToBeCanceled.isEmpty())
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()
|
2020-04-22 17:40:43 +02:00
|
|
|
.asQueryable().where((builder, root) -> root.get("id").in(datasetsToBeCanceled))
|
|
|
|
.update(root -> root.<Integer>get("status"), Dataset.Status.CANCELED.getValue());
|
2019-06-21 13:04:29 +02:00
|
|
|
}
|
2018-10-11 13:22:03 +02:00
|
|
|
}
|
2019-05-30 14:41:23 +02:00
|
|
|
|
2019-05-17 12:19:30 +02:00
|
|
|
if (dataManagementPlan.getAssociatedUsers().size() == 0)
|
2019-08-29 16:45:47 +02:00
|
|
|
assignUser(newDmp, user);
|
2019-07-02 11:36:25 +02:00
|
|
|
|
2020-04-01 17:16:06 +02:00
|
|
|
this.updateIndex(newDmp);
|
|
|
|
|
2020-02-14 17:40:34 +01:00
|
|
|
if (setNotification) {
|
2020-02-17 11:41:01 +01:00
|
|
|
if (newDmp.getStatus() != DMP.DMPStatus.FINALISED.getValue()) {
|
|
|
|
this.sendNotification(newDmp, user, NotificationType.DMP_MODIFIED);
|
|
|
|
} else {
|
|
|
|
this.sendNotification(newDmp, user, NotificationType.DMP_MODIFIED_FINALISED);
|
|
|
|
}
|
2020-02-14 17:40:34 +01:00
|
|
|
}
|
|
|
|
|
2019-07-02 11:36:25 +02:00
|
|
|
return newDmp;
|
2018-02-08 16:54:31 +01:00
|
|
|
}
|
2017-12-20 15:52:09 +01:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
public void newVersion(UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception {
|
|
|
|
DMP oldDmp = databaseRepository.getDmpDao().find(uuid);
|
|
|
|
if (!isUserOwnerOfDmp(oldDmp, principal)) {
|
|
|
|
throw new Exception("User not being the creator is not authorized to perform this action.");
|
2020-02-14 17:40:34 +01:00
|
|
|
}
|
2020-04-22 17:40:43 +02:00
|
|
|
DataManagementPlanCriteria criteria = new DataManagementPlanCriteria();
|
|
|
|
LinkedList<UUID> list = new LinkedList<>();
|
|
|
|
list.push(oldDmp.getGroupId());
|
|
|
|
criteria.setGroupIds(list);
|
|
|
|
criteria.setAllVersions(false);
|
|
|
|
QueryableList<DMP> dataManagementPlanQueryableList = databaseRepository.getDmpDao().getWithCriteria(criteria);
|
|
|
|
List<DMP> latestVersionDMP = dataManagementPlanQueryableList.toList();
|
2020-02-14 17:40:34 +01:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
if (latestVersionDMP.get(0).getVersion().equals(oldDmp.getVersion())) {
|
|
|
|
DMP newDmp = dataManagementPlan.toDataModel();
|
|
|
|
UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build();
|
|
|
|
createOrganisationsIfTheyDontExist(newDmp, databaseRepository.getOrganisationDao());
|
|
|
|
createResearchersIfTheyDontExist(newDmp, databaseRepository.getResearcherDao(), user);
|
2019-08-29 16:45:47 +02:00
|
|
|
|
|
|
|
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());
|
2019-05-31 10:38:04 +02:00
|
|
|
|
2019-03-26 15:52:19 +01:00
|
|
|
newDmp.setGroupId(oldDmp.getGroupId());
|
|
|
|
newDmp.setVersion(oldDmp.getVersion() + 1);
|
|
|
|
newDmp.setId(null);
|
2019-08-29 16:45:47 +02:00
|
|
|
|
|
|
|
checkIfUserCanEditGrant(newDmp, user);
|
2019-09-24 16:40:53 +02:00
|
|
|
assignGrandUserIfInternal(newDmp, user);
|
|
|
|
assignFunderUserIfInternal(newDmp, user);
|
|
|
|
assignProjectUserIfInternal(newDmp, user);
|
2019-08-29 16:45:47 +02:00
|
|
|
databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant());
|
2020-04-06 17:34:25 +02:00
|
|
|
DMP tempDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp);
|
|
|
|
newDmp.setId(tempDmp.getId());
|
2019-05-31 10:38:04 +02:00
|
|
|
|
|
|
|
// Assign creator.
|
2019-08-29 16:45:47 +02:00
|
|
|
assignUser(newDmp, user);
|
2019-05-31 10:38:04 +02:00
|
|
|
|
2019-08-29 16:45:47 +02:00
|
|
|
copyDatasets(newDmp, databaseRepository.getDatasetDao());
|
2020-04-01 17:16:06 +02:00
|
|
|
|
2020-04-06 17:34:25 +02:00
|
|
|
newDmp.setUsers(new HashSet<>(databaseRepository.getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), newDmp.getId())).toList()));
|
|
|
|
|
2020-04-07 17:41:25 +02:00
|
|
|
DatasetCriteria criteria1 = new DatasetCriteria();
|
|
|
|
criteria1.setDmpIds(Collections.singletonList(newDmp.getId()));
|
|
|
|
newDmp.setDataset(new HashSet<>(databaseRepository.getDatasetDao().getWithCriteria(criteria1).toList()));
|
|
|
|
|
|
|
|
this.updateGroupIndex(newDmp.getGroupId());
|
|
|
|
|
2019-03-26 15:52:19 +01:00
|
|
|
} else {
|
|
|
|
throw new DMPNewVersionException("Version to update not the latest.");
|
|
|
|
}
|
2018-02-08 09:42:02 +01:00
|
|
|
}
|
2018-02-07 10:56:30 +01:00
|
|
|
|
2019-08-29 16:45:47 +02:00
|
|
|
public void clone(DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception {
|
2018-02-08 16:54:31 +01:00
|
|
|
DMP newDmp = dataManagementPlan.toDataModel();
|
2019-09-30 16:42:01 +02:00
|
|
|
|
2018-03-05 17:18:45 +01:00
|
|
|
UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build();
|
2019-09-30 16:42:01 +02:00
|
|
|
createOrganisationsIfTheyDontExist(newDmp, databaseRepository.getOrganisationDao());
|
|
|
|
createResearchersIfTheyDontExist(newDmp, databaseRepository.getResearcherDao(), user);
|
2019-08-29 16:45:47 +02:00
|
|
|
|
|
|
|
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());
|
2019-05-31 10:38:04 +02:00
|
|
|
|
2018-02-08 09:42:02 +01:00
|
|
|
newDmp.setGroupId(UUID.randomUUID());
|
|
|
|
newDmp.setVersion(0);
|
|
|
|
newDmp.setId(null);
|
2019-08-29 16:45:47 +02:00
|
|
|
|
|
|
|
checkIfUserCanEditGrant(newDmp, user);
|
2019-09-24 16:40:53 +02:00
|
|
|
assignGrandUserIfInternal(newDmp, user);
|
|
|
|
assignFunderUserIfInternal(newDmp, user);
|
|
|
|
assignProjectUserIfInternal(newDmp, user);
|
2019-08-29 16:45:47 +02:00
|
|
|
databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant());
|
2020-04-07 17:41:25 +02:00
|
|
|
DMP tempDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp);
|
|
|
|
newDmp.setId(tempDmp.getId());
|
2019-05-31 10:38:04 +02:00
|
|
|
|
2019-08-29 16:45:47 +02:00
|
|
|
assignUser(newDmp, user);
|
|
|
|
copyDatasets(newDmp, databaseRepository.getDatasetDao());
|
2020-04-01 17:16:06 +02:00
|
|
|
|
2020-04-07 17:41:25 +02:00
|
|
|
newDmp.setUsers(new HashSet<>(databaseRepository.getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), newDmp.getId())).toList()));
|
|
|
|
|
|
|
|
DatasetCriteria criteria1 = new DatasetCriteria();
|
|
|
|
criteria1.setDmpIds(Collections.singletonList(newDmp.getId()));
|
|
|
|
newDmp.setDataset(new HashSet<>(databaseRepository.getDatasetDao().getWithCriteria(criteria1).toList()));
|
|
|
|
|
2020-04-01 17:16:06 +02:00
|
|
|
this.updateIndex(newDmp);
|
2018-02-07 10:56:30 +01:00
|
|
|
}
|
|
|
|
|
2020-04-01 17:16:06 +02:00
|
|
|
public void delete(UUID uuid) throws DMPWithDatasetsDeleteException, IOException {
|
2019-02-15 16:11:38 +01:00
|
|
|
DatasetCriteria criteria = new DatasetCriteria();
|
|
|
|
List<UUID> dmpIds = Collections.singletonList(uuid);
|
|
|
|
criteria.setDmpIds(dmpIds);
|
2019-06-21 13:04:29 +02:00
|
|
|
if (apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(criteria).toList().size() > 0)
|
2018-11-30 15:57:20 +01:00
|
|
|
throw new DMPWithDatasetsDeleteException("You cannot Remove Datamanagement Plan with Datasets");
|
2019-02-15 16:11:38 +01:00
|
|
|
DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid);
|
2018-02-07 10:56:30 +01:00
|
|
|
oldDmp.setStatus(DMP.DMPStatus.DELETED.getValue());
|
2018-03-05 17:18:45 +01:00
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(oldDmp);
|
2020-04-01 17:16:06 +02:00
|
|
|
this.updateIndex(oldDmp);
|
2020-03-17 16:33:55 +01:00
|
|
|
DataManagementPlanCriteria criteria1 = new DataManagementPlanCriteria();
|
|
|
|
criteria1.setAllVersions(true);
|
|
|
|
criteria1.setGroupIds(Collections.singletonList(oldDmp.getGroupId()));
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria1).toList().forEach(dmp -> {
|
2020-04-07 17:41:25 +02:00
|
|
|
try {
|
|
|
|
this.updateIndex(dmp);
|
|
|
|
} catch (IOException e) {
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
2020-03-17 16:33:55 +01:00
|
|
|
for (Dataset dataset: dmp.getDataset()) {
|
|
|
|
try {
|
2020-04-06 17:34:25 +02:00
|
|
|
List<Tag> tags = new ArrayList<>();
|
|
|
|
eu.eudat.elastic.entities.Dataset elastic = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString());
|
|
|
|
if (elastic != null) {
|
|
|
|
tags = elastic.getTags();
|
|
|
|
}
|
2020-04-01 17:16:06 +02:00
|
|
|
this.datasetManager.updateTags(dataset, tags);
|
2020-03-18 17:23:34 +01:00
|
|
|
} catch (Exception e) {
|
2020-03-17 16:33:55 +01:00
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2018-01-23 16:21:38 +01:00
|
|
|
}
|
|
|
|
|
2019-09-30 16:42:01 +02:00
|
|
|
private void createResearchersIfTheyDontExist(DMP newDmp, ResearcherDao researcherRepository, UserInfo user) {
|
2018-01-11 17:19:15 +01:00
|
|
|
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());
|
2019-09-30 16:42:01 +02:00
|
|
|
else {
|
|
|
|
researcher.setCreationUser(user);
|
|
|
|
researcherRepository.createOrUpdate(researcher);
|
|
|
|
}
|
2018-01-11 17:19:15 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-12-22 09:31:05 +01:00
|
|
|
|
2019-01-29 12:05:36 +01:00
|
|
|
private void createOrganisationsIfTheyDontExist(DMP newDmp, OrganisationDao organisationRepository) {
|
2018-01-11 17:19:15 +01:00
|
|
|
if (newDmp.getOrganisations() != null && !newDmp.getOrganisations().isEmpty()) {
|
2018-03-21 11:57:56 +01:00
|
|
|
for (eu.eudat.data.entities.Organisation organisation : newDmp.getOrganisations()) {
|
2020-04-22 17:40:43 +02:00
|
|
|
boolean createNew = false;
|
|
|
|
if (organisation.getReference() != null) {
|
|
|
|
OrganisationCriteria criteria = new OrganisationCriteria();
|
|
|
|
criteria.setLike(organisation.getReference());
|
|
|
|
List<eu.eudat.data.entities.Organisation> entries = organisationRepository.getWithCriteria(criteria).toList();
|
|
|
|
if (entries != null && !entries.isEmpty()) organisation.setId(entries.get(0).getId());
|
|
|
|
else createNew = true;
|
|
|
|
} else {
|
|
|
|
createNew = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (createNew) {
|
|
|
|
organisation.setReference("Internal:" + UUID.randomUUID().toString());
|
|
|
|
organisationRepository.createOrUpdate(organisation);
|
|
|
|
}
|
2018-01-11 17:19:15 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-26 15:55:30 +02:00
|
|
|
private void createGrantIfItDoesntExist(DMP newDmp, GrantDao grantDao) {
|
2019-07-31 16:57:34 +02:00
|
|
|
if (newDmp.getGrant() != null) {
|
|
|
|
Grant grant = newDmp.getGrant();
|
|
|
|
GrantCriteria criteria = new GrantCriteria();
|
2020-03-03 10:16:02 +01:00
|
|
|
if (grant.getReference() != null) {
|
|
|
|
criteria.setReference(grant.getReference());
|
2020-03-17 14:59:25 +01:00
|
|
|
eu.eudat.data.entities.Grant grantEntity = grantDao.getWithCriteria(criteria).toList().stream().max(Comparator.comparing(grant1 -> grant1.getModified().getTime())).orElse(null);
|
2020-03-03 10:16:02 +01:00
|
|
|
if (grantEntity != null) grant.setId(grantEntity.getId());
|
2020-03-10 17:15:42 +01:00
|
|
|
else {
|
|
|
|
grant.setType(Grant.GrantType.EXTERNAL.getValue());
|
|
|
|
grant.setCreationUser(null);
|
|
|
|
grantDao.createOrUpdate(grant);
|
|
|
|
}
|
2020-03-03 10:16:02 +01:00
|
|
|
}
|
2018-01-11 17:19:15 +01:00
|
|
|
else {
|
2019-07-31 16:57:34 +02:00
|
|
|
grant.setType(Grant.GrantType.EXTERNAL.getValue());
|
2020-01-13 09:59:48 +01:00
|
|
|
grant.setCreationUser(null);
|
2019-07-31 16:57:34 +02:00
|
|
|
grantDao.createOrUpdate(grant);
|
2018-01-11 17:19:15 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-02-07 10:56:30 +01:00
|
|
|
|
2019-08-26 15:55:30 +02:00
|
|
|
private void createFunderIfItDoesntExist(DMP newDmp, FunderDao funderDao) {
|
|
|
|
if (newDmp.getGrant().getFunder() != null) {
|
|
|
|
Funder funder = newDmp.getGrant().getFunder();
|
|
|
|
FunderCriteria criteria = new FunderCriteria();
|
2020-03-03 10:16:02 +01:00
|
|
|
if (funder.getReference() != null) {
|
|
|
|
criteria.setReference(funder.getReference());
|
2020-03-17 14:59:25 +01:00
|
|
|
eu.eudat.data.entities.Funder funderEntity = funderDao.getWithCritetia(criteria).toList().stream().max(Comparator.comparing(funder1 -> funder1.getModified().getTime())).orElse(null);
|
2020-03-03 10:16:02 +01:00
|
|
|
if (funderEntity != null) funder.setId(funderEntity.getId());
|
2020-03-10 17:15:42 +01:00
|
|
|
else {
|
|
|
|
funderDao.createOrUpdate(funder);
|
|
|
|
}
|
2020-03-03 10:16:02 +01:00
|
|
|
}
|
2019-08-26 15:55:30 +02:00
|
|
|
else {
|
|
|
|
funderDao.createOrUpdate(funder);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-02 10:27:12 +02:00
|
|
|
private void createProjectIfItDoesntExist(DMP newDmp, ProjectDao projectDao) {
|
|
|
|
if (newDmp.getProject() != null) {
|
|
|
|
Project project = newDmp.getProject();
|
|
|
|
ProjectCriteria criteria = new ProjectCriteria();
|
2020-03-03 10:16:02 +01:00
|
|
|
if (project.getReference() != null) {
|
|
|
|
criteria.setReference(project.getReference());
|
2020-03-17 14:59:25 +01:00
|
|
|
eu.eudat.data.entities.Project projectEntity = projectDao.getWithCritetia(criteria).toList().stream().max(Comparator.comparing(project1 -> project1.getModified().getTime())).orElse(null);
|
2020-03-03 10:16:02 +01:00
|
|
|
if (projectEntity != null) project.setId(projectEntity.getId());
|
2020-03-10 17:15:42 +01:00
|
|
|
else {
|
|
|
|
project.setType(Project.ProjectType.EXTERNAL.getValue());
|
|
|
|
if (project.getId() == null) project.setId(UUID.randomUUID());
|
|
|
|
projectDao.createOrUpdate(project);
|
|
|
|
}
|
2020-03-03 10:16:02 +01:00
|
|
|
}
|
2019-08-02 10:27:12 +02:00
|
|
|
else {
|
|
|
|
project.setType(Project.ProjectType.EXTERNAL.getValue());
|
2019-12-12 12:04:00 +01:00
|
|
|
if (project.getId() == null) project.setId(UUID.randomUUID());
|
2019-08-02 10:27:12 +02:00
|
|
|
projectDao.createOrUpdate(project);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-29 12:05:36 +01:00
|
|
|
private void copyDatasets(DMP newDmp, DatasetDao datasetDao) {
|
2018-02-07 10:56:30 +01:00
|
|
|
List<CompletableFuture<Dataset>> futures = new LinkedList<>();
|
|
|
|
for (Dataset dataset : newDmp.getDataset()) {
|
2020-04-07 17:41:25 +02:00
|
|
|
Dataset tempDataset = datasetDao.find(dataset.getId());
|
|
|
|
if (tempDataset.getProfile() != null) {
|
|
|
|
logger.info(tempDataset.getProfile().toString());
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
List<Tag> tags = new ArrayList<>();
|
|
|
|
eu.eudat.elastic.entities.Dataset elastic = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString());
|
|
|
|
if (elastic != null) {
|
|
|
|
tags = elastic.getTags();
|
|
|
|
}
|
|
|
|
|
|
|
|
this.datasetManager.updateTags(tempDataset, tags);
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
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()
|
2020-04-22 17:40:43 +02:00
|
|
|
.thenApplyAsync(entityDataset -> {
|
|
|
|
Dataset newDataset = new Dataset();
|
|
|
|
newDataset.update(entityDataset);
|
|
|
|
newDataset.setDmp(newDmp);
|
|
|
|
newDataset.setStatus(Dataset.Status.SAVED.getValue());
|
|
|
|
if (newDataset.getDatasetDataRepositories() != null) {
|
|
|
|
newDataset.setDatasetDataRepositories(newDataset.getDatasetDataRepositories().stream().map(item -> {
|
|
|
|
DataRepository dataRepository = new DataRepository();
|
|
|
|
dataRepository.setId(item.getDataRepository().getId());
|
|
|
|
|
|
|
|
DatasetDataRepository datasetDataRepository = new DatasetDataRepository();
|
|
|
|
datasetDataRepository.setDataRepository(dataRepository);
|
|
|
|
datasetDataRepository.setDataset(newDataset);
|
|
|
|
datasetDataRepository.setData(item.getData());
|
|
|
|
return datasetDataRepository;
|
|
|
|
}).collect(Collectors.toSet()));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newDataset.getDatasetExternalDatasets() != null) {
|
|
|
|
newDataset.setDatasetExternalDatasets(newDataset.getDatasetExternalDatasets().stream().map(item -> {
|
|
|
|
ExternalDataset externalDataset = new ExternalDataset();
|
|
|
|
externalDataset.setId(item.getExternalDataset().getId());
|
|
|
|
DatasetExternalDataset datasetExternalDataset = new DatasetExternalDataset();
|
|
|
|
datasetExternalDataset.setExternalDataset(externalDataset);
|
|
|
|
datasetExternalDataset.setDataset(newDataset);
|
|
|
|
datasetExternalDataset.setData(item.getData());
|
|
|
|
return datasetExternalDataset;
|
|
|
|
}).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());
|
|
|
|
DatasetService datasetService = new DatasetService();
|
|
|
|
datasetService.setService(service);
|
|
|
|
datasetService.setDataset(newDataset);
|
|
|
|
datasetService.setData(item.getData());
|
|
|
|
return datasetService;
|
|
|
|
}).collect(Collectors.toSet()));
|
|
|
|
}
|
|
|
|
newDataset.setCreated(new Date());
|
|
|
|
return newDataset;
|
|
|
|
}).thenApplyAsync(item -> {
|
2020-03-13 11:02:19 +01:00
|
|
|
futures.add(datasetDao.createOrUpdateAsync(item).whenComplete(((dataset1, throwable) -> {
|
|
|
|
eu.eudat.elastic.entities.Dataset datasetElastic = new eu.eudat.elastic.entities.Dataset();
|
|
|
|
datasetElastic.setId(dataset1.getId().toString());
|
|
|
|
datasetElastic.setLabel(dataset1.getLabel());
|
2020-03-17 11:41:27 +01:00
|
|
|
datasetElastic.setDescription(dataset1.getDescription());
|
2020-03-13 11:02:19 +01:00
|
|
|
datasetElastic.setTemplate(dataset1.getProfile().getId());
|
|
|
|
datasetElastic.setStatus(dataset1.getStatus());
|
|
|
|
datasetElastic.setDmp(dataset1.getDmp().getId());
|
|
|
|
datasetElastic.setGroup(dataset1.getDmp().getGroupId());
|
|
|
|
datasetElastic.setGrant(dataset1.getDmp().getGrant().getId());
|
|
|
|
if (dataset1.getDmp().getUsers() != null) {
|
|
|
|
datasetElastic.setCollaborators(dataset1.getDmp().getUsers().stream().map(user -> {
|
|
|
|
Collaborator collaborator = new Collaborator();
|
|
|
|
collaborator.setId(user.getId().toString());
|
2020-04-22 17:40:43 +02:00
|
|
|
// collaborator.setName(user.getUser().getName());
|
2020-03-13 11:02:19 +01:00
|
|
|
return collaborator;
|
|
|
|
}).collect(Collectors.toList()));
|
|
|
|
}
|
|
|
|
datasetElastic.setLastVersion(true);
|
2020-03-17 11:43:20 +01:00
|
|
|
datasetElastic.setLastPublicVersion(false);
|
2020-03-13 11:02:19 +01:00
|
|
|
if (dataset1.getDmp().getOrganisations() != null) {
|
|
|
|
datasetElastic.setOrganizations(dataset1.getDmp().getOrganisations().stream().map(org -> {
|
|
|
|
Organization organization = new Organization();
|
|
|
|
organization.setId(org.getId().toString());
|
|
|
|
organization.setName(org.getLabel());
|
|
|
|
return organization;
|
|
|
|
}).collect(Collectors.toList()));
|
|
|
|
}
|
2020-03-16 17:50:29 +01:00
|
|
|
datasetElastic.setPublic(dataset1.getDmp().isPublic());
|
|
|
|
datasetElastic.setGrantStatus(dataset1.getDmp().getGrant().getStatus());
|
2020-03-17 16:14:16 +01:00
|
|
|
|
2020-03-13 11:02:19 +01:00
|
|
|
try {
|
2020-04-06 17:34:25 +02:00
|
|
|
eu.eudat.elastic.entities.Dataset oldDatasetElastic = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString());
|
|
|
|
if (oldDatasetElastic != null) {
|
|
|
|
datasetElastic.setTags(oldDatasetElastic.getTags());
|
|
|
|
}
|
2020-04-01 17:16:06 +02:00
|
|
|
datasetElastic.setFormData(this.datasetManager.getWordDocumentText(dataset1));
|
|
|
|
apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().createOrUpdate(datasetElastic);
|
2020-03-18 17:23:34 +01:00
|
|
|
} catch (Exception e) {
|
2020-03-13 11:02:19 +01:00
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
})));
|
2018-02-07 10:56:30 +01:00
|
|
|
return futures;
|
|
|
|
}).join();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2018-10-08 17:14:27 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
public void makePublic(UUID id, Principal principal) throws Exception {
|
|
|
|
DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(id);
|
|
|
|
// Check if dmp is finalized and if user is owner.
|
|
|
|
if (!isUserOwnerOfDmp(dmp, principal))
|
|
|
|
throw new Exception("User does not have the privilege to do this action.");
|
|
|
|
if (!dmp.getStatus().equals(DMP.DMPStatus.FINALISED.getValue()))
|
|
|
|
throw new Exception("DMP is not finalized");
|
|
|
|
dmp.setPublic(true);
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp);
|
|
|
|
this.updateIndex(dmp);
|
|
|
|
DataManagementPlanCriteria criteria = new DataManagementPlanCriteria();
|
|
|
|
criteria.setGroupIds(Collections.singletonList(dmp.getGroupId()));
|
|
|
|
criteria.setAllVersions(true);
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).toList().stream().forEach(dmp1 -> {
|
|
|
|
dmp1.getDataset().forEach(dataset -> {
|
|
|
|
try {
|
|
|
|
List<Tag> tags = new ArrayList<>();
|
|
|
|
eu.eudat.elastic.entities.Dataset elastic = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString());
|
|
|
|
if (elastic != null) {
|
|
|
|
tags = elastic.getTags();
|
|
|
|
}
|
|
|
|
this.datasetManager.updateTags(dataset, tags);
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId());
|
|
|
|
sendNotification(dmp, user, NotificationType.DMP_PUBLISH);
|
2020-05-05 17:31:32 +02:00
|
|
|
this.createZenodoDoi(dmp.getId(), principal, null);
|
2020-04-22 17:40:43 +02:00
|
|
|
}
|
2019-03-05 12:59:34 +01:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
public void makeFinalize(UUID id, Principal principal, DatasetsToBeFinalized datasetsToBeFinalized) throws Exception {
|
|
|
|
DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(id);
|
|
|
|
if (!isUserOwnerOfDmp(dmp, principal))
|
|
|
|
throw new Exception("User does not have the privilege to do this action.");
|
|
|
|
if (dmp.getStatus().equals(DMP.DMPStatus.FINALISED.getValue()))
|
|
|
|
throw new Exception("DMP is already finalized");
|
|
|
|
dmp.setStatus(DMP.DMPStatus.FINALISED.getValue());
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp);
|
|
|
|
this.updateIndex(dmp);
|
|
|
|
List<Dataset> indexDatasets = new ArrayList<>();
|
|
|
|
if (datasetsToBeFinalized != null && datasetsToBeFinalized.getUuids() != null && !datasetsToBeFinalized.getUuids().isEmpty()) {
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()
|
|
|
|
.asQueryable().where((builder, root) -> root.get("id").in(datasetsToBeFinalized.getUuids()))
|
|
|
|
.update(root -> root.<Integer>get("status"), Dataset.Status.FINALISED.getValue());
|
|
|
|
List<Dataset> finalizedDatasets = dmp.getDataset().stream().filter(dataset -> datasetsToBeFinalized.getUuids().contains(dataset.getId())).collect(Collectors.toList());
|
|
|
|
finalizedDatasets.forEach(dataset -> dataset.setStatus(Dataset.Status.FINALISED.getValue()));
|
|
|
|
indexDatasets.addAll(finalizedDatasets);
|
|
|
|
List<UUID> datasetsToBeCanceled = new LinkedList<>();
|
|
|
|
for (Dataset dataset : dmp.getDataset()) {
|
|
|
|
if (!dataset.getStatus().equals(Dataset.Status.FINALISED.getValue()) && !datasetsToBeFinalized.getUuids().contains(dataset.getId())) {
|
|
|
|
datasetsToBeCanceled.add(dataset.getId());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!datasetsToBeCanceled.isEmpty()) {
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()
|
|
|
|
.asQueryable().where((builder, root) -> root.get("id").in(datasetsToBeCanceled))
|
|
|
|
.update(root -> root.<Integer>get("status"), Dataset.Status.CANCELED.getValue());
|
|
|
|
List<Dataset> cancelledDatasets = dmp.getDataset().stream().filter(dataset -> datasetsToBeCanceled.contains(dataset.getId())).collect(Collectors.toList());
|
|
|
|
cancelledDatasets.forEach(dataset -> dataset.setStatus(Dataset.Status.CANCELED.getValue()));
|
|
|
|
indexDatasets.addAll(cancelledDatasets);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
List<UUID> datasetsToBeCanceled = new LinkedList<>();
|
|
|
|
for (Dataset dataset : dmp.getDataset()) {
|
|
|
|
if (!dataset.getStatus().equals(Dataset.Status.FINALISED.getValue())) {
|
|
|
|
datasetsToBeCanceled.add(dataset.getId());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!datasetsToBeCanceled.isEmpty()) {
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()
|
|
|
|
.asQueryable().where((builder, root) -> root.get("id").in(datasetsToBeCanceled))
|
|
|
|
.update(root -> root.<Integer>get("status"), Dataset.Status.CANCELED.getValue());
|
|
|
|
List<Dataset> cancelledDatasets = dmp.getDataset().stream().filter(dataset -> datasetsToBeCanceled.contains(dataset.getId())).collect(Collectors.toList());
|
|
|
|
cancelledDatasets.forEach(dataset -> dataset.setStatus(Dataset.Status.CANCELED.getValue()));
|
|
|
|
indexDatasets.addAll(cancelledDatasets);
|
|
|
|
}
|
|
|
|
|
|
|
|
UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId());
|
|
|
|
sendNotification(dmp, user, NotificationType.DMP_FINALISED);
|
2019-03-05 12:59:34 +01:00
|
|
|
}
|
2020-04-22 17:40:43 +02:00
|
|
|
this.updateDatasetsIndex(indexDatasets);
|
|
|
|
}
|
2019-03-05 12:59:34 +01:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
/*
|
|
|
|
* Export Data
|
|
|
|
* */
|
2019-12-18 09:55:08 +01:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
public FileEnvelope getWordDocument(String id, Principal principal, ConfigLoader configLoader) throws IOException {
|
|
|
|
return this.getWordDocument(id, principal, configLoader, false);
|
|
|
|
}
|
2018-10-09 10:14:29 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
public FileEnvelope getWordDocument(String id, Principal principal, ConfigLoader configLoader, Boolean versioned) throws IOException {
|
|
|
|
WordBuilder wordBuilder = new WordBuilder();
|
|
|
|
VisibilityRuleService visibilityRuleService = this.utilitiesService.getVisibilityRuleService();
|
|
|
|
DatasetWizardModel dataset = new DatasetWizardModel();
|
|
|
|
XWPFDocument document = configLoader.getDocument();
|
|
|
|
|
|
|
|
eu.eudat.data.entities.DMP dmpEntity = databaseRepository.getDmpDao().find(UUID.fromString(id));
|
|
|
|
if (!dmpEntity.isPublic() && dmpEntity.getUsers().stream().filter(userInfo -> userInfo.getUser().getId() == principal.getId()).collect(Collectors.toList()).size() == 0)
|
|
|
|
throw new UnauthorisedException();
|
|
|
|
|
|
|
|
// DMP info on top of the document.
|
|
|
|
wordBuilder.addParagraphContent("Data Management Plan Information", document, ParagraphStyle.HEADER1, BigInteger.ZERO);
|
|
|
|
// DMP title custom style.
|
|
|
|
wordBuilder.addParagraphContent(dmpEntity.getLabel(), document, ParagraphStyle.HEADER2, BigInteger.ZERO);
|
|
|
|
wordBuilder.addParagraphContent(dmpEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO);
|
|
|
|
|
|
|
|
wordBuilder.addParagraphContent("Funder", document, ParagraphStyle.HEADER3, BigInteger.ZERO);
|
|
|
|
if (dmpEntity.getGrant().getFunder() != null)
|
|
|
|
wordBuilder.addParagraphContent(dmpEntity.getGrant().getFunder().getLabel(), document, ParagraphStyle.TEXT, BigInteger.ZERO);
|
|
|
|
|
|
|
|
wordBuilder.addParagraphContent("Grant", document, ParagraphStyle.HEADER3, BigInteger.ZERO);
|
|
|
|
wordBuilder.addParagraphContent(dmpEntity.getGrant().getLabel(), document, ParagraphStyle.TEXT, BigInteger.ZERO);
|
|
|
|
|
|
|
|
wordBuilder.addParagraphContent("Organisations", document, ParagraphStyle.HEADER3, BigInteger.ZERO);
|
|
|
|
if (dmpEntity.getOrganisations().size() > 0) {
|
|
|
|
wordBuilder.addParagraphContent(dmpEntity.getOrganisations().stream().map(Organisation::getLabel).collect(Collectors.joining(", "))
|
|
|
|
, document, ParagraphStyle.TEXT, BigInteger.ZERO);
|
|
|
|
}
|
|
|
|
|
|
|
|
wordBuilder.addParagraphContent("Researchers", document, ParagraphStyle.HEADER3, BigInteger.ZERO);
|
|
|
|
if (dmpEntity.getResearchers().size() > 0) {
|
|
|
|
wordBuilder.addParagraphContent(dmpEntity.getResearchers().stream().map(Researcher::getLabel).collect(Collectors.joining(", "))
|
|
|
|
, document, ParagraphStyle.TEXT, BigInteger.ZERO);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*wordBuilder.addParagraphContent("DMP Profile", document, ParagraphStyle.HEADER2, BigInteger.ZERO);
|
|
|
|
if (dmpEntity.getProfile() != null){
|
|
|
|
wordBuilder.addParagraphContent(dmpEntity.getProfile().getLabel(), document, ParagraphStyle.TEXT, BigInteger.ZERO);
|
|
|
|
}*/
|
|
|
|
|
|
|
|
// Page break at the end of the DMP title.
|
|
|
|
XWPFParagraph parBreakDMP = document.createParagraph();
|
|
|
|
parBreakDMP.setPageBreak(true);
|
|
|
|
|
|
|
|
wordBuilder.addParagraphContent("Datasets", document, ParagraphStyle.HEADER1, BigInteger.ZERO);
|
|
|
|
// Space below Datasets.
|
|
|
|
XWPFParagraph parBreakDatasets = document.createParagraph();
|
|
|
|
dmpEntity.getDataset().stream()
|
|
|
|
.filter(item -> item.getStatus() != Dataset.Status.CANCELED.getValue())
|
|
|
|
.filter(item -> item.getStatus() != Dataset.Status.DELETED.getValue())
|
|
|
|
.forEach(datasetEntity -> {
|
|
|
|
Map<String, Object> properties = new HashMap<>();
|
|
|
|
if (datasetEntity.getProperties() != null) {
|
|
|
|
JSONObject jObject = new JSONObject(datasetEntity.getProperties());
|
|
|
|
properties = jObject.toMap();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Custom style for the Dataset title.
|
|
|
|
//wordBuilder.addParagraphContent("Title: " + datasetEntity.getLabel(), document, ParagraphStyle.HEADER1, BigInteger.ZERO);
|
|
|
|
XWPFParagraph datasetLabelParagraph = document.createParagraph();
|
|
|
|
datasetLabelParagraph.setStyle("Heading2");
|
|
|
|
XWPFRun runDatasetTitle1 = datasetLabelParagraph.createRun();
|
|
|
|
runDatasetTitle1.setText("Title: ");
|
|
|
|
runDatasetTitle1.setBold(true);
|
|
|
|
runDatasetTitle1.setFontSize(12);
|
|
|
|
XWPFRun runDatasetTitle = datasetLabelParagraph.createRun();
|
|
|
|
runDatasetTitle.setText(datasetEntity.getLabel());
|
|
|
|
runDatasetTitle.setColor("2E75B6");
|
|
|
|
runDatasetTitle.setBold(true);
|
|
|
|
runDatasetTitle.setFontSize(12);
|
|
|
|
|
|
|
|
XWPFParagraph datasetTemplateParagraph = document.createParagraph();
|
|
|
|
datasetTemplateParagraph.setStyle("Heading3");
|
|
|
|
XWPFRun runDatasetTemplate1 = datasetTemplateParagraph.createRun();
|
|
|
|
runDatasetTemplate1.setText("Template: ");
|
|
|
|
runDatasetTemplate1.setBold(true);
|
|
|
|
runDatasetTemplate1.setFontSize(12);
|
|
|
|
XWPFRun runDatasetTemplate = datasetTemplateParagraph.createRun();
|
|
|
|
runDatasetTemplate.setText(datasetEntity.getProfile().getLabel());
|
|
|
|
runDatasetTemplate.setColor("2E75B6");
|
|
|
|
runDatasetTemplate.setBold(true);
|
|
|
|
runDatasetTemplate.setFontSize(12);
|
|
|
|
|
|
|
|
XWPFParagraph externalReferencesParagraph = document.createParagraph();
|
|
|
|
externalReferencesParagraph.setStyle("Heading3");
|
|
|
|
XWPFRun externalReferencesRun = externalReferencesParagraph.createRun();
|
|
|
|
externalReferencesRun.setText("External References");
|
|
|
|
externalReferencesRun.setColor("2E75B6");
|
|
|
|
externalReferencesRun.setBold(true);
|
|
|
|
externalReferencesRun.setFontSize(12);
|
|
|
|
|
|
|
|
wordBuilder.addParagraphContent("Data Repositories", document, ParagraphStyle.HEADER4, BigInteger.ZERO);
|
|
|
|
if (datasetEntity.getDatasetDataRepositories().size() > 0) {
|
|
|
|
wordBuilder.addParagraphContent(datasetEntity.getDatasetDataRepositories().stream().map(DatasetDataRepository::getDataRepository).map(DataRepository::getLabel).collect(Collectors.joining(", "))
|
|
|
|
, document, ParagraphStyle.TEXT, BigInteger.ZERO);
|
|
|
|
}
|
|
|
|
wordBuilder.addParagraphContent("External Datasets", document, ParagraphStyle.HEADER4, BigInteger.ZERO);
|
|
|
|
if (datasetEntity.getDatasetExternalDatasets().size() > 0) {
|
|
|
|
wordBuilder.addParagraphContent(datasetEntity.getDatasetExternalDatasets().stream().map(DatasetExternalDataset::getExternalDataset).map(ExternalDataset::getLabel).collect(Collectors.joining(", "))
|
|
|
|
, document, ParagraphStyle.TEXT, BigInteger.ZERO);
|
|
|
|
}
|
|
|
|
wordBuilder.addParagraphContent("Registries", document, ParagraphStyle.HEADER4, BigInteger.ZERO);
|
|
|
|
if (datasetEntity.getRegistries().size() > 0) {
|
|
|
|
wordBuilder.addParagraphContent(datasetEntity.getRegistries().stream().map(Registry::getLabel).collect(Collectors.joining(", "))
|
|
|
|
, document, ParagraphStyle.TEXT, BigInteger.ZERO);
|
|
|
|
}
|
|
|
|
wordBuilder.addParagraphContent("Services", document, ParagraphStyle.HEADER4, BigInteger.ZERO);
|
|
|
|
if (datasetEntity.getServices().size() > 0) {
|
|
|
|
wordBuilder.addParagraphContent(datasetEntity.getServices().stream().map(DatasetService::getService).map(Service::getLabel).collect(Collectors.joining(", "))
|
|
|
|
, document, ParagraphStyle.TEXT, BigInteger.ZERO);
|
|
|
|
}
|
|
|
|
/*wordBuilder.addParagraphContent("Tags", document, ParagraphStyle.HEADER3, BigInteger.ZERO);
|
|
|
|
if (datasetEntity.().size() > 0) {
|
|
|
|
wordBuilder.addParagraphContent(datasetEntity.getServices().stream().map(DatasetService::getService).map(Service::getLabel).collect(Collectors.joining(", "))
|
|
|
|
, document, ParagraphStyle.HEADER4, BigInteger.ZERO);
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
|
|
wordBuilder.addParagraphContent(datasetEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO);
|
|
|
|
|
|
|
|
// Dataset Description custom style.
|
|
|
|
XWPFParagraph datasetDescriptionParagraph = document.createParagraph();
|
|
|
|
datasetDescriptionParagraph.setStyle("Heading3");
|
|
|
|
XWPFRun datasetDescriptionRun = datasetDescriptionParagraph.createRun();
|
|
|
|
datasetDescriptionRun.setText("Dataset Description");
|
|
|
|
datasetDescriptionRun.setColor("2E75B6");
|
|
|
|
datasetDescriptionRun.setBold(true);
|
|
|
|
datasetDescriptionRun.setFontSize(12);
|
|
|
|
|
|
|
|
PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(dataset, datasetEntity);
|
|
|
|
visibilityRuleService.setProperties(properties);
|
|
|
|
visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules());
|
|
|
|
try {
|
|
|
|
wordBuilder.build(document, pagedDatasetProfile, visibilityRuleService);
|
|
|
|
} catch (IOException e) {
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
// Page break at the end of the Dataset.
|
|
|
|
XWPFParagraph parBreakDataset = document.createParagraph();
|
|
|
|
});
|
|
|
|
|
|
|
|
// Removes the top empty headings.
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
|
|
document.removeBodyElement(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
String fileName = "";
|
|
|
|
if (versioned) {
|
|
|
|
fileName = dmpEntity.getLabel() + " v" + dmpEntity.getVersion();
|
|
|
|
} else {
|
|
|
|
fileName = dmpEntity.getLabel();
|
|
|
|
}
|
|
|
|
fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", "");
|
|
|
|
FileEnvelope exportEnvelope = new FileEnvelope();
|
|
|
|
exportEnvelope.setFilename(fileName + ".docx");
|
|
|
|
String uuid = UUID.randomUUID().toString();
|
|
|
|
File exportFile = new File(this.environment.getProperty("temp.temp") + uuid + ".docx");
|
|
|
|
FileOutputStream out = new FileOutputStream(exportFile);
|
|
|
|
document.write(out);
|
|
|
|
out.close();
|
|
|
|
exportEnvelope.setFile(exportFile);
|
|
|
|
|
|
|
|
return exportEnvelope;
|
|
|
|
}
|
|
|
|
|
|
|
|
private FileEnvelope getXmlDocument(String id, Principal principal) throws InstantiationException, IllegalAccessException, IOException {
|
|
|
|
ExportXmlBuilder xmlBuilder = new ExportXmlBuilder();
|
|
|
|
VisibilityRuleService visibilityRuleService = utilitiesService.getVisibilityRuleService();
|
|
|
|
eu.eudat.data.entities.DMP dmp = databaseRepository.getDmpDao().find(UUID.fromString(id));
|
|
|
|
if (!dmp.isPublic() && dmp.getUsers().stream().filter(userInfo -> userInfo.getUser().getId() == principal.getId()).collect(Collectors.toList()).size() == 0)
|
|
|
|
throw new UnauthorisedException();
|
|
|
|
List<Dataset> datasets = dmp.getDataset().stream().collect(Collectors.toList());
|
|
|
|
/*String fileName = dmp.getLabel();
|
|
|
|
fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", "");*/
|
|
|
|
String uuid = UUID.randomUUID().toString();
|
|
|
|
File xmlFile = new File(this.environment.getProperty("temp.temp") + uuid + ".xml");
|
|
|
|
BufferedWriter writer = new BufferedWriter(new FileWriter(xmlFile, true));
|
|
|
|
Document xmlDoc = XmlBuilder.getDocument();
|
|
|
|
Element dmpElement = xmlDoc.createElement("dmp");
|
|
|
|
Element dmpDescription = xmlDoc.createElement("description");
|
|
|
|
dmpDescription.setTextContent(dmp.getDescription());
|
|
|
|
dmpElement.appendChild(dmpDescription);
|
|
|
|
Element dmpName = xmlDoc.createElement("dmpName");
|
|
|
|
dmpName.setTextContent(dmp.getLabel());
|
|
|
|
dmpElement.appendChild(dmpName);
|
|
|
|
|
|
|
|
DMPProfile dmpProfile = dmp.getProfile();
|
|
|
|
Element dmpProfileElement = xmlDoc.createElement("dmpProfile");
|
|
|
|
Element dmpProfileName = xmlDoc.createElement("dmpProfileName");
|
|
|
|
if (!(dmpProfile == null)) {
|
|
|
|
dmpProfileName.setTextContent(dmpProfile.getLabel());
|
|
|
|
dmpProfileElement.appendChild(dmpProfileName);
|
|
|
|
Element dmpProfileId = xmlDoc.createElement("dmpProfileId");
|
|
|
|
dmpProfileId.setTextContent(dmpProfile.getId().toString());
|
|
|
|
dmpProfileElement.appendChild(dmpProfileId);
|
|
|
|
Element values = xmlDoc.createElement("values");
|
|
|
|
values.setTextContent(dmpProfile.getDefinition());
|
|
|
|
dmpProfileElement.appendChild(values);
|
|
|
|
}
|
|
|
|
dmpElement.appendChild(dmpProfileElement);
|
|
|
|
|
|
|
|
// Funder.
|
|
|
|
Element funder = xmlDoc.createElement("funder");
|
|
|
|
Element funderLabel = xmlDoc.createElement("label");
|
|
|
|
Element funderId = xmlDoc.createElement("id");
|
|
|
|
funderLabel.setTextContent(dmp.getGrant().getFunder().getLabel());
|
|
|
|
funderId.setTextContent(dmp.getGrant().getFunder().getId().toString());
|
|
|
|
funder.appendChild(funderLabel);
|
|
|
|
funder.appendChild(funderId);
|
|
|
|
dmpElement.appendChild(funder);
|
|
|
|
// Grant.
|
|
|
|
Element grant = xmlDoc.createElement("grant");
|
|
|
|
Element grantLabel = xmlDoc.createElement("label");
|
|
|
|
Element grantId = xmlDoc.createElement("id");
|
|
|
|
grantLabel.setTextContent(dmp.getGrant().getLabel());
|
|
|
|
grantId.setTextContent(dmp.getGrant().getId().toString());
|
|
|
|
grant.appendChild(grantLabel);
|
|
|
|
grant.appendChild(grantId);
|
|
|
|
dmpElement.appendChild(grant);
|
|
|
|
// Project.
|
|
|
|
Element project = xmlDoc.createElement("project");
|
|
|
|
Element projectLabel = xmlDoc.createElement("label");
|
|
|
|
Element projectId = xmlDoc.createElement("id");
|
|
|
|
projectLabel.setTextContent(dmp.getProject().getLabel());
|
|
|
|
projectId.setTextContent(dmp.getProject().getId().toString());
|
|
|
|
project.appendChild(projectLabel);
|
|
|
|
project.appendChild(projectId);
|
|
|
|
dmpElement.appendChild(project);
|
|
|
|
|
|
|
|
Element organisationsElement = xmlDoc.createElement("organisations");
|
|
|
|
for (Organisation organisation : dmp.getOrganisations()) {
|
|
|
|
Element organisationElement = xmlDoc.createElement("organisation");
|
|
|
|
Element organisationNameElement = xmlDoc.createElement("name");
|
|
|
|
organisationNameElement.setTextContent(organisation.getLabel());
|
|
|
|
Element organisationReferenceElement = xmlDoc.createElement("reference");
|
|
|
|
organisationReferenceElement.setTextContent(organisation.getReference());
|
|
|
|
organisationElement.appendChild(organisationNameElement);
|
|
|
|
organisationElement.appendChild(organisationReferenceElement);
|
|
|
|
organisationsElement.appendChild(organisationElement);
|
|
|
|
}
|
|
|
|
dmpElement.appendChild(organisationsElement);
|
|
|
|
|
|
|
|
Element researchersElement = xmlDoc.createElement("researchers");
|
|
|
|
for (Researcher researcher : dmp.getResearchers()) {
|
|
|
|
Element researcherElement = xmlDoc.createElement("researcher");
|
|
|
|
Element researcherNameElement = xmlDoc.createElement("name");
|
|
|
|
researcherNameElement.setTextContent(researcher.getLabel());
|
|
|
|
Element researcherReferenceElement = xmlDoc.createElement("reference");
|
|
|
|
researcherReferenceElement.setTextContent(researcher.getReference());
|
2019-03-05 12:59:34 +01:00
|
|
|
researcherElement.appendChild(researcherNameElement);
|
|
|
|
researcherElement.appendChild(researcherReferenceElement);
|
|
|
|
researchersElement.appendChild(researcherElement);
|
2018-10-09 10:14:29 +02:00
|
|
|
}
|
|
|
|
dmpElement.appendChild(researchersElement);
|
2018-10-08 17:14:27 +02:00
|
|
|
Element datasetsElement = xmlDoc.createElement("datasets");
|
|
|
|
|
|
|
|
for (Dataset dataset : datasets) {
|
|
|
|
Element datasetElement = xmlDoc.createElement("dataset");
|
2020-03-03 10:16:02 +01:00
|
|
|
Element datsetProfileElement = xmlDoc.createElement("profile");
|
|
|
|
datasetElement.setAttribute("name", dataset.getLabel());
|
|
|
|
datasetElement.appendChild(datsetProfileElement);
|
|
|
|
datsetProfileElement.setTextContent(dataset.getProfile().getId().toString());
|
2018-10-08 17:14:27 +02:00
|
|
|
|
|
|
|
DatasetWizardModel datasetWizardModel = new DatasetWizardModel();
|
|
|
|
Map<String, Object> properties = new HashMap<>();
|
|
|
|
if (dataset.getProperties() != null) {
|
|
|
|
JSONObject jobject = new JSONObject(dataset.getProperties());
|
|
|
|
properties = jobject.toMap();
|
|
|
|
}
|
2019-03-05 16:33:59 +01:00
|
|
|
PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(datasetWizardModel, dataset);
|
2018-10-08 17:14:27 +02:00
|
|
|
visibilityRuleService.setProperties(properties);
|
|
|
|
visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules());
|
|
|
|
datasetElement.appendChild(xmlBuilder.createPages(pagedDatasetProfile.getPages(), visibilityRuleService, xmlDoc));
|
|
|
|
datasetsElement.appendChild(datasetElement);
|
|
|
|
}
|
2019-03-05 12:59:34 +01:00
|
|
|
Element profiles = xmlDoc.createElement("profiles");
|
2019-05-28 09:22:58 +02:00
|
|
|
|
|
|
|
// Get DatasetProfiles from DMP to add to XML.
|
|
|
|
for (DatasetProfile datasetProfile : dmp.getAssociatedDmps()) {
|
|
|
|
Element profile = xmlDoc.createElement("profile");
|
|
|
|
Element profileLabel = xmlDoc.createElement("profilelabel");
|
|
|
|
profileLabel.setTextContent(datasetProfile.getLabel());
|
|
|
|
profile.appendChild(profileLabel);
|
|
|
|
Element profileId = xmlDoc.createElement("profileId");
|
|
|
|
profileId.setTextContent(datasetProfile.getId().toString());
|
|
|
|
profile.appendChild(profileId);
|
|
|
|
profiles.appendChild(profile);
|
2019-03-05 12:59:34 +01:00
|
|
|
}
|
|
|
|
dmpElement.appendChild(profiles);
|
2018-10-08 17:14:27 +02:00
|
|
|
dmpElement.appendChild(datasetsElement);
|
2019-03-05 12:59:34 +01:00
|
|
|
xmlDoc.appendChild(dmpElement);
|
2018-10-08 17:14:27 +02:00
|
|
|
String xml = XmlBuilder.generateXml(xmlDoc);
|
|
|
|
writer.write(xml);
|
|
|
|
writer.close();
|
|
|
|
FileEnvelope fileEnvelope = new FileEnvelope();
|
|
|
|
fileEnvelope.setFile(xmlFile);
|
2020-04-02 16:22:41 +02:00
|
|
|
fileEnvelope.setFilename(dmp.getLabel() + ".xml");
|
2019-02-06 11:46:14 +01:00
|
|
|
|
2018-10-08 17:14:27 +02:00
|
|
|
return fileEnvelope;
|
|
|
|
}
|
|
|
|
|
2019-12-11 11:55:40 +01:00
|
|
|
public ResponseEntity<byte[]> getRDAJsonDocument(String id, DatasetManager datasetManager, Principal principal) throws IOException {
|
2019-06-04 16:04:04 +02:00
|
|
|
eu.eudat.data.entities.DMP dmp = databaseRepository.getDmpDao().find(UUID.fromString(id));
|
2020-04-22 17:40:43 +02:00
|
|
|
if (!dmp.isPublic() && dmp.getUsers().stream().noneMatch(userInfo -> userInfo.getUser().getId() == principal.getId()))
|
|
|
|
throw new UnauthorisedException();
|
2020-03-20 17:20:22 +01:00
|
|
|
// RDAExportModel rdaExportModel = new RDAExportModel().fromDataModel(dmp, datasetManager, principal);
|
|
|
|
String result = rdaManager.convertToRDA(dmp);
|
2019-06-04 16:04:04 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
/*ObjectMapper mapper = new ObjectMapper();
|
|
|
|
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);*/
|
2019-06-04 16:04:04 +02:00
|
|
|
String fileName = dmp.getLabel();
|
|
|
|
fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", "");
|
2020-04-02 16:22:41 +02:00
|
|
|
String uuid = UUID.randomUUID().toString();
|
|
|
|
File file = new File(this.environment.getProperty("temp.temp") + uuid + ".json");
|
2020-03-20 17:20:22 +01:00
|
|
|
OutputStream output = new FileOutputStream(file);
|
2019-06-04 16:04:04 +02:00
|
|
|
try {
|
2020-03-20 17:20:22 +01:00
|
|
|
// mapper.writeValue(file, rdaExportModel);
|
|
|
|
output.write(result.getBytes());
|
|
|
|
output.flush();
|
|
|
|
output.close();
|
2019-06-21 13:04:29 +02:00
|
|
|
} catch (IOException e) {
|
2020-01-16 16:46:24 +01:00
|
|
|
logger.error(e.getMessage(), e);
|
2019-06-04 16:04:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
InputStream resource = new FileInputStream(file);
|
|
|
|
HttpHeaders responseHeaders = new HttpHeaders();
|
|
|
|
responseHeaders.setContentLength(file.length());
|
|
|
|
responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
|
2020-04-02 16:22:41 +02:00
|
|
|
responseHeaders.set("Content-Disposition", "attachment;filename=" + fileName + ".json");
|
2019-06-04 16:04:04 +02:00
|
|
|
responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition");
|
|
|
|
responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type");
|
|
|
|
|
|
|
|
byte[] content = org.apache.poi.util.IOUtils.toByteArray(resource);
|
|
|
|
resource.close();
|
|
|
|
Files.deleteIfExists(file.toPath());
|
|
|
|
return new ResponseEntity<>(content, responseHeaders, HttpStatus.OK);
|
|
|
|
}
|
|
|
|
|
2019-11-11 09:40:12 +01:00
|
|
|
public ResponseEntity<byte[]> getDocument(String id, String contentType, Principal principal, ConfigLoader configLoader) throws InstantiationException, IllegalAccessException, IOException {
|
2020-04-02 16:22:41 +02:00
|
|
|
FileEnvelope file;
|
2019-06-21 13:04:29 +02:00
|
|
|
switch (contentType) {
|
2019-02-06 11:46:14 +01:00
|
|
|
case "application/xml":
|
2020-04-02 16:22:41 +02:00
|
|
|
file = getXmlDocument(id, principal);
|
2019-02-06 11:46:14 +01:00
|
|
|
break;
|
|
|
|
case "application/msword":
|
2019-11-11 09:40:12 +01:00
|
|
|
file = getWordDocument(id, principal, configLoader);
|
2019-02-06 11:46:14 +01:00
|
|
|
break;
|
|
|
|
default:
|
2020-04-02 16:22:41 +02:00
|
|
|
file = getXmlDocument(id, principal);
|
2019-02-06 11:46:14 +01:00
|
|
|
}
|
2020-04-02 16:22:41 +02:00
|
|
|
InputStream resource = new FileInputStream(file.getFile());
|
2019-02-06 11:46:14 +01:00
|
|
|
HttpHeaders responseHeaders = new HttpHeaders();
|
2020-04-02 16:22:41 +02:00
|
|
|
responseHeaders.setContentLength(file.getFile().length());
|
2019-02-06 11:46:14 +01:00
|
|
|
responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
|
2020-04-02 16:22:41 +02:00
|
|
|
responseHeaders.set("Content-Disposition", "attachment;filename=" + file.getFilename());
|
2019-02-06 11:46:14 +01:00
|
|
|
responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition");
|
|
|
|
responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type");
|
|
|
|
|
|
|
|
byte[] content = org.apache.poi.util.IOUtils.toByteArray(resource);
|
|
|
|
resource.close();
|
2020-04-02 16:22:41 +02:00
|
|
|
Files.deleteIfExists(file.getFile().toPath());
|
2019-02-06 11:46:14 +01:00
|
|
|
return new ResponseEntity<>(content,
|
|
|
|
responseHeaders,
|
|
|
|
HttpStatus.OK);
|
|
|
|
}
|
2019-03-05 12:59:34 +01:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
/*
|
|
|
|
* Data Import
|
|
|
|
* */
|
|
|
|
|
2019-06-21 13:04:29 +02:00
|
|
|
public List<DmpImportModel> createDmpFromXml(ApiContext apiContext, MultipartFile[] files, Principal principal) throws IOException, JAXBException, Exception {
|
2019-03-05 12:59:34 +01:00
|
|
|
List<DmpImportModel> dataManagementPlans = new ArrayList<>();
|
|
|
|
// Jaxb approach.
|
|
|
|
JAXBContext jaxbContext;
|
|
|
|
|
2019-06-21 13:04:29 +02:00
|
|
|
for (MultipartFile multipartFile : Arrays.asList(files)) { // Gets one item from the array.
|
|
|
|
try {
|
2019-03-05 12:59:34 +01:00
|
|
|
InputStream in = multipartFile.getInputStream(); // Transforms item to InputStream.
|
|
|
|
jaxbContext = JAXBContext.newInstance(DmpImportModel.class);
|
|
|
|
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
|
2019-06-21 13:04:29 +02:00
|
|
|
DmpImportModel dmpImportModel = (DmpImportModel) jaxbUnmarshaller.unmarshal(in);
|
2019-03-05 12:59:34 +01:00
|
|
|
dataManagementPlans.add(dmpImportModel);
|
2019-06-21 13:04:29 +02:00
|
|
|
} catch (IOException | JAXBException ex) {
|
2020-01-16 16:46:24 +01:00
|
|
|
logger.error(ex.getMessage(), ex);
|
2019-03-05 12:59:34 +01:00
|
|
|
}
|
2019-10-30 13:30:31 +01:00
|
|
|
// TODO Iterate through the list of dataManagementPlans.
|
|
|
|
// Creates new dataManagementPlan to fill it with the data model that was parsed from the xml.
|
2019-03-05 12:59:34 +01:00
|
|
|
// Creates properties.
|
2020-03-03 10:16:02 +01:00
|
|
|
DataManagementPlanEditorModel dm = new DataManagementPlanEditorModel();
|
2019-03-26 15:52:19 +01:00
|
|
|
DataManagementPlanProfile dmpProfile = new DataManagementPlanProfile();
|
|
|
|
|
|
|
|
List<Field> fieldList = new LinkedList<>();
|
|
|
|
Field field = new Field();
|
|
|
|
field.setLabel(dataManagementPlans.get(0).getDmpProfile().getDmpProfileName());
|
|
|
|
field.setId(dataManagementPlans.get(0).getDmpProfile().getDmpProfileId());
|
|
|
|
|
|
|
|
fieldList.add(field);
|
|
|
|
dmpProfile.setFields(fieldList);
|
|
|
|
|
|
|
|
/*Tuple tuple = new Tuple();
|
2019-03-05 12:59:34 +01:00
|
|
|
tuple.setId(dataManagementPlans.get(0).getDmpProfile().getDmpProfileId());
|
2019-03-26 15:52:19 +01:00
|
|
|
tuple.setLabel(dataManagementPlans.get(0).getDmpProfile().getDmpProfileName());*/
|
2020-03-03 10:16:02 +01:00
|
|
|
eu.eudat.models.data.funder.Funder funder = new eu.eudat.models.data.funder.Funder();
|
|
|
|
FunderImportModels funderImport = dataManagementPlans.get(0).getFunderImportModels();
|
|
|
|
funder.setId(funderImport.getId());
|
|
|
|
funder.setLabel(funderImport.getLabel());
|
|
|
|
FunderDMPEditorModel funderEditor = new FunderDMPEditorModel();
|
|
|
|
funderEditor.setExistFunder(funder);
|
|
|
|
|
2019-07-31 16:57:34 +02:00
|
|
|
eu.eudat.models.data.grant.Grant grant = new eu.eudat.models.data.grant.Grant();
|
|
|
|
GrantImportModels grantImport = dataManagementPlans.get(0).getGrantImport();
|
|
|
|
grant.setId(grantImport.getId());
|
|
|
|
grant.setLabel(grantImport.getLabel());
|
|
|
|
grant.setAbbreviation(grantImport.getAbbreviation());
|
|
|
|
grant.setDescription(grantImport.getDescription());
|
2020-03-03 10:16:02 +01:00
|
|
|
GrantDMPEditorModel grantEditor = new GrantDMPEditorModel();
|
|
|
|
grantEditor.setExistGrant(grant);
|
|
|
|
|
|
|
|
eu.eudat.models.data.project.Project project = new eu.eudat.models.data.project.Project();
|
|
|
|
ProjectImportModels projectImport = dataManagementPlans.get(0).getProjectImportModels();
|
|
|
|
project.setId(projectImport.getId());
|
|
|
|
project.setLabel(projectImport.getLabel());
|
|
|
|
ProjectDMPEditorModel projectEditor = new ProjectDMPEditorModel();
|
|
|
|
projectEditor.setExistProject(project);
|
|
|
|
|
2019-03-05 12:59:34 +01:00
|
|
|
List<eu.eudat.models.data.dmp.AssociatedProfile> associatedProfiles = new LinkedList<>();
|
2019-06-21 13:04:29 +02:00
|
|
|
for (AssociatedProfileImportModels a : dataManagementPlans.get(0).getProfilesImportModels()) {
|
2019-03-05 12:59:34 +01:00
|
|
|
AssociatedProfile associatedProfile = new AssociatedProfile();
|
|
|
|
associatedProfile.setId(a.getId());
|
|
|
|
associatedProfile.setLabel(a.getLabel());
|
|
|
|
associatedProfiles.add(associatedProfile);
|
|
|
|
}
|
2019-06-21 13:04:29 +02:00
|
|
|
List<eu.eudat.models.data.dmp.Organisation> organisations = new ArrayList<>();
|
|
|
|
for (OrganisationImportModel org : dataManagementPlans.get(0).getOrganisationImportModels()) {
|
2019-03-06 16:35:56 +01:00
|
|
|
eu.eudat.models.data.dmp.Organisation organisation = new eu.eudat.models.data.dmp.Organisation();
|
|
|
|
organisation.setLabel(org.getOrganaisationNameImport());
|
2020-03-19 12:36:01 +01:00
|
|
|
organisation.setReference(org.getOrganaisationReferenceImport());
|
|
|
|
organisation.setKey(organisation.getReference().split(":")[0]);
|
2019-03-06 16:35:56 +01:00
|
|
|
organisations.add(organisation);
|
|
|
|
}
|
2019-03-05 12:59:34 +01:00
|
|
|
List<eu.eudat.models.data.dmp.Researcher> researchers = new LinkedList<>();
|
2019-06-21 13:04:29 +02:00
|
|
|
for (ResearcherImportModels res : dataManagementPlans.get(0).getResearchersImportModels()) {
|
2019-03-06 16:35:56 +01:00
|
|
|
eu.eudat.models.data.dmp.Researcher researcher = new eu.eudat.models.data.dmp.Researcher();
|
|
|
|
researcher.setLabel(res.getResearcherImportName());
|
2020-03-19 12:36:01 +01:00
|
|
|
researcher.setReference(res.getResearcherImportReference());
|
|
|
|
researcher.setKey(researcher.getReference().split(":")[0]);
|
2019-03-06 16:35:56 +01:00
|
|
|
researchers.add(researcher);
|
|
|
|
}
|
|
|
|
|
2019-05-10 10:33:48 +02:00
|
|
|
List<UserListingModel> associatedUsers = new LinkedList<>();
|
2019-03-05 12:59:34 +01:00
|
|
|
List<DynamicFieldWithValue> dynamicFields = new LinkedList<>();
|
|
|
|
|
|
|
|
// Sets properties.
|
|
|
|
dm.setLabel(files[0].getOriginalFilename()); // Sets label.
|
2020-03-03 10:16:02 +01:00
|
|
|
dm.setGrant(grantEditor); //Sets grant property.
|
|
|
|
dm.setFunder(funderEditor);
|
|
|
|
dm.setProject(projectEditor);
|
2019-03-05 12:59:34 +01:00
|
|
|
dm.setDescription(dataManagementPlans.get(0).getDescriptionImport()); // Sets description property.
|
|
|
|
dm.setProfiles(associatedProfiles);
|
|
|
|
dm.setOrganisations(organisations); // Sets organisations property.
|
|
|
|
dm.setResearchers(researchers); // Sets researchers property.
|
|
|
|
dm.setAssociatedUsers(associatedUsers); // Sets associatedUsers property.
|
|
|
|
dm.setDynamicFields(dynamicFields); // Sets dynamicFields property.
|
2019-03-26 15:52:19 +01:00
|
|
|
dm.setDefinition(dmpProfile);
|
2019-03-05 12:59:34 +01:00
|
|
|
|
2019-06-13 09:32:45 +02:00
|
|
|
//createOrUpdate(apiContext, dm, principal);
|
2020-04-22 17:40:43 +02:00
|
|
|
DMP dmp = this.createOrUpdate(apiContext, dm, principal);
|
|
|
|
if (dmp.getOrganisations() == null) {
|
|
|
|
dmp.setOrganisations(new HashSet<>());
|
|
|
|
}
|
|
|
|
if (dmp.getResearchers() == null) {
|
|
|
|
dmp.setResearchers(new HashSet<>());
|
|
|
|
}
|
|
|
|
if (dmp.getDataset() == null) {
|
|
|
|
dmp.setDataset(new HashSet<>());
|
|
|
|
}
|
|
|
|
if (dmp.getUsers() == null) {
|
|
|
|
dmp.setUsers(new HashSet<>());
|
|
|
|
}
|
|
|
|
if (dmp.getAssociatedDmps() == null) {
|
|
|
|
dmp.setAssociatedDmps(new HashSet<>());
|
|
|
|
}
|
2020-03-03 10:16:02 +01:00
|
|
|
|
|
|
|
List<DatasetListingModel> datasets = new LinkedList<>();
|
|
|
|
for (DatasetImportModels das: dataManagementPlans.get(0).getDatasetImportModels()) {
|
|
|
|
eu.eudat.data.entities.Dataset dataset = new eu.eudat.data.entities.Dataset();
|
|
|
|
dataset.setLabel(das.getName());
|
|
|
|
dataset.setProfile(databaseRepository.getDatasetProfileDao().find(das.getProfile()));
|
|
|
|
dataset.setProperties(new ObjectMapper().writeValueAsString(das.getFieldImportModels()));
|
|
|
|
dataset.setStatus((short) 0);
|
|
|
|
dataset.setRegistries(new HashSet<>());
|
|
|
|
dataset.setDatasetDataRepositories(new HashSet<>());
|
|
|
|
dataset.setServices(new HashSet<>());
|
|
|
|
dataset.setDatasetExternalDatasets(new HashSet<>());
|
|
|
|
dataset.setDmp(dmp);
|
|
|
|
DatasetWizardModel datasetWizard = new DatasetWizardModel();
|
|
|
|
datasetWizard.setDatasetProfileDefinition(this.datasetManager.getPagedProfile(datasetWizard, dataset));
|
|
|
|
datasetWizard.fromDataModel(dataset);
|
|
|
|
this.datasetManager.createOrUpdate(datasetWizard, principal);
|
2020-04-22 17:40:43 +02:00
|
|
|
// datasets.add(new DatasetListingModel().fromDataModel(dataset));
|
2020-03-03 10:16:02 +01:00
|
|
|
}
|
2019-03-05 12:59:34 +01:00
|
|
|
|
2020-01-16 16:46:24 +01:00
|
|
|
logger.info(dm.toString());
|
2019-03-05 12:59:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return dataManagementPlans;
|
|
|
|
}
|
2019-06-12 11:13:50 +02:00
|
|
|
|
2020-03-26 17:39:25 +01:00
|
|
|
public List<DMP> createFromRDA(MultipartFile[] files, Principal principal) throws IOException {
|
|
|
|
if (principal.getId() == null) {
|
|
|
|
throw new UnauthorisedException("No user is logged in");
|
|
|
|
}
|
|
|
|
List<DMP> result = new ArrayList<>();
|
|
|
|
for (MultipartFile file: files) {
|
|
|
|
DMP dmp = rdaManager.convertToEntity(new String(file.getBytes(), "UTF-8"));
|
2020-03-30 14:36:07 +02:00
|
|
|
dmp.setLabel(file.getOriginalFilename());
|
2020-03-26 17:39:25 +01:00
|
|
|
UserInfo me = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId());
|
|
|
|
dmp.setModified(new Date());
|
|
|
|
dmp.setCreator(me);
|
|
|
|
dmp.setVersion(0);
|
|
|
|
dmp.setStatus((short)0);
|
|
|
|
dmp.setGroupId(UUID.randomUUID());
|
2020-03-30 15:44:49 +02:00
|
|
|
if (dmp.getResearchers() != null && !dmp.getResearchers().isEmpty()) {
|
|
|
|
dmp.getResearchers().forEach(researcher -> {
|
|
|
|
researcher.setId(UUID.randomUUID());
|
|
|
|
researcher.setCreated(new Date());
|
|
|
|
researcher.setModified(new Date());
|
|
|
|
researcher.setStatus((short) 0);
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao().createOrUpdate(researcher);
|
|
|
|
});
|
|
|
|
}
|
2020-03-26 17:39:25 +01:00
|
|
|
databaseRepository.getDmpDao().createOrUpdate(dmp);
|
|
|
|
assignUser(dmp, me);
|
2020-04-01 17:16:06 +02:00
|
|
|
this.updateIndex(dmp);
|
2020-03-26 17:39:25 +01:00
|
|
|
dmp.getDataset().forEach(dataset -> {
|
|
|
|
dataset.setStatus(Dataset.Status.SAVED.getValue());
|
|
|
|
dataset.setCreated(new Date());
|
|
|
|
dataset.setModified(new Date());
|
|
|
|
dataset.setDmp(dmp);
|
2020-03-27 13:31:06 +01:00
|
|
|
dataset = databaseRepository.getDatasetDao().createOrUpdate(dataset);
|
|
|
|
dataset.setRegistries(new HashSet<>());
|
|
|
|
dataset.setDatasetDataRepositories(new HashSet<>());
|
|
|
|
dataset.setDatasetExternalDatasets(new HashSet<>());
|
|
|
|
dataset.setServices(new HashSet<>());
|
|
|
|
if (dmp.getOrganisations() == null) {
|
|
|
|
dmp.setOrganisations(new HashSet<>());
|
|
|
|
}
|
|
|
|
if (dmp.getResearchers() == null) {
|
|
|
|
dmp.setResearchers(new HashSet<>());
|
|
|
|
}
|
|
|
|
dmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmp.getId())).toList()));
|
|
|
|
try {
|
2020-04-06 17:34:25 +02:00
|
|
|
List<Tag> tags = new ArrayList<>();
|
|
|
|
eu.eudat.elastic.entities.Dataset elastic = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString());
|
|
|
|
if (elastic != null) {
|
|
|
|
tags = elastic.getTags();
|
|
|
|
}
|
2020-04-01 17:16:06 +02:00
|
|
|
datasetManager.updateTags(dataset, tags);
|
2020-03-27 13:31:06 +01:00
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
2020-03-26 17:39:25 +01:00
|
|
|
});
|
|
|
|
result.add(dmp);
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
/*
|
|
|
|
* Data assignments
|
|
|
|
* */
|
2019-06-12 11:13:50 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
private void assignUser(DMP dmp, UserInfo userInfo) {
|
|
|
|
UserDMP userDMP = new UserDMP();
|
|
|
|
userDMP.setDmp(dmp);
|
|
|
|
userDMP.setUser(userInfo);
|
|
|
|
userDMP.setRole(UserDMP.UserDMPRoles.OWNER.getValue());
|
|
|
|
databaseRepository.getUserDmpDao().createOrUpdate(userDMP);
|
|
|
|
}
|
2019-06-12 11:13:50 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
private void assignGrandUserIfInternal(DMP dmp, UserInfo user) {
|
|
|
|
if (dmp.getGrant().getCreationUser() == null && (dmp.getGrant().getReference() != null && dmp.getGrant().getReference().startsWith("dmp:"))) {
|
|
|
|
dmp.getGrant().setCreationUser(user);
|
|
|
|
}
|
|
|
|
}
|
2019-06-12 11:13:50 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
private void assignFunderUserIfInternal(DMP dmp, UserInfo user) {
|
|
|
|
if (dmp.getGrant().getFunder().getCreationUser() == null && ( dmp.getGrant().getFunder().getReference() != null && dmp.getGrant().getFunder().getReference().startsWith("dmp:"))) {
|
|
|
|
dmp.getGrant().getFunder().setCreationUser(user);
|
|
|
|
}
|
2019-06-12 11:13:50 +02:00
|
|
|
}
|
2019-06-20 15:25:49 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
private void assignProjectUserIfInternal(DMP dmp, UserInfo user) {
|
|
|
|
if (dmp.getProject().getCreationUser() == null && (dmp.getProject().getReference() != null && dmp.getProject().getReference().startsWith("dmp:"))) {
|
|
|
|
dmp.getProject().setCreationUser(user);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Index
|
|
|
|
* */
|
|
|
|
|
|
|
|
private void updateGroupIndex(UUID groupId) {
|
2020-03-17 11:43:20 +01:00
|
|
|
DataManagementPlanCriteria criteria = new DataManagementPlanCriteria();
|
2020-04-22 17:40:43 +02:00
|
|
|
criteria.setGroupIds(Collections.singletonList(groupId));
|
2020-03-17 11:43:20 +01:00
|
|
|
criteria.setAllVersions(true);
|
2020-04-22 17:40:43 +02:00
|
|
|
List<DMP> dmps = databaseRepository.getDmpDao().getWithCriteria(criteria).toList();
|
|
|
|
for (DMP dmp: dmps) {
|
|
|
|
try {
|
|
|
|
if (dmp.getUsers() != null) {
|
|
|
|
logger.info(dmp.getUsers().toString());
|
2020-03-17 11:43:20 +01:00
|
|
|
}
|
2020-04-22 17:40:43 +02:00
|
|
|
this.updateIndex(dmp);
|
|
|
|
} catch (IOException e) {
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
}
|
2019-06-20 15:25:49 +02:00
|
|
|
}
|
2019-06-28 14:58:25 +02:00
|
|
|
|
2020-04-13 15:35:32 +02:00
|
|
|
private void updateDatasetsIndex(List<Dataset> datasets) {
|
|
|
|
datasets.forEach(dataset -> {
|
|
|
|
List<Tag> tags = new ArrayList<>();
|
|
|
|
eu.eudat.elastic.entities.Dataset elastic = null;
|
|
|
|
try {
|
|
|
|
elastic = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString());
|
|
|
|
if (elastic != null) {
|
|
|
|
tags = elastic.getTags();
|
|
|
|
}
|
|
|
|
this.datasetManager.updateTags(dataset, tags);
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
private void updateIndex(DMP dmp) throws IOException {
|
|
|
|
DmpMapper mapper = new DmpMapper(apiContext, datasetManager);
|
|
|
|
Dmp elastic = mapper.toElastic(dmp);
|
|
|
|
apiContext.getOperationsContext().getElasticRepository().getDmpRepository().createOrUpdate(elastic);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void generateIndex(Principal principal) {
|
|
|
|
if (principal.getAuthorities().contains(Authorities.ADMIN.getValue())) {
|
|
|
|
if (apiContext.getOperationsContext().getElasticRepository().getDmpRepository().createIndex()) {
|
|
|
|
List<DMP> dmps = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable().toList();
|
|
|
|
dmps.forEach(dmp -> {
|
|
|
|
try {
|
|
|
|
this.updateIndex(dmp);
|
|
|
|
} catch (IOException e) {
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
});
|
2020-04-13 15:35:32 +02:00
|
|
|
}
|
2020-04-22 17:40:43 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void clearIndex(Principal principal) throws IOException {
|
|
|
|
if (principal.getAuthorities().contains(Authorities.ADMIN.getValue())) {
|
|
|
|
apiContext.getOperationsContext().getElasticRepository().getDmpRepository().clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Checkup
|
|
|
|
* */
|
|
|
|
|
|
|
|
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.");
|
2019-06-28 14:58:25 +02:00
|
|
|
}
|
|
|
|
}
|
2020-04-22 17:40:43 +02:00
|
|
|
}
|
|
|
|
}
|
2020-02-17 11:41:01 +01:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
private void checkDmpValidationRules(DMP dmp) throws Exception {
|
|
|
|
if (dmp.getLabel() == null || dmp.getLabel().trim().isEmpty()) {
|
|
|
|
throw new Exception("DMP has no label.");
|
|
|
|
}
|
|
|
|
if (dmp.getAssociatedDmps().size() == 0) {
|
|
|
|
throw new Exception("DMP does not contain Dataset Templates.");
|
|
|
|
}
|
|
|
|
if (dmp.getGrant() == null) {
|
|
|
|
throw new Exception("DMP has no Grant assigned.");
|
2019-06-28 14:58:25 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private boolean isUserOwnerOfDmp(DMP dmp, Principal principal) {
|
2020-02-18 17:25:41 +01:00
|
|
|
return (dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getId()).equals(principal.getId());
|
2019-06-28 14:58:25 +02:00
|
|
|
}
|
2019-07-04 16:30:15 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
/*
|
|
|
|
* DOI Generation
|
|
|
|
* */
|
|
|
|
|
2020-02-21 13:04:14 +01:00
|
|
|
private String getPreviousDOI(UUID groupId, UUID selfId) {
|
|
|
|
DataManagementPlanCriteria criteria = new DataManagementPlanCriteria();
|
|
|
|
List<UUID> groupIds = new ArrayList<>();
|
|
|
|
groupIds.add(groupId);
|
|
|
|
criteria.setGroupIds(groupIds);
|
|
|
|
criteria.setAllVersions(true);
|
|
|
|
List<DMP> dmps = this.databaseRepository.getDmpDao().getWithCriteria(criteria).toList();
|
|
|
|
String doi = null;
|
|
|
|
for (DMP dmp: dmps) {
|
|
|
|
if (!dmp.getId().equals(selfId)) {
|
|
|
|
if (dmp.getDoi() != null && !dmp.getDoi().isEmpty()) {
|
|
|
|
doi = dmp.getDoi();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return doi;
|
|
|
|
}
|
|
|
|
|
2020-04-21 11:40:50 +02:00
|
|
|
private String getUnpublishedDOI(String DOI, String token, Integer version) {
|
|
|
|
try {
|
|
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
|
|
HttpHeaders headers = new HttpHeaders();
|
|
|
|
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
|
|
|
|
headers.setContentType(MediaType.APPLICATION_JSON);
|
|
|
|
Map createResponse = null;
|
|
|
|
LinkedHashMap<String, String> links = null;
|
|
|
|
LinkedHashMap<String, String> metadata = null;
|
|
|
|
String listUrl = this.environment.getProperty("zenodo.url") + "deposit/depositions" + "?q=conceptdoi:\"" + DOI + "\"&access_token=" + token;
|
|
|
|
ResponseEntity<Map[]> listResponses = restTemplate.getForEntity(listUrl, Map[].class);
|
|
|
|
createResponse = listResponses.getBody()[0];
|
|
|
|
metadata = (LinkedHashMap<String, String>) createResponse.get("metadata");
|
|
|
|
links = (LinkedHashMap<String, String>) createResponse.get("links");
|
|
|
|
|
|
|
|
if (metadata.get("version").equals(version.toString())) {
|
|
|
|
return links.get("publish");
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}catch (Exception e) {
|
|
|
|
logger.warn(e.getMessage(), e);
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-11 09:40:12 +01:00
|
|
|
public String createZenodoDoi(UUID id, Principal principal, ConfigLoader configLoader) throws Exception {
|
2019-07-04 16:30:15 +02:00
|
|
|
DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(id);
|
|
|
|
if (!isUserOwnerOfDmp(dmp, principal))
|
|
|
|
throw new Exception("User is not authorized to invoke this action");
|
|
|
|
if (!dmp.getStatus().equals(DMP.DMPStatus.FINALISED.getValue()))
|
|
|
|
throw new Exception("DMP is not finalized");
|
2020-05-05 17:31:32 +02:00
|
|
|
/*if (dmp.getDoi() != null)
|
|
|
|
throw new Exception("DMP already has a DOI");*/
|
2019-07-04 16:30:15 +02:00
|
|
|
|
2020-04-06 17:31:12 +02:00
|
|
|
String zenodoToken = "";
|
|
|
|
try {
|
|
|
|
if (this.userManager.isDOITokenValid(principal)) {
|
|
|
|
zenodoToken = principal.getZenodoToken();
|
|
|
|
}
|
|
|
|
} catch (NonValidTokenException e) {
|
|
|
|
zenodoToken = this.environment.getProperty("zenodo.access_token");
|
|
|
|
}
|
2019-07-04 16:30:15 +02:00
|
|
|
// First step, post call to Zenodo, to create the entry.
|
|
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
|
|
HttpHeaders headers = new HttpHeaders();
|
2020-03-19 11:50:23 +01:00
|
|
|
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
|
2019-07-04 16:30:15 +02:00
|
|
|
headers.setContentType(MediaType.APPLICATION_JSON);
|
2020-05-05 17:31:32 +02:00
|
|
|
String createData = null;
|
|
|
|
StringBuilder dataBuilder = new StringBuilder();
|
|
|
|
dataBuilder.append("{\n \"metadata\": {\n");
|
|
|
|
dataBuilder.append( " \"title\": \"").append(dmp.getLabel()).append("\",\n");
|
|
|
|
dataBuilder.append(" \"upload_type\": \"publication\",\n");
|
|
|
|
dataBuilder.append(" \"publication_type\": \"datamanagementplan\",\n");
|
|
|
|
dataBuilder.append(" \"description\": \"").append((dmp.getDescription() != null && !dmp.getDescription().isEmpty() ? dmp.getDescription() : "<p></p>")).append("\",\n");
|
|
|
|
dataBuilder.append(" \"version\": \"").append(dmp.getVersion()).append("\",\n");
|
|
|
|
dataBuilder.append(" \"related_identifiers\": [{\n");
|
|
|
|
dataBuilder.append(" \t\t\"identifier\": \"").append((this.environment.getProperty("dmp.domain") + "/explore-plans/publicOverview/" + id.toString())).append("\",\n");
|
|
|
|
dataBuilder.append(" \t\t\"relation\": \"isIdenticalTo\"}],\n");
|
|
|
|
dataBuilder.append(" \"contributors\": [");
|
|
|
|
int i = 0;
|
|
|
|
for(UserDMP userDMP: dmp.getUsers()) {
|
|
|
|
if (i > 0) {
|
|
|
|
dataBuilder.append(",\n");
|
|
|
|
}
|
|
|
|
dataBuilder.append("{\n");
|
|
|
|
dataBuilder.append(" \t\t\"name\": \"").append(userDMP.getUser().getName()).append("\",\n");
|
|
|
|
dataBuilder.append(" \t\t\"type\": \"").append("ProjectMember").append("\",\n");
|
|
|
|
dataBuilder.append(" \t\t\"affiliation\": \"OpenDMP\"\n}");
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
for(Researcher researcher: dmp.getResearchers()) {
|
|
|
|
if (i > 0) {
|
|
|
|
dataBuilder.append(",\n");
|
|
|
|
}
|
|
|
|
dataBuilder.append("{\n");
|
|
|
|
dataBuilder.append(" \t\t\"name\": \"").append(researcher.getLabel()).append("\",\n");
|
|
|
|
dataBuilder.append(" \t\t\"type\": \"").append("Researcher").append("\",\n");
|
|
|
|
String referenceHead = researcher.getReference().split(":")[0];
|
|
|
|
String referenceTail = researcher.getReference().replace(referenceHead + ":", "");
|
|
|
|
dataBuilder.append(" \t\t\"affiliation\": \"" + referenceHead + "\"");
|
|
|
|
if (referenceHead.toUpperCase().equals("ORCID")) {
|
|
|
|
dataBuilder.append(",\n \t\t\"orcid\": \"" + referenceTail + "\"");
|
|
|
|
}
|
|
|
|
dataBuilder.append("\n}");
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
dataBuilder.append("],\n");
|
2020-05-06 17:11:33 +02:00
|
|
|
String grantReferenceHead = dmp.getGrant().getReference().split(":")[0];
|
|
|
|
if (grantReferenceHead.equals("openaire")) {
|
|
|
|
String grantReferenceTail = dmp.getGrant().getReference().split(":")[3];
|
|
|
|
DoiFunder doiFunder = this.apiContext.getOperationsContext().getDatabaseRepository().getDoiFunderDao().findFunderByName(dmp.getGrant().getFunder().getLabel());
|
|
|
|
String finalId = doiFunder.getDoi() + "::" + grantReferenceTail;
|
|
|
|
dataBuilder.append(" \"grants\": [{\n");
|
|
|
|
dataBuilder.append(" \t\t\"id\": \"").append(finalId).append("\"\n}],\n");
|
|
|
|
}
|
2020-05-05 17:31:32 +02:00
|
|
|
dataBuilder.append(" \"creators\": [{\n");
|
|
|
|
dataBuilder.append(" \t\t\"name\": \"").append(dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getName()).append("\",\n");
|
|
|
|
dataBuilder.append(" \t\t\"affiliation\": \"OpenDMP\"}]\n");
|
|
|
|
dataBuilder.append(" }\n").append("}");
|
|
|
|
createData = dataBuilder.toString();
|
2020-03-19 11:50:23 +01:00
|
|
|
JsonNode createDataJSON = new ObjectMapper().readTree(createData);
|
|
|
|
HttpEntity<JsonNode> request = new HttpEntity<>(createDataJSON, headers);
|
2020-02-21 13:04:14 +01:00
|
|
|
Map createResponse = null;
|
2020-02-24 10:37:54 +01:00
|
|
|
LinkedHashMap<String, String> links = null;
|
2020-03-19 11:50:23 +01:00
|
|
|
String previousDOI = this.getPreviousDOI(dmp.getGroupId(), dmp.getId());
|
2020-04-21 11:40:50 +02:00
|
|
|
String unpublishedUrl = null;
|
|
|
|
String publishUrl = null;
|
2020-05-05 17:31:32 +02:00
|
|
|
String finalDoi = null;
|
2020-03-19 11:50:23 +01:00
|
|
|
try {
|
2020-04-21 11:40:50 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
if (previousDOI == null) {
|
|
|
|
String createUrl = this.environment.getProperty("zenodo.url") + "deposit/depositions" + "?access_token=" + zenodoToken;
|
|
|
|
createResponse = restTemplate.postForEntity(createUrl, request, Map.class).getBody();
|
2020-02-21 13:04:14 +01:00
|
|
|
links = (LinkedHashMap<String, String>) createResponse.get("links");
|
2020-05-05 17:31:32 +02:00
|
|
|
finalDoi = (String) createResponse.get("conceptdoi");
|
2020-04-22 17:40:43 +02:00
|
|
|
} else {
|
|
|
|
unpublishedUrl = this.getUnpublishedDOI(previousDOI, zenodoToken, dmp.getVersion());
|
|
|
|
if (unpublishedUrl == null) {
|
|
|
|
//It requires more than one step to create a new version
|
|
|
|
//First, get the deposit related to the concept DOI
|
|
|
|
String listUrl = this.environment.getProperty("zenodo.url") + "deposit/depositions" + "?q=conceptdoi:\"" + previousDOI + "\"&access_token=" + zenodoToken;
|
|
|
|
ResponseEntity<Map[]> listResponses = restTemplate.getForEntity(listUrl, Map[].class);
|
|
|
|
createResponse = listResponses.getBody()[0];
|
|
|
|
links = (LinkedHashMap<String, String>) createResponse.get("links");
|
|
|
|
//Second, make the new version (not in the links?)
|
|
|
|
String newVersionUrl = links.get("self") + "/actions/newversion" + "?access_token=" + zenodoToken;
|
|
|
|
createResponse = restTemplate.postForObject(newVersionUrl, null, Map.class);
|
|
|
|
links = (LinkedHashMap<String, String>) createResponse.get("links");
|
|
|
|
//Third, get the new deposit
|
|
|
|
String latestDraftUrl = links.get("latest_draft") + "?access_token=" + zenodoToken;
|
|
|
|
createResponse = restTemplate.getForObject(latestDraftUrl, Map.class);
|
|
|
|
links = (LinkedHashMap<String, String>) createResponse.get("links");
|
2020-05-05 17:31:32 +02:00
|
|
|
finalDoi = (String) createResponse.get("conceptdoi");
|
2020-04-22 17:40:43 +02:00
|
|
|
//At this point it might fail to perform the next requests so enclose them with try catch
|
|
|
|
try {
|
|
|
|
//Forth, update the new deposit's metadata
|
|
|
|
String updateUrl = links.get("self") + "?access_token=" + zenodoToken;
|
|
|
|
restTemplate.put(updateUrl, request);
|
|
|
|
//And finally remove pre-existing files from it
|
|
|
|
String fileListUrl = links.get("self") + "/files" + "?access_token=" + zenodoToken;
|
|
|
|
ResponseEntity<Map[]> fileListResponse = restTemplate.getForEntity(fileListUrl, Map[].class);
|
|
|
|
for (Map file : fileListResponse.getBody()) {
|
|
|
|
String fileDeleteUrl = links.get("self") + "/files/" + file.get("id") + "?access_token=" + zenodoToken;
|
|
|
|
restTemplate.delete(fileDeleteUrl);
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
//In case the last two steps fail delete the latest Deposit it in order to create a new one (only one at a time is allowed)
|
|
|
|
restTemplate.delete(latestDraftUrl);
|
|
|
|
throw e;
|
2020-02-24 11:12:53 +01:00
|
|
|
}
|
|
|
|
}
|
2020-04-21 11:40:50 +02:00
|
|
|
}
|
2019-07-04 16:30:15 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
if (unpublishedUrl == null) {
|
|
|
|
// Second step, add the file to the entry.
|
|
|
|
HttpHeaders fileHeaders = new HttpHeaders();
|
|
|
|
fileHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
|
|
|
|
LinkedMultiValueMap<String, Object> addFileMap = new LinkedMultiValueMap<>();
|
2019-07-04 16:30:15 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
FileEnvelope file = getWordDocument(id.toString(), principal, configLoader);
|
|
|
|
addFileMap.add("filename", file.getFilename());
|
|
|
|
FileSystemResource fileSystemResource = new FileSystemResource(file.getFile());
|
|
|
|
addFileMap.add("file", fileSystemResource);
|
|
|
|
HttpEntity<MultiValueMap<String, Object>> addFileMapRequest = new HttpEntity<>(addFileMap, fileHeaders);
|
2019-07-04 16:30:15 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
String addFileUrl = links.get("files") + "?access_token=" + zenodoToken;
|
|
|
|
ResponseEntity<String> addFileResponse = restTemplate.postForEntity(addFileUrl, addFileMapRequest, String.class);
|
|
|
|
Files.deleteIfExists(file.getFile().toPath());
|
2019-07-04 16:30:15 +02:00
|
|
|
|
2020-04-21 11:40:50 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
// Third post call to Zenodo to publish the entry and return the DOI.
|
|
|
|
publishUrl = links.get("publish") + "?access_token=" + zenodoToken;
|
|
|
|
} else {
|
|
|
|
publishUrl = unpublishedUrl + "?access_token=" + zenodoToken;
|
|
|
|
}
|
2020-05-05 17:31:32 +02:00
|
|
|
if (dmp.isPublic()) {
|
|
|
|
Map<String, Object> publishResponce = restTemplate.postForObject(publishUrl, "", Map.class);
|
|
|
|
finalDoi = (String) publishResponce.get("conceptdoi");
|
|
|
|
}
|
2019-07-04 16:30:15 +02:00
|
|
|
|
2020-05-05 17:31:32 +02:00
|
|
|
if (finalDoi != null) {
|
|
|
|
dmp.setDoi(finalDoi);
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp);
|
|
|
|
}
|
|
|
|
return finalDoi;
|
2020-03-19 11:50:23 +01:00
|
|
|
} catch (HttpClientErrorException | HttpServerErrorException ex) {
|
|
|
|
ObjectMapper ob = new ObjectMapper();
|
|
|
|
Map<String, String> parsedException = ob.readValue(ex.getResponseBodyAsString(), HashMap.class);
|
|
|
|
throw new IOException(parsedException.get("message"), ex);
|
|
|
|
}
|
2019-07-04 16:30:15 +02:00
|
|
|
}
|
2020-04-01 17:16:06 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
/*
|
|
|
|
* Misc
|
|
|
|
* */
|
2020-04-01 17:16:06 +02:00
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
private void sendNotification(DMP dmp, UserInfo user, NotificationType notificationType) {
|
|
|
|
List<UserDMP> userDMPS = databaseRepository.getUserDmpDao().asQueryable().where(((builder, root) -> builder.equal(root.get("dmp").get("id"), dmp.getId()))).toList();
|
|
|
|
for (UserDMP userDMP : userDMPS) {
|
|
|
|
if (!userDMP.getUser().getId().equals(user.getId())) {
|
|
|
|
Notification notification = new Notification();
|
|
|
|
notification.setUserId(user);
|
|
|
|
notification.setType(notificationType);
|
|
|
|
notification.setNotifyState(NotifyState.PENDING);
|
|
|
|
notification.setIsActive(ActiveStatus.ACTIVE);
|
|
|
|
notification.setData("{" +
|
|
|
|
"\"userId\": \"" + userDMP.getUser().getId() + "\"" +
|
|
|
|
", \"id\": \"" + userDMP.getDmp().getId() + "\"" +
|
|
|
|
", \"name\": \"" + userDMP.getDmp().getLabel() + "\"" +
|
|
|
|
", \"path\": \"" + notificationPaths.get(notificationType) +"\"" +
|
|
|
|
"}");
|
|
|
|
notification.setCreatedAt(new Date());
|
|
|
|
notification.setUpdatedAt(notification.getCreatedAt());
|
|
|
|
notification.setContactTypeHint(ContactType.EMAIL);
|
|
|
|
notification.setContactHint(userDMP.getUser().getEmail());
|
|
|
|
databaseRepository.getNotificationDao().createOrUpdate(notification);
|
2020-04-17 12:01:26 +02:00
|
|
|
}
|
2020-04-01 17:16:06 +02:00
|
|
|
}
|
2020-04-22 17:40:43 +02:00
|
|
|
|
2020-04-01 17:16:06 +02:00
|
|
|
}
|
|
|
|
|
2020-04-22 17:40:43 +02:00
|
|
|
/*public DataTableData<DataManagementPlanListingModel> getPublicPaged(DataManagmentPlanPublicTableRequest dataManagementPlanPublicTableRequest, String fieldsGroup, Principal principal) throws Exception {
|
|
|
|
dataManagementPlanPublicTableRequest.setQuery(databaseRepository.getDmpDao().asQueryable().withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)));
|
|
|
|
QueryableList<DMP> items = dataManagementPlanPublicTableRequest.applyCriteria();
|
|
|
|
|
|
|
|
if (principal.getId() != null && dataManagementPlanPublicTableRequest.getCriteria().getRole() != null) {
|
|
|
|
items.where((builder, root) -> {
|
|
|
|
Join userJoin = root.join("users", JoinType.LEFT);
|
|
|
|
return builder.and(builder.equal(userJoin.join("user", JoinType.LEFT).get("id"), principal.getId()), builder.equal(userJoin.get("role"), dataManagementPlanPublicTableRequest.getCriteria().getRole()));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
QueryableList<DMP> pagedItems = PaginationManager.applyPaging(items, dataManagementPlanPublicTableRequest);
|
|
|
|
|
|
|
|
DataTableData<DataManagementPlanListingModel> dataTable = new DataTableData<>();
|
|
|
|
|
|
|
|
CompletableFuture itemsFuture;
|
|
|
|
if (fieldsGroup.equals("listing")) {
|
|
|
|
itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class))
|
|
|
|
.selectAsync(item -> {
|
|
|
|
item.setDataset(
|
|
|
|
item.getDataset().stream()
|
|
|
|
.filter(dataset -> dataset.getStatus().equals(Dataset.Status.FINALISED.getValue())).collect(Collectors.toSet()));
|
|
|
|
return new DataManagementPlanListingModel().fromDataModelDatasets(item);
|
|
|
|
})
|
|
|
|
.whenComplete((resultList, throwable) -> dataTable.setData(resultList));
|
|
|
|
} else {
|
|
|
|
itemsFuture = pagedItems
|
|
|
|
.selectAsync(item -> new DataManagementPlanListingModel().fromDataModel(item))
|
|
|
|
.whenComplete((resultList, throwable) -> dataTable.setData(resultList));
|
|
|
|
}
|
|
|
|
|
|
|
|
CompletableFuture countFuture = items.countAsync().whenComplete((count, throwable) -> {
|
|
|
|
dataTable.setTotalCount(count);
|
|
|
|
});
|
|
|
|
CompletableFuture.allOf(itemsFuture, countFuture).join();
|
|
|
|
return dataTable;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
/*public void unlock(UUID uuid) throws Exception {
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDmpDao()
|
|
|
|
.asQueryable().where((builder, root) -> builder.equal(root.get("id"), uuid))
|
|
|
|
.update(root -> root.get("status"), DMP.DMPStatus.ACTIVE.getValue());
|
|
|
|
return;
|
|
|
|
}*/
|
|
|
|
/*public File getPdfDocument(String id) throws InstantiationException, IllegalAccessException, InterruptedException, IOException {
|
|
|
|
File file = this.getWordDocument(id);
|
|
|
|
String fileName = file.getName();
|
|
|
|
if (fileName.endsWith(".docx")){
|
|
|
|
fileName = fileName.substring(0, fileName.length() - 5);
|
|
|
|
}
|
|
|
|
return this.datasetManager.convertToPDF(file, environment, fileName);
|
|
|
|
}*/
|
|
|
|
/*public eu.eudat.models.data.dmp.DataManagementPlan getSinglePublic(String id, DynamicGrantConfiguration dynamicGrantConfiguration) throws Exception {
|
|
|
|
DMP dataManagementPlanEntity = databaseRepository.getDmpDao().find(UUID.fromString(id));
|
|
|
|
|
|
|
|
if (dataManagementPlanEntity != null && dataManagementPlanEntity.getStatus() == 1) {
|
|
|
|
eu.eudat.models.data.dmp.DataManagementPlan datamanagementPlan = new eu.eudat.models.data.dmp.DataManagementPlan();
|
|
|
|
datamanagementPlan.fromDataModel(dataManagementPlanEntity);
|
|
|
|
datamanagementPlan.setDatasets(datamanagementPlan.getDatasets().stream().filter(dataset -> dataset.getStatus() == Dataset.Status.FINALISED.getValue()).collect(Collectors.toList()));
|
|
|
|
Map dmpProperties = dataManagementPlanEntity.getDmpProperties() != null ? new org.json.JSONObject(dataManagementPlanEntity.getDmpProperties()).toMap() : null;
|
|
|
|
// datamanagementPlan.setDynamicFields(dynamicGrantConfiguration.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<>(properties.get("id"), properties.get("label")));
|
|
|
|
});
|
|
|
|
return datamanagementPlan;
|
|
|
|
} else {
|
|
|
|
throw new Exception("Selected DMP is not public");
|
2020-04-01 17:16:06 +02:00
|
|
|
}
|
|
|
|
}
|
2020-04-22 17:40:43 +02:00
|
|
|
|
|
|
|
public DataManagementPlanOverviewModel getOverviewSinglePublic(String id) throws Exception {
|
|
|
|
DMP dataManagementPlanEntity = databaseRepository.getDmpDao().find(UUID.fromString(id));
|
|
|
|
if (dataManagementPlanEntity != null && dataManagementPlanEntity.getStatus() == 1) {
|
|
|
|
DataManagementPlanOverviewModel datamanagementPlan = new DataManagementPlanOverviewModel();
|
|
|
|
datamanagementPlan.fromDataModelDatasets(dataManagementPlanEntity);
|
|
|
|
datamanagementPlan.setDatasets(datamanagementPlan.getDatasets().stream().filter(dataset -> dataset.getStatus() == Dataset.Status.FINALISED.getValue()).collect(Collectors.toList()));
|
|
|
|
return datamanagementPlan;
|
|
|
|
} else {
|
|
|
|
throw new Exception("Selected DMP is not public");
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
/*public List<DataManagementPlan> getWithCriteria(DMPDao dmpsRepository, DataManagementPlanCriteriaRequest dataManagementPlanCriteria, Principal principal) throws IllegalAccessException, InstantiationException {
|
|
|
|
UUID principalID = principal.getId();
|
|
|
|
QueryableList<DMP> items = dmpsRepository.getWithCriteria(dataManagementPlanCriteria.getCriteria()).withHint(HintedModelFactory.getHint(DataManagementPlan.class));
|
|
|
|
List<Integer> roles = new LinkedList<>();
|
|
|
|
QueryableList<DMP> authenticatedItems = dmpsRepository.getAuthenticated(items, principalID, roles);
|
|
|
|
List<eu.eudat.models.data.dmp.DataManagementPlan> datamanagementPlans = authenticatedItems.select(item -> new DataManagementPlan().fromDataModel(item));
|
|
|
|
return datamanagementPlans;
|
|
|
|
}*/
|
2017-12-15 00:01:26 +01:00
|
|
|
}
|