From 8cb464c1e9f97cd0ce3dad7aae5cfa28411f15ba Mon Sep 17 00:00:00 2001 From: Ioannis Kalyvas Date: Mon, 5 Mar 2018 18:18:45 +0200 Subject: [PATCH] no message --- dmp-backend/pom.xml | 34 +- .../DevelDatabaseConfiguration.java | 2 +- .../configurations/WebMVCConfiguration.java | 24 +- .../main/java/eu/eudat/controllers/Admin.java | 8 +- .../eu/eudat/controllers/BaseController.java | 8 +- .../main/java/eu/eudat/controllers/DMPs.java | 6 +- .../controllers/DashBoardController.java | 8 +- .../eudat/controllers/DataRepositories.java | 2 +- .../controllers/DatasetProfileController.java | 8 +- .../eu/eudat/controllers/DatasetProfiles.java | 4 +- .../controllers/DatasetWizardController.java | 48 +- .../java/eu/eudat/controllers/Datasets.java | 4 +- .../eudat/controllers/ExternalDatasets.java | 4 +- .../main/java/eu/eudat/controllers/Login.java | 14 +- .../eu/eudat/controllers/Organisations.java | 2 +- .../java/eu/eudat/controllers/Projects.java | 14 +- .../java/eu/eudat/controllers/Registries.java | 2 +- .../eu/eudat/controllers/Researchers.java | 2 +- .../java/eu/eudat/controllers/Services.java | 2 +- .../GeneralErrorHandler.java | 38 + .../interceptors/RequestInterceptor.java | 33 + .../eu/eudat/documents/word/WordBuilder.java | 69 +- .../handlers/PrincipalArgumentResolver.java | 3 +- .../java/eu/eudat/managers/AdminManager.java | 2 +- .../managers/DataManagementPlanManager.java | 46 +- .../eu/eudat/managers/DatasetManager.java | 112 ++- .../eudat/managers/DatasetProfileManager.java | 4 +- .../managers/ExternalDatasetManager.java | 8 +- .../eu/eudat/managers/InvitationsManager.java | 16 +- .../eu/eudat/managers/ProjectManager.java | 4 +- .../eu/eudat/managers/ResearcherManager.java | 2 +- .../java/eu/eudat/managers/UserManager.java | 19 +- .../helpers/responses/ResponseItem.java | 15 + .../b2access/B2AccessTokenValidator.java | 10 +- .../facebook/FacebookTokenValidator.java | 10 +- .../google/GoogleTokenValidator.java | 10 +- .../linkedin/LinkedInTokenValidator.java | 10 +- .../twitter/TwitterTokenValidator.java | 10 +- .../java/eu/eudat/services/ApiContext.java | 21 +- .../eu/eudat/services/ApiContextImpl.java | 87 +- .../services/forms/VisibilityContext.java | 45 + .../eudat/services/forms/VisibilityRule.java | 27 + .../services/forms/VisibilityRuleService.java | 17 + .../forms/VisibilityRuleServiceImpl.java | 46 + .../services/forms/VisibilityRuleSource.java | 25 + .../services/helpers/HelpersService.java | 13 + .../services/helpers/HelpersServiceImpl.java | 31 + .../eudat/services/helpers/LoggerService.java | 12 + .../services/helpers/LoggerServiceImpl.java | 39 + .../operations/AuthenticationService.java | 23 + .../AuthenticationServiceImpl.java} | 61 +- .../{ => operations}/DatabaseRepository.java | 2 +- .../DatabaseRepositoryImpl.java | 2 +- .../operations/OperationsContext.java | 20 + .../operations/OperationsContextImpl.java | 48 + .../{ => utilities}/InvitationService.java | 2 +- .../InvitationServiceImpl.java | 2 +- .../services/{ => utilities}/MailService.java | 2 +- .../{ => utilities}/MailServiceImpl.java | 2 +- .../services/utilities/UtilitiesService.java | 15 + .../utilities/UtilitiesServiceImpl.java | 38 + .../java/eu/eudat/types/ApiResponseType.java | 29 + .../java/eu/eudat/types/WarningLevel.java | 8 + .../eudat/utilities/interfaces/Applier.java | 6 +- .../interfaces/ApplierWithValue.java | 8 + .../src/main/resources/application.properties | 4 +- .../src/main/resources/documents/h2020.docx | Bin 0 -> 9319 bytes dmp-frontend/package-lock.json | 915 +----------------- dmp-frontend/package.json | 2 + .../dataset-wizard.component.html | 7 +- .../dataset-wizard.component.ts | 50 +- .../dynamic-form/dynamic-form.component.html | 2 +- .../dynamic-form/dynamic-form.component.ts | 6 +- dmp-frontend/src/app/models/Field.ts | 22 +- .../dataset-wizard/dataset-wizard.service.ts | 12 +- .../datasets/datasets-criteria.component.ts | 4 +- .../base-http.service.ts | 52 +- .../app/utilities/types/ApiResponseCode.ts | 4 + .../visibility-rules.service.ts | 6 +- welcome.docx | Bin 0 -> 11243 bytes 80 files changed, 1051 insertions(+), 1283 deletions(-) create mode 100644 dmp-backend/src/main/java/eu/eudat/controllers/controllerhandler/GeneralErrorHandler.java create mode 100644 dmp-backend/src/main/java/eu/eudat/controllers/interceptors/RequestInterceptor.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityContext.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRule.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleService.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleServiceImpl.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleSource.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/helpers/HelpersService.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/helpers/HelpersServiceImpl.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/helpers/LoggerService.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/helpers/LoggerServiceImpl.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/operations/AuthenticationService.java rename dmp-backend/src/main/java/eu/eudat/services/{AuthenticationService.java => operations/AuthenticationServiceImpl.java} (63%) rename dmp-backend/src/main/java/eu/eudat/services/{ => operations}/DatabaseRepository.java (95%) rename dmp-backend/src/main/java/eu/eudat/services/{ => operations}/DatabaseRepositoryImpl.java (99%) create mode 100644 dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContext.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContextImpl.java rename dmp-backend/src/main/java/eu/eudat/services/{ => utilities}/InvitationService.java (94%) rename dmp-backend/src/main/java/eu/eudat/services/{ => utilities}/InvitationServiceImpl.java (98%) rename dmp-backend/src/main/java/eu/eudat/services/{ => utilities}/MailService.java (83%) rename dmp-backend/src/main/java/eu/eudat/services/{ => utilities}/MailServiceImpl.java (96%) create mode 100644 dmp-backend/src/main/java/eu/eudat/services/utilities/UtilitiesService.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/utilities/UtilitiesServiceImpl.java create mode 100644 dmp-backend/src/main/java/eu/eudat/types/ApiResponseType.java create mode 100644 dmp-backend/src/main/java/eu/eudat/types/WarningLevel.java create mode 100644 dmp-backend/src/main/java/eu/eudat/utilities/interfaces/ApplierWithValue.java create mode 100644 dmp-backend/src/main/resources/documents/h2020.docx create mode 100644 dmp-frontend/src/app/utilities/types/ApiResponseCode.ts create mode 100644 welcome.docx diff --git a/dmp-backend/pom.xml b/dmp-backend/pom.xml index 65d13d770..af3b7f88c 100644 --- a/dmp-backend/pom.xml +++ b/dmp-backend/pom.xml @@ -189,15 +189,45 @@ org.apache.poi poi-ooxml - 3.17 + 3.15 org.apache.poi poi - 3.17 + 3.15 + + + org.apache.xmlgraphics + fop + 2.2 + + + + fr.opensagres.xdocreport + org.apache.poi.xwpf.converter.pdf + 1.0.6 + + + + fr.opensagres.xdocreport + org.apache.poi.xwpf.converter.core + 1.0.6 + + + + fr.opensagres.xdocreport + fr.opensagres.xdocreport.itext.extension + 2.0.1 + + + + commons-io + commons-io + 2.1 + diff --git a/dmp-backend/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java b/dmp-backend/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java index 9b2731c9a..da7679e1b 100644 --- a/dmp-backend/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java +++ b/dmp-backend/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java @@ -67,7 +67,7 @@ public class DevelDatabaseConfiguration { private Properties additionalProperties() { Properties properties = new Properties(); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQL92Dialect"); - properties.setProperty("hibernate.show_sql", "true"); + properties.setProperty("hibernate.show_sql", "false"); properties.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false"); return properties; } diff --git a/dmp-backend/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java b/dmp-backend/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java index 3965c777e..db8889831 100644 --- a/dmp-backend/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java +++ b/dmp-backend/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java @@ -1,11 +1,16 @@ package eu.eudat.configurations; +import eu.eudat.controllers.interceptors.RequestInterceptor; import eu.eudat.handlers.PrincipalArgumentResolver; -import eu.eudat.services.AuthenticationService; +import eu.eudat.services.ApiContext; +import eu.eudat.services.operations.AuthenticationService; +import eu.eudat.services.operations.AuthenticationServiceImpl; +import eu.eudat.types.WarningLevel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.List; @@ -14,12 +19,25 @@ import java.util.List; @Configuration public class WebMVCConfiguration extends WebMvcConfigurerAdapter { + private ApiContext apiContext; + + private AuthenticationService authenticationService; + @Autowired - AuthenticationService authenticationService; + public WebMVCConfiguration(ApiContext apiContext, AuthenticationService authenticationService) { + this.apiContext = apiContext; + this.authenticationService = authenticationService; + } + @Autowired @Override public void addArgumentResolvers(List argumentResolvers) { - argumentResolvers.add(new PrincipalArgumentResolver(this.authenticationService)); + argumentResolvers.add(new PrincipalArgumentResolver(authenticationService)); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new RequestInterceptor(this.apiContext.getHelpersService().getLoggerService())); } } diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Admin.java b/dmp-backend/src/main/java/eu/eudat/controllers/Admin.java index e5d87c94d..51ab1c27b 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Admin.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Admin.java @@ -33,7 +33,7 @@ public class Admin extends BaseController { public ResponseEntity addDmp(@Valid @RequestBody DatasetProfile profile, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { try { eu.eudat.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(profile, getApiContext()); - this.getApiContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(modelDefinition); + this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(modelDefinition); return ResponseEntity.status(HttpStatus.OK).body(modelDefinition.getId()); } catch (Exception ex) { ex.printStackTrace(); @@ -47,9 +47,9 @@ public class Admin extends BaseController { try { eu.eudat.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(profile, getApiContext()); - eu.eudat.entities.DatasetProfile datasetprofile = this.getApiContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); + eu.eudat.entities.DatasetProfile datasetprofile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); datasetprofile.setDefinition(modelDefinition.getDefinition()); - this.getApiContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(datasetprofile); + this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(datasetprofile); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); } catch (Exception ex) { @@ -61,7 +61,7 @@ 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) { try { - eu.eudat.entities.DatasetProfile profile = this.getApiContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); + eu.eudat.entities.DatasetProfile profile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); eu.eudat.models.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)); diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/BaseController.java b/dmp-backend/src/main/java/eu/eudat/controllers/BaseController.java index b0c963bc5..2db152ab8 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/BaseController.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/BaseController.java @@ -24,13 +24,13 @@ public abstract class BaseController { @InitBinder() protected void initBinder(WebDataBinder binder) { if (binder.getTarget() != null && DataManagementPlanTableRequestValidator.supportsType((binder.getTarget().getClass()))) - binder.addValidators(this.apiContext.getApplicationContext().getBean("dataManagementPlanTableRequestValidator", DataManagementPlanTableRequestValidator.class)); + binder.addValidators(this.apiContext.getOperationsContext().getApplicationContext().getBean("dataManagementPlanTableRequestValidator", DataManagementPlanTableRequestValidator.class)); if (binder.getTarget() != null && ProjectTableRequestValidator.supportsType((binder.getTarget().getClass()))) - binder.addValidators(this.apiContext.getApplicationContext().getBean("projectTableRequestValidator", ProjectTableRequestValidator.class)); + binder.addValidators(this.apiContext.getOperationsContext().getApplicationContext().getBean("projectTableRequestValidator", ProjectTableRequestValidator.class)); if (binder.getTarget() != null && DatasetProfileValidator.supportsType((binder.getTarget().getClass()))) - binder.addValidators(this.apiContext.getApplicationContext().getBean("datasetProfileValidator", DatasetProfileValidator.class)); + binder.addValidators(this.apiContext.getOperationsContext().getApplicationContext().getBean("datasetProfileValidator", DatasetProfileValidator.class)); if (binder.getTarget() != null && ProjectModelValidator.supportsType((binder.getTarget().getClass()))) - binder.addValidators(this.apiContext.getApplicationContext().getBean("projectModelValidator", ProjectModelValidator.class)); + binder.addValidators(this.apiContext.getOperationsContext().getApplicationContext().getBean("projectModelValidator", ProjectModelValidator.class)); } } diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/src/main/java/eu/eudat/controllers/DMPs.java index 23722989c..8986f7fcf 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/DMPs.java @@ -40,7 +40,6 @@ public class DMPs extends BaseController { try { DataTableData dataTable = new DataManagementPlanManager().getPaged(this.getApiContext(), dataManagementPlanTableRequest, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); - } catch (Exception ex) { ex.printStackTrace(); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); @@ -51,7 +50,7 @@ public class DMPs extends BaseController { public @ResponseBody ResponseEntity> getSingle(@PathVariable String id, Principal principal) { try { - eu.eudat.models.dmp.DataManagementPlan dataManagementPlan = new DataManagementPlanManager().getSingle(this.getApiContext().getDatabaseRepository().getDmpDao(), id, principal); + eu.eudat.models.dmp.DataManagementPlan dataManagementPlan = new DataManagementPlanManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), id, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlan)); } catch (Exception ex) { @@ -101,9 +100,8 @@ public class DMPs extends BaseController { public @ResponseBody ResponseEntity>> getWithCriteria(@RequestBody DataManagementPlanCriteriaRequest dataManagementPlanCriteria, Principal principal) { try { - List dataTable = new DataManagementPlanManager().getWithCriteria(this.getApiContext().getDatabaseRepository().getDmpDao(), dataManagementPlanCriteria); + List dataTable = new DataManagementPlanManager().getWithCriteria(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), dataManagementPlanCriteria); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); - } catch (Exception ex) { ex.printStackTrace(); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/DashBoardController.java b/dmp-backend/src/main/java/eu/eudat/controllers/DashBoardController.java index caeb33cfb..4c85de848 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/DashBoardController.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/DashBoardController.java @@ -27,8 +27,8 @@ public class DashBoardController extends BaseController { @RequestMapping(method = RequestMethod.GET, value = {"/dashboard/getStatistics"}, produces = "application/json") public ResponseEntity> getStatistics() { try { - DashBoardStatistics statistics = new DashBoardManager().getStatistics(this.getApiContext().getDatabaseRepository().getDatasetDao(), this.getApiContext().getDatabaseRepository().getDmpDao() - , this.getApiContext().getDatabaseRepository().getProjectDao()); + DashBoardStatistics statistics = new DashBoardManager().getStatistics(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao() + , this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao()); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); } catch (Exception ex) { ex.printStackTrace(); @@ -39,8 +39,8 @@ public class DashBoardController extends BaseController { @RequestMapping(method = RequestMethod.GET, value = {"/dashboard/me/getStatistics"}, produces = "application/json") public ResponseEntity> getStatistics(Principal principal) { try { - DashBoardStatistics statistics = new DashBoardManager().getMeStatistics(this.getApiContext().getDatabaseRepository().getDatasetDao(), this.getApiContext().getDatabaseRepository().getDmpDao() - , this.getApiContext().getDatabaseRepository().getProjectDao(), principal); + DashBoardStatistics statistics = new DashBoardManager().getMeStatistics(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao() + , this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); } catch (Exception ex) { ex.printStackTrace(); diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/DataRepositories.java b/dmp-backend/src/main/java/eu/eudat/controllers/DataRepositories.java index 4dd26d6e4..58d764ae2 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/DataRepositories.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/DataRepositories.java @@ -28,7 +28,7 @@ public class DataRepositories extends BaseController { public @ResponseBody ResponseEntity>>> listExternalDataRepositories(@RequestParam(value = "query", required = false) String query) { try { - List> remoteRepos = this.getApiContext().getRemoteFetcher().getRepositories(query); + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getRepositories(query); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>>().status(ApiMessageCode.NO_MESSAGE).payload(remoteRepos)); } catch (NoURLFound ex) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>>().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage()).payload(null)); diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfileController.java b/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfileController.java index f70a760df..0a98747fc 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfileController.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfileController.java @@ -34,7 +34,7 @@ public class DatasetProfileController extends BaseController { @RequestMapping(method = RequestMethod.GET, value = {"/datasetwizard/get/{id}"}, produces = "application/json") public ResponseEntity> getSingle(@PathVariable String id) { try { - eu.eudat.entities.DatasetProfile profile = this.getApiContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); + eu.eudat.entities.DatasetProfile profile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); eu.eudat.models.user.composite.DatasetProfile datasetprofile = UserManager.generateDatasetProfileModel(profile); PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile(); pagedDatasetProfile.buildPagedDatasetProfile(datasetprofile); @@ -49,13 +49,13 @@ public class DatasetProfileController extends BaseController { @RequestMapping(method = RequestMethod.POST, value = {"/datasetprofile/save/{id}"}, consumes = "application/json", produces = "application/json") public ResponseEntity updateDataset(@PathVariable String id, @RequestBody PropertiesModel properties) { try { - eu.eudat.entities.Dataset dataset = this.getApiContext().getDatabaseRepository().getDatasetDao().find(UUID.fromString(id)); + eu.eudat.entities.Dataset dataset = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao().find(UUID.fromString(id)); Map values = new HashMap(); properties.toMap(values); JSONObject jobject = new JSONObject(values); dataset.setProperties(jobject.toString()); dataset.setStatus((short) properties.getStatus()); - this.getApiContext().getDatabaseRepository().getDatasetDao().createOrUpdate(dataset); //TODO + this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(dataset); //TODO return ResponseEntity.status(HttpStatus.OK).body(properties); } catch (Exception ex) { ex.printStackTrace(); @@ -66,7 +66,7 @@ public class DatasetProfileController extends BaseController { @RequestMapping(method = RequestMethod.POST, value = {"/search/autocomplete"}, consumes = "application/json", produces = "application/json") public ResponseEntity getDataForAutocomplete(@RequestBody AutoCompleteLookupItem lookupItem) { try { - eu.eudat.entities.Dataset dataset = this.getApiContext().getDatabaseRepository().getDatasetDao().find(UUID.fromString(lookupItem.getProfileID())); + eu.eudat.entities.Dataset dataset = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao().find(UUID.fromString(lookupItem.getProfileID())); eu.eudat.entities.xmlmodels.datasetprofiledefinition.Field modelfield = new eu.eudat.entities.xmlmodels.datasetprofiledefinition.Field(); AutoCompleteData data = new AutoCompleteData().fromData(modelfield.getData()); diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfiles.java b/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfiles.java index 12a604293..896e03eca 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfiles.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/DatasetProfiles.java @@ -31,7 +31,7 @@ public class DatasetProfiles extends BaseController { public @ResponseBody ResponseEntity>> get(@RequestBody DatasetProfileAutocompleteRequest datasetProfileAutocompleteRequest) { try { - List datasetProfileAutocompleteItems = DatasetProfileManager.getWithCriteria(this.getApiContext().getDatabaseRepository().getDatasetProfileDao(), datasetProfileAutocompleteRequest); + List datasetProfileAutocompleteItems = DatasetProfileManager.getWithCriteria(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao(), datasetProfileAutocompleteRequest); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileAutocompleteItems)); } catch (Exception ex) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE)); @@ -53,7 +53,7 @@ public class DatasetProfiles extends BaseController { public @ResponseBody ResponseEntity>> getAll() { try { - List datasetProfileTableData = DatasetProfileManager.getAll(this.getApiContext().getDatabaseRepository().getDatasetProfileDao()); + List datasetProfileTableData = DatasetProfileManager.getAll(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao()); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileTableData)); } catch (Exception ex) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE)); diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/DatasetWizardController.java b/dmp-backend/src/main/java/eu/eudat/controllers/DatasetWizardController.java index 989406bbf..bc0eea369 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/DatasetWizardController.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/DatasetWizardController.java @@ -12,17 +12,20 @@ import eu.eudat.models.helpers.responses.ResponseItem; import eu.eudat.models.security.Principal; import eu.eudat.services.ApiContext; import eu.eudat.types.ApiMessageCode; +import org.apache.poi.util.IOUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.InputStreamResource; +import org.springframework.core.env.Environment; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.activation.MimetypesFileTypeMap; import javax.transaction.Transactional; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; import java.io.InputStream; import java.util.List; @@ -32,16 +35,19 @@ import java.util.List; @RequestMapping(value = {"api/datasetwizard"}) public class DatasetWizardController extends BaseController { + private Environment environment; + @Autowired - public DatasetWizardController(ApiContext apiContext) { + public DatasetWizardController(ApiContext apiContext, Environment environment) { super(apiContext); + this.environment = environment; } @RequestMapping(method = RequestMethod.POST, value = {"/userDmps"}, produces = "application/json") public @ResponseBody ResponseEntity>> getUserDmps(@RequestBody DatasetWizardAutocompleteRequest datasetWizardAutocompleteRequest, Principal principal) { try { - List dataManagementPlans = DatasetWizardManager.getUserDmps(this.getApiContext().getDatabaseRepository().getDmpDao(), datasetWizardAutocompleteRequest, principal); + List dataManagementPlans = DatasetWizardManager.getUserDmps(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), datasetWizardAutocompleteRequest, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlans)); } catch (Exception ex) { @@ -54,7 +60,7 @@ public class DatasetWizardController extends BaseController { public @ResponseBody ResponseEntity>> getAvailableProfiles(@RequestBody DatasetProfileWizardAutocompleteRequest datasetProfileWizardAutocompleteRequest, Principal principal) { try { - List dataManagementPlans = DatasetWizardManager.getAvailableProfiles(this.getApiContext().getDatabaseRepository().getDmpDao(), datasetProfileWizardAutocompleteRequest); + List dataManagementPlans = DatasetWizardManager.getAvailableProfiles(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), datasetProfileWizardAutocompleteRequest); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlans)); } catch (Exception ex) { @@ -67,7 +73,7 @@ public class DatasetWizardController extends BaseController { public @ResponseBody ResponseEntity> getSingle(@PathVariable String id, Principal principal) { try { - DatasetWizardModel dataset = new DatasetManager().getSingle(this.getApiContext().getDatabaseRepository().getDatasetDao(), id); + DatasetWizardModel dataset = new DatasetManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataset)); } catch (Exception ex) { ex.printStackTrace(); @@ -88,21 +94,29 @@ public class DatasetWizardController extends BaseController { } } - @RequestMapping(method = RequestMethod.GET, value = {"/getWordDocument/{id}"}, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) + @RequestMapping(method = RequestMethod.GET, value = {"/getWordDocument/{id}"}) public @ResponseBody - ResponseEntity getWordDocument(@PathVariable String id) { + ResponseEntity getWordDocument(@PathVariable String id) throws IllegalAccessException, IOException, InstantiationException { try { - File file = new DatasetManager().getWordDocument(this.getApiContext().getDatabaseRepository().getDatasetDao(), id); - InputStreamResource resource = new InputStreamResource(new FileInputStream(file)); + File file = new DatasetManager().getWordDocument(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id, this.getApiContext().getUtilitiesService().getVisibilityRuleService()); + File pdffile = new DatasetManager().convertToPDF(file, environment, file.getName()); + InputStream resource = new FileInputStream(pdffile); + System.out.println("Mime Type of " + file.getName() + " is " + + new MimetypesFileTypeMap().getContentType(file)); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.setContentLength(pdffile.length()); + responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); + responseHeaders.set("Content-Disposition", "attachment;filename=" + pdffile.getName()); + responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); + responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, - "attachment;filename=" + file.getName()) - .contentType(MediaType.APPLICATION_PDF).contentLength(file.length()) - .body(resource); - } catch (Exception ex) { - ex.printStackTrace(); - return new ResponseEntity(HttpStatus.BAD_REQUEST); + byte[] content = IOUtils.toByteArray(resource); + return new ResponseEntity<>(content, + responseHeaders, + HttpStatus.OK); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.badRequest().body(null); } } } diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Datasets.java b/dmp-backend/src/main/java/eu/eudat/controllers/Datasets.java index 44ce6a18a..afec09f46 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Datasets.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Datasets.java @@ -47,8 +47,8 @@ public class Datasets extends BaseController { public @ResponseBody ResponseEntity> makePublic(@PathVariable UUID id, Principal principal, Locale locale) { try { - DatasetManager.makePublic(this.getApiContext().getDatabaseRepository().getDatasetDao(), id); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message(this.getApiContext().getMessageSource().getMessage("dataset.public", new Object[]{}, locale))); + 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))); } catch (Exception ex) { ex.printStackTrace(); diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/ExternalDatasets.java b/dmp-backend/src/main/java/eu/eudat/controllers/ExternalDatasets.java index a8fc8afff..fcdd2b934 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/ExternalDatasets.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/ExternalDatasets.java @@ -44,7 +44,7 @@ public class ExternalDatasets extends BaseController { public @ResponseBody ResponseEntity>> getWithExternal(@RequestParam(value = "query", required = false) String query, Principal principal) { try { - List dataTable = new ExternalDatasetManager().getWithExternal(this.getApiContext(), query, this.getApiContext().getRemoteFetcher()); + List dataTable = new ExternalDatasetManager().getWithExternal(this.getApiContext(), query, this.getApiContext().getOperationsContext().getRemoteFetcher()); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); } catch (Exception ex) { ex.printStackTrace(); @@ -56,7 +56,7 @@ public class ExternalDatasets extends BaseController { public @ResponseBody ResponseItem getWithExternal(@PathVariable UUID id, Principal principal) { try { - ExternalDatasetListingModel externalDatasetModel = new ExternalDatasetManager().getSingle(this.getApiContext().getDatabaseRepository().getExternalDatasetDao(), id); + ExternalDatasetListingModel externalDatasetModel = new ExternalDatasetManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getExternalDatasetDao(), id); return new ResponseItem().payload(externalDatasetModel).status(ApiMessageCode.NO_MESSAGE); } catch (Exception ex) { ex.printStackTrace(); diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Login.java b/dmp-backend/src/main/java/eu/eudat/controllers/Login.java index e40c65a11..9f0f20579 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Login.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Login.java @@ -11,7 +11,7 @@ import eu.eudat.security.validators.b2access.B2AccessTokenValidator; import eu.eudat.security.validators.b2access.helpers.B2AccessRequest; import eu.eudat.security.validators.b2access.helpers.B2AccessResponseToken; import eu.eudat.security.validators.twitter.TwitterTokenValidator; -import eu.eudat.services.AuthenticationService; +import eu.eudat.services.operations.AuthenticationServiceImpl; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -29,16 +29,16 @@ public class Login { private CustomAuthenticationProvider customAuthenticationProvider; - private AuthenticationService authenticationService; + private AuthenticationServiceImpl authenticationServiceImpl; private TwitterTokenValidator twitterTokenValidator; private B2AccessTokenValidator b2AccessTokenValidator; @Autowired - public Login(CustomAuthenticationProvider customAuthenticationProvider, AuthenticationService authenticationService, TwitterTokenValidator twitterTokenValidator, B2AccessTokenValidator b2AccessTokenValidator) { + public Login(CustomAuthenticationProvider customAuthenticationProvider, AuthenticationServiceImpl authenticationServiceImpl, TwitterTokenValidator twitterTokenValidator, B2AccessTokenValidator b2AccessTokenValidator) { this.customAuthenticationProvider = customAuthenticationProvider; - this.authenticationService = authenticationService; + this.authenticationServiceImpl = authenticationServiceImpl; this.twitterTokenValidator = twitterTokenValidator; this.b2AccessTokenValidator = b2AccessTokenValidator; } @@ -62,7 +62,7 @@ public class Login { public @ResponseBody ResponseEntity> nativelogin(@RequestBody Credentials credentials) { try { - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(UserManager.authenticate(this.authenticationService, credentials)).status(ApiMessageCode.SUCCESS_MESSAGE)); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(UserManager.authenticate(this.authenticationServiceImpl, credentials)).status(ApiMessageCode.SUCCESS_MESSAGE)); } catch (UnauthorisedException ex) { throw ex; } catch (Exception ex) { @@ -97,7 +97,7 @@ public class Login { public @ResponseBody ResponseEntity> authMe(Principal principal) { try { - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(this.authenticationService.Touch(principal.getToken())).status(ApiMessageCode.NO_MESSAGE)); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(this.authenticationServiceImpl.Touch(principal.getToken())).status(ApiMessageCode.NO_MESSAGE)); } catch (Exception ex) { ex.printStackTrace(); @@ -110,7 +110,7 @@ public class Login { public @ResponseBody ResponseEntity> logout(Principal principal) { try { - this.authenticationService.Logout(principal.getToken()); + this.authenticationServiceImpl.Logout(principal.getToken()); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); } catch (Exception ex) { diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Organisations.java b/dmp-backend/src/main/java/eu/eudat/controllers/Organisations.java index 270ba3aa7..0edc32915 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Organisations.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Organisations.java @@ -29,7 +29,7 @@ public class Organisations extends BaseController { public @ResponseBody ResponseEntity> listExternalOrganisations(@RequestParam(value = "query", required = false) String query) { try { - List> remoteRepos = this.getApiContext().getRemoteFetcher().getOrganisations(query); + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getOrganisations(query); OrganisationsExternalSourcesModel projectsExternalSourcesModel = new OrganisationsExternalSourcesModel().fromExternalItem(remoteRepos); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(projectsExternalSourcesModel).status(ApiMessageCode.SUCCESS_MESSAGE)); } catch (NoURLFound ex) { diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Projects.java b/dmp-backend/src/main/java/eu/eudat/controllers/Projects.java index b332d9e28..e1d378ebd 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Projects.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Projects.java @@ -38,7 +38,7 @@ public class Projects extends BaseController { public @ResponseBody ResponseEntity>> getPaged(@Valid @RequestBody ProjectTableRequest projectTableRequest, Principal principal) { try { - DataTableData dataTable = new ProjectManager().getPaged(this.getApiContext().getDatabaseRepository().getProjectDao(), projectTableRequest); + DataTableData dataTable = new ProjectManager().getPaged(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), projectTableRequest); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); } catch (Exception ex) { @@ -51,7 +51,7 @@ public class Projects extends BaseController { public @ResponseBody ResponseEntity> getSingle(@PathVariable String id, Principal principal) { try { - eu.eudat.models.project.Project project = new ProjectManager().getSingle(this.getApiContext().getDatabaseRepository().getProjectDao(), id); + eu.eudat.models.project.Project project = new ProjectManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), id); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(project).status(ApiMessageCode.NO_MESSAGE)); } catch (Exception ex) { ex.printStackTrace(); @@ -65,7 +65,7 @@ public class Projects extends BaseController { public @ResponseBody ResponseEntity> addProject(@Valid @RequestBody eu.eudat.models.project.Project project, Principal principal) { try { - ProjectManager.createOrUpdate(this.getApiContext().getDatabaseRepository().getProjectDao(), this.getApiContext().getDatabaseRepository().getUserInfoDao(), project, principal); + ProjectManager.createOrUpdate(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getUserInfoDao(), project, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created")); } catch (Exception ex) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); @@ -78,7 +78,7 @@ public class Projects extends BaseController { public @ResponseBody ResponseEntity> inactivate(@PathVariable String id, Principal principal) { try { - Project project = new ProjectManager().inactivate(this.getApiContext().getDatabaseRepository().getProjectDao(), id); + Project project = new ProjectManager().inactivate(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), id); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); } catch (Exception ex) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); @@ -90,7 +90,7 @@ public class Projects extends BaseController { public @ResponseBody ResponseEntity>> getWithExternal(@RequestBody ProjectCriteriaRequest projectCriteria, Principal principal) { try { - List dataTable = new ProjectManager().getCriteriaWithExternal(this.getApiContext(), projectCriteria, this.getApiContext().getRemoteFetcher()); + List dataTable = new ProjectManager().getCriteriaWithExternal(this.getApiContext(), projectCriteria, this.getApiContext().getOperationsContext().getRemoteFetcher()); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); } catch (Exception ex) { ex.printStackTrace(); @@ -102,7 +102,7 @@ public class Projects extends BaseController { public @ResponseBody ResponseEntity>> get(@RequestBody ProjectCriteriaRequest projectCriteria, Principal principal) { try { - List dataTable = new ProjectManager().getCriteria(this.getApiContext().getDatabaseRepository().getProjectDao(), projectCriteria, this.getApiContext().getRemoteFetcher()); + 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)); } catch (Exception ex) { ex.printStackTrace(); @@ -114,7 +114,7 @@ public class Projects extends BaseController { public @ResponseBody ResponseEntity> listExternalProjects(@RequestParam(value = "query", required = false) String query, Principal principal) { try { - List> remoteRepos = this.getApiContext().getRemoteFetcher().getProjects(query); + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getProjects(query); ProjectsExternalSourcesModel projectsExternalSourcesModel = new ProjectsExternalSourcesModel().fromExternalItem(remoteRepos); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(projectsExternalSourcesModel).status(ApiMessageCode.SUCCESS_MESSAGE)); } catch (NoURLFound ex) { diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Registries.java b/dmp-backend/src/main/java/eu/eudat/controllers/Registries.java index 3e9afc633..a8d09a76b 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Registries.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Registries.java @@ -29,7 +29,7 @@ public class Registries extends BaseController { public @ResponseBody ResponseEntity> listExternalRegistries(@RequestParam(value = "query", required = false) String query) { try { - List> remoteRepos = this.getApiContext().getRemoteFetcher().getRegistries(query); + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getRegistries(query); RegistriesExternalSourcesModel registriesExternalSourcesModel = new RegistriesExternalSourcesModel().fromExternalItem(remoteRepos); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(registriesExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); } catch (NoURLFound ex) { diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Researchers.java b/dmp-backend/src/main/java/eu/eudat/controllers/Researchers.java index 4ec4a60e6..6fbdb7587 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Researchers.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Researchers.java @@ -35,7 +35,7 @@ public class Researchers extends BaseController { public @ResponseBody ResponseEntity> listExternalResearchers(@RequestParam(value = "query", required = false) String query) { try { - List> remoteRepos = this.getApiContext().getRemoteFetcher().getResearchers(query); + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getResearchers(query); ResearchersExternalSourcesModel researchersExternalSourcesModel = new ResearchersExternalSourcesModel().fromExternalItem(remoteRepos); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(researchersExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); } catch (NoURLFound ex) { diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Services.java b/dmp-backend/src/main/java/eu/eudat/controllers/Services.java index 340ec18ba..6eb9488f7 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Services.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Services.java @@ -29,7 +29,7 @@ public class Services extends BaseController { public @ResponseBody ResponseEntity> listExternalServices(@RequestParam(value = "query", required = false) String query) { try { - List> remoteRepos = this.getApiContext().getRemoteFetcher().getServices(query); + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getServices(query); ServiceExternalSourcesModel serviceExternalSourcesModel = new ServiceExternalSourcesModel().fromExternalItem(remoteRepos); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(serviceExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); } catch (NoURLFound ex) { diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/controllerhandler/GeneralErrorHandler.java b/dmp-backend/src/main/java/eu/eudat/controllers/controllerhandler/GeneralErrorHandler.java new file mode 100644 index 000000000..0ed03a2d4 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/controllers/controllerhandler/GeneralErrorHandler.java @@ -0,0 +1,38 @@ +package eu.eudat.controllers.controllerhandler; + +import eu.eudat.models.helpers.responses.ResponseItem; +import eu.eudat.services.ApiContext; +import eu.eudat.types.ApiMessageCode; +import eu.eudat.types.WarningLevel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +import javax.servlet.http.HttpServletRequest; + +/** + * Created by ikalyvas on 3/1/2018. + */ +@ControllerAdvice +public class GeneralErrorHandler extends ResponseEntityExceptionHandler { + + private ApiContext apiContext; + + @Autowired + public GeneralErrorHandler(ApiContext apiContext) { + this.apiContext = apiContext; + } + + @ExceptionHandler(Exception.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ResponseBody + public ResponseItem processValidationError(HttpServletRequest req, Exception ex) { + apiContext.getHelpersService().getLoggerService().log(ex.getMessage(), WarningLevel.ERROR); + return new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage()); + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/interceptors/RequestInterceptor.java b/dmp-backend/src/main/java/eu/eudat/controllers/interceptors/RequestInterceptor.java new file mode 100644 index 000000000..015377d74 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/controllers/interceptors/RequestInterceptor.java @@ -0,0 +1,33 @@ +package eu.eudat.controllers.interceptors; + +import eu.eudat.services.helpers.LoggerService; +import eu.eudat.types.WarningLevel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; + +/** + * Created by ikalyvas on 3/1/2018. + */ +@Component +public class RequestInterceptor extends HandlerInterceptorAdapter { + + private LoggerService loggerService; + + @Autowired + public RequestInterceptor(LoggerService loggerService) { + this.loggerService = loggerService; + } + + @Override + public boolean preHandle(HttpServletRequest request, + HttpServletResponse response, Object handler) throws Exception { + String reqUri = request.getRequestURI(); + this.loggerService.log("Call to " + reqUri + " method: " + request.getMethod() + " at: " + new Date(), WarningLevel.INFO); + return super.preHandle(request, response, handler); + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/documents/word/WordBuilder.java b/dmp-backend/src/main/java/eu/eudat/documents/word/WordBuilder.java index ee390b215..8ba6b29c8 100644 --- a/dmp-backend/src/main/java/eu/eudat/documents/word/WordBuilder.java +++ b/dmp-backend/src/main/java/eu/eudat/documents/word/WordBuilder.java @@ -7,7 +7,8 @@ import eu.eudat.models.user.components.datasetprofile.FieldSet; import eu.eudat.models.user.components.datasetprofile.Section; import eu.eudat.models.user.composite.DatasetProfilePage; import eu.eudat.models.user.composite.PagedDatasetProfile; -import eu.eudat.utilities.interfaces.Applier; +import eu.eudat.services.forms.VisibilityRuleService; +import eu.eudat.utilities.interfaces.ApplierWithValue; import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDecimalNumber; @@ -15,6 +16,7 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLvl; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STNumberFormat; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.math.BigInteger; @@ -27,7 +29,7 @@ import java.util.Map; */ public class WordBuilder { - private Map> options = new HashMap<>(); + private Map> options = new HashMap<>(); private CTAbstractNum cTAbstractNum; private BigInteger numId; @@ -87,63 +89,69 @@ public class WordBuilder { }); } - public File build(PagedDatasetProfile pagedDatasetProfile) throws IOException { - XWPFDocument document = new XWPFDocument(); - + public File build(PagedDatasetProfile pagedDatasetProfile, String label, VisibilityRuleService visibilityRuleService) throws IOException { + XWPFDocument document = new XWPFDocument(new FileInputStream((WordBuilder.class.getClassLoader().getResource("documents/h2020.docx")).getFile())); this.buildOptions(); - createPages(pagedDatasetProfile.getPages(), document, true); + createPages(pagedDatasetProfile.getPages(), document, true, visibilityRuleService); XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum); XWPFNumbering numbering = document.createNumbering(); BigInteger abstractNumID = numbering.addAbstractNum(abstractNum); this.numId = numbering.addNum(abstractNumID); - createPages(pagedDatasetProfile.getPages(), document, false); - File exportFile = new File("welcome.docx"); + createPages(pagedDatasetProfile.getPages(), document, false, visibilityRuleService); + File exportFile = new File(label); FileOutputStream out = new FileOutputStream(exportFile); document.write(out); out.close(); return exportFile; } - public void createPages(List datasetProfilePages, XWPFDocument mainDocumentPart, Boolean createListing) { + public void createPages(List datasetProfilePages, XWPFDocument mainDocumentPart, Boolean createListing, VisibilityRuleService visibilityRuleService) { //if (createListing) this.addListing(mainDocumentPart, 0, false, true); datasetProfilePages.forEach(item -> { - createSections(item.getSections(), mainDocumentPart, ParagraphStyle.TITLE, 0, createListing); + createSections(item.getSections(), mainDocumentPart, ParagraphStyle.TITLE, 0, createListing, visibilityRuleService); }); } - public void createSections(List
sections, XWPFDocument mainDocumentPart, ParagraphStyle style, Integer indent, Boolean createListing) { + public void createSections(List
sections, XWPFDocument mainDocumentPart, ParagraphStyle style, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService) { if (createListing) this.addListing(mainDocumentPart, indent, false, true); BigInteger listing = numId; sections.forEach(section -> { - if (!createListing) { - XWPFParagraph paragraph = addParagraphContent(section.getTitle(), mainDocumentPart, style, listing); - CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); - number.setVal(BigInteger.valueOf(indent)); + if (visibilityRuleService.isElementVisible(section.getId())) { + if (!createListing) { + XWPFParagraph paragraph = addParagraphContent(section.getTitle(), mainDocumentPart, style, listing); + CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); + number.setVal(BigInteger.valueOf(indent)); + } + createSections(section.getSections(), mainDocumentPart, ParagraphStyle.HEADER2, 1, createListing, visibilityRuleService); + createCompositeFields(section.getCompositeFields(), mainDocumentPart, 2, createListing, visibilityRuleService); } - createSections(section.getSections(), mainDocumentPart, ParagraphStyle.HEADER2, 1, createListing); - createCompositeFields(section.getCompositeFields(), mainDocumentPart, 2, createListing); }); } - public void createCompositeFields(List
compositeFields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing) { + public void createCompositeFields(List
compositeFields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService) { if (createListing) this.addListing(mainDocumentPart, indent, true, true); compositeFields.forEach(compositeField -> { - if (compositeField.getTitle() != null && !compositeField.getTitle().isEmpty() && !createListing) { - XWPFParagraph paragraph = addParagraphContent(compositeField.getTitle(), mainDocumentPart, ParagraphStyle.HEADER3, numId); - CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); - number.setVal(BigInteger.valueOf(indent)); + if (visibilityRuleService.isElementVisible(compositeField.getId())) { + + if (compositeField.getTitle() != null && !compositeField.getTitle().isEmpty() && !createListing) { + XWPFParagraph paragraph = addParagraphContent(compositeField.getTitle(), mainDocumentPart, ParagraphStyle.HEADER3, numId); + CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); + number.setVal(BigInteger.valueOf(indent)); + } + createFields(compositeField.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService); } - createFields(compositeField.getFields(), mainDocumentPart, 3, createListing); }); } - public void createFields(List fields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing) { + public void createFields(List fields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService) { if (createListing) this.addListing(mainDocumentPart, indent, false, false); fields.forEach(field -> { - if (!createListing) { - XWPFParagraph paragraph = addParagraphContent(field.getValue(), mainDocumentPart, ParagraphStyle.TEXT, numId); - CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); - number.setVal(BigInteger.valueOf(indent)); + if (visibilityRuleService.isElementVisible(field.getId())) { + if (!createListing) { + XWPFParagraph paragraph = addParagraphContent(field.getValue() == null ? "" : field.getValue(), mainDocumentPart, ParagraphStyle.TEXT, numId); + CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); + number.setVal(BigInteger.valueOf(indent)); + } } }); } @@ -173,13 +181,18 @@ public class WordBuilder { cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL); cTLvl.addNewLvlText().setVal("Q " + textLevel); cTLvl.addNewStart().setVal(BigInteger.valueOf(1)); + cTLvl.setIlvl(BigInteger.valueOf(indent)); } else if (!question && hasIndication) { cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL); cTLvl.addNewLvlText().setVal(textLevel); cTLvl.addNewStart().setVal(BigInteger.valueOf(1)); + cTLvl.setIlvl(BigInteger.valueOf(indent)); } if (!question && !hasIndication) { cTLvl.addNewNumFmt().setVal(STNumberFormat.NONE); + cTLvl.addNewLvlText().setVal(""); + cTLvl.addNewStart().setVal(BigInteger.valueOf(1)); + cTLvl.setIlvl(BigInteger.valueOf(indent)); } /*if (this.numId == null) { diff --git a/dmp-backend/src/main/java/eu/eudat/handlers/PrincipalArgumentResolver.java b/dmp-backend/src/main/java/eu/eudat/handlers/PrincipalArgumentResolver.java index ffa0065f9..7930fd947 100644 --- a/dmp-backend/src/main/java/eu/eudat/handlers/PrincipalArgumentResolver.java +++ b/dmp-backend/src/main/java/eu/eudat/handlers/PrincipalArgumentResolver.java @@ -3,7 +3,8 @@ package eu.eudat.handlers; import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.models.security.Principal; import eu.eudat.security.claims.ClaimedAuthorities; -import eu.eudat.services.AuthenticationService; +import eu.eudat.services.operations.AuthenticationService; +import eu.eudat.services.operations.AuthenticationServiceImpl; import eu.eudat.types.Authorities; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; diff --git a/dmp-backend/src/main/java/eu/eudat/managers/AdminManager.java b/dmp-backend/src/main/java/eu/eudat/managers/AdminManager.java index 6f586388c..e86de30d6 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/AdminManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/AdminManager.java @@ -22,7 +22,7 @@ public class AdminManager { viewStyleDoc.appendChild(elementViewStyle); String xml = XmlBuilder.generateXml(viewStyleDoc); - eu.eudat.entities.DatasetProfile datasetProfile = apiContext.getBuilderFactory().getBuilder(DatasetProfileBuilder.class).definition(xml).label(profile.getLabel()) + eu.eudat.entities.DatasetProfile datasetProfile = apiContext.getOperationsContext().getBuilderFactory().getBuilder(DatasetProfileBuilder.class).definition(xml).label(profile.getLabel()) .status((short) 1).created(new Date()) .build(); diff --git a/dmp-backend/src/main/java/eu/eudat/managers/DataManagementPlanManager.java b/dmp-backend/src/main/java/eu/eudat/managers/DataManagementPlanManager.java index 9e9d45c05..7e171bee9 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DataManagementPlanManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DataManagementPlanManager.java @@ -33,8 +33,8 @@ public class DataManagementPlanManager { public DataTableData getPaged(ApiContext apiContext, DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal) throws Exception { UserInfo userInfo = new UserInfo(); userInfo.setId(principal.getId()); - QueryableList items = apiContext.getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()); - QueryableList authItems = apiContext.getDatabaseRepository().getDmpDao().getAuthenticated(items, userInfo); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()); + QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, userInfo); QueryableList pagedItems = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest); DataTableData dataTable = new DataTableData(); @@ -68,12 +68,12 @@ public class DataManagementPlanManager { public static void createOrUpdate(ApiContext apiContext, DataManagementPlan dataManagementPlan, Principal principal) throws Exception { DMP newDmp = dataManagementPlan.toDataModel(); - createOrganisationsIfTheyDontExist(newDmp, apiContext.getDatabaseRepository().getOrganisationDao()); - createResearchersIfTheyDontExist(newDmp, apiContext.getDatabaseRepository().getResearcherDao()); - UserInfo user = apiContext.getDatabaseRepository().getUserInfoDao().find(principal.getId()); - createProjectIfItDoesntExist(newDmp, apiContext.getDatabaseRepository().getProjectDao(), user); + createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); + createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao()); + UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); + createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user); newDmp.setCreator(user); - newDmp = apiContext.getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); + newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); if (dataManagementPlan.getAssociatedUsers().stream().filter(item -> item.getId() == principal.getId()).collect(Collectors.toList()).size() == 0) assignUser(newDmp, user, apiContext); } @@ -83,44 +83,44 @@ public class DataManagementPlanManager { userDMP.setDmp(dmp); userDMP.setUser(userInfo); userDMP.setRole(UserDMP.UserDMPRoles.OWNER.getValue()); - apiContext.getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP); + apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP); } public static void newVersion(ApiContext apiContext, UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { - DMP oldDmp = apiContext.getDatabaseRepository().getDmpDao().find(uuid); + DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid); DMP newDmp = dataManagementPlan.toDataModel(); - createOrganisationsIfTheyDontExist(newDmp, apiContext.getDatabaseRepository().getOrganisationDao()); - createResearchersIfTheyDontExist(newDmp, apiContext.getDatabaseRepository().getResearcherDao()); - UserInfo user = apiContext.getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); - createProjectIfItDoesntExist(newDmp, apiContext.getDatabaseRepository().getProjectDao(), user); + createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); + createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao()); + UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); + createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user); newDmp.setCreator(user); newDmp.setGroupId(oldDmp.getGroupId()); newDmp.setVersion(oldDmp.getVersion() + 1); newDmp.setId(null); - newDmp = apiContext.getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); - copyDatasets(newDmp, apiContext.getDatabaseRepository().getDatasetDao()); + newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); + copyDatasets(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()); } public static void clone(ApiContext apiContext, UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { DMP newDmp = dataManagementPlan.toDataModel(); - createOrganisationsIfTheyDontExist(newDmp, apiContext.getDatabaseRepository().getOrganisationDao()); - createResearchersIfTheyDontExist(newDmp, apiContext.getDatabaseRepository().getResearcherDao()); - UserInfo user = apiContext.getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); - createProjectIfItDoesntExist(newDmp, apiContext.getDatabaseRepository().getProjectDao(), user); + createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); + createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao()); + UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); + createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user); newDmp.setCreator(user); newDmp.setGroupId(UUID.randomUUID()); newDmp.setVersion(0); newDmp.setId(null); - newDmp = apiContext.getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); - copyDatasets(newDmp, apiContext.getDatabaseRepository().getDatasetDao()); + newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); + copyDatasets(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()); } public static void delete(ApiContext apiContext, UUID uuid) throws DMPWithDatasetsException { - DMP oldDmp = apiContext.getDatabaseRepository().getDmpDao().find(uuid); + DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid); if (oldDmp.getDataset().size() > 0) throw new DMPWithDatasetsException("You cannot Remove Datamanagement Plan with Datasets"); oldDmp.setStatus(DMP.DMPStatus.DELETED.getValue()); - apiContext.getDatabaseRepository().getDmpDao().createOrUpdate(oldDmp); + apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(oldDmp); } private static void createResearchersIfTheyDontExist(DMP newDmp, ResearcherDao researcherRepository) { diff --git a/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java b/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java index e5c6e4e05..7806465fe 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java @@ -17,24 +17,32 @@ import eu.eudat.models.security.Principal; import eu.eudat.models.user.composite.PagedDatasetProfile; import eu.eudat.queryable.QueryableList; import eu.eudat.services.ApiContext; +import eu.eudat.services.forms.VisibilityRuleService; +import org.apache.commons.io.IOUtils; import org.json.JSONObject; +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.util.LinkedMultiValueMap; +import org.springframework.web.client.RestTemplate; -import javax.xml.bind.JAXBException; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; public class DatasetManager { public DataTableData getPaged(ApiContext apiContext, DatasetTableRequest datasetTableRequest, Principal principal) throws Exception { - UserInfo userInfo = apiContext.getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); - QueryableList items = apiContext.getDatabaseRepository().getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()); - QueryableList authItems = apiContext.getDatabaseRepository().getDatasetDao().getAuthenticated(items, userInfo); + UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()); + QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getAuthenticated(items, userInfo); QueryableList pagedItems = PaginationManager.applyPaging(authItems, datasetTableRequest); DataTableData dataTable = new DataTableData(); @@ -72,24 +80,94 @@ public class DatasetManager { return pagedDatasetProfile; } - public File getWordDocument(DatasetDao datatasetRepository, String id) throws InstantiationException, IllegalAccessException, IOException { + public File getWordDocument(DatasetDao datatasetRepository, String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException { WordBuilder wordBuilder = new WordBuilder(); DatasetWizardModel dataset = new DatasetWizardModel(); eu.eudat.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); - PagedDatasetProfile pagedDatasetProfile = getPagedProfile(dataset,datasetEntity); - return wordBuilder.build(pagedDatasetProfile); + Map properties = new HashMap<>(); + if (datasetEntity.getProperties() != null) { + JSONObject jobject = new JSONObject(datasetEntity.getProperties()); + properties = (Map) jobject.toMap(); + } + PagedDatasetProfile pagedDatasetProfile = getPagedProfile(dataset, datasetEntity); + visibilityRuleService.setProperties(properties); + visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); + File file = wordBuilder.build(pagedDatasetProfile, datasetEntity.getLabel(),visibilityRuleService); + return file; + } + + public File convertToPDF(File file, Environment environment, String label) throws IOException, InterruptedException { + LinkedMultiValueMap map = new LinkedMultiValueMap<>(); + map.add("file", new FileSystemResource(file)); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + + HttpEntity> requestEntity = new HttpEntity>( + map, headers); + Map queueResult = new RestTemplate().postForObject( + environment.getProperty("pdf.converter.url") + + "api/v1/", requestEntity, Map.class); + + Map mediaResult = new RestTemplate().getForObject(environment.getProperty("pdf.converter.url") + + "/api/v1/" + queueResult.get("id"), Map.class); + System.out.println("Status: " + mediaResult.get("status")); + while (!mediaResult.get("status").equals("finished")) { + Thread.sleep(500); + mediaResult = new RestTemplate().getForObject(environment.getProperty("pdf.converter.url") + + "api/v1/" + queueResult.get("id"), Map.class); + System.out.println("Polling"); + } + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter()); + HttpHeaders headers2 = new HttpHeaders(); + headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM)); + HttpEntity entity = new HttpEntity(headers2); + + ResponseEntity response = restTemplate.exchange(environment.getProperty("pdf.converter.url") + + mediaResult.get("result_url"), HttpMethod.GET, entity, byte[].class, "1"); + + UUID uuid = UUID.randomUUID(); + File zip = new File(uuid + ".zip"); + if (response.getStatusCode().equals(HttpStatus.OK)) { + FileOutputStream output = new FileOutputStream(zip); + IOUtils.write(response.getBody(), output); + } + return extractFromZip(zip, label + ".pdf"); + } + + private File extractFromZip(File file, String filename) throws IOException { + byte[] buffer = new byte[1024]; + File newFile = new File(filename); + ZipInputStream zis = new ZipInputStream(new FileInputStream(file)); + ZipEntry zipEntry = zis.getNextEntry(); + while (zipEntry != null) { + String zippedFileName = zipEntry.getName(); + if (zippedFileName.equals("pdf")) { + + FileOutputStream fos = new FileOutputStream(newFile); + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + fos.close(); + zipEntry = zis.getNextEntry(); + } + } + zis.closeEntry(); + zis.close(); + return newFile; } public static eu.eudat.entities.Dataset createOrUpdate(ApiContext apiContext, DatasetWizardModel profile, Principal principal) throws Exception { eu.eudat.entities.Dataset dataset = profile.toDataModel(); propertiesModelToString(profile, dataset); - UserInfo userInfo = apiContext.getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); + UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); dataset.setCreator(userInfo); - createRegistriesIfTheyDontExist(apiContext.getDatabaseRepository().getRegistryDao(), dataset); - createDataRepositoriesIfTheyDontExist(apiContext.getDatabaseRepository().getDataRepositoryDao(), dataset); - createServicesIfTheyDontExist(apiContext.getDatabaseRepository().getServiceDao(), dataset); - createExternalDatasetsIfTheyDontExist(apiContext.getDatabaseRepository().getExternalDatasetDao(), dataset); - return apiContext.getDatabaseRepository().getDatasetDao().createOrUpdate(dataset); + createRegistriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao(), dataset); + createDataRepositoriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao(), dataset); + createServicesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getServiceDao(), dataset); + createExternalDatasetsIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao(), dataset); + return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(dataset); } private static void propertiesModelToString(DatasetWizardModel datasetWizardModel, eu.eudat.entities.Dataset dataset) { diff --git a/dmp-backend/src/main/java/eu/eudat/managers/DatasetProfileManager.java b/dmp-backend/src/main/java/eu/eudat/managers/DatasetProfileManager.java index 5580dc8fb..1c88791d5 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DatasetProfileManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DatasetProfileManager.java @@ -24,10 +24,10 @@ public class DatasetProfileManager { } public static DataTableData getPaged(ApiContext apiContext, DatasetProfileTableRequestItem datasetProfileTableRequestItem) throws Exception { - QueryableList items = apiContext.getDatabaseRepository().getDatasetProfileDao().getWithCriteria(datasetProfileTableRequestItem.getCriteria()); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(datasetProfileTableRequestItem.getCriteria()); QueryableList pagedItems = PaginationManager.applyPaging(items, datasetProfileTableRequestItem); List datasetProfiles = pagedItems.select(item -> new DatasetProfileListingModel().fromDataModel(item)); - return apiContext.getBuilderFactory().getBuilder(DataTableDataBuilder.class).data(datasetProfiles).totalCount(items.count()).build(); + return apiContext.getOperationsContext().getBuilderFactory().getBuilder(DataTableDataBuilder.class).data(datasetProfiles).totalCount(items.count()).build(); } public static List getAll(DatasetProfileDao datasetProfileRepository) throws IllegalAccessException, InstantiationException { diff --git a/dmp-backend/src/main/java/eu/eudat/managers/ExternalDatasetManager.java b/dmp-backend/src/main/java/eu/eudat/managers/ExternalDatasetManager.java index c146680af..456ce7eca 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/ExternalDatasetManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/ExternalDatasetManager.java @@ -22,15 +22,15 @@ import java.util.stream.Collectors; public class ExternalDatasetManager { public DataTableData getPaged(ApiContext apiContext, ExternalDatasetTableRequest externalDatasetTableRequest) throws Exception { - QueryableList items = apiContext.getDatabaseRepository().getExternalDatasetDao().getWithCriteria(externalDatasetTableRequest.getCriteria()); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao().getWithCriteria(externalDatasetTableRequest.getCriteria()); QueryableList pagedItems = PaginationManager.applyPaging(items, externalDatasetTableRequest); List externalDatasetListingmodels = pagedItems.select(item -> new ExternalDatasetListingModel().fromDataModel(item)); - return apiContext.getBuilderFactory().getBuilder(DataTableDataBuilder.class).data(externalDatasetListingmodels).totalCount(items.count()).build(); + return apiContext.getOperationsContext().getBuilderFactory().getBuilder(DataTableDataBuilder.class).data(externalDatasetListingmodels).totalCount(items.count()).build(); } public List getWithExternal(ApiContext apiContext, String query, RemoteFetcher remoteFetcher) throws HugeResultSet, NoURLFound, InstantiationException, IllegalAccessException { - ExternalDatasetCriteria criteria = apiContext.getBuilderFactory().getBuilder(ExternalDatasetCriteriaBuilder.class).like(query).build(); - QueryableList items = apiContext.getDatabaseRepository().getExternalDatasetDao().getWithCriteria(criteria); + ExternalDatasetCriteria criteria = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ExternalDatasetCriteriaBuilder.class).like(query).build(); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao().getWithCriteria(criteria); List externalDatasets = items.select(item -> new ExternalDatasetListingModel().fromDataModel(item)); return externalDatasets; } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/InvitationsManager.java b/dmp-backend/src/main/java/eu/eudat/managers/InvitationsManager.java index 351da67ba..dc34815dc 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/InvitationsManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/InvitationsManager.java @@ -22,27 +22,27 @@ public class InvitationsManager { principalUser.setId(principal.getId()); List alreadySignedInUsers = invitation.getUsers().stream().filter(item -> item.getId() != null).collect(Collectors.toList()); List alreadySignedInUsersEntities = alreadySignedInUsers.stream().map(item -> item.toDataModel()).collect(Collectors.toList()); - DMP dataManagementPlan = apiContext.getDatabaseRepository().getDmpDao().find(invitation.getDataManagementPlan()); - apiContext.getInvitationService().createInvitations(apiContext.getDatabaseRepository().getInvitationDao(), apiContext.getMailService(), invitation.getUsers().stream().map(item -> item.toDataModel()).collect(Collectors.toList()), dataManagementPlan, principalUser); - apiContext.getInvitationService().assignToDmp(apiContext.getDatabaseRepository().getDmpDao(), alreadySignedInUsersEntities, dataManagementPlan); + DMP dataManagementPlan = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(invitation.getDataManagementPlan()); + apiContext.getUtilitiesService().getInvitationService().createInvitations(apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao(), apiContext.getUtilitiesService().getMailService(), invitation.getUsers().stream().map(item -> item.toDataModel()).collect(Collectors.toList()), dataManagementPlan, principalUser); + apiContext.getUtilitiesService().getInvitationService().assignToDmp(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao(), alreadySignedInUsersEntities, dataManagementPlan); } public static List getUsers(ApiContext apiContext, UserInfoRequestItem userInfoRequestItem) throws InstantiationException, IllegalAccessException { - QueryableList users = apiContext.getDatabaseRepository().getUserInfoDao().getWithCriteria(userInfoRequestItem.getCriteria()); + QueryableList users = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().getWithCriteria(userInfoRequestItem.getCriteria()); List userModels = users.select(item -> new UserInfoInvitationModel().fromDataModel(item)); return userModels; } public static UUID assignUserAcceptedInvitation(ApiContext apiContext, UUID invitationID, Principal principal) throws UnauthorisedException { - eu.eudat.entities.Invitation invitation = apiContext.getDatabaseRepository().getInvitationDao().find(invitationID); + eu.eudat.entities.Invitation invitation = apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao().find(invitationID); if (invitation == null) throw new UnauthorisedException("There is no Data Management Plan assigned to this Link"); if (invitation.getAcceptedInvitation()) throw new UnauthorisedException("This Url Has Expired"); - UserInfo invitedUser = apiContext.getDatabaseRepository().getUserInfoDao().find(principal.getId()); + UserInfo invitedUser = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); DMP datamanagementPlan = invitation.getDmp(); - apiContext.getInvitationService().assignToDmp(apiContext.getDatabaseRepository().getDmpDao(), invitedUser, datamanagementPlan); + apiContext.getUtilitiesService().getInvitationService().assignToDmp(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao(), invitedUser, datamanagementPlan); invitation.setAcceptedInvitation(true); - apiContext.getDatabaseRepository().getInvitationDao().createOrUpdate(invitation); + apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao().createOrUpdate(invitation); return datamanagementPlan.getId(); } } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/ProjectManager.java b/dmp-backend/src/main/java/eu/eudat/managers/ProjectManager.java index ef2b3d508..6cc06005c 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/ProjectManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/ProjectManager.java @@ -56,12 +56,12 @@ public class ProjectManager { } public List getCriteriaWithExternal(ApiContext apiContext, ProjectCriteriaRequest projectCriteria, RemoteFetcher remoteFetcher) throws IllegalAccessException, InstantiationException, HugeResultSet, NoURLFound { - QueryableList items = apiContext.getDatabaseRepository().getProjectDao().getWithCriteria(projectCriteria.getCriteria()); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().getWithCriteria(projectCriteria.getCriteria()); List projects = items.select(item -> new Project().fromDataModel(item)); List> remoteRepos = remoteFetcher.getProjects(projectCriteria.getCriteria().getLike()); ProjectsExternalSourcesModel projectsExternalSourcesModel = new ProjectsExternalSourcesModel().fromExternalItem(remoteRepos); for (ExternalSourcesItemModel externalListingItem : projectsExternalSourcesModel) { - eu.eudat.models.project.Project project = apiContext.getBuilderFactory().getBuilder(ProjectBuilder.class) + eu.eudat.models.project.Project project = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ProjectBuilder.class) .reference(externalListingItem.getRemoteId()).label(externalListingItem.getName()) .description(externalListingItem.getDescription()).uri(externalListingItem.getUri()) .abbreviation(externalListingItem.getAbbreviation()).status(eu.eudat.entities.Project.Status.fromInteger(0)) diff --git a/dmp-backend/src/main/java/eu/eudat/managers/ResearcherManager.java b/dmp-backend/src/main/java/eu/eudat/managers/ResearcherManager.java index 9d47d482a..c36bdd342 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/ResearcherManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/ResearcherManager.java @@ -10,6 +10,6 @@ public class ResearcherManager { public static Researcher create(ApiContext apiContext, eu.eudat.models.researcher.Researcher researcher) throws Exception { Researcher researcherEntity = researcher.toDataModel(); - return apiContext.getDatabaseRepository().getResearcherDao().createOrUpdate(researcherEntity); + return apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao().createOrUpdate(researcherEntity); } } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/UserManager.java b/dmp-backend/src/main/java/eu/eudat/managers/UserManager.java index c4eb0aaab..1aada771f 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/UserManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/UserManager.java @@ -11,13 +11,12 @@ import eu.eudat.models.userinfo.UserInfoTableRequestItem; import eu.eudat.models.userinfo.UserListingModel; import eu.eudat.queryable.QueryableList; import eu.eudat.services.ApiContext; -import eu.eudat.services.AuthenticationService; +import eu.eudat.services.operations.AuthenticationServiceImpl; import eu.eudat.utilities.builders.XmlBuilder; import org.w3c.dom.Document; import org.w3c.dom.Element; import java.util.List; -import java.util.stream.Collectors; public class UserManager { public static eu.eudat.models.user.composite.DatasetProfile generateDatasetProfileModel(eu.eudat.entities.DatasetProfile profile) { @@ -32,24 +31,24 @@ public class UserManager { } public static DataTableData getPaged(ApiContext apiContext, UserInfoTableRequestItem userInfoTableRequestItem) throws Exception { - QueryableList users = apiContext.getDatabaseRepository().getUserInfoDao().getWithCriteria(userInfoTableRequestItem.getCriteria()); + QueryableList users = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().getWithCriteria(userInfoTableRequestItem.getCriteria()); QueryableList pagedUsers = PaginationManager.applyPaging(users, userInfoTableRequestItem); List modelUsers = pagedUsers.select(item -> new UserListingModel().fromDataModel(item)); - return apiContext.getBuilderFactory().getBuilder(DataTableDataBuilder.class).totalCount(users.count()).data(modelUsers).build(); + return apiContext.getOperationsContext().getBuilderFactory().getBuilder(DataTableDataBuilder.class).totalCount(users.count()).data(modelUsers).build(); } public static void editRoles(ApiContext apiContext, UserListingModel user) { - eu.eudat.entities.UserInfo userInfo = apiContext.getDatabaseRepository().getUserInfoDao().find(user.getId()); - userInfo.getUserRoles().stream().forEach(item -> apiContext.getDatabaseRepository().getUserRoleDao().delete(item)); + eu.eudat.entities.UserInfo userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(user.getId()); + userInfo.getUserRoles().stream().forEach(item -> apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().delete(item)); for (Integer role : user.getAppRoles()) { - UserRole userRole = apiContext.getBuilderFactory().getBuilder(UserRoleBuilder.class).role(role).userInfo(userInfo).build(); - apiContext.getDatabaseRepository().getUserRoleDao().createOrUpdate(userRole); + UserRole userRole = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserRoleBuilder.class).role(role).userInfo(userInfo).build(); + apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().createOrUpdate(userRole); } } - public static Principal authenticate(AuthenticationService authenticationService, Credentials credentials) { - Principal principal = authenticationService.Touch(credentials); + public static Principal authenticate(AuthenticationServiceImpl authenticationServiceImpl, Credentials credentials) { + Principal principal = authenticationServiceImpl.Touch(credentials); if (principal == null) throw new UnauthorisedException("Could not Sign In User"); return principal; } diff --git a/dmp-backend/src/main/java/eu/eudat/models/helpers/responses/ResponseItem.java b/dmp-backend/src/main/java/eu/eudat/models/helpers/responses/ResponseItem.java index becebd696..334cf9b73 100644 --- a/dmp-backend/src/main/java/eu/eudat/models/helpers/responses/ResponseItem.java +++ b/dmp-backend/src/main/java/eu/eudat/models/helpers/responses/ResponseItem.java @@ -1,10 +1,12 @@ package eu.eudat.models.helpers.responses; import eu.eudat.types.ApiMessageCode; +import eu.eudat.types.ApiResponseType; public class ResponseItem { private Integer statusCode; + private Integer responseType = ApiResponseType.JSON_RESPONSE.getValue(); private String message; private T payload; @@ -32,6 +34,14 @@ public class ResponseItem { this.payload = payload; } + public Integer getResponseType() { + return responseType; + } + + public void setResponseType(Integer responseType) { + this.responseType = responseType; + } + public ResponseItem status(ApiMessageCode statusCode) { this.statusCode = statusCode.getValue(); return this; @@ -47,4 +57,9 @@ public class ResponseItem { return this; } + public ResponseItem responseType(ApiResponseType apiResponseType) { + this.responseType = apiResponseType.getValue(); + return this; + } + } diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/B2AccessTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/B2AccessTokenValidator.java index 04660739b..d432b483a 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/B2AccessTokenValidator.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/B2AccessTokenValidator.java @@ -9,7 +9,7 @@ import eu.eudat.security.customproviders.B2AccessUser; import eu.eudat.security.validators.TokenValidator; import eu.eudat.security.validators.b2access.helpers.B2AccessRequest; import eu.eudat.security.validators.b2access.helpers.B2AccessResponseToken; -import eu.eudat.services.AuthenticationService; +import eu.eudat.services.operations.AuthenticationServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @@ -24,12 +24,12 @@ import java.security.GeneralSecurityException; public class B2AccessTokenValidator implements TokenValidator { private B2AccessCustomProvider b2AccessCustomProvider; - private AuthenticationService authenticationService; + private AuthenticationServiceImpl authenticationServiceImpl; private Environment environment; @Autowired - public B2AccessTokenValidator(AuthenticationService authenticationService, Environment environment, B2AccessCustomProvider b2AccessCustomProvider) { - this.authenticationService = authenticationService; + public B2AccessTokenValidator(AuthenticationServiceImpl authenticationServiceImpl, Environment environment, B2AccessCustomProvider b2AccessCustomProvider) { + this.authenticationServiceImpl = authenticationServiceImpl; this.environment = environment; this.b2AccessCustomProvider = b2AccessCustomProvider; } @@ -43,7 +43,7 @@ public class B2AccessTokenValidator implements TokenValidator { user.setName(b2AccessUser.getName()); user.setProvider(credentials.getProvider()); user.setSecret(credentials.getTicket()); - return this.authenticationService.Touch(user); + return this.authenticationServiceImpl.Touch(user); } public B2AccessResponseToken getAccessToken(B2AccessRequest b2AccessRequest) { diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java index 50679406f..383ac9898 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java @@ -8,7 +8,7 @@ import eu.eudat.models.security.Principal; import eu.eudat.security.validators.TokenValidator; import eu.eudat.security.validators.TokenValidatorFactoryImpl; import eu.eudat.services.ApiContext; -import eu.eudat.services.AuthenticationService; +import eu.eudat.services.operations.AuthenticationServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.social.facebook.api.User; @@ -26,14 +26,14 @@ public class FacebookTokenValidator implements TokenValidator { private Environment environment; private ApiContext apiContext; - private AuthenticationService authenticationService; + private AuthenticationServiceImpl authenticationServiceImpl; private FacebookServiceProvider facebookServiceProvider; @Autowired - public FacebookTokenValidator(Environment environment, ApiContext apiContext, AuthenticationService authenticationService) { + public FacebookTokenValidator(Environment environment, ApiContext apiContext, AuthenticationServiceImpl authenticationServiceImpl) { this.environment = environment; this.apiContext = apiContext; - this.authenticationService = authenticationService; + this.authenticationServiceImpl = authenticationServiceImpl; this.facebookServiceProvider = new FacebookServiceProvider(this.environment.getProperty("facebook.login.clientId"), this.environment.getProperty("facebook.login.clientSecret"), this.environment.getProperty("facebook.login.namespace")); } @@ -49,7 +49,7 @@ public class FacebookTokenValidator implements TokenValidator { user.setName(profile.getName()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.FACEBOOK); user.setSecret(credentials.getTicket()); - return this.authenticationService.Touch(user); + return this.authenticationServiceImpl.Touch(user); } diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java index 66c62f99c..86b8f0373 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java @@ -12,7 +12,7 @@ import eu.eudat.models.loginprovider.LoginProviderUser; import eu.eudat.security.validators.TokenValidator; import eu.eudat.security.validators.TokenValidatorFactoryImpl; import eu.eudat.services.ApiContext; -import eu.eudat.services.AuthenticationService; +import eu.eudat.services.operations.AuthenticationServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @@ -26,15 +26,15 @@ public class GoogleTokenValidator implements TokenValidator { private static final HttpTransport transport = new NetHttpTransport(); private ApiContext apiContext; - private AuthenticationService authenticationService; + private AuthenticationServiceImpl authenticationServiceImpl; private GoogleIdTokenVerifier verifier; private Environment environment; @Autowired - public GoogleTokenValidator(ApiContext apiContext, Environment environment, AuthenticationService authenticationService) { + public GoogleTokenValidator(ApiContext apiContext, Environment environment, AuthenticationServiceImpl authenticationServiceImpl) { this.apiContext = apiContext; this.environment = environment; - this.authenticationService = authenticationService; + this.authenticationServiceImpl = authenticationServiceImpl; verifier = new GoogleIdTokenVerifier.Builder(transport, JacksonFactory.getDefaultInstance()) .setAudience(Collections.singletonList(this.environment.getProperty("google.login.clientId"))) .build(); @@ -56,7 +56,7 @@ public class GoogleTokenValidator implements TokenValidator { user.setName((String) payload.get("name")); user.setEmail(payload.getEmail()); user.setIsVerified(payload.getEmailVerified()); - return this.authenticationService.Touch(user); + return this.authenticationServiceImpl.Touch(user); } } diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java index 7dbd38c76..e56429db0 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java @@ -8,7 +8,7 @@ import eu.eudat.models.security.Principal; import eu.eudat.security.validators.TokenValidator; import eu.eudat.security.validators.TokenValidatorFactoryImpl; import eu.eudat.services.ApiContext; -import eu.eudat.services.AuthenticationService; +import eu.eudat.services.operations.AuthenticationServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.social.linkedin.api.LinkedIn; @@ -26,14 +26,14 @@ public class LinkedInTokenValidator implements TokenValidator { private Environment environment; private ApiContext apiContext; - private AuthenticationService authenticationService; + private AuthenticationServiceImpl authenticationServiceImpl; private LinkedInServiceProvider linkedInServiceProvider; @Autowired - public LinkedInTokenValidator(Environment environment, ApiContext apiContext, AuthenticationService authenticationService) { + public LinkedInTokenValidator(Environment environment, ApiContext apiContext, AuthenticationServiceImpl authenticationServiceImpl) { this.environment = environment; this.apiContext = apiContext; - this.authenticationService = authenticationService; + this.authenticationServiceImpl = authenticationServiceImpl; this.linkedInServiceProvider = new LinkedInServiceProvider(this.environment.getProperty("linkedin.login.clientId"), this.environment.getProperty("linkedin.login.clientSecret")); } @@ -52,6 +52,6 @@ public class LinkedInTokenValidator implements TokenValidator { user.setName(linkedInProfile.getFirstName() + " " + linkedInProfile.getLastName()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.LINKEDIN); user.setSecret(accessGrant.getAccessToken()); - return this.authenticationService.Touch(user); + return this.authenticationServiceImpl.Touch(user); } } diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java index c643aa205..f68e2677d 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java @@ -8,7 +8,7 @@ import eu.eudat.models.security.Principal; import eu.eudat.security.validators.TokenValidator; import eu.eudat.security.validators.TokenValidatorFactoryImpl; import eu.eudat.services.ApiContext; -import eu.eudat.services.AuthenticationService; +import eu.eudat.services.operations.AuthenticationServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.social.oauth1.AuthorizedRequestToken; @@ -28,14 +28,14 @@ public class TwitterTokenValidator implements TokenValidator { private Environment environment; private ApiContext apiContext; - private AuthenticationService authenticationService; + private AuthenticationServiceImpl authenticationServiceImpl; private TwitterServiceProvider twitterServiceProvider; @Autowired - public TwitterTokenValidator(Environment environment, ApiContext apiContext, AuthenticationService authenticationService) { + public TwitterTokenValidator(Environment environment, ApiContext apiContext, AuthenticationServiceImpl authenticationServiceImpl) { this.environment = environment; this.apiContext = apiContext; - this.authenticationService = authenticationService; + this.authenticationServiceImpl = authenticationServiceImpl; this.twitterServiceProvider = new TwitterServiceProvider(this.environment.getProperty("twitter.login.clientId"), this.environment.getProperty("twitter.login.clientSecret")); } @@ -58,7 +58,7 @@ public class TwitterTokenValidator implements TokenValidator { user.setName(profile.getName()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.TWITTER); user.setSecret(finalOauthToken.getValue()); - return this.authenticationService.Touch(user); + return this.authenticationServiceImpl.Touch(user); } public OAuthToken getRequestToken() { diff --git a/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java b/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java index 7014ce6d7..9d0a8e946 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java +++ b/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java @@ -1,23 +1,14 @@ package eu.eudat.services; -import eu.eudat.builders.BuilderFactory; -import eu.eudat.proxy.fetching.RemoteFetcher; -import org.springframework.context.ApplicationContext; -import org.springframework.context.MessageSource; - +import eu.eudat.services.helpers.HelpersService; +import eu.eudat.services.operations.OperationsContext; +import eu.eudat.services.utilities.UtilitiesService; public interface ApiContext { - DatabaseRepository getDatabaseRepository(); - - ApplicationContext getApplicationContext(); - - InvitationService getInvitationService(); - - RemoteFetcher getRemoteFetcher(); - MailService getMailService(); + HelpersService getHelpersService(); - MessageSource getMessageSource(); + OperationsContext getOperationsContext(); - BuilderFactory getBuilderFactory(); + UtilitiesService getUtilitiesService(); } diff --git a/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java b/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java index f94ecbab3..9429bf0c7 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java @@ -1,91 +1,36 @@ package eu.eudat.services; -import eu.eudat.builders.BuilderFactory; -import eu.eudat.proxy.fetching.RemoteFetcher; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.MessageSource; +import eu.eudat.services.helpers.HelpersService; +import eu.eudat.services.operations.OperationsContext; +import eu.eudat.services.utilities.UtilitiesService; import org.springframework.stereotype.Service; @Service("apiContext") public class ApiContextImpl implements ApiContext { - private DatabaseRepository databaseRepository; - private ApplicationContext applicationContext; - private RemoteFetcher remoteFetcher; - private InvitationService invitationService; - private MailService mailService; - private MessageSource messageSource; - private BuilderFactory builderFactory; + private OperationsContext operationsContext; + private HelpersService helpersService; + private UtilitiesService utilitiesService; - @Autowired - public void setDatabaseRepository(DatabaseRepository databaseRepository) { - this.databaseRepository = databaseRepository; + public ApiContextImpl(OperationsContext operationsContext, HelpersService helpersService, UtilitiesService utilitiesService) { + this.operationsContext = operationsContext; + this.helpersService = helpersService; + this.utilitiesService = utilitiesService; } @Override - public DatabaseRepository getDatabaseRepository() { - return databaseRepository; + public OperationsContext getOperationsContext() { + return operationsContext; } @Override - public ApplicationContext getApplicationContext() { - return applicationContext; - } - - @Autowired - public void setApplicationContext(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; - } - - @Override - public RemoteFetcher getRemoteFetcher() { - return remoteFetcher; - } - - @Autowired - public void setRemoteFetcher(RemoteFetcher remoteFetcher) { - this.remoteFetcher = remoteFetcher; - } - - @Override - public InvitationService getInvitationService() { - return invitationService; - } - - @Autowired - public void setInvitationService(InvitationService invitationService) { - this.invitationService = invitationService; + public HelpersService getHelpersService() { + return helpersService; } @Override - public MailService getMailService() { - return mailService; - } - - @Autowired - public void setMailService(MailService mailService) { - this.mailService = mailService; - } - - @Override - public MessageSource getMessageSource() { - return messageSource; - } - - @Autowired - public void setMessageSource(MessageSource messageSource) { - this.messageSource = messageSource; - } - - @Override - public BuilderFactory getBuilderFactory() { - return builderFactory; - } - - @Autowired - public void setBuilderFactory(BuilderFactory builderFactory) { - this.builderFactory = builderFactory; + public UtilitiesService getUtilitiesService() { + return utilitiesService; } } diff --git a/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityContext.java b/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityContext.java new file mode 100644 index 000000000..a47246d6a --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityContext.java @@ -0,0 +1,45 @@ +package eu.eudat.services.forms; + +import eu.eudat.models.user.components.commons.Rule; + +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; + +/** + * Created by ikalyvas on 3/5/2018. + */ +public class VisibilityContext { + private List visibilityRules = new LinkedList<>(); + + public List getVisibilityRules() { + return visibilityRules; + } + + public VisibilityRule get(String id) { + Optional rule = visibilityRules.stream().filter(item -> item.getVisibilityRuleTargetId().equals(id)).findFirst(); + if (rule.isPresent()) return rule.get(); + return null; + } + + public void buildVisibilityContext(List sources) { + sources.forEach(this::addToVisibilityRulesContext); + } + + private void addToVisibilityRulesContext(Rule item) { + VisibilityRuleSource source = new VisibilityRuleSource(); + source.setVisibilityRuleSourceId(item.getSourceField()); + source.setVisibilityRuleSourceValue(item.getRequiredValue()); + + Optional visibilityRuleOptional = visibilityRules.stream().filter(rule -> rule.getVisibilityRuleTargetId().equals(item.getTargetField())).findFirst(); + if (visibilityRuleOptional.isPresent()) visibilityRuleOptional.get().getVisibilityRuleSources().add(source); + else { + List sources = new LinkedList<>(); + sources.add(source); + VisibilityRule visibilityRule = new VisibilityRule(); + visibilityRule.setVisibilityRuleTargetId(item.getTargetField()); + visibilityRule.setVisibilityRuleSources(sources); + this.visibilityRules.add(visibilityRule); + } + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRule.java b/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRule.java new file mode 100644 index 000000000..3069e21b2 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRule.java @@ -0,0 +1,27 @@ +package eu.eudat.services.forms; + +import java.util.List; + +/** + * Created by ikalyvas on 3/5/2018. + */ +public class VisibilityRule { + private String visibilityRuleTargetId; + private List visibilityRuleSources; + + public String getVisibilityRuleTargetId() { + return visibilityRuleTargetId; + } + + public void setVisibilityRuleTargetId(String visibilityRuleTargetId) { + this.visibilityRuleTargetId = visibilityRuleTargetId; + } + + public List getVisibilityRuleSources() { + return visibilityRuleSources; + } + + public void setVisibilityRuleSources(List visibilityRuleSources) { + this.visibilityRuleSources = visibilityRuleSources; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleService.java b/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleService.java new file mode 100644 index 000000000..3318a3131 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleService.java @@ -0,0 +1,17 @@ +package eu.eudat.services.forms; + +import eu.eudat.models.user.components.commons.Rule; + +import java.util.List; +import java.util.Map; + +/** + * Created by ikalyvas on 3/5/2018. + */ +public interface VisibilityRuleService { + Boolean isElementVisible(String id); + + void buildVisibilityContext(List sources); + + void setProperties(Map properties); +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleServiceImpl.java b/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleServiceImpl.java new file mode 100644 index 000000000..e821616b9 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleServiceImpl.java @@ -0,0 +1,46 @@ +package eu.eudat.services.forms; + +import eu.eudat.models.user.components.commons.Rule; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by ikalyvas on 3/5/2018. + */ +@Service("visibilityRuleService") +public class VisibilityRuleServiceImpl implements VisibilityRuleService { + private Map elementVisibility = new HashMap<>(); + private VisibilityContext visibilityContext; + private Map properties; + + public Boolean isElementVisible(String id) { + if (!this.elementVisibility.containsKey(id) || this.elementVisibility.get(id)) return true; + return false; + } + + public void setProperties(Map properties) { + this.properties = properties; + } + + public void buildVisibilityContext(List sources) { + this.visibilityContext = new VisibilityContext(); + this.visibilityContext.buildVisibilityContext(sources); + this.visibilityContext.getVisibilityRules().forEach(item-> this.evaluateVisibility(item)); + } + + private void evaluateVisibility(VisibilityRule rule) { + List sources = rule.getVisibilityRuleSources(); + for(int i = 0; i < sources.size(); i++){ + if (!properties.containsKey(sources.get(i).getVisibilityRuleSourceId()) || !properties.get(sources.get(i).getVisibilityRuleSourceId()).equals(sources.get(i).getVisibilityRuleSourceValue())) { + this.elementVisibility.put(rule.getVisibilityRuleTargetId(), false); + return; + }else{ + this.elementVisibility.put(rule.getVisibilityRuleTargetId(), true); + } + } + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleSource.java b/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleSource.java new file mode 100644 index 000000000..e349b6961 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/forms/VisibilityRuleSource.java @@ -0,0 +1,25 @@ +package eu.eudat.services.forms; + +/** + * Created by ikalyvas on 3/5/2018. + */ +public class VisibilityRuleSource { + private String visibilityRuleSourceId; + private String visibilityRuleSourceValue; + + public String getVisibilityRuleSourceId() { + return visibilityRuleSourceId; + } + + public void setVisibilityRuleSourceId(String visibilityRuleSourceId) { + this.visibilityRuleSourceId = visibilityRuleSourceId; + } + + public String getVisibilityRuleSourceValue() { + return visibilityRuleSourceValue; + } + + public void setVisibilityRuleSourceValue(String visibilityRuleSourceValue) { + this.visibilityRuleSourceValue = visibilityRuleSourceValue; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/helpers/HelpersService.java b/dmp-backend/src/main/java/eu/eudat/services/helpers/HelpersService.java new file mode 100644 index 000000000..d53877eb2 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/helpers/HelpersService.java @@ -0,0 +1,13 @@ +package eu.eudat.services.helpers; + +import org.springframework.context.MessageSource; + +/** + * Created by ikalyvas on 3/1/2018. + */ +public interface HelpersService { + + MessageSource getMessageSource(); + + LoggerService getLoggerService(); +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/helpers/HelpersServiceImpl.java b/dmp-backend/src/main/java/eu/eudat/services/helpers/HelpersServiceImpl.java new file mode 100644 index 000000000..b46ca350f --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/helpers/HelpersServiceImpl.java @@ -0,0 +1,31 @@ +package eu.eudat.services.helpers; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.stereotype.Service; + +/** + * Created by ikalyvas on 3/1/2018. + */ +@Service("helpersService") +public class HelpersServiceImpl implements HelpersService { + + private MessageSource messageSource; + private LoggerService loggerService; + + @Autowired + public HelpersServiceImpl(MessageSource messageSource, LoggerService loggerService) { + this.messageSource = messageSource; + this.loggerService = loggerService; + } + + @Override + public MessageSource getMessageSource() { + return messageSource; + } + + @Override + public LoggerService getLoggerService() { + return loggerService; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/helpers/LoggerService.java b/dmp-backend/src/main/java/eu/eudat/services/helpers/LoggerService.java new file mode 100644 index 000000000..7f757d5ef --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/helpers/LoggerService.java @@ -0,0 +1,12 @@ +package eu.eudat.services.helpers; + +import eu.eudat.types.WarningLevel; + +/** + * Created by ikalyvas on 3/1/2018. + */ +public interface LoggerService { + void log(String message); + + void log(String message, WarningLevel level); +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/helpers/LoggerServiceImpl.java b/dmp-backend/src/main/java/eu/eudat/services/helpers/LoggerServiceImpl.java new file mode 100644 index 000000000..c4ab0881e --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/helpers/LoggerServiceImpl.java @@ -0,0 +1,39 @@ +package eu.eudat.services.helpers; + +import eu.eudat.types.WarningLevel; +import eu.eudat.utilities.interfaces.Applier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by ikalyvas on 3/1/2018. + */ +@Service("loggerService") +public class LoggerServiceImpl implements LoggerService { + private static final Logger logger = LoggerFactory.getLogger(LoggerServiceImpl.class); + private WarningLevel level; + private Map> options = new HashMap<>(); + + public void setLevel(WarningLevel level) { + this.level = level; + } + + public LoggerServiceImpl() { + this.options.put(WarningLevel.DEBUG, (logger, message) -> logger.debug(message)); + this.options.put(WarningLevel.INFO, (logger, message) -> logger.info(message)); + this.options.put(WarningLevel.WARN, (logger, message) -> logger.warn(message)); + this.options.put(WarningLevel.ERROR, (logger, message) -> logger.error(message)); + } + + public void log(String message) { + this.options.get(this.level).apply(logger, message); + } + + public void log(String message, WarningLevel level) { + this.options.get(level).apply(logger, message); + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/operations/AuthenticationService.java b/dmp-backend/src/main/java/eu/eudat/services/operations/AuthenticationService.java new file mode 100644 index 000000000..7a025b22a --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/operations/AuthenticationService.java @@ -0,0 +1,23 @@ +package eu.eudat.services.operations; + +import eu.eudat.entities.Credential; +import eu.eudat.entities.UserToken; +import eu.eudat.models.login.Credentials; +import eu.eudat.models.loginprovider.LoginProviderUser; +import eu.eudat.models.security.Principal; + +import java.util.UUID; + +/** + * Created by ikalyvas on 3/1/2018. + */ +public interface AuthenticationService { + + Principal Touch(LoginProviderUser profile); + + Principal Touch(Credentials credentials); + + void Logout(UUID token); + + Principal Touch(UUID token); +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/AuthenticationService.java b/dmp-backend/src/main/java/eu/eudat/services/operations/AuthenticationServiceImpl.java similarity index 63% rename from dmp-backend/src/main/java/eu/eudat/services/AuthenticationService.java rename to dmp-backend/src/main/java/eu/eudat/services/operations/AuthenticationServiceImpl.java index 06f8598ea..72dbea317 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/AuthenticationService.java +++ b/dmp-backend/src/main/java/eu/eudat/services/operations/AuthenticationServiceImpl.java @@ -1,4 +1,4 @@ -package eu.eudat.services; +package eu.eudat.services.operations; import eu.eudat.builders.entity.CredentialBuilder; import eu.eudat.builders.entity.UserInfoBuilder; @@ -13,6 +13,7 @@ import eu.eudat.models.login.Credentials; import eu.eudat.models.loginprovider.LoginProviderUser; import eu.eudat.models.security.Principal; import eu.eudat.security.validators.TokenValidatorFactoryImpl; +import eu.eudat.services.ApiContext; import eu.eudat.types.Authorities; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; @@ -22,41 +23,41 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; -@Service("authenticationService ") -public class AuthenticationService { +@Service("authenticationService") +public class AuthenticationServiceImpl implements AuthenticationService { private ApiContext apiContext; private Environment environment; @Autowired - public AuthenticationService(ApiContext apiContext, Environment environment) { + public AuthenticationServiceImpl(ApiContext apiContext, Environment environment) { this.environment = environment; this.apiContext = apiContext; } public Principal Touch(UUID token) { - UserToken tokenEntry = this.apiContext.getDatabaseRepository().getUserTokenDao().find(token); + UserToken tokenEntry = this.apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().find(token); if (tokenEntry == null || tokenEntry.getExpiresAt().before(new Date())) return null; return this.Touch(tokenEntry); } public void Logout(UUID token) { - UserToken tokenEntry = this.apiContext.getDatabaseRepository().getUserTokenDao().find(token); - this.apiContext.getDatabaseRepository().getUserTokenDao().delete(tokenEntry); + UserToken tokenEntry = this.apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().find(token); + this.apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().delete(tokenEntry); } private Principal Touch(UserToken token) { if (token == null || token.getExpiresAt().before(new Date())) return null; - UserInfo user = this.apiContext.getDatabaseRepository().getUserInfoDao().find(token.getUser().getId()); + UserInfo user = this.apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(token.getUser().getId()); if (user == null) return null; - Principal principal = this.apiContext.getBuilderFactory().getBuilder(PrincipalBuilder.class) + Principal principal = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(PrincipalBuilder.class) .id(user.getId()).token(token.getToken()) .expiresAt(token.getExpiresAt()).name(user.getName()) .build(); - List userRoles = apiContext.getDatabaseRepository().getUserRoleDao().getUserRoles(user); + List userRoles = apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().getUserRoles(user); for (UserRole item : userRoles) { if (principal.getAuthz() == null) principal.setAuthorities(new HashSet<>()); principal.getAuthz().add(Authorities.fromInteger(item.getRole())); @@ -65,7 +66,7 @@ public class AuthenticationService { } public Principal Touch(Credentials credentials) { - Credential credential = this.apiContext.getDatabaseRepository().getCredentialDao().getLoggedInCredentials(credentials); + Credential credential = this.apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().getLoggedInCredentials(credentials); if (credential == null && credentials.getUsername().equals(environment.getProperty("autouser.root.username"))) { try { @@ -77,12 +78,12 @@ public class AuthenticationService { } if (credential == null) return null; - UserToken userToken = this.apiContext.getBuilderFactory().getBuilder(UserTokenBuilder.class) + UserToken userToken = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserTokenBuilder.class) .issuedAt(new Date()).user(credential.getUserInfo()) .token(UUID.randomUUID()).expiresAt(addADay(new Date())) .build(); - userToken = apiContext.getDatabaseRepository().getUserTokenDao().createOrUpdate(userToken); + userToken = apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().createOrUpdate(userToken); return this.Touch(userToken); @@ -92,38 +93,38 @@ public class AuthenticationService { UserInfoCriteria criteria = new UserInfoCriteria(); criteria.setEmail(profile.getEmail()); - UserInfo userInfo = apiContext.getDatabaseRepository().getUserInfoDao().asQueryable().withHint("userInfo").where((builder, root) -> builder.equal(root.get("email"), profile.getEmail())).getSingleOrDefault(); + UserInfo userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().asQueryable().withHint("userInfo").where((builder, root) -> builder.equal(root.get("email"), profile.getEmail())).getSingleOrDefault(); - if(userInfo == null){ - Optional optionalCredential = Optional.ofNullable(apiContext.getDatabaseRepository().getCredentialDao() + if (userInfo == null) { + Optional optionalCredential = Optional.ofNullable(apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao() .asQueryable().withHint("credentialUserInfo") .where((builder, root) -> builder.and(builder.equal(root.get("provider"), profile.getProvider().getValue()), builder.equal(root.get("externalId"), profile.getId()))) .getSingleOrDefault()); userInfo = optionalCredential.map(Credential::getUserInfo).orElse(null); } - final Credential credential = this.apiContext.getBuilderFactory().getBuilder(CredentialBuilder.class) + final Credential credential = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(CredentialBuilder.class) .id(UUID.randomUUID()).creationTime(new Date()).status(1) .lastUpdateTime(new Date()).provider((int) profile.getProvider().getValue()) .secret(profile.getSecret()).externalId(profile.getId()) .build(); if (userInfo == null) { - userInfo = this.apiContext.getBuilderFactory().getBuilder(UserInfoBuilder.class) + userInfo = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class) .name(profile.getName()).verified_email(profile.getIsVerified()) .email(profile.getEmail()).created(new Date()).lastloggedin(new Date()) .authorization_level((short) 1).usertype((short) 1) .build(); - userInfo = apiContext.getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); + userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); credential.setPublicValue(userInfo.getName()); credential.setUserInfo(userInfo); - apiContext.getDatabaseRepository().getCredentialDao().createOrUpdate(credential); + apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().createOrUpdate(credential); UserRole role = new UserRole(); role.setRole(Authorities.USER.getValue()); role.setUserInfo(userInfo); - apiContext.getDatabaseRepository().getUserRoleDao().createOrUpdate(role); + apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().createOrUpdate(role); } else { userInfo.setLastloggedin(new Date()); @@ -135,18 +136,18 @@ public class AuthenticationService { credential.setUserInfo(userInfo); credential.setId(UUID.randomUUID()); credential.setPublicValue(userInfo.getName()); - apiContext.getDatabaseRepository().getCredentialDao().createOrUpdate(credential); + apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().createOrUpdate(credential); userInfo.getCredentials().add(credential); } - userInfo = apiContext.getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); + userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); } - UserToken userToken = this.apiContext.getBuilderFactory().getBuilder(UserTokenBuilder.class) + UserToken userToken = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserTokenBuilder.class) .token(UUID.randomUUID()).user(userInfo) .expiresAt(addADay(new Date())).issuedAt(new Date()) .build(); - apiContext.getDatabaseRepository().getUserTokenDao().createOrUpdate(userToken); + apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().createOrUpdate(userToken); return Touch(userToken.getToken()); } @@ -165,24 +166,24 @@ public class AuthenticationService { if (!environment.getProperty("autouser.root.username").equals(username) || !environment.getProperty("autouser.root.password").equals(password)) return null; - UserInfo userInfo = this.apiContext.getBuilderFactory().getBuilder(UserInfoBuilder.class) + UserInfo userInfo = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class) .name(username).email(environment.getProperty("autouser.root.email")).created(new Date()) .lastloggedin(new Date()).authorization_level((short) 1).usertype((short) 1) .build(); - userInfo = this.apiContext.getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); + userInfo = this.apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); UserRole role = new UserRole(); role.setRole(Authorities.ADMIN.getValue()); role.setUserInfo(userInfo); - this.apiContext.getDatabaseRepository().getUserRoleDao().createOrUpdate(role); + this.apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().createOrUpdate(role); - Credential credential = this.apiContext.getBuilderFactory().getBuilder(CredentialBuilder.class) + Credential credential = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(CredentialBuilder.class) .userInfo(userInfo).publicValue(username).secret(password) .provider((int) TokenValidatorFactoryImpl.LoginProvider.NATIVELOGIN.getValue()) .creationTime(new Date()).lastUpdateTime(new Date()).status(0) .build(); - return this.apiContext.getDatabaseRepository().getCredentialDao().createOrUpdate(credential); + return this.apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().createOrUpdate(credential); } } diff --git a/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepository.java b/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepository.java similarity index 95% rename from dmp-backend/src/main/java/eu/eudat/services/DatabaseRepository.java rename to dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepository.java index 4842fb03f..1be099f2a 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepository.java +++ b/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepository.java @@ -1,4 +1,4 @@ -package eu.eudat.services; +package eu.eudat.services.operations; import eu.eudat.dao.entities.*; import eu.eudat.dao.entities.security.CredentialDao; diff --git a/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepositoryImpl.java b/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepositoryImpl.java similarity index 99% rename from dmp-backend/src/main/java/eu/eudat/services/DatabaseRepositoryImpl.java rename to dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepositoryImpl.java index b4cf99cc0..8f55edaf0 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/DatabaseRepositoryImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepositoryImpl.java @@ -1,4 +1,4 @@ -package eu.eudat.services; +package eu.eudat.services.operations; import eu.eudat.dao.entities.*; import eu.eudat.dao.entities.security.CredentialDao; diff --git a/dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContext.java b/dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContext.java new file mode 100644 index 000000000..672f6423a --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContext.java @@ -0,0 +1,20 @@ +package eu.eudat.services.operations; + +import eu.eudat.builders.BuilderFactory; +import eu.eudat.proxy.fetching.RemoteFetcher; +import org.springframework.context.ApplicationContext; + +/** + * Created by ikalyvas on 3/1/2018. + */ +public interface OperationsContext { + + DatabaseRepository getDatabaseRepository(); + + ApplicationContext getApplicationContext(); + + BuilderFactory getBuilderFactory(); + + RemoteFetcher getRemoteFetcher(); + +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContextImpl.java b/dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContextImpl.java new file mode 100644 index 000000000..46615304b --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContextImpl.java @@ -0,0 +1,48 @@ +package eu.eudat.services.operations; + +import eu.eudat.builders.BuilderFactory; +import eu.eudat.proxy.fetching.RemoteFetcher; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; + +/** + * Created by ikalyvas on 3/1/2018. + */ +@Service("operationsContext") +public class OperationsContextImpl implements OperationsContext { + + private DatabaseRepository databaseRepository; + private ApplicationContext applicationContext; + private RemoteFetcher remoteFetcher; + private BuilderFactory builderFactory; + + @Autowired + public OperationsContextImpl(DatabaseRepository databaseRepository, ApplicationContext applicationContext, RemoteFetcher remoteFetcher, BuilderFactory builderFactory) { + this.databaseRepository = databaseRepository; + this.applicationContext = applicationContext; + this.remoteFetcher = remoteFetcher; + this.builderFactory = builderFactory; + } + + @Override + public DatabaseRepository getDatabaseRepository() { + return databaseRepository; + } + + @Override + public ApplicationContext getApplicationContext() { + return applicationContext; + } + + @Override + public RemoteFetcher getRemoteFetcher() { + return remoteFetcher; + } + + @Override + public BuilderFactory getBuilderFactory() { + return builderFactory; + } + +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/InvitationService.java b/dmp-backend/src/main/java/eu/eudat/services/utilities/InvitationService.java similarity index 94% rename from dmp-backend/src/main/java/eu/eudat/services/InvitationService.java rename to dmp-backend/src/main/java/eu/eudat/services/utilities/InvitationService.java index 5b3e7cea6..3e5d35ce1 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/InvitationService.java +++ b/dmp-backend/src/main/java/eu/eudat/services/utilities/InvitationService.java @@ -1,4 +1,4 @@ -package eu.eudat.services; +package eu.eudat.services.utilities; import eu.eudat.dao.entities.DMPDao; diff --git a/dmp-backend/src/main/java/eu/eudat/services/InvitationServiceImpl.java b/dmp-backend/src/main/java/eu/eudat/services/utilities/InvitationServiceImpl.java similarity index 98% rename from dmp-backend/src/main/java/eu/eudat/services/InvitationServiceImpl.java rename to dmp-backend/src/main/java/eu/eudat/services/utilities/InvitationServiceImpl.java index ed4e45bcb..e79f4cd52 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/InvitationServiceImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/services/utilities/InvitationServiceImpl.java @@ -1,4 +1,4 @@ -package eu.eudat.services; +package eu.eudat.services.utilities; import eu.eudat.dao.entities.DMPDao; import eu.eudat.dao.entities.InvitationDao; diff --git a/dmp-backend/src/main/java/eu/eudat/services/MailService.java b/dmp-backend/src/main/java/eu/eudat/services/utilities/MailService.java similarity index 83% rename from dmp-backend/src/main/java/eu/eudat/services/MailService.java rename to dmp-backend/src/main/java/eu/eudat/services/utilities/MailService.java index ea89f395e..123ffae23 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/MailService.java +++ b/dmp-backend/src/main/java/eu/eudat/services/utilities/MailService.java @@ -1,4 +1,4 @@ -package eu.eudat.services; +package eu.eudat.services.utilities; import eu.eudat.models.mail.SimpleMail; diff --git a/dmp-backend/src/main/java/eu/eudat/services/MailServiceImpl.java b/dmp-backend/src/main/java/eu/eudat/services/utilities/MailServiceImpl.java similarity index 96% rename from dmp-backend/src/main/java/eu/eudat/services/MailServiceImpl.java rename to dmp-backend/src/main/java/eu/eudat/services/utilities/MailServiceImpl.java index a1dc6c290..0e66b5d2b 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/MailServiceImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/services/utilities/MailServiceImpl.java @@ -1,4 +1,4 @@ -package eu.eudat.services; +package eu.eudat.services.utilities; import eu.eudat.models.mail.SimpleMail; import org.springframework.beans.factory.annotation.Autowired; diff --git a/dmp-backend/src/main/java/eu/eudat/services/utilities/UtilitiesService.java b/dmp-backend/src/main/java/eu/eudat/services/utilities/UtilitiesService.java new file mode 100644 index 000000000..fd6ec03b8 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/utilities/UtilitiesService.java @@ -0,0 +1,15 @@ +package eu.eudat.services.utilities; + +import eu.eudat.services.forms.VisibilityRuleService; + +/** + * Created by ikalyvas on 3/1/2018. + */ +public interface UtilitiesService { + + InvitationService getInvitationService(); + + MailService getMailService(); + + VisibilityRuleService getVisibilityRuleService(); +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/utilities/UtilitiesServiceImpl.java b/dmp-backend/src/main/java/eu/eudat/services/utilities/UtilitiesServiceImpl.java new file mode 100644 index 000000000..40c8eada9 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/utilities/UtilitiesServiceImpl.java @@ -0,0 +1,38 @@ +package eu.eudat.services.utilities; + +import eu.eudat.services.forms.VisibilityRuleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * Created by ikalyvas on 3/1/2018. + */ +@Service("utilitiesService") +public class UtilitiesServiceImpl implements UtilitiesService { + + private InvitationService invitationService; + private MailService mailService; + private VisibilityRuleService visibilityRuleService; + + @Autowired + public UtilitiesServiceImpl(InvitationService invitationService, MailService mailService, VisibilityRuleService visibilityRuleService) { + this.invitationService = invitationService; + this.mailService = mailService; + this.visibilityRuleService = visibilityRuleService; + } + + @Override + public VisibilityRuleService getVisibilityRuleService() { + return visibilityRuleService; + } + + @Override + public InvitationService getInvitationService() { + return invitationService; + } + + @Override + public MailService getMailService() { + return mailService; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/types/ApiResponseType.java b/dmp-backend/src/main/java/eu/eudat/types/ApiResponseType.java new file mode 100644 index 000000000..501ed62fa --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/types/ApiResponseType.java @@ -0,0 +1,29 @@ +package eu.eudat.types; + +/** + * Created by ikalyvas on 3/5/2018. + */ +public enum ApiResponseType { + JSON_RESPONSE(0), FILE_RESPONSE(1); + + private Integer value; + + private ApiResponseType(Integer value) { + this.value = value; + } + + public Integer getValue() { + return value; + } + + public static ApiResponseType fromInteger(Integer value) { + switch (value) { + case 0: + return JSON_RESPONSE; + case 200: + return FILE_RESPONSE; + default: + throw new RuntimeException("Unsupported Api Response Type Code"); + } + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/types/WarningLevel.java b/dmp-backend/src/main/java/eu/eudat/types/WarningLevel.java new file mode 100644 index 000000000..8ac07413d --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/types/WarningLevel.java @@ -0,0 +1,8 @@ +package eu.eudat.types; + +/** + * Created by ikalyvas on 3/1/2018. + */ +public enum WarningLevel { + INFO, WARN, DEBUG, ERROR +} diff --git a/dmp-backend/src/main/java/eu/eudat/utilities/interfaces/Applier.java b/dmp-backend/src/main/java/eu/eudat/utilities/interfaces/Applier.java index d5332d97f..cb26b7a46 100644 --- a/dmp-backend/src/main/java/eu/eudat/utilities/interfaces/Applier.java +++ b/dmp-backend/src/main/java/eu/eudat/utilities/interfaces/Applier.java @@ -1,8 +1,8 @@ package eu.eudat.utilities.interfaces; /** - * Created by ikalyvas on 2/27/2018. + * Created by ikalyvas on 3/1/2018. */ -public interface Applier { - R apply(A applier, V value); +public interface Applier { + void apply(A applier, V value); } diff --git a/dmp-backend/src/main/java/eu/eudat/utilities/interfaces/ApplierWithValue.java b/dmp-backend/src/main/java/eu/eudat/utilities/interfaces/ApplierWithValue.java new file mode 100644 index 000000000..0c4a76093 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/utilities/interfaces/ApplierWithValue.java @@ -0,0 +1,8 @@ +package eu.eudat.utilities.interfaces; + +/** + * Created by ikalyvas on 2/27/2018. + */ +public interface ApplierWithValue { + R apply(A applier, V value); +} diff --git a/dmp-backend/src/main/resources/application.properties b/dmp-backend/src/main/resources/application.properties index 8bbcb4a80..bd227eea3 100644 --- a/dmp-backend/src/main/resources/application.properties +++ b/dmp-backend/src/main/resources/application.properties @@ -55,4 +55,6 @@ b2access.externallogin.user_info_url = https://b2access-integration.fz-juelich.d b2access.externallogin.access_token_url = https://b2access-integration.fz-juelich.de:443/oauth2/token b2access.externallogin.redirect_uri = http://dmp.eudat.org:4200/api/oauth/authorized/b2access b2access.externallogin.clientid = eudatdmptool -b2access.externallogin.clientSecret = A3b*1*92 \ No newline at end of file +b2access.externallogin.clientSecret = A3b*1*92 +################################################################################# +pdf.converter.url = http://localhost/ \ No newline at end of file diff --git a/dmp-backend/src/main/resources/documents/h2020.docx b/dmp-backend/src/main/resources/documents/h2020.docx new file mode 100644 index 0000000000000000000000000000000000000000..23ce9fd56b5094fcc4c03c15630000665ba196f5 GIT binary patch literal 9319 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

XuL9Y<9igws_G!w6kFS`rkG+G4w9_UX)kQc} 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/package-lock.json b/dmp-frontend/package-lock.json index e3df6cd06..70ebcec27 100644 --- a/dmp-frontend/package-lock.json +++ b/dmp-frontend/package-lock.json @@ -356,6 +356,11 @@ "integrity": "sha512-q3zfJvaTroV5BjAAR+peTHEGAAhGrPX0z2EzCzpt2mwFA+qzUn2nigJLqSekXRtdULKmT8am7zjvTMZSapIgHw==", "dev": true }, + "@types/file-saver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-1.3.0.tgz", + "integrity": "sha512-fC12hKtEzVkrV/ZRcrmqvpHG/TMYDZtgpAmgMUA4F7KneDaQeFMwmPz8AfygKKJMqsdTi8bL+E+fciaaMLxUhg==" + }, "@types/minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", @@ -1234,7 +1239,6 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", - "fsevents": "1.1.3", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -2660,6 +2664,11 @@ "schema-utils": "0.3.0" } }, + "file-saver": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.3.tgz", + "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI=" + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -2830,910 +2839,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", diff --git a/dmp-frontend/package.json b/dmp-frontend/package.json index 7cb74abc8..74bb4a970 100644 --- a/dmp-frontend/package.json +++ b/dmp-frontend/package.json @@ -26,7 +26,9 @@ "@covalent/core": "^1.0.0-rc.1", "@ngx-translate/core": "^9.0.1", "@ngx-translate/http-loader": "^2.0.0", + "@types/file-saver": "^1.3.0", "core-js": "^2.4.1", + "file-saver": "1.3.3", "rxjs": "^5.5.6", "zone.js": "^0.8.17" }, diff --git a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html index 77a27ee92..cc5baf2bb 100644 --- a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html +++ b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html @@ -3,9 +3,11 @@

{{datasetWizardModel?.dmp?.project?.label}} Dataset

- + +
@@ -92,7 +94,8 @@ {{'DATASET-WIZARD.THIRD-STEP.TITLE' | translate}} - + diff --git a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.ts index 19e04e270..37ef03e30 100644 --- a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.ts +++ b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.ts @@ -17,7 +17,7 @@ import { TranslateService } from '@ngx-translate/core'; import { ActivatedRoute, Router, Params } from '@angular/router'; import { Component, ViewChild, OnInit, AfterViewInit, ViewEncapsulation } from "@angular/core"; import { FormGroup, Validators, FormBuilder } from "@angular/forms"; - +import * as FileSaver from 'file-saver'; import { MatPaginator, MatSort, MatSnackBar, MatStepper } from "@angular/material"; @Component({ @@ -28,7 +28,7 @@ import { MatPaginator, MatSort, MatSnackBar, MatStepper } from "@angular/materia encapsulation: ViewEncapsulation.None }) export class DatasetWizardComponent { - @ViewChild('stepper') stepper: MatStepper; + @ViewChild('stepper') stepper: MatStepper; //dmpAutoCompleteConfiguration: AutoCompleteConfiguration; //datasetProfileAutoCompleteConfiguration: AutoCompleteConfiguration; @@ -48,7 +48,7 @@ export class DatasetWizardComponent { filteredRegistries: ExternalSourcesItemModel[]; filteredServices: ExternalSourcesItemModel[]; filteredExternalDatasets: ExternalSourcesItemModel[]; - + itemId: string constructor( private datasetWizardService: DatasetWizardService, private formBuilder: FormBuilder, @@ -73,11 +73,11 @@ export class DatasetWizardComponent { this.route.params.subscribe((params: Params) => { - const itemId = params['id']; + this.itemId = params['id']; const dmpId = params['dmpId']; - if (itemId != null) { + if (this.itemId != null) { this.isNew = false; - this.datasetWizardService.getSingle(itemId).map(data => data as DatasetWizardModel) + this.datasetWizardService.getSingle(this.itemId).map(data => data as DatasetWizardModel) .subscribe(data => { this.datasetWizardModel = JsonSerializer.fromJSONObject(data, DatasetWizardModel); this.formGroup = this.datasetWizardModel.buildForm(); @@ -105,7 +105,7 @@ export class DatasetWizardComponent { ngAfterViewInit() { this.route.params.subscribe((params: Params) => { let itemId = params['id']; - if(itemId !=null) this.stepper.selectedIndex = 2; + if (itemId != null) this.stepper.selectedIndex = 2; }) } @@ -126,9 +126,9 @@ export class DatasetWizardComponent { getDefinition() { if (this.isNew) { this.datasetWizardService.getDefinition(this.formGroup.get("profile").get("id").value).subscribe(item => { - this.datasetWizardModel.datasetProfileDefinition = JsonSerializer.fromJSONObject(item,DatasetProfileDefinitionModel); + this.datasetWizardModel.datasetProfileDefinition = JsonSerializer.fromJSONObject(item, DatasetProfileDefinitionModel); this.datasetProfileDefinitionModel = this.datasetWizardModel.datasetProfileDefinition; - this.formGroup.addControl("datasetProfileDefinition",this.datasetProfileDefinitionModel.buildForm()) + this.formGroup.addControl("datasetProfileDefinition", this.datasetProfileDefinitionModel.buildForm()) }) } } @@ -165,12 +165,12 @@ export class DatasetWizardComponent { save() { - this.datasetWizardModel.status = "0"; + this.formGroup.get("status").setValue("0"); this.submit(); } saveFinalize() { - this.datasetWizardModel.status = "1"; + this.formGroup.get("status").setValue("1"); this.submit(); } @@ -245,4 +245,32 @@ export class DatasetWizardComponent { }); } } + + downloadPDF(): void { + this.datasetWizardService.downloadPDF(this.itemId).subscribe(response => { + const blob = new Blob([response.body], { type: 'application/pdf' }) + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename) + }) + } + + getFilenameFromContentDispositionHeader(header: string): string { // expecting filename=XXXX or filename="XXXX" to exist + // const regex: RegExp = new RegExp(/filename=((\"(.*)\")|([^;]*))/g); + const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); + + const matches = header.match(regex); + let filename: string; + for (let i = 0; i < matches.length; i++) { + const match = matches[i]; + if (match.includes('filename="')) { + filename = match.substring(10, match.length - 1); + break; + } else if (match.includes('filename=')) { + filename = match.substring(9); + break; + } + } + return filename; + } } \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.html b/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.html index 2b3ef7038..205fc78e8 100644 --- a/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.html +++ b/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.html @@ -18,7 +18,7 @@ -
+
diff --git a/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.ts b/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.ts index 81ca5f7b4..3a380f70d 100644 --- a/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.ts +++ b/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.ts @@ -58,11 +58,11 @@ export class DynamicFormComponent implements OnInit { ngOnInit() { - this.datasetProfileDefinitionModel = this.dataModel.datasetProfileDefinition - this.createPagination(); + let rules: Rule[] = JsonSerializer.fromJSONArray(this.dataModel.datasetProfileDefinition.rules, Rule); this.visibilityRulesService.formGroup = this.form; - let rules: Rule[] = JsonSerializer.fromJSONArray(this.datasetProfileDefinitionModel.rules, Rule); this.visibilityRulesService.buildVisibilityRules(rules) + this.datasetProfileDefinitionModel = this.dataModel.datasetProfileDefinition + this.createPagination(); this.progressbar = true; this.route.fragment.subscribe((fragment: string) => { diff --git a/dmp-frontend/src/app/models/Field.ts b/dmp-frontend/src/app/models/Field.ts index c21090a1f..c0bdcd268 100644 --- a/dmp-frontend/src/app/models/Field.ts +++ b/dmp-frontend/src/app/models/Field.ts @@ -6,16 +6,17 @@ import { Serializable } from './interfaces/Serializable'; import { Multiplicity } from './Multiplicity'; import { DefaultValue } from './DefaultValue'; import { ValidationTypes } from '@app/models/common/ValidationTypes'; +import { ViewStyle } from './datasetProfileAdmin/ViewStyle'; export class Field extends BaseModel implements Serializable, FormGenerator{ public id: string; public title: string; - public value: string; + public value: any; public defaultValue: DefaultValue; public description: string; public extendedDescription: string; - public viewStyle: any; + public viewStyle: ViewStyle; public defaultVisibility: boolean; public page: number; public multiplicity: Multiplicity; @@ -38,26 +39,29 @@ export class Field extends BaseModel implements Serializable, FormGenerat this.defaultValue = JsonSerializer.fromJSONObject(item.defaultValue, DefaultValue); this.value = this.defaultValue.value && !item.value ? this.defaultValue.value : item.value; //this.multiplicity = new Multiplicity(); + if (this.viewStyle.renderStyle === "checkBox") { + this.value = this.value === 'true'; + } //this.multiplicity.max = 2; - if(item.multiplicityItems)this.multiplicityItems = JsonSerializer.fromJSONArray(item.multiplicityItems, Field); + if (item.multiplicityItems) this.multiplicityItems = JsonSerializer.fromJSONArray(item.multiplicityItems, Field); this.data = item.data; return this; } - - buildForm(): FormGroup { - if(this.validations) + + buildForm(): FormGroup { + if (this.validations) this.validations.forEach(validation => { - if (validation == ValidationTypes.Required ) this.validationRequired = true; + if (validation == ValidationTypes.Required) this.validationRequired = true; }); let formGroup = this.formBuilder.group({ id: [this.id], - data:[this.data], + data: [this.data], /* title: [this.title], */ - value: [this.value, this.validationRequired == true? Validators.required:null]/* , + value: [this.value, this.validationRequired == true ? Validators.required : null]/* , description: [this.description], extendedDescription:[this.extendedDescription], viewStyle: [this.viewStyle], diff --git a/dmp-frontend/src/app/services/dataset-wizard/dataset-wizard.service.ts b/dmp-frontend/src/app/services/dataset-wizard/dataset-wizard.service.ts index 2525fa815..6d64957e3 100644 --- a/dmp-frontend/src/app/services/dataset-wizard/dataset-wizard.service.ts +++ b/dmp-frontend/src/app/services/dataset-wizard/dataset-wizard.service.ts @@ -2,7 +2,7 @@ import { DatasetProfileDefinitionModel } from '../../models/DatasetProfileDefini import { DatasetWizardModel } from '../../models/datasets/DatasetWizardModel'; import { DatasetProfileCriteria } from '../../models/criteria/dataset-profile/DatasetProfileCriteria'; import 'rxjs/add/operator/map'; -import { HttpHeaders } from '@angular/common/http'; +import { HttpHeaders, HttpResponse, HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { HostConfiguration } from './../../app.constants'; import { BaseHttpService } from '../../utilities/cite-http-service-module/base-http.service'; @@ -11,6 +11,7 @@ import { DataManagementPlanModel } from '../../models/data-managemnt-plans/DataM import { DataManagementPlanCriteria } from '../../models/criteria/data-management-plan/DataManagementPlanCriteria'; import { RequestItem } from '../../models/criteria/RequestItem'; import { DatasetProfileModel } from '@app/models/datasetprofile/DatasetProfileModel'; +import { ResponseContentType } from '@angular/http'; @Injectable() @@ -19,7 +20,7 @@ export class DatasetWizardService { private actionUrl: string; private headers: HttpHeaders; - constructor(private http: BaseHttpService) { + constructor(private http: BaseHttpService, private httpClient: HttpClient) { this.actionUrl = HostConfiguration.Server + 'datasetwizard/'; @@ -44,10 +45,9 @@ export class DatasetWizardService { return this.http.post(this.actionUrl + 'createOrUpdate', datasetModel, { headers: this.headers }); } -/* public saveDataset(datasetWizard: DatasetWizardModel, formValue) { - datasetWizard.properties = formValue; - return this.createDataset(datasetWizard) - } */ + public downloadPDF(id: string): Observable> { + return this.httpClient.get(this.actionUrl + 'getWordDocument/' + id, { responseType: 'blob', observe: 'response' }) + } public getDefinition(id: String): Observable { return this.http.get(this.actionUrl + 'get/' + id, { headers: this.headers }); diff --git a/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.ts index fa15a6b09..f25300251 100644 --- a/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.ts +++ b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.ts @@ -22,8 +22,8 @@ export class DatasetCriteriaComponent extends BaseCriteriaComponent implements O public criteria: DatasetCriteria= new DatasetCriteria(); statuses = [ - {value: '0', viewValue: 'Active'}, - {value: '1', viewValue: 'Inactive'} + {value: '0', viewValue: 'Saved'}, + {value: '1', viewValue: 'Finalised'} ]; constructor( diff --git a/dmp-frontend/src/app/utilities/cite-http-service-module/base-http.service.ts b/dmp-frontend/src/app/utilities/cite-http-service-module/base-http.service.ts index 31ca4bf26..f0188098c 100644 --- a/dmp-frontend/src/app/utilities/cite-http-service-module/base-http.service.ts +++ b/dmp-frontend/src/app/utilities/cite-http-service-module/base-http.service.ts @@ -10,6 +10,7 @@ import { HttpClient } from '@angular/common/http'; import { AuthService } from '../../services/auth/auth.service'; import { SnackBarNotificationComponent } from '../../shared/components/notificaiton/snack-bar-notification.component'; import { BaseHttpResponseModel } from '../../models/http/BaseHttpResponseModel'; +import { ApiResponseCode } from '@app/utilities/types/ApiResponseCode'; @Injectable() export class BaseHttpService { @@ -22,39 +23,39 @@ export class BaseHttpService { public route: ActivatedRoute ) { } - get(url: string, options?: any): Observable { - return this.interceptRepsonse(this.http.get(url, this.buildRequestOptions(options))); + get(url: string, options?: any, appendOptions: boolean = true): Observable { + return this.interceptRepsonse(this.http.get(url, this.buildRequestOptions(appendOptions, options))); } - post(url: string, body: any, options?: any): Observable { - return this.interceptRepsonse(this.http.post(url, body, this.buildRequestOptions(options))); + post(url: string, body: any, options?: any, appendOptions: boolean = true): Observable { + return this.interceptRepsonse(this.http.post(url, body, this.buildRequestOptions(appendOptions, options))); } - put(url: string, body: any, options?: any): Observable { - return this.interceptRepsonse(this.http.put(url, body, this.buildRequestOptions(options))); + put(url: string, body: any, options?: any, appendOptions: boolean = true): Observable { + return this.interceptRepsonse(this.http.put(url, body, this.buildRequestOptions(appendOptions, options))); } - delete(url: string, options?: any): Observable { - return this.interceptRepsonse(this.http.delete(url, this.buildRequestOptions(options))); + delete(url: string, options?: any, appendOptions: boolean = true): Observable { + return this.interceptRepsonse(this.http.delete(url, this.buildRequestOptions(appendOptions, options))); } - patch(url: string, body: any, options?: any): Observable { - return this.interceptRepsonse(this.http.patch(url, body, this.buildRequestOptions(options))); + patch(url: string, body: any, options?: any, appendOptions: boolean = true): Observable { + return this.interceptRepsonse(this.http.patch(url, body, this.buildRequestOptions(appendOptions, options))); } - head(url: string, options?: any): Observable { - return this.interceptRepsonse(this.http.head(url, this.buildRequestOptions(options))); + head(url: string, options?: any, appendOptions: boolean = true): Observable { + return this.interceptRepsonse(this.http.head(url, this.buildRequestOptions(appendOptions, options))); } - options(url: string, options?: any): Observable { - return this.interceptRepsonse(this.http.options(url, this.buildRequestOptions(options))); + options(url: string, options?: any, appendOptions: boolean = true): Observable { + return this.interceptRepsonse(this.http.options(url, this.buildRequestOptions(appendOptions, options))); } - protected buildRequestOptions(options?: any): Object { + protected buildRequestOptions(appendOptions: boolean, options?: any): Object { if (options == null) { options = new RequestOptions(); } if (options.headers == null) { options.headers = new Headers(); } - if (!options.headers.has('Content-Type')) { + if (!options.headers.has('Content-Type') && appendOptions) { options.headers = options.headers.set('Content-Type', 'application/json'); } - if (!options.headers.has('Content-Type')) { + if (!options.headers.has('Content-Type') && appendOptions) { options.headers = options.headers.set('Content-Type', 'application/json'); } if (!options.headers.has('AuthToken')) { @@ -81,26 +82,27 @@ export class BaseHttpService { //this.notification.httpError(error); return Observable.of(); } else { - let error:any = errorResponse.error - if(error.statusCode == ApiMessageCode.ERROR_MESSAGE){ + let error: any = errorResponse.error + if (error.statusCode == ApiMessageCode.ERROR_MESSAGE) { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: error.message, language: null }, duration: 3000, extraClasses: ['snackbar-warning'] }) - return Observable.throw(errorResponse); + return Observable.throw(errorResponse); } - else{ + else { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.ERRORS.HTTP-REQUEST-ERROR', language: this.language }, duration: 3000, extraClasses: ['snackbar-warning'] }) - return Observable.throw(errorResponse); + return Observable.throw(errorResponse); } } }) .map(response => { + if (response instanceof Blob) return response if (response.statusCode == ApiMessageCode.SUCCESS_MESSAGE) { //throw new Error('Request failed'); this.snackBar.openFromComponent(SnackBarNotificationComponent, { @@ -109,12 +111,12 @@ export class BaseHttpService { extraClasses: ['snackbar-success'] }) return response.payload; - + } - else if(response.statusCode == ApiMessageCode.NO_MESSAGE){ + else if (response.statusCode == ApiMessageCode.NO_MESSAGE) { return response.payload; } - else{ + else { return response.payload; } }); diff --git a/dmp-frontend/src/app/utilities/types/ApiResponseCode.ts b/dmp-frontend/src/app/utilities/types/ApiResponseCode.ts new file mode 100644 index 000000000..fa650dc3b --- /dev/null +++ b/dmp-frontend/src/app/utilities/types/ApiResponseCode.ts @@ -0,0 +1,4 @@ +export enum ApiResponseCode { + JSON_RESPONSE = 0, + FILE_RESPONSE = 1, +} \ No newline at end of file diff --git a/dmp-frontend/src/app/visibility-rules/visibility-rules.service.ts b/dmp-frontend/src/app/visibility-rules/visibility-rules.service.ts index 075bfb147..4c8b43901 100644 --- a/dmp-frontend/src/app/visibility-rules/visibility-rules.service.ts +++ b/dmp-frontend/src/app/visibility-rules/visibility-rules.service.ts @@ -40,11 +40,11 @@ export class VisibilityRulesService { private evaluateVisibility(visibilityRule: VisibilityRule) { for (let i = 0; i < visibilityRule.sourceVisibilityRules.length; i++) { let pathKey = this.fieldsPathMemory[visibilityRule.sourceVisibilityRules[i].sourceControlId]; - if (this.formGroup.get(pathKey + '.value') && this.formGroup.get(pathKey + '.value').value != '' + visibilityRule.sourceVisibilityRules[i].sourceControlValue) { + if (this.formGroup.get(pathKey + '.value') && (!this.formGroup.get(pathKey + '.value').value || ""+this.formGroup.get(pathKey + '.value').value != ""+visibilityRule.sourceVisibilityRules[i].sourceControlValue)) { this.elementVisibilityMap.set(visibilityRule.targetControlId, false) - } else { - this.elementVisibilityMap.set(visibilityRule.targetControlId, true) + return; } + this.elementVisibilityMap.set(visibilityRule.targetControlId, true) } } diff --git a/welcome.docx b/welcome.docx new file mode 100644 index 0000000000000000000000000000000000000000..acb1dd36b2f4bf7fb29ab71d9ac080e527cd2864 GIT binary patch literal 11243 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 pJou-G-yiMwx4_>NPW*2Xf4mc