From cecc59eba67891dd035d6c8b3ce98c27c28650de Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 16 Nov 2021 15:55:32 +0200 Subject: [PATCH 01/25] Fix issue with file imports (ref #7184) --- .../main/java/eu/eudat/models/rda/mapper/ProjectRDAMapper.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/ProjectRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/ProjectRDAMapper.java index 0d33cda2b..add67c68e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/ProjectRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/ProjectRDAMapper.java @@ -47,6 +47,8 @@ public class ProjectRDAMapper { ((eu.eudat.data.entities.Project) entities.get("project")).setStatus((short)1); ((eu.eudat.data.entities.Project) entities.get("project")).setCreated(new Date()); ((eu.eudat.data.entities.Project) entities.get("project")).setModified(new Date()); + ((eu.eudat.data.entities.Project) entities.get("project")).setStartdate(new Date()); + ((eu.eudat.data.entities.Project) entities.get("project")).setEnddate(new Date()); ((eu.eudat.data.entities.Project) entities.get("project")).setType(0); apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().createOrUpdate(((eu.eudat.data.entities.Project) entities.get("project"))); for (int i = 0; i < rda.getFunding().size(); i++) { From 4da99d6d83fdb6e524d154cdf612a1a5921ab360 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 17 Nov 2021 10:30:31 +0200 Subject: [PATCH 02/25] Trim out hours from date picker export (ref #7185) --- .../eudat/logic/utilities/documents/word/WordBuilder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index 96df37a51..4fcc9a5d0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -25,6 +25,9 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.math.BigInteger; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -348,9 +351,10 @@ public class WordBuilder { CheckBoxData data = (CheckBoxData) field.getData(); if (field.getValue() == null || field.getValue().equals("false")) return null; return data.getLabel(); - case "freetext": case "datepicker": case "datePicker": + return field.getValue() != null ? DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()).format(Instant.parse((String)field.getValue())) : ""; + case "freetext": case "textarea": case "richTextarea": return field.getValue() != null ? field.getValue().toString(): ""; From 4eb15da95ac99ec885908ac0250ca85788cea8a0 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 17 Nov 2021 11:12:34 +0200 Subject: [PATCH 03/25] Trim out hours from date picker export on xml and json(ref #7185) --- .../utilities/documents/xml/ExportXmlBuilder.java | 9 ++++++++- .../eu/eudat/models/rda/mapper/DatasetRDAMapper.java | 11 ++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java index 8b57c6a99..9c8a591b4 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java @@ -20,6 +20,9 @@ import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.UUID; @@ -126,7 +129,11 @@ public class ExportXmlBuilder { Map jsonElement = mapper.readValue(field.getValue().toString(), Map.class); valueField.setTextContent((jsonElement.get("label") != null ? jsonElement.get("label").toString() : jsonElement.get("name") != null ? jsonElement.get("name").toString() : "")); } catch (IOException e) { - valueField.setTextContent(field.getValue().toString()); + try { + valueField.setTextContent(DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()).format(Instant.parse(field.getValue().toString()))); + } catch (Exception exc) { + valueField.setTextContent(field.getValue().toString()); + } } } elementField.appendChild(valueField); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java index 3473fec6c..67858a14b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java @@ -20,6 +20,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.transaction.Transactional; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -152,7 +156,12 @@ public class DatasetRDAMapper { templateIdsToValues.entrySet().forEach(entry -> { boolean isFound = foundNodes.stream().anyMatch(node -> node.get("id").asText().equals(entry.getKey())); if (!isFound && entry.getValue() != null && !entry.getValue().toString().isEmpty()) { - rda.setAdditionalProperty(entry.getKey(), entry.getValue()); + try { + Instant time = Instant.parse(entry.getValue().toString()); + rda.setAdditionalProperty(entry.getKey(), DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()).format(time)); + } catch (DateTimeParseException e) { + rda.setAdditionalProperty(entry.getKey(), entry.getValue()); + } } }); From 38cd336bc923cd2a64cbc0b3e83b29e63a1f39ea Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 18 Nov 2021 18:27:20 +0200 Subject: [PATCH 04/25] Add transactional to makeFinalize on DMP and remove jackson parsing when depositing to zenodo --- .../data/dao/databaselayer/service/DatabaseService.java | 2 ++ .../main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java | 2 ++ .../eudat/logic/managers/DataManagementPlanManager.java | 8 +++++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/service/DatabaseService.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/service/DatabaseService.java index 8f3487a40..6355da0e2 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/service/DatabaseService.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/service/DatabaseService.java @@ -7,6 +7,7 @@ import eu.eudat.queryable.queryableentity.DataEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.transaction.Transactional; import java.util.Set; @@ -28,6 +29,7 @@ public class DatabaseService { return this.databaseCtx.getQueryable(tClass); } + @Transactional public T createOrUpdate(T item, Class tClass) { return this.databaseCtx.createOrUpdate(item, tClass); } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java index 378112713..ca33c0830 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java @@ -16,6 +16,7 @@ import org.springframework.stereotype.Component; import javax.persistence.criteria.Join; import javax.persistence.criteria.JoinType; +import javax.transaction.Transactional; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -106,6 +107,7 @@ public class DMPDaoImpl extends DatabaseAccess implements DMPDao { } @Override + @Transactional public DMP createOrUpdate(DMP item) { return this.getDatabaseService().createOrUpdate(item, DMP.class); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index b9dcd6d62..3071a7510 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -79,6 +79,7 @@ import org.springframework.web.multipart.MultipartFile; import org.w3c.dom.Document; import org.w3c.dom.Element; +import javax.transaction.Transactional; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; @@ -1034,6 +1035,7 @@ public class DataManagementPlanManager { } } + @Transactional public void makeFinalize(UUID id, Principal principal, DatasetsToBeFinalized datasetsToBeFinalized) throws Exception { DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(id); if (!isUserOwnerOfDmp(dmp, principal)) @@ -2093,10 +2095,10 @@ public class DataManagementPlanManager { } dataBuilder.append(" }\n").append("}"); createData = dataBuilder.toString(); - ObjectMapper mapper = new ObjectMapper(); + /*ObjectMapper mapper = new ObjectMapper(); mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); - JsonNode createDataJSON = mapper.readTree(createData); - HttpEntity request = new HttpEntity<>(createDataJSON, headers); + JsonNode createDataJSON = mapper.readTree(createData);*/ + HttpEntity request = new HttpEntity<>(createData, headers); Map createResponse = null; LinkedHashMap links = null; String previousDOI = this.getPreviousDOI(dmp.getGroupId(), dmp.getId()); From c0599d5fedb3b250a637de99088829a58fd7ef40 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 19 Nov 2021 11:20:47 +0200 Subject: [PATCH 05/25] Fix issue of reloading externalUrls --- .../logic/proxy/config/configloaders/DefaultConfigLoader.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java index 9c1eca88c..50ec81046 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java @@ -64,6 +64,7 @@ public class DefaultConfigLoader implements ConfigLoader { private void setRdaProperties() { String filePath = environment.getProperty("configuration.rda"); + logger.info("Loaded also config file: " + filePath); BufferedReader reader; List rdaList = new LinkedList<>(); try { @@ -83,6 +84,7 @@ public class DefaultConfigLoader implements ConfigLoader { private void setDocument() { String filePath = environment.getProperty("configuration.h2020template"); + logger.info("Loaded also config file: " + filePath); InputStream is = null; try { is = getStreamFromPath(filePath); @@ -100,6 +102,7 @@ public class DefaultConfigLoader implements ConfigLoader { private void setConfigurableProviders() { String filePath = environment.getProperty("configuration.configurable_login_providers"); + logger.info("Loaded also config file: " + filePath); InputStream is = null; try { is = getStreamFromPath(filePath); @@ -206,7 +209,6 @@ public class DefaultConfigLoader implements ConfigLoader { } } } - this.setKeyToSourceMap(); return keyToSourceMap; } From 52c7796e8ea8af436fa8695a862436c71a5a3685 Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Mon, 22 Nov 2021 13:36:02 +0200 Subject: [PATCH 06/25] #7183: Do not query for authors (DMP invitation) until 3 letters have been typed. 1. multiple-auto-complete.component.ts: a. Added @Input field minLength (default 0) b. In method "_onInputFocus()" filter results, only if query >= minLength. 2. dmp-invitation-dialog.component.html: In , added property [minLength]="3" (invite users to a DMP). --- .../auto-complete/multiple/multiple-auto-complete.component.ts | 3 ++- .../app/ui/dmp/invitation/dmp-invitation-dialog.component.html | 3 ++- .../app/ui/dmp/invitation/dmp-invitation-dialog.component.ts | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts index 5f38cad45..e08ffe914 100644 --- a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts +++ b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts @@ -75,6 +75,7 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp get shouldLabelFloat() { return this.focused || !this.empty; } + @Input() minLength: number = 0; @Input() showNoResultsLabel: boolean = true; @Input() hidePlaceholder: boolean = false; @Input() @@ -268,7 +269,7 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp distinctUntilChanged(), distinctUntilChanged(), tap(query => this.queryValue = query), - switchMap(query => this.filter(query))); + switchMap(query => (!this.minLength || (query && query.length >= this.minLength)) ? this.filter(query) : observableOf([]))); if (this.configuration.groupingFn) { this._groupedItems = this._items.pipe(map(items => this.configuration.groupingFn(items))); } } diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.html b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.html index fa13b7b57..f722893f0 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.html +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.html @@ -10,7 +10,8 @@ + [configuration]="usersAutoCompleteConfiguration" [showNoResultsLabel]="false" + [minLength]="3">

diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts index 0e9299f0e..ee29a5ace 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts @@ -74,7 +74,7 @@ export class DmpInvitationDialogComponent extends BaseComponent implements OnIni const val = typeof(item) === 'string'? item : item.email; const regexp = new RegExp(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/); return !regexp.test(val); - } + } }] }; From bb0c398120f21e2265f725a4ed606a9b2e233c07 Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Mon, 22 Nov 2021 13:44:41 +0200 Subject: [PATCH 07/25] #7183: In DMP invitation, return authors whose name/ email contains the query string given by user (case insensitive). 1. InvitationsManager.java: Added method "getUsersWithCriteria()" to filter results according to "userInfoRequestItem.getCriteria().getLike()". 2. UserInvitationController.java: In method "getUsers()" added parameter "@RequestBody UserInfoRequestItem userInfoRequestItem" and call new method "invitationsManager.getUsersWithCriteria()" (instead of getUsers()). --- .../controllers/UserInvitationController.java | 7 +++++-- .../logic/managers/InvitationsManager.java | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java index c751742f2..d9633d312 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java @@ -50,8 +50,11 @@ public class UserInvitationController extends BaseController { @RequestMapping(method = RequestMethod.POST, value = {"/getUsers"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity>> getUsers(Principal principal) throws IllegalAccessException, InstantiationException { - List users = invitationsManager.getUsers(principal); +// ResponseEntity>> getUsers(Principal principal) throws IllegalAccessException, InstantiationException { + ResponseEntity>> getUsers(Principal principal, @RequestBody UserInfoRequestItem userInfoRequestItem) throws IllegalAccessException, InstantiationException { + System.out.println(userInfoRequestItem.getCriteria().getLike()); +// List users = invitationsManager.getUsers(principal); + List users = invitationsManager.getUsersWithCriteria(principal, userInfoRequestItem); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.SUCCESS_MESSAGE).payload(users)); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java index 9c9e30537..8b11369d7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java @@ -3,6 +3,7 @@ package eu.eudat.logic.managers; import eu.eudat.data.entities.DMP; import eu.eudat.data.entities.UserDMP; import eu.eudat.data.entities.UserInfo; +import eu.eudat.data.query.items.item.userinfo.UserInfoRequestItem; import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.utilities.helpers.StreamDistinctBy; @@ -82,6 +83,23 @@ public class InvitationsManager { return userModels; } + public List getUsersWithCriteria(Principal principal, UserInfoRequestItem userInfoRequestItem) throws IllegalAccessException, InstantiationException { + List users = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao() + .getAuthenticated(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable() + .where(((builder, root) -> + builder.notEqual(root.get("status"), DMP.DMPStatus.DELETED.getValue()))), principal.getId(), Stream.of(0, 1).collect(Collectors.toList())) + .toList().stream().map(DMP::getUsers).flatMap(Collection::stream).map(UserDMP::getUser) + .filter(userInfo -> !userInfo.getId().equals(principal.getId())).filter(StreamDistinctBy.distinctByKey(UserInfo::getId)) + .filter(userInfo -> (userInfoRequestItem == null || userInfoRequestItem.getCriteria() == null || userInfoRequestItem.getCriteria().getLike() == null + || userInfo.getName().toLowerCase().contains(userInfoRequestItem.getCriteria().getLike().toLowerCase()) + || (userInfo.getEmail().toLowerCase().contains(userInfoRequestItem.getCriteria().getLike().toLowerCase())))) + .collect(Collectors.toList()); +// .where((builder, root) -> builder.like(builder.upper(root.get("name")), "%" + userInfoRequestItem.getCriteria().getLike().toUpperCase() + "%")) + + List userModels = users.stream().map(userInfo -> new UserInfoInvitationModel().fromDataModel(userInfo)).collect(Collectors.toList()); + return userModels; + } + public UUID assignUserAcceptedInvitation(UUID invitationID, Principal principal) throws UnauthorisedException, JAXBException, IOException { eu.eudat.data.entities.Invitation invitation = apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao().find(invitationID); if (invitation == null) From 9dc4d52f910c97438b6e10e1c08db35330a53a6f Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 23 Nov 2021 11:24:42 +0200 Subject: [PATCH 08/25] Fix issue with Dataset copy status --- .../app/ui/dataset/dataset-wizard/dataset-wizard.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts index be9129c88..27c543b6e 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts @@ -265,6 +265,7 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme this.lockService.checkLockStatus(data.id).pipe(takeUntil(this._destroyed)).subscribe(lockStatus => { this.lockStatus = lockStatus; this.datasetWizardModel = new DatasetWizardEditorModel().fromModel(data); + this.datasetWizardModel.status = 0; this.formGroup = this.datasetWizardModel.buildForm(); this.formGroup.get('id').setValue(null); this.dmpService.getSingle(newDmpId).pipe(map(data => data as DmpModel)) From 53e298f66a8eac0f6d8c7bea74c3fccfc1848cc5 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 23 Nov 2021 11:30:08 +0200 Subject: [PATCH 09/25] Fix issue with Dataset copy not working on the dataset listing --- .../eu/eudat/models/data/listingmodels/DatasetListingModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DatasetListingModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DatasetListingModel.java index 3f4ffcb38..45e751963 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DatasetListingModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DatasetListingModel.java @@ -196,7 +196,7 @@ public class DatasetListingModel implements DataModel Date: Tue, 23 Nov 2021 11:44:50 +0200 Subject: [PATCH 10/25] Add additional null check --- .../main/java/eu/eudat/elastic/repository/DmpRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java index 4d2a9cc90..6e18b0f88 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java @@ -119,7 +119,7 @@ public class DmpRepository extends ElasticRepository { } searchSourceBuilder.query(boolQuery).from(criteria.getOffset()).fetchSource("id", null); - if (criteria.getSize() > 0) { + if (criteria.getSize() != null && criteria.getSize() > 0) { searchSourceBuilder.size(criteria.getSize()); } sortBuilders.forEach(searchSourceBuilder::sort); From e546362f5845bd5fbefdda99c53bd16e0ff00064 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 23 Nov 2021 14:05:57 +0200 Subject: [PATCH 11/25] Fix issue with elasticsearch inconsistencies --- .../java/eu/eudat/controllers/Datasets.java | 14 ++++---- .../managers/DataManagementPlanManager.java | 36 ++++++++++++++++--- .../eudat/logic/managers/DatasetManager.java | 4 +++ .../eudat/logic/mapper/elastic/DmpMapper.java | 1 + 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java index ac1e98fa8..c1ffd67f1 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java @@ -39,11 +39,11 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.persistence.NoResultException; +import javax.transaction.Transactional; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -121,7 +121,7 @@ public class Datasets extends BaseController { // } } - @javax.transaction.Transactional + @Transactional @RequestMapping(method = RequestMethod.GET, value = {"{id}"}, produces = "application/json") public @ResponseBody ResponseEntity getSingle(@PathVariable String id, @RequestHeader("Content-Type") String contentType, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) throws IllegalAccessException, IOException, InstantiationException { @@ -246,7 +246,7 @@ public class Datasets extends BaseController { * Data Management * */ - @javax.transaction.Transactional + @Transactional @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") public @ResponseBody ResponseEntity> createOrUpdate(@RequestBody DatasetWizardModel profile, Principal principal) throws Exception { @@ -262,7 +262,7 @@ public class Datasets extends BaseController { return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message(this.getApiContext().getHelpersService().getMessageSource().getMessage("dataset.public", new Object[]{}, locale))); } - @javax.transaction.Transactional + @Transactional @RequestMapping(method = RequestMethod.DELETE, value = {"/delete/{id}"}, produces = "application/json") public @ResponseBody ResponseEntity> delete(@PathVariable(value = "id") UUID id, Principal principal) throws Exception { @@ -270,7 +270,7 @@ public class Datasets extends BaseController { return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Deleted")); } - @javax.transaction.Transactional + @Transactional @RequestMapping(method = RequestMethod.GET, value = {"/{id}/unlock"}, produces = "application/json") public @ResponseBody ResponseEntity> unlock(@PathVariable(value = "id") UUID id, Principal principal) throws Exception { @@ -318,7 +318,7 @@ public class Datasets extends BaseController { * Data Index * */ - @javax.transaction.Transactional + @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/index"}) public @ResponseBody ResponseEntity> generateIndex(Principal principal) throws Exception { @@ -326,7 +326,7 @@ public class Datasets extends BaseController { return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Generated").payload(null)); } - @javax.transaction.Transactional + @Transactional @RequestMapping(method = RequestMethod.DELETE, value = {"/index"}) public @ResponseBody ResponseEntity> clearIndex(Principal principal) throws Exception { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 3071a7510..fd8721a8b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -599,6 +599,9 @@ public class DataManagementPlanManager { datasets.add(dataset); } + UUID dmpId = result.getId(); + result.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); + this.updateIndex(result); return result; @@ -710,6 +713,8 @@ public class DataManagementPlanManager { DatasetCriteria criteria1 = new DatasetCriteria(); criteria1.setDmpIds(Collections.singletonList(newDmp.getId())); newDmp.setDataset(new HashSet<>(databaseRepository.getDatasetDao().getWithCriteria(criteria1).toList())); + UUID dmpId = newDmp.getId(); + newDmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); this.updateIndex(newDmp); metricsManager.increaseValue(MetricNames.DMP, 1, MetricNames.DRAFT); @@ -740,12 +745,16 @@ public class DataManagementPlanManager { } oldDmp.setStatus(DMP.DMPStatus.DELETED.getValue()); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(oldDmp); + UUID dmpId = oldDmp.getId(); + oldDmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); this.updateIndex(oldDmp); DataManagementPlanCriteria criteria1 = new DataManagementPlanCriteria(); criteria1.setAllVersions(true); criteria1.setGroupIds(Collections.singletonList(oldDmp.getGroupId())); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria1).toList().forEach(dmp -> { try { + UUID tdmpId = dmp.getId(); + dmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), tdmpId)).toList())); this.updateIndex(dmp); } catch (IOException e) { logger.error(e.getMessage(), e); @@ -757,6 +766,7 @@ public class DataManagementPlanManager { if (elastic != null) { tags = elastic.getTags(); } + dataset.setDmp(dmp); this.datasetManager.updateTags(dataset, tags); } catch (Exception e) { logger.error(e.getMessage(), e); @@ -891,7 +901,8 @@ public class DataManagementPlanManager { if (elastic != null) { tags = elastic.getTags(); } - + UUID dmpId = tempDataset.getDmp().getId(); + tempDataset.getDmp().setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); this.datasetManager.updateTags(tempDataset, tags); } catch (Exception e) { logger.error(e.getMessage(), e); @@ -1008,6 +1019,8 @@ public class DataManagementPlanManager { throw new Exception("DMP is not finalized"); dmp.setPublic(true); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); + UUID dmpId = dmp.getId(); + dmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); this.updateIndex(dmp); metricsManager.increaseValue(MetricNames.DMP, 1, MetricNames.PUBLISHED); DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); @@ -1021,6 +1034,8 @@ public class DataManagementPlanManager { if (elastic != null) { tags = elastic.getTags(); } + UUID tmdmpId = dataset.getDmp().getId(); + dataset.getDmp().setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), tmdmpId)).toList())); this.datasetManager.updateTags(dataset, tags); metricsManager.increaseValue(MetricNames.DATASET, 1, MetricNames.PUBLISHED); } catch (Exception e) { @@ -1106,6 +1121,8 @@ public class DataManagementPlanManager { } dmp.setStatus(DMP.DMPStatus.FINALISED.getValue()); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); + UUID dmpId = dmp.getId(); + dmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); this.updateIndex(dmp); UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); sendNotification(dmp, user, NotificationType.DMP_FINALISED); @@ -1124,6 +1141,8 @@ public class DataManagementPlanManager { throw new Exception("DMP is already Active"); dmp.setStatus(DMP.DMPStatus.ACTIVE.getValue()); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); + UUID dmpId = dmp.getId(); + dmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); this.updateIndex(dmp); metricsManager.decreaseValue(MetricNames.DMP, 1, MetricNames.FINALIZED); metricsManager.increaseValue(MetricNames.DMP, 1, MetricNames.DRAFT); @@ -1733,6 +1752,8 @@ public class DataManagementPlanManager { databaseRepository.getDmpDao().createOrUpdate(dmp); assignUser(dmp, me); if (this.apiContext.getOperationsContext().getElasticRepository().getDmpRepository().getClient() != null) { + UUID dmpId = dmp.getId(); + dmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); this.updateIndex(dmp); } dmp.getDataset().forEach(dataset -> { @@ -1755,13 +1776,13 @@ public class DataManagementPlanManager { try { List tags = new ArrayList<>(); eu.eudat.elastic.entities.Dataset elastic = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString()); + DatasetWizardModel datasetWizardModel = new DatasetWizardModel().fromDataModel(dataset); if (elastic != null) { tags = elastic.getTags(); - DatasetWizardModel datasetWizardModel = new DatasetWizardModel().fromDataModel(dataset); datasetWizardModel.setTags(tags); - datasetManager.getTagsFromProfile(datasetWizardModel, dataset); - datasetManager.updateTags(dataset, datasetWizardModel.getTags()); } + datasetManager.getTagsFromProfile(datasetWizardModel, dataset); + datasetManager.updateTags(dataset, datasetWizardModel.getTags()); } catch (Exception e) { logger.error(e.getMessage(), e); } @@ -1824,6 +1845,9 @@ public class DataManagementPlanManager { try { if (dmp.getUsers() != null) { logger.info(dmp.getUsers().toString()); + } else { + UUID dmpId = dmp.getId(); + dmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); } this.updateIndex(dmp); } catch (IOException e) { @@ -1841,6 +1865,8 @@ public class DataManagementPlanManager { if (elastic != null) { tags = elastic.getTags(); } + UUID dmpId = dataset.getDmp().getId(); + dataset.getDmp().setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); this.datasetManager.updateTags(dataset, tags); } catch (Exception e) { logger.error(e.getMessage(), e); @@ -1861,6 +1887,8 @@ public class DataManagementPlanManager { List dmps = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable().toList(); dmps.forEach(dmp -> { try { + UUID dmpId = dmp.getId(); + dmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); this.updateIndex(dmp); } catch (IOException e) { logger.error(e.getMessage(), e); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index 05040a91a..902fc4335 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -598,6 +598,8 @@ public class DatasetManager { } dataset1.setProfile(this.apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(datasetWizardModel.getProfile().getId())); // datasetWizardModel.setDatasetProfileDefinition(getPagedProfile(datasetWizardModel, dataset1)); + UUID dmpId = dataset1.getDmp().getId(); + dataset1.getDmp().setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); updateTags(dataset1, datasetWizardModel.getTags()); if (sendNotification) { if (dataset1.getStatus() != Dataset.Status.FINALISED.getValue()) { @@ -1014,6 +1016,8 @@ public class DatasetManager { datasetEntities.forEach(datasetEntity -> { try { eu.eudat.elastic.entities.Dataset dataset = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(datasetEntity.getId().toString()); + UUID dmpId = datasetEntity.getDmp().getId(); + datasetEntity.getDmp().setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); updateTags(datasetEntity, dataset != null ? dataset.getTags() : null); } catch (Exception e) { logger.error(e.getMessage(), e); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java index 92eb02bfe..cd0961ae5 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java @@ -67,6 +67,7 @@ public class DmpMapper { if (dataset1 != null) { tags = dataset1.getTags(); } + dataset.setDmp(dmp); return datasetMapper.toElastic(dataset, tags); } catch (Exception e) { logger.error(e.getMessage(), e); From fc71e95cf3d1facd298d3ddbdf400a2e769d9d92 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 24 Nov 2021 16:23:02 +0200 Subject: [PATCH 12/25] Make dataset queries to return distinct results (avoid duplicate Id issues) --- .../main/java/eu/eudat/controllers/DashBoardController.java | 1 + .../main/java/eu/eudat/logic/managers/DashBoardManager.java | 6 ++++-- .../eu/eudat/logic/managers/DataManagementPlanManager.java | 5 +++-- .../main/java/eu/eudat/logic/managers/DatasetManager.java | 4 ++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java index 0e3e7d936..6041f865c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java @@ -54,6 +54,7 @@ public class DashBoardController extends BaseController { return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); } + @Deprecated @RequestMapping(method = RequestMethod.GET, value = {"/user/recentActivity"}, produces = "application/json") public ResponseEntity> getRecentActivity(@RequestParam(name = "numOfActivities", required = false, defaultValue = "5") Integer numberOfActivities, Principal principal) { RecentActivity statistics = dashBoardManager.getRecentActivity(principal, numberOfActivities); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index 29eb08cd4..9c504d9e9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -152,7 +152,7 @@ public class DashBoardManager { if ((dmps == null || dmps == 0L) && (datasets == null || datasets == 0L)) { CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId(), roles).distinct().countAsync() .whenComplete((dmpsStats, throwable) -> statistics.setTotalDataManagementPlanCount(dmpsStats)); - CompletableFuture datasetFuture = datasetRepository.getAuthenticated( datasetRepository.getWithCriteria(datasetCriteria), user, roles).countAsync() + CompletableFuture datasetFuture = datasetRepository.getAuthenticated( datasetRepository.getWithCriteria(datasetCriteria), user, roles).distinct().countAsync() .whenComplete((datasetsStats, throwable) -> statistics.setTotalDataSetCount(datasetsStats)); CompletableFuture.allOf(dmpFuture, datasetFuture).join(); } else { @@ -168,6 +168,7 @@ public class DashBoardManager { return statistics; } + @Deprecated public RecentActivity getRecentActivity(Principal principal, Integer numberofactivities) { RecentActivity activity = new RecentActivity(); DMPDao dataManagementPlanRepository = databaseRepository.getDmpDao(); @@ -190,7 +191,7 @@ public class DashBoardManager { .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build()) .whenComplete((dmpActivities, throwable) -> activity.setRecentDmpActivities(dmpActivities)); - CompletableFuture> datasets = datasetRepository.getAuthenticated(datasetRepository.getWithCriteria(datasetCriteria), user, roles) + CompletableFuture> datasets = datasetRepository.getAuthenticated(datasetRepository.getWithCriteria(datasetCriteria), user, roles).distinct() .withHint("datasetRecentActivity") .orderBy((builder, root) -> builder.desc(root.get("modified"))) .take(numberofactivities) @@ -334,6 +335,7 @@ public class DashBoardManager { List recentDatasetModels = datasetList .withHint(HintedModelFactory.getHint(DatasetListingModel.class)) + .distinct() .select(item -> new RecentDatasetModel().fromEntity(item)); recentActivityModels.addAll(recentDatasetModels); }/*);*/ diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index fd8721a8b..72e7b082e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -185,6 +185,7 @@ public class DataManagementPlanManager { dataTable.setData(dmps1.stream().map(dmp -> { DatasetCriteria datasetCriteria = new DatasetCriteria(); datasetCriteria.setDmpIds(Collections.singletonList(dmp.getId())); + datasetCriteria.setAllVersions(false); dmp.setDataset(retrieveRelevantDatasets(datasetCriteria, principalID)); @@ -250,14 +251,14 @@ public class DataManagementPlanManager { roles.add(1); datasetItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getAuthenticated(datasetItems, userInfo, roles); } - Long maxDatasets = datasetItems.count(); + Long maxDatasets = datasetItems.distinct().count(); DatasetTableRequest datasetTableRequest = new DatasetTableRequest(); datasetTableRequest.setOffset(0); datasetTableRequest.setLength(3); Set datasetsSet = new LinkedHashSet<>(); try { datasetItems = PaginationManager.applyPaging(datasetItems, datasetTableRequest); - List datasets = datasetItems.toList(); + List datasets = datasetItems.distinct().toList(); datasetsSet.addAll(datasets); for (int i = 0; i < maxDatasets - datasets.size(); i++) { Dataset fakedataset = new Dataset(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index 902fc4335..685632c7f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -210,9 +210,9 @@ public class DatasetManager { DataTableData dataTable = new DataTableData<>(); - dataTable.setData(pagedItems.select(this::mapModel).stream().filter(Objects::nonNull).collect(Collectors.toList())); + dataTable.setData(pagedItems.distinct().select(this::mapModel).stream().filter(Objects::nonNull).collect(Collectors.toList())); - dataTable.setTotalCount(authItems.count()); + dataTable.setTotalCount(authItems.distinct().count()); //CompletableFuture.allOf(itemsFuture, countFuture).join(); return dataTable; From 8524bce2e0fa7e1611627af45c9c4be582c87ded Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 24 Nov 2021 16:41:01 +0200 Subject: [PATCH 13/25] Add support for the exported date format on wordBuilder --- .../utilities/documents/word/WordBuilder.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index 4fcc9a5d0..5e8ed45e7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -25,9 +25,12 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.math.BigInteger; +import java.text.SimpleDateFormat; import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.temporal.TemporalAccessor; import java.util.*; import java.util.stream.Collectors; @@ -352,8 +355,15 @@ public class WordBuilder { if (field.getValue() == null || field.getValue().equals("false")) return null; return data.getLabel(); case "datepicker": - case "datePicker": - return field.getValue() != null ? DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()).format(Instant.parse((String)field.getValue())) : ""; + case "datePicker":{ + Instant instant; + try { + instant = Instant.parse((String) field.getValue()); + } catch (DateTimeParseException ex) { + instant = (Instant) DateTimeFormatter.ofPattern("yyyy-MM-dd").parse((String)field.getValue()); + } + return field.getValue() != null ? DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()).format(instant) : ""; + } case "freetext": case "textarea": case "richTextarea": From aed23a655b315542fa8a2bf032dc2cc7e7e428f2 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 24 Nov 2021 18:14:24 +0200 Subject: [PATCH 14/25] When exporting DMP to xml or json get only the active/finalized datasets and not the deleted ones --- .../java/eu/eudat/logic/managers/DataManagementPlanManager.java | 2 +- .../src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 72e7b082e..23853796a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1344,7 +1344,7 @@ public class DataManagementPlanManager { 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 datasets = dmp.getDataset().stream().collect(Collectors.toList()); + List datasets = dmp.getDataset().stream().filter(dataset -> dataset.getStatus() != Dmp.DMPStatus.DELETED.getValue()).collect(Collectors.toList()); /*String fileName = dmp.getLabel(); fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", "");*/ String uuid = UUID.randomUUID().toString(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java index 5a3574a33..700f0bfda 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java @@ -95,7 +95,7 @@ public class DmpRDAMapper { rda.getContributor().addAll(dmp.getResearchers().stream().map(ContributorRDAMapper::toRDA).collect(Collectors.toList())); } // rda.getContributor().addAll(dmp.getUsers().stream().map(ContributorRDAMapper::toRDA).collect(Collectors.toList())); - rda.setDataset(dmp.getDataset().stream().map(dataset -> datasetRDAMapper.toRDA(dataset, rda.getContributor())).collect(Collectors.toList())); + rda.setDataset(dmp.getDataset().stream().filter(dataset -> dataset.getStatus() != eu.eudat.elastic.entities.Dmp.DMPStatus.DELETED.getValue()).map(dataset -> datasetRDAMapper.toRDA(dataset, rda.getContributor())).collect(Collectors.toList())); rda.setProject(Collections.singletonList(ProjectRDAMapper.toRDA(dmp.getProject(), dmp.getGrant()))); rda.setAdditionalProperty("templates", dmp.getAssociatedDmps().stream().map(datasetProfile -> datasetProfile.getId().toString()).toArray()); return rda; From 19aa2bd4113a4bd7b261c46ca8a0504e718f539c Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 25 Nov 2021 16:45:29 +0200 Subject: [PATCH 15/25] Fix critical issue with public datasets --- .../main/java/eu/eudat/logic/managers/DashBoardManager.java | 3 +-- .../eu/eudat/logic/managers/DataManagementPlanManager.java | 1 + .../main/java/eu/eudat/logic/managers/DatasetManager.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index 9c504d9e9..3dc89f416 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -313,7 +313,7 @@ public class DashBoardManager { roles.add(UserDMP.UserDMPRoles.USER.getValue()); roles.add(UserDMP.UserDMPRoles.OWNER.getValue()); dmpList = dataManagementPlanRepository.getAuthenticated(dmpList, principal.getId(), roles); - datasetList = datasetRepository.getAuthenticated(datasetList, user, roles); + datasetList = datasetRepository.getAuthenticated(datasetList, user, roles).distinct(); } @@ -335,7 +335,6 @@ public class DashBoardManager { List recentDatasetModels = datasetList .withHint(HintedModelFactory.getHint(DatasetListingModel.class)) - .distinct() .select(item -> new RecentDatasetModel().fromEntity(item)); recentActivityModels.addAll(recentDatasetModels); }/*);*/ diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 23853796a..b8c4ccf0d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -186,6 +186,7 @@ public class DataManagementPlanManager { DatasetCriteria datasetCriteria = new DatasetCriteria(); datasetCriteria.setDmpIds(Collections.singletonList(dmp.getId())); datasetCriteria.setAllVersions(false); + datasetCriteria.setIsPublic(dataManagementPlanTableRequest.getCriteria().getIsPublic()); dmp.setDataset(retrieveRelevantDatasets(datasetCriteria, principalID)); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index 685632c7f..4cb98b59b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -192,7 +192,7 @@ public class DatasetManager { if (datasetTableRequest.getCriteria().getRole() != null) { roles.add(datasetTableRequest.getCriteria().getRole()); } - authItems = databaseRepository.getDatasetDao().getAuthenticated(items, userInfo, roles); + authItems = databaseRepository.getDatasetDao().getAuthenticated(items, userInfo, roles).distinct(); pagedItems = PaginationManager.applyPaging(authItems, datasetTableRequest); } else { if (principal.getId() != null && datasetTableRequest.getCriteria().getRole() != null) { @@ -210,9 +210,9 @@ public class DatasetManager { DataTableData dataTable = new DataTableData<>(); - dataTable.setData(pagedItems.distinct().select(this::mapModel).stream().filter(Objects::nonNull).collect(Collectors.toList())); + dataTable.setData(pagedItems.select(this::mapModel).stream().filter(Objects::nonNull).collect(Collectors.toList())); - dataTable.setTotalCount(authItems.distinct().count()); + dataTable.setTotalCount(authItems.count()); //CompletableFuture.allOf(itemsFuture, countFuture).join(); return dataTable; From 6ce7fec0591ff5da846f58172de9c37bb569ac34 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 29 Nov 2021 11:27:59 +0200 Subject: [PATCH 16/25] Fix critical issue with multiAutoComplete on autocomplete field types --- .../data/components/commons/datafield/AutoCompleteData.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java index ca430e294..e4e5fcf94 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java @@ -95,14 +95,14 @@ public class AutoCompleteData extends ComboBoxData { this.autoCompleteSingleDataList.add(new AutoCompleteSingleData()); this.mapFromXml(item, this.autoCompleteSingleDataList.get(0)); } - this.multiAutoComplete = Boolean.parseBoolean(item.getAttribute("multiAutocomplete")); + this.multiAutoComplete = Boolean.parseBoolean(item.getAttribute("multiAutoComplete")); return this; } private void mapFromXml(Element item, AutoCompleteSingleData singleData) { singleData.url = item.getAttribute("url"); singleData.optionsRoot = item.getAttribute("optionsRoot"); - this.multiAutoComplete = Boolean.parseBoolean(item.getAttribute("multiAutocomplete")); + this.multiAutoComplete = Boolean.parseBoolean(item.getAttribute("multiAutoComplete")); if (item.getAttribute("autoCompleteType") == null || item.getAttribute("autoCompleteType").equals("") ) { singleData.autocompleteType = AutocompleteType.UNCACHED.getValue(); } else { @@ -173,7 +173,7 @@ public class AutoCompleteData extends ComboBoxData { dataMap.put("label", item != null ? item.getAttribute("label") : ""); //dataMap.put("url", item != null ? item.getAttribute("url") : ""); dataMap.put("type", item != null ? item.getAttribute("type") : "autocomplete"); - dataMap.put("multiAutoComplete", item != null ? Boolean.valueOf(item.getAttribute("multiAutocomplete")) : false); + dataMap.put("multiAutoComplete", item != null ? Boolean.valueOf(item.getAttribute("multiAutoComplete")) : false); List> autoCompletes = new ArrayList<>(); NodeList autoCompleteSingles = item.getChildNodes(); for (int i = 0; i < autoCompleteSingles.getLength(); i++) { From e165259c81abdd5f5bc792d421cbc3272eee1da3 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 29 Nov 2021 17:26:29 +0200 Subject: [PATCH 17/25] Fix and improve remote fetcher caching --- .../eudat/cache/ExternalUrlsKeyGenerator.java | 22 +++++++++++++++++++ .../java/eu/eudat/cache/ResponsesCache.java | 6 +++++ .../proxy/config/ExternalUrlCriteria.java | 12 ++++++++++ .../logic/proxy/fetching/RemoteFetcher.java | 20 ++++++++--------- 4 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/cache/ExternalUrlsKeyGenerator.java diff --git a/dmp-backend/web/src/main/java/eu/eudat/cache/ExternalUrlsKeyGenerator.java b/dmp-backend/web/src/main/java/eu/eudat/cache/ExternalUrlsKeyGenerator.java new file mode 100644 index 000000000..544b8ffad --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/cache/ExternalUrlsKeyGenerator.java @@ -0,0 +1,22 @@ +package eu.eudat.cache; + +import eu.eudat.logic.proxy.config.ExternalUrlCriteria; +import org.springframework.cache.interceptor.KeyGenerator; + +import java.lang.reflect.Method; + +public class ExternalUrlsKeyGenerator implements KeyGenerator { + @Override + public Object generate(Object o, Method method, Object... params) { + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append(o.getClass().getSimpleName()).append("_"); + stringBuffer.append(method.getName()).append("_"); + for (Object param: params) { + if (param instanceof ExternalUrlCriteria) { + ExternalUrlCriteria externalUrlCriteria = (ExternalUrlCriteria) param; + stringBuffer.append(externalUrlCriteria); + } + } + return stringBuffer.toString(); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java b/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java index 427b61173..80da105bc 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java +++ b/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java @@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.caffeine.CaffeineCache; +import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.cache.support.SimpleCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @@ -47,4 +48,9 @@ public class ResponsesCache { return simpleCacheManager; } + @Bean(name = "externalUrlsKeyGenerator") + private KeyGenerator externalUrlsKeyGenerator() { + return new ExternalUrlsKeyGenerator(); + } + } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrlCriteria.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrlCriteria.java index 5d837eea2..a982067c1 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrlCriteria.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrlCriteria.java @@ -58,4 +58,16 @@ public class ExternalUrlCriteria { public ExternalUrlCriteria() { } + + @Override + public String toString() { + return "{" + + "like='" + like + '\'' + + ", page='" + page + '\'' + + ", pageSize='" + pageSize + '\'' + + ", funderId='" + funderId + '\'' + + ", path='" + path + '\'' + + ", host='" + host + '\'' + + '}'; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java index 1ad74110a..54fc21aee 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java @@ -41,7 +41,7 @@ public class RemoteFetcher { this.configLoader = configLoader; } - @Cacheable("repositories") + @Cacheable(value = "repositories", keyGenerator = "externalUrlsKeyGenerator") public List> getRepositories(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getRepositories().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) @@ -50,28 +50,28 @@ public class RemoteFetcher { return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } - @Cacheable("grants") + @Cacheable(value = "grants", keyGenerator = "externalUrlsKeyGenerator") public List> getGrants(ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { List urlConfigs = configLoader.getExternalUrls().getGrants().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getGrants().getFetchMode(); return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } - @Cacheable("projects") + @Cacheable(value = "projects", keyGenerator = "externalUrlsKeyGenerator") public List> getProjects(ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { List urlConfigs = configLoader.getExternalUrls().getProjects().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getProjects().getFetchMode(); return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } - @Cacheable("funders") + @Cacheable(value = "funders", keyGenerator = "externalUrlsKeyGenerator") public List> getFunders(ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { List urlConfigs = configLoader.getExternalUrls().getFunders().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getFunders().getFetchMode(); return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } - @Cacheable("organisations") + @Cacheable(value = "organisations", keyGenerator = "externalUrlsKeyGenerator") public List> getOrganisations(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getOrganisations().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) @@ -80,7 +80,7 @@ public class RemoteFetcher { return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } - @Cacheable("registries") + @Cacheable(value = "registries", keyGenerator = "externalUrlsKeyGenerator") public List> getRegistries(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getRegistries().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) @@ -89,7 +89,7 @@ public class RemoteFetcher { return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } - @Cacheable("services") + @Cacheable(value = "services", keyGenerator = "externalUrlsKeyGenerator") public List> getServices(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getServices().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) @@ -98,7 +98,7 @@ public class RemoteFetcher { return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } - @Cacheable("researchers") + @Cacheable(value = "researchers", keyGenerator = "externalUrlsKeyGenerator") public List> getResearchers(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getResearchers().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) @@ -116,7 +116,7 @@ public class RemoteFetcher { return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); }*/ - @Cacheable("externalDatasets") + @Cacheable(value = "externalDatasets", keyGenerator = "externalUrlsKeyGenerator") public List> getDatasets(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getDatasets().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) @@ -125,7 +125,7 @@ public class RemoteFetcher { return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } - @Cacheable("licenses") + @Cacheable(value = "licenses", keyGenerator = "externalUrlsKeyGenerator") public List> getlicenses(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getLicenses().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) From b7d622e330ccb36fe5bda0e1c6d33e72550bf81e Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Tue, 30 Nov 2021 12:21:03 +0200 Subject: [PATCH 18/25] #7225: In dataset template, rename "users" to "editors" and add hint | #7226: In dataset templates, default descending sorting by "created". 1. dataset-profile-listing.component.html: #7226: In added matSortActive="created" matSortDirection="desc". 2. dataset-profile-editor.component.html: #7225: Added hint in section 1.4 to make prominent when the new editors will receive an informative email. 3. assets/i18n/: #7225: In every language file, renamed "users" to "editors" (DATASET-TEMPLATE-USERS, DATASET-TEMPLATE-REMOVE-USER, DATASET-TEMPLATE-NO-USERS-YET, DATASET-TEMPLATE-VALIDATE-AND-ADD-USER) and added DATASET-TEMPLATE-USERS-HINT. --- .../dataset-profile-editor.component.html | 17 +++++++++-------- .../dataset-profile-listing.component.html | 2 +- dmp-frontend/src/assets/i18n/de.json | 9 +++++---- dmp-frontend/src/assets/i18n/en.json | 9 +++++---- dmp-frontend/src/assets/i18n/es.json | 15 ++++++++------- dmp-frontend/src/assets/i18n/gr.json | 9 +++++---- dmp-frontend/src/assets/i18n/pt.json | 9 +++++---- dmp-frontend/src/assets/i18n/sk.json | 9 +++++---- dmp-frontend/src/assets/i18n/sr.json | 9 +++++---- dmp-frontend/src/assets/i18n/tr.json | 9 +++++---- 10 files changed, 53 insertions(+), 44 deletions(-) diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html index 59acb45c5..3b4d633c5 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html @@ -21,14 +21,14 @@ {{'DATASET-PROFILE-EDITOR.TITLE.NEW-PROFILE-VERSION' | translate}} {{form.get('label').value}} - +

{{form.get('label').value}}

1.3 {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-LANGUAGE'| translate}} *
@@ -186,6 +186,7 @@
1.4 {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-USERS'| translate}}
+
{{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-USERS-HINT'| translate}}
@@ -212,7 +213,7 @@
- +
@@ -222,7 +223,7 @@
- +
- + - + diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index e1dff9949..927a98f10 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index ae8af2e0b..ea7c76aea 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index ee158ee03..5bf81b680 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -84,7 +84,7 @@ "JSON-FILES": "ficheros .json", "PRODUCED": "producido", "RDA-SPECIFICATIONS": "de acuerdo a las especificaciones RDA", - "MACHINE-ACTIONABLE": "para PGDs procesables por máquinas", + "MACHINE-ACTIONABLE": "para PGDs procesables por máquinas", "UPLOAD-FILE": "Subir fichero", "REPLACE-FILE": "Reemplar ichero" }, @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "Una breve descripción acerca del Dataset, su alcance y objetivos.", "DATASET-TEMPLATE-LANGUAGE": "Idioma de la plantilla del Dataset", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Seleccione un idioma", - "DATASET-TEMPLATE-USERS": "Usuarios", - "DATASET-TEMPLATE-NO-USERS-YET": "... Aún no hay usuarios", - "DATASET-TEMPLATE-REMOVE-USER": "Eliminar usuario", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validar y añadir usuario", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Descripción de la plantilla del Dataset", "UNTITLED": "Sin título", "QUESTION": "Pregunta", @@ -431,7 +432,7 @@ "FIELD-MULTIPLE-AUTOCOMPLETE": "Autocompeltado múltiple", "FIELD-MULTIPLE-WORDLIST": "Selección múltiple", "FIELD-CURRENCY-TITLE": "Datos de moneda", - "FIELD-CURRENCY-PLACEHOLDER": "Introduzca marcador del texto", + "FIELD-CURRENCY-PLACEHOLDER": "Introduzca marcador del texto", "FIELD-REGISTRIES-TITLE": "Datos de registros", "FIELD-REGISTRIES-PLACEHOLDER": "Introduzca marcador del texto", "FIELD-SERVICES-TITLE": "Datos de servicios", @@ -1240,7 +1241,7 @@ "EXTERNAL-LINK": "Facilite una URL" }, "HINT": { - "DESCRIPTION": "Describa brevemente el contexto y propósito del Dataset", + "DESCRIPTION": "Describa brevemente el contexto y propósito del Dataset", "TITLE": "Una breve descripción sobre el ", "TITLE-REST": " su alcance y objetivos." }, diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 264f52dd3..5ba205304 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index 53e7b1c83..76503ef92 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "Uma breve descrição do que é o modelo de dados, o seu âmbito e objetivos.", "DATASET-TEMPLATE-LANGUAGE": "Idioma do modelo de dados", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Selecione o idioma", - "DATASET-TEMPLATE-USERS": "Utilizadores", - "DATASET-TEMPLATE-REMOVE-USER": "Remover Utilizador", - "DATASET-TEMPLATE-NO-USERS-YET": "... Ainda sem utilizadores", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validar e adicionar utilizador", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Descrição do modelo de dados", "UNTITLED": "Sem título", "QUESTION": "Questão", diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index f659c6741..3a8726434 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index ead608601..be76fe7be 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 165c783ac..05590c73d 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", From b2825c836936b8e0bf15015d1f401524281ec447 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 2 Dec 2021 18:03:31 +0200 Subject: [PATCH 19/25] Fix issue with parsing some custom auto complete sources --- .../logic/managers/DatasetProfileManager.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java index 35502693f..ee4bbd793 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java @@ -176,7 +176,7 @@ public class DatasetProfileManager { response = restTemplate.exchange(url, HttpMethod.GET, entity, Object.class); jsonContext = JsonPath.parse(response.getBody()); jsonItems = jsonContext.read(singleData.getOptionsRoot() + "['" + singleData.getAutoCompleteOptions().getLabel() + "','" + singleData.getAutoCompleteOptions().getValue() + "','" + singleData.getAutoCompleteOptions().getSource() + "','" + "uri" + "']"); - jsonItems.forEach(item -> result.add(new ExternalAutocompleteFieldModel(item.get(singleData.getAutoCompleteOptions().getValue()), item.get(singleData.getAutoCompleteOptions().getLabel()), item.get(singleData.getAutoCompleteOptions().getSource()) != null ? item.get(singleData.getAutoCompleteOptions().getSource()) : singleData.getAutoCompleteOptions().getSource(), item.get("uri")))); + jsonItems.forEach(item -> result.add(new ExternalAutocompleteFieldModel(parseItem(item.get(singleData.getAutoCompleteOptions().getValue())), parseItem(item.get(singleData.getAutoCompleteOptions().getLabel())), item.get(singleData.getAutoCompleteOptions().getSource()) != null ? parseItem(item.get(singleData.getAutoCompleteOptions().getSource())) : singleData.getAutoCompleteOptions().getSource(), parseItem(item.get("uri"))))); break; case CACHED: headers.setAccept(Collections.singletonList(MediaType.valueOf("text/plain; charset=utf-8"))); @@ -202,6 +202,20 @@ public class DatasetProfileManager { //return result; } + private String parseItem(Object item) { + if (item instanceof String) { + return (String) item; + } + if (item instanceof List) { + List listedItems = (List) item; + return parseItem(listedItems.get(0)); + } + if (item instanceof Map) { + return (String) ((Map)item).get("$"); + } + return item.toString(); + } + public ResponseEntity getDocument(eu.eudat.models.data.user.composite.DatasetProfile datasetProfile, String label) throws IllegalAccessException, IOException, InstantiationException { FileEnvelope envelope = getXmlDocument(datasetProfile, label); InputStream resource = new FileInputStream(envelope.getFile()); From de4c430d911ccfc47cfdc48d4f99e598d542c3f9 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 3 Dec 2021 16:49:23 +0200 Subject: [PATCH 20/25] Fix issue with related datasets on dashboard --- .../main/java/eu/eudat/logic/managers/DashBoardManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index 3dc89f416..5b5bf2d0f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -325,9 +325,11 @@ public class DashBoardManager { recentActivityModels.addAll(dmps1.stream().map(dmp -> { DatasetCriteria datasetCriteria1 = new DatasetCriteria(); datasetCriteria1.setDmpIds(Collections.singletonList(dmp.getId())); + datasetCriteria1.setAllVersions(false); if (isAuthenticated) { dmp.setDataset(retrieveRelevantDatasets(datasetCriteria1, principal.getId())); } else { + datasetCriteria1.setIsPublic(true); dmp.setDataset(retrieveRelevantDatasets(datasetCriteria1)); } return new RecentDmpModel().fromDataModel(dmp); @@ -447,14 +449,14 @@ public class DashBoardManager { roles.add(1); datasetItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getAuthenticated(datasetItems, userInfo, roles); } - Long maxDatasets = datasetItems.count(); + Long maxDatasets = datasetItems.distinct().count(); DatasetTableRequest datasetTableRequest = new DatasetTableRequest(); datasetTableRequest.setOffset(0); datasetTableRequest.setLength(3); Set datasetsSet = new LinkedHashSet<>(); try { datasetItems = PaginationManager.applyPaging(datasetItems, datasetTableRequest); - List datasets = datasetItems.toList(); + List datasets = datasetItems.distinct().toList(); datasetsSet.addAll(datasets); for (int i = 0; i < maxDatasets - datasets.size(); i++) { Dataset fakedataset = new Dataset(); From 197de17aa56ad89c1108097251e047e5da37099c Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Mon, 6 Dec 2021 15:32:38 +0200 Subject: [PATCH 21/25] no message --- .../main/java/eu/eudat/logic/managers/MetricsManager.java | 6 ++++++ .../web/src/main/java/eu/eudat/types/MetricNames.java | 1 + 2 files changed, 7 insertions(+) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java index 03a153947..8fe25d561 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java @@ -109,6 +109,9 @@ public class MetricsManager { {MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them during Nexus").labelNames("status").register(registry.getPrometheusRegistry())} + {MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.INSTALLATIONS).help("Number of Installations").register(registry.getPrometheusRegistry())}, + {MetricNames.NEXUS + MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.NEXUS + MetricNames.INSTALLATIONS).help("Number of Installations").register(registry.getPrometheusRegistry())}, + }).collect(Collectors.toMap(data -> (String)data[0], data -> (Gauge) data[1])); } @@ -172,6 +175,9 @@ public class MetricsManager { long files = Files.list(Paths.get(this.environment.getProperty("userguide.path"))).count(); calculateValue(MetricNames.LANGUAGES, (int) files, null); + calculateValue(MetricNames.INSTALLATIONS, 1, null); + calculateValue(MetricNames.NEXUS + MetricNames.INSTALLATIONS, 1, null); + logger.info("Metrics calculation Completed"); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java b/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java index 20d8c0c52..a1d7dab89 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java +++ b/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java @@ -2,6 +2,7 @@ package eu.eudat.types; public class MetricNames { public static final String DATASET_TEMPLATE = "argos_dataset_templates"; + public static final String INSTALLATIONS = "installations"; public static final String USERS = "argos_users"; public static final String DMP = "argos_managed_dmps"; public static final String DATASET = "argos_managed_dataset_descriptions"; From 2cb985c23c4ceda99efc78bcc8e77b3eceeb0bcf Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Tue, 7 Dec 2021 16:52:49 +0200 Subject: [PATCH 22/25] bug fix --- .../src/main/java/eu/eudat/logic/managers/MetricsManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java index 8fe25d561..aa356d1a0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java @@ -107,7 +107,7 @@ public class MetricsManager { {MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them").labelNames("status").register(registry.getPrometheusRegistry())}, - {MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them during Nexus").labelNames("status").register(registry.getPrometheusRegistry())} + {MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them during Nexus").labelNames("status").register(registry.getPrometheusRegistry())}, {MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.INSTALLATIONS).help("Number of Installations").register(registry.getPrometheusRegistry())}, {MetricNames.NEXUS + MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.NEXUS + MetricNames.INSTALLATIONS).help("Number of Installations").register(registry.getPrometheusRegistry())}, From 33784f3ee2dfaaab7cd734f510b538226650a825 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 7 Dec 2021 17:16:22 +0200 Subject: [PATCH 23/25] Add missing null check up --- .../java/eu/eudat/logic/managers/DatasetProfileManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java index ee4bbd793..70edaa08e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java @@ -213,7 +213,7 @@ public class DatasetProfileManager { if (item instanceof Map) { return (String) ((Map)item).get("$"); } - return item.toString(); + return item != null ? item.toString() : null; } public ResponseEntity getDocument(eu.eudat.models.data.user.composite.DatasetProfile datasetProfile, String label) throws IllegalAccessException, IOException, InstantiationException { From 17b72cde603053b5cc21865ef8302eb28ce4e8ac Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 8 Dec 2021 16:42:16 +0200 Subject: [PATCH 24/25] Fix issue with time parsing --- .../eu/eudat/logic/utilities/documents/word/WordBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index 5e8ed45e7..97eb201db 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -360,7 +360,7 @@ public class WordBuilder { try { instant = Instant.parse((String) field.getValue()); } catch (DateTimeParseException ex) { - instant = (Instant) DateTimeFormatter.ofPattern("yyyy-MM-dd").parse((String)field.getValue()); + instant = Instant.from(DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()).parse((String)field.getValue())); } return field.getValue() != null ? DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()).format(instant) : ""; } From 78688420d295c995b8801b90a64c142b3d64c31a Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 9 Dec 2021 15:11:07 +0200 Subject: [PATCH 25/25] Fix minor issue with elastic date parsing --- .../src/main/java/eu/eudat/elastic/entities/Dmp.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java index 547c23e25..a7ca04c6a 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java @@ -317,8 +317,12 @@ public class Dmp implements ElasticEntity { if (fields.get(MapKey.GRANTSTATUS.getName()) != null) { this.grantStatus = Short.valueOf(fields.get(MapKey.GRANTSTATUS.getName()).toString()); } - this.created = Date.from(Instant.parse(fields.get(MapKey.CREATED.getName()).toString())); - this.modified = Date.from(Instant.parse(fields.get(MapKey.MODIFIED.getName()).toString())); + if (fields.containsKey(MapKey.CREATED.getName())) { + this.created = Date.from(Instant.parse(fields.get(MapKey.CREATED.getName()).toString())); + } + if (fields.containsKey(MapKey.MODIFIED.getName())) { + this.modified = Date.from(Instant.parse(fields.get(MapKey.MODIFIED.getName()).toString())); + } if (fields.get(MapKey.FINALIZEDAT.getName()) != null) { this.finalizedAt = Date.from(Instant.parse(fields.get(MapKey.FINALIZEDAT.getName()).toString())); }