diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/src/main/java/eu/eudat/controllers/DMPs.java index 5013c81b3..1c853b800 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/DMPs.java @@ -5,6 +5,7 @@ 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; @@ -19,17 +20,13 @@ 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 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.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.*; import eu.eudat.dao.entities.DMPDao; import eu.eudat.dao.entities.DMPProfileDao; @@ -66,9 +63,9 @@ public class DMPs { @Autowired private ServiceDao serviceDao; @Autowired private UserInfoDao userInfoDao; - + @RequestMapping(method = RequestMethod.POST, value = { "/dmps/getPaged" }, consumes = "application/json", produces="application/json") - public @ResponseBody ResponseItem> getPaged(@RequestBody DataManagementPlanTableRequest dataManagementPlanTableRequest) { + public @ResponseBody ResponseItem> getPaged( @RequestBody DataManagementPlanTableRequest dataManagementPlanTableRequest) { try { DataTableData dataTable = new DataManagementPlanManager().getPaged(dMPDao, dataManagementPlanTableRequest); diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/controllerhandler/ControllerErrorHandler.java b/dmp-backend/src/main/java/eu/eudat/controllers/controllerhandler/ControllerErrorHandler.java new file mode 100644 index 000000000..b78fc3554 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/controllers/controllerhandler/ControllerErrorHandler.java @@ -0,0 +1,64 @@ +package eu.eudat.controllers.controllerhandler; + +import eu.eudat.models.errormodels.ValidationErrorContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.http.HttpStatus; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import java.util.List; +import java.util.Locale; + +/** + * Created by ikalyvas on 12/22/2017. + */ +@ControllerAdvice +public class ControllerErrorHandler { + + private MessageSource messageSource; + + @Autowired + public ControllerErrorHandler(MessageSource messageSource) { + this.messageSource = messageSource; + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ResponseBody + public ValidationErrorContext processValidationError(MethodArgumentNotValidException ex) { + BindingResult result = ex.getBindingResult(); + List fieldErrors = result.getFieldErrors(); + + return processFieldErrors(fieldErrors); + } + + private ValidationErrorContext processFieldErrors(List fieldErrors) { + ValidationErrorContext dto = new ValidationErrorContext(); + + for (FieldError fieldError: fieldErrors) { + String localizedErrorMessage = resolveLocalizedErrorMessage(fieldError); + dto.addFieldError(fieldError.getField(), localizedErrorMessage); + } + + return dto; + } + + private String resolveLocalizedErrorMessage(FieldError fieldError) { + Locale currentLocale = LocaleContextHolder.getLocale(); + String localizedErrorMessage = messageSource.getMessage(fieldError, currentLocale); + + if (localizedErrorMessage.equals(fieldError.getDefaultMessage())) { + String[] fieldErrorCodes = fieldError.getCodes(); + localizedErrorMessage = fieldErrorCodes[0]; + } + + return localizedErrorMessage; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/models/dmp/DataManagementPlanTableRequest.java b/dmp-backend/src/main/java/eu/eudat/models/dmp/DataManagementPlanTableRequest.java index 63d6f3ac7..e8a3284ea 100644 --- a/dmp-backend/src/main/java/eu/eudat/models/dmp/DataManagementPlanTableRequest.java +++ b/dmp-backend/src/main/java/eu/eudat/models/dmp/DataManagementPlanTableRequest.java @@ -3,6 +3,10 @@ package eu.eudat.models.dmp; import eu.eudat.models.criteria.DataManagementPlanCriteria; import eu.eudat.models.helpers.requests.RequestItem; import eu.eudat.models.helpers.requests.TableRequest; +import org.springframework.validation.Errors; +import org.springframework.validation.ValidationUtils; +import org.springframework.validation.Validator; public class DataManagementPlanTableRequest extends TableRequest { + } diff --git a/dmp-backend/src/main/java/eu/eudat/models/errormodels/FieldError.java b/dmp-backend/src/main/java/eu/eudat/models/errormodels/FieldError.java new file mode 100644 index 000000000..561ecea3a --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/models/errormodels/FieldError.java @@ -0,0 +1,15 @@ +package eu.eudat.models.errormodels; + +/** + * Created by ikalyvas on 12/22/2017. + */ +public class FieldError { + private String field; + + private String message; + + public FieldError(String field, String message) { + this.field = field; + this.message = message; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/models/errormodels/ValidationErrorContext.java b/dmp-backend/src/main/java/eu/eudat/models/errormodels/ValidationErrorContext.java new file mode 100644 index 000000000..de0768770 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/models/errormodels/ValidationErrorContext.java @@ -0,0 +1,20 @@ +package eu.eudat.models.errormodels; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by ikalyvas on 12/22/2017. + */ +public class ValidationErrorContext { + private List fieldErrors = new ArrayList<>(); + + public ValidationErrorContext() { + + } + + public void addFieldError(String path, String message) { + FieldError error = new FieldError(path, message); + fieldErrors.add(error); + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java b/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java index 1b547d749..5216b14d6 100644 --- a/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java +++ b/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java @@ -20,7 +20,8 @@ public interface QueryableList { QueryableList distinct(); - QueryableList orderBy(OrderByPredicate predicate); + QueryableList orderByAsc(OrderByPredicate predicate); + QueryableList orderByDesc(OrderByPredicate predicate); Long count(); } 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 425cabc9d..edf267909 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 @@ -78,8 +78,13 @@ public class QueryableHibernateList implements QueryableList { return this; } - public QueryableList orderBy(OrderByPredicate predicate) { - this.query.orderBy(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.root)); + public QueryableList orderByAsc(OrderByPredicate predicate) { + this.query.orderBy(this.manager.getCriteriaBuilder().desc(predicate.applyPredicate(this.root))); + return this; + } + + public QueryableList orderByDesc(OrderByPredicate predicate) { + this.query.orderBy(this.manager.getCriteriaBuilder().asc(predicate.applyPredicate(this.root))); return this; } diff --git a/dmp-backend/src/main/java/eu/eudat/queryable/predicates/OrderByPredicate.java b/dmp-backend/src/main/java/eu/eudat/queryable/predicates/OrderByPredicate.java index 1484500aa..346bfd253 100644 --- a/dmp-backend/src/main/java/eu/eudat/queryable/predicates/OrderByPredicate.java +++ b/dmp-backend/src/main/java/eu/eudat/queryable/predicates/OrderByPredicate.java @@ -2,9 +2,10 @@ package eu.eudat.queryable.predicates; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.Order; +import javax.persistence.criteria.Path; import javax.persistence.criteria.Root; public interface OrderByPredicate { - Order applyPredicate(CriteriaBuilder builder, Root root); + Path applyPredicate(Root root); } diff --git a/dmp-backend/src/main/java/eu/eudat/validators/DataManagementTableRequestValidator.java b/dmp-backend/src/main/java/eu/eudat/validators/DataManagementTableRequestValidator.java new file mode 100644 index 000000000..4036c217e --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/validators/DataManagementTableRequestValidator.java @@ -0,0 +1,28 @@ +package eu.eudat.validators; + +import eu.eudat.models.dmp.DataManagementPlanTableRequest; +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; + +/** + * Created by ikalyvas on 12/22/2017. + */ +@Component("beforeCreateDataManagementTableRequestValidator") +public class DataManagementTableRequestValidator implements Validator { + @Override + public boolean supports(Class aClass) { + return DataManagementPlanTableRequest.class.equals(aClass); + } + + @Override + public void validate(Object obj, Errors errors) { + DataManagementPlanTableRequest user = (DataManagementPlanTableRequest) obj; + if(user.getOffset()<0){ + errors.rejectValue("offset", "Offset Cannot Be Negative"); + } + if(user.getLength()<0){ + errors.rejectValue("length", "Length Cannot Be Negative"); + } + } +}