alb3rtuk

Java code posted by alb3rtuk
created at 17 Jun 17:47

Edit | Back
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package gov.hi.dhs.fmm.lib.db;

import gov.hi.dhs.fmm.lib.exceptions.ClientErrorException;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.dao.DataIntegrityViolationException;

/**
 * Due to the nature of the @Around annotation, there can only be one concrete extension of this
 * class at anytime
 */
@Aspect
public abstract class AbstractPersistenceExceptionInterceptor {

    /**
     * Wraps method to catch database persistence related errors and handle them
     *
     * @param pjp {@link ProceedingJoinPoint}
     * @param interceptPersistenceException {@link InterceptPersistenceException}, contains entity
     *     specific translator class
     * @return join point proceed
     * @throws Throwable for exception
     */
    @Around(value = "@annotation(interceptPersistenceException)")
    public Object handlePersistenceException(
            ProceedingJoinPoint pjp, InterceptPersistenceException interceptPersistenceException)
            throws Throwable {
        try {
            return pjp.proceed();
        } catch (DataIntegrityViolationException e) {
            throw handleDataIntegrityViolationException(
                    interceptPersistenceException.translator(),
                    e.getMostSpecificCause().getMessage());
        }
    }

    /**
     * Wraps method to catch database persistence related errors and handle them
     *
     * @param translatorClass ConstraintTranslator class which will be instantiated in this method.
     *     NOTE: Due to coming from annotation, the amount of generic typing that we can perform is
     *     limited.
     * @param errorMessage message taken from root cause of {@link DataIntegrityViolationException}
     * @return ClientErrorException with user friendly message
     * @throws IllegalAccessException for instancing translator class
     * @throws InstantiationException for instancing translator class
     */
    protected abstract ClientErrorException handleDataIntegrityViolationException(
            Class<? extends ConstraintTranslator<?>> translatorClass, String errorMessage)
            throws IllegalAccessException, InstantiationException;
}
2.25 KB in 5 ms with coderay