package nl.iprofs.hippo.cocoon.actions;

import java.util.Map;

import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.cocoon.acting.AbstractAction;
import org.apache.cocoon.environment.Redirector;
import org.apache.cocoon.environment.SourceResolver;

/**
 * An Action which simply logs a message. This action breaks caching and thus isn't intended to 
 * be used in production, but it is extremely useful for debugging.
 * 
 * @author Wouter Zelle
 * @author Nick Stolwijk
 */
public class LogAction extends AbstractAction implements ThreadSafe {

    /**
     * @see org.apache.cocoon.acting.Action#act(org.apache.cocoon.environment.Redirector,
     *      org.apache.cocoon.environment.SourceResolver, java.util.Map,
     *      java.lang.String, org.apache.avalon.framework.parameters.Parameters)
     */
    public Map act(final Redirector redirector, final SourceResolver resolver, final Map objectModel, final String source, final Parameters parameters) throws Exception {
        String msg = parameters.getParameter("msg", null);
        String level = parameters.getParameter("level", "DEBUG");
        LogLevel logLevel = LogLevel.valueOf(level.toUpperCase());
        logLevel.log(getLogger(), msg);

        // don't execute what's inside this action, it's just here to log something
        return null;
    }

    private static enum LogLevel {
        DEBUG {
            @Override
            public void log(final Logger log, final String message) {
                if (log != null && message != null && log.isDebugEnabled()) {
                    log.debug(message);
                }
            }
        },
        INFO {
            @Override
            public void log(final Logger log, final String message) {
                if (log != null && message != null && log.isInfoEnabled()) {
                    log.info(message);
                }
            }
        },
        WARN {
            @Override
            public void log(final Logger log, final String message) {
                if (log != null && message != null && log.isWarnEnabled()) {
                    log.warn(message);
                }
            }
        },
        ERROR {
            @Override
            public void log(final Logger log, final String message) {
                if (log != null && message != null && log.isErrorEnabled()) {
                    log.error(message);
                }
            }
        },
        FATAL {
            @Override
            public void log(final Logger log, final String message) {
                if (log != null && message != null && log.isFatalErrorEnabled()) {
                    log.fatalError(message);
                }
            }
        };
        public abstract void log(Logger log, String message);
    }
}
