package binky.reportrunner.aspects; import java.util.Calendar; import org.apache.log4j.Logger; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import binky.reportrunner.service.AuditService; @Aspect public class AuditAspect { private AuditService auditService; private boolean logGets=false; private static final Logger logger = Logger.getLogger(AuditAspect.class); @Around("this(binky.reportrunner.service.Auditable)") public Object logExecution(ProceedingJoinPoint pjp) throws Throwable{ long start = Calendar.getInstance().getTimeInMillis(); String module=pjp.getSignature().getDeclaringType().getName(); module = module.substring(module.lastIndexOf(".")+1); Object[] args = pjp.getArgs(); String method = pjp.getSignature().getName(); StringBuilder arguments = new StringBuilder(); boolean first=true; for (Object o : args) { if (!first) {arguments.append(",");} else { first =false; } arguments.append('{'); arguments.append(o); arguments.append('}'); } //bit of a hack to prevent exposing password if (module.equals("binky.reportrunner.service.UserService") && method.equals("changePassword")) { arguments=new StringBuilder("blocked"); } boolean success=false; String errorText="No Error"; try { Object ret= pjp.proceed(); success=true; return ret; } catch (Throwable t) { errorText=t.getMessage(); throw t; } finally { long runTime = Calendar.getInstance().getTimeInMillis()-start; if (logger.isTraceEnabled()) logger.trace("logging a message for:" + module); //hack to cut down on logging if ((!method.startsWith("get")&&!method.startsWith("is")) || logGets) auditService.logAuditEvent(module, success, runTime, arguments.toString(), method,errorText); } } public void setAuditService(AuditService auditService) { this.auditService = auditService; } public void setLogGets(boolean logGets) { this.logGets = logGets; } }