From 6a7c1b6e9dff73df14f3ad9e2551e4b89e3af72c Mon Sep 17 00:00:00 2001 From: dtziotzios Date: Thu, 31 Jan 2019 13:24:11 +0200 Subject: [PATCH 1/4] Parameterizes Project's query endpoint for more efficient listing. --- .../java/eu/eudat/controllers/Projects.java | 7 +-- .../eudat/logic/managers/ProjectManager.java | 47 +++++++++++-------- .../data/project/ProjectListingModel.java | 7 ++- .../core/services/project/project.service.ts | 10 +++- .../criteria/dmp-criteria.component.ts | 2 +- .../explore-dataset-filters.component.ts | 4 +- .../listing/project-listing.component.ts | 2 +- 7 files changed, 49 insertions(+), 30 deletions(-) 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 b7dd42a32..4b784dc22 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 @@ -38,15 +38,16 @@ public class Projects extends BaseController { private ProjectManager projectManager; @Autowired - public Projects(ApiContext apiContext, ProjectManager projectManager) { + public Projects(ApiContext apiContext, ProjectManager projectManager) { super(apiContext); this.projectManager = projectManager; } @RequestMapping(method = RequestMethod.POST, value = {"/paged"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity>> getPaged(@Valid @RequestBody ProjectTableRequest projectTableRequest, Principal principal) throws Exception { - DataTableData dataTable = this.projectManager.getPaged(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), projectTableRequest, principal); + ResponseEntity>> getPaged(@Valid @RequestBody ProjectTableRequest projectTableRequest, @RequestParam String fieldsGroup, Principal principal) throws Exception { + System.out.println(fieldsGroup); + DataTableData dataTable = this.projectManager.getPaged(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), projectTableRequest, principal, fieldsGroup); 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/managers/ProjectManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java index c9c1e5c6b..770b4ad80 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 @@ -39,7 +39,7 @@ import java.util.stream.Collectors; @Component public class ProjectManager { - public DataTableData getPaged(ProjectDao projectRepository, ProjectTableRequest projectTableRequest, Principal principal) throws Exception { + public DataTableData getPaged(ProjectDao projectRepository, ProjectTableRequest projectTableRequest, Principal principal, String fieldsGroup) throws Exception { eu.eudat.data.entities.UserInfo userInfo = new eu.eudat.data.entities.UserInfo(); userInfo.setId(principal.getId()); QueryableList items = projectRepository.getWithCriteria(projectTableRequest.getCriteria()); @@ -47,21 +47,28 @@ public class ProjectManager { QueryableList pagedItems = PaginationManager.applyPaging(authItems, projectTableRequest); DataTableData dataTable = new DataTableData<>(); - CompletableFuture projectsFuture = pagedItems.withHint(HintedModelFactory.getHint(ProjectListingModel.class)).selectAsync(item -> { - item.setDmps(item.getDmps().stream().filter( - dmp -> dmp.getCreator().getId().equals(principal.getId()) || dmp.getUsers().stream().filter(user -> user.getId().equals(principal.getId())).collect(Collectors.toList()).size() > 0) - .collect(Collectors.groupingBy(DMP::getGroupId)) - .values().stream() - .map(dmps -> dmps.stream().reduce((first, second) -> { - if (first.getVersion() > second.getVersion()) return first; - else return second; - }).get()) - .collect(Collectors.toSet())); - return new ProjectListingModel().fromDataModel(item); - }).whenComplete((results, throwable) -> { - dataTable.setData(results); - }); - + CompletableFuture projectsFuture; + if (fieldsGroup.equals("listing")) { + projectsFuture = pagedItems.withHint(HintedModelFactory.getHint(ProjectListingModel.class)).selectAsync(item -> { + item.setDmps(item.getDmps().stream().filter( + dmp -> dmp.getCreator().getId().equals(principal.getId()) || dmp.getUsers().stream().filter(user -> user.getId().equals(principal.getId())).collect(Collectors.toList()).size() > 0) + .collect(Collectors.groupingBy(DMP::getGroupId)) + .values().stream() + .map(dmps -> dmps.stream().reduce((first, second) -> { + if (first.getVersion() > second.getVersion()) return first; + else return second; + }).get()) + .collect(Collectors.toSet())); + return new ProjectListingModel().fromDataModelWIthDmps(item); + }).whenComplete((results, throwable) -> { + dataTable.setData(results); + }); + } else { + projectsFuture = pagedItems.selectAsync(item -> new ProjectListingModel().fromDataModel(item)) + .whenComplete((results, throwable) -> { + dataTable.setData(results); + }); + } CompletableFuture countFuture = pagedItems.countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count)); CompletableFuture.allOf(projectsFuture, countFuture).join(); @@ -95,20 +102,20 @@ public class ProjectManager { projects.add(project); } - projects.sort(Comparator.comparing(x-> x.getLabel())); + projects.sort(Comparator.comparing(x -> x.getLabel())); return projects; } 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()); + if (projectCriteria.getLength() != null) items.take(projectCriteria.getLength()); List projects = items.select(item -> new Project().fromDataModel(item)); return projects; } public static void createOrUpdate(FileStorageService fileStorageService, ProjectDao projectRepository, ContentDao contentRepository, UserInfoDao userInfoRepository, eu.eudat.models.data.project.Project project, Principal principal) throws ParseException, IOException { eu.eudat.data.entities.Project projectEntity = project.toDataModel(); - if(project.getFiles() != null) { + if (project.getFiles() != null) { for (ContentFile file : project.getFiles()) { try { ContentFile storedFile = fileStorageService.copyFromTempFileSystem(file); @@ -129,7 +136,7 @@ public class ProjectManager { projectRepository.createOrUpdate(projectEntity); } - public void delete(ApiContext apiContext, UUID uuid) { + public void delete(ApiContext apiContext, UUID uuid) { eu.eudat.data.entities.Project oldProject = apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().find(uuid); if (oldProject.getDmps().size() > 0) throw new ProjectWithDMPsDeleteException("You cannot Remove Projects with DMPs"); 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 de4727a18..63359cbd7 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 @@ -184,11 +184,16 @@ 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)); return this; } + public ProjectListingModel fromDataModelWIthDmps(eu.eudat.data.entities.Project entity) { + this.fromDataModel(entity); + this.dmps = entity.getDmps().stream().map(item -> new DataManagementPlanUrlListing().fromDataModel(item)).collect(Collectors.toList()); + return this; + } + @Override public eu.eudat.data.entities.Project toDataModel() throws Exception { throw new Exception("Not Implemented"); diff --git a/dmp-frontend/src/app/core/services/project/project.service.ts b/dmp-frontend/src/app/core/services/project/project.service.ts index 1f894e4b9..566ffb715 100644 --- a/dmp-frontend/src/app/core/services/project/project.service.ts +++ b/dmp-frontend/src/app/core/services/project/project.service.ts @@ -9,6 +9,7 @@ import { ProjectListingModel } from '../../model/project/project-listing'; import { ProjectCriteria } from '../../query/project/project-criteria'; import { BaseHttpService } from '../http/base-http.service'; + @Injectable() export class ProjectService { @@ -19,8 +20,13 @@ export class ProjectService { this.actionUrl = environment.Server + 'projects/'; } - getPaged(dataTableRequest: DataTableRequest): Observable> { - return this.http.post>(this.actionUrl + 'paged', dataTableRequest, { headers: this.headers }); + getPaged(dataTableRequest: DataTableRequest,fieldsGroup?: string): Observable> { + if(fieldsGroup){ + return this.http.post>(this.actionUrl + 'paged?fieldsGroup=' + fieldsGroup, dataTableRequest, { headers: this.headers }); + } + else{ + return this.http.post>(this.actionUrl + 'paged?fieldsGroup=' + 'autocomplete', dataTableRequest, { headers: this.headers }); + } } getWithExternal(requestItem: RequestItem): Observable { diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts index 06c214356..f69798e56 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts @@ -77,6 +77,6 @@ export class DmpCriteriaComponent extends BaseCriteriaComponent implements OnIni const projectRequestItem: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); projectRequestItem.criteria = new ProjectCriteria(); projectRequestItem.criteria.like = query; - return this.projectService.getPaged(projectRequestItem).map(x => x.data); + return this.projectService.getPaged(projectRequestItem, "autocomplete").map(x => x.data); } } diff --git a/dmp-frontend/src/app/ui/explore-dataset/filters/explore-dataset-filters.component.ts b/dmp-frontend/src/app/ui/explore-dataset/filters/explore-dataset-filters.component.ts index aabb94594..def4be3a3 100644 --- a/dmp-frontend/src/app/ui/explore-dataset/filters/explore-dataset-filters.component.ts +++ b/dmp-frontend/src/app/ui/explore-dataset/filters/explore-dataset-filters.component.ts @@ -96,7 +96,7 @@ export class ExploreDatasetFiltersComponent extends BaseComponent implements OnI dataTableRequest.criteria = new ProjectCriteria(); dataTableRequest.criteria.projectStateType = this.facetCriteria.projectStatus; dataTableRequest.criteria['length'] = 10; - this.projects = this.projectService.getPaged(dataTableRequest).map(x => x.data); + this.projects = this.projectService.getPaged(dataTableRequest, "autocomplete").map(x => x.data); this.facetCriteria.projects = []; } this.facetCriteriaChange.emit(this.facetCriteria); @@ -157,7 +157,7 @@ export class ExploreDatasetFiltersComponent extends BaseComponent implements OnI const dataTableRequest: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); dataTableRequest.criteria = projectCriteria; //const dataTableRequest: RequestItem = { criteria: projectCriteria }; - return this.projectService.getPaged(dataTableRequest).map(x => x.data); + return this.projectService.getPaged(dataTableRequest, "autocomplete").map(x => x.data); } public dmpOrganisationSearch(value: string): Observable { diff --git a/dmp-frontend/src/app/ui/project/listing/project-listing.component.ts b/dmp-frontend/src/app/ui/project/listing/project-listing.component.ts index 457ee4230..84350067e 100644 --- a/dmp-frontend/src/app/ui/project/listing/project-listing.component.ts +++ b/dmp-frontend/src/app/ui/project/listing/project-listing.component.ts @@ -103,7 +103,7 @@ export class ProjectDataSource extends DataSource { 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 }); request.criteria = this._criteria.criteria; - return this._service.getPaged(request); + return this._service.getPaged(request, "listing"); }) /*.catch((error: any) => { this._snackBar.openFromComponent(SnackBarNotificationComponent, { From e829c5e6f0924fd1335b04cc4b19500152aef35a Mon Sep 17 00:00:00 2001 From: dtziotzios Date: Thu, 31 Jan 2019 15:56:53 +0200 Subject: [PATCH 2/4] Parameterizes DMPs query endpoint for more efficient listing --- .../main/java/eu/eudat/controllers/DMPs.java | 4 +-- .../managers/DataManagementPlanManager.java | 33 ++++++++++++------- .../DataManagementPlanListingModel.java | 18 ++++++---- .../src/app/core/services/dmp/dmp.service.ts | 10 ++++-- .../dataset-wizard.component.ts | 2 +- .../ui/dmp/listing/dmp-listing.component.ts | 2 +- 6 files changed, 45 insertions(+), 24 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index 166c31262..0e2131885 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -66,8 +66,8 @@ public class DMPs extends BaseController { @RequestMapping(method = RequestMethod.POST, value = {"/paged"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity>> getPaged(@Valid @RequestBody DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal) throws Exception { - DataTableData dataTable = this.dataManagementPlanManager.getPaged(this.getApiContext(), dataManagementPlanTableRequest, principal); + ResponseEntity>> getPaged(@Valid @RequestBody DataManagementPlanTableRequest dataManagementPlanTableRequest,@RequestParam String fieldsGroup, Principal principal) throws Exception { + DataTableData dataTable = this.dataManagementPlanManager.getPaged(this.getApiContext(), dataManagementPlanTableRequest, principal, fieldsGroup); 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/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index b884e5289..edadc455a 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 @@ -52,7 +52,7 @@ import java.util.stream.Collectors; @Component public class DataManagementPlanManager { - public DataTableData getPaged(ApiContext apiContext, DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal) throws Exception { + public DataTableData getPaged(ApiContext apiContext, DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal, String fieldsGroup) throws Exception { UserInfo userInfo = new UserInfo(); userInfo.setId(principal.getId()); QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)); @@ -61,17 +61,26 @@ public class DataManagementPlanManager { DataTableData dataTable = new DataTableData<>(); - CompletableFuture itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) - .selectAsync(item -> { - item.setDataset( - item.getDataset().stream() - .filter(dataset -> dataset.getDmp().getCreator().getId().equals(userInfo.getId()) - || dataset.isPublic() - || dataset.getDmp().getUsers().stream() - .filter(x -> x.getId().equals(userInfo.getId())).collect(Collectors.toList()).size() > 0).collect(Collectors.toSet())); - return new DataManagementPlanListingModel().fromDataModel(item); - }) - .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); + CompletableFuture itemsFuture; + if(fieldsGroup.equals("listing")){ + + itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) + .selectAsync(item -> { + item.setDataset( + item.getDataset().stream() + .filter(dataset -> dataset.getDmp().getCreator().getId().equals(userInfo.getId()) + || dataset.isPublic() + || dataset.getDmp().getUsers().stream() + .filter(x -> x.getId().equals(userInfo.getId())).collect(Collectors.toList()).size() > 0).collect(Collectors.toSet())); + return new DataManagementPlanListingModel().fromDataModelDatasets(item); + }) + .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); + } + else{ + itemsFuture = pagedItems + .selectAsync(item -> new DataManagementPlanListingModel().fromDataModel(item) ) + .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); + } CompletableFuture countFuture = authItems.countAsync().whenComplete((count, throwable) -> { dataTable.setTotalCount(count); 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 267b467e8..27dd505a2 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 @@ -108,17 +108,23 @@ public class DataManagementPlanListingModel implements DataModel new Organisation().fromDataModel(item)).collect(Collectors.toList())); - this.creationTime = entity.getCreated(); - this.version = entity.getVersion(); this.groupId = entity.getGroupId(); + return this; + } + + public DataManagementPlanListingModel fromDataModelDatasets(DMP entity) { + this.fromDataModel(entity); + this.status = entity.getStatus(); + this.version = entity.getVersion(); + this.project = entity.getProject().getLabel(); + if (entity.getProfile() != null) this.profile = entity.getProfile().getLabel(); + this.creationTime = entity.getCreated(); + this.organisations = LabelBuilder.getLabel(entity.getOrganisations().stream().map(item -> new Organisation().fromDataModel(item)).collect(Collectors.toList())); this.datasets = entity.getDataset().stream().map(x-> new DatasetUrlListing().fromDataModel(x)).collect(Collectors.toList()); return this; } + @Override public DMP toDataModel() { return null; diff --git a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts index 47714e971..b08861e80 100644 --- a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts +++ b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts @@ -23,8 +23,14 @@ export class DmpService { this.actionUrl = environment.Server + 'dmps/'; } - getPaged(dataTableRequest: DataTableRequest): Observable> { - return this.http.post>(this.actionUrl + 'paged', dataTableRequest, { headers: this.headers }); + getPaged(dataTableRequest: DataTableRequest, fieldsGroup?: string): Observable> { + if (fieldsGroup) { + return this.http.post>(this.actionUrl + 'paged?fieldsGroup=' + fieldsGroup, dataTableRequest, { headers: this.headers }); + } + else { + return this.http.post>(this.actionUrl + 'paged?fieldsGroup=' + fieldsGroup, dataTableRequest, { headers: this.headers }); + } + } getSingle(id: String): Observable { diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts index a583480ca..0fb579b96 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts @@ -218,7 +218,7 @@ export class DatasetWizardComponent extends BaseComponent implements OnInit, IBr const dmpDataTableRequest: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); dmpDataTableRequest.criteria = new DmpCriteria(); dmpDataTableRequest.criteria.like = query; - return this.dmpService.getPaged(dmpDataTableRequest).map(x => x.data); + return this.dmpService.getPaged(dmpDataTableRequest, "autocomplete").map(x => x.data); } loadDatasetProfiles() { diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index d9761d989..223b55850 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -156,7 +156,7 @@ export class DmpDataSource extends DataSource { request.criteria.groupIds = [this.itemId]; request.criteria.allVersions = true; } - return this._service.getPaged(request); + return this._service.getPaged(request, "listing"); }) /*.catch((error: any) => { this._snackBar.openFromComponent(SnackBarNotificationComponent, { From 8b77ab759abd5ac6cd6ab530eba2788cb6496e77 Mon Sep 17 00:00:00 2001 From: dtziotzios Date: Thu, 31 Jan 2019 16:06:43 +0200 Subject: [PATCH 3/4] Small fixes on Project's endpoint listing. --- .../eudat/models/data/project/ProjectListingModel.java | 10 +++++----- .../src/app/core/services/project/project.service.ts | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) 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 63359cbd7..ae93cb757 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 @@ -174,6 +174,11 @@ public class ProjectListingModel implements DataModel new DataManagementPlanUrlListing().fromDataModel(item)).collect(Collectors.toList()); return this; } diff --git a/dmp-frontend/src/app/core/services/project/project.service.ts b/dmp-frontend/src/app/core/services/project/project.service.ts index 566ffb715..c9af2967c 100644 --- a/dmp-frontend/src/app/core/services/project/project.service.ts +++ b/dmp-frontend/src/app/core/services/project/project.service.ts @@ -20,11 +20,11 @@ export class ProjectService { this.actionUrl = environment.Server + 'projects/'; } - getPaged(dataTableRequest: DataTableRequest,fieldsGroup?: string): Observable> { - if(fieldsGroup){ + getPaged(dataTableRequest: DataTableRequest, fieldsGroup?: string): Observable> { + if (fieldsGroup) { return this.http.post>(this.actionUrl + 'paged?fieldsGroup=' + fieldsGroup, dataTableRequest, { headers: this.headers }); } - else{ + else { return this.http.post>(this.actionUrl + 'paged?fieldsGroup=' + 'autocomplete', dataTableRequest, { headers: this.headers }); } } From a6a7b2bdce6f9190dc26ad3b5165a03998ea45a0 Mon Sep 17 00:00:00 2001 From: dtziotzios Date: Thu, 31 Jan 2019 17:53:37 +0200 Subject: [PATCH 4/4] Refactor the Datasets endpoint --- .../controllers/DatasetProfileController.java | 9 ----- .../controllers/DatasetWizardController.java | 37 +++++++++++++------ .../java/eu/eudat/controllers/Datasets.java | 19 ++++++---- .../eudat/logic/managers/DatasetManager.java | 19 +++++----- .../dataset-wizard/dataset-wizard.service.ts | 10 ++--- .../core/services/dataset/dataset.service.ts | 2 +- 6 files changed, 52 insertions(+), 44 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfileController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfileController.java index f53a59ae5..102daf447 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfileController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfileController.java @@ -41,15 +41,6 @@ public class DatasetProfileController extends BaseController { super(apiContext); } - @RequestMapping(method = RequestMethod.GET, value = {"/datasetwizard/get/{id}"}, produces = "application/json") - public ResponseEntity> getSingle(@PathVariable String id) { - eu.eudat.data.entities.DatasetProfile profile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); - eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = UserManager.generateDatasetProfileModel(profile); - PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile(); - pagedDatasetProfile.buildPagedDatasetProfile(datasetprofile); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(pagedDatasetProfile)); - } - @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/datasetprofile/save/{id}"}, consumes = "application/json", produces = "application/json") public ResponseEntity updateDataset(@PathVariable String id, @RequestBody PropertiesModel properties) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java index cedcca1f7..0cc183b42 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java @@ -6,6 +6,7 @@ import eu.eudat.data.query.items.item.datasetprofile.DatasetProfileWizardAutocom import eu.eudat.exceptions.datasetwizard.DatasetWizardCannotUnlockException; import eu.eudat.logic.managers.DatasetManager; import eu.eudat.logic.managers.DatasetWizardManager; +import eu.eudat.logic.managers.UserManager; import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; @@ -14,6 +15,7 @@ import eu.eudat.models.data.datasetwizard.DatasetWizardModel; import eu.eudat.models.data.dmp.AssociatedProfile; 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.apache.poi.util.IOUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -42,11 +44,13 @@ import static eu.eudat.types.Authorities.ANONYMOUS; public class DatasetWizardController extends BaseController { private Environment environment; + private DatasetManager datasetManager; @Autowired - public DatasetWizardController(ApiContext apiContext, Environment environment) { + public DatasetWizardController(ApiContext apiContext, Environment environment, DatasetManager datasetManager) { super(apiContext); this.environment = environment; + this.datasetManager = datasetManager; } @RequestMapping(method = RequestMethod.POST, value = {"/userDmps"}, produces = "application/json") @@ -66,15 +70,23 @@ public class DatasetWizardController extends BaseController { @RequestMapping(method = RequestMethod.GET, value = {"/getSingle/{id}"}, produces = "application/json") public @ResponseBody ResponseEntity> getSingle(@PathVariable String id, @ClaimedAuthorities(claims = {ANONYMOUS}) Principal principal) throws IllegalAccessException, IOException, InstantiationException { - DatasetWizardModel dataset = new DatasetManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), this.getApiContext().getOperationsContext().getDatasetRepository(), id); + DatasetWizardModel dataset = this.datasetManager.getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), this.getApiContext().getOperationsContext().getDatasetRepository(), id); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataset)); } @Transactional - @RequestMapping(method = RequestMethod.POST, value = {"/createOrUpdate"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.DELETE, value = {"{id}"}, produces = "application/json") + public @ResponseBody + ResponseEntity> delete(@PathVariable(value = "id") UUID id, Principal principal) throws Exception { + new DatasetWizardManager().delete(this.getApiContext(), id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Deleted")); + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") public @ResponseBody ResponseEntity> createOrUpdate(@RequestBody DatasetWizardModel profile, Principal principal) throws Exception { - eu.eudat.data.entities.Dataset dataset = DatasetManager.createOrUpdate(this.getApiContext(), profile, principal); + this.datasetManager.createOrUpdate(this.getApiContext(), profile, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created").payload(null)); } @@ -119,6 +131,15 @@ public class DatasetWizardController extends BaseController { HttpStatus.OK); } + @RequestMapping(method = RequestMethod.GET, value = {"/get/{id}"}, produces = "application/json") + public ResponseEntity> getSingle(@PathVariable String id) { + eu.eudat.data.entities.DatasetProfile profile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); + eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = UserManager.generateDatasetProfileModel(profile); + PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile(); + pagedDatasetProfile.buildPagedDatasetProfile(datasetprofile); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(pagedDatasetProfile)); + } + @Transactional @RequestMapping(method = RequestMethod.GET, value = {"/{id}/unlock"}, produces = "application/json") public @ResponseBody @@ -130,12 +151,4 @@ public class DatasetWizardController extends BaseController { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(datasetWizardCannotUnlockException.getMessage())); } } - - @Transactional - @RequestMapping(method = RequestMethod.DELETE, value = {"/delete/{id}"}, produces = "application/json") - public @ResponseBody - ResponseEntity> delete(@PathVariable(value = "id") UUID id, Principal principal) throws Exception { - new DatasetWizardManager().delete(this.getApiContext(), id); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Deleted")); - } } 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 d0e5a3abd..f0d539027 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 @@ -24,33 +24,36 @@ import java.util.UUID; @RestController @CrossOrigin -@RequestMapping(value = {"/api"}) +@RequestMapping(value = {"/api/datasets/"}) public class Datasets extends BaseController { + private DatasetManager datasetManager; + @Autowired - public Datasets(ApiContext apiContext) { + public Datasets(ApiContext apiContext, DatasetManager datasetManager) { super(apiContext); + this.datasetManager = datasetManager; } - @RequestMapping(method = RequestMethod.POST, value = {"/datasets/getPaged"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.POST, value = {"paged"}, consumes = "application/json", produces = "application/json") public @ResponseBody ResponseEntity>> getPaged(@RequestBody DatasetTableRequest datasetTableRequest, Principal principal) throws Exception { - DataTableData dataTable = new DatasetManager().getPaged(this.getApiContext(), datasetTableRequest, principal); + DataTableData dataTable = this.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") + @RequestMapping(method = RequestMethod.POST, value = {"/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); + DataTableData dataTable = this.datasetManager.getPaged(this.getApiContext(), datasetTableRequest, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); } @Transactional - @RequestMapping(method = RequestMethod.GET, value = {"/datasets/makepublic/{id}"}, produces = "application/json") + @RequestMapping(method = RequestMethod.GET, value = {"/makepublic/{id}"}, produces = "application/json") public @ResponseBody ResponseEntity> makePublic(@PathVariable UUID id, Principal principal, Locale locale) throws Exception { - DatasetManager.makePublic(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id); + this.datasetManager.makePublic(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message(this.getApiContext().getHelpersService().getMessageSource().getMessage("dataset.public", new Object[]{}, locale))); } 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 30b02e94c..91e841d4b 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 @@ -30,6 +30,7 @@ import org.springframework.core.env.Environment; import org.springframework.core.io.FileSystemResource; import org.springframework.http.*; import org.springframework.http.converter.ByteArrayHttpMessageConverter; +import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.web.client.RestTemplate; @@ -42,7 +43,7 @@ import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; - +@Component public class DatasetManager { public DataTableData getPaged(ApiContext apiContext, DatasetTableRequest datasetTableRequest, Principal principal) throws Exception { @@ -239,7 +240,7 @@ public class DatasetManager { return newFile; } - public static eu.eudat.data.entities.Dataset createOrUpdate(ApiContext apiContext, DatasetWizardModel datasetWizardModel, Principal principal) throws Exception { + public eu.eudat.data.entities.Dataset createOrUpdate(ApiContext apiContext, DatasetWizardModel datasetWizardModel, Principal principal) throws Exception { eu.eudat.data.entities.Dataset dataset = datasetWizardModel.toDataModel(); propertiesModelToString(datasetWizardModel, dataset); UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); @@ -252,7 +253,7 @@ public class DatasetManager { return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(dataset); } - private static void propertiesModelToString(DatasetWizardModel datasetWizardModel, eu.eudat.data.entities.Dataset dataset) { + private void propertiesModelToString(DatasetWizardModel datasetWizardModel, eu.eudat.data.entities.Dataset dataset) { Map values = new HashMap(); PagedDatasetProfile properties = datasetWizardModel.getDatasetProfileDefinition(); properties.toMap(values); @@ -260,7 +261,7 @@ public class DatasetManager { dataset.setProperties(jobject.toString()); } - private static void updateTags(DatasetRepository datasetRepository, DatasetWizardModel datasetWizardModel) throws IOException { + private void updateTags(DatasetRepository datasetRepository, DatasetWizardModel datasetWizardModel) throws IOException { if (datasetWizardModel.getTags() != null && !datasetWizardModel.getTags().isEmpty()) { eu.eudat.elastic.entities.Dataset dataset = new eu.eudat.elastic.entities.Dataset(); dataset.setId(datasetWizardModel.getId().toString()); @@ -269,7 +270,7 @@ public class DatasetManager { } } - private static void createRegistriesIfTheyDontExist(RegistryDao registryDao, eu.eudat.data.entities.Dataset dataset) { + private void createRegistriesIfTheyDontExist(RegistryDao registryDao, eu.eudat.data.entities.Dataset dataset) { if (dataset.getRegistries() != null && !dataset.getRegistries().isEmpty()) { for (eu.eudat.data.entities.Registry registry : dataset.getRegistries()) { RegistryCriteria criteria = new RegistryCriteria(); @@ -281,7 +282,7 @@ public class DatasetManager { } } - private static void createDataRepositoriesIfTheyDontExist(DataRepositoryDao dataRepositoryDao, eu.eudat.data.entities.Dataset dataset) { + private void createDataRepositoriesIfTheyDontExist(DataRepositoryDao dataRepositoryDao, eu.eudat.data.entities.Dataset dataset) { Set datasetDataRepositories = dataset.getDatasetDataRepositories(); dataset.setDatasetDataRepositories(new HashSet<>()); @@ -304,7 +305,7 @@ public class DatasetManager { } } - private static void createServicesIfTheyDontExist(DatasetServiceDao datasetServiceDao, ServiceDao serviceDao, eu.eudat.data.entities.Dataset dataset) { + private void createServicesIfTheyDontExist(DatasetServiceDao datasetServiceDao, ServiceDao serviceDao, eu.eudat.data.entities.Dataset dataset) { Set services = dataset.getServices(); dataset.setServices(new HashSet<>()); if (services != null && !services.isEmpty()) { @@ -325,7 +326,7 @@ public class DatasetManager { } } - private static void createExternalDatasetsIfTheyDontExist(DatasetExternalDatasetDao datasetExternalDatasetDao, ExternalDatasetDao externalDatasetDao, eu.eudat.data.entities.Dataset dataset) { + private void createExternalDatasetsIfTheyDontExist(DatasetExternalDatasetDao datasetExternalDatasetDao, ExternalDatasetDao externalDatasetDao, eu.eudat.data.entities.Dataset dataset) { Set externalDatasets = dataset.getDatasetExternalDatasets(); dataset.setDatasetExternalDatasets(new HashSet<>()); if (externalDatasets != null && !externalDatasets.isEmpty()) { @@ -346,7 +347,7 @@ public class DatasetManager { } } - public static void makePublic(DatasetDao datasetDao, UUID id) throws Exception { + public void makePublic(DatasetDao datasetDao, UUID id) throws Exception { eu.eudat.data.entities.Dataset dataset = datasetDao.find(id); if (dataset.getStatus() != eu.eudat.data.entities.Dataset.Status.FINALISED.getValue()) throw new Exception("You cannot make public a Dataset That Has not Been Finalised"); diff --git a/dmp-frontend/src/app/core/services/dataset-wizard/dataset-wizard.service.ts b/dmp-frontend/src/app/core/services/dataset-wizard/dataset-wizard.service.ts index 69c045786..f80444063 100644 --- a/dmp-frontend/src/app/core/services/dataset-wizard/dataset-wizard.service.ts +++ b/dmp-frontend/src/app/core/services/dataset-wizard/dataset-wizard.service.ts @@ -21,9 +21,9 @@ export class DatasetWizardService { this.actionUrl = environment.Server + 'datasetwizard/'; } - public userDmps(criteria: RequestItem): Observable { - return this.http.post(this.actionUrl + 'userDmps', criteria, { headers: this.headers }); - } + // public userDmps(criteria: RequestItem): Observable { + // return this.http.post(this.actionUrl + 'userDmps', criteria, { headers: this.headers }); + // } public getAvailableProfiles(criteria: RequestItem): Observable { return this.http.post(this.actionUrl + 'getAvailableProfiles/', criteria, { headers: this.headers }); @@ -34,11 +34,11 @@ export class DatasetWizardService { } public delete(id: string): Observable { - return this.http.delete(this.actionUrl + 'delete/' + id, { headers: this.headers }); + return this.http.delete(this.actionUrl + id, { headers: this.headers }); } createDataset(datasetModel: DatasetWizardModel): Observable { - return this.http.post(this.actionUrl + 'createOrUpdate', datasetModel, { headers: this.headers }); + return this.http.post(this.actionUrl, datasetModel, { headers: this.headers }); } public downloadPDF(id: string): Observable> { diff --git a/dmp-frontend/src/app/core/services/dataset/dataset.service.ts b/dmp-frontend/src/app/core/services/dataset/dataset.service.ts index d78361d79..5b5433079 100644 --- a/dmp-frontend/src/app/core/services/dataset/dataset.service.ts +++ b/dmp-frontend/src/app/core/services/dataset/dataset.service.ts @@ -19,7 +19,7 @@ export class DatasetService { } getPaged(dataTableRequest: DataTableRequest): Observable> { - return this.http.post>(this.actionUrl + 'getPaged', dataTableRequest); + return this.http.post>(this.actionUrl + 'paged', dataTableRequest); } getPublicPaged(dataTableRequest: DataTableRequest): Observable> {