From e0c302e67e3d488c0f9795eb1ad4b25d9c9fe3dd Mon Sep 17 00:00:00 2001 From: Ioannis Kalyvas Date: Tue, 2 Oct 2018 17:33:58 +0300 Subject: [PATCH] no message --- .gitignore | 1 + .../data/converters/DateToUTCConverter.java | 46 +++ .../dao/criteria/DatasetPublicCriteria.java | 49 ++++ .../context/DatabaseContext.java | 1 + .../data/dao/entities/ContentDaoImpl.java | 2 + .../eudat/data/dao/entities/DMPDaoImpl.java | 2 + .../data/dao/entities/DMPProfileDaoImpl.java | 2 + .../dao/entities/DataRepositoryDaoImpl.java | 2 + .../data/dao/entities/DatasetDaoImpl.java | 2 + .../DatasetExternalDatasetDaoImpl.java | 2 + .../dao/entities/DatasetProfileDaoImpl.java | 2 + .../dao/entities/DatasetServiceDaoImpl.java | 2 + .../dao/entities/ExternalDatasetDaoImpl.java | 2 + .../data/dao/entities/InvitationDaoImpl.java | 2 + .../dao/entities/OrganisationDaoImpl.java | 2 + .../data/dao/entities/ProjectDaoImpl.java | 2 + .../data/dao/entities/RegistryDaoImpl.java | 2 + .../data/dao/entities/ResearcherDaoImpl.java | 2 + .../data/dao/entities/ServiceDaoImpl.java | 2 + .../data/dao/entities/UserDmpDaoImpl.java | 2 + .../data/dao/entities/UserInfoDaoImpl.java | 2 + .../data/dao/entities/UserRoleDaoImpl.java | 2 + .../java/eu/eudat/data/entities/Content.java | 7 + .../eu/eudat/data/entities/Credential.java | 12 + .../main/java/eu/eudat/data/entities/DMP.java | 13 +- .../eu/eudat/data/entities/DMPProfile.java | 10 + .../eudat/data/entities/DataRepository.java | 7 + .../java/eu/eudat/data/entities/Dataset.java | 11 +- .../data/entities/DatasetDataRepository.java | 8 +- .../data/entities/DatasetExternalDataset.java | 8 +- .../eudat/data/entities/DatasetProfile.java | 10 + .../eudat/data/entities/DatasetService.java | 7 + .../eudat/data/entities/ExternalDataset.java | 10 + .../eu/eudat/data/entities/Invitation.java | 7 + .../eu/eudat/data/entities/Organisation.java | 10 + .../java/eu/eudat/data/entities/Project.java | 20 +- .../java/eu/eudat/data/entities/Registry.java | 10 + .../eu/eudat/data/entities/Researcher.java | 10 + .../java/eu/eudat/data/entities/Service.java | 11 +- .../java/eu/eudat/data/entities/UserDMP.java | 7 + .../java/eu/eudat/data/entities/UserInfo.java | 14 +- .../java/eu/eudat/data/entities/UserRole.java | 7 + .../eu/eudat/data/entities/UserToken.java | 10 + .../item/project/ProjectCriteriaRequest.java | 10 + .../dataset/DatasetPublicTableRequest.java | 38 +++ .../QueryableHibernateList.java | 119 ++++++-- .../queryable/queryableentity/DataEntity.java | 5 +- .../main/java/eu/eudat/EuDatApplication.java | 2 + .../DevelDatabaseConfiguration.java | 28 +- .../configurations/ExecutorServiceConfig.java | 28 ++ .../main/java/eu/eudat/controllers/Admin.java | 19 +- .../eu/eudat/controllers/BaseController.java | 10 + .../java/eu/eudat/controllers/Datasets.java | 10 +- .../java/eu/eudat/controllers/Projects.java | 6 +- .../handlers/PrincipalArgumentResolver.java | 27 +- .../managers/DataManagementPlanManager.java | 2 +- .../eudat/logic/managers/DatasetManager.java | 20 ++ .../eudat/logic/managers/ProjectManager.java | 1 + .../DataManagementPlanListingModel.java | 17 +- .../listingmodels/DatasetListingModel.java | 17 +- .../data/project/ProjectListingModel.java | 37 ++- .../src/main/resources/application.properties | 25 +- dmp-frontend/Dockerfile | 1 + dmp-frontend/nginx-custom.conf | 4 + dmp-frontend/src/app/app.module.ts | 1 + .../compositefield-form.component.html | 129 ++++---- .../compositefield-form.component.ts | 6 +- .../dataset-profile.module.ts | 99 ++++--- .../field-form/field-form.component.html | 142 ++++----- .../form/form.component.html | 122 ++++---- .../form/form.component.scss | 2 +- .../form/form.component.ts | 27 +- .../page-form/page-component.html | 17 +- .../page-form/page-component.scss | 3 + .../page-form/page-component.ts | 4 +- .../dataset-profile-previewer.component.html | 2 + .../dataset-profile-previewer.component.scss | 0 .../dataset-profile-previewer.component.ts | 36 +++ .../rule-component/rule.component.html | 42 +-- .../rule-component/rule.component.scss | 3 + .../section-form/section-form.component.html | 68 +++-- .../section-form/section-form.component.scss | 4 +- .../section-form/section-form.component.ts | 7 +- .../dataset-admin-listing.component.html | 4 +- .../dataset-public-listing.component.html | 181 ++++++------ .../dataset-public-listing.component.ts | 20 +- .../listing/dataset-listing.component.html | 18 +- .../listing/dataset-listing.component.ts | 10 +- .../dmp-profile-editor.component.ts | 7 +- .../app/dmps/listing/dmp-listing.component.ts | 5 + .../src/app/form/dynamic-form.module.ts | 4 +- .../DataManagementPlanListingModel.ts | 7 +- .../DatasetProfileModelAdmin.ts | 4 +- .../models/datasets/DatasetListingModel.ts | 56 ++-- .../app/models/datasets/DatasetWizardModel.ts | 5 + .../facet-search/FacetSearchCriteriaModel.ts | 8 + .../models/projects/ProjectListingModel.ts | 6 +- .../listing/project-listing.component.ts | 5 + .../app/services/dataset/dataset.service.ts | 39 +-- .../datasetProfileAfmin.service.ts | 4 + .../datasets/datasets-criteria.component.ts | 6 +- .../users/users-criteria.component.ts | 6 +- .../facets/facet-search.component.html | 35 +++ .../facets/facet-search.component.scss | 0 .../facets/facet-search.component.ts | 106 +++++++ .../navigation/navigation.component.html | 14 +- .../navigation/navigation.component.scss | 8 + .../autocomplete/autocomplete-component.html | 58 ++-- .../autocomplete/autocomplete-component.scss | 3 + .../autocomplete/autocomplete-component.ts | 30 +- .../booleanDecision-component.html | 15 +- .../booleanDecision-component.scss | 3 + .../booleanDecision-component.ts | 3 +- .../checkbox/checkbox-component.html | 14 +- .../checkbox/checkbox-component.scss | 3 + .../checkbox/checkbox-component.ts | 3 +- .../combobox/combobox-component.html | 27 +- .../combobox/combobox-component.scss | 3 + .../combobox/combobox-component.ts | 31 +- .../freetext/freetext-component.html | 15 +- .../freetext/freetext-component.scss | 3 + .../freetext/freetext-component.ts | 3 +- .../radiobox/radiobox-component.html | 37 ++- .../radiobox/radiobox-component.scss | 3 + .../radiobox/radiobox-component.ts | 44 +-- .../textarea/textarea-component.html | 16 +- .../textarea/textarea-component.scss | 3 + .../textarea/textarea-component.ts | 3 +- .../wordlist/wordlist-component.html | 39 ++- .../wordlist/wordlist-component.scss | 3 + .../wordlist/wordlist-component.ts | 3 +- dmp-frontend/src/app/shared/shared.module.ts | 7 +- .../roles/user-role-editor.component.ts | 6 +- .../app/users/components/users.component.html | 2 +- .../users/profile/user-profile.component.ts | 1 + .../app/utilities/culture/culture-service.ts | 9 +- dmp-frontend/src/app/utilities/utilities.ts | 56 ++-- dmp-frontend/src/assets/lang/en.json | 22 ++ .../src/environments/environment.prod.ts | 2 +- dmp-frontend/src/environments/environment.ts | 2 +- dmp-frontend/static/goodbye.html | 1 + dmp-frontend/static/index.html | 29 ++ dmp-frontend/static/openDmps.png | Bin 0 -> 3322 bytes dmp-frontend/tslint.json | 276 +++++++++--------- docker-compose.yml | 2 + static/goodbye.html | 1 + static/index.html | 29 ++ static/openDmps.png | Bin 0 -> 3322 bytes 148 files changed, 1965 insertions(+), 885 deletions(-) create mode 100644 dmp-backend/data/src/main/java/eu/eudat/data/converters/DateToUTCConverter.java create mode 100644 dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetPublicCriteria.java create mode 100644 dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetPublicTableRequest.java create mode 100644 dmp-backend/web/src/main/java/eu/eudat/configurations/ExecutorServiceConfig.java create mode 100644 dmp-frontend/src/app/dataset-profile-form/page-form/page-component.scss create mode 100644 dmp-frontend/src/app/dataset-profile-form/previewer/dataset-profile-previewer.component.html create mode 100644 dmp-frontend/src/app/dataset-profile-form/previewer/dataset-profile-previewer.component.scss create mode 100644 dmp-frontend/src/app/dataset-profile-form/previewer/dataset-profile-previewer.component.ts create mode 100644 dmp-frontend/src/app/models/facet-search/FacetSearchCriteriaModel.ts create mode 100644 dmp-frontend/src/app/shared/components/facets/facet-search.component.html create mode 100644 dmp-frontend/src/app/shared/components/facets/facet-search.component.scss create mode 100644 dmp-frontend/src/app/shared/components/facets/facet-search.component.ts create mode 100644 dmp-frontend/src/app/shared/componentsAdmin/autocomplete/autocomplete-component.scss create mode 100644 dmp-frontend/src/app/shared/componentsAdmin/booleanDecision/booleanDecision-component.scss create mode 100644 dmp-frontend/src/app/shared/componentsAdmin/checkbox/checkbox-component.scss create mode 100644 dmp-frontend/src/app/shared/componentsAdmin/combobox/combobox-component.scss create mode 100644 dmp-frontend/src/app/shared/componentsAdmin/freetext/freetext-component.scss create mode 100644 dmp-frontend/src/app/shared/componentsAdmin/radiobox/radiobox-component.scss create mode 100644 dmp-frontend/src/app/shared/componentsAdmin/textarea/textarea-component.scss create mode 100644 dmp-frontend/src/app/shared/componentsAdmin/wordlist/wordlist-component.scss create mode 100644 dmp-frontend/static/goodbye.html create mode 100644 dmp-frontend/static/index.html create mode 100644 dmp-frontend/static/openDmps.png create mode 100644 static/goodbye.html create mode 100644 static/index.html create mode 100644 static/openDmps.png diff --git a/.gitignore b/.gitignore index 9573e0543..10071e274 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ final/ temp/ *.jar *.lst +dmp-frontend/.vscode/ diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/converters/DateToUTCConverter.java b/dmp-backend/data/src/main/java/eu/eudat/data/converters/DateToUTCConverter.java new file mode 100644 index 000000000..35fb84dae --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/converters/DateToUTCConverter.java @@ -0,0 +1,46 @@ +package eu.eudat.data.converters; + +import org.springframework.format.datetime.DateFormatter; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +/** + * Created by ikalyvas on 9/25/2018. + */ +@Converter +public class DateToUTCConverter implements AttributeConverter { + + @Override + public Date convertToDatabaseColumn(Date attribute) { + if(attribute == null) return null; + DateFormat formatterIST = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + formatterIST.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + String date = formatterIST.format(attribute); + return formatterIST.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + @Override + public Date convertToEntityAttribute(Date dbData) { + if(dbData == null) return null; + DateFormat formatterIST = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + formatterIST.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + String date = formatterIST.format(dbData); + return formatterIST.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetPublicCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetPublicCriteria.java new file mode 100644 index 000000000..af745e465 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetPublicCriteria.java @@ -0,0 +1,49 @@ +package eu.eudat.data.dao.criteria; + +import eu.eudat.data.entities.Dataset; +import eu.eudat.types.project.ProjectStateType; + +import java.util.List; +import java.util.UUID; + +/** + * Created by ikalyvas on 10/2/2018. + */ +public class DatasetPublicCriteria extends Criteria{ + public ProjectStateType projectStatus; + public List projects; + public List datasetProfile; + public List dmpOrganisations; + + public ProjectStateType getProjectStatus() { + return projectStatus; + } + + public void setProjectStatus(ProjectStateType projectStatus) { + this.projectStatus = projectStatus; + } + + public List getProjects() { + return projects; + } + + public void setProjects(List projects) { + this.projects = projects; + } + + public List getDatasetProfile() { + return datasetProfile; + } + + public void setDatasetProfile(List datasetProfile) { + this.datasetProfile = datasetProfile; + } + + public List getDmpOrganisations() { + return dmpOrganisations; + } + + public void setDmpOrganisations(List dmpOrganisations) { + this.dmpOrganisations = dmpOrganisations; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java index c0a92f01c..49f823d63 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java @@ -4,6 +4,7 @@ import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.jpa.hibernatequeryablelist.QueryableHibernateList; import eu.eudat.queryable.queryableentity.DataEntity; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java index 7c68cb3ea..1d3f559d5 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java @@ -5,6 +5,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Content; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.UUID; @@ -27,6 +28,7 @@ public class ContentDaoImpl extends DatabaseAccess implements ContentDa } @Override + @Async public CompletableFuture createOrUpdateAsync(Content item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); } 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 547d60452..d86f677b9 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 @@ -10,6 +10,7 @@ import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.types.FieldSelectionType; import eu.eudat.queryable.types.SelectionField; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.Arrays; @@ -78,6 +79,7 @@ public class DMPDaoImpl extends DatabaseAccess implements DMPDao { return this.getDatabaseService().getQueryable(DMP.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(DMP item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java index b1ee83a96..f2eec9e0a 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.DMPProfile; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.UUID; @@ -22,6 +23,7 @@ public class DMPProfileDaoImpl extends DatabaseAccess implements DMP super(databaseService); } + @Async @Override public CompletableFuture createOrUpdateAsync(DMPProfile item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java index 546d5a2d8..c74a997d6 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.DataRepository; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -38,6 +39,7 @@ public class DataRepositoryDaoImpl extends DatabaseAccess implem } @Override + @Async public CompletableFuture createOrUpdateAsync(DataRepository item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java index 2bf712760..cc1e10544 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java @@ -9,6 +9,7 @@ import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.types.FieldSelectionType; import eu.eudat.queryable.types.SelectionField; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.Arrays; @@ -76,6 +77,7 @@ public class DatasetDaoImpl extends DatabaseAccess implements DatasetDa return this.getDatabaseService().getQueryable(Dataset.class); } + @Async public CompletableFuture createOrUpdateAsync(Dataset item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java index 25e1b09fa..ed76b6376 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.entities.DatasetExternalDataset; import eu.eudat.data.entities.DatasetProfile; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -33,6 +34,7 @@ public class DatasetExternalDatasetDaoImpl extends DatabaseAccess builder.equal(root.get("id"), id)).getSingle(); } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java index a9bcfaa70..a9f684c7d 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.DatasetProfile; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -52,6 +53,7 @@ public class DatasetProfileDaoImpl extends DatabaseAccess implem return this.getDatabaseService().getQueryable(DatasetProfile.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(DatasetProfile item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java index 6ffcf1adf..fd40d37ae 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java @@ -7,6 +7,7 @@ import eu.eudat.data.entities.DatasetProfile; import eu.eudat.data.entities.DatasetService; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -28,6 +29,7 @@ public class DatasetServiceDaoImpl extends DatabaseAccess implem return this.getDatabaseService().createOrUpdate(item, DatasetService.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(DatasetService item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java index ee0242250..76105609f 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.ExternalDataset; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -48,6 +49,7 @@ public class ExternalDatasetDaoImpl extends DatabaseAccess impl return this.getDatabaseService().getQueryable(ExternalDataset.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(ExternalDataset item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java index 7b9e66332..eba6d5669 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Invitation; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.UUID; @@ -45,6 +46,7 @@ public class InvitationDaoImpl extends DatabaseAccess implements Inv return this.getDatabaseService().getQueryable(Invitation.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(Invitation item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java index 57a82ea8f..5227b6270 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Organisation; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -47,6 +48,7 @@ public class OrganisationDaoImpl extends DatabaseAccess implements return this.getDatabaseService().getQueryable(Organisation.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(Organisation item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java index 6f4cc4665..bc5930802 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java @@ -8,6 +8,7 @@ import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; import eu.eudat.types.project.ProjectStateType; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import javax.persistence.criteria.JoinType; @@ -71,6 +72,7 @@ public class ProjectDaoImpl extends DatabaseAccess implements ProjectDa return query; } + @Async @Override public CompletableFuture createOrUpdateAsync(Project item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java index f4bb048dc..c7ed94b75 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Registry; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -47,6 +48,7 @@ public class RegistryDaoImpl extends DatabaseAccess implements Registr return this.getDatabaseService().getQueryable(Registry.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(Registry item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java index d9318903d..7faa9e8f6 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Researcher; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -49,6 +50,7 @@ public class ResearcherDaoImpl extends DatabaseAccess implements Res return this.getDatabaseService().getQueryable(Researcher.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(Researcher item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java index cee85c95c..00406ab91 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Service; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -47,6 +48,7 @@ public class ServiceDaoImpl extends DatabaseAccess implements ServiceDa return this.getDatabaseService().getQueryable(Service.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(Service item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java index 9f23d023f..eb99c65e3 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java @@ -5,6 +5,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.UserDMP; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -41,6 +42,7 @@ public class UserDmpDaoImpl extends DatabaseAccess implements UserDmpDa return this.getDatabaseService().getQueryable(UserDMP.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(UserDMP item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java index 7d601863c..46e2c0861 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -51,6 +52,7 @@ public class UserInfoDaoImpl extends DatabaseAccess implements UserInf return this.getDatabaseService().getQueryable(UserInfo.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(UserInfo item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java index c22a51747..96a1522c4 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java @@ -7,6 +7,7 @@ import eu.eudat.data.entities.UserInfo; import eu.eudat.data.entities.UserRole; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.List; @@ -57,6 +58,7 @@ public class UserRoleDaoImpl extends DatabaseAccess implements UserRol return this.getDatabaseService().getQueryable(UserRole.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(UserRole item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Content.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Content.java index 99217114a..11ee1e266 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Content.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Content.java @@ -4,6 +4,7 @@ import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; +import java.util.List; import java.util.UUID; /** @@ -143,4 +144,10 @@ public class Content implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public Content buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Credential.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Credential.java index 91330c29e..c2f9f6d87 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Credential.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Credential.java @@ -1,9 +1,11 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.UUID; @@ -33,9 +35,13 @@ public class Credential implements DataEntity { private String publicValue; @Column(name = "\"Secret\"", nullable = false) private String secret; + @Column(name = "\"CreationTime\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) private Date creationTime; + @Column(name = "\"LastUpdateTime\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) private Date lastUpdateTime; @Column(name = "\"ExternalId\"", nullable = false) @@ -140,4 +146,10 @@ public class Credential implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public Credential buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java index d2ca7e85d..3ed583f89 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java @@ -1,12 +1,14 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.*; +import java.util.stream.Collectors; @Entity @@ -15,7 +17,7 @@ import java.util.*; @NamedEntityGraph( name = "dataManagementPlanListingModel", attributeNodes = {@NamedAttributeNode("organisations"), @NamedAttributeNode("researchers"), - @NamedAttributeNode("project"),@NamedAttributeNode("users"), @NamedAttributeNode("creator"), @NamedAttributeNode("profile"), @NamedAttributeNode("dataset")} + @NamedAttributeNode("project"), @NamedAttributeNode("users"), @NamedAttributeNode("creator"), @NamedAttributeNode("profile"), @NamedAttributeNode("dataset")} ), @NamedEntityGraph( name = "fullyDetailed", @@ -132,9 +134,11 @@ public class DMP implements DataEntity { private String dmpProperties; @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created = null; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); @@ -319,4 +323,11 @@ public class DMP implements DataEntity { return this.id; } + @Override + public DMP buildFromTuple(List tuple, String base) { + this.id = tuple.get(0).get(base.isEmpty() ? "id" : base + "." + "id", UUID.class); + this.dataset = tuple.stream().map(x -> new Dataset().buildFromTuple(tuple, base.isEmpty() ? "dataset" : base + "." + "dataset")).collect(Collectors.toSet()); + this.creator = tuple.stream().map(x -> new UserInfo().buildFromTuple(tuple, base.isEmpty() ? "creator" : base + "." + "creator")).collect(Collectors.toList()).get(0); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMPProfile.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMPProfile.java index 729f70587..ef915da1e 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMPProfile.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMPProfile.java @@ -1,12 +1,14 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -39,9 +41,11 @@ public class DMPProfile implements DataEntity { @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created = null; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); public int getStatus() { @@ -111,4 +115,10 @@ public class DMPProfile implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public DMPProfile buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java index d382ba555..86f9246b5 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java @@ -8,6 +8,7 @@ import org.hibernate.annotations.Type; import javax.persistence.*; import java.io.Serializable; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -145,4 +146,10 @@ public class DataRepository implements Serializable, DataEntity tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java index e9adc4d5a..f723997a2 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java @@ -1,6 +1,7 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; @@ -17,7 +18,7 @@ import java.util.stream.Collectors; attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode(value = "datasetDataRepositories", subgraph = "datasetDataRepositories"), @NamedAttributeNode("datasetExternalDatasets"), @NamedAttributeNode("registries"), @NamedAttributeNode(value = "dmp", subgraph = "dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}, subgraphs = { - @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users")}), + @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users"), @NamedAttributeNode("project"),@NamedAttributeNode("organisations")}), @NamedSubgraph(name = "datasetDataRepositories", attributeNodes = {@NamedAttributeNode("dataRepository")}) }), @@ -126,9 +127,11 @@ public class Dataset implements DataEntity { private boolean isPublic; @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created = null; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); @ManyToOne(fetch = FetchType.LAZY) @@ -328,4 +331,10 @@ public class Dataset implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public Dataset buildFromTuple(List tuple, String base) { + this.id = (UUID) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java index 6cc2ddafa..cac474d7e 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java @@ -5,6 +5,7 @@ import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; +import java.util.List; import java.util.UUID; /** @@ -32,7 +33,6 @@ public class DatasetDataRepository implements DataEntity tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java index c9b27cc83..f3115dfe3 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java @@ -5,6 +5,7 @@ import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; +import java.util.List; import java.util.UUID; @@ -18,7 +19,6 @@ public class DatasetExternalDataset implements DataEntity tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetProfile.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetProfile.java index 193450615..39202a1f1 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetProfile.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetProfile.java @@ -1,12 +1,14 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -37,9 +39,11 @@ public class DatasetProfile implements DataEntity { @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); @Column(name = "\"Description\"") @@ -135,4 +139,10 @@ public class DatasetProfile implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public DatasetProfile buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java index 25b4ef807..26d6ed913 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java @@ -7,6 +7,7 @@ import org.hibernate.annotations.Type; import javax.persistence.*; import java.io.Serializable; +import java.util.List; import java.util.UUID; @@ -87,4 +88,10 @@ public class DatasetService implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public DatasetService buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java index 2be13ba75..c53e4014d 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java @@ -1,10 +1,12 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -27,9 +29,11 @@ public class ExternalDataset implements DataEntity { private String reference; @Column(name = "\"Created\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) private Date created; @Column(name = "\"Modified\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) private Date modified; @OneToMany(mappedBy = "externalDataset", cascade = CascadeType.ALL, orphanRemoval = true) @@ -102,4 +106,10 @@ public class ExternalDataset implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public ExternalDataset buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Invitation.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Invitation.java index 852bfd41f..65e479400 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Invitation.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Invitation.java @@ -5,6 +5,7 @@ import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; +import java.util.List; import java.util.UUID; @@ -104,4 +105,10 @@ public class Invitation implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public Invitation buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Organisation.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Organisation.java index f74b3bb32..5942ab88e 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Organisation.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Organisation.java @@ -1,6 +1,7 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; @@ -8,6 +9,7 @@ import org.hibernate.annotations.Type; import javax.persistence.*; import java.io.Serializable; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -53,9 +55,11 @@ public class Organisation implements Serializable, DataEntity @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created = null; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); @@ -155,4 +159,10 @@ public class Organisation implements Serializable, DataEntity public UUID getKeys() { return this.id; } + + @Override + public Organisation buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Project.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Project.java index edf3de954..1325d3bde 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Project.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Project.java @@ -1,14 +1,17 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; @Entity @@ -109,9 +112,11 @@ public class Project implements DataEntity { @Column(name = "\"StartDate\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) private Date startdate = null; @Column(name = "\"EndDate\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) private Date enddate = null; @@ -140,6 +145,13 @@ public class Project implements DataEntity { @JoinColumn(name = "\"Content\"") private Content content; + public Project() { + } + + public Project(Project project) { + this.id = project.getId(); + } + public String getDescription() { return description; } @@ -285,11 +297,17 @@ public class Project implements DataEntity { this.enddate = entity.getEnddate(); this.modified = new Date(); if (entity.getContent() != null) this.content = entity.getContent(); - //this.creationUser = entity.getCreationUser(); //TODO } @Override public UUID getKeys() { return this.id; } + + @Override + public Project buildFromTuple(List tuple, String base) { + this.id = (UUID) tuple.get(0).get(base.isEmpty() ? "id" : base + "." + "id" ); + this.dmps = tuple.stream().map(x-> new DMP().buildFromTuple(tuple,"dmps")).collect(Collectors.toSet()); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Registry.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Registry.java index 94e8fda67..6a280a8fb 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Registry.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Registry.java @@ -1,12 +1,14 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -50,9 +52,11 @@ public class Registry implements DataEntity { @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created = null; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); @@ -151,4 +155,10 @@ public class Registry implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public Registry buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Researcher.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Researcher.java index 186467101..485b99aea 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Researcher.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Researcher.java @@ -1,12 +1,14 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -52,9 +54,11 @@ public class Researcher implements DataEntity { @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created = null; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); @@ -154,4 +158,10 @@ public class Researcher implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public Researcher buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java index fd009e20e..41694dbb7 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java @@ -1,12 +1,13 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; -import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -46,9 +47,11 @@ public class Service implements DataEntity { @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created = null; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); @@ -147,4 +150,10 @@ public class Service implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public Service buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserDMP.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserDMP.java index 4b3946384..5990d2f70 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserDMP.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserDMP.java @@ -4,6 +4,7 @@ import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; +import java.util.List; import java.util.UUID; @Entity @@ -94,4 +95,10 @@ public class UserDMP implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public UserDMP buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java index 3a9da482c..2d69f5083 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java @@ -1,14 +1,12 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; -import java.util.Date; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; +import java.util.*; @Entity @@ -44,10 +42,12 @@ public class UserInfo implements DataEntity { @Column(name = "created", nullable = false) + @Convert(converter = DateToUTCConverter.class) private Date created = null; @Column(name = "lastloggedin", nullable = true) + @Convert(converter = DateToUTCConverter.class) private Date lastloggedin = null; @@ -177,4 +177,10 @@ public class UserInfo implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public UserInfo buildFromTuple(List tuple, String base) { + this.id = (UUID) tuple.get(0).get(base.isEmpty() ? "id" : base + "." + "id" ); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserRole.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserRole.java index dacea8581..161c82a23 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserRole.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserRole.java @@ -4,6 +4,7 @@ import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; +import java.util.List; import java.util.UUID; @@ -57,4 +58,10 @@ public class UserRole implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public UserRole buildFromTuple(List tuple, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserToken.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserToken.java index a74e127cb..7a1e96c37 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserToken.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserToken.java @@ -1,9 +1,11 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.UUID; @@ -20,10 +22,12 @@ public class UserToken implements DataEntity { private UserInfo user; @Column(name = "\"IssuedAt\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) private Date issuedAt = null; @Column(name = "\"ExpiresAt\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) private Date expiresAt = null; public UUID getToken() { @@ -67,4 +71,10 @@ public class UserToken implements DataEntity { public UUID getKeys() { return this.token; } + + @Override + public UserToken buildFromTuple(List tuple, String base) { + this.token = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "token" : "token")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/project/ProjectCriteriaRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/project/ProjectCriteriaRequest.java index 6c53e19f9..ace533150 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/project/ProjectCriteriaRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/project/ProjectCriteriaRequest.java @@ -8,6 +8,16 @@ import eu.eudat.queryable.QueryableList; import java.util.UUID; public class ProjectCriteriaRequest extends Query { + private Integer length; + + public Integer getLength() { + return length; + } + + public void setLength(Integer length) { + this.length = length; + } + private ProjectCriteriaRequest() { } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetPublicTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetPublicTableRequest.java new file mode 100644 index 000000000..ad438a278 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetPublicTableRequest.java @@ -0,0 +1,38 @@ +package eu.eudat.data.query.items.table.dataset; + +import eu.eudat.data.dao.criteria.DatasetPublicCriteria; +import eu.eudat.data.entities.Dataset; +import eu.eudat.data.query.definition.TableQuery; +import eu.eudat.queryable.QueryableList; +import eu.eudat.queryable.types.FieldSelectionType; +import eu.eudat.queryable.types.SelectionField; + +import java.util.Arrays; +import java.util.UUID; + +/** + * Created by ikalyvas on 10/2/2018. + */ +public class DatasetPublicTableRequest extends TableQuery { + @Override + public QueryableList applyCriteria() { + QueryableList query = this.getQuery(); + query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("dmp").get("version"), + query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("dmp").get("groupId"), nestedRoot.get("dmp").get("groupId")), + Arrays.asList(new SelectionField(FieldSelectionType.COMPOSITE_FIELD, "dmp:version")), String.class))); + if (this.getCriteria().projects != null && !this.getCriteria().projects.isEmpty()) + query.where(((builder, root) -> root.get("dmp").get("project").get("id").in(this.getCriteria().projects))); + if (this.getCriteria().projectStatus != null) query + .where(((builder, root) -> builder.equal(root.get("dmp").get("project").get("status"), this.getCriteria().projectStatus.getValue()))); + if (this.getCriteria().datasetProfile != null && !this.getCriteria().datasetProfile.isEmpty()) query + .where(((builder, root) -> root.get("profile").get("id").in(this.getCriteria().datasetProfile))); + if(this.getCriteria().dmpOrganisations != null && !this.getCriteria().dmpOrganisations.isEmpty())query + .where(((builder, root) -> root.join("dmp").join("organisations").get("reference").in(this.getCriteria().dmpOrganisations))); + return query; + } + + @Override + public QueryableList applyPaging(QueryableList items) { + return null; + } +} diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java index 7d11da36d..e46453e45 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java @@ -2,25 +2,27 @@ package eu.eudat.queryable.jpa.hibernatequeryablelist; import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.exceptions.NotSingleResultException; -import eu.eudat.queryable.jpa.predicates.*; +import eu.eudat.queryable.jpa.predicates.NestedQuerySinglePredicate; +import eu.eudat.queryable.jpa.predicates.OrderByPredicate; +import eu.eudat.queryable.jpa.predicates.SelectPredicate; +import eu.eudat.queryable.jpa.predicates.SinglePredicate; import eu.eudat.queryable.queryableentity.DataEntity; import eu.eudat.queryable.types.FieldSelectionType; import eu.eudat.queryable.types.SelectionField; +import org.springframework.scheduling.annotation.Async; import javax.persistence.EntityManager; +import javax.persistence.Tuple; import javax.persistence.TypedQuery; import javax.persistence.criteria.*; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; public class QueryableHibernateList implements QueryableList { private EntityManager manager; - private CriteriaQuery query; + private CriteriaQuery query; private Class tClass; private Root root; private Root nestedQueryRoot; @@ -57,15 +59,32 @@ public class QueryableHibernateList implements QueryableLi } private QueryableList selectFields() { - List rootFields = fields.stream().map(field -> root.get(field)).collect(Collectors.toList()); - this.query.select(this.manager.getCriteriaBuilder().construct(tClass, rootFields.toArray(new Selection[rootFields.size()]))); + List rootFields = fields.stream().map(field -> this.convertFieldToPath(field)).collect(Collectors.toList()); + this.query.select(this.manager.getCriteriaBuilder().tuple(rootFields.toArray(new Selection[rootFields.size()]))); return this; } + private Path convertFieldToPath(String field) { + if (!field.contains(".")) { + Path path = this.root.get(field); + path.alias(field); + return path; + } else { + String[] fields = field.split("\\."); + Path path = this.root.get(fields[0]); + Join join = null; + path.alias(fields[0]); + for (int i = 1; i < fields.length; i++) { + join = join != null ? join.join(fields[i - 1], JoinType.LEFT) : this.root.join(fields[i - 1], JoinType.LEFT) ; + path = join.get(fields[i]); + path.alias(String.join(".", Arrays.asList(fields).subList(0, i + 1))); + } + return path; + } + } + public QueryableHibernateList setEntity(Class type) { - CriteriaBuilder builder = this.manager.getCriteriaBuilder(); - this.query = builder.createQuery(type); - this.root = this.query.from(this.tClass); + return this; } @@ -125,6 +144,7 @@ public class QueryableHibernateList implements QueryableLi return this.manager.createQuery(criteriaQuery).getSingleResult(); } + @Async public CompletableFuture countAsync() { CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); @@ -169,10 +189,33 @@ public class QueryableHibernateList implements QueryableLi } public List toList() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); + if (!this.fields.isEmpty()) this.selectFields(); if (distinct) this.query.distinct(true); + if (!this.fields.isEmpty()) return this.toListWithFields(); + else return this.toListWithOutFields(); + } + + private List toListWithFields() { + List results = this.manager.createQuery(query).getResultList(); + Map> groupedResults = results.stream() + .collect(Collectors.groupingBy(x -> x.get("id"))); + return results.stream().map(x -> { + try { + return (T) this.tClass.newInstance().buildFromTuple(groupedResults.get(x.get("id")), ""); + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + return null; + }).collect(Collectors.toList()); + } + + private List toListWithOutFields() { TypedQuery typedQuery = this.manager.createQuery(this.query); if (this.offset != null) typedQuery.setFirstResult(this.offset); if (this.length != null) typedQuery.setMaxResults(this.length); @@ -183,11 +226,35 @@ public class QueryableHibernateList implements QueryableLi return typedQuery.getResultList(); } + @Async public CompletableFuture> toListAsync() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); + if (!this.fields.isEmpty()) this.selectFields(); if (distinct) this.query.distinct(true); + if (!this.fields.isEmpty()) return this.toListAsyncWithFields(); + else return this.toListAsyncWithOutFields(); + } + + private CompletableFuture> toListAsyncWithFields() { + List results = this.manager.createQuery(query).getResultList(); + Map> groupedResults = results.stream() + .collect(Collectors.groupingBy(x -> x.get("id"))); + return CompletableFuture.supplyAsync(() -> results.stream().map(x -> { + try { + return (T) this.tClass.newInstance().buildFromTuple(groupedResults.get(x.get("id")), ""); + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + return null; + }).collect(Collectors.toList())); + } + + private CompletableFuture> toListAsyncWithOutFields() { TypedQuery typedQuery = this.manager.createQuery(this.query); if (this.offset != null) typedQuery.setFirstResult(this.offset); if (this.length != null) typedQuery.setMaxResults(this.length); @@ -201,17 +268,26 @@ public class QueryableHibernateList implements QueryableLi } public T getSingle() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); + if (!this.fields.isEmpty()) this.selectFields(); TypedQuery typedQuery = this.manager.createQuery(this.query); if (this.hint != null) typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); return typedQuery.getSingleResult(); } + @Async public CompletableFuture getSingleAsync() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); + if (!this.fields.isEmpty()) this.selectFields(); TypedQuery typedQuery = this.manager.createQuery(this.query); if (this.hint != null) typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); @@ -219,8 +295,12 @@ public class QueryableHibernateList implements QueryableLi } public T getSingleOrDefault() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); + if (!this.fields.isEmpty()) this.selectFields(); TypedQuery typedQuery = this.manager.createQuery(this.query); if (this.hint != null) typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); @@ -230,9 +310,14 @@ public class QueryableHibernateList implements QueryableLi else throw new NotSingleResultException("Query returned more than one items"); } + @Async public CompletableFuture getSingleOrDefaultAsync() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); + if (!this.fields.isEmpty()) this.selectFields(); TypedQuery typedQuery = this.manager.createQuery(this.query); if (this.hint != null) typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/queryableentity/DataEntity.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/queryableentity/DataEntity.java index 2b99e290b..719b37cf2 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/queryableentity/DataEntity.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/queryableentity/DataEntity.java @@ -1,7 +1,10 @@ package eu.eudat.queryable.queryableentity; +import javax.persistence.Tuple; +import java.util.List; + public interface DataEntity { void update(T entity); - K getKeys(); + T buildFromTuple(List tuple, String base); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java b/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java index 7a674710f..d9c2b65d6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java +++ b/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java @@ -6,8 +6,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication +@EnableAsync public class EuDatApplication extends SpringBootServletInitializer { private static final Logger logger = LoggerFactory.getLogger(EuDatApplication.class); diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java index a5f334394..64ddf8b49 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java @@ -2,10 +2,9 @@ package eu.eudat.configurations; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; +import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.*; import org.springframework.core.env.Environment; import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; import org.springframework.jdbc.datasource.DriverManagerDataSource; @@ -37,25 +36,26 @@ public class DevelDatabaseConfiguration { JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); em.setJpaProperties(additionalProperties()); - return em; } @Bean + @Primary + @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { - DriverManagerDataSource dataSource = new DriverManagerDataSource(); - dataSource.setDriverClassName(env.getProperty("database.driver-class-name")); - dataSource.setUrl(env.getProperty("devel.database.url")); - dataSource.setUsername(env.getProperty("devel.database.username")); - dataSource.setPassword(env.getProperty("devel.database.password")); - return dataSource; + return DataSourceBuilder + .create() + .username(env.getProperty("devel.database.username")) + .password(env.getProperty("devel.database.password")) + .url(env.getProperty("devel.database.url")) + .driverClassName(env.getProperty("database.driver-class-name")) + .build(); } @Bean public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(emf); - return transactionManager; } @@ -69,6 +69,10 @@ public class DevelDatabaseConfiguration { properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQL92Dialect"); properties.setProperty("hibernate.show_sql", "true"); properties.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false"); + properties.setProperty("hibernate.c3p0.maxPoolSize", "70"); + properties.setProperty("hibernate.c3p0.timeout", "5000"); + properties.setProperty("hibernate.connection.release_mode", "after_transaction"); + //properties.setProperty("hibernate.connection.provider_class", "org.hibernate.c3p0.internal.C3P0ConnectionProvider"); return properties; } } \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/ExecutorServiceConfig.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/ExecutorServiceConfig.java new file mode 100644 index 000000000..78da24f79 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/ExecutorServiceConfig.java @@ -0,0 +1,28 @@ +package eu.eudat.configurations; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * Created by ikalyvas on 9/26/2018. + */ +@Configuration +public class ExecutorServiceConfig { + + @Bean + public Executor asyncExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(2); + executor.setMaxPoolSize(2); + executor.setQueueCapacity(500); + executor.setThreadNamePrefix("Rules-"); + executor.initialize(); + return executor; + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java index e6668e6c5..b12957671 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java @@ -1,11 +1,15 @@ package eu.eudat.controllers; +import eu.eudat.core.logger.Logger; import eu.eudat.logic.managers.AdminManager; +import eu.eudat.logic.managers.UserManager; import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.helpers.LoggerService; import eu.eudat.models.data.admin.composite.DatasetProfile; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.security.Principal; +import eu.eudat.models.data.user.composite.PagedDatasetProfile; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -24,13 +28,14 @@ import static eu.eudat.types.Authorities.ADMIN; public class Admin extends BaseController { @Autowired - public Admin(ApiContext apiContext) { + public Admin(ApiContext apiContext, Logger logger) { super(apiContext); } @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/admin/addDmp"}, consumes = "application/json", produces = "application/json") public ResponseEntity addDmp(@Valid @RequestBody DatasetProfile profile, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { + //this.getLoggerService().info(principal, "Admin Added Dataset Profile"); eu.eudat.data.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(profile, getApiContext()); this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(modelDefinition); return ResponseEntity.status(HttpStatus.OK).body(modelDefinition.getId()); @@ -39,6 +44,7 @@ public class Admin extends BaseController { @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/admin/addDmp/{id}"}, consumes = "application/json", produces = "application/json") public ResponseEntity> updateDmp(@PathVariable String id, @RequestBody DatasetProfile profile, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { + //this.getLoggerService().info(principal, "Admin Edited Dataset Profile"); eu.eudat.data.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(profile, getApiContext()); eu.eudat.data.entities.DatasetProfile datasetprofile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); @@ -50,9 +56,20 @@ public class Admin extends BaseController { @RequestMapping(method = RequestMethod.GET, value = {"/admin/get/{id}"}, produces = "application/json") public ResponseEntity> get(@PathVariable String id, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { + //this.getLoggerService().info(principal, "Admin Open Dataset Profile"); eu.eudat.data.entities.DatasetProfile profile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); eu.eudat.models.data.admin.composite.DatasetProfile datasetprofile = AdminManager.generateDatasetProfileModel(profile); datasetprofile.setLabel(profile.getLabel()); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(datasetprofile)); } + + @RequestMapping(method = RequestMethod.POST, value = {"/admin/preview"}, consumes = "application/json",produces = "application/json") + public ResponseEntity> getPreview(@RequestBody DatasetProfile profile, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { + //this.getLoggerService().info(principal, "Admin Previewed Dataset Profile"); + eu.eudat.data.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(profile, getApiContext()); + eu.eudat.models.data.user.composite.DatasetProfile datasetProfile = UserManager.generateDatasetProfileModel(modelDefinition); + PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile(); + pagedDatasetProfile.buildPagedDatasetProfile(datasetProfile); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(pagedDatasetProfile)); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/BaseController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/BaseController.java index 54bc1a41d..a352eab4a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/BaseController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/BaseController.java @@ -1,20 +1,30 @@ package eu.eudat.controllers; +import eu.eudat.core.logger.Logger; import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.helpers.LoggerService; import eu.eudat.models.validators.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; public abstract class BaseController { + private Logger logger; + private ApiContext apiContext; public ApiContext getApiContext() { return apiContext; } + public Logger getLoggerService() { + return logger; + } + public BaseController(ApiContext apiContext) { + this.apiContext = apiContext; } 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 bbab14e7f..d0e5a3abd 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 @@ -1,6 +1,7 @@ package eu.eudat.controllers; import eu.eudat.data.entities.Dataset; +import eu.eudat.data.query.items.table.dataset.DatasetPublicTableRequest; import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; import eu.eudat.logic.managers.DatasetManager; import eu.eudat.logic.security.claims.ClaimedAuthorities; @@ -33,7 +34,14 @@ public class Datasets extends BaseController { @RequestMapping(method = RequestMethod.POST, value = {"/datasets/getPaged"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity>> getPaged(@RequestBody DatasetTableRequest datasetTableRequest, @ClaimedAuthorities(claims = {Authorities.ANONYMOUS}) Principal principal) throws Exception { + ResponseEntity>> getPaged(@RequestBody DatasetTableRequest datasetTableRequest, Principal principal) throws Exception { + DataTableData dataTable = new DatasetManager().getPaged(this.getApiContext(), datasetTableRequest, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/datasets/public/paged"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> getPublicPaged(@RequestBody DatasetPublicTableRequest datasetTableRequest, @ClaimedAuthorities(claims = {Authorities.ANONYMOUS}) Principal principal) throws Exception { DataTableData dataTable = new DatasetManager().getPaged(this.getApiContext(), datasetTableRequest, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Projects.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Projects.java index 64ba84d05..dded1520e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Projects.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Projects.java @@ -6,6 +6,7 @@ import eu.eudat.data.query.items.table.project.ProjectTableRequest; import eu.eudat.logic.managers.ProjectManager; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; +import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.logic.services.ApiContext; import eu.eudat.models.data.external.ProjectsExternalSourcesModel; import eu.eudat.models.data.helpers.common.DataTableData; @@ -25,6 +26,9 @@ import java.text.ParseException; import java.util.List; import java.util.Map; +import static eu.eudat.types.Authorities.ADMIN; +import static eu.eudat.types.Authorities.ANONYMOUS; + @RestController @CrossOrigin @@ -78,7 +82,7 @@ public class Projects extends BaseController { @RequestMapping(method = RequestMethod.POST, value = {"/projects/get"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity>> get(@RequestBody ProjectCriteriaRequest projectCriteria, Principal principal) throws NoURLFound, InstantiationException, HugeResultSet, IllegalAccessException { + ResponseEntity>> get(@RequestBody ProjectCriteriaRequest projectCriteria, @ClaimedAuthorities(claims = {ANONYMOUS}) Principal principal) throws NoURLFound, InstantiationException, HugeResultSet, IllegalAccessException { List dataTable = new ProjectManager().getCriteria(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), projectCriteria, this.getApiContext().getOperationsContext().getRemoteFetcher()); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java b/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java index 4ff940353..35f85e4bc 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java @@ -1,21 +1,19 @@ package eu.eudat.logic.handlers; import eu.eudat.exceptions.security.UnauthorisedException; -import eu.eudat.models.data.security.Principal; import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.logic.services.operations.AuthenticationService; +import eu.eudat.models.data.security.Principal; import eu.eudat.types.Authorities; import org.springframework.core.MethodParameter; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import java.lang.annotation.Annotation; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; public final class PrincipalArgumentResolver implements HandlerMethodArgumentResolver { @@ -32,7 +30,8 @@ public final class PrincipalArgumentResolver implements HandlerMethodArgumentRes String token = nativeWebRequest.getHeader("AuthToken"); Optional claimsAnnotation = Arrays.stream(methodParameter.getParameterAnnotations()).filter(annotation -> annotation.annotationType().equals(ClaimedAuthorities.class)).findAny(); List claimList = claimsAnnotation.map(annotation -> Arrays.asList(((ClaimedAuthorities) annotation).claims())).orElse(Authorities.all()); - if(token == null && claimList.size() == 1 && claimList.get(0).equals(Authorities.ANONYMOUS)) return new Principal(); + if (token == null && claimList.size() == 1 && claimList.get(0).equals(Authorities.ANONYMOUS)) + return new Principal(); if (token == null) throw new UnauthorisedException("Authentication Information Is Missing"); UUID authToken; try { @@ -45,6 +44,13 @@ public final class PrincipalArgumentResolver implements HandlerMethodArgumentRes if (principal == null) throw new UnauthorisedException("Authentication Information Missing"); if (!claimList.contains(Authorities.ANONYMOUS) && !principal.isAuthorized(claimList)) throw new UnauthorisedException("You are not Authorized For this Action"); + /*Principal principal1 = new Principal(); + principal1.setId(UUID.fromString("46366b8a-a712-4e0c-a499-1a3a0f209325")); + principal1.setToken(UUID.fromString("19031e80-6534-4aa5-b68a-78e97042c968")); + principal1.setName("Ioannis Kalyvas"); + principal1.setAvatarUrl("https://lh5.googleusercontent.com/-X65vX1QO_Ew/AAAAAAAAAAI/AAAAAAAAAAA/AAN31DU5lFIOwD_fZiYW96D410pn6v4E-Q/s96-c/photo.jpg"); + principal1.setAuthorities(new HashSet<>(Arrays.asList(Authorities.ADMIN, Authorities.USER))); + principal1.setExpiresAt(addADay(new Date()));*/ return principal; } @@ -52,4 +58,13 @@ public final class PrincipalArgumentResolver implements HandlerMethodArgumentRes this.authenticationService = authenticationService; } + private Date addADay(Date date) { + Date dt = new Date(); + Calendar c = Calendar.getInstance(); + c.setTime(dt); + c.add(Calendar.DATE, 1); + dt = c.getTime(); + return dt; + } + } \ No newline at end of file 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 c91d5409d..b7dce1428 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 @@ -235,7 +235,7 @@ public class DataManagementPlanManager { } } - @Async + private static void copyDatasets(DMP newDmp, DatasetDao datasetDao) { List> futures = new LinkedList<>(); for (Dataset dataset : newDmp.getDataset()) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index 21dc814e1..f03263954 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 @@ -6,6 +6,7 @@ import eu.eudat.data.dao.criteria.RegistryCriteria; import eu.eudat.data.dao.criteria.ServiceCriteria; import eu.eudat.data.dao.entities.*; import eu.eudat.data.entities.*; +import eu.eudat.data.query.items.table.dataset.DatasetPublicTableRequest; import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; import eu.eudat.elastic.criteria.DatasetCriteria; import eu.eudat.elastic.repository.DatasetRepository; @@ -76,6 +77,25 @@ public class DatasetManager { return dataTable; } + public DataTableData getPaged(ApiContext apiContext, DatasetPublicTableRequest datasetTableRequest, Principal principal) throws Exception { + datasetTableRequest.setQuery(apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class))); + QueryableList pagedItems = PaginationManager.applyPaging(datasetTableRequest.applyCriteria(), datasetTableRequest); + DataTableData dataTable = new DataTableData(); + + + CompletableFuture> itemsFuture = pagedItems. + selectAsync(item -> new DatasetListingModel().fromDataModel(item)).whenComplete((resultList, throwable) -> { + dataTable.setData(resultList); + }); + + CompletableFuture countFuture = pagedItems.countAsync().whenComplete((count, throwable) -> { + dataTable.setTotalCount(count); + }); + + CompletableFuture.allOf(itemsFuture, countFuture).join(); + return dataTable; + } + public DatasetWizardModel getSingle(DatasetDao datatasetRepository, DatasetRepository elasticDatasetRepository, String id) throws InstantiationException, IllegalAccessException, IOException { DatasetWizardModel dataset = new DatasetWizardModel(); eu.eudat.data.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java index 310f53160..b70928c79 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java @@ -97,6 +97,7 @@ public class ProjectManager { public List getCriteria(ProjectDao projectRepository, ProjectCriteriaRequest projectCriteria, RemoteFetcher remoteFetcher) throws IllegalAccessException, InstantiationException, HugeResultSet, NoURLFound { QueryableList items = projectRepository.getWithCriteria(projectCriteria.getCriteria()); + if(projectCriteria.getLength() != null) items.take(projectCriteria.getLength()); List projects = items.select(item -> new Project().fromDataModel(item)); return projects; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java index afd2a3de9..0e36a7442 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java @@ -6,6 +6,7 @@ import eu.eudat.models.data.dmp.Organisation; import eu.eudat.logic.utilities.helpers.LabelBuilder; import eu.eudat.models.data.urls.DatasetUrlListing; +import java.util.Date; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -16,9 +17,9 @@ public class DataManagementPlanListingModel implements DataModel datasets; @@ -54,11 +55,11 @@ public class DataManagementPlanListingModel implements DataModel new Organisation().fromDataModel(item)).collect(Collectors.toList())); - this.creationTime = entity.getCreated().toString(); - this.version = "" + entity.getVersion(); + this.creationTime = entity.getCreated(); + this.version = entity.getVersion(); this.groupId = entity.getGroupId(); this.datasets = entity.getDataset().stream().map(x-> new DatasetUrlListing().fromDataModel(x)).collect(Collectors.toList()); return this; 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 7db595dbb..93ec8c0ef 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 @@ -6,6 +6,7 @@ import eu.eudat.models.data.dataset.DataRepository; import eu.eudat.models.data.dataset.Service; import eu.eudat.logic.utilities.helpers.LabelBuilder; +import java.util.Date; import java.util.stream.Collectors; @@ -17,8 +18,8 @@ public class DatasetListingModel implements DataModel new eu.eudat.models.data.dataset.Registry().fromDataModel(item)).collect(Collectors.toList())); this.dataRepositories = LabelBuilder.getLabel(entity.getDatasetDataRepositories().stream().map(item -> new DataRepository().fromDataModel(item.getDataRepository())).collect(Collectors.toList())); this.services = LabelBuilder.getLabel(entity.getServices().stream().map(item -> new Service().fromDataModel(item.getService())).collect(Collectors.toList())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/project/ProjectListingModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/project/ProjectListingModel.java index 9ca2dd6b3..de4727a18 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/project/ProjectListingModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/project/ProjectListingModel.java @@ -7,6 +7,7 @@ import eu.eudat.models.data.files.ContentFile; import eu.eudat.models.data.urls.DataManagementPlanUrlListing; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -26,17 +27,17 @@ public class ProjectListingModel implements DataModel new DataManagementPlanUrlListing().fromDataModel(item)).collect(Collectors.toList()); this.files = entity.getContent() != null ? Arrays.asList(new ContentFile(entity.getContent().getLabel(), UUID.fromString(entity.getContent().getUri().split(":")[1]), "final", entity.getContent().getExtension())) : Arrays.asList(new ContentFile("default.png", null, null, null)); diff --git a/dmp-backend/web/src/main/resources/application.properties b/dmp-backend/web/src/main/resources/application.properties index 2828e85a5..b3d677cf7 100644 --- a/dmp-backend/web/src/main/resources/application.properties +++ b/dmp-backend/web/src/main/resources/application.properties @@ -3,12 +3,13 @@ #eu.eudat.logic.security.portmapping.https = 7444 ########################/Security######################################## server.port=8080 +server.tomcat.max-threads = 1000 logging.file=/logs/spring-boot-logging.log ##########################Persistence########################################## database.driver-class-name=org.postgresql.Driver -devel.database.url=jdbc:postgresql://dbserver02.local.cite.gr:5432/dmptool -devel.database.username=dmtadm -devel.database.password=t00L4DM@18! +devel.database.url=jdbc:postgresql://localhost:32768/dmptool +devel.database.username=postgres +devel.database.password= production.database.url=jdbc:postgresql://develdb1.madgik.di.uoa.gr:5432/dmptool production.database.username=dmptool production.database.password=dmpt00lu$r @@ -69,7 +70,19 @@ project.configuration.grant.name = Grant ################################################################################# http-logger.initial-delay = 0 http-logger.delay = 10 -http-logger.server-address = http://logstash:31311 +http-logger.server-address = http://localhost:31311 #############################Elastic Search###################################### -elasticsearch.host = elasticsearch-dmp -elasticsearch.port = 9200 +elasticsearch.host = localhost +elasticsearch.port = 9201 +############################ +# Number of ms to wait before throwing an exception if no connection is available. +spring.datasource.maxIdle: 10 +spring.datasource.max-active: 70 +spring.datasource.max-wait: 10000 +spring.datasource.validationQuery: select 1 +spring.datasource.removeAbandoned: true +spring.datasource.removeAbandonedTimeout: 1 +spring.datasource.logAbandoned: true +spring.datasource.testOnBorrow: true +spring.datasource.testOnConnect: false +spring.datasource.testWhileIdle: false \ No newline at end of file diff --git a/dmp-frontend/Dockerfile b/dmp-frontend/Dockerfile index ef2af307d..fff27ccaa 100644 --- a/dmp-frontend/Dockerfile +++ b/dmp-frontend/Dockerfile @@ -12,4 +12,5 @@ RUN if [ "$env" = "prod" ]; then ng build --$env --$aot; else ng build --$aot; # Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx FROM nginx:1.13 COPY --from=angular /app/dist/ /usr/share/nginx/html +COPY --from=angular /app/static/ /usr/share/nginx/static COPY ./nginx-custom.conf /etc/nginx/conf.d/default.conf diff --git a/dmp-frontend/nginx-custom.conf b/dmp-frontend/nginx-custom.conf index a560219f7..4ee48806b 100644 --- a/dmp-frontend/nginx-custom.conf +++ b/dmp-frontend/nginx-custom.conf @@ -5,4 +5,8 @@ server { index index.html index.htm; try_files $uri $uri/ /index.html =404; } + + location /material/ { + alias /usr/share/nginx/static/; + } } \ No newline at end of file diff --git a/dmp-frontend/src/app/app.module.ts b/dmp-frontend/src/app/app.module.ts index 8755cc8e0..0e1f6d8b1 100644 --- a/dmp-frontend/src/app/app.module.ts +++ b/dmp-frontend/src/app/app.module.ts @@ -35,6 +35,7 @@ import { BreadCrumbResolverService } from './services/breadcrumb/breadcrumb-reso import { MAT_DATE_LOCALE } from '@angular/material'; import { CultureService } from './utilities/culture/culture-service'; + @NgModule({ declarations: [ AppComponent, diff --git a/dmp-frontend/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.html b/dmp-frontend/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.html index 89011d738..809c046c0 100644 --- a/dmp-frontend/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.html +++ b/dmp-frontend/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.html @@ -1,70 +1,77 @@
- +

Composite Field Description

+
Composite Field Multiplicity -
- Comment -
-
- - - - - - - - - -
-
-
-
- - - - - - - -
-
- - - -
- - - - -
-
+ Comment +
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+
-
+
+ + +
+
+ + + +
+
+ + + +
+
+ + + +
+
- +
-
- - - {{i + 1}}. {{form.get('fields').get(''+i).get('title').value}} -
- -
-
-
- -
-
-
+
+

Field Description

+
+ +
+
- + -
\ No newline at end of file +
+ + + {{i + 1}}. {{form.get('fields').get(''+i).get('title').value}} +
+ +
+
+
+ +
+
+
diff --git a/dmp-frontend/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.ts b/dmp-frontend/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.ts index 15afdb920..7fd4c235e 100644 --- a/dmp-frontend/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.ts +++ b/dmp-frontend/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.ts @@ -1,8 +1,8 @@ import { Component, Input } from '@angular/core'; import { FormGroup } from '@angular/forms'; -import { FieldSet } from 'app/models/datasetProfileAdmin/FieldSet'; -import { Field } from 'app/models/datasetProfileAdmin/Field'; import { FormArray, FormControl } from '@angular/forms'; +import { FieldSet } from '../../models/datasetProfileAdmin/FieldSet'; +import { Field } from '../../models/datasetProfileAdmin/Field'; @Component({ selector: 'compositefield-form', @@ -54,4 +54,4 @@ export class CompositeFieldFormComponent { this.dataModel.fields.splice(index, 1); (this.form.get("fields")).removeAt(index); } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/dataset-profile-form/dataset-profile.module.ts b/dmp-frontend/src/app/dataset-profile-form/dataset-profile.module.ts index 1ad334296..0004728b5 100644 --- a/dmp-frontend/src/app/dataset-profile-form/dataset-profile.module.ts +++ b/dmp-frontend/src/app/dataset-profile-form/dataset-profile.module.ts @@ -24,56 +24,63 @@ import { WordlistComponent } from '../shared/componentsAdmin/wordlist/wordlist-c import { AutocompleteComponent } from '../shared/componentsAdmin/autocomplete/autocomplete-component'; import { ComboboxComponent } from '../shared/componentsAdmin/combobox/combobox-component'; import { SharedModule } from "../shared/shared.module"; +import { DatasetProfilePreviewerComponent } from "./previewer/dataset-profile-previewer.component"; +import { DynamicFormModule } from "../form/dynamic-form.module"; @NgModule({ - imports: [ - CommonModule, - FormsModule, - HttpClientModule, - ReactiveFormsModule, - RouterModule, - SharedModule, - RouterModule.forChild(DatasetProfileRoutes) - ], + imports: [ + CommonModule, + FormsModule, + HttpClientModule, + ReactiveFormsModule, + RouterModule, + SharedModule, + DynamicFormModule, + RouterModule.forChild(DatasetProfileRoutes) + ], - declarations: [ - FormComponent, - //GroupFieldFormComponent, - RuleFormComponent, - SectionFormComponent, - PageFormComponent, - CompositeFieldFormComponent, - FieldFormComponent, - TextAreaComponent, - CheckBoxComponent, - BooleanDecisionComponent, - FreeTextComponent, - ComboboxComponent, - AutocompleteComponent, - WordlistComponent, - RadioBoxComponent - ], + declarations: [ + FormComponent, + //GroupFieldFormComponent, + RuleFormComponent, + SectionFormComponent, + PageFormComponent, + CompositeFieldFormComponent, + FieldFormComponent, + TextAreaComponent, + CheckBoxComponent, + BooleanDecisionComponent, + FreeTextComponent, + ComboboxComponent, + AutocompleteComponent, + WordlistComponent, + RadioBoxComponent, + DatasetProfilePreviewerComponent + ], - exports: [ - FormComponent, - //GroupFieldFormComponent, - RuleFormComponent, - SectionFormComponent, - PageFormComponent, - CompositeFieldFormComponent, - FieldFormComponent, - TextAreaComponent, - CheckBoxComponent, - BooleanDecisionComponent, - FreeTextComponent, - ComboboxComponent, - AutocompleteComponent, - WordlistComponent, - RadioBoxComponent - ], - providers: [ - ] + exports: [ + FormComponent, + //GroupFieldFormComponent, + RuleFormComponent, + SectionFormComponent, + PageFormComponent, + CompositeFieldFormComponent, + FieldFormComponent, + TextAreaComponent, + CheckBoxComponent, + BooleanDecisionComponent, + FreeTextComponent, + ComboboxComponent, + AutocompleteComponent, + WordlistComponent, + RadioBoxComponent + ], + providers: [ + ], + entryComponents: [ + DatasetProfilePreviewerComponent + ] }) -export class DatasetProfileModule { } \ No newline at end of file +export class DatasetProfileModule { } diff --git a/dmp-frontend/src/app/dataset-profile-form/field-form/field-form.component.html b/dmp-frontend/src/app/dataset-profile-form/field-form/field-form.component.html index bb943a32d..3847213c0 100644 --- a/dmp-frontend/src/app/dataset-profile-form/field-form/field-form.component.html +++ b/dmp-frontend/src/app/dataset-profile-form/field-form/field-form.component.html @@ -1,45 +1,24 @@
-
-
- - +
+
+ + -
-
- - - textarea - booleanDecision - combobox - checkBox - freetext - radiobox - - -
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- +
+ + + textarea + booleanDecision + combobox + checkBox + freetext + radiobox + +
- -
-
-
-
Multiplicity
- - - +
+
+
Multiplicity
+ + + + + + +
+
+ + + +
+
+ + + +
+
+
+
- + + {{option.value}} +
- - - -
- - - -
-
-
-
- - - {{option.value}} - - -
-
+
+
-
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
Multiplicity - +
+

Rules Description

+ +
+ {{i + 1}}. Rule {{i + 1}} @@ -95,11 +99,9 @@
- + - - Add Rule + - +
diff --git a/dmp-frontend/src/app/dataset-profile-form/form/form.component.html b/dmp-frontend/src/app/dataset-profile-form/form/form.component.html index 60c0007d2..ae734b017 100644 --- a/dmp-frontend/src/app/dataset-profile-form/form/form.component.html +++ b/dmp-frontend/src/app/dataset-profile-form/form/form.component.html @@ -1,63 +1,77 @@ 
- -
-
-
- - - -
-
+ + + + +
+ + + {{i + 1}}.{{form.get('pages').at(i).get('title').value}} +
+ +
+
+
- - - {{i + 1}}. {{form.get('sections').get(''+i).get('title').value}} -
- -
-
-
-
- -
-
-
+
+
+
+
-
- - - {{i + 1}}.{{form.get('pages').at(i).get('title').value}} -
- -
-
-
-
- -
-
-
-
+
+ +
+
+ -
- - Add Section + - +
+ + + {{i + 1}}. {{form.get('sections').get(''+i).get('title').value}} +
+
- -
- - Add Page + - + +
+
+
+
+ +
+ + + +
+ +
+ + + + +
- - - -
\ No newline at end of file diff --git a/dmp-frontend/src/app/dataset-profile-form/form/form.component.scss b/dmp-frontend/src/app/dataset-profile-form/form/form.component.scss index ed0701625..a013c86bc 100644 --- a/dmp-frontend/src/app/dataset-profile-form/form/form.component.scss +++ b/dmp-frontend/src/app/dataset-profile-form/form/form.component.scss @@ -1,3 +1,3 @@ .full-width { width: 100%; - } \ No newline at end of file + } diff --git a/dmp-frontend/src/app/dataset-profile-form/form/form.component.ts b/dmp-frontend/src/app/dataset-profile-form/form/form.component.ts index feacae1de..c5ae9308f 100644 --- a/dmp-frontend/src/app/dataset-profile-form/form/form.component.ts +++ b/dmp-frontend/src/app/dataset-profile-form/form/form.component.ts @@ -10,6 +10,8 @@ import { Router, ActivatedRoute, ParamMap, Params } from '@angular/router'; import { PageFormComponent } from '../page-form/page-component' import { DatasetProfileAdmin } from '../../services/datasetProfileAdmin/datasetProfileAfmin.service'; import { Section } from '../../models/datasetProfileAdmin/Section'; +import { MatDialog } from '@angular/material'; +import { DatasetProfilePreviewerComponent } from '../previewer/dataset-profile-previewer.component'; @Component({ selector: 'form-comp', @@ -24,8 +26,13 @@ export class FormComponent { form: FormGroup; private profileID: string; - constructor(public datasetprofileAdmin: DatasetProfileAdmin, private datasetProfileService: DatasetProfileService, private route: ActivatedRoute, - private router: Router) { + constructor( + public datasetprofileAdmin: DatasetProfileAdmin, + private datasetProfileService: DatasetProfileService, + private route: ActivatedRoute, + private router: Router, + public dialog: MatDialog, + ) { this.profileID = route.snapshot.params['id']; } @@ -41,7 +48,7 @@ export class FormComponent { } else { this.addSection(); - this.addPage(0); + this.addPage(); } } @@ -58,7 +65,7 @@ export class FormComponent { (this.form.get("sections")).push(section.buildForm()); } - addPage(number) { + addPage() { let page: Page = new Page(this.dataModel.pages.length); this.dataModel.pages.push(page); (this.form.get("pages")).push(page.buildForm()); @@ -91,4 +98,14 @@ export class FormComponent { }); } -} \ No newline at end of file + preview() { + let dialogRef = this.dialog.open(DatasetProfilePreviewerComponent, { + height: '355px', + width: '700px', + data: { + model: this.dataModel + } + }); + } + +} diff --git a/dmp-frontend/src/app/dataset-profile-form/page-form/page-component.html b/dmp-frontend/src/app/dataset-profile-form/page-form/page-component.html index 3ad68805d..ed248310f 100644 --- a/dmp-frontend/src/app/dataset-profile-form/page-form/page-component.html +++ b/dmp-frontend/src/app/dataset-profile-form/page-form/page-component.html @@ -1,8 +1,9 @@ -
-
-
- - -
-
-
\ No newline at end of file +
+
+
+ + + +
+
+
diff --git a/dmp-frontend/src/app/dataset-profile-form/page-form/page-component.scss b/dmp-frontend/src/app/dataset-profile-form/page-form/page-component.scss new file mode 100644 index 000000000..3db0dee74 --- /dev/null +++ b/dmp-frontend/src/app/dataset-profile-form/page-form/page-component.scss @@ -0,0 +1,3 @@ +.full-width { + width: 100%; +} diff --git a/dmp-frontend/src/app/dataset-profile-form/page-form/page-component.ts b/dmp-frontend/src/app/dataset-profile-form/page-form/page-component.ts index c42c03d37..6acf891e0 100644 --- a/dmp-frontend/src/app/dataset-profile-form/page-form/page-component.ts +++ b/dmp-frontend/src/app/dataset-profile-form/page-form/page-component.ts @@ -6,7 +6,7 @@ import { Page } from '../../models/datasetProfileAdmin/Page'; @Component({ selector: 'page-form', templateUrl: './page-component.html', - styleUrls: [] + styleUrls: ['./page-component.scss'] }) export class PageFormComponent { @@ -16,4 +16,4 @@ export class PageFormComponent { TargetValidation() { } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/dataset-profile-form/previewer/dataset-profile-previewer.component.html b/dmp-frontend/src/app/dataset-profile-form/previewer/dataset-profile-previewer.component.html new file mode 100644 index 000000000..fa2852aa3 --- /dev/null +++ b/dmp-frontend/src/app/dataset-profile-form/previewer/dataset-profile-previewer.component.html @@ -0,0 +1,2 @@ + diff --git a/dmp-frontend/src/app/dataset-profile-form/previewer/dataset-profile-previewer.component.scss b/dmp-frontend/src/app/dataset-profile-form/previewer/dataset-profile-previewer.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/dmp-frontend/src/app/dataset-profile-form/previewer/dataset-profile-previewer.component.ts b/dmp-frontend/src/app/dataset-profile-form/previewer/dataset-profile-previewer.component.ts new file mode 100644 index 000000000..cc3543842 --- /dev/null +++ b/dmp-frontend/src/app/dataset-profile-form/previewer/dataset-profile-previewer.component.ts @@ -0,0 +1,36 @@ +import { ViewEncapsulation, Component, Inject } from "@angular/core"; +import { MatDialogRef, MAT_DIALOG_DATA } from "@angular/material"; +import { FormGroup } from "@angular/forms"; +import { DatasetProfileDefinitionModel } from "../../models/DatasetProfileDefinitionModel"; +import { JsonSerializer } from "../../utilities/JsonSerializer"; +import { DatasetModel } from "../../models/datasets/DatasetModel"; +import { DatasetWizardModel } from "../../models/datasets/DatasetWizardModel"; +import { DatasetProfileService } from "../../services/dataset-profile.service"; +import { DatasetProfileAdmin } from "../../services/datasetProfileAdmin/datasetProfileAfmin.service"; + +@Component({ + selector: 'dataset-profile-previewer', + templateUrl: './dataset-profile-previewer.component.html', + styleUrls: ['./dataset-profile-previewer.component.scss'], + encapsulation: ViewEncapsulation.None +}) + +export class DatasetProfilePreviewerComponent { + formGroup: FormGroup + datasetWizardModel: DatasetWizardModel + constructor( + private datasetProfileAdminService: DatasetProfileAdmin, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any + ) { } + + ngOnInit(): void { + + this.datasetProfileAdminService.preview(this.data['model']).subscribe(x => { + this.datasetWizardModel = new DatasetWizardModel(); + this.datasetWizardModel.datasetProfileDefinition = JsonSerializer.fromJSONObject(x, DatasetProfileDefinitionModel) + this.formGroup = this.datasetWizardModel.buildForm(); + }) + + } +} diff --git a/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.html b/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.html index b692d0599..98e304860 100644 --- a/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.html +++ b/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.html @@ -1,23 +1,23 @@
-
-
-
- - - field value - - -
-
- - - -
-
- - - -
-
+
+
+
+ + + field value + + +
+
+ + + +
+
+ + + +
-
\ No newline at end of file +
+
diff --git a/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.scss b/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.scss index e69de29bb..3db0dee74 100644 --- a/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.scss +++ b/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.scss @@ -0,0 +1,3 @@ +.full-width { + width: 100%; +} diff --git a/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.html b/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.html index 6223d83fd..b0d76ae8b 100644 --- a/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.html +++ b/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.html @@ -1,43 +1,59 @@ -
-
-
- - - +
+
+

Section Description

+
+ +
+
+ +
+
+
+
- +
-
+
- + {{pageGroup.get('title').value}} +
+
+
+
+ + + +
+
true false -
- + - {{i + 1}}. {{form.get('sections').get(''+i).get('title').value}} + {{i + 1}}. {{form.get('sections').get(''+i).get('title').value}}
-
+
@@ -52,13 +68,22 @@
-->
- +
+

Field Sets

+
+ +
+
+ + - {{i + 1}}. Field {{i + 1}} + {{i + 1}}. Field {{i + 1}}
- +
@@ -98,14 +123,5 @@ Add Group +
--> - - +
diff --git a/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.scss b/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.scss index 8286984b7..4a04dea81 100644 --- a/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.scss +++ b/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.scss @@ -1,3 +1,3 @@ .full-width { - width: 100%; -} \ No newline at end of file + width: 90%; +} diff --git a/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.ts b/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.ts index 3b8538e08..dde7db951 100644 --- a/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.ts +++ b/dmp-frontend/src/app/dataset-profile-form/section-form/section-form.component.ts @@ -23,10 +23,9 @@ export class SectionFormComponent { constructor() { } ngOnInit() { - var self = this; - this.form.root.get("pages").valueChanges.subscribe(function (value) { - self.keepPageSelectionValid(value); - }); + this.form.root.get("pages").valueChanges.subscribe(x => + this.keepPageSelectionValid(x) + ); } addField() { diff --git a/dmp-frontend/src/app/datasets-admin-listing/dataset-admin-listing.component.html b/dmp-frontend/src/app/datasets-admin-listing/dataset-admin-listing.component.html index 78465427a..bc2e2e7a0 100644 --- a/dmp-frontend/src/app/datasets-admin-listing/dataset-admin-listing.component.html +++ b/dmp-frontend/src/app/datasets-admin-listing/dataset-admin-listing.component.html @@ -80,7 +80,7 @@ - + @@ -91,4 +91,4 @@ -
\ No newline at end of file +
diff --git a/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.html b/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.html index b0f6b8814..8a3c7387a 100644 --- a/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.html +++ b/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.html @@ -1,84 +1,99 @@ -
-

{{'DATASET-PUBLIC-LISTING.TITLE' | translate}} {{titlePrefix}}

- - - - - - - - - - - - {{'DATASET-LISTING.COLUMNS.NAME' | translate}} - {{row.label}} - - - - - {{'DATASET-LISTING.COLUMNS.DMP' | translate}} - {{row.dmp}} - - - - - {{'DATASET-LISTING.COLUMNS.PROFILE' | translate}} - {{row.profile}} - - - - - {{'DATASET-LISTING.COLUMNS.STATUS' | translate}} - {{row.status}} - - - - - - - - - - - - - - - - - {{'DATASET-LISTING.COLUMNS.DESCRIPTION' | translate}} - {{row.description}} - - - - - {{'DATASET-LISTING.COLUMNS.CREATED' | translate}} - {{row.created | date:'shortDate'}} - - - - - - - - - - - - - +
+
+
+ + + +
+
+
+

{{'DATASET-PUBLIC-LISTING.TITLE' | translate}} {{titlePrefix}}

+ + + + + + + + + + + + {{'DATASET-LISTING.COLUMNS.NAME' | translate}} + {{row.label}} + + + + + {{'DATASET-LISTING.COLUMNS.DMP' | + translate}} + {{row.dmp}} + + + + + {{'DATASET-LISTING.COLUMNS.PROFILE' + | translate}} + {{row.profile}} + + + + + {{'DATASET-LISTING.COLUMNS.STATUS' | translate}} + {{row.status}} + + + + + + + + + + + + + + + + + {{'DATASET-LISTING.COLUMNS.DESCRIPTION' | translate}} + {{row.description}} + + + + + {{'DATASET-LISTING.COLUMNS.CREATED' | + translate}} + {{row.created | date:'shortDate'}} + + + + + + + + + + + + + +
+ +
+
diff --git a/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.ts b/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.ts index 68b3e0d68..ea6cffc57 100644 --- a/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.ts +++ b/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.ts @@ -11,6 +11,7 @@ import { DatasetCriteria } from "../../models/criteria/dataset/DatasetCriteria"; import { DataSource } from "@angular/cdk/table"; import { DatasetListingModel } from "../../models/datasets/DatasetListingModel"; import { DataTableRequest } from "../../models/data-table/DataTableRequest"; +import { FacetSearchCriteriaModel } from "../../models/facet-search/FacetSearchCriteriaModel"; @Component({ @@ -31,11 +32,6 @@ export class DatasetPublicListingComponent implements OnInit { titlePrefix: String; dmpId: string; - statuses = [ - { value: '0', viewValue: 'Active' }, - { value: '1', viewValue: 'Inactive' } - ]; - constructor( private datasetService: DatasetService, private router: Router, @@ -49,8 +45,6 @@ export class DatasetPublicListingComponent implements OnInit { ngOnInit() { - - this.route.params.subscribe(async (params: Params) => { this.dmpId = params['dmpId']; this.criteria.setCriteria(this.getDefaultCriteria(this.dmpId)); @@ -64,6 +58,12 @@ export class DatasetPublicListingComponent implements OnInit { }); } + onCriteriaChange(event){ + //console.log(event) + this.criteria.setCriteria(event); + this.refresh(); + } + refresh() { this.dataSource = new DatasetDataSource(this.datasetService, this._paginator, this.sort, this.languageService, this.snackBar, this.criteria, this.dmpId); } @@ -119,10 +119,10 @@ export class DatasetDataSource extends DataSource { const startIndex = this._paginator.pageIndex * this._paginator.pageSize; let fields: Array = new Array() if (this._sort.active) fields = this._sort.direction === "asc" ? ["+" + this._sort.active] : ["-" + this._sort.active]; - const request = new DataTableRequest(startIndex, this._paginator.pageSize, { fields: fields }); + const request = new DataTableRequest(startIndex, this._paginator.pageSize, { fields: fields }); request.criteria = this._criteria.criteria; - if (this.dmpId) request.criteria.allVersions = true; - return this._service.getPaged(request); + //if (this.dmpId) request.criteria.allVersions = true; + return this._service.getPublicPaged(request); }) /*.catch((error: any) => { this._snackBar.openFromComponent(SnackBarNotificationComponent, { diff --git a/dmp-frontend/src/app/datasets/listing/dataset-listing.component.html b/dmp-frontend/src/app/datasets/listing/dataset-listing.component.html index 13549f364..0b9d5a32a 100644 --- a/dmp-frontend/src/app/datasets/listing/dataset-listing.component.html +++ b/dmp-frontend/src/app/datasets/listing/dataset-listing.component.html @@ -17,21 +17,23 @@ - {{'DATASET-LISTING.COLUMNS.DMP' | translate}} + {{'DATASET-LISTING.COLUMNS.DMP' | + translate}} {{row.dmp}} - {{'DATASET-LISTING.COLUMNS.PROFILE' | translate}} + {{'DATASET-LISTING.COLUMNS.PROFILE' | + translate}} {{row.profile}} - {{'DATASET-LISTING.COLUMNS.STATUS' | translate}} - {{row.status}} - + {{'DATASET-LISTING.COLUMNS.STATUS' | translate}} + {{this.utilities.convertFromDatasetStatus(row.status)}} + + + + + + + + + + + + \ No newline at end of file diff --git a/dmp-frontend/static/openDmps.png b/dmp-frontend/static/openDmps.png new file mode 100644 index 0000000000000000000000000000000000000000..5750aa88c9ab2bed58d5858bc58cbb6fe5f320d4 GIT binary patch literal 3322 zcmZ`*c{J4R7yr&?ELrl}vP`IviIFJA_A?mEjO8@Hi7^zuErWh!E#dh1bS={dqZWd{WQtVxb)xrno@RVRe}KGt~>E zXBx1q0;f9&Y1g_tj&*P}LHCQFn+UP&O0xBOhY5xs=4!%KR=lCZkGC?_a{Ji7ML%c= zOZBXV_jG+XpuX*CY5Y7px3}NgwzN-&dfarjC0QtYI+0c=pA2eh80AbjbAaJ7d$5u_ zDS73IrUGAKjA6ZHXwdeV!QsRlV1l!~jT$(j)AW2hB`RjD)AX->ZnuwPl0bqNGg)^G zcE~J_pyu1lD?Q`VHg!xt$4G!^EfAQoAXWozpD5jBxe#5ZZ1E{s#prtJfd0Ub%=tzCT&`q+#ZIwiC@s)vJnWE7@Ddwd6zn|@X`U359RtQY=4bgW^16llY^FVC){?&f zcv_y{P|?_IqMnxi7KQ)>;}~SsSIjjX(*>Ez*ZTKY?+7w$kze9w1f;kekPPr(buoj64DVgKfyGs30#o?ZZbe&2uf5h zlQ1Xo9g)Z8GiAH)~_ulU8#Xc7!zu*)*fwiOV4za<&x&J zuzKA6C*JC=&vWh-j-?g2KZe#%wNJl4*09vH@b`BT;6F3lU6tkUwOsIVajQE0{$g;@ zfWo6j-%0W`9gdX`7j5w1clc99KP+pQP9|W)?P_7_1`5-7}V_aBt&Z8P&bQoA$oY$8ii8p@%>xxr97QqJgG|{!TYw4W5GQ^FY56eD{G|f z$cobq3_0#tP{JWqR?C}P#^W|k<#<$2UyzgQhsT<8oxF!DLT~=~fzsGYT?}5h9-0B; zpnH0*4>!MobER*%b@vAuz<2jVp@Ij6jG#t&iz>&XDOUN@^5&ytRSQGUu*v>Ra&GV1 zd-oF*Ufn{?fj7(#18mY*@>-{~|{jog z4=7zY-unRxm62w1%cRx#&ILofri4=ndP}@6wHB_PUt$s+EtQ$EqJB1w<1BeZ@hU!P zKr&cQLHFsO)LpkSVZ%RGuP-RYvHZKlk0f>NBa*t%oh!X z5pn=lndJDau%Zw#frhpt^F!ux6P!l^3V~Ki`14a7WJ(gIrbKjMxSHxf`kV54!?z;^ zV@eikzczA4wizO&6%sypB3p-iTI{~K;8&w`iHM#(>d@zk>BZi5XFb$vk&$ZQRZ-XD zsXC^NfAp_Kfm@*Y5jJH=?`6-KigNJtc(KJ;r9P~wnNxPg(eXhh|#Pgs6gMl*9jduXn=n}$L*3CzO_Qd0Fy$ubFw zIkksP=R;)QG6ctis4)5I;Y=fFuKkN7Y#ujV=2h@O)sjoo65N-o-ltf&uhb^B3ZZD zk_HKvYY)UGl6H+iyl#7li^O#lVyo+xCr>J$P5K*k@ra;~em)fo+!j0(DPJs9PT zZ{lM@X0;~gX%}a$L(#%!6XGJE0AS866s^nd-|6RziY=<+dKsYD%il@od0T&nNvwK( zH}d&8A%15OwP;s@3Pcz38F*L#2pNTcz5g_Dsf(iMm+abO^KHKZ&Fz&hTqjD5dgxKD z7EU@}ivHkBA!*4zwzC}G3gYm|GdEo9JdSKK5@8e_k^HsorNk5Kt4`$9+J(*P z#Q{L==th5f{LTp@h;3xFidPBq6Z|fm-~jS5vNvXVnY=Qw?xED7Z+~@=qk}?A%SRwi zQe)Q6P5E(`S1Ta?zn)-24YnAPTp4mc;wWD$Hltq2S=U!RupqikWP(-%9~n8^b~b((V_6w0H82!3fjQS!1k%9|Bul3f;`(+HH&4K~T5! zq3Qr1r2b)3>N0qg8y~q9ioJ>O5R9@`dxpT27A^x>;1^5jk*XvEIoU!{tI3n6Wm-$-|6)7hy(>)*~$%w4gUao^_pOEaqg9adDx zU1Ces>|M3(k`v6Dv)V$;6xU^4h7jZ8qSS8E4u_l6c(bFC`dkS^UX!|;4@Eu4)~eZI0TXZD)=#% zdrgh0*P*!;FQ%1|JmP4>f4;o;UmU+(!qTW`*r+FRiRwPs}HH$ zv03Xj;iQpAZNx1R=LrwNpBJ3y;FE!8A1PlYn6Qb*&8NWIdgl)mM)cJmmJ328wP#1x z$JwB|9hn?(o(km5Q~z|g%(bB8oLoUW8nW$C%ydHHo4g$?1OskiF%#;}o?nk&E&}89 zHbv(HO1YUh2SmEDhD9$QYUx%khy}j%z&-fXrJ>!^i{vnVsZ6r#YV$0v~qUG%Wa;8wfH>Cfp z65qxcTfw7E6PqMn#$Jr1+MWH_K=s)D)wS13|8^>-vz@;kR*dFJd}N6Eg%BUl5Q@I{ zH44uGTAHUZXw9?e(>l(YdirN{^fh_m8GTL72oPoXe*jkld}zKA{~y3lnxXRmM}ALm r3h)gH^Snj@!otEdX!I+=-kyOJjeu*^ybVKHUJ-ydx5Yg*CCC03g$~_1 literal 0 HcmV?d00001 diff --git a/dmp-frontend/tslint.json b/dmp-frontend/tslint.json index 83cd67266..daf1273ab 100644 --- a/dmp-frontend/tslint.json +++ b/dmp-frontend/tslint.json @@ -1,143 +1,137 @@ { - "rulesDirectory": [ - "node_modules/codelyzer" - ], - "rules": { - "arrow-return-shorthand": true, - "callable-types": true, - "class-name": true, - "comment-format": [ - true, - "check-space" - ], - "curly": true, - "deprecation": { - "severity": "warn" - }, - "eofline": true, - "forin": true, - "import-blacklist": [ - true, - "rxjs/Rx" - ], - "import-spacing": true, - "indent": [ - true, - "tabs", - 4 - ], - "interface-over-type-literal": true, - "label-position": true, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-arg": true, - "no-bitwise": true, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-construct": true, - "no-debugger": true, - "no-duplicate-super": true, - "no-empty": false, - "no-empty-interface": true, - "no-eval": true, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-misused-new": true, - "no-non-null-assertion": true, - "no-shadowed-variable": true, - "no-string-literal": false, - "no-string-throw": true, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unnecessary-initializer": true, - "no-unused-expression": true, - "no-use-before-declare": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "prefer-const": true, - "quotemark": [ - true, - "single" - ], - "radix": true, - "semicolon": [ - true, - "always" - ], - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "unified-signatures": true, - "variable-name": false, - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ], - "directive-selector": [ - true, - "attribute", - "app", - "camelCase" - ], - "component-selector": [ - true, - "element", - "app", - "kebab-case" - ], - "no-output-on-prefix": true, - "use-input-property-decorator": true, - "use-output-property-decorator": true, - "use-host-property-decorator": true, - "no-input-rename": true, - "no-output-rename": true, - "use-life-cycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true - } + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true + ], + "curly": true, + "eofline": true, + "forin": true, + "import-blacklist": [ + true + ], + "import-spacing": true, + "indent": [ + true, + "tabs", + 4 + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + false, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": false, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } } diff --git a/docker-compose.yml b/docker-compose.yml index a99174e5c..2dc0ea360 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -39,6 +39,8 @@ services: env: ${ENV} aot: ${AOT} container_name: dmp-frontend + volumes: + - ./static:/usr/share/nginx/static ports: ['0.0.0.0:80:80'] networks: ['stack'] diff --git a/static/goodbye.html b/static/goodbye.html new file mode 100644 index 000000000..b8f852e74 --- /dev/null +++ b/static/goodbye.html @@ -0,0 +1 @@ +goodbye world \ No newline at end of file diff --git a/static/index.html b/static/index.html new file mode 100644 index 000000000..77ad84d36 --- /dev/null +++ b/static/index.html @@ -0,0 +1,29 @@ + + + + + + + + + Data Management Plans Creator + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/openDmps.png b/static/openDmps.png new file mode 100644 index 0000000000000000000000000000000000000000..5750aa88c9ab2bed58d5858bc58cbb6fe5f320d4 GIT binary patch literal 3322 zcmZ`*c{J4R7yr&?ELrl}vP`IviIFJA_A?mEjO8@Hi7^zuErWh!E#dh1bS={dqZWd{WQtVxb)xrno@RVRe}KGt~>E zXBx1q0;f9&Y1g_tj&*P}LHCQFn+UP&O0xBOhY5xs=4!%KR=lCZkGC?_a{Ji7ML%c= zOZBXV_jG+XpuX*CY5Y7px3}NgwzN-&dfarjC0QtYI+0c=pA2eh80AbjbAaJ7d$5u_ zDS73IrUGAKjA6ZHXwdeV!QsRlV1l!~jT$(j)AW2hB`RjD)AX->ZnuwPl0bqNGg)^G zcE~J_pyu1lD?Q`VHg!xt$4G!^EfAQoAXWozpD5jBxe#5ZZ1E{s#prtJfd0Ub%=tzCT&`q+#ZIwiC@s)vJnWE7@Ddwd6zn|@X`U359RtQY=4bgW^16llY^FVC){?&f zcv_y{P|?_IqMnxi7KQ)>;}~SsSIjjX(*>Ez*ZTKY?+7w$kze9w1f;kekPPr(buoj64DVgKfyGs30#o?ZZbe&2uf5h zlQ1Xo9g)Z8GiAH)~_ulU8#Xc7!zu*)*fwiOV4za<&x&J zuzKA6C*JC=&vWh-j-?g2KZe#%wNJl4*09vH@b`BT;6F3lU6tkUwOsIVajQE0{$g;@ zfWo6j-%0W`9gdX`7j5w1clc99KP+pQP9|W)?P_7_1`5-7}V_aBt&Z8P&bQoA$oY$8ii8p@%>xxr97QqJgG|{!TYw4W5GQ^FY56eD{G|f z$cobq3_0#tP{JWqR?C}P#^W|k<#<$2UyzgQhsT<8oxF!DLT~=~fzsGYT?}5h9-0B; zpnH0*4>!MobER*%b@vAuz<2jVp@Ij6jG#t&iz>&XDOUN@^5&ytRSQGUu*v>Ra&GV1 zd-oF*Ufn{?fj7(#18mY*@>-{~|{jog z4=7zY-unRxm62w1%cRx#&ILofri4=ndP}@6wHB_PUt$s+EtQ$EqJB1w<1BeZ@hU!P zKr&cQLHFsO)LpkSVZ%RGuP-RYvHZKlk0f>NBa*t%oh!X z5pn=lndJDau%Zw#frhpt^F!ux6P!l^3V~Ki`14a7WJ(gIrbKjMxSHxf`kV54!?z;^ zV@eikzczA4wizO&6%sypB3p-iTI{~K;8&w`iHM#(>d@zk>BZi5XFb$vk&$ZQRZ-XD zsXC^NfAp_Kfm@*Y5jJH=?`6-KigNJtc(KJ;r9P~wnNxPg(eXhh|#Pgs6gMl*9jduXn=n}$L*3CzO_Qd0Fy$ubFw zIkksP=R;)QG6ctis4)5I;Y=fFuKkN7Y#ujV=2h@O)sjoo65N-o-ltf&uhb^B3ZZD zk_HKvYY)UGl6H+iyl#7li^O#lVyo+xCr>J$P5K*k@ra;~em)fo+!j0(DPJs9PT zZ{lM@X0;~gX%}a$L(#%!6XGJE0AS866s^nd-|6RziY=<+dKsYD%il@od0T&nNvwK( zH}d&8A%15OwP;s@3Pcz38F*L#2pNTcz5g_Dsf(iMm+abO^KHKZ&Fz&hTqjD5dgxKD z7EU@}ivHkBA!*4zwzC}G3gYm|GdEo9JdSKK5@8e_k^HsorNk5Kt4`$9+J(*P z#Q{L==th5f{LTp@h;3xFidPBq6Z|fm-~jS5vNvXVnY=Qw?xED7Z+~@=qk}?A%SRwi zQe)Q6P5E(`S1Ta?zn)-24YnAPTp4mc;wWD$Hltq2S=U!RupqikWP(-%9~n8^b~b((V_6w0H82!3fjQS!1k%9|Bul3f;`(+HH&4K~T5! zq3Qr1r2b)3>N0qg8y~q9ioJ>O5R9@`dxpT27A^x>;1^5jk*XvEIoU!{tI3n6Wm-$-|6)7hy(>)*~$%w4gUao^_pOEaqg9adDx zU1Ces>|M3(k`v6Dv)V$;6xU^4h7jZ8qSS8E4u_l6c(bFC`dkS^UX!|;4@Eu4)~eZI0TXZD)=#% zdrgh0*P*!;FQ%1|JmP4>f4;o;UmU+(!qTW`*r+FRiRwPs}HH$ zv03Xj;iQpAZNx1R=LrwNpBJ3y;FE!8A1PlYn6Qb*&8NWIdgl)mM)cJmmJ328wP#1x z$JwB|9hn?(o(km5Q~z|g%(bB8oLoUW8nW$C%ydHHo4g$?1OskiF%#;}o?nk&E&}89 zHbv(HO1YUh2SmEDhD9$QYUx%khy}j%z&-fXrJ>!^i{vnVsZ6r#YV$0v~qUG%Wa;8wfH>Cfp z65qxcTfw7E6PqMn#$Jr1+MWH_K=s)D)wS13|8^>-vz@;kR*dFJd}N6Eg%BUl5Q@I{ zH44uGTAHUZXw9?e(>l(YdirN{^fh_m8GTL72oPoXe*jkld}zKA{~y3lnxXRmM}ALm r3h)gH^Snj@!otEdX!I+=-kyOJjeu*^ybVKHUJ-ydx5Yg*CCC03g$~_1 literal 0 HcmV?d00001