package org.kalipo.aop;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.kalipo.config.ErrorCode;
import org.kalipo.web.rest.ExceptionSummary;
import org.kalipo.web.rest.KalipoException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.LinkedList;
import java.util.List;
/**
* Created by damoeb on 17.09.14.
*/
@Aspect
public class ExceptionHandlerAspect {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Around("@within(org.kalipo.aop.KalipoExceptionHandler) || @annotation(org.kalipo.aop.KalipoExceptionHandler)")
public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
try {
// annotation @ExceptionHandler does not work
return joinPoint.proceed();
} catch (ConstraintViolationException e) {
List<String> errors = new LinkedList<>();
for (ConstraintViolation violation : e.getConstraintViolations()) {
errors.add(violation.getPropertyPath().toString() + "." + violation.getMessage());
}
throw new KalipoException(ErrorCode.INVALID_PARAMETER, StringUtils.join(errors, ", "));
} catch (KalipoException e) {
throw e;
// return handleKalipoException(e);
} catch (Throwable e) {
throw new KalipoException(ErrorCode.UNKNOWN_ERROR, e.getMessage());
}
}
@ExceptionHandler(KalipoException.class)
private ResponseEntity<ExceptionSummary> handleKalipoException(KalipoException exception) {
return new ResponseEntity<>(new ExceptionSummary(exception), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(ConstraintViolationException.class)
private ResponseEntity<ExceptionSummary> handleConstraintViolationException(ConstraintViolationException exception) {
List<String> errors = new LinkedList<>();
exception.getConstraintViolations().forEach(violation -> errors.add(violation.getMessage()));
return new ResponseEntity<>(new ExceptionSummary(StringUtils.join(errors, ", ")), HttpStatus.BAD_REQUEST);
}
}