package no.niths.aop;
import java.util.GregorianCalendar;
import no.niths.common.helpers.ValidationHelper;
import no.niths.domain.APIEvent;
import no.niths.services.interfaces.APIEventService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* Persists API events.
*
* To persist an event, annotate any public method with @ApiEvent(title = "title).
* The method must be public and take one parameter.
*
* Will persist an APIEvent like this:
* Title = the title from the annotation
* Description = the objects toString()
*
* How to use:
* @ApiEvent(title="Something happened")
* public void anyMethod(Object obj){}
*/
@Aspect
@Component
public class APIEventLogger {
private static final Logger logger = LoggerFactory
.getLogger(APIEventLogger.class);
@Autowired
private APIEventService service;
/**
* Executes after all public methods annotated with @ApiEvent
* and persists the api event
*
* @param pjp The method parameter
* @param apiEvent The annotation
* @throws Throwable
*/
@After("execution(public * *(..)) && @annotation(apiEvent)")
public void saveAPIEvent(JoinPoint pjp, ApiEvent apiEvent) throws Throwable {
logger.debug("onAPICreateEvent() intercepted call");
//Get the title of the apiEvent
String title = apiEvent.title();
if(pjp.getArgs().length >= 1){
loggAPIEvent(title, pjp.getArgs()[0]);
}else{
logger.debug("Parameter list longer then 1 or is 0");
for ( Object object : pjp.getArgs()) {
logger.debug(object.toString());
}
}
}
//Persists an api event to DB
private void loggAPIEvent(String title, Object obj){
logger.debug("Saving api event to db: " + title + ":" + obj.toString());
APIEvent event = new APIEvent(title, obj + "", new GregorianCalendar());
if(ValidationHelper.hasObjectValidAttributes(event)){
service.create(event);
}else{
logger.debug("Object did not pass validation!");
}
}
}