LoggingAdvice.java

package com.tradecloud.infrastructure.logging;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;

public class LoggingAdvice {

    public enum Level {
        DEBUG {

            public void log(Log log, String message) {
                log.debug(message);
            }
        },
        INFO {

            public void log(Log log, String message) {
                log.info(message);
            }
        },
        WARN {

            public void log(Log log, String message) {
                log.warn(message);
            }
        },
        ERROR {

            public void log(Log log, String message) {
                log.error(message);
            }
        };

        abstract void log(Log log, String message);
    }

    private static final String FORMAT = "%s [ %s ] %s.%s (%s) %s";

    private Log log = LogFactory.getLog(LoggingAdvice.class);

    private Level level = Level.DEBUG;

    private String prefix = "exec";

    private String suffix = "";

    public LoggingAdvice() {

    }

    public LoggingAdvice(Level level, Log log, String prefix, String suffix) {
        this.level = level;
        this.log = log;
        this.suffix = suffix;
        this.prefix = prefix;
    }

    /**
     * Log input and return values of this method.
     * 
     * @param pjp
     *            the method to execute.
     * @return what the {@link ProceedingJoinPoint} returns.
     * @throws Throwable
     *             what the {@link ProceedingJoinPoint} throws.
     */
    public Object log(final ProceedingJoinPoint pjp) throws Throwable {
        Object retVal = null;
        try {
            retVal = pjp.proceed();
        } finally {
            StringBuilder args = new StringBuilder();
            for (int x = 0; x < pjp.getArgs().length; x++) {
                String str = String.valueOf(pjp.getArgs()[x]);
                args.append(StringUtils.abbreviate(str, 50));
                if (x != pjp.getArgs().length - 1) {
                    args.append(",");
                }
            }

            level.log(log, String.format(FORMAT, prefix, StringUtils.abbreviate(String.valueOf(retVal), 50), pjp.getTarget().getClass()
                    .getSimpleName(), pjp.getSignature().getName(), args.toString(), suffix));
        }
        return retVal;
    }

}