| Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
| ServiceAspectLayering |
|
| 2.5;2.5 |
| 1 | package org.kuali.student.enrollment.lpr.service.aspect; | |
| 2 | ||
| 3 | import java.lang.reflect.Method; | |
| 4 | ||
| 5 | import java.util.ArrayList; | |
| 6 | import java.util.List; | |
| 7 | ||
| 8 | import org.aspectj.lang.JoinPoint; | |
| 9 | import org.aspectj.lang.ProceedingJoinPoint; | |
| 10 | import org.kuali.student.common.exceptions.OperationFailedException; | |
| 11 | ||
| 12 | ||
| 13 | ||
| 14 | ||
| 15 | ||
| 16 | ||
| 17 | /** | |
| 18 | * | |
| 19 | * @author sambit | |
| 20 | * | |
| 21 | * @param <T> the service this aspect is operating on | |
| 22 | */ | |
| 23 | 0 | public class ServiceAspectLayering<T,P> { |
| 24 | ||
| 25 | List <T> serviceImplObjs; | |
| 26 | ||
| 27 | List<Throwable> includeThrowableClassList ; | |
| 28 | ||
| 29 | List <P> servicePostProcessClasses; | |
| 30 | ||
| 31 | public void setServicePostProcessClasses(List<P> servicePostProcessClasses) { | |
| 32 | 0 | this.servicePostProcessClasses = servicePostProcessClasses; |
| 33 | 0 | } |
| 34 | public void setServiceImpls(List<T> serviceImplObjs) { | |
| 35 | 0 | this.serviceImplObjs = serviceImplObjs; |
| 36 | 0 | } |
| 37 | public void setIncludeThrowableClassList(List <Throwable> serviceExceptionTypes) { | |
| 38 | 0 | this.includeThrowableClassList = serviceExceptionTypes; |
| 39 | 0 | } |
| 40 | /** | |
| 41 | * Aspect method, this is the controller which invokes other impl method using reflection. | |
| 42 | * One of this method could be defined per service or there could just be one generic method for the services in a package. | |
| 43 | * @param call | |
| 44 | * @throws Throwable | |
| 45 | */ | |
| 46 | public Object performLayeringCalls(ProceedingJoinPoint call) throws Throwable{ | |
| 47 | ||
| 48 | 0 | for (Object service : serviceImplObjs){ |
| 49 | ||
| 50 | 0 | for (Method m : service.getClass().getMethods()){ |
| 51 | 0 | if (m.getName().equals(call.getSignature().getName())) { |
| 52 | 0 | m.invoke(service, call.getArgs()); |
| 53 | 0 | break; |
| 54 | } | |
| 55 | } | |
| 56 | } | |
| 57 | 0 | return call.proceed(); |
| 58 | } | |
| 59 | ||
| 60 | /** | |
| 61 | * | |
| 62 | * @param ex | |
| 63 | * @return | |
| 64 | * @throws Throwable | |
| 65 | */ | |
| 66 | public void handleExceptions(Throwable ex) throws OperationFailedException{ | |
| 67 | ||
| 68 | 0 | if (!includeThrowableClassList.contains(ex)) { |
| 69 | 0 | throw new OperationFailedException(ex.getMessage()); |
| 70 | } | |
| 71 | 0 | } |
| 72 | ||
| 73 | ||
| 74 | ||
| 75 | /** | |
| 76 | * The advice used after return | |
| 77 | */ | |
| 78 | ||
| 79 | public void afterReturning( JoinPoint call, Object returnValue) throws Throwable { | |
| 80 | ||
| 81 | 0 | for (Object servicePostProcessClass : servicePostProcessClasses){ |
| 82 | ||
| 83 | 0 | if ( servicePostProcessClass.getClass().getName().contains(call.getTarget().getClass().getName())){ |
| 84 | ||
| 85 | 0 | for (Method m : servicePostProcessClass.getClass().getMethods()){ |
| 86 | 0 | if (m.getName().equals(call.getSignature().getName())) { |
| 87 | 0 | List <Object> argsList = new ArrayList<Object>(); |
| 88 | 0 | argsList.add(0,returnValue); |
| 89 | 0 | argsList.add (1,call.getArgs()); |
| 90 | 0 | m.invoke( servicePostProcessClass, argsList.toArray()); |
| 91 | 0 | break; |
| 92 | } | |
| 93 | } | |
| 94 | } | |
| 95 | } | |
| 96 | 0 | } |
| 97 | ||
| 98 | } | |
| 99 |