From dac219c6271b646e610d851322f321de304e7a91 Mon Sep 17 00:00:00 2001 From: Ioannis Kalyvas Date: Mon, 19 Mar 2018 14:40:04 +0200 Subject: [PATCH] no message --- .../main/java/eu/eudat/EuDatApplication.java | 3 + .../main/java/eu/eudat/builders/Builder.java | 2 + .../eu/eudat/builders/BuilderFactoryImpl.java | 7 +- .../eudat/builders/entity/ContentBuilder.java | 90 +++++++++++ .../builders/helpers/BuilderApplier.java | 8 + .../model/models/DataTableDataBuilder.java | 1 + .../model/models/PrincipalBuilder.java | 1 + .../builders/model/models/ProjectBuilder.java | 1 + .../models/RecentActivityDataBuilder.java | 64 ++++++++ .../model/models/ResearcherBuilder.java | 1 + .../DevelDatabaseConfiguration.java | 2 +- .../controllers/DashBoardController.java | 20 ++- .../eu/eudat/controllers/FileController.java | 61 ++++++++ .../java/eu/eudat/controllers/Projects.java | 5 +- .../eu/eudat/dao/entities/ContentDao.java | 12 ++ .../eu/eudat/dao/entities/ContentDaoImpl.java | 53 +++++++ .../eu/eudat/dao/entities/DMPDaoImpl.java | 2 +- .../eu/eudat/dao/entities/DatasetDaoImpl.java | 2 +- .../eu/eudat/dao/entities/ProjectDaoImpl.java | 2 +- .../main/java/eu/eudat/entities/Content.java | 145 ++++++++++++++++++ .../src/main/java/eu/eudat/entities/DMP.java | 14 +- .../main/java/eu/eudat/entities/Dataset.java | 9 +- .../main/java/eu/eudat/entities/Project.java | 73 ++++++--- .../files/TempFileNotFoundException.java | 22 +++ .../eu/eudat/managers/DashBoardManager.java | 81 +++++++++- .../managers/DataManagementPlanManager.java | 8 +- .../eu/eudat/managers/DatasetManager.java | 7 +- .../java/eu/eudat/managers/FileManager.java | 23 +++ .../eu/eudat/managers/ProjectManager.java | 35 ++++- .../dashboard/recent/RecentActivity.java | 18 +++ .../dashboard/recent/RecentActivityData.java | 74 +++++++++ .../{ => statistics}/DashBoardStatistics.java | 2 +- .../eu/eudat/models/files/ContentFile.java | 55 +++++++ .../java/eu/eudat/models/project/Project.java | 13 ++ .../models/project/ProjectListingModel.java | 13 ++ .../eu/eudat/queryable/QueryableList.java | 2 + .../QueryableHibernateList.java | 38 +++-- .../services/helpers/FileStorageService.java | 19 +++ .../helpers/FileStorageServiceImpl.java | 80 ++++++++++ .../operations/DatabaseRepository.java | 2 + .../operations/DatabaseRepositoryImpl.java | 11 ++ .../operations/OperationsContext.java | 3 + .../operations/OperationsContextImpl.java | 10 +- .../src/main/resources/application.properties | 4 +- .../src/main/resources/images/default.png | Bin 0 -> 939 bytes 45 files changed, 1022 insertions(+), 76 deletions(-) create mode 100644 dmp-backend/src/main/java/eu/eudat/builders/entity/ContentBuilder.java create mode 100644 dmp-backend/src/main/java/eu/eudat/builders/helpers/BuilderApplier.java create mode 100644 dmp-backend/src/main/java/eu/eudat/builders/model/models/RecentActivityDataBuilder.java create mode 100644 dmp-backend/src/main/java/eu/eudat/controllers/FileController.java create mode 100644 dmp-backend/src/main/java/eu/eudat/dao/entities/ContentDao.java create mode 100644 dmp-backend/src/main/java/eu/eudat/dao/entities/ContentDaoImpl.java create mode 100644 dmp-backend/src/main/java/eu/eudat/entities/Content.java create mode 100644 dmp-backend/src/main/java/eu/eudat/exceptions/files/TempFileNotFoundException.java create mode 100644 dmp-backend/src/main/java/eu/eudat/managers/FileManager.java create mode 100644 dmp-backend/src/main/java/eu/eudat/models/dashboard/recent/RecentActivity.java create mode 100644 dmp-backend/src/main/java/eu/eudat/models/dashboard/recent/RecentActivityData.java rename dmp-backend/src/main/java/eu/eudat/models/dashboard/{ => statistics}/DashBoardStatistics.java (94%) create mode 100644 dmp-backend/src/main/java/eu/eudat/models/files/ContentFile.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/helpers/FileStorageService.java create mode 100644 dmp-backend/src/main/java/eu/eudat/services/helpers/FileStorageServiceImpl.java create mode 100644 dmp-backend/src/main/resources/images/default.png diff --git a/dmp-backend/src/main/java/eu/eudat/EuDatApplication.java b/dmp-backend/src/main/java/eu/eudat/EuDatApplication.java index 7a674710f..5f55cd672 100644 --- a/dmp-backend/src/main/java/eu/eudat/EuDatApplication.java +++ b/dmp-backend/src/main/java/eu/eudat/EuDatApplication.java @@ -1,11 +1,14 @@ package eu.eudat; +import eu.eudat.services.helpers.FileStorageService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.web.context.WebApplicationContext; @SpringBootApplication public class EuDatApplication extends SpringBootServletInitializer { diff --git a/dmp-backend/src/main/java/eu/eudat/builders/Builder.java b/dmp-backend/src/main/java/eu/eudat/builders/Builder.java index 09eab8aac..50d3718b4 100644 --- a/dmp-backend/src/main/java/eu/eudat/builders/Builder.java +++ b/dmp-backend/src/main/java/eu/eudat/builders/Builder.java @@ -1,5 +1,7 @@ package eu.eudat.builders; +import eu.eudat.builders.helpers.BuilderApplier; + /** * Created by ikalyvas on 2/15/2018. */ diff --git a/dmp-backend/src/main/java/eu/eudat/builders/BuilderFactoryImpl.java b/dmp-backend/src/main/java/eu/eudat/builders/BuilderFactoryImpl.java index 90bea297e..8951695e9 100644 --- a/dmp-backend/src/main/java/eu/eudat/builders/BuilderFactoryImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/builders/BuilderFactoryImpl.java @@ -4,10 +4,8 @@ import eu.eudat.builders.entity.*; import eu.eudat.builders.model.criteria.DataRepositoryCriteriaBuilder; import eu.eudat.builders.model.criteria.ExternalDatasetCriteriaBuilder; import eu.eudat.builders.model.criteria.RegistryCriteriaBuilder; -import eu.eudat.builders.model.models.DataTableDataBuilder; -import eu.eudat.builders.model.models.PrincipalBuilder; -import eu.eudat.builders.model.models.ProjectBuilder; -import eu.eudat.builders.model.models.ResearcherBuilder; +import eu.eudat.builders.model.models.*; +import eu.eudat.models.dashboard.recent.RecentActivityData; import org.springframework.stereotype.Service; /** @@ -29,6 +27,7 @@ public class BuilderFactoryImpl implements BuilderFactory { if (tClass.equals(UserTokenBuilder.class)) return (T) new UserTokenBuilder(); if (tClass.equals(ResearcherBuilder.class)) return (T) new ResearcherBuilder(); if (tClass.equals(ExternalDatasetCriteriaBuilder.class)) return (T) new ExternalDatasetCriteriaBuilder(); + if (tClass.equals(RecentActivityDataBuilder.class)) return (T) new RecentActivityDataBuilder(); return null; } diff --git a/dmp-backend/src/main/java/eu/eudat/builders/entity/ContentBuilder.java b/dmp-backend/src/main/java/eu/eudat/builders/entity/ContentBuilder.java new file mode 100644 index 000000000..270fbf778 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/builders/entity/ContentBuilder.java @@ -0,0 +1,90 @@ +package eu.eudat.builders.entity; + +import eu.eudat.builders.Builder; +import eu.eudat.entities.Content; + +import java.util.UUID; + +/** + * Created by ikalyvas on 3/16/2018. + */ +public class ContentBuilder extends Builder { + + private UUID id; + + private String label; + + private String extension; + + private Integer parentType; + + private String uri; + + private Integer locationType; + + public UUID getId() { + return id; + } + + public ContentBuilder id(UUID id) { + this.id = id; + return this; + } + + public String getLabel() { + return label; + } + + public ContentBuilder label(String label) { + this.label = label; + return this; + } + + public String getExtension() { + return extension; + } + + public ContentBuilder extension(String extension) { + this.extension = extension; + return this; + } + + public Integer getParentType() { + return parentType; + } + + public ContentBuilder parentType(Integer parentType) { + this.parentType = parentType; + return this; + } + + public String getUri() { + return uri; + } + + public ContentBuilder uri(String uri) { + this.uri = uri; + return this; + } + + public Integer getLocationType() { + return locationType; + } + + public ContentBuilder locationType(Integer locationType) { + this.locationType = locationType; + return this; + } + + @Override + public Content build() { + Content content = new Content(); + content.setExtension(extension); + content.setId(id); + content.setLabel(label); + content.setParentType(parentType); + content.setLocationType(locationType); + content.setUri(uri); + return content; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/builders/helpers/BuilderApplier.java b/dmp-backend/src/main/java/eu/eudat/builders/helpers/BuilderApplier.java new file mode 100644 index 000000000..e1bf2301d --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/builders/helpers/BuilderApplier.java @@ -0,0 +1,8 @@ +package eu.eudat.builders.helpers; + +/** + * Created by ikalyvas on 3/15/2018. + */ +public interface BuilderApplier { + void apply(T builder); +} diff --git a/dmp-backend/src/main/java/eu/eudat/builders/model/models/DataTableDataBuilder.java b/dmp-backend/src/main/java/eu/eudat/builders/model/models/DataTableDataBuilder.java index 378242d60..b68490577 100644 --- a/dmp-backend/src/main/java/eu/eudat/builders/model/models/DataTableDataBuilder.java +++ b/dmp-backend/src/main/java/eu/eudat/builders/model/models/DataTableDataBuilder.java @@ -1,6 +1,7 @@ package eu.eudat.builders.model.models; import eu.eudat.builders.Builder; +import eu.eudat.builders.helpers.BuilderApplier; import eu.eudat.models.helpers.common.DataTableData; import java.util.List; diff --git a/dmp-backend/src/main/java/eu/eudat/builders/model/models/PrincipalBuilder.java b/dmp-backend/src/main/java/eu/eudat/builders/model/models/PrincipalBuilder.java index a53d1558e..b3fa67333 100644 --- a/dmp-backend/src/main/java/eu/eudat/builders/model/models/PrincipalBuilder.java +++ b/dmp-backend/src/main/java/eu/eudat/builders/model/models/PrincipalBuilder.java @@ -1,6 +1,7 @@ package eu.eudat.builders.model.models; import eu.eudat.builders.Builder; +import eu.eudat.builders.helpers.BuilderApplier; import eu.eudat.models.security.Principal; import eu.eudat.types.Authorities; diff --git a/dmp-backend/src/main/java/eu/eudat/builders/model/models/ProjectBuilder.java b/dmp-backend/src/main/java/eu/eudat/builders/model/models/ProjectBuilder.java index 87d2ed01c..b8881804c 100644 --- a/dmp-backend/src/main/java/eu/eudat/builders/model/models/ProjectBuilder.java +++ b/dmp-backend/src/main/java/eu/eudat/builders/model/models/ProjectBuilder.java @@ -1,6 +1,7 @@ package eu.eudat.builders.model.models; import eu.eudat.builders.Builder; +import eu.eudat.builders.helpers.BuilderApplier; import eu.eudat.entities.UserInfo; import eu.eudat.models.dmp.DataManagementPlan; import eu.eudat.models.project.Project; diff --git a/dmp-backend/src/main/java/eu/eudat/builders/model/models/RecentActivityDataBuilder.java b/dmp-backend/src/main/java/eu/eudat/builders/model/models/RecentActivityDataBuilder.java new file mode 100644 index 000000000..d4e14fd94 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/builders/model/models/RecentActivityDataBuilder.java @@ -0,0 +1,64 @@ +package eu.eudat.builders.model.models; + +import eu.eudat.builders.Builder; +import eu.eudat.builders.helpers.BuilderApplier; +import eu.eudat.models.dashboard.recent.RecentActivityData; + +import java.util.Date; + +/** + * Created by ikalyvas on 3/14/2018. + */ +public class RecentActivityDataBuilder extends Builder { + + private String label; + private String id; + private Date timestamp; + private Integer type; + + public String getLabel() { + return label; + } + + public RecentActivityDataBuilder label(String label) { + this.label = label; + return this; + } + + public String getId() { + return id; + } + + public RecentActivityDataBuilder id(String id) { + this.id = id; + return this; + } + + public Date getTimestamp() { + return timestamp; + } + + public RecentActivityDataBuilder timestamp(Date timestamp) { + this.timestamp = timestamp; + return this; + } + + public Integer getType() { + return type; + } + + public RecentActivityDataBuilder type(Integer type) { + this.type = type; + return this; + } + + @Override + public RecentActivityData build() { + RecentActivityData recentActivityData = new RecentActivityData(); + recentActivityData.setLabel(label); + recentActivityData.setTimestamp(timestamp); + recentActivityData.setId(id); + recentActivityData.setType(type); + return recentActivityData; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/builders/model/models/ResearcherBuilder.java b/dmp-backend/src/main/java/eu/eudat/builders/model/models/ResearcherBuilder.java index 471629e4e..e17aa3cd9 100644 --- a/dmp-backend/src/main/java/eu/eudat/builders/model/models/ResearcherBuilder.java +++ b/dmp-backend/src/main/java/eu/eudat/builders/model/models/ResearcherBuilder.java @@ -1,6 +1,7 @@ package eu.eudat.builders.model.models; import eu.eudat.builders.Builder; +import eu.eudat.builders.helpers.BuilderApplier; import eu.eudat.models.dmp.Researcher; /** 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 da7679e1b..9b2731c9a 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", "false"); + properties.setProperty("hibernate.show_sql", "true"); properties.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false"); return properties; } 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 4c85de848..f7d77b5fa 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/DashBoardController.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/DashBoardController.java @@ -1,7 +1,8 @@ package eu.eudat.controllers; import eu.eudat.managers.DashBoardManager; -import eu.eudat.models.dashboard.DashBoardStatistics; +import eu.eudat.models.dashboard.recent.RecentActivity; +import eu.eudat.models.dashboard.statistics.DashBoardStatistics; import eu.eudat.models.helpers.responses.ResponseItem; import eu.eudat.models.security.Principal; import eu.eudat.services.ApiContext; @@ -9,10 +10,7 @@ import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @CrossOrigin @@ -47,4 +45,16 @@ public class DashBoardController extends BaseController { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); } } + + @RequestMapping(method = RequestMethod.GET, value = {"/user/recentActivity"}, produces = "application/json") + public ResponseEntity> getRecentActivity(@RequestParam(name = "numOfActivities", required = false, defaultValue = "5") Integer numberOfActivities, Principal principal) { + try { + RecentActivity statistics = new DashBoardManager().getRecentActivity(this.getApiContext(), this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao() + , this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), principal, numberOfActivities); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); + } 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/FileController.java b/dmp-backend/src/main/java/eu/eudat/controllers/FileController.java new file mode 100644 index 000000000..68b4efa2c --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/controllers/FileController.java @@ -0,0 +1,61 @@ +package eu.eudat.controllers; + +import eu.eudat.managers.FileManager; +import eu.eudat.models.files.ContentFile; +import eu.eudat.models.helpers.responses.ResponseItem; +import eu.eudat.services.ApiContext; +import eu.eudat.types.ApiMessageCode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; + +/** + * Created by ikalyvas on 3/15/2018. + */ +@RestController +@CrossOrigin +@RequestMapping(value = {"/api/files"}) +public class FileController extends BaseController { + + @Autowired + public FileController(ApiContext apiContext) { + super(apiContext); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/upload"}) + public ResponseEntity>> handleFileUpload(@RequestParam("file") MultipartFile[] file) { + try { + return ResponseEntity.status(HttpStatus.OK).body( + new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(FileManager.saveTempFile(file, getApiContext().getOperationsContext().getFileStorageService()))); + } catch (IOException e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.ERROR_MESSAGE).message(e.getMessage())); + } + } + + @RequestMapping(method = RequestMethod.GET, value = {"/{id}"}) + public ResponseEntity handleFileUpload(@PathVariable(name = "id") String id, + @RequestParam(name = "type") String type, + @RequestParam(name = "location", required = false, defaultValue = "final") String location) { + try { + Resource resource = FileManager.getFile(id, type, getApiContext().getOperationsContext().getFileStorageService(), location); + if (!resource.exists()) + resource = new UrlResource(FileController.class.getClassLoader().getResource("images/default.png")); + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "." + type + "\"") + .body(resource); + } catch (IOException e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); + } + } + +} 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 e1d378ebd..bcfd57a15 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().getOperationsContext().getDatabaseRepository().getProjectDao(), projectTableRequest); + DataTableData dataTable = new ProjectManager().getPaged(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), projectTableRequest, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); } catch (Exception ex) { @@ -65,9 +65,10 @@ public class Projects extends BaseController { public @ResponseBody ResponseEntity> addProject(@Valid @RequestBody eu.eudat.models.project.Project project, Principal principal) { try { - ProjectManager.createOrUpdate(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getUserInfoDao(), project, principal); + ProjectManager.createOrUpdate(this.getApiContext().getOperationsContext().getFileStorageService(), this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getContentDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getUserInfoDao(), project, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created")); } 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/dao/entities/ContentDao.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/ContentDao.java new file mode 100644 index 000000000..52b123bdb --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/ContentDao.java @@ -0,0 +1,12 @@ +package eu.eudat.dao.entities; + +import eu.eudat.dao.DatabaseAccessLayer; +import eu.eudat.entities.Content; + +import java.util.UUID; + +/** + * Created by ikalyvas on 3/16/2018. + */ +public interface ContentDao extends DatabaseAccessLayer { +} diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/ContentDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/ContentDaoImpl.java new file mode 100644 index 000000000..4032b6fc7 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/ContentDaoImpl.java @@ -0,0 +1,53 @@ +package eu.eudat.dao.entities; + +import eu.eudat.dao.DatabaseAccess; +import eu.eudat.dao.databaselayer.service.DatabaseService; +import eu.eudat.entities.Content; +import eu.eudat.queryable.QueryableList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +/** + * Created by ikalyvas on 3/16/2018. + */ +@Service("contentDao") +public class ContentDaoImpl extends DatabaseAccess implements ContentDao { + + @Autowired + public ContentDaoImpl(DatabaseService databaseService) { + this.setDatabaseService(databaseService); + } + + @Override + public Content createOrUpdate(Content item) { + return this.getDatabaseService().createOrUpdate(item, Content.class); + } + + @Override + public CompletableFuture createOrUpdateAsync(Content item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public Content find(UUID id) { + return this.getDatabaseService().getQueryable(Content.class).where((builder, root) -> builder.equal(root.get("id"), id)).getSingle(); + } + + @Override + public Content find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } + + @Override + public void delete(Content item) { + this.getDatabaseService().delete(item); + } + + @Override + public QueryableList asQueryable() { + return this.getDatabaseService().getQueryable(Content.class); + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java index 12fa9b813..37a8d6690 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java @@ -37,7 +37,7 @@ public class DMPDaoImpl extends DatabaseAccess implements DMPDao { if (criteria.getProjects() != null && !criteria.getProjects().isEmpty()) query.where(((builder, root) -> root.get("project").in(criteria.getProjectEntities()))); if (!criteria.getAllVersions()) - query.where((builder, root) -> builder.equal(root.get("version"), query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("groupId"), nestedRoot.get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "version")), String.class))); + query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("version"), query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("groupId"), nestedRoot.get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "version")), String.class))); if (criteria.getGroupIds() != null && !criteria.getGroupIds().isEmpty()) query.where((builder, root) -> root.get("groupId").in(criteria.getGroupIds())); query.where((builder, root) -> builder.notEqual(root.get("status"), DMP.DMPStatus.DELETED.getValue())); diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDaoImpl.java index a15177d98..36f085fd8 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDaoImpl.java @@ -33,7 +33,7 @@ public class DatasetDaoImpl extends DatabaseAccess implements DatasetDa if (criteria.getPeriodStart() != null) query.where((builder, root) -> builder.greaterThan(root.get("created"), criteria.getPeriodStart())); if (!criteria.getAllVersions()) - query.where((builder, root) -> builder.equal(root.get("dmp").get("version"), query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("dmp").get("groupId"), nestedRoot.get("dmp").get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.COMPOSITE_FIELD, "dmp:version")), String.class))); + query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("dmp").get("version"), query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("dmp").get("groupId"), nestedRoot.get("dmp").get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.COMPOSITE_FIELD, "dmp:version")), String.class))); if (criteria.getDmpIds() != null && !criteria.getDmpIds().isEmpty()) query.where((builder, root) -> root.get("dmp").get("id").in(criteria.getDmpIds())); return query; diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java index 5d66389b9..53d85ff5e 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java @@ -56,7 +56,7 @@ public class ProjectDaoImpl extends DatabaseAccess implements ProjectDa } public QueryableList getAuthenticated(QueryableList query, UserInfo principal) { - query.where((builder, root) -> builder.equal(root.get("creator"), principal)); + query.where((builder, root) -> builder.or(builder.equal(root.get("creationUser"), principal), builder.isMember(principal, root.join("dmps").get("users")))).distinct(); return query; } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Content.java b/dmp-backend/src/main/java/eu/eudat/entities/Content.java new file mode 100644 index 000000000..55aa8b8d8 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/entities/Content.java @@ -0,0 +1,145 @@ +package eu.eudat.entities; + +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.util.UUID; + +/** + * Created by ikalyvas on 3/15/2018. + */ +@Entity +@Table(name = "\"Content\"") +public class Content implements DataEntity { + + public enum ParentType { + PROJECT(0); + + private int value; + + private ParentType(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static ParentType fromInteger(int value) { + switch (value) { + case 0: + return PROJECT; + default: + throw new RuntimeException("Unsupported Content Parent Type Status"); + } + } + } + + public enum LocationType { + EXTERNAL(0), INTERNAL(1); + + private Integer value; + + private LocationType(Integer value) { + this.value = value; + } + + public Integer getValue() { + return value; + } + + public static LocationType fromInteger(int value) { + switch (value) { + case 0: + return EXTERNAL; + case 1: + return INTERNAL; + default: + throw new RuntimeException("Unsupported Content Location Type"); + } + } + } + + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"Id\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; + + @Column(name = "\"Filename\"", nullable = false) + private String label; + + @Column(name = "\"Extension\"", nullable = false) + private String extension; + + @Column(name = "\"ParentType\"", nullable = false) + private Integer parentType; + + @Column(name = "\"Uri\"", nullable = false) + private String uri; + + @Column(name = "\"LocationType\"", nullable = false) + private Integer locationType; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getExtension() { + return extension; + } + + public void setExtension(String extension) { + this.extension = extension; + } + + public Integer getParentType() { + return parentType; + } + + public void setParentType(Integer parentType) { + this.parentType = parentType; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public Integer getLocationType() { + return locationType; + } + + public void setLocationType(Integer locationType) { + this.locationType = locationType; + } + + @Override + public void update(Content entity) { + this.extension = entity.getExtension(); + this.label = entity.getLabel(); + this.locationType = entity.getLocationType(); + this.parentType = entity.getParentType(); + this.uri = entity.getUri(); + } + + @Override + public UUID getKeys() { + return this.id; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/entities/DMP.java b/dmp-backend/src/main/java/eu/eudat/entities/DMP.java index 146031b16..4fc6b7215 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/DMP.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/DMP.java @@ -5,7 +5,6 @@ import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; -import java.io.Serializable; import java.util.*; @@ -15,15 +14,19 @@ import java.util.*; @NamedEntityGraph( name = "dataManagementPlanListingModel", attributeNodes = {@NamedAttributeNode("organisations"), @NamedAttributeNode("researchers"), - @NamedAttributeNode("project"), @NamedAttributeNode("profile"), @NamedAttributeNode("dataset")} + @NamedAttributeNode("project"), @NamedAttributeNode("creator"), @NamedAttributeNode("profile"), @NamedAttributeNode("dataset")} ), @NamedEntityGraph( name = "fullyDetailed", attributeNodes = { @NamedAttributeNode("project"), @NamedAttributeNode("profile"), - @NamedAttributeNode("users"), @NamedAttributeNode("organisations"), @NamedAttributeNode("researchers")}) + @NamedAttributeNode("users"), @NamedAttributeNode("organisations"), @NamedAttributeNode("researchers")}), + @NamedEntityGraph( + name = "dmpRecentActivity", + attributeNodes = { + @NamedAttributeNode("users"), @NamedAttributeNode("creator")}) }) -public class DMP implements DataEntity { +public class DMP implements DataEntity { public enum DMPStatus { ACTIVE((short) 0), DELETED((short) 1); @@ -89,7 +92,7 @@ public class DMP implements DataEntity { private DMPProfile profile; - @ManyToOne(fetch = FetchType.EAGER) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "\"Creator\"") private UserInfo creator; @@ -282,6 +285,7 @@ public class DMP implements DataEntity { this.description = entity.getDescription(); this.researchers = entity.getResearchers(); this.organisations = entity.getOrganisations(); + this.setModified(new Date()); if (entity.getUsers() != null) this.users = entity.getUsers(); } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java b/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java index 00648db49..519775f5a 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java @@ -18,9 +18,13 @@ import java.util.*; @NamedEntityGraph( name = "datasetWizardModel", attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode("dataRepositories"), @NamedAttributeNode("externalDatasets"), @NamedAttributeNode("registries"), - @NamedAttributeNode("dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}) + @NamedAttributeNode("dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}), + @NamedEntityGraph( + name = "datasetRecentActivity", + attributeNodes = {@NamedAttributeNode(value = "dmp", subgraph = "dmp"), @NamedAttributeNode("creator")}, + subgraphs = @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users")})) }) -public class Dataset implements DataEntity { +public class Dataset implements DataEntity { public static Set getHints() { return hints; @@ -309,6 +313,7 @@ public class Dataset implements DataEntity { this.setExternalDatasets(entity.getExternalDatasets()); this.setStatus(entity.getStatus()); this.setProfile(entity.getProfile()); + this.setModified(new Date()); if (entity.getCreator() != null) this.creator = entity.getCreator(); } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Project.java b/dmp-backend/src/main/java/eu/eudat/entities/Project.java index de8bd0a42..c08f474ad 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Project.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Project.java @@ -1,9 +1,6 @@ package eu.eudat.entities; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; @@ -15,7 +12,14 @@ import java.util.UUID; @Entity @Table(name = "\"Project\"") -public class Project implements DataEntity { +@NamedEntityGraphs({ + @NamedEntityGraph( + name = "projectRecentActivity", + attributeNodes = {@NamedAttributeNode(value = "dmps", subgraph = "dmps")}, + subgraphs = @NamedSubgraph(name = "dmps", attributeNodes = {@NamedAttributeNode("users")}) + ) +}) +public class Project implements DataEntity { public enum Status { ACTIVE((short) 1), INACTIVE((short) 0), DELETED((short) 99); @@ -44,6 +48,31 @@ public class Project implements DataEntity { } } + public enum ProjectType { + EXTERNAL(0), INTERNAL(1); + + private Integer value; + + private ProjectType(Integer value) { + this.value = value; + } + + public Integer getValue() { + return value; + } + + public static ProjectType fromInteger(int value) { + switch (value) { + case 0: + return EXTERNAL; + case 1: + return INTERNAL; + default: + throw new RuntimeException("Unsupported Project Type"); + } + } + } + @Id @GeneratedValue @GenericGenerator(name = "uuid2", strategy = "uuid2") @@ -98,12 +127,17 @@ public class Project implements DataEntity { @Column(name = "\"Description\"") private String description; + @Column(name = "\"Type\"") + private Integer type; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "\"Content\"") + private Content content; public String getDescription() { return description; } - public void setDescription(String description) { this.description = description; } @@ -133,32 +167,26 @@ public class Project implements DataEntity { return modified; } - public void setModified(Date modified) { this.modified = modified; } - public Date getStartdate() { return startdate; } - public void setStartdate(Date startdate) { this.startdate = startdate; } - public Date getEnddate() { return enddate; } - public void setEnddate(Date enddate) { this.enddate = enddate; } - public UUID getId() { return id; } @@ -216,23 +244,28 @@ public class Project implements DataEntity { this.dmps = dmps; } - public UserInfo getCreationUser() { return creationUser; } - public void setCreationUser(UserInfo creationUser) { this.creationUser = creationUser; } + public Integer getType() { + return type; + } - public String toString() { - try { - return new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT).writeValueAsString(this).replace("\"", """); - } catch (JsonProcessingException e) { - return ""; - } + public void setType(Integer type) { + this.type = type; + } + + public Content getContent() { + return content; + } + + public void setContent(Content content) { + this.content = content; } @Override @@ -244,6 +277,8 @@ public class Project implements DataEntity { this.definition = entity.getDefinition(); this.dmps = entity.getDmps(); this.enddate = entity.getEnddate(); + this.modified = new Date(); + if (entity.getContent() != null) this.content = entity.getContent(); //this.creationUser = entity.getCreationUser(); //TODO } diff --git a/dmp-backend/src/main/java/eu/eudat/exceptions/files/TempFileNotFoundException.java b/dmp-backend/src/main/java/eu/eudat/exceptions/files/TempFileNotFoundException.java new file mode 100644 index 000000000..02751e414 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/exceptions/files/TempFileNotFoundException.java @@ -0,0 +1,22 @@ +package eu.eudat.exceptions.files; + +/** + * Created by ikalyvas on 3/16/2018. + */ +public class TempFileNotFoundException extends RuntimeException { + public TempFileNotFoundException() { + super(); + } + + public TempFileNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public TempFileNotFoundException(String message) { + super(message); + } + + public TempFileNotFoundException(Throwable cause) { + super(cause); + } +} \ No newline at end of file diff --git a/dmp-backend/src/main/java/eu/eudat/managers/DashBoardManager.java b/dmp-backend/src/main/java/eu/eudat/managers/DashBoardManager.java index a109c12b4..2568d0f76 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DashBoardManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DashBoardManager.java @@ -1,19 +1,41 @@ package eu.eudat.managers; +import eu.eudat.builders.model.models.RecentActivityDataBuilder; import eu.eudat.dao.entities.DMPDao; import eu.eudat.dao.entities.DatasetDao; import eu.eudat.dao.entities.ProjectDao; import eu.eudat.entities.UserInfo; -import eu.eudat.models.dashboard.DashBoardStatistics; +import eu.eudat.models.criteria.DataManagementPlanCriteria; +import eu.eudat.models.criteria.DatasetCriteria; +import eu.eudat.models.dashboard.recent.RecentActivity; +import eu.eudat.models.dashboard.recent.RecentActivityData; +import eu.eudat.models.dashboard.statistics.DashBoardStatistics; import eu.eudat.models.security.Principal; +import eu.eudat.services.ApiContext; + +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.CompletableFuture; public class DashBoardManager { public DashBoardStatistics getStatistics(DatasetDao datasetRepository, DMPDao dataManagementPlanRepository, ProjectDao projectRepository) { DashBoardStatistics statistics = new DashBoardStatistics(); - statistics.setTotalDataManagementPlanCount(dataManagementPlanRepository.asQueryable().count()); - statistics.setTotalDataSetCount(datasetRepository.asQueryable().count()); - statistics.setTotalProjectCount(projectRepository.asQueryable().count()); + DatasetCriteria datasetCriteria = new DatasetCriteria(); + datasetCriteria.setAllVersions(false); + DataManagementPlanCriteria dataManagementPlanCriteria = new DataManagementPlanCriteria(); + dataManagementPlanCriteria.setAllVersions(false); + + CompletableFuture dmpFuture = dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria).countAsync() + .whenComplete((dmpsStats, throwable) -> statistics.setTotalDataManagementPlanCount(dmpsStats)); + CompletableFuture datasetFuture = datasetRepository.getWithCriteria(datasetCriteria).countAsync() + .whenComplete((datasetsStats, throwable) -> statistics.setTotalDataSetCount(datasetsStats)); + CompletableFuture projectFuture = projectRepository.asQueryable().countAsync() + .whenComplete((projectsStats, throwable) -> statistics.setTotalProjectCount(projectsStats)); + + CompletableFuture.allOf(dmpFuture, datasetFuture, projectFuture).join(); return statistics; } @@ -21,10 +43,55 @@ public class DashBoardManager { DashBoardStatistics statistics = new DashBoardStatistics(); UserInfo user = new UserInfo(); user.setId(principal.getId()); - statistics.setTotalDataManagementPlanCount(dataManagementPlanRepository.asQueryable().where((builder, root) -> builder.equal(root.get("creator").get("id"), principal.getId())).count()); - statistics.setTotalDataSetCount(datasetRepository.asQueryable().where((builder, root) -> builder.equal(root.get("creator").get("id"), principal.getId())).count()); - statistics.setTotalProjectCount(projectRepository.asQueryable().where((builder, root) -> builder.equal(root.get("creationUser").get("id"), principal.getId())).count()); + DatasetCriteria datasetCriteria = new DatasetCriteria(); + datasetCriteria.setAllVersions(false); + DataManagementPlanCriteria dataManagementPlanCriteria = new DataManagementPlanCriteria(); + dataManagementPlanCriteria.setAllVersions(false); + CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), user).countAsync() + .whenComplete((dmpsStats, throwable) -> statistics.setTotalDataManagementPlanCount(dmpsStats)); + CompletableFuture datasetFuture = datasetRepository.getAuthenticated(datasetRepository.getWithCriteria(datasetCriteria), user).countAsync() + .whenComplete((datasetsStats, throwable) -> statistics.setTotalDataSetCount(datasetsStats)); + CompletableFuture projectFuture = projectRepository.getAuthenticated(projectRepository.asQueryable(), user).countAsync() + .whenComplete((projectsStats, throwable) -> statistics.setTotalProjectCount(projectsStats)); + + CompletableFuture.allOf(dmpFuture, datasetFuture, projectFuture).join(); return statistics; } + public RecentActivity getRecentActivity(ApiContext apiContext, DatasetDao datasetRepository, DMPDao dataManagementPlanRepository, ProjectDao projectRepository, Principal principal, Integer numberofactivities) { + RecentActivity activity = new RecentActivity(); + UserInfo user = new UserInfo(); + user.setId(principal.getId()); + List activities = new LinkedList<>(); + + RecentActivityDataBuilder recentActivityDataBuilder = apiContext.getOperationsContext().getBuilderFactory().getBuilder(RecentActivityDataBuilder.class); + + CompletableFuture> dmps = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.asQueryable(), user) + .withHint("dmpRecentActivity") + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .take(numberofactivities) + .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).type(RecentActivityData.RecentActivityType.DMP.getValue()).build()) + .whenComplete((dmpActivities, throwable) -> activities.addAll(dmpActivities)); + + CompletableFuture> datasets = datasetRepository.getAuthenticated(datasetRepository.asQueryable(), user) + .withHint("datasetRecentActivity") + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .take(numberofactivities) + .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).type(RecentActivityData.RecentActivityType.DATASET.getValue()).build()) + .whenComplete((datasetActivities, throwable) -> activities.addAll(datasetActivities)); + + CompletableFuture> projects = projectRepository.getAuthenticated(projectRepository.asQueryable(), user) + .withHint("projectRecentActivity") + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .take(numberofactivities) + .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).type(RecentActivityData.RecentActivityType.PROJECT.getValue()).build()) + .whenComplete((projectActivities, throwable) -> activities.addAll(projectActivities)); + + CompletableFuture.allOf(projects, dmps, datasets).join(); + Collections.sort(activities, Comparator.comparing(RecentActivityData::getTimestamp).reversed()); + activity.setRecentActivities(activities.subList(0, numberofactivities)); + + return activity; + } + } 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 7e171bee9..6a42cfaf6 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DataManagementPlanManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DataManagementPlanManager.java @@ -33,18 +33,18 @@ 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.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)); QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, userInfo); QueryableList pagedItems = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest); DataTableData dataTable = new DataTableData(); - CompletableFuture itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) + CompletableFuture itemsFuture = pagedItems .selectAsync(item -> new DataManagementPlanListingModel().fromDataModel(item)).whenComplete((resultList, throwable) -> { dataTable.setData(resultList); }); - CompletableFuture countFuture = items.countAsync().whenComplete((count, throwable) -> { + CompletableFuture countFuture = authItems.countAsync().whenComplete((count, throwable) -> { dataTable.setTotalCount(count); }); CompletableFuture.allOf(itemsFuture, countFuture).join(); @@ -155,7 +155,7 @@ public class DataManagementPlanManager { eu.eudat.entities.Project projectEntity = projectDao.getWithCriteria(criteria).getSingleOrDefault(); if (projectEntity != null) project.setId(projectEntity.getId()); else { - project.setCreationUser(userInfo); + project.setType(Project.ProjectType.EXTERNAL.getValue()); projectDao.createOrUpdate(project); } } 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 2599f43fc..1e768488b 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java @@ -43,17 +43,18 @@ public class DatasetManager { public DataTableData getPaged(ApiContext apiContext, DatasetTableRequest datasetTableRequest, Principal principal) throws Exception { UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); - QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class)); QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getAuthenticated(items, userInfo); QueryableList pagedItems = PaginationManager.applyPaging(authItems, datasetTableRequest); DataTableData dataTable = new DataTableData(); - CompletableFuture> itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DatasetListingModel.class)). + + CompletableFuture> itemsFuture = pagedItems. selectAsync(item -> new DatasetListingModel().fromDataModel(item)).whenComplete((resultList, throwable) -> { dataTable.setData(resultList); }); - CompletableFuture countFuture = items.countAsync().whenComplete((count, throwable) -> { + CompletableFuture countFuture = authItems.countAsync().whenComplete((count, throwable) -> { dataTable.setTotalCount(count); }); diff --git a/dmp-backend/src/main/java/eu/eudat/managers/FileManager.java b/dmp-backend/src/main/java/eu/eudat/managers/FileManager.java new file mode 100644 index 000000000..33f7934fc --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/managers/FileManager.java @@ -0,0 +1,23 @@ +package eu.eudat.managers; + +import eu.eudat.models.files.ContentFile; +import eu.eudat.services.helpers.FileStorageService; +import org.springframework.core.io.Resource; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; + +/** + * Created by ikalyvas on 3/15/2018. + */ +public class FileManager { + + public static List saveTempFile(MultipartFile file[], FileStorageService fileStorageService) throws IOException { + return fileStorageService.writeToTempFileSystem(file); + } + + public static Resource getFile(String filename, String type, FileStorageService fileStorageService, String location) throws IOException { + return fileStorageService.readFromFilesystem(filename, type, location); + } +} 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 6cc06005c..255af0375 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/ProjectManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/ProjectManager.java @@ -1,11 +1,16 @@ package eu.eudat.managers; +import eu.eudat.builders.entity.ContentBuilder; import eu.eudat.builders.model.models.ProjectBuilder; +import eu.eudat.dao.entities.ContentDao; import eu.eudat.dao.entities.ProjectDao; import eu.eudat.dao.entities.UserInfoDao; +import eu.eudat.entities.Content; +import eu.eudat.exceptions.files.TempFileNotFoundException; import eu.eudat.models.HintedModelFactory; import eu.eudat.models.external.ExternalSourcesItemModel; import eu.eudat.models.external.ProjectsExternalSourcesModel; +import eu.eudat.models.files.ContentFile; import eu.eudat.models.helpers.common.DataTableData; import eu.eudat.models.project.Project; import eu.eudat.models.project.ProjectCriteriaRequest; @@ -17,20 +22,25 @@ import eu.eudat.proxy.config.exceptions.NoURLFound; import eu.eudat.proxy.fetching.RemoteFetcher; import eu.eudat.queryable.QueryableList; import eu.eudat.services.ApiContext; +import eu.eudat.services.helpers.FileStorageService; +import java.io.IOException; import java.text.ParseException; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; public class ProjectManager { - public DataTableData getPaged(ProjectDao projectRepository, ProjectTableRequest projectTableRequest) throws Exception { + public DataTableData getPaged(ProjectDao projectRepository, ProjectTableRequest projectTableRequest, Principal principal) throws Exception { + eu.eudat.entities.UserInfo userInfo = new eu.eudat.entities.UserInfo(); + userInfo.setId(principal.getId()); QueryableList items = projectRepository.getWithCriteria(projectTableRequest.getCriteria()); - QueryableList pagedItems = PaginationManager.applyPaging(items, projectTableRequest); - DataTableData dataTable = new DataTableData(); + QueryableList authItems = projectRepository.getAuthenticated(items, userInfo); + + QueryableList pagedItems = PaginationManager.applyPaging(authItems, projectTableRequest); + DataTableData dataTable = new DataTableData<>(); CompletableFuture projectsFuture = pagedItems.withHint(HintedModelFactory.getHint(ProjectListingModel.class)).selectAsync(item -> new ProjectListingModel().fromDataModel(item)).whenComplete((results, throwable) -> { dataTable.setData(results); @@ -79,8 +89,23 @@ public class ProjectManager { return projects; } - public static void createOrUpdate(ProjectDao projectRepository, UserInfoDao userInfoRepository, eu.eudat.models.project.Project project, Principal principal) throws ParseException { + public static void createOrUpdate(FileStorageService fileStorageService, ProjectDao projectRepository, ContentDao contentRepository, UserInfoDao userInfoRepository, eu.eudat.models.project.Project project, Principal principal) throws ParseException, IOException { eu.eudat.entities.Project projectEntity = project.toDataModel(); + for (ContentFile file : project.getFiles()) { + try { + ContentFile storedFile = fileStorageService.copyFromTempFileSystem(file); + Content content = new ContentBuilder().extension(file.getType()) + .label(file.getFilename()) + .locationType(Content.LocationType.INTERNAL.getValue()) + .parentType(Content.ParentType.PROJECT.getValue()) + .uri("LOCAL:" + storedFile.getId()) + .build(); + projectEntity.setContent(contentRepository.createOrUpdate(content)); + } catch (TempFileNotFoundException e) { + continue; + } + } + projectEntity.setCreationUser(userInfoRepository.find(principal.getId())); projectRepository.createOrUpdate(projectEntity); } diff --git a/dmp-backend/src/main/java/eu/eudat/models/dashboard/recent/RecentActivity.java b/dmp-backend/src/main/java/eu/eudat/models/dashboard/recent/RecentActivity.java new file mode 100644 index 000000000..83eb3b4fd --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/models/dashboard/recent/RecentActivity.java @@ -0,0 +1,18 @@ +package eu.eudat.models.dashboard.recent; + +import java.util.List; + +/** + * Created by ikalyvas on 3/14/2018. + */ +public class RecentActivity { + private List recentActivities; + + public List getRecentActivities() { + return recentActivities; + } + + public void setRecentActivities(List recentActivities) { + this.recentActivities = recentActivities; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/models/dashboard/recent/RecentActivityData.java b/dmp-backend/src/main/java/eu/eudat/models/dashboard/recent/RecentActivityData.java new file mode 100644 index 000000000..d99aacb9e --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/models/dashboard/recent/RecentActivityData.java @@ -0,0 +1,74 @@ +package eu.eudat.models.dashboard.recent; + +import java.util.Date; + +/** + * Created by ikalyvas on 3/14/2018. + */ +public class RecentActivityData { + + public enum RecentActivityType { + PROJECT(0), DATASET(1), DMP(2); + + private Integer value; + + public Integer getValue() { + return value; + } + + private RecentActivityType(int value) { + this.value = value; + } + + public static RecentActivityType fromValue(Integer value) { + switch (value) { + case 0: + return PROJECT; + case 1: + return DATASET; + case 2: + return DMP; + default: + throw new RuntimeException("Unsupported Recent Activity Status"); + } + } + } + + private String label; + private String id; + private Date timestamp; + private Integer type; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Date getTimestamp() { + return timestamp; + } + + public void setTimestamp(Date timestamp) { + this.timestamp = timestamp; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + +} diff --git a/dmp-backend/src/main/java/eu/eudat/models/dashboard/DashBoardStatistics.java b/dmp-backend/src/main/java/eu/eudat/models/dashboard/statistics/DashBoardStatistics.java similarity index 94% rename from dmp-backend/src/main/java/eu/eudat/models/dashboard/DashBoardStatistics.java rename to dmp-backend/src/main/java/eu/eudat/models/dashboard/statistics/DashBoardStatistics.java index 915e18dc7..2fa4f9d23 100644 --- a/dmp-backend/src/main/java/eu/eudat/models/dashboard/DashBoardStatistics.java +++ b/dmp-backend/src/main/java/eu/eudat/models/dashboard/statistics/DashBoardStatistics.java @@ -1,4 +1,4 @@ -package eu.eudat.models.dashboard; +package eu.eudat.models.dashboard.statistics; public class DashBoardStatistics { private Long totalDataManagementPlanCount; diff --git a/dmp-backend/src/main/java/eu/eudat/models/files/ContentFile.java b/dmp-backend/src/main/java/eu/eudat/models/files/ContentFile.java new file mode 100644 index 000000000..37185387f --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/models/files/ContentFile.java @@ -0,0 +1,55 @@ +package eu.eudat.models.files; + +import java.util.UUID; + +/** + * Created by ikalyvas on 3/15/2018. + */ +public class ContentFile { + private String filename; + private UUID id; + private String location; + private String type; + + public ContentFile() { + } + + public ContentFile(String filename, UUID id, String location, String type) { + this.filename = filename; + this.id = id; + this.location = location; + this.type = type; + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/models/project/Project.java b/dmp-backend/src/main/java/eu/eudat/models/project/Project.java index 4dfc61722..ef30109da 100644 --- a/dmp-backend/src/main/java/eu/eudat/models/project/Project.java +++ b/dmp-backend/src/main/java/eu/eudat/models/project/Project.java @@ -3,7 +3,9 @@ package eu.eudat.models.project; import eu.eudat.entities.UserInfo; import eu.eudat.models.DataModel; import eu.eudat.models.dmp.DataManagementPlan; +import eu.eudat.models.files.ContentFile; +import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.UUID; @@ -39,6 +41,8 @@ public class Project implements DataModel { private String description; + private List files; + public UUID getId() { return id; @@ -152,6 +156,14 @@ public class Project implements DataModel { this.description = description; } + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + @Override public Project fromDataModel(eu.eudat.entities.Project entity) { this.id = entity.getId(); @@ -166,6 +178,7 @@ public class Project implements DataModel { this.created = entity.getCreated(); this.modified = entity.getModified(); this.description = entity.getDescription(); + this.files = entity.getContent() != null ? Arrays.asList(new ContentFile(entity.getContent().getLabel(), UUID.fromString(entity.getContent().getUri().split(":")[1]), "final", entity.getContent().getExtension())) : Arrays.asList(new ContentFile("default.png", null, null, null)); return this; } diff --git a/dmp-backend/src/main/java/eu/eudat/models/project/ProjectListingModel.java b/dmp-backend/src/main/java/eu/eudat/models/project/ProjectListingModel.java index d3a92ac68..ec1aed20d 100644 --- a/dmp-backend/src/main/java/eu/eudat/models/project/ProjectListingModel.java +++ b/dmp-backend/src/main/java/eu/eudat/models/project/ProjectListingModel.java @@ -4,7 +4,9 @@ import eu.eudat.entities.Project; import eu.eudat.entities.UserInfo; import eu.eudat.models.DataModel; import eu.eudat.models.dmp.DataManagementPlan; +import eu.eudat.models.files.ContentFile; +import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -39,6 +41,8 @@ public class ProjectListingModel implements DataModel files; + public UUID getId() { return id; @@ -152,6 +156,14 @@ public class ProjectListingModel implements DataModel getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + @Override public ProjectListingModel fromDataModel(eu.eudat.entities.Project entity) { this.id = entity.getId(); @@ -166,6 +178,7 @@ public class ProjectListingModel implements DataModel { Subquery subQueryCount(SinglePredicate predicate, List fields); + QueryableList initSubQuery(Class uClass); + Subquery subQueryMax(SinglePredicate predicate, List fields, Class uClass); Subquery subQueryMax(NestedQuerySinglePredicate predicate, List fields, Class uClass); diff --git a/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java b/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java index d0b56eb64..778710728 100644 --- a/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java +++ b/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java @@ -28,10 +28,10 @@ public class QueryableHibernateList implements QueryableLi private Class tClass; private Root root; private Root nestedQueryRoot; - private Subquery subquery; + private Subquery subquery; private List> singlePredicates = new LinkedList<>(); private List> nestedPredicates = new LinkedList<>(); - + private boolean distinct = false; private List> orderings = new LinkedList<>(); private List fields = new LinkedList<>(); private Integer length; @@ -114,7 +114,7 @@ public class QueryableHibernateList implements QueryableLi } public QueryableList distinct() { - this.query.distinct(true); + this.distinct = true; return this; } @@ -126,18 +126,22 @@ public class QueryableHibernateList implements QueryableLi public Long count() { CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); - Root root = criteriaQuery.from(tClass); - criteriaQuery.select(criteriaBuilder.count(root)); - criteriaQuery.where(this.generateWherePredicates(this.singlePredicates, root, this.nestedPredicates, this.nestedQueryRoot)); + this.root = criteriaQuery.from(tClass); + if (distinct) criteriaQuery.select(criteriaBuilder.countDistinct(this.root.get("id"))); + else criteriaQuery.select(criteriaBuilder.count(this.root)); + criteriaQuery.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + //if (distinct) criteriaQuery.distinct(true); return this.manager.createQuery(criteriaQuery).getSingleResult(); } public CompletableFuture countAsync() { CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); - Root root = criteriaQuery.from(tClass); - criteriaQuery.select(criteriaBuilder.count(root)); - criteriaQuery.where(this.generateWherePredicates(this.singlePredicates, root, this.nestedPredicates, this.nestedQueryRoot)); + this.root = criteriaQuery.from(tClass); + if (distinct) criteriaQuery.select(criteriaBuilder.countDistinct(this.root.get("id"))); + else criteriaQuery.select(criteriaBuilder.count(this.root)); + criteriaQuery.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + //if (distinct) criteriaQuery.distinct(true); return CompletableFuture.supplyAsync(() -> this.manager.createQuery(criteriaQuery).getSingleResult()); } @@ -177,10 +181,11 @@ public class QueryableHibernateList implements QueryableLi this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); + if (distinct) this.query.distinct(true); TypedQuery typedQuery = this.manager.createQuery(this.query); if (this.offset != null) typedQuery.setFirstResult(this.offset); if (this.length != null) typedQuery.setMaxResults(this.length); - if (this.hint != null && this.hints.contains(hint)) { + if (this.hint != null) { List ids = typedQuery.getResultList().stream().map(item -> item.getKeys()).collect(Collectors.toList()); if (ids != null && !ids.isEmpty()) typedQuery = queryWithHint(ids); } @@ -191,11 +196,12 @@ public class QueryableHibernateList implements QueryableLi this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); + if (distinct) this.query.distinct(true); TypedQuery typedQuery = this.manager.createQuery(this.query); if (this.offset != null) typedQuery.setFirstResult(this.offset); if (this.length != null) typedQuery.setMaxResults(this.length); return CompletableFuture.supplyAsync(() -> { - if (this.hint != null && this.hints.contains(hint)) { + if (this.hint != null) { List ids = typedQuery.getResultList().stream().map(item -> item.getKeys()).collect(Collectors.toList()); if (ids != null && !ids.isEmpty()) return queryWithHint(ids).getResultList(); } @@ -310,8 +316,8 @@ public class QueryableHibernateList implements QueryableLi @Override public Subquery subQueryMax(NestedQuerySinglePredicate predicate, List fields, Class uClass) { - Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(uClass); - this.nestedQueryRoot = subquery.from(this.tClass); + //Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(uClass); + //this.nestedQueryRoot = subquery.from(this.tClass); subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.root, this.nestedQueryRoot)); if (fields.get(0).getType() == FieldSelectionType.FIELD) subquery.select(this.manager.getCriteriaBuilder().greatest(this.nestedQueryRoot.get(fields.get(0).getField()))); @@ -320,4 +326,10 @@ public class QueryableHibernateList implements QueryableLi } return subquery; } + + public QueryableList initSubQuery(Class uClass) { + this.subquery = this.manager.getCriteriaBuilder().createQuery().subquery(uClass); + this.nestedQueryRoot = subquery.from(this.tClass); + return this; + } } diff --git a/dmp-backend/src/main/java/eu/eudat/services/helpers/FileStorageService.java b/dmp-backend/src/main/java/eu/eudat/services/helpers/FileStorageService.java new file mode 100644 index 000000000..caa21281f --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/helpers/FileStorageService.java @@ -0,0 +1,19 @@ +package eu.eudat.services.helpers; + +import eu.eudat.models.files.ContentFile; +import org.springframework.core.io.Resource; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; + +/** + * Created by ikalyvas on 3/15/2018. + */ +public interface FileStorageService { + List writeToTempFileSystem(MultipartFile[] multipartFiles) throws IOException; + + ContentFile copyFromTempFileSystem(ContentFile file) throws IOException; + + Resource readFromFilesystem(String filename, String type, String location) throws IOException; +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/helpers/FileStorageServiceImpl.java b/dmp-backend/src/main/java/eu/eudat/services/helpers/FileStorageServiceImpl.java new file mode 100644 index 000000000..1f3379171 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/helpers/FileStorageServiceImpl.java @@ -0,0 +1,80 @@ +package eu.eudat.services.helpers; + +import eu.eudat.exceptions.files.TempFileNotFoundException; +import eu.eudat.models.files.ContentFile; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.UUID; + +/** + * Created by ikalyvas on 3/15/2018. + */ +@Service("fileStorageService") +public class FileStorageServiceImpl implements FileStorageService { + + private Environment environment; + + @Autowired + public FileStorageServiceImpl(Environment environment) { + this.environment = environment; + this.init(); + } + + public List writeToTempFileSystem(MultipartFile[] multipartFiles) throws IOException { + List contentFileList = new LinkedList<>(); + for (MultipartFile multipartFile : Arrays.asList(multipartFiles)) { + UUID id = UUID.randomUUID(); + Files.copy(multipartFile.getInputStream(), Paths.get(environment.getProperty("files.storage.temp")).resolve(id.toString())); + ContentFile contentFile = new ContentFile(multipartFile.getOriginalFilename(), id, "temp", getFileExtension(multipartFile.getOriginalFilename())); + contentFileList.add(contentFile); + } + return contentFileList; + } + + public ContentFile copyFromTempFileSystem(ContentFile file) throws IOException, TempFileNotFoundException { + UUID id = UUID.randomUUID(); + if (!Files.exists(Paths.get(environment.getProperty("files.storage.temp") + "/" + file.getId()))) + throw new TempFileNotFoundException(); + Files.copy(Paths.get(environment.getProperty("files.storage.temp") + "/" + file.getId()), Paths.get(environment.getProperty("files.storage.final")).resolve(id.toString())); + ContentFile contentFile = new ContentFile(file.getFilename(), id, file.getLocation(), file.getType()); + return contentFile; + } + + public Resource readFromFilesystem(String filename, String type, String location) throws IOException { + if (location.equals("temp")) { + return new UrlResource(Paths.get(environment.getProperty("files.storage.temp") + '/' + filename).toUri()); + } else { + return new UrlResource(Paths.get(environment.getProperty("files.storage.final") + '/' + filename).toUri()); + } + } + + public void init() { + try { + if (!Files.exists(Paths.get(environment.getProperty("files.storage.temp")))) { + Files.createDirectory(Paths.get(environment.getProperty("files.storage.temp"))); + } + if (!Files.exists(Paths.get(environment.getProperty("files.storage.final")))) { + Files.createDirectory(Paths.get(environment.getProperty("files.storage.final"))); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static String getFileExtension(String fileName) { + if (fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0) + return fileName.substring(fileName.lastIndexOf(".") + 1); + else return ""; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepository.java b/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepository.java index 1be099f2a..8e6f9a327 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepository.java +++ b/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepository.java @@ -37,4 +37,6 @@ public interface DatabaseRepository { ExternalDatasetDao getExternalDatasetDao(); UserDmpDao getUserDmpDao(); + + ContentDao getContentDao(); } diff --git a/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepositoryImpl.java b/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepositoryImpl.java index 8f55edaf0..0f11fa8b0 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepositoryImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/services/operations/DatabaseRepositoryImpl.java @@ -28,6 +28,7 @@ public class DatabaseRepositoryImpl implements DatabaseRepository { private ExternalDatasetDao externalDatasetDao; private UserRoleDao userRoleDao; private UserDmpDao userDmpDao; + private ContentDao contentDao; private EntityManager entityManager; @@ -195,4 +196,14 @@ public class DatabaseRepositoryImpl implements DatabaseRepository { public void setUserDmpDao(UserDmpDao userDmpDao) { this.userDmpDao = userDmpDao; } + + @Override + public ContentDao getContentDao() { + return this.contentDao; + } + + @Autowired + public void setContentDao(ContentDao contentDao) { + this.contentDao = contentDao; + } } 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 index 672f6423a..35054c478 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContext.java +++ b/dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContext.java @@ -2,6 +2,7 @@ package eu.eudat.services.operations; import eu.eudat.builders.BuilderFactory; import eu.eudat.proxy.fetching.RemoteFetcher; +import eu.eudat.services.helpers.FileStorageService; import org.springframework.context.ApplicationContext; /** @@ -17,4 +18,6 @@ public interface OperationsContext { RemoteFetcher getRemoteFetcher(); + FileStorageService getFileStorageService(); + } 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 index 46615304b..38ee2d2e3 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContextImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/services/operations/OperationsContextImpl.java @@ -2,6 +2,7 @@ package eu.eudat.services.operations; import eu.eudat.builders.BuilderFactory; import eu.eudat.proxy.fetching.RemoteFetcher; +import eu.eudat.services.helpers.FileStorageService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; @@ -16,13 +17,16 @@ public class OperationsContextImpl implements OperationsContext { private ApplicationContext applicationContext; private RemoteFetcher remoteFetcher; private BuilderFactory builderFactory; + private FileStorageService fileStorageService; @Autowired - public OperationsContextImpl(DatabaseRepository databaseRepository, ApplicationContext applicationContext, RemoteFetcher remoteFetcher, BuilderFactory builderFactory) { + public OperationsContextImpl(DatabaseRepository databaseRepository, ApplicationContext applicationContext, RemoteFetcher remoteFetcher + , BuilderFactory builderFactory, FileStorageService fileStorageService) { this.databaseRepository = databaseRepository; this.applicationContext = applicationContext; this.remoteFetcher = remoteFetcher; this.builderFactory = builderFactory; + this.fileStorageService = fileStorageService; } @Override @@ -45,4 +49,8 @@ public class OperationsContextImpl implements OperationsContext { return builderFactory; } + @Override + public FileStorageService getFileStorageService() { + return fileStorageService; + } } diff --git a/dmp-backend/src/main/resources/application.properties b/dmp-backend/src/main/resources/application.properties index ebf18e6a8..6fd6f8f44 100644 --- a/dmp-backend/src/main/resources/application.properties +++ b/dmp-backend/src/main/resources/application.properties @@ -57,4 +57,6 @@ b2access.externallogin.redirect_uri=http://dmp.eudat.org:4200/api/oauth/authoriz b2access.externallogin.clientid=eudatdmptool b2access.externallogin.clientSecret=A3b*1*92 ################################################################################# -pdf.converter.url=http://localhost/ \ No newline at end of file +pdf.converter.url=http://localhost/ +files.storage.temp = temp +files.storage.final = final \ No newline at end of file diff --git a/dmp-backend/src/main/resources/images/default.png b/dmp-backend/src/main/resources/images/default.png new file mode 100644 index 0000000000000000000000000000000000000000..71612d552869a35581ddd1cea35777dd90dde37a GIT binary patch literal 939 zcmV;c162HpP)AP?k$Jdg+SKpw~g z;r2lIT?<2U42N?Df6qF1gp`+o8H6b3vq8`M9TGWCZAeVF?5$sISfE4hv!iR{3LOUO_ zL#2}qN%&0e2r2*G8Jt0P=Hf!cpttSF_1|4_M`w-;@#xF=QvW|WExL+KNFH*W5W6Tw zh!8hs*D3)W1s)_1+p-qh^GIkAhx<0EJ;{dK0t=FHpRcu!l2{hR4|H@%5(gqf9X*nr z1Btk6tDmYE+$0pphMSCxK8T47$VJ!>ZD{8ikl6c14;%+A1LFH%to|(8T?B|lyTCZE zOyeOJc35*AFd$i=nLv}RtoHKnp9^%lf)UTD%ZaierfImCr zSOy|!R@Q;!eE#vF-+;%MhiMY>I zeF(#WJU_&vBUfjKh(}Llc8F}~>8O)KibYRWR3QA@!nw{3Inmcqr-q0}Ut66TA{+WL zGBuYYZlBJsYgCgdPG6d|&+t~2UFWJ7PhP7EoA>)=E94oyg=J9HosbVnPa?}(KP znctxRDSU?tq!`fFSDFyvJ5(UD@&6}O1>(CMQfG#o^y#As(f`mxog1>DD--M7kW*#2 z;zPu!eCB+JM^9eriPCT=5~E@6dr5zC#6)aaXBJK!VPA z#fLclGEoPDcCIc0DQIS{RUk>{#o|K(S{YdevXeKqY7mE3X&s0~D_IAER<^zgWPcY( zSO;>U)wvEN54`sCQ@iz1000OCFwDPdkiedoI>@ge)qx}sknTW0KxPI40s;a80s`W- zKtMo1KtMo1KtMo1KtMo1KtMo1KtMo1z6b;a1ms{KARr(hARr*0lmU$jKWpBQT`>Rv N002ovPDHLkV1i>0nfU+! literal 0 HcmV?d00001