2018-06-27 12:29:21 +02:00
|
|
|
package eu.eudat.logic.managers;
|
2017-12-15 13:25:21 +01:00
|
|
|
|
2022-03-16 11:14:08 +01:00
|
|
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
2020-06-12 16:25:53 +02:00
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
2023-10-18 17:52:03 +02:00
|
|
|
import eu.eudat.authorization.Permission;
|
2023-11-06 15:17:57 +01:00
|
|
|
import eu.eudat.commons.enums.DescriptionStatus;
|
2023-11-16 13:01:39 +01:00
|
|
|
import eu.eudat.commons.enums.DmpAccessType;
|
|
|
|
import eu.eudat.commons.enums.DmpStatus;
|
2023-11-06 15:17:57 +01:00
|
|
|
import eu.eudat.commons.enums.IsActive;
|
2023-10-18 17:52:03 +02:00
|
|
|
import eu.eudat.commons.scope.user.UserScope;
|
2023-11-16 13:01:39 +01:00
|
|
|
import eu.eudat.data.*;
|
2019-04-22 11:11:21 +02:00
|
|
|
import eu.eudat.data.dao.criteria.*;
|
2019-06-04 16:16:12 +02:00
|
|
|
import eu.eudat.data.dao.entities.DataRepositoryDao;
|
|
|
|
import eu.eudat.data.dao.entities.DatasetDao;
|
|
|
|
import eu.eudat.data.dao.entities.RegistryDao;
|
2023-10-18 12:04:53 +02:00
|
|
|
import eu.eudat.commons.enums.old.notification.ActiveStatus;
|
|
|
|
import eu.eudat.commons.enums.old.notification.ContactType;
|
|
|
|
import eu.eudat.commons.enums.old.notification.NotificationType;
|
|
|
|
import eu.eudat.commons.enums.old.notification.NotifyState;
|
|
|
|
import eu.eudat.data.old.*;
|
2018-10-02 16:33:58 +02:00
|
|
|
import eu.eudat.data.query.items.table.dataset.DatasetPublicTableRequest;
|
2018-07-11 15:47:36 +02:00
|
|
|
import eu.eudat.data.query.items.table.dataset.DatasetTableRequest;
|
2019-06-12 11:10:46 +02:00
|
|
|
import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem;
|
2020-07-03 15:11:54 +02:00
|
|
|
import eu.eudat.exceptions.security.ForbiddenException;
|
2020-02-26 12:36:42 +01:00
|
|
|
import eu.eudat.exceptions.security.UnauthorisedException;
|
2019-03-05 16:33:59 +01:00
|
|
|
import eu.eudat.logic.builders.BuilderFactory;
|
2018-07-11 15:47:36 +02:00
|
|
|
import eu.eudat.logic.builders.entity.UserInfoBuilder;
|
2019-11-11 09:40:12 +01:00
|
|
|
import eu.eudat.logic.proxy.config.configloaders.ConfigLoader;
|
2018-07-11 15:47:36 +02:00
|
|
|
import eu.eudat.logic.services.ApiContext;
|
|
|
|
import eu.eudat.logic.services.forms.VisibilityRuleService;
|
2022-02-09 14:23:16 +01:00
|
|
|
import eu.eudat.logic.services.forms.VisibilityRuleServiceImpl;
|
2019-03-05 16:33:59 +01:00
|
|
|
import eu.eudat.logic.services.operations.DatabaseRepository;
|
2023-11-20 16:09:24 +01:00
|
|
|
import eu.eudat.model.UserContactInfo;
|
2023-11-03 16:54:26 +01:00
|
|
|
import eu.eudat.model.file.FileEnvelope;
|
2019-04-02 09:51:22 +02:00
|
|
|
import eu.eudat.logic.utilities.documents.types.ParagraphStyle;
|
2018-06-27 12:29:21 +02:00
|
|
|
import eu.eudat.logic.utilities.documents.word.WordBuilder;
|
|
|
|
import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder;
|
2020-06-12 16:25:53 +02:00
|
|
|
import eu.eudat.logic.utilities.json.JsonSearcher;
|
2018-01-19 10:31:05 +01:00
|
|
|
import eu.eudat.models.HintedModelFactory;
|
2020-07-03 15:11:54 +02:00
|
|
|
import eu.eudat.models.data.dataset.DatasetOverviewModel;
|
2019-06-04 16:16:12 +02:00
|
|
|
import eu.eudat.models.data.datasetImport.DatasetImportField;
|
|
|
|
import eu.eudat.models.data.datasetImport.DatasetImportPagedDatasetProfile;
|
2019-06-12 11:10:46 +02:00
|
|
|
import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel;
|
2018-06-27 12:29:21 +02:00
|
|
|
import eu.eudat.models.data.datasetwizard.DatasetWizardModel;
|
2019-04-22 11:11:21 +02:00
|
|
|
import eu.eudat.models.data.dmp.AssociatedProfile;
|
2020-03-13 17:33:58 +01:00
|
|
|
import eu.eudat.models.data.dmp.DataManagementPlan;
|
2018-06-27 12:29:21 +02:00
|
|
|
import eu.eudat.models.data.helpers.common.DataTableData;
|
|
|
|
import eu.eudat.models.data.listingmodels.DatasetListingModel;
|
|
|
|
import eu.eudat.models.data.user.composite.PagedDatasetProfile;
|
2023-11-06 15:17:57 +01:00
|
|
|
import eu.eudat.query.DescriptionTemplateQuery;
|
2023-11-07 13:53:36 +01:00
|
|
|
import eu.eudat.query.DmpDescriptionTemplateQuery;
|
2023-11-21 11:15:29 +01:00
|
|
|
import eu.eudat.query.DmpUserQuery;
|
2023-11-20 16:09:24 +01:00
|
|
|
import eu.eudat.query.UserContactInfoQuery;
|
2017-12-17 22:34:24 +01:00
|
|
|
import eu.eudat.queryable.QueryableList;
|
2021-10-05 12:09:02 +02:00
|
|
|
import eu.eudat.types.MetricNames;
|
2023-10-18 17:52:03 +02:00
|
|
|
import gr.cite.commons.web.authz.service.AuthorizationService;
|
2023-11-20 16:09:24 +01:00
|
|
|
import gr.cite.tools.data.query.Ordering;
|
2023-11-06 15:17:57 +01:00
|
|
|
import gr.cite.tools.data.query.QueryFactory;
|
2020-03-18 17:23:34 +01:00
|
|
|
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
|
2018-10-18 11:33:13 +02:00
|
|
|
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
2019-10-31 10:16:29 +01:00
|
|
|
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
2017-12-22 14:42:47 +01: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-03-05 17:18:45 +01:00
|
|
|
import org.springframework.core.env.Environment;
|
2022-02-09 14:23:16 +01:00
|
|
|
import org.springframework.http.HttpHeaders;
|
|
|
|
import org.springframework.http.HttpStatus;
|
|
|
|
import org.springframework.http.MediaType;
|
|
|
|
import org.springframework.http.ResponseEntity;
|
2019-01-31 16:53:37 +01:00
|
|
|
import org.springframework.stereotype.Component;
|
2019-06-04 16:16:12 +02:00
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
2019-07-02 15:34:12 +02:00
|
|
|
import org.w3c.dom.Document;
|
2021-07-19 17:31:16 +02:00
|
|
|
import org.w3c.dom.Element;
|
2019-07-02 15:34:12 +02:00
|
|
|
import org.w3c.dom.Node;
|
|
|
|
import org.w3c.dom.NodeList;
|
2017-12-15 13:25:21 +01:00
|
|
|
|
2023-10-03 16:29:45 +02:00
|
|
|
import jakarta.activation.MimetypesFileTypeMap;
|
|
|
|
import jakarta.persistence.criteria.Join;
|
|
|
|
import jakarta.persistence.criteria.JoinType;
|
|
|
|
import jakarta.transaction.Transactional;
|
|
|
|
import jakarta.xml.bind.JAXBContext;
|
|
|
|
import jakarta.xml.bind.JAXBException;
|
|
|
|
import jakarta.xml.bind.Unmarshaller;
|
2023-10-18 17:52:03 +02:00
|
|
|
|
|
|
|
import javax.management.InvalidApplicationException;
|
2019-07-02 15:34:12 +02:00
|
|
|
import javax.xml.parsers.DocumentBuilder;
|
|
|
|
import javax.xml.parsers.DocumentBuilderFactory;
|
|
|
|
import javax.xml.xpath.XPath;
|
|
|
|
import javax.xml.xpath.XPathConstants;
|
|
|
|
import javax.xml.xpath.XPathFactory;
|
2018-10-18 11:33:13 +02:00
|
|
|
import java.io.*;
|
2019-04-02 09:51:22 +02:00
|
|
|
import java.math.BigInteger;
|
2019-02-06 11:48:05 +01:00
|
|
|
import java.nio.file.Files;
|
2020-10-30 10:29:43 +01:00
|
|
|
import java.time.Instant;
|
|
|
|
import java.time.temporal.ChronoUnit;
|
2018-03-05 17:18:45 +01:00
|
|
|
import java.util.*;
|
2018-07-11 15:47:36 +02:00
|
|
|
import java.util.stream.Collectors;
|
2019-04-23 11:01:49 +02:00
|
|
|
import java.util.stream.Stream;
|
2017-12-15 13:25:21 +01:00
|
|
|
|
2019-01-31 16:53:37 +01:00
|
|
|
@Component
|
2017-12-15 13:25:21 +01:00
|
|
|
public class DatasetManager {
|
2020-01-16 16:46:24 +01:00
|
|
|
private static final Logger logger = LoggerFactory.getLogger(DatasetManager.class);
|
2017-12-15 13:25:21 +01:00
|
|
|
|
2020-02-17 11:41:01 +01:00
|
|
|
private final Map<NotificationType, String> notificationPaths = Stream.of(new Object[][] {
|
|
|
|
{NotificationType.DATASET_MODIFIED, "/datasets/edit"},
|
|
|
|
{NotificationType.DATASET_MODIFIED_FINALISED, "/datasets/edit"}
|
|
|
|
}).collect(Collectors.toMap(data -> (NotificationType) data[0], data -> (String) data[1]));
|
|
|
|
|
2019-03-05 16:33:59 +01:00
|
|
|
private ApiContext apiContext;
|
|
|
|
private DatabaseRepository databaseRepository;
|
2023-11-14 12:41:57 +01:00
|
|
|
// private DatasetRepository datasetRepository;
|
2019-03-05 16:33:59 +01:00
|
|
|
private BuilderFactory builderFactory;
|
|
|
|
private UserManager userManager;
|
2020-03-18 17:23:34 +01:00
|
|
|
private ConfigLoader configLoader;
|
2020-03-31 09:08:25 +02:00
|
|
|
private Environment environment;
|
2021-06-29 13:33:57 +02:00
|
|
|
private final MetricsManager metricsManager;
|
2022-03-16 11:14:08 +01:00
|
|
|
private final FileManager fileManager;
|
2023-10-18 17:52:03 +02:00
|
|
|
private final UserScope userScope;
|
|
|
|
private final AuthorizationService authorizationService;
|
2023-11-06 15:17:57 +01:00
|
|
|
private final QueryFactory queryFactory;
|
2019-03-05 17:08:38 +01:00
|
|
|
|
2019-03-05 16:33:59 +01:00
|
|
|
@Autowired
|
2022-03-16 11:14:08 +01:00
|
|
|
public DatasetManager(ApiContext apiContext, UserManager userManager, ConfigLoader configLoader, Environment environment, MetricsManager metricsManager,
|
2023-11-06 15:17:57 +01:00
|
|
|
FileManager fileManager, UserScope userScope, AuthorizationService authorizationService, QueryFactory queryFactory) {
|
2019-03-05 16:33:59 +01:00
|
|
|
this.apiContext = apiContext;
|
|
|
|
this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository();
|
2023-11-14 12:41:57 +01:00
|
|
|
// this.datasetRepository = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository();
|
2019-03-05 16:33:59 +01:00
|
|
|
this.builderFactory = apiContext.getOperationsContext().getBuilderFactory();
|
|
|
|
this.userManager = userManager;
|
2020-03-18 17:23:34 +01:00
|
|
|
this.configLoader = configLoader;
|
2020-03-31 09:08:25 +02:00
|
|
|
this.environment = environment;
|
2021-06-29 13:33:57 +02:00
|
|
|
this.metricsManager = metricsManager;
|
2022-03-16 11:14:08 +01:00
|
|
|
this.fileManager = fileManager;
|
2023-10-18 17:52:03 +02:00
|
|
|
this.userScope = userScope;
|
|
|
|
this.authorizationService = authorizationService;
|
2023-11-06 15:17:57 +01:00
|
|
|
this.queryFactory = queryFactory;
|
2019-03-05 16:33:59 +01:00
|
|
|
}
|
|
|
|
|
2023-10-18 17:52:03 +02:00
|
|
|
public DataTableData<DatasetListingModel> getPaged(DatasetTableRequest datasetTableRequest) throws Exception {
|
2023-11-14 12:41:57 +01:00
|
|
|
//TODO
|
|
|
|
// DatasetCriteria datasetCriteria = new DatasetCriteria();
|
|
|
|
// datasetCriteria.setLike(datasetTableRequest.getCriteria().getLike());
|
|
|
|
// datasetCriteria.setDatasetTemplates(datasetTableRequest.getCriteria().getDatasetTemplates());
|
|
|
|
// if (datasetTableRequest.getCriteria().getStatus() != null) {
|
|
|
|
// datasetCriteria.setStatus(datasetTableRequest.getCriteria().getStatus().shortValue());
|
|
|
|
// }
|
|
|
|
// datasetCriteria.setDmps(datasetTableRequest.getCriteria().getDmpIds());
|
|
|
|
// datasetCriteria.setGroupIds(datasetTableRequest.getCriteria().getGroupIds());
|
|
|
|
// datasetCriteria.setGrants(datasetTableRequest.getCriteria().getGrants());
|
|
|
|
// datasetCriteria.setCollaborators(datasetTableRequest.getCriteria().getCollaborators());
|
|
|
|
// datasetCriteria.setAllowAllVersions(datasetTableRequest.getCriteria().getAllVersions());
|
|
|
|
// datasetCriteria.setOrganiztions(datasetTableRequest.getCriteria().getOrganisations());
|
|
|
|
// datasetCriteria.setTags(datasetTableRequest.getCriteria().getTags());
|
|
|
|
// if (datasetTableRequest.getCriteria().getIsPublic() != null) {
|
|
|
|
// datasetCriteria.setPublic(datasetTableRequest.getCriteria().getIsPublic());
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// if (!datasetCriteria.isPublic()) {
|
|
|
|
// if (datasetCriteria.getCollaborators() == null) {
|
|
|
|
// datasetCriteria.setSortCriteria(new ArrayList<>());
|
|
|
|
// }
|
|
|
|
// datasetCriteria.getCollaborators().add(this.userScope.getUserId());
|
|
|
|
// }
|
|
|
|
// if (datasetTableRequest.getCriteria().getGrantStatus() != null) {
|
|
|
|
// datasetCriteria.setGrantStatus(datasetTableRequest.getCriteria().getGrantStatus());
|
|
|
|
// }
|
|
|
|
// if (datasetTableRequest.getOrderings() != null) {
|
|
|
|
// datasetCriteria.setSortCriteria(DmpCriteriaMapper.toElasticSorting(datasetTableRequest.getOrderings()));
|
|
|
|
// }
|
|
|
|
// datasetCriteria.setOffset(datasetTableRequest.getOffset());
|
|
|
|
// datasetCriteria.setSize(datasetTableRequest.getLength());
|
|
|
|
// List<eu.eudat.elastic.entities.Dataset> datasets;
|
|
|
|
// try {
|
|
|
|
// datasets = datasetRepository.exists() ?
|
|
|
|
// datasetRepository.queryIds(datasetCriteria) : null;
|
|
|
|
// } catch (Exception ex) {
|
|
|
|
// logger.warn(ex.getMessage(), ex);
|
|
|
|
// datasets = null;
|
|
|
|
// }
|
2018-07-11 15:47:36 +02:00
|
|
|
|
2023-11-17 18:01:44 +01:00
|
|
|
UserEntity userInfo = builderFactory.getBuilder(UserInfoBuilder.class).id(this.userScope.getUserIdSafe()).build();
|
2023-11-06 15:17:57 +01:00
|
|
|
// QueryableList<eu.eudat.data.Dataset> items = databaseRepository.getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class));
|
|
|
|
QueryableList<DescriptionEntity> items;
|
2023-11-14 12:41:57 +01:00
|
|
|
//TODO
|
|
|
|
// if (datasets != null) {
|
|
|
|
//
|
|
|
|
// if (!datasets.isEmpty()) {
|
|
|
|
// //items = databaseRepository.getDatasetDao().asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class));
|
|
|
|
// final List<UUID> datasetIds = datasets.stream().map(datasetE -> UUID.fromString(datasetE.getId())).distinct().collect(Collectors.toList());
|
|
|
|
// items = databaseRepository.getDatasetDao().filterFromElastic(datasetTableRequest.getCriteria(), datasetIds).withHint(HintedModelFactory.getHint(DatasetListingModel.class));//.withFields(Collections.singletonList("id"));
|
|
|
|
// //items.where((builder, root) -> root.get("id").in(datasetIds));
|
|
|
|
// } else {
|
|
|
|
// items = databaseRepository.getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class));//.withFields(Collections.singletonList("id"));
|
|
|
|
// //items.where((builder, root) -> root.get("id").in(new UUID[]{UUID.randomUUID()}));
|
|
|
|
// }
|
|
|
|
// } else {
|
2021-09-30 17:02:53 +02:00
|
|
|
items = databaseRepository.getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class));//.withFields(Collections.singletonList("id"));
|
2023-11-14 12:41:57 +01:00
|
|
|
// }
|
2019-12-19 12:08:20 +01:00
|
|
|
List<Integer> roles = new LinkedList<>();
|
2023-11-06 15:17:57 +01:00
|
|
|
QueryableList<DescriptionEntity> pagedItems;
|
|
|
|
QueryableList<DescriptionEntity> authItems;
|
2020-03-16 17:50:29 +01:00
|
|
|
if (!datasetTableRequest.getCriteria().getIsPublic()) {
|
2023-10-18 17:52:03 +02:00
|
|
|
if (this.userScope.getUserIdSafe() == null) {
|
2020-09-14 17:09:57 +02:00
|
|
|
throw new UnauthorisedException("You are not allowed to access those datasets");
|
2020-03-16 17:50:29 +01:00
|
|
|
}
|
2021-08-04 17:38:49 +02:00
|
|
|
if (datasetTableRequest.getCriteria().getRole() != null) {
|
2020-03-16 17:50:29 +01:00
|
|
|
roles.add(datasetTableRequest.getCriteria().getRole());
|
2021-08-04 17:38:49 +02:00
|
|
|
}
|
2021-11-25 15:45:29 +01:00
|
|
|
authItems = databaseRepository.getDatasetDao().getAuthenticated(items, userInfo, roles).distinct();
|
2020-03-16 17:50:29 +01:00
|
|
|
pagedItems = PaginationManager.applyPaging(authItems, datasetTableRequest);
|
|
|
|
} else {
|
2023-10-18 17:52:03 +02:00
|
|
|
if (this.userScope.getUserIdSafe() != null && datasetTableRequest.getCriteria().getRole() != null) {
|
2020-03-16 17:50:29 +01:00
|
|
|
items.where((builder, root) -> {
|
|
|
|
Join userJoin = root.join("dmp", JoinType.LEFT).join("users", JoinType.LEFT);
|
2023-10-18 17:52:03 +02:00
|
|
|
return builder.and(builder.equal(userJoin.join("user", JoinType.LEFT).get("id"), this.userScope.getUserId()), builder.equal(userJoin.get("role"), datasetTableRequest.getCriteria().getRole()));
|
2020-03-16 17:50:29 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
String[] strings = new String[1];
|
2020-07-31 12:33:32 +02:00
|
|
|
//strings[0] = "-dmp:publishedAt|join|";
|
2020-07-31 12:34:01 +02:00
|
|
|
//datasetTableRequest.getOrderings().setFields(strings);
|
2020-03-16 17:50:29 +01:00
|
|
|
authItems = items;
|
|
|
|
pagedItems = PaginationManager.applyPaging(items, datasetTableRequest);
|
|
|
|
}
|
2020-03-09 15:47:32 +01:00
|
|
|
DataTableData<DatasetListingModel> dataTable = new DataTableData<>();
|
2018-02-07 10:56:30 +01:00
|
|
|
|
2018-03-19 13:40:04 +01:00
|
|
|
|
2021-11-25 15:45:29 +01:00
|
|
|
dataTable.setData(pagedItems.select(this::mapModel).stream().filter(Objects::nonNull).collect(Collectors.toList()));
|
2021-09-30 17:02:53 +02:00
|
|
|
|
2021-11-25 15:45:29 +01:00
|
|
|
dataTable.setTotalCount(authItems.count());
|
2021-09-30 17:02:53 +02:00
|
|
|
|
2020-07-21 16:30:12 +02:00
|
|
|
//CompletableFuture.allOf(itemsFuture, countFuture).join();
|
2017-12-15 13:25:21 +01:00
|
|
|
return dataTable;
|
|
|
|
}
|
|
|
|
|
2023-10-18 17:52:03 +02:00
|
|
|
public DataTableData<DatasetListingModel> getPaged(DatasetPublicTableRequest datasetTableRequest) throws Exception {
|
2023-11-14 12:41:57 +01:00
|
|
|
Long count = 0L;
|
|
|
|
//TODO
|
|
|
|
// DatasetCriteria datasetCriteria = new DatasetCriteria();
|
|
|
|
// datasetCriteria.setLike(datasetTableRequest.getCriteria().getLike());
|
|
|
|
// datasetCriteria.setDatasetTemplates(datasetTableRequest.getCriteria().getDatasetProfile());
|
|
|
|
// datasetCriteria.setDmps(datasetTableRequest.getCriteria().getDmpIds());
|
|
|
|
// datasetCriteria.setGrants(datasetTableRequest.getCriteria().getGrants());
|
|
|
|
// if (datasetTableRequest.getOrderings() != null) {
|
|
|
|
// datasetCriteria.setSortCriteria(DmpCriteriaMapper.toElasticSorting(datasetTableRequest.getOrderings()));
|
|
|
|
// }
|
|
|
|
// datasetCriteria.setOffset(datasetTableRequest.getOffset());
|
|
|
|
// datasetCriteria.setSize(datasetTableRequest.getLength());
|
|
|
|
// List<eu.eudat.elastic.entities.Dataset> datasets;
|
|
|
|
// try {
|
|
|
|
// datasets = datasetRepository.exists() ?
|
|
|
|
// datasetRepository.queryIds(datasetCriteria) : new LinkedList<>();
|
|
|
|
// count = datasetRepository.exists() ? datasetRepository.count(datasetCriteria) : 0L;
|
|
|
|
// } catch (Exception ex) {
|
|
|
|
// logger.warn(ex.getMessage());
|
|
|
|
// datasets = null;
|
|
|
|
// }
|
2021-06-29 10:45:20 +02:00
|
|
|
/*datasetTableRequest.setQuery(databaseRepository.getDatasetDao().asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class)));
|
|
|
|
QueryableList<Dataset> items = datasetTableRequest.applyCriteria();*/
|
2023-11-06 15:17:57 +01:00
|
|
|
QueryableList<DescriptionEntity> items;
|
2023-11-14 12:41:57 +01:00
|
|
|
//TODO
|
|
|
|
// if (datasets != null) {
|
|
|
|
// if (!datasets.isEmpty()) {
|
|
|
|
// items = databaseRepository.getDatasetDao().asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class));
|
|
|
|
// List<eu.eudat.elastic.entities.Dataset> finalDatasets = datasets;
|
|
|
|
// items.where((builder, root) -> root.get("id").in(finalDatasets.stream().map(x -> UUID.fromString(x.getId())).collect(Collectors.toList())));
|
|
|
|
// } else
|
|
|
|
// items = datasetTableRequest.applyCriteria();
|
|
|
|
// items.where((builder, root) -> root.get("id").in(new UUID[]{UUID.randomUUID()}));
|
|
|
|
// } else {
|
2020-03-09 15:47:32 +01:00
|
|
|
items = datasetTableRequest.applyCriteria();
|
2023-11-14 12:41:57 +01:00
|
|
|
// }
|
2019-09-26 17:33:41 +02:00
|
|
|
|
2023-10-18 17:52:03 +02:00
|
|
|
if (this.userScope.isSet() && datasetTableRequest.getCriteria().getRole() != null) {
|
2019-09-26 17:33:41 +02:00
|
|
|
items.where((builder, root) -> {
|
|
|
|
Join userJoin = root.join("dmp", JoinType.LEFT).join("users", JoinType.LEFT);
|
2023-10-18 17:52:03 +02:00
|
|
|
return builder.and(builder.equal(userJoin.join("user", JoinType.LEFT).get("id"), this.userScope.getUserId()), builder.equal(userJoin.get("role"), datasetTableRequest.getCriteria().getRole()));
|
2019-09-26 17:33:41 +02:00
|
|
|
});
|
|
|
|
}
|
2021-08-04 17:38:49 +02:00
|
|
|
List<String> strings = new ArrayList<>();
|
|
|
|
strings.add("-dmp:publishedAt|join|");
|
2019-09-24 11:28:13 +02:00
|
|
|
datasetTableRequest.getOrderings().setFields(strings);
|
2021-08-04 17:38:49 +02:00
|
|
|
if (count == 0L) {
|
|
|
|
count = items.count();
|
|
|
|
}
|
2023-11-06 15:17:57 +01:00
|
|
|
QueryableList<DescriptionEntity> pagedItems = PaginationManager.applyPaging(items, datasetTableRequest);
|
2018-10-05 08:56:50 +02:00
|
|
|
DataTableData<DatasetListingModel> dataTable = new DataTableData<>();
|
2018-10-02 16:33:58 +02:00
|
|
|
|
2021-08-04 17:38:49 +02:00
|
|
|
List<DatasetListingModel> datasetListis = pagedItems.
|
|
|
|
select(this::mapModel);
|
2018-10-02 16:33:58 +02:00
|
|
|
|
2021-08-04 17:38:49 +02:00
|
|
|
dataTable.setData(datasetListis.stream().filter(Objects::nonNull).collect(Collectors.toList()));
|
2018-10-02 16:33:58 +02:00
|
|
|
|
2021-08-04 17:38:49 +02:00
|
|
|
dataTable.setTotalCount(count);
|
|
|
|
//CompletableFuture.allOf(countFuture).join();
|
2018-10-02 16:33:58 +02:00
|
|
|
return dataTable;
|
|
|
|
}
|
|
|
|
|
2023-10-18 17:52:03 +02:00
|
|
|
public DatasetWizardModel getSingle(String id) throws InvalidApplicationException {
|
2017-12-22 14:42:47 +01:00
|
|
|
DatasetWizardModel dataset = new DatasetWizardModel();
|
2023-11-06 15:17:57 +01:00
|
|
|
DescriptionEntity descriptionEntityEntity = databaseRepository.getDatasetDao().find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class));
|
2023-11-07 13:53:36 +01:00
|
|
|
;
|
2023-11-16 13:01:39 +01:00
|
|
|
DmpEntity dmp = databaseRepository.getDmpDao().find(this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntityEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDmpId());
|
|
|
|
if (
|
|
|
|
//TODO
|
|
|
|
// dmp.getUsers()
|
|
|
|
// .stream().filter(userInfo -> this.userScope.getUserIdSafe().equals(userInfo.getUser().getId()))
|
|
|
|
// .collect(Collectors.toList()).size() == 0 &&
|
|
|
|
!dmp.getAccessType().equals(DmpAccessType.Public))
|
2020-02-26 12:36:42 +01:00
|
|
|
throw new UnauthorisedException();
|
2023-11-06 15:17:57 +01:00
|
|
|
dataset.setDatasetProfileDefinition(getPagedProfile(dataset, descriptionEntityEntity));
|
|
|
|
dataset.fromDataModel(descriptionEntityEntity);
|
2019-04-22 11:11:21 +02:00
|
|
|
|
2023-07-25 14:04:39 +02:00
|
|
|
// Creates the Criteria to get all version of DescriptionTemplate in question.
|
2019-04-22 11:11:21 +02:00
|
|
|
DatasetProfileCriteria profileCriteria = new DatasetProfileCriteria();
|
2023-11-07 13:53:36 +01:00
|
|
|
UUID profileId = this.queryFactory.query(DescriptionTemplateQuery.class).ids(this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntityEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDescriptionTemplateId()).first().getGroupId();
|
2019-04-22 11:11:21 +02:00
|
|
|
List<UUID> uuidList = new LinkedList<>();
|
|
|
|
uuidList.add(profileId);
|
|
|
|
profileCriteria.setGroupIds(uuidList);
|
|
|
|
profileCriteria.setAllVersions(true);
|
2019-04-23 11:01:49 +02:00
|
|
|
|
2023-10-27 17:46:34 +02:00
|
|
|
List<DescriptionTemplateEntity> profileVersions = databaseRepository.getDatasetProfileDao().getWithCriteria(profileCriteria)
|
2019-04-23 11:01:49 +02:00
|
|
|
.orderBy(((builder, root) -> builder.desc(root.get("version"))))
|
2019-04-22 11:11:21 +02:00
|
|
|
.toList();
|
2023-10-27 17:46:34 +02:00
|
|
|
List<DescriptionTemplateEntity> profileVersionsIncluded = new LinkedList<>();
|
2019-04-22 11:11:21 +02:00
|
|
|
|
2019-04-23 11:01:49 +02:00
|
|
|
// Iterate through the versions and remove those that are not included in the DMP of the dataset in question.
|
2023-10-27 17:46:34 +02:00
|
|
|
for (DescriptionTemplateEntity version : profileVersions) {
|
2019-06-04 16:16:12 +02:00
|
|
|
for (AssociatedProfile p : dataset.getDmp().getProfiles()) {
|
2023-09-13 14:55:38 +02:00
|
|
|
if (version.getId().toString().equals(p.getDescriptionTemplateId().toString())) {
|
2019-04-23 11:01:49 +02:00
|
|
|
profileVersionsIncluded.add(version);
|
2019-04-22 11:11:21 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-04-23 11:01:49 +02:00
|
|
|
// Sort the list with the included Versions.
|
2023-10-27 17:46:34 +02:00
|
|
|
Stream<DescriptionTemplateEntity> sorted = profileVersionsIncluded.stream().sorted(Comparator.comparing(DescriptionTemplateEntity::getVersion).reversed());
|
2019-04-23 11:01:49 +02:00
|
|
|
|
|
|
|
// Make the Stream into List and get the first item.
|
2023-10-27 17:46:34 +02:00
|
|
|
List<DescriptionTemplateEntity> profiles = sorted.collect(Collectors.toList());
|
2020-07-21 15:05:34 +02:00
|
|
|
if (profiles.isEmpty())
|
|
|
|
throw new NoSuchElementException("No profiles found for the specific Dataset");
|
|
|
|
|
2023-10-27 17:46:34 +02:00
|
|
|
DescriptionTemplateEntity profile = profiles.get(0);
|
2019-04-23 11:01:49 +02:00
|
|
|
|
|
|
|
// Check if the dataset is on the latest Version.
|
2023-11-07 13:53:36 +01:00
|
|
|
boolean latestVersion = profile.getVersion().toString().equals(this.queryFactory.query(DescriptionTemplateQuery.class).ids(this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntityEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDescriptionTemplateId()).first().getVersion());
|
2019-04-23 11:01:49 +02:00
|
|
|
dataset.setIsProfileLatestVersion(latestVersion);
|
|
|
|
|
2023-11-14 12:41:57 +01:00
|
|
|
// eu.eudat.elastic.entities.Dataset datasetElastic; //TODO
|
|
|
|
// try {
|
|
|
|
// datasetElastic = datasetRepository.exists() ?
|
|
|
|
// datasetRepository.findDocument(id) : new eu.eudat.elastic.entities.Dataset();
|
|
|
|
// } catch (Exception ex) {
|
|
|
|
// logger.warn(ex.getMessage());
|
|
|
|
// datasetElastic = null;
|
|
|
|
// }
|
|
|
|
// if (datasetElastic != null && datasetElastic.getTags() != null && !datasetElastic.getTags().isEmpty()) {
|
|
|
|
// dataset.setTags(datasetElastic.getTags());
|
|
|
|
// }
|
2020-03-11 10:04:49 +01:00
|
|
|
|
|
|
|
/*if (datasetElastic != null && datasetElastic.getLabel() != null && !datasetElastic.getLabel().isEmpty()) {
|
|
|
|
dataset.setLabel(datasetElastic.getLabel());
|
|
|
|
}*/
|
2018-03-01 10:14:10 +01:00
|
|
|
return dataset;
|
|
|
|
}
|
|
|
|
|
2019-04-01 12:42:46 +02:00
|
|
|
public DatasetWizardModel getSinglePublic(String id) throws Exception {
|
|
|
|
DatasetWizardModel dataset = new DatasetWizardModel();
|
2023-11-06 15:17:57 +01:00
|
|
|
DescriptionEntity descriptionEntityEntity = databaseRepository.getDatasetDao().isPublicDataset(UUID.fromString(id));
|
2023-11-16 13:01:39 +01:00
|
|
|
DmpEntity dmp = databaseRepository.getDmpDao().find(this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntityEntity.getId()).isActive(IsActive.Active).first().getDmpId());
|
|
|
|
if (descriptionEntityEntity != null && descriptionEntityEntity.getStatus() == DescriptionStatus.Finalized && dmp.getStatus().getValue() == 1) {
|
2023-11-06 15:17:57 +01:00
|
|
|
dataset.setDatasetProfileDefinition(getPagedProfile(dataset, descriptionEntityEntity));
|
|
|
|
dataset.fromDataModel(descriptionEntityEntity);
|
2019-04-01 12:42:46 +02:00
|
|
|
return dataset;
|
2019-06-04 16:16:12 +02:00
|
|
|
} else {
|
2019-04-01 12:42:46 +02:00
|
|
|
throw new Exception("Selected dataset is not public");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-18 17:52:03 +02:00
|
|
|
public DatasetOverviewModel getOverviewSingle(String id, boolean isPublic) throws Exception {
|
2023-11-06 15:17:57 +01:00
|
|
|
DescriptionEntity descriptionEntityEntity = databaseRepository.getDatasetDao().find(UUID.fromString(id));
|
|
|
|
if (descriptionEntityEntity.getIsActive() == IsActive.Inactive) {
|
2020-07-03 15:11:54 +02:00
|
|
|
throw new Exception("Dataset is deleted.");
|
|
|
|
}
|
2023-11-16 13:01:39 +01:00
|
|
|
DmpEntity dmp = databaseRepository.getDmpDao().find(this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntityEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDmpId());
|
2023-10-18 17:52:03 +02:00
|
|
|
if (!isPublic && !this.userScope.isSet()) {
|
2020-07-03 15:11:54 +02:00
|
|
|
throw new UnauthorisedException();
|
|
|
|
} else
|
2023-11-16 13:01:39 +01:00
|
|
|
if (!isPublic
|
|
|
|
//TODO
|
|
|
|
// && dmp.getUsers()
|
|
|
|
// .stream().noneMatch(userInfo -> this.userScope.getUserIdSafe().equals(userInfo.getUser().getId()))
|
|
|
|
) {
|
2020-07-03 15:11:54 +02:00
|
|
|
throw new UnauthorisedException();
|
2023-11-16 13:01:39 +01:00
|
|
|
} else if (isPublic && !dmp.getAccessType().equals(DmpAccessType.Public)) {
|
2020-07-03 15:11:54 +02:00
|
|
|
throw new ForbiddenException("Selected Dataset is not public");
|
|
|
|
}
|
|
|
|
DatasetOverviewModel dataset = new DatasetOverviewModel();
|
2023-11-06 15:17:57 +01:00
|
|
|
dataset.fromDataModel(descriptionEntityEntity);
|
2020-07-03 15:11:54 +02:00
|
|
|
|
|
|
|
return dataset;
|
|
|
|
}
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
public DescriptionEntity getEntitySingle(UUID id) throws InvalidApplicationException {
|
2021-05-10 12:40:08 +02:00
|
|
|
return databaseRepository.getDatasetDao().find(id);
|
|
|
|
}
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
public PagedDatasetProfile getPagedProfile(DatasetWizardModel dataset, DescriptionEntity descriptionEntityEntity) {
|
2023-11-07 13:53:36 +01:00
|
|
|
eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = userManager.generateDatasetProfileModel(this.queryFactory.query(DescriptionTemplateQuery.class).ids(this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntityEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDescriptionTemplateId()).first());
|
2023-11-06 15:17:57 +01:00
|
|
|
datasetprofile.setStatus(dataset.getStatus().getValue());
|
|
|
|
if (descriptionEntityEntity.getProperties() != null) {
|
|
|
|
JSONObject jObject = new JSONObject(descriptionEntityEntity.getProperties());
|
2019-10-30 16:13:03 +01:00
|
|
|
Map<String, Object> properties = jObject.toMap();
|
2017-12-22 14:42:47 +01:00
|
|
|
datasetprofile.fromJsonObject(properties);
|
|
|
|
}
|
2018-01-19 10:31:05 +01:00
|
|
|
PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile();
|
|
|
|
pagedDatasetProfile.buildPagedDatasetProfile(datasetprofile);
|
2018-03-01 10:14:10 +01:00
|
|
|
return pagedDatasetProfile;
|
|
|
|
}
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
private XWPFDocument getWordDocument(ConfigLoader configLoader, DescriptionEntity descriptionEntityEntity, VisibilityRuleService visibilityRuleService) throws IOException, InvalidApplicationException {
|
2023-06-21 11:00:20 +02:00
|
|
|
WordBuilder wordBuilder = new WordBuilder(this.environment, configLoader);
|
2018-03-01 10:14:10 +01:00
|
|
|
DatasetWizardModel dataset = new DatasetWizardModel();
|
#7597, #7893, #7895, #7898: Updated DMP template file (h2020.docx) for export | Added Dataset template file (h2020_dataset.docx) for export | Updated indentation on exported docs.
1. h2020.docx, h2020_dataset.docx: Updated DMP template & Added Dataset template.
2. application.properties, application-devel.properties, application-production.properties, application-staging.properties: Added property for dataset template file path configuration.h2020datasettemplate=documents/h2020_dataset.docx
3. ConfigLoader.java: Added method XWPFDocument getDatasetDocument();
4. DefaultConfigLoader.java: Added fiedls and methods for loading Dataset template (h2020_dataset.docx).
5. DataManagementPlanManager.java, DatasetManager.java, , HtmlToWorldBuilder.java, WordBuilder.java: Updated header/footer/first page in exports for DMPs and Datasets | Updated indentation in exports.
2022-07-26 16:00:54 +02:00
|
|
|
XWPFDocument document = configLoader.getDatasetDocument();
|
2020-03-18 17:23:34 +01:00
|
|
|
|
2023-11-16 13:01:39 +01:00
|
|
|
DmpEntity dmpEntity = databaseRepository.getDmpDao().find(this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntityEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDmpId());
|
|
|
|
if (!dmpEntity.getAccessType().equals(DmpAccessType.Public)
|
|
|
|
//TODO
|
|
|
|
// && dmpEntity.getUsers().stream().filter(userInfo -> this.userScope.getUserIdSafe().equals(userInfo.getUser().getId())).collect(Collectors.toList()).size() == 0
|
|
|
|
)
|
#7597, #7893, #7895, #7898: Updated DMP template file (h2020.docx) for export | Added Dataset template file (h2020_dataset.docx) for export | Updated indentation on exported docs.
1. h2020.docx, h2020_dataset.docx: Updated DMP template & Added Dataset template.
2. application.properties, application-devel.properties, application-production.properties, application-staging.properties: Added property for dataset template file path configuration.h2020datasettemplate=documents/h2020_dataset.docx
3. ConfigLoader.java: Added method XWPFDocument getDatasetDocument();
4. DefaultConfigLoader.java: Added fiedls and methods for loading Dataset template (h2020_dataset.docx).
5. DataManagementPlanManager.java, DatasetManager.java, , HtmlToWorldBuilder.java, WordBuilder.java: Updated header/footer/first page in exports for DMPs and Datasets | Updated indentation in exports.
2022-07-26 16:00:54 +02:00
|
|
|
throw new UnauthorisedException();
|
2019-10-31 10:16:29 +01:00
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
wordBuilder.fillFirstPage(dmpEntity, descriptionEntityEntity, document, true);
|
|
|
|
wordBuilder.fillFooter(dmpEntity, descriptionEntityEntity, document, true);
|
2019-10-31 10:16:29 +01:00
|
|
|
|
#7597, #7893, #7895, #7898: Updated DMP template file (h2020.docx) for export | Added Dataset template file (h2020_dataset.docx) for export | Updated indentation on exported docs.
1. h2020.docx, h2020_dataset.docx: Updated DMP template & Added Dataset template.
2. application.properties, application-devel.properties, application-production.properties, application-staging.properties: Added property for dataset template file path configuration.h2020datasettemplate=documents/h2020_dataset.docx
3. ConfigLoader.java: Added method XWPFDocument getDatasetDocument();
4. DefaultConfigLoader.java: Added fiedls and methods for loading Dataset template (h2020_dataset.docx).
5. DataManagementPlanManager.java, DatasetManager.java, , HtmlToWorldBuilder.java, WordBuilder.java: Updated header/footer/first page in exports for DMPs and Datasets | Updated indentation in exports.
2022-07-26 16:00:54 +02:00
|
|
|
int powered_pos = wordBuilder.findPosOfPoweredBy(document);
|
|
|
|
XWPFParagraph powered_par = null;
|
|
|
|
XWPFParagraph argos_img_par = null;
|
|
|
|
if(powered_pos != -1) {
|
|
|
|
powered_par = document.getParagraphArray(powered_pos);
|
|
|
|
argos_img_par = document.getParagraphArray(powered_pos + 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
// wordBuilder.addParagraphContent(datasetEntity.getLabel(), document, ParagraphStyle.HEADER1, BigInteger.ZERO);
|
|
|
|
|
|
|
|
// Space below Dataset title.
|
|
|
|
// XWPFParagraph parBreakDataset = document.createParagraph();
|
|
|
|
//
|
|
|
|
// XWPFParagraph datasetTemplateParagraph = document.createParagraph();
|
|
|
|
// datasetTemplateParagraph.setStyle("Heading2");
|
|
|
|
// 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);
|
|
|
|
//
|
|
|
|
// wordBuilder.addParagraphContent(datasetEntity.getDescription(), document, ParagraphStyle.HTML, BigInteger.ZERO);
|
2022-02-22 15:39:35 +01:00
|
|
|
|
2021-04-08 15:48:14 +02:00
|
|
|
/*XWPFParagraph externalReferencesParagraph = document.createParagraph();
|
2019-10-31 10:16:29 +01:00
|
|
|
externalReferencesParagraph.setStyle("Heading2");
|
|
|
|
XWPFRun externalReferencesRun = externalReferencesParagraph.createRun();
|
|
|
|
externalReferencesRun.setText("External References");
|
|
|
|
externalReferencesRun.setColor("2E75B6");
|
|
|
|
externalReferencesRun.setBold(true);
|
|
|
|
externalReferencesRun.setFontSize(12);
|
|
|
|
|
|
|
|
wordBuilder.addParagraphContent("Data Repositories", document, ParagraphStyle.HEADER3, 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.HEADER3, 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.HEADER3, 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.HEADER3, 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);
|
2021-04-08 15:48:14 +02:00
|
|
|
}*/
|
2019-10-31 10:16:29 +01:00
|
|
|
/*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);
|
|
|
|
}*/
|
|
|
|
|
2018-03-05 17:18:45 +01:00
|
|
|
Map<String, Object> properties = new HashMap<>();
|
2023-11-06 15:17:57 +01:00
|
|
|
if (descriptionEntityEntity.getProperties() != null) {
|
|
|
|
JSONObject jObject = new JSONObject(descriptionEntityEntity.getProperties());
|
2019-10-30 16:13:03 +01:00
|
|
|
properties = jObject.toMap();
|
2018-03-05 17:18:45 +01:00
|
|
|
}
|
2019-10-31 10:16:29 +01:00
|
|
|
|
#7597, #7893, #7895, #7898: Updated DMP template file (h2020.docx) for export | Added Dataset template file (h2020_dataset.docx) for export | Updated indentation on exported docs.
1. h2020.docx, h2020_dataset.docx: Updated DMP template & Added Dataset template.
2. application.properties, application-devel.properties, application-production.properties, application-staging.properties: Added property for dataset template file path configuration.h2020datasettemplate=documents/h2020_dataset.docx
3. ConfigLoader.java: Added method XWPFDocument getDatasetDocument();
4. DefaultConfigLoader.java: Added fiedls and methods for loading Dataset template (h2020_dataset.docx).
5. DataManagementPlanManager.java, DatasetManager.java, , HtmlToWorldBuilder.java, WordBuilder.java: Updated header/footer/first page in exports for DMPs and Datasets | Updated indentation in exports.
2022-07-26 16:00:54 +02:00
|
|
|
// wordBuilder.addParagraphContent("Dataset Description", document, ParagraphStyle.HEADER2, BigInteger.ZERO);
|
2023-11-06 15:17:57 +01:00
|
|
|
PagedDatasetProfile pagedDatasetProfile = getPagedProfile(dataset, descriptionEntityEntity);
|
2018-03-05 17:18:45 +01:00
|
|
|
visibilityRuleService.setProperties(properties);
|
|
|
|
visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules());
|
2018-10-18 11:33:13 +02:00
|
|
|
wordBuilder.build(document, pagedDatasetProfile, visibilityRuleService);
|
2023-11-06 15:17:57 +01:00
|
|
|
String label = descriptionEntityEntity.getLabel().replaceAll("[^a-zA-Z0-9+ ]", "");
|
2020-04-02 16:22:41 +02:00
|
|
|
// File exportFile = new File(label + ".docx");
|
2019-10-30 17:21:04 +01:00
|
|
|
|
|
|
|
// Removes the top empty headings.
|
#7597, #7893, #7895, #7898: Updated DMP template file (h2020.docx) for export | Added Dataset template file (h2020_dataset.docx) for export | Updated indentation on exported docs.
1. h2020.docx, h2020_dataset.docx: Updated DMP template & Added Dataset template.
2. application.properties, application-devel.properties, application-production.properties, application-staging.properties: Added property for dataset template file path configuration.h2020datasettemplate=documents/h2020_dataset.docx
3. ConfigLoader.java: Added method XWPFDocument getDatasetDocument();
4. DefaultConfigLoader.java: Added fiedls and methods for loading Dataset template (h2020_dataset.docx).
5. DataManagementPlanManager.java, DatasetManager.java, , HtmlToWorldBuilder.java, WordBuilder.java: Updated header/footer/first page in exports for DMPs and Datasets | Updated indentation in exports.
2022-07-26 16:00:54 +02:00
|
|
|
// for (int i = 0; i < 6; i++) {
|
|
|
|
// document.removeBodyElement(0);
|
|
|
|
// }
|
|
|
|
|
|
|
|
if(powered_pos != -1) {
|
|
|
|
document.getLastParagraph().setPageBreak(false);
|
|
|
|
document.createParagraph();
|
|
|
|
document.setParagraph(powered_par, document.getParagraphs().size() - 1);
|
|
|
|
|
|
|
|
document.createParagraph();
|
|
|
|
document.setParagraph(argos_img_par, document.getParagraphs().size() - 1);
|
|
|
|
|
|
|
|
document.removeBodyElement(powered_pos + 1);
|
|
|
|
document.removeBodyElement(powered_pos + 1);
|
2019-10-31 10:16:29 +01:00
|
|
|
}
|
2019-10-30 17:21:04 +01:00
|
|
|
|
2020-03-18 17:23:34 +01:00
|
|
|
return document;
|
|
|
|
//FileOutputStream out = new FileOutputStream(exportFile);
|
|
|
|
// document.write(out);
|
|
|
|
// out.close();
|
|
|
|
// return exportFile;
|
|
|
|
}
|
|
|
|
|
2020-03-27 15:50:20 +01:00
|
|
|
private XWPFDocument getLightWordDocument(ConfigLoader configLoader, DatasetWizardModel dataset, VisibilityRuleService visibilityRuleService) throws IOException {
|
2023-06-21 11:00:20 +02:00
|
|
|
WordBuilder wordBuilder = new WordBuilder(this.environment, configLoader);
|
2020-03-18 17:23:34 +01:00
|
|
|
XWPFDocument document = configLoader.getDocument();
|
|
|
|
|
|
|
|
// Space below Dataset title.
|
|
|
|
XWPFParagraph parBreakDataset = document.createParagraph();
|
|
|
|
|
|
|
|
Map<String, Object> properties = new HashMap<>();
|
|
|
|
if (dataset.getDatasetProfileDefinition() != null) {
|
|
|
|
JSONObject jObject = new JSONObject(propertiesModelToString(dataset.getDatasetProfileDefinition()));
|
|
|
|
properties = jObject.toMap();
|
|
|
|
}
|
|
|
|
|
#7597, #7893, #7895, #7898: Updated DMP template file (h2020.docx) for export | Added Dataset template file (h2020_dataset.docx) for export | Updated indentation on exported docs.
1. h2020.docx, h2020_dataset.docx: Updated DMP template & Added Dataset template.
2. application.properties, application-devel.properties, application-production.properties, application-staging.properties: Added property for dataset template file path configuration.h2020datasettemplate=documents/h2020_dataset.docx
3. ConfigLoader.java: Added method XWPFDocument getDatasetDocument();
4. DefaultConfigLoader.java: Added fiedls and methods for loading Dataset template (h2020_dataset.docx).
5. DataManagementPlanManager.java, DatasetManager.java, , HtmlToWorldBuilder.java, WordBuilder.java: Updated header/footer/first page in exports for DMPs and Datasets | Updated indentation in exports.
2022-07-26 16:00:54 +02:00
|
|
|
wordBuilder.addParagraphContent("Dataset Description", document, ParagraphStyle.HEADER2, BigInteger.ZERO, 0);
|
2020-03-18 17:23:34 +01:00
|
|
|
visibilityRuleService.setProperties(properties);
|
|
|
|
visibilityRuleService.buildVisibilityContext(dataset.getDatasetProfileDefinition().getRules());
|
|
|
|
wordBuilder.build(document, dataset.getDatasetProfileDefinition(), visibilityRuleService);
|
|
|
|
|
|
|
|
// Removes the top empty headings.
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
|
|
document.removeBodyElement(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
return document;
|
|
|
|
//FileOutputStream out = new FileOutputStream(exportFile);
|
|
|
|
// document.write(out);
|
|
|
|
// out.close();
|
|
|
|
// return exportFile;
|
|
|
|
}
|
|
|
|
|
2023-10-18 17:52:03 +02:00
|
|
|
public FileEnvelope getWordDocumentFile(ConfigLoader configLoader, String id, VisibilityRuleService visibilityRuleService) throws IOException, InvalidApplicationException {
|
2023-11-06 15:17:57 +01:00
|
|
|
DescriptionEntity descriptionEntityEntity = databaseRepository.getDatasetDao().find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class));
|
2023-11-16 13:01:39 +01:00
|
|
|
DmpEntity dmp = databaseRepository.getDmpDao().find(this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntityEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDmpId());
|
|
|
|
if (!dmp.getAccessType().equals(DmpAccessType.Public)
|
|
|
|
//TODO
|
|
|
|
// && dmp.getUsers()
|
|
|
|
// .stream().filter(userInfo -> this.userScope.getUserIdSafe().equals(userInfo.getUser().getId()))
|
|
|
|
// .collect(Collectors.toList()).size() == 0
|
|
|
|
)
|
2020-03-18 17:23:34 +01:00
|
|
|
throw new UnauthorisedException();
|
2023-11-06 15:17:57 +01:00
|
|
|
String label = descriptionEntityEntity.getLabel().replaceAll("[^a-zA-Z0-9+ ]", "");
|
2020-04-02 16:22:41 +02:00
|
|
|
FileEnvelope exportEnvelope = new FileEnvelope();
|
|
|
|
exportEnvelope.setFilename(label + ".docx");
|
|
|
|
String uuid = UUID.randomUUID().toString();
|
|
|
|
File exportFile = new File(this.environment.getProperty("temp.temp") + uuid + ".docx");
|
2023-11-06 15:17:57 +01:00
|
|
|
XWPFDocument document = getWordDocument(configLoader, descriptionEntityEntity, visibilityRuleService);
|
2018-10-18 11:33:13 +02:00
|
|
|
FileOutputStream out = new FileOutputStream(exportFile);
|
2020-03-18 17:23:34 +01:00
|
|
|
document.write(out);
|
|
|
|
out.close();
|
2020-04-02 16:22:41 +02:00
|
|
|
exportEnvelope.setFile(exportFile);
|
|
|
|
return exportEnvelope;
|
2020-03-18 17:23:34 +01:00
|
|
|
}
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
public String getWordDocumentText (DescriptionEntity descriptionEntityEntity) throws Exception {
|
|
|
|
DatasetWizardModel datasetWizardModel = new DatasetWizardModel().fromDataModel(descriptionEntityEntity);
|
|
|
|
datasetWizardModel.setDatasetProfileDefinition(this.getPagedProfile(datasetWizardModel, descriptionEntityEntity));
|
2022-02-09 14:23:16 +01:00
|
|
|
XWPFDocument document = getLightWordDocument(this.configLoader, datasetWizardModel, new VisibilityRuleServiceImpl());
|
2020-03-18 17:23:34 +01:00
|
|
|
XWPFWordExtractor extractor = new XWPFWordExtractor(document);
|
|
|
|
return extractor.getText();/*.replaceAll("\n\\s*", " ");*/
|
2018-03-05 17:18:45 +01:00
|
|
|
}
|
|
|
|
|
2023-10-18 17:52:03 +02:00
|
|
|
public FileEnvelope getXmlDocument(String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException, InvalidApplicationException {
|
2018-03-06 15:58:38 +01:00
|
|
|
ExportXmlBuilder xmlBuilder = new ExportXmlBuilder();
|
|
|
|
DatasetWizardModel dataset = new DatasetWizardModel();
|
2023-11-06 15:17:57 +01:00
|
|
|
DescriptionEntity descriptionEntityEntity = databaseRepository.getDatasetDao().find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class));
|
2023-11-16 13:01:39 +01:00
|
|
|
DmpEntity dmp = databaseRepository.getDmpDao().find(this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntityEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDmpId());
|
|
|
|
if (!dmp.getAccessType().equals(DmpAccessType.Public)
|
|
|
|
//TODO
|
|
|
|
// && dmp.getUsers()
|
|
|
|
// .stream().filter(userInfo -> this.userScope.getUserIdSafe().equals(userInfo.getUser().getId()))
|
|
|
|
// .collect(Collectors.toList()).size() == 0
|
|
|
|
)
|
2020-02-26 12:36:42 +01:00
|
|
|
throw new UnauthorisedException();
|
2018-03-06 15:58:38 +01:00
|
|
|
Map<String, Object> properties = new HashMap<>();
|
2023-11-06 15:17:57 +01:00
|
|
|
if (descriptionEntityEntity.getProperties() != null) {
|
|
|
|
JSONObject jobject = new JSONObject(descriptionEntityEntity.getProperties());
|
2018-03-06 15:58:38 +01:00
|
|
|
properties = jobject.toMap();
|
|
|
|
}
|
2023-11-06 15:17:57 +01:00
|
|
|
PagedDatasetProfile pagedDatasetProfile = getPagedProfile(dataset, descriptionEntityEntity);
|
2018-03-06 15:58:38 +01:00
|
|
|
visibilityRuleService.setProperties(properties);
|
|
|
|
visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules());
|
2023-11-07 13:53:36 +01:00
|
|
|
File file = xmlBuilder.build(pagedDatasetProfile, this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntityEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDescriptionTemplateId(), visibilityRuleService, environment);
|
2018-03-06 15:58:38 +01:00
|
|
|
FileEnvelope fileEnvelope = new FileEnvelope();
|
|
|
|
fileEnvelope.setFile(file);
|
2023-11-06 15:17:57 +01:00
|
|
|
String label = descriptionEntityEntity.getLabel().replaceAll("[^a-zA-Z0-9+ ]", "");
|
2020-04-02 16:22:41 +02:00
|
|
|
fileEnvelope.setFilename(label);
|
2018-03-06 15:58:38 +01:00
|
|
|
return fileEnvelope;
|
|
|
|
}
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
public DescriptionEntity createOrUpdate(DatasetWizardModel datasetWizardModel) throws Exception {
|
2020-02-14 17:40:34 +01:00
|
|
|
Boolean sendNotification = false;
|
2023-11-06 15:17:57 +01:00
|
|
|
DescriptionEntity tempDescriptionEntity = null;
|
2023-11-16 13:01:39 +01:00
|
|
|
DmpEntity dmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(datasetWizardModel.getDmp().getId());
|
2020-02-11 17:29:40 +01:00
|
|
|
if (datasetWizardModel.getId() != null) {
|
2023-11-06 15:17:57 +01:00
|
|
|
tempDescriptionEntity = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().find(datasetWizardModel.getId());
|
|
|
|
if (tempDescriptionEntity != null) {
|
2020-10-30 10:29:43 +01:00
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
Instant dbTime = tempDescriptionEntity.getCreatedAt().truncatedTo(ChronoUnit.SECONDS);
|
|
|
|
Instant modelTime = datasetWizardModel.getModified().truncatedTo(ChronoUnit.SECONDS);
|
2020-10-30 10:29:43 +01:00
|
|
|
if (modelTime.toEpochMilli() != dbTime.toEpochMilli()) {
|
2020-02-11 17:29:40 +01:00
|
|
|
throw new Exception("Dataset has been modified already by another user.");
|
|
|
|
}
|
2020-02-14 17:40:34 +01:00
|
|
|
sendNotification = true;
|
2020-02-10 17:21:06 +01:00
|
|
|
}
|
2021-04-09 18:05:04 +02:00
|
|
|
} else {
|
2021-10-08 15:04:52 +02:00
|
|
|
metricsManager.increaseValue(MetricNames.DATASET, 1, MetricNames.DRAFT);
|
2020-02-10 17:21:06 +01:00
|
|
|
}
|
2023-11-16 13:01:39 +01:00
|
|
|
if (dmp.getStatus().equals(DmpStatus.Finalized) && datasetWizardModel.getId() != null)
|
2019-06-27 10:48:39 +02:00
|
|
|
throw new Exception("DMP is finalized, therefore Dataset cannot be edited.");
|
2023-11-06 15:17:57 +01:00
|
|
|
DescriptionEntity descriptionEntity = datasetWizardModel.toDataModel();
|
2023-11-07 13:53:36 +01:00
|
|
|
// descriptionEntity.setDmpId(dmp.getId()); //TODO
|
2023-11-06 15:17:57 +01:00
|
|
|
descriptionEntity.setProperties(propertiesModelToString(datasetWizardModel.getDatasetProfileDefinition()));
|
2023-11-14 12:41:57 +01:00
|
|
|
// if (this.apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().getClient() != null) {
|
|
|
|
// this.getTagsFromProfile(datasetWizardModel, descriptionEntity);
|
|
|
|
// } //TODO
|
2023-11-06 15:17:57 +01:00
|
|
|
if (datasetWizardModel.getStatus() == DescriptionStatus.Finalized) {
|
|
|
|
String failedField = checkDatasetValidation(descriptionEntity);
|
2022-03-29 14:11:55 +02:00
|
|
|
if (failedField != null) {
|
|
|
|
throw new Exception("Field value of " + failedField + " must be filled.");
|
|
|
|
}
|
|
|
|
}
|
2023-11-17 18:01:44 +01:00
|
|
|
UserEntity userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(this.userScope.getUserId()).build();
|
2023-11-07 11:36:36 +01:00
|
|
|
descriptionEntity.setDmpDescriptionTemplateId(userInfo.getId());
|
2023-11-06 15:17:57 +01:00
|
|
|
|
|
|
|
createDataRepositoriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao(), descriptionEntity);
|
|
|
|
createExternalDatasetsIfTheyDontExist(descriptionEntity);
|
|
|
|
createRegistriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao(), descriptionEntity);
|
|
|
|
createServicesIfTheyDontExist(descriptionEntity);
|
|
|
|
DescriptionEntity descriptionEntity1 = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(descriptionEntity);
|
|
|
|
datasetWizardModel.setId(descriptionEntity1.getId());
|
2020-03-17 15:40:10 +01:00
|
|
|
if (datasetWizardModel.getDmp().getGrant() == null) {
|
2023-11-16 13:01:39 +01:00
|
|
|
DmpEntity dmp1 = databaseRepository.getDmpDao().find(this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntity1.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDmpId());
|
2023-11-06 15:17:57 +01:00
|
|
|
|
|
|
|
datasetWizardModel.setDmp(new DataManagementPlan().fromDataModelNoDatasets(dmp1));
|
2020-03-16 17:50:29 +01:00
|
|
|
}
|
2023-11-07 13:53:36 +01:00
|
|
|
// descriptionEntity1.setDescriptionTemplateId(datasetWizardModel.getProfile().getId()); //TODO
|
2020-04-01 17:16:06 +02:00
|
|
|
// datasetWizardModel.setDatasetProfileDefinition(getPagedProfile(datasetWizardModel, dataset1));
|
2023-11-07 13:53:36 +01:00
|
|
|
UUID dmpId = this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntity1.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDmpId();
|
2023-11-16 13:01:39 +01:00
|
|
|
DmpEntity dmp1 = databaseRepository.getDmpDao().find(dmpId);
|
|
|
|
// dmp1.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList()));//TODO
|
2023-11-14 12:41:57 +01:00
|
|
|
//updateTags(descriptionEntity1, datasetWizardModel.getTags()); //TODO
|
2020-02-14 17:40:34 +01:00
|
|
|
if (sendNotification) {
|
2023-11-06 15:17:57 +01:00
|
|
|
if (descriptionEntity1.getStatus() != DescriptionStatus.Finalized) {
|
|
|
|
this.sendNotification(descriptionEntity1, dmp1, userInfo, NotificationType.DATASET_MODIFIED);
|
2020-02-17 11:41:01 +01:00
|
|
|
} else {
|
2023-11-06 15:17:57 +01:00
|
|
|
this.sendNotification(descriptionEntity1, dmp1, userInfo, NotificationType.DATASET_MODIFIED_FINALISED);
|
2020-02-17 11:41:01 +01:00
|
|
|
}
|
2020-02-14 17:40:34 +01:00
|
|
|
}
|
2022-03-16 11:14:08 +01:00
|
|
|
|
|
|
|
this.deleteOldFilesAndAddNew(datasetWizardModel, userInfo);
|
|
|
|
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
return descriptionEntity1;
|
2017-12-21 11:38:18 +01:00
|
|
|
}
|
|
|
|
|
2023-11-17 18:01:44 +01:00
|
|
|
private void deleteOldFilesAndAddNew(DatasetWizardModel datasetWizardModel, UserEntity userInfo) throws JsonProcessingException, InvalidApplicationException {
|
2022-03-16 11:14:08 +01:00
|
|
|
// Files in DB for this entityId which are NOT DELETED
|
|
|
|
List<FileUpload> fileUploads = fileManager.getCurrentFileUploadsForEntityId(datasetWizardModel.getId());
|
|
|
|
List<String> fileUploadIds = fileUploads.stream().map(fileUpload -> fileUpload.getId().toString()).collect(Collectors.toList());
|
|
|
|
|
|
|
|
ObjectMapper mapper = new ObjectMapper();
|
|
|
|
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
|
2023-10-31 10:19:52 +01:00
|
|
|
String json = mapper.writeValueAsString(datasetWizardModel.getDatasetProfileDefinition());
|
2022-03-16 11:14:08 +01:00
|
|
|
JsonNode propertiesJson = mapper.readTree(json);
|
|
|
|
|
|
|
|
Set<JsonNode> uploadNodes = new HashSet<>();
|
|
|
|
uploadNodes.addAll(JsonSearcher.findNodes(propertiesJson, "renderStyle", "upload", true));
|
|
|
|
|
|
|
|
uploadNodes.forEach(node -> {
|
|
|
|
JsonNode value = node.get("value");
|
|
|
|
if (value != null && !value.toString().equals("\"\"") && !value.toString().equals("null")) {
|
|
|
|
String stringValue = value.toString().replaceAll("=", ":");
|
|
|
|
JSONObject values = new JSONObject(stringValue);
|
|
|
|
Map<String, Object> data = ((JSONObject) values).toMap();
|
|
|
|
|
|
|
|
int index = fileUploadIds.indexOf(data.get("id").toString());
|
|
|
|
if(index != -1) {
|
|
|
|
// file in DB is the same as file in the Dataset
|
|
|
|
fileUploadIds.remove(index);
|
|
|
|
fileUploads.remove(index);
|
|
|
|
} else {
|
|
|
|
// new file
|
|
|
|
this.fileManager.createFile(data.get("id").toString(), data.get("name").toString(), data.get("type").toString(), datasetWizardModel.getId().toString(), FileUpload.EntityType.DATASET, userInfo);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// old files in DB that are not contained anymore in the Dataset -> mark them as Deleted
|
|
|
|
fileUploads.forEach(fileUpload -> {
|
|
|
|
fileManager.markOldFileAsDeleted(fileUpload);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2023-11-17 18:01:44 +01:00
|
|
|
private void sendNotification(DescriptionEntity descriptionEntity, DmpEntity dmp, UserEntity user, NotificationType notificationType) throws InvalidApplicationException {
|
2023-11-21 11:15:29 +01:00
|
|
|
List<DmpUserEntity> userDMPS = this.queryFactory.query(DmpUserQuery.class).dmpIds(dmp.getId()).collect();
|
2023-11-16 13:01:39 +01:00
|
|
|
for (DmpUserEntity userDMP : userDMPS) {
|
2023-11-20 16:09:24 +01:00
|
|
|
if (!userDMP.getUserId().equals(user.getId())) {
|
2020-02-14 17:40:34 +01:00
|
|
|
Notification notification = new Notification();
|
|
|
|
notification.setUserId(user);
|
2020-02-17 11:41:01 +01:00
|
|
|
notification.setType(notificationType);
|
2020-02-14 17:40:34 +01:00
|
|
|
notification.setNotifyState(NotifyState.PENDING);
|
|
|
|
notification.setIsActive(ActiveStatus.ACTIVE);
|
|
|
|
notification.setData("{" +
|
2023-11-20 16:09:24 +01:00
|
|
|
"\"userId\": \"" + userDMP.getUserId() + "\"" +
|
2023-11-06 15:17:57 +01:00
|
|
|
", \"id\": \"" + descriptionEntity.getId() + "\"" +
|
|
|
|
", \"name\": \"" + descriptionEntity.getLabel() + "\"" +
|
2020-02-17 11:41:01 +01:00
|
|
|
", \"path\": \"" + notificationPaths.get(notificationType) + "\"" +
|
2020-02-14 17:40:34 +01:00
|
|
|
"}");
|
|
|
|
notification.setCreatedAt(new Date());
|
|
|
|
notification.setUpdatedAt(notification.getCreatedAt());
|
|
|
|
notification.setContactTypeHint(ContactType.EMAIL);
|
2023-11-20 16:09:24 +01:00
|
|
|
|
|
|
|
UserContactInfoQuery query = this.queryFactory.query(UserContactInfoQuery.class).userIds(userDMP.getUserId());
|
|
|
|
query.setOrder(new Ordering().addAscending(UserContactInfo._ordinal));
|
|
|
|
notification.setContactHint(query.first().getValue());
|
2020-02-14 17:40:34 +01:00
|
|
|
databaseRepository.getNotificationDao().createOrUpdate(notification);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
public String checkDatasetValidation(DescriptionEntity descriptionEntity) throws Exception {
|
2019-07-02 15:34:12 +02:00
|
|
|
List<String> datasetProfileValidators = new LinkedList<>();
|
2023-11-07 13:53:36 +01:00
|
|
|
DescriptionTemplateEntity profile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDescriptionTemplateId());
|
2019-07-02 15:34:12 +02:00
|
|
|
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
|
|
|
|
DocumentBuilder builder = builderFactory.newDocumentBuilder();
|
|
|
|
Document xmlDocument = builder.parse(new ByteArrayInputStream(profile.getDefinition().getBytes()));
|
|
|
|
|
|
|
|
XPath xPath = XPathFactory.newInstance().newXPath();
|
|
|
|
String expression = "//validation/@type[.=1]/ancestor::field/@id";
|
|
|
|
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
|
|
|
|
|
|
|
|
for (int i = 0; i < nodeList.getLength(); i++) {
|
|
|
|
Node node = nodeList.item(i);
|
|
|
|
datasetProfileValidators.add(node.getNodeValue());
|
|
|
|
}
|
|
|
|
|
2021-07-19 17:31:16 +02:00
|
|
|
expression = "//validation/@type[.=1]/ancestor::fieldSet";
|
|
|
|
nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
|
|
|
|
|
2021-06-01 11:30:01 +02:00
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
JSONObject obj = new JSONObject(descriptionEntity.getProperties());
|
2022-02-09 14:23:16 +01:00
|
|
|
VisibilityRuleService visibilityRuleService = new VisibilityRuleServiceImpl();
|
2021-06-01 11:30:01 +02:00
|
|
|
visibilityRuleService.setProperties(obj.toMap());
|
|
|
|
|
2023-11-07 13:53:36 +01:00
|
|
|
//descriptionEntity.setDescriptionTemplateId(profile.getId()); //TODO
|
2023-11-06 15:17:57 +01:00
|
|
|
PagedDatasetProfile pagedDatasetProfile = this.getPagedProfile(new DatasetWizardModel(), descriptionEntity);
|
2021-06-01 11:30:01 +02:00
|
|
|
visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules());
|
|
|
|
|
|
|
|
|
2022-03-29 14:11:55 +02:00
|
|
|
String failedField = null;
|
|
|
|
|
2019-07-02 15:34:12 +02:00
|
|
|
for (String validator : datasetProfileValidators) {
|
2022-02-10 12:21:21 +01:00
|
|
|
if (obj.has(validator) && isNullOrEmpty(obj.getString(validator)) && isElementVisible(nodeList, validator, visibilityRuleService)) {
|
2022-03-29 14:11:55 +02:00
|
|
|
//throw new Exception("Field value of " + validator + " must be filled.");
|
|
|
|
failedField = validator;
|
|
|
|
break;
|
2019-07-02 15:34:12 +02:00
|
|
|
}
|
|
|
|
}
|
2022-03-29 14:11:55 +02:00
|
|
|
|
|
|
|
return failedField;
|
2019-07-02 15:34:12 +02:00
|
|
|
}
|
|
|
|
|
2022-02-10 12:21:21 +01:00
|
|
|
private boolean isNullOrEmpty(String value) {
|
|
|
|
return value == null || value.trim().isEmpty();
|
|
|
|
}
|
|
|
|
|
2021-07-19 17:31:16 +02:00
|
|
|
private boolean isElementVisible(NodeList nodeList, String id, VisibilityRuleService visibilityRuleService) {
|
|
|
|
Element fieldSet = null;
|
|
|
|
for (int i = 0; i < nodeList.getLength(); i++) {
|
|
|
|
Node node = nodeList.item(i);
|
|
|
|
for (int j = 0; j < node.getChildNodes().getLength(); j++) {
|
|
|
|
Node fcnode = node.getChildNodes().item(j);
|
|
|
|
if (fcnode.getNodeName().equals("fields")) {
|
|
|
|
for(int k = 0; k < fcnode.getChildNodes().getLength(); k++) {
|
|
|
|
Node scnode = fcnode.getChildNodes().item(k);
|
|
|
|
if (scnode.getNodeName().equals("field") && scnode.getAttributes().getNamedItem("id").getNodeValue().equals(id)) {
|
|
|
|
fieldSet = (Element) node;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (fieldSet != null) {
|
|
|
|
return visibilityRuleService.isElementVisible(id) && visibilityRuleService.isElementVisible(fieldSet.getAttribute("id"));
|
|
|
|
} else {
|
|
|
|
return visibilityRuleService.isElementVisible(id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-18 17:23:34 +01:00
|
|
|
private String propertiesModelToString(PagedDatasetProfile pagedDatasetProfile) {
|
2021-09-27 17:11:55 +02:00
|
|
|
Map<String, Object> values = new LinkedHashMap<>();
|
2020-03-18 17:23:34 +01:00
|
|
|
pagedDatasetProfile.toMap(values);
|
2018-01-25 09:14:43 +01:00
|
|
|
JSONObject jobject = new JSONObject(values);
|
2020-03-18 17:23:34 +01:00
|
|
|
return jobject.toString();
|
2018-01-25 09:14:43 +01:00
|
|
|
}
|
|
|
|
|
2023-11-14 12:41:57 +01:00
|
|
|
public void updateTags(DescriptionEntity descriptionEntityEntity, List<TagEntity> tags) throws Exception {
|
2020-03-09 15:47:32 +01:00
|
|
|
// if (datasetWizardModel.getTags() != null && !datasetWizardModel.getTags().isEmpty()) {
|
2020-04-01 17:16:06 +02:00
|
|
|
/*eu.eudat.elastic.entities.Dataset dataset = new eu.eudat.elastic.entities.Dataset();
|
2020-03-11 10:04:49 +01:00
|
|
|
dataset.setId(datasetWizardModel.getId().toString());
|
2020-03-18 17:23:34 +01:00
|
|
|
if (datasetWizardModel.getTags() != null && !datasetWizardModel.getTags().isEmpty()) {
|
|
|
|
DatasetCriteria criteria = new DatasetCriteria();
|
|
|
|
criteria.setTags(datasetWizardModel.getTags());
|
2020-04-01 17:16:06 +02:00
|
|
|
List<Tag> tags = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().query(criteria).stream().map(eu.eudat.elastic.entities.Dataset::getTags).flatMap(Collection::stream)
|
2020-03-18 17:23:34 +01:00
|
|
|
.filter(StreamDistinctBy.distinctByKey(Tag::getId)).filter(tag -> datasetWizardModel.getTags().stream().anyMatch(tag1 -> tag1.getName().equals(tag.getName()))).collect(Collectors.toList());
|
|
|
|
if (tags.isEmpty()) {
|
|
|
|
datasetWizardModel.getTags().forEach(tag -> tag.setId(UUID.randomUUID().toString()));
|
|
|
|
dataset.setTags(datasetWizardModel.getTags());
|
|
|
|
} else {
|
|
|
|
dataset.setTags(tags);
|
|
|
|
}
|
2020-03-17 17:03:43 +01:00
|
|
|
}
|
2020-03-09 15:47:32 +01:00
|
|
|
dataset.setLabel(datasetWizardModel.getLabel());
|
2020-03-17 11:41:27 +01:00
|
|
|
dataset.setDescription(datasetWizardModel.getDescription());
|
2020-03-09 15:47:32 +01:00
|
|
|
dataset.setTemplate(datasetWizardModel.getProfile());
|
|
|
|
dataset.setStatus(datasetWizardModel.getStatus());
|
2020-03-11 10:04:49 +01:00
|
|
|
dataset.setDmp(datasetWizardModel.getDmp().getId());
|
|
|
|
dataset.setGroup(datasetWizardModel.getDmp().getGroupId());
|
2020-03-09 15:47:32 +01:00
|
|
|
dataset.setGrant(datasetWizardModel.getDmp().getGrant().getId());
|
2020-03-11 10:42:38 +01:00
|
|
|
if (datasetWizardModel.getDmp().getUsers() != null) {
|
|
|
|
dataset.setCollaborators(datasetWizardModel.getDmp().getUsers().stream().map(user -> {
|
|
|
|
Collaborator collaborator = new Collaborator();
|
|
|
|
collaborator.setId(user.getId().toString());
|
|
|
|
collaborator.setName(user.getName());
|
|
|
|
return collaborator;
|
|
|
|
}).collect(Collectors.toList()));
|
|
|
|
}
|
2020-03-11 10:04:49 +01:00
|
|
|
DataManagementPlanCriteria dmpCriteria = new DataManagementPlanCriteria();
|
|
|
|
dmpCriteria.setAllVersions(true);
|
|
|
|
dmpCriteria.setGroupIds(Collections.singletonList(datasetWizardModel.getDmp().getGroupId()));
|
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dmpCriteria).toList().stream()
|
|
|
|
.max(Comparator.comparing(DMP::getVersion)).ifPresent(dmp -> dataset.setLastVersion(dmp.getId().equals(datasetWizardModel.getDmp().getId())));
|
2020-03-17 11:43:20 +01:00
|
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dmpCriteria).toList().stream().filter(DMP::isPublic)
|
|
|
|
.max(Comparator.comparing(DMP::getVersion)).ifPresent(dmp -> dataset.setLastPublicVersion(dmp.getId().equals(datasetWizardModel.getDmp().getId())));
|
2020-03-11 10:04:49 +01:00
|
|
|
if (dataset.getLastVersion() == null) {
|
|
|
|
dataset.setLastVersion(true);
|
|
|
|
}
|
2020-03-17 11:43:20 +01:00
|
|
|
if (dataset.getLastPublicVersion() == null) {
|
|
|
|
dataset.setLastPublicVersion(false);
|
|
|
|
}
|
2020-03-11 10:42:38 +01:00
|
|
|
if (datasetWizardModel.getDmp().getOrganisations() != null) {
|
|
|
|
dataset.setOrganizations(datasetWizardModel.getDmp().getOrganisations().stream().map(org -> {
|
|
|
|
Organization organization = new Organization();
|
|
|
|
organization.setId(org.getId());
|
|
|
|
organization.setName(org.getName());
|
|
|
|
return organization;
|
|
|
|
}).collect(Collectors.toList()));
|
|
|
|
}
|
2020-03-16 17:50:29 +01:00
|
|
|
dataset.setPublic(datasetWizardModel.getDmp().getPublic());
|
|
|
|
dataset.setGrantStatus(datasetWizardModel.getDmp().getGrant().getStatus());
|
2020-04-01 17:16:06 +02:00
|
|
|
dataset.setFormData(this.getWordDocumentText(datasetWizardModel));*/
|
2023-11-14 12:41:57 +01:00
|
|
|
// DatasetMapper mapper = new DatasetMapper(apiContext, this); //TODO
|
|
|
|
// eu.eudat.elastic.entities.Dataset dataset = mapper.toElastic(descriptionEntityEntity, tags);
|
|
|
|
// apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().createOrUpdate(dataset);
|
2020-03-09 15:47:32 +01:00
|
|
|
// }
|
2018-07-11 15:47:36 +02:00
|
|
|
}
|
|
|
|
|
2020-03-18 17:23:34 +01:00
|
|
|
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
private void createRegistriesIfTheyDontExist(RegistryDao registryDao, DescriptionEntity descriptionEntity) throws InvalidApplicationException {
|
|
|
|
//TODO implement it on create
|
|
|
|
// if (descriptionEntity.getRegistries() != null && !descriptionEntity.getRegistries().isEmpty()) {
|
|
|
|
// for (Registry registry : descriptionEntity.getRegistries()) {
|
|
|
|
// RegistryCriteria criteria = new RegistryCriteria();
|
|
|
|
// criteria.setLike(registry.getReference());
|
|
|
|
// List<Registry> entries = registryDao.getWithCriteria(criteria).toList();
|
|
|
|
// if (entries != null && !entries.isEmpty()) registry.setId(entries.get(0).getId());
|
|
|
|
// else {
|
|
|
|
// registry.setCreated(new Date());
|
|
|
|
// registryDao.createOrUpdate(registry);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
2017-12-21 11:38:18 +01:00
|
|
|
}
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
private void createDataRepositoriesIfTheyDontExist(DataRepositoryDao dataRepositoryDao, DescriptionEntity descriptionEntity) throws InvalidApplicationException {
|
|
|
|
//TODO implement it on create
|
|
|
|
// if (descriptionEntity.getDatasetDataRepositories() != null && !descriptionEntity.getDatasetDataRepositories().isEmpty()) {
|
|
|
|
// for (DatasetDataRepository datasetDataRepository : descriptionEntity.getDatasetDataRepositories()) {
|
|
|
|
// DataRepositoryCriteria criteria = new DataRepositoryCriteria();
|
|
|
|
// criteria.setLike(datasetDataRepository.getDataRepository().getReference());
|
|
|
|
// List<DataRepository> entries = dataRepositoryDao.getWithCriteria(criteria).toList();
|
|
|
|
// if (entries != null && !entries.isEmpty()) {
|
|
|
|
// datasetDataRepository.getDataRepository().setId(entries.get(0).getId());
|
|
|
|
// datasetDataRepository.setDataset(descriptionEntity);
|
|
|
|
// descriptionEntity.getDatasetDataRepositories().add(datasetDataRepository);
|
|
|
|
// } else {
|
|
|
|
// datasetDataRepository.getDataRepository().setId(UUID.randomUUID());
|
|
|
|
// DataRepository dataRepository = dataRepositoryDao.createOrUpdate(datasetDataRepository.getDataRepository());
|
|
|
|
// datasetDataRepository.setDataset(descriptionEntity);
|
|
|
|
// datasetDataRepository.setDataRepository(dataRepository);
|
|
|
|
// descriptionEntity.getDatasetDataRepositories().add(datasetDataRepository);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
2017-12-21 11:38:18 +01:00
|
|
|
}
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
private void createServicesIfTheyDontExist(DescriptionEntity descriptionEntity) throws InvalidApplicationException {
|
|
|
|
//TODO implement it on create
|
|
|
|
// if (descriptionEntity.getServices() != null && !descriptionEntity.getServices().isEmpty()) {
|
|
|
|
// for (DatasetService service : descriptionEntity.getServices()) {
|
|
|
|
// ServiceCriteria criteria = new ServiceCriteria();
|
|
|
|
// criteria.setLike(service.getService().getReference());
|
|
|
|
// List<Service> entries = databaseRepository.getServiceDao().getWithCriteria(criteria).toList();
|
|
|
|
// if (entries != null && !entries.isEmpty()) {
|
|
|
|
// service.setDataset(descriptionEntity);
|
|
|
|
// service.getService().setCreated(new Date());
|
|
|
|
// service.setService(service.getService());
|
|
|
|
// this.databaseRepository.getServiceDao().createOrUpdate(service.getService());
|
|
|
|
// descriptionEntity.getServices().add(service);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
2017-12-21 11:38:18 +01:00
|
|
|
}
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
private void createExternalDatasetsIfTheyDontExist(DescriptionEntity descriptionEntity) throws InvalidApplicationException {
|
|
|
|
//TODO implement it on create
|
|
|
|
// if (descriptionEntity.getDatasetExternalDatasets() != null && !descriptionEntity.getDatasetExternalDatasets().isEmpty()) {
|
|
|
|
// for (DatasetExternalDataset datasetExternalDataset : descriptionEntity.getDatasetExternalDatasets()) {
|
|
|
|
// ExternalDatasetCriteria criteria = new ExternalDatasetCriteria();
|
|
|
|
// criteria.setLike(datasetExternalDataset.getExternalDataset().getReference());
|
|
|
|
// List<ExternalDataset> entries = databaseRepository.getExternalDatasetDao().getWithCriteria(criteria).toList();
|
|
|
|
// if (entries != null && !entries.isEmpty()) {
|
|
|
|
// datasetExternalDataset.getExternalDataset().setId(entries.get(0).getId());
|
|
|
|
// datasetExternalDataset.setDataset(descriptionEntity);
|
|
|
|
// descriptionEntity.getDatasetExternalDatasets().add(datasetExternalDataset);
|
|
|
|
// } else {
|
|
|
|
// datasetExternalDataset.getExternalDataset().setId(UUID.randomUUID());
|
|
|
|
// datasetExternalDataset.setDataset(descriptionEntity);
|
|
|
|
// ExternalDataset externalDataset = databaseRepository.getExternalDatasetDao().createOrUpdate(datasetExternalDataset.getExternalDataset());
|
|
|
|
// datasetExternalDataset.setExternalDataset(externalDataset);
|
|
|
|
// descriptionEntity.getDatasetExternalDatasets().add(datasetExternalDataset);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
2018-01-19 15:19:14 +01:00
|
|
|
}
|
|
|
|
|
2019-01-31 16:53:37 +01:00
|
|
|
public void makePublic(DatasetDao datasetDao, UUID id) throws Exception {
|
2023-11-06 15:17:57 +01:00
|
|
|
DescriptionEntity descriptionEntity = datasetDao.find(id);
|
|
|
|
if (descriptionEntity.getStatus() != DescriptionStatus.Finalized)
|
2018-01-19 12:11:22 +01:00
|
|
|
throw new Exception("You cannot make public a Dataset That Has not Been Finalised");
|
2023-11-06 15:17:57 +01:00
|
|
|
datasetDao.createOrUpdate(descriptionEntity);
|
2021-10-08 15:04:52 +02:00
|
|
|
metricsManager.increaseValue(MetricNames.DATASET, 1, MetricNames.PUBLISHED);
|
2018-01-19 12:11:22 +01:00
|
|
|
}
|
2017-12-21 11:38:18 +01:00
|
|
|
|
2023-10-18 17:52:03 +02:00
|
|
|
public ResponseEntity<byte[]> getDocument(String id, VisibilityRuleService visibilityRuleService, String contentType) throws IllegalAccessException, IOException, InstantiationException, InvalidApplicationException {
|
|
|
|
FileEnvelope envelope = getXmlDocument(id, visibilityRuleService);
|
2019-02-06 11:48:05 +01:00
|
|
|
InputStream resource = new FileInputStream(envelope.getFile());
|
2020-01-16 16:46:24 +01:00
|
|
|
logger.info("Mime Type of " + envelope.getFilename() + " is " +
|
2019-02-06 11:48:05 +01:00
|
|
|
new MimetypesFileTypeMap().getContentType(envelope.getFile()));
|
|
|
|
HttpHeaders responseHeaders = new HttpHeaders();
|
|
|
|
responseHeaders.setContentLength(envelope.getFile().length());
|
|
|
|
responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
|
2021-11-02 13:50:20 +01:00
|
|
|
String fileName = envelope.getFilename().replace(" ", "_").replace(",", "_");
|
|
|
|
responseHeaders.set("Content-Disposition", "attachment;filename=" + fileName + ".xml");
|
2019-02-06 11:48:05 +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();
|
|
|
|
Files.deleteIfExists(envelope.getFile().toPath());
|
|
|
|
|
|
|
|
return new ResponseEntity<>(content,
|
|
|
|
responseHeaders,
|
|
|
|
HttpStatus.OK);
|
|
|
|
}
|
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
public DescriptionEntity createDatasetFromXml(MultipartFile importFile, String dmpId, String datasetProfileId) throws JAXBException, IOException, InvalidApplicationException {
|
2019-04-15 11:34:12 +02:00
|
|
|
DatasetImportPagedDatasetProfile importModel = new DatasetImportPagedDatasetProfile();
|
|
|
|
JAXBContext jaxbContext;
|
|
|
|
|
|
|
|
// Parses XML into DatasetImport Model.
|
|
|
|
try {
|
|
|
|
InputStream in = importFile.getInputStream();
|
|
|
|
jaxbContext = JAXBContext.newInstance(DatasetImportPagedDatasetProfile.class);
|
|
|
|
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
|
2019-06-04 16:16:12 +02:00
|
|
|
DatasetImportPagedDatasetProfile datasetImport = (DatasetImportPagedDatasetProfile) jaxbUnmarshaller.unmarshal(in);
|
2019-04-15 11:34:12 +02:00
|
|
|
importModel = datasetImport;
|
|
|
|
} catch (IOException e) {
|
2020-01-16 16:46:24 +01:00
|
|
|
logger.error(e.getMessage(), e);
|
2019-04-15 11:34:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Checks if XML datasetProfileId GroupId matches the one selected.
|
|
|
|
try {
|
2023-10-27 17:46:34 +02:00
|
|
|
DescriptionTemplateEntity importDescriptionTemplateEntity = databaseRepository.getDatasetProfileDao().find(UUID.fromString(importModel.getDatasetProfileId()));
|
|
|
|
DescriptionTemplateEntity latestVersionDescriptionTemplateEntity = databaseRepository.getDatasetProfileDao().find(UUID.fromString(datasetProfileId));
|
|
|
|
if (latestVersionDescriptionTemplateEntity.getGroupId() != importDescriptionTemplateEntity.getGroupId()) {
|
2019-04-15 11:34:12 +02:00
|
|
|
throw new Exception();
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
2020-01-16 16:46:24 +01:00
|
|
|
logger.error(e.getMessage(), e);
|
2019-04-15 11:34:12 +02:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Creates the Hash Map to place the values of the data set.
|
|
|
|
Map<String, String> importMap = importModel.getPages().stream()
|
|
|
|
.flatMap(s -> s.getSections().getSection().stream()
|
|
|
|
.flatMap(cFields -> cFields.getCompositeFields().stream()
|
2019-06-04 16:16:12 +02:00
|
|
|
.flatMap(cField -> cField.getCompositeField().stream()
|
|
|
|
.filter(Objects::nonNull)
|
|
|
|
.flatMap(fields -> fields.getFields().stream()
|
|
|
|
.flatMap(field -> field.getField().stream()
|
|
|
|
.filter(f -> f.getValue() != null)
|
|
|
|
)))))
|
2019-04-15 11:34:12 +02:00
|
|
|
.collect(Collectors.toMap(DatasetImportField::getId, DatasetImportField::getValue));
|
|
|
|
|
|
|
|
// Transforms map into json file.
|
|
|
|
JSONObject jsonDatasetProperties = new JSONObject(importMap);
|
|
|
|
|
|
|
|
// Creates the entity data set to save.
|
2023-11-06 15:17:57 +01:00
|
|
|
DescriptionEntity entity = new DescriptionEntity();
|
2019-04-15 11:34:12 +02:00
|
|
|
entity.setProperties(jsonDatasetProperties.toString());
|
|
|
|
entity.setLabel(importFile.getOriginalFilename());
|
2023-11-16 13:01:39 +01:00
|
|
|
DmpEntity dmp = new DmpEntity();
|
2019-04-15 11:34:12 +02:00
|
|
|
dmp.setId(UUID.fromString(dmpId));
|
2023-11-07 13:53:36 +01:00
|
|
|
// entity.setDmpId(dmp.getId()); //TODO
|
2023-11-10 15:13:55 +01:00
|
|
|
entity.setStatus(DescriptionStatus.Draft);
|
2023-11-06 15:17:57 +01:00
|
|
|
entity.setCreatedAt(Instant.now());
|
|
|
|
entity.setUpdatedAt(Instant.now());
|
2023-10-27 17:46:34 +02:00
|
|
|
DescriptionTemplateEntity profile = new DescriptionTemplateEntity();
|
2019-04-15 11:34:12 +02:00
|
|
|
profile.setId(UUID.fromString(datasetProfileId));
|
2023-11-07 13:53:36 +01:00
|
|
|
// entity.setDescriptionTemplateId(profile.getId());//TODO
|
2019-04-15 11:34:12 +02:00
|
|
|
|
2023-11-17 18:01:44 +01:00
|
|
|
UserEntity userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(this.userScope.getUserId()).build();
|
2023-11-07 11:36:36 +01:00
|
|
|
entity.setDmpDescriptionTemplateId(userInfo.getId());
|
2019-04-15 11:34:12 +02:00
|
|
|
|
2023-11-14 12:41:57 +01:00
|
|
|
updateTagsXmlImportDataset(entity);
|
2019-04-15 11:34:12 +02:00
|
|
|
createRegistriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao(), entity);
|
|
|
|
createDataRepositoriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao(), entity);
|
|
|
|
createServicesIfTheyDontExist(entity);
|
|
|
|
createExternalDatasetsIfTheyDontExist(entity);
|
|
|
|
|
2021-10-08 15:04:52 +02:00
|
|
|
metricsManager.increaseValue(MetricNames.DATASET, 1, MetricNames.DRAFT);
|
2019-04-15 11:34:12 +02:00
|
|
|
return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(entity);
|
|
|
|
}
|
|
|
|
|
2023-11-14 12:41:57 +01:00
|
|
|
public void updateTagsXmlImportDataset(DescriptionEntity descriptionEntity) throws IOException {
|
2019-04-15 11:34:12 +02:00
|
|
|
// TODO: When tags functionality return.
|
|
|
|
}
|
|
|
|
|
2019-04-22 11:11:21 +02:00
|
|
|
|
2023-11-06 15:17:57 +01:00
|
|
|
public PagedDatasetProfile getLatestDatasetProfile(DescriptionEntity descriptionEntityEntity, DescriptionTemplateEntity profile) {
|
2019-04-22 11:11:21 +02:00
|
|
|
eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = userManager.generateDatasetProfileModel(profile);
|
2023-11-06 15:17:57 +01:00
|
|
|
datasetprofile.setStatus(descriptionEntityEntity.getStatus().getValue());
|
|
|
|
if (descriptionEntityEntity.getProperties() != null) {
|
|
|
|
JSONObject jobject = new JSONObject(descriptionEntityEntity.getProperties());
|
2019-04-22 11:11:21 +02:00
|
|
|
Map<String, Object> properties = jobject.toMap();
|
|
|
|
datasetprofile.fromJsonObject(properties);
|
|
|
|
}
|
|
|
|
PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile();
|
|
|
|
pagedDatasetProfile.buildPagedDatasetProfile(datasetprofile);
|
|
|
|
return pagedDatasetProfile;
|
|
|
|
}
|
2019-06-12 11:10:46 +02:00
|
|
|
|
2023-10-18 17:52:03 +02:00
|
|
|
public DataTableData<DatasetProfileListingModel> getDatasetProfilesUsedByDatasets(DatasetProfileTableRequestItem datasetProfileTableRequestItem) throws InvalidApplicationException {
|
2019-06-12 11:10:46 +02:00
|
|
|
datasetProfileTableRequestItem.getCriteria().setFilter(DatasetProfileCriteria.DatasetProfileFilter.Datasets.getValue());
|
2023-10-18 17:52:03 +02:00
|
|
|
datasetProfileTableRequestItem.getCriteria().setUserId(this.userScope.getUserId());
|
2019-06-12 11:10:46 +02:00
|
|
|
|
2023-10-27 17:46:34 +02:00
|
|
|
QueryableList<DescriptionTemplateEntity> items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(datasetProfileTableRequestItem.getCriteria());
|
2019-06-12 11:10:46 +02:00
|
|
|
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;
|
|
|
|
}
|
2020-03-11 10:06:43 +01:00
|
|
|
|
2023-10-18 17:52:03 +02:00
|
|
|
public void generateIndex() throws InvalidApplicationException {
|
|
|
|
if (this.authorizationService.authorize(Permission.AdminRole)) {
|
2020-03-11 10:06:43 +01:00
|
|
|
this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable().toList();
|
2023-11-06 15:17:57 +01:00
|
|
|
List<DescriptionEntity> descriptionEntityEntities = new ArrayList<>(this.apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().asQueryable().toList());
|
|
|
|
descriptionEntityEntities.forEach(datasetEntity -> {
|
2020-03-11 10:06:43 +01:00
|
|
|
try {
|
2023-11-07 13:53:36 +01:00
|
|
|
UUID dmpId = this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(datasetEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first().getDmpId();
|
2023-11-16 13:01:39 +01:00
|
|
|
DmpEntity dmp = databaseRepository.getDmpDao().find(dmpId);
|
|
|
|
//dmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); //TODO
|
2023-11-14 12:41:57 +01:00
|
|
|
// eu.eudat.elastic.entities.Dataset dataset = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(datasetEntity.getId().toString()); //TODO
|
|
|
|
// updateTags(datasetEntity, dataset != null ? dataset.getTags() : null);
|
2020-03-18 17:23:34 +01:00
|
|
|
} catch (Exception e) {
|
2020-03-11 10:06:43 +01:00
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2023-11-14 12:41:57 +01:00
|
|
|
//TODO
|
|
|
|
// public void getTagsFromProfile(DatasetWizardModel wizardModel, DescriptionEntity descriptionEntity) throws IOException, InvalidApplicationException {
|
|
|
|
//// descriptionEntity.setDescriptionTemplateId(descriptionEntity.getDescriptionTemplateId()); //TODO
|
|
|
|
// wizardModel.setDatasetProfileDefinition(this.getPagedProfile(wizardModel, descriptionEntity));
|
|
|
|
// ObjectMapper mapper = new ObjectMapper();
|
|
|
|
// String json = mapper.writeValueAsString(wizardModel.getDatasetProfileDefinition());
|
|
|
|
// JsonNode propertiesJson = mapper.readTree(json);
|
|
|
|
// DatasetCriteria criteria = new DatasetCriteria();
|
|
|
|
// criteria.setHasTags(true);
|
|
|
|
// List<Tag> tags = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().query(criteria).stream().map(eu.eudat.elastic.entities.Dataset::getTags).flatMap(Collection::stream).filter(StreamDistinctBy.distinctByKey(Tag::getId)).collect(Collectors.toList());
|
|
|
|
// Set<JsonNode> tagNodes = new HashSet<>();
|
|
|
|
// tagNodes.addAll(JsonSearcher.findNodes(propertiesJson, "renderStyle", "tags", true));
|
|
|
|
// tagNodes.addAll(JsonSearcher.findNodes(propertiesJson, "schematics", "rda.dataset.keyword"));
|
|
|
|
// if(wizardModel.getTags() == null){
|
|
|
|
// wizardModel.setTags(new ArrayList<>());
|
|
|
|
// }
|
|
|
|
// if (!tagNodes.isEmpty()) {
|
|
|
|
// tagNodes.forEach(node -> {
|
|
|
|
// JsonNode value = node.get("value");
|
|
|
|
// if (!value.toString().equals("\"\"") && !value.toString().equals("null")) {
|
|
|
|
// if (value.toString().startsWith("[")) {
|
|
|
|
// String stringValue = value.toString().replaceAll("=", ":");
|
|
|
|
// JSONArray values = new JSONArray(stringValue);
|
|
|
|
// values.iterator().forEachRemaining(element -> {
|
|
|
|
// Map<String, Object> data = ((JSONObject) element).toMap();
|
|
|
|
// this.addTag(tags, wizardModel.getTags(), data.get("id").toString(), data.get("name").toString());
|
|
|
|
// });
|
|
|
|
// } else {
|
|
|
|
// List<String> values = Arrays.asList(value.textValue().split(", "));
|
|
|
|
// List<Tag> tagValues = values.stream().map(stringValue -> new Tag(stringValue, stringValue)).collect(Collectors.toList());
|
|
|
|
// tagValues.iterator().forEachRemaining(tag -> {
|
|
|
|
// this.addTag(tags, wizardModel.getTags(), tag.getId(), tag.getName());
|
|
|
|
// });
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// });
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// private void addTag(List<Tag> srcTags, List<Tag> dstTags, String id, String name) {
|
|
|
|
// Tag tag = new Tag();
|
|
|
|
// if(srcTags.stream().anyMatch(intag -> intag.getName().equals(name))) {
|
|
|
|
// tag = srcTags.stream().filter(intag -> intag.getName().equals(name)).findFirst().get();
|
|
|
|
// } else {
|
|
|
|
// tag.setName(name);
|
|
|
|
// tag.setId(id);
|
|
|
|
// }
|
|
|
|
// if (dstTags.stream().noneMatch(intag -> intag.getName().equals(name))) {
|
|
|
|
// dstTags.add(tag);
|
|
|
|
// }
|
|
|
|
// }
|
2020-06-30 17:29:06 +02:00
|
|
|
|
2020-07-21 16:30:12 +02:00
|
|
|
@Transactional
|
2023-11-06 15:17:57 +01:00
|
|
|
private DatasetListingModel mapModel(DescriptionEntity item) {
|
2021-09-30 17:02:53 +02:00
|
|
|
/*if (item.getProfile() == null)
|
|
|
|
return null;*/
|
2020-06-30 17:29:06 +02:00
|
|
|
DatasetListingModel listingModel = new DatasetListingModel().fromDataModel(item);
|
2021-09-30 17:02:53 +02:00
|
|
|
/*DatasetProfileCriteria criteria = new DatasetProfileCriteria();
|
2020-06-30 17:29:06 +02:00
|
|
|
criteria.setGroupIds(Collections.singletonList(item.getProfile().getGroupId()));
|
2023-07-25 14:04:39 +02:00
|
|
|
List<DescriptionTemplate> profiles = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(criteria).toList();
|
2020-06-30 17:29:06 +02:00
|
|
|
boolean islast = false;
|
2020-07-09 09:17:49 +02:00
|
|
|
if (!profiles.isEmpty()) {
|
2023-07-25 14:04:39 +02:00
|
|
|
profiles = profiles.stream().sorted(Comparator.comparing(DescriptionTemplate::getVersion)).collect(Collectors.toList());
|
2020-07-09 09:17:49 +02:00
|
|
|
islast = profiles.get(0).getId().equals(item.getProfile().getId());
|
|
|
|
}
|
2021-09-30 17:02:53 +02:00
|
|
|
listingModel.setProfileLatestVersion(islast);*/
|
2020-06-30 17:29:06 +02:00
|
|
|
return listingModel;
|
|
|
|
}
|
2017-12-15 13:25:21 +01:00
|
|
|
}
|