This commit is contained in:
annampak 2018-01-02 18:29:38 +02:00
commit 18155fb5ee
21 changed files with 173 additions and 2197 deletions

View File

@ -2,17 +2,11 @@ package eu.eudat.controllers;
import java.util.*;
import java.util.stream.Collectors;
import javax.transaction.Transactional;
import javax.validation.Valid;
import eu.eudat.entities.DMP;
import eu.eudat.entities.Dataset;
import eu.eudat.entities.UserInfo;
import eu.eudat.models.criteria.DataManagementPlanCriteria;
import eu.eudat.models.criteria.OrganisationCriteria;
import eu.eudat.models.criteria.ResearcherCriteria;
import eu.eudat.models.dmp.DataManagementPlan;
import eu.eudat.models.dmp.DataManagementPlanCriteriaRequest;
import eu.eudat.models.dmp.DataManagementPlanTableRequest;
@ -20,11 +14,10 @@ import eu.eudat.models.helpers.DataTableData;
import eu.eudat.models.helpers.responses.*;
import eu.eudat.models.listingmodels.DataManagementPlanListingModel;
import eu.eudat.models.security.Principal;
import eu.eudat.validators.DataManagementTableRequestValidator;
import eu.eudat.validators.DataManagementPlanTableRequestValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
@ -41,7 +34,6 @@ import eu.eudat.dao.entities.RegistryDao;
import eu.eudat.dao.entities.ResearcherDao;
import eu.eudat.dao.entities.ServiceDao;
import eu.eudat.dao.entities.UserInfoDao;
import eu.eudat.entities.responses.IDLabelPair;
import eu.eudat.managers.DataManagementPlanManager;
@ -63,12 +55,15 @@ public class DMPs {
@Autowired private ServiceDao serviceDao;
@Autowired private UserInfoDao userInfoDao;
@InitBinder
protected void initBinder(WebDataBinder binder){
binder.setValidator(new DataManagementPlanTableRequestValidator());
}
@RequestMapping(method = RequestMethod.POST, value = { "/dmps/getPaged" }, consumes = "application/json", produces="application/json")
public @ResponseBody ResponseItem<DataTableData<DataManagementPlanListingModel>> getPaged( @RequestBody DataManagementPlanTableRequest dataManagementPlanTableRequest) {
public @ResponseBody ResponseItem<DataTableData<DataManagementPlanListingModel>> getPaged(@Valid @RequestBody DataManagementPlanTableRequest dataManagementPlanTableRequest) {
try {
DataTableData<DataManagementPlanListingModel> dataTable = new DataManagementPlanManager().getPaged(dMPDao, dataManagementPlanTableRequest);
return new ResponseItem<DataTableData<DataManagementPlanListingModel>>().status(HttpStatus.OK).payload(dataTable);
} catch (Exception ex) {

View File

@ -7,6 +7,8 @@ import eu.eudat.queryable.QueryableList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Set;
/**
* Created by giannis on 7/17/2017.
*/
@ -19,6 +21,10 @@ public class DatabaseService<T extends DataEntity<T>> {
return this.databaseCtx.getQueryable(tClass);
}
public QueryableList<T> getQueryable(Class<T> tClass,Set<String> hints) {
return this.databaseCtx.getQueryable(tClass).setHints(hints);
}
public T createOrUpdate(T item, Class<T> tClass) {
return this.databaseCtx.createOrUpdate(item, tClass);
}

View File

@ -35,7 +35,7 @@ public class DMPDaoImpl implements DMPDao {
@Override
public QueryableList<DMP> getWithCriteria(DataManagementPlanCriteria criteria) {
QueryableList<DMP> query = databaseService.getQueryable(DMP.class);
QueryableList<DMP> query = databaseService.getQueryable(DMP.class,DMP.getHints());
if(criteria.getLike()!=null&&!criteria.getLike().isEmpty())query.where((builder, root) -> builder.like(root.get("label"),"%"+criteria.getLike()+"%"));
if(criteria.getPeriodEnd()!=null)query.where((builder, root) -> builder.lessThan(root.get("created"),criteria.getPeriodEnd()));
if(criteria.getPeriodStart()!=null)query.where((builder, root) -> builder.greaterThan(root.get("created"),criteria.getPeriodStart()));

View File

@ -32,7 +32,7 @@ public class DatasetDaoImpl implements DatasetDao {
@Override
public QueryableList<Dataset> getWithCriteria(DatasetCriteria criteria) {
QueryableList<Dataset> query = databaseService.getQueryable(Dataset.class);
QueryableList<Dataset> query = databaseService.getQueryable(Dataset.class,Dataset.getHints());
if(criteria.getLike()!=null&&!criteria.getLike().isEmpty())query.where((builder, root) -> builder.like(root.get("label"),"%"+criteria.getLike()+"%"));
if(criteria.getStatus()!=null)query.where((builder, root) -> builder.equal(root.get("status"),criteria.getStatus()));
if(criteria.getPeriodEnd()!=null)query.where((builder, root) -> builder.lessThan(root.get("created"),criteria.getPeriodEnd()));

View File

@ -2,20 +2,9 @@ package eu.eudat.entities;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;
import java.util.UUID;
import java.util.*;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
@ -26,10 +15,23 @@ import com.fasterxml.jackson.annotation.ObjectIdGenerators;
@Entity
@Table(name="\"DMP\"")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id", scope = DMP.class)
@NamedEntityGraphs({
@NamedEntityGraph(
name = "organisationsAndResearchers",
attributeNodes = {@NamedAttributeNode("organisations"),@NamedAttributeNode("researchers")}),
@NamedEntityGraph(
name = "fullyDetailed",
attributeNodes = {
@NamedAttributeNode("project"),@NamedAttributeNode("profile"),
@NamedAttributeNode("users"),@NamedAttributeNode("organisations"),@NamedAttributeNode("researchers")})
})
public class DMP implements Serializable,DataEntity<DMP> {
public static Set<String> getHints() {
return hints;
}
private static final Set<String> hints = new HashSet<>(Arrays.asList("organisationsAndResearchers", "fullyDetailed"));
private static final long serialVersionUID = -8263056535208547615L;
@ -53,7 +55,7 @@ public class DMP implements Serializable,DataEntity<DMP> {
private Set<Dataset> dataset;
@ManyToOne(fetch = FetchType.EAGER)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "\"Project\"")
private Project project;
@ -62,7 +64,7 @@ public class DMP implements Serializable,DataEntity<DMP> {
@Column(name = "\"AssociatedDmps\"", columnDefinition = "xml", nullable = true)
private String associatedDmps;
@ManyToOne(fetch = FetchType.EAGER)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "\"Profile\"")
private DMPProfile profile;

View File

@ -1,7 +1,11 @@
package eu.eudat.entities;
import java.util.Map;
import java.util.Set;
public interface DataEntity<T> {
void update(T entity);
Object[] getKeys();
}

View File

@ -2,20 +2,9 @@ package eu.eudat.entities;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;
import java.util.UUID;
import java.util.*;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
@ -25,9 +14,22 @@ import com.fasterxml.jackson.annotation.ObjectIdGenerators;
@Entity
@Table(name="\"Dataset\"")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Dataset implements DataEntity<Dataset> {
@NamedEntityGraphs({
@NamedEntityGraph(
name = "datasetreferences",
attributeNodes = {@NamedAttributeNode("services"),@NamedAttributeNode("dataRepositories"),@NamedAttributeNode("registries")}),
@NamedEntityGraph(
name = "datasetFullyDetailed",
attributeNodes = {
@NamedAttributeNode("dmp"),@NamedAttributeNode("profile"),@NamedAttributeNode("creator"),
@NamedAttributeNode("services"),@NamedAttributeNode("dataRepositories"),@NamedAttributeNode("registries")})
})public class Dataset implements DataEntity<Dataset> {
public static Set<String> getHints() {
return hints;
}
private static final Set<String> hints = new HashSet<>(Arrays.asList("datasetreferences", "datasetFullyDetailed"));
private static final long serialVersionUID = 3575723814399553259L;
public Dataset () {}
@ -43,7 +45,7 @@ public class Dataset implements DataEntity<Dataset> {
private String label;
@ManyToOne(fetch = FetchType.EAGER)
@ManyToOne(fetch = FetchType.LAZY)
// @Cascade(value=org.hibernate.annotations.CascadeType.ALL)
@JoinColumn(name = "\"DMP\"", nullable = true)
private DMP dmp;
@ -57,7 +59,7 @@ public class Dataset implements DataEntity<Dataset> {
private String properties;
@ManyToOne(fetch = FetchType.EAGER)
@ManyToOne(fetch = FetchType.LAZY)
//@Cascade(value=org.hibernate.annotations.CascadeType.ALL)
@JoinColumn(name = "\"Profile\"", nullable = true)
private DatasetProfile profile;
@ -100,7 +102,7 @@ public class Dataset implements DataEntity<Dataset> {
@Column(name = "\"Modified\"")
private Date modified = new Date();
@ManyToOne(fetch = FetchType.EAGER)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "\"Creator\"", nullable = true)
private UserInfo creator;

View File

@ -56,7 +56,7 @@ public class Registry implements Serializable,DataEntity<Registry> {
private String definition;
@OneToMany(fetch = FetchType.EAGER)
@OneToMany(fetch = FetchType.LAZY)
@JoinTable(name="\"DatasetRegistry\"",
joinColumns={@JoinColumn(name="\"Registry\"", referencedColumnName="\"ID\"")},
inverseJoinColumns={@JoinColumn(name="\"Dataset\"", referencedColumnName="\"ID\"")}

View File

@ -25,6 +25,7 @@ public class DataManagementPlanManager {
public DataTableData<DataManagementPlanListingModel> getPaged(DMPDao dmpsRepository, DataManagementPlanTableRequest dataManagementPlanTableRequest) throws IllegalAccessException, InstantiationException{
QueryableList<DMP> items = dmpsRepository.getWithCriteria(dataManagementPlanTableRequest.getCriteria());
QueryableList<DMP> pagedItems = PaginationManager.applyPaging(items,dataManagementPlanTableRequest);
if(dataManagementPlanTableRequest.getWithHint())pagedItems.withHint("fullyDetailed");
List<DataManagementPlanListingModel> datamanagementPlans = new DomainModelConverter<eu.eudat.entities.DMP, DataManagementPlanListingModel>().fromDataModel( pagedItems.toList(), DataManagementPlanListingModel.class);
DataTableData<DataManagementPlanListingModel> dataTable = new DataTableData<DataManagementPlanListingModel>();
dataTable.setData(datamanagementPlans);

View File

@ -27,6 +27,7 @@ public class DatasetManager {
public DataTableData<DatasetListingModel> getPaged(DatasetDao datatasetRepository, DatasetTableRequest datasetTableRequest) throws IllegalAccessException, InstantiationException{
QueryableList<eu.eudat.entities.Dataset> items = datatasetRepository.getWithCriteria(datasetTableRequest.getCriteria());
QueryableList<eu.eudat.entities.Dataset> pagedItems = PaginationManager.applyPaging( items ,datasetTableRequest);
if(datasetTableRequest.getWithHint())pagedItems.withHint("datasetFullyDetailed");
List<DatasetListingModel> datasets = new DomainModelConverter<eu.eudat.entities.Dataset, DatasetListingModel>().fromDataModel( pagedItems.toList(), DatasetListingModel.class);
DataTableData<DatasetListingModel> dataTable = new DataTableData<DatasetListingModel>();
dataTable.setData(datasets);

View File

@ -1,11 +1,12 @@
package eu.eudat.managers;
import eu.eudat.entities.DataEntity;
import eu.eudat.models.helpers.requests.TableRequest;
import eu.eudat.queryable.QueryableList;
public class PaginationManager {
public static <T> QueryableList<T> applyPaging(QueryableList<T> items, TableRequest tableRequest){
public static <T extends DataEntity<T>> QueryableList<T> applyPaging(QueryableList<T> items, TableRequest tableRequest){
if(tableRequest.getLength()!=null)items.take(tableRequest.getLength());
if(tableRequest.getOffset()!=null)items.skip(tableRequest.getOffset());
return items;

View File

@ -8,6 +8,22 @@ public class FieldError {
private String message;
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public FieldError(String field, String message) {
this.field = field;
this.message = message;

View File

@ -9,6 +9,14 @@ import java.util.List;
public class ValidationErrorContext {
private List<FieldError> fieldErrors = new ArrayList<>();
public List<FieldError> getFieldErrors() {
return fieldErrors;
}
public void setFieldErrors(List<FieldError> fieldErrors) {
this.fieldErrors = fieldErrors;
}
public ValidationErrorContext() {
}

View File

@ -1,6 +1,7 @@
package eu.eudat.models.helpers.requests;
public abstract class RequestItem<T>{
private boolean withHint;
private T criteria;
public T getCriteria() {
@ -10,4 +11,12 @@ public abstract class RequestItem<T>{
public void setCriteria(T criteria) {
this.criteria = criteria;
}
public boolean getWithHint() {
return withHint;
}
public void setWithHint(boolean withHint) {
this.withHint = withHint;
}
}

View File

@ -1,13 +1,16 @@
package eu.eudat.queryable;
import eu.eudat.entities.DataEntity;
import eu.eudat.queryable.predicates.OrderByPredicate;
import eu.eudat.queryable.predicates.SelectPredicate;
import eu.eudat.queryable.predicates.SinglePredicate;
import javax.xml.crypto.Data;
import java.util.List;
import java.util.Set;
public interface QueryableList<T> {
public interface QueryableList<T extends DataEntity<T>> {
QueryableList<T> where(SinglePredicate<T> predicate);
<R> List<R> select(SelectPredicate<T, R> predicate);
@ -22,6 +25,7 @@ public interface QueryableList<T> {
QueryableList<T> orderByAsc(OrderByPredicate<T> predicate);
QueryableList<T> orderByDesc(OrderByPredicate<T> predicate);
QueryableList<T> setHints(Set<String> hints);
void withHint(String hint);
Long count();
}

View File

@ -2,6 +2,7 @@ package eu.eudat.queryable.hibernatequeryablelist;
import eu.eudat.entities.DataEntity;
import eu.eudat.queryable.QueryableList;
import eu.eudat.queryable.predicates.OrderByPredicate;
import eu.eudat.queryable.predicates.SelectPredicate;
@ -15,8 +16,10 @@ import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class QueryableHibernateList<T> implements QueryableList<T> {
public class QueryableHibernateList<T extends DataEntity<T>> implements QueryableList<T> {
private EntityManager manager;
private CriteriaQuery<T> query;
@ -25,6 +28,8 @@ public class QueryableHibernateList<T> implements QueryableList<T> {
private LinkedList<Predicate> predicates = new LinkedList<Predicate>();
private Integer length;
private Integer offset;
private Set<String> hints;
private String hint;
public QueryableHibernateList(EntityManager manager, Class<T> tClass) {
this.manager = manager;
this.tClass = tClass;
@ -35,6 +40,14 @@ public class QueryableHibernateList<T> implements QueryableList<T> {
return this;
}
public void withHint(String hint){
this.hint = hint;
}
public QueryableList<T> setHints(Set<String> hints){
this.hints = hints;
return this;
}
public QueryableHibernateList<T> setEntity(Class<T> type) {
CriteriaBuilder builder = this.manager.getCriteriaBuilder();
this.query = builder.createQuery(type);
@ -106,6 +119,21 @@ public class QueryableHibernateList<T> implements QueryableList<T> {
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)){
List ids = typedQuery.getResultList().stream().map(item->item.getKeys()[0]).collect(Collectors.toList());
typedQuery = queryWithHint(ids);
}
return typedQuery.getResultList();
}
private TypedQuery<T> queryWithHint(List ids){
CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder();
CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(tClass);
Root<T> criteriaRoot = criteriaQuery.from(this.tClass);
criteriaQuery.where(criteriaRoot.get("id").in(ids));
TypedQuery<T> typedQuery = this.manager.createQuery(criteriaQuery);
typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint));
return typedQuery;
}
}

View File

@ -8,8 +8,7 @@ import org.springframework.validation.Validator;
/**
* Created by ikalyvas on 12/22/2017.
*/
@Component("beforeCreateDataManagementTableRequestValidator")
public class DataManagementTableRequestValidator implements Validator {
public class DataManagementPlanTableRequestValidator implements Validator {
@Override
public boolean supports(Class<?> aClass) {
return DataManagementPlanTableRequest.class.equals(aClass);
@ -19,10 +18,10 @@ public class DataManagementTableRequestValidator implements Validator {
public void validate(Object obj, Errors errors) {
DataManagementPlanTableRequest user = (DataManagementPlanTableRequest) obj;
if(user.getOffset()<0){
errors.rejectValue("offset", "Offset Cannot Be Negative");
errors.rejectValue("offset", "datamanagementplanrequest.offset.negative");
}
if(user.getLength()<0){
errors.rejectValue("length", "Length Cannot Be Negative");
errors.rejectValue("length", "datamanagementplanrequest.length.negative");
}
}
}

View File

@ -5,9 +5,9 @@
##########################Persistence##########################################
database.driver-class-name=org.postgresql.Driver
database.url = jdbc:postgresql://develdb1.madgik.di.uoa.gr:5432/dmptool
database.username = dmptool
database.password = dmpt00lu$r
database.url = jdbc:postgresql://localhost:5432/dmptool
database.username = postgres
database.password = zxcvbnm
##########################/Persistence##########################################
###################Allowed Proxy Service Host ############################

View File

@ -0,0 +1,2 @@
datamanagementplanrequest.length.negative=table length cannot be negative
datamanagementplanrequest.offset.negative=table offset cannot be negative

View File

@ -0,0 +1,2 @@
datamanagementplanrequest.length.negative=Το πληθος των σειρων στο table δεν μπορει να ειναι αρνητικο
datamanagementplanrequest.offset.negative=Το offset των τιμων δεν μπορει να ειναι αρνητικο

File diff suppressed because it is too large Load Diff