package net.techreadiness.aspect; import javax.inject.Inject; import net.techreadiness.annotation.CoreDataModificationStatus; import net.techreadiness.service.DataModificationStatus; import net.techreadiness.service.DataModificationStatus.ModificationState; import net.techreadiness.service.ServiceContext; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Aspect @Component public class DataModificationStatusAspect { @Inject DataModificationStatus dataModificationStatus; /** * Setup our pointcut. This is looking for any usage of the annotation {@code CoreDataModificationStatus}. */ @Pointcut("bean(*ServiceImpl)") public void extensionPointcut() { // Point cut definition } @Order(value = 2) @Around("extensionPointcut() && @annotation(coreDataModificationStatus) && args(sc,..)") public Object interceptExtensionPoint(ProceedingJoinPoint p, CoreDataModificationStatus coreDataModificationStatus, ServiceContext sc) throws Throwable { Object ret = null; dataModificationStatus.setModificationType(coreDataModificationStatus.modificationType()); dataModificationStatus.setModificationState(ModificationState.REQUESTED); try { ret = p.proceed(); } catch (Throwable e) { dataModificationStatus.setModificationState(ModificationState.FAILURE); throw e; } dataModificationStatus.setModificationState(ModificationState.SUCCESS); return ret; } }