no message

This commit is contained in:
Ioannis Kalyvas 2018-03-19 14:40:04 +02:00
parent 3b5b2ee4c6
commit dac219c627
45 changed files with 1022 additions and 76 deletions

View File

@ -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 {

View File

@ -1,5 +1,7 @@
package eu.eudat.builders;
import eu.eudat.builders.helpers.BuilderApplier;
/**
* Created by ikalyvas on 2/15/2018.
*/

View File

@ -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;
}

View File

@ -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<Content> {
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;
}
}

View File

@ -0,0 +1,8 @@
package eu.eudat.builders.helpers;
/**
* Created by ikalyvas on 3/15/2018.
*/
public interface BuilderApplier<T> {
void apply(T builder);
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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<RecentActivityData> {
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;
}
}

View File

@ -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;
/**

View File

@ -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;
}

View File

@ -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<DashBoardStatistics>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage()));
}
}
@RequestMapping(method = RequestMethod.GET, value = {"/user/recentActivity"}, produces = "application/json")
public ResponseEntity<ResponseItem<RecentActivity>> 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<RecentActivity>().status(ApiMessageCode.NO_MESSAGE).payload(statistics));
} catch (Exception ex) {
ex.printStackTrace();
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem<RecentActivity>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage()));
}
}
}

View File

@ -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<ResponseItem<List<ContentFile>>> handleFileUpload(@RequestParam("file") MultipartFile[] file) {
try {
return ResponseEntity.status(HttpStatus.OK).body(
new ResponseItem<List<ContentFile>>().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<List<ContentFile>>().status(ApiMessageCode.ERROR_MESSAGE).message(e.getMessage()));
}
}
@RequestMapping(method = RequestMethod.GET, value = {"/{id}"})
public ResponseEntity<Resource> 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);
}
}
}

View File

@ -38,7 +38,7 @@ public class Projects extends BaseController {
public @ResponseBody
ResponseEntity<ResponseItem<DataTableData<ProjectListingModel>>> getPaged(@Valid @RequestBody ProjectTableRequest projectTableRequest, Principal principal) {
try {
DataTableData<eu.eudat.models.project.ProjectListingModel> dataTable = new ProjectManager().getPaged(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), projectTableRequest);
DataTableData<eu.eudat.models.project.ProjectListingModel> dataTable = new ProjectManager().getPaged(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), projectTableRequest, principal);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DataTableData<eu.eudat.models.project.ProjectListingModel>>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE));
} catch (Exception ex) {
@ -65,9 +65,10 @@ public class Projects extends BaseController {
public @ResponseBody
ResponseEntity<ResponseItem<Project>> 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<eu.eudat.entities.Project>().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created"));
} catch (Exception ex) {
ex.printStackTrace();
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem<eu.eudat.entities.Project>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage()));
}
}

View File

@ -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<Content, UUID> {
}

View File

@ -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<Content> implements ContentDao {
@Autowired
public ContentDaoImpl(DatabaseService<Content> databaseService) {
this.setDatabaseService(databaseService);
}
@Override
public Content createOrUpdate(Content item) {
return this.getDatabaseService().createOrUpdate(item, Content.class);
}
@Override
public CompletableFuture<Content> 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<Content> asQueryable() {
return this.getDatabaseService().getQueryable(Content.class);
}
}

View File

@ -37,7 +37,7 @@ public class DMPDaoImpl extends DatabaseAccess<DMP> 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.<String>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.<String>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()));

View File

@ -33,7 +33,7 @@ public class DatasetDaoImpl extends DatabaseAccess<Dataset> 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.<String>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.<String>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;

View File

@ -56,7 +56,7 @@ public class ProjectDaoImpl extends DatabaseAccess<Project> implements ProjectDa
}
public QueryableList<Project> getAuthenticated(QueryableList<Project> 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;
}

View File

@ -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<Content, UUID> {
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;
}
}

View File

@ -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<DMP,UUID> {
public class DMP implements DataEntity<DMP, UUID> {
public enum DMPStatus {
ACTIVE((short) 0), DELETED((short) 1);
@ -89,7 +92,7 @@ public class DMP implements DataEntity<DMP,UUID> {
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<DMP,UUID> {
this.description = entity.getDescription();
this.researchers = entity.getResearchers();
this.organisations = entity.getOrganisations();
this.setModified(new Date());
if (entity.getUsers() != null) this.users = entity.getUsers();
}

View File

@ -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<Dataset,UUID> {
public class Dataset implements DataEntity<Dataset, UUID> {
public static Set<String> getHints() {
return hints;
@ -309,6 +313,7 @@ public class Dataset implements DataEntity<Dataset,UUID> {
this.setExternalDatasets(entity.getExternalDatasets());
this.setStatus(entity.getStatus());
this.setProfile(entity.getProfile());
this.setModified(new Date());
if (entity.getCreator() != null) this.creator = entity.getCreator();
}

View File

@ -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<Project,UUID> {
@NamedEntityGraphs({
@NamedEntityGraph(
name = "projectRecentActivity",
attributeNodes = {@NamedAttributeNode(value = "dmps", subgraph = "dmps")},
subgraphs = @NamedSubgraph(name = "dmps", attributeNodes = {@NamedAttributeNode("users")})
)
})
public class Project implements DataEntity<Project, UUID> {
public enum Status {
ACTIVE((short) 1), INACTIVE((short) 0), DELETED((short) 99);
@ -44,6 +48,31 @@ public class Project implements DataEntity<Project,UUID> {
}
}
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<Project,UUID> {
@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<Project,UUID> {
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<Project,UUID> {
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("\"", "&quot;");
} 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<Project,UUID> {
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
}

View File

@ -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);
}
}

View File

@ -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<RecentActivityData> activities = new LinkedList<>();
RecentActivityDataBuilder recentActivityDataBuilder = apiContext.getOperationsContext().getBuilderFactory().getBuilder(RecentActivityDataBuilder.class);
CompletableFuture<List<RecentActivityData>> 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<List<RecentActivityData>> 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<List<RecentActivityData>> 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;
}
}

View File

@ -33,18 +33,18 @@ public class DataManagementPlanManager {
public DataTableData<DataManagementPlanListingModel> getPaged(ApiContext apiContext, DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal) throws Exception {
UserInfo userInfo = new UserInfo();
userInfo.setId(principal.getId());
QueryableList<DMP> items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria());
QueryableList<DMP> items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class));
QueryableList<DMP> authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, userInfo);
QueryableList<DMP> pagedItems = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest);
DataTableData<DataManagementPlanListingModel> dataTable = new DataTableData<DataManagementPlanListingModel>();
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);
}
}

View File

@ -43,17 +43,18 @@ public class DatasetManager {
public DataTableData<DatasetListingModel> getPaged(ApiContext apiContext, DatasetTableRequest datasetTableRequest, Principal principal) throws Exception {
UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build();
QueryableList<eu.eudat.entities.Dataset> items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria());
QueryableList<eu.eudat.entities.Dataset> items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class));
QueryableList<eu.eudat.entities.Dataset> authItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getAuthenticated(items, userInfo);
QueryableList<eu.eudat.entities.Dataset> pagedItems = PaginationManager.applyPaging(authItems, datasetTableRequest);
DataTableData<DatasetListingModel> dataTable = new DataTableData<DatasetListingModel>();
CompletableFuture<List<DatasetListingModel>> itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DatasetListingModel.class)).
CompletableFuture<List<DatasetListingModel>> 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);
});

View File

@ -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<ContentFile> 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);
}
}

View File

@ -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<eu.eudat.models.project.ProjectListingModel> getPaged(ProjectDao projectRepository, ProjectTableRequest projectTableRequest) throws Exception {
public DataTableData<eu.eudat.models.project.ProjectListingModel> getPaged(ProjectDao projectRepository, ProjectTableRequest projectTableRequest, Principal principal) throws Exception {
eu.eudat.entities.UserInfo userInfo = new eu.eudat.entities.UserInfo();
userInfo.setId(principal.getId());
QueryableList<eu.eudat.entities.Project> items = projectRepository.getWithCriteria(projectTableRequest.getCriteria());
QueryableList<eu.eudat.entities.Project> pagedItems = PaginationManager.applyPaging(items, projectTableRequest);
DataTableData<eu.eudat.models.project.ProjectListingModel> dataTable = new DataTableData<eu.eudat.models.project.ProjectListingModel>();
QueryableList<eu.eudat.entities.Project> authItems = projectRepository.getAuthenticated(items, userInfo);
QueryableList<eu.eudat.entities.Project> pagedItems = PaginationManager.applyPaging(authItems, projectTableRequest);
DataTableData<eu.eudat.models.project.ProjectListingModel> 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);
}

View File

@ -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<RecentActivityData> recentActivities;
public List<RecentActivityData> getRecentActivities() {
return recentActivities;
}
public void setRecentActivities(List<RecentActivityData> recentActivities) {
this.recentActivities = recentActivities;
}
}

View File

@ -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;
}
}

View File

@ -1,4 +1,4 @@
package eu.eudat.models.dashboard;
package eu.eudat.models.dashboard.statistics;
public class DashBoardStatistics {
private Long totalDataManagementPlanCount;

View File

@ -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;
}
}

View File

@ -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<eu.eudat.entities.Project, Project> {
private String description;
private List<ContentFile> files;
public UUID getId() {
return id;
@ -152,6 +156,14 @@ public class Project implements DataModel<eu.eudat.entities.Project, Project> {
this.description = description;
}
public List<ContentFile> getFiles() {
return files;
}
public void setFiles(List<ContentFile> 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<eu.eudat.entities.Project, Project> {
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;
}

View File

@ -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<eu.eudat.entities.Project,
private String description;
private List<ContentFile> files;
public UUID getId() {
return id;
@ -152,6 +156,14 @@ public class ProjectListingModel implements DataModel<eu.eudat.entities.Project,
this.description = description;
}
public List<ContentFile> getFiles() {
return files;
}
public void setFiles(List<ContentFile> 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<eu.eudat.entities.Project,
this.created = entity.getCreated().toString();
this.modified = entity.getModified().toString();
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;
}

View File

@ -60,6 +60,8 @@ public interface QueryableList<T extends DataEntity> {
Subquery<Long> subQueryCount(SinglePredicate<T> predicate, List<SelectionField> fields);
<U extends Comparable> QueryableList<T> initSubQuery(Class<U> uClass);
<U extends Comparable> Subquery<U> subQueryMax(SinglePredicate<T> predicate, List<SelectionField> fields, Class<U> uClass);
<U extends Comparable> Subquery<U> subQueryMax(NestedQuerySinglePredicate<T> predicate, List<SelectionField> fields, Class<U> uClass);

View File

@ -28,10 +28,10 @@ public class QueryableHibernateList<T extends DataEntity> implements QueryableLi
private Class<T> tClass;
private Root<T> root;
private Root<T> nestedQueryRoot;
private Subquery<T> subquery;
private Subquery subquery;
private List<SinglePredicate<T>> singlePredicates = new LinkedList<>();
private List<NestedQuerySinglePredicate<T>> nestedPredicates = new LinkedList<>();
private boolean distinct = false;
private List<OrderByPredicate<T>> orderings = new LinkedList<>();
private List<String> fields = new LinkedList<>();
private Integer length;
@ -114,7 +114,7 @@ public class QueryableHibernateList<T extends DataEntity> implements QueryableLi
}
public QueryableList<T> distinct() {
this.query.distinct(true);
this.distinct = true;
return this;
}
@ -126,18 +126,22 @@ public class QueryableHibernateList<T extends DataEntity> implements QueryableLi
public Long count() {
CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root<T> 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<Long> countAsync() {
CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root<T> 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<T extends DataEntity> 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<T> 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<T extends DataEntity> 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<T> 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<T extends DataEntity> implements QueryableLi
@Override
public <U extends Comparable> Subquery<U> subQueryMax(NestedQuerySinglePredicate<T> predicate, List<SelectionField> fields, Class<U> uClass) {
Subquery<U> subquery = this.manager.getCriteriaBuilder().createQuery().subquery(uClass);
this.nestedQueryRoot = subquery.from(this.tClass);
//Subquery<U> 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.<U>get(fields.get(0).getField())));
@ -320,4 +326,10 @@ public class QueryableHibernateList<T extends DataEntity> implements QueryableLi
}
return subquery;
}
public <U extends Comparable> QueryableList<T> initSubQuery(Class<U> uClass) {
this.subquery = this.manager.getCriteriaBuilder().createQuery().subquery(uClass);
this.nestedQueryRoot = subquery.from(this.tClass);
return this;
}
}

View File

@ -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<ContentFile> writeToTempFileSystem(MultipartFile[] multipartFiles) throws IOException;
ContentFile copyFromTempFileSystem(ContentFile file) throws IOException;
Resource readFromFilesystem(String filename, String type, String location) throws IOException;
}

View File

@ -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<ContentFile> writeToTempFileSystem(MultipartFile[] multipartFiles) throws IOException {
List<ContentFile> 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 "";
}
}

View File

@ -37,4 +37,6 @@ public interface DatabaseRepository {
ExternalDatasetDao getExternalDatasetDao();
UserDmpDao getUserDmpDao();
ContentDao getContentDao();
}

View File

@ -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;
}
}

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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/
pdf.converter.url=http://localhost/
files.storage.temp = temp
files.storage.final = final

Binary file not shown.

After

Width:  |  Height:  |  Size: 939 B