org.apache.jsieve.commands.extensions.Log.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.jsieve.commands.extensions.Log.java

Source

/****************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one   *
 * or more contributor license agreements.  See the NOTICE file *
 * distributed with this work for additional information        *
 * regarding copyright ownership.  The ASF licenses this file   *
 * to you under the Apache License, Version 2.0 (the            *
 * "License"); you may not use this file except in compliance   *
 * with the License.  You may obtain a copy of the License at   *
 *                                                              *
 *   http://www.apache.org/licenses/LICENSE-2.0                 *
 *                                                              *
 * Unless required by applicable law or agreed to in writing,   *
 * software distributed under the License is distributed on an  *
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
 * KIND, either express or implied.  See the License for the    *
 * specific language governing permissions and limitations      *
 * under the License.                                           *
 ****************************************************************/

package org.apache.jsieve.commands.extensions;

import static org.apache.jsieve.commands.extensions.LogLevelTags.DEBUG_TAG;
import static org.apache.jsieve.commands.extensions.LogLevelTags.ERROR_TAG;
import static org.apache.jsieve.commands.extensions.LogLevelTags.FATAL_TAG;
import static org.apache.jsieve.commands.extensions.LogLevelTags.INFO_TAG;
import static org.apache.jsieve.commands.extensions.LogLevelTags.TRACE_TAG;
import static org.apache.jsieve.commands.extensions.LogLevelTags.WARN_TAG;

import java.util.List;
import java.util.ListIterator;

import org.apache.jsieve.Argument;
import org.apache.jsieve.Arguments;
import org.apache.jsieve.Block;
import org.apache.jsieve.SieveContext;
import org.apache.jsieve.StringListArgument;
import org.apache.jsieve.TagArgument;
import org.apache.jsieve.commands.AbstractCommand;
import org.apache.jsieve.exception.SieveException;
import org.apache.jsieve.exception.SyntaxException;
import org.apache.jsieve.mail.MailAdapter;

/**
 * <p>
 * Class Log is an extension that implements a Command to write messages to the
 * Sieve Log. The BNF syntax is...
 * </p>
 * <code>log [(:fatal / :error / :warn / :info / :debug / :trace)] string</code>
 * <p>
 * The default log level is :info.
 * </p>
 */
public class Log extends AbstractCommand {
    /**
     * Constructor for Log.
     */
    public Log() {
        super();
    }

    /**
     * @see org.apache.jsieve.commands.AbstractCommand#executeBasic(MailAdapter,
     *      Arguments, Block, SieveContext)
     */
    protected Object executeBasic(MailAdapter mail, Arguments arguments, Block block, SieveContext context)
            throws SieveException {
        String logLevel = null;
        String message = null;

        // First MAY be a tag argument of fatal, error, warn, info, debug or
        // trace.
        // default is info.
        final ListIterator<Argument> argumentsIter = arguments.getArgumentList().listIterator();
        boolean stop = false;

        // Tag processing
        while (!stop && argumentsIter.hasNext()) {
            final Argument argument = argumentsIter.next();
            if (argument instanceof TagArgument) {
                final String tag = ((TagArgument) argument).getTag();

                // LogLevel?
                if (null == logLevel && (tag.equals(FATAL_TAG) || tag.equals(ERROR_TAG) || tag.equals(WARN_TAG)
                        || tag.equals(INFO_TAG) || tag.equals(DEBUG_TAG) || tag.equals(TRACE_TAG)))
                    logLevel = tag;
                else
                    throw context.getCoordinate().syntaxException("Found unexpected TagArgument");
            } else {
                // Stop when a non-tag argument is encountered
                argumentsIter.previous();
                stop = true;
            }
        }

        // Next MUST be a String
        if (argumentsIter.hasNext()) {
            final Argument argument = argumentsIter.next();
            if (argument instanceof StringListArgument) {
                List<String> strings = ((StringListArgument) argument).getList();
                if (1 == strings.size())
                    message = strings.get(0);
            }
        }
        if (null == message)
            throw context.getCoordinate().syntaxException("Expecting a String");

        // Everthing else is an error
        if (argumentsIter.hasNext())
            throw context.getCoordinate().syntaxException("Found unexpected arguments");

        log(null == logLevel ? ":info" : logLevel, message, context);

        return null;
    }

    /**
     * Method log.
     * 
     * @param logLevel
     * @param message
     * @throws SyntaxException
     */
    protected void log(String logLevel, String message, SieveContext context) throws SyntaxException {
        if (logLevel.equals(INFO_TAG))
            logInfo(message, context);
        else if (logLevel.equals(ERROR_TAG))
            logError(message, context);
        else if (logLevel.equals(WARN_TAG))
            logWarn(message, context);
        else if (logLevel.equals(DEBUG_TAG))
            logDebug(message, context);
        else if (logLevel.equals(FATAL_TAG))
            logFatal(message, context);
        else if (logLevel.equals(TRACE_TAG))
            logTrace(message, context);
        else
            throw context.getCoordinate()
                    .syntaxException(new StringBuilder("Unsupported logging level: ").append(logLevel));
    }

    /**
     * Method logFatal.
     * 
     * @param message not null
     * @param sieveContext not null
     */
    protected void logFatal(String message, SieveContext sieveContext) {
        org.apache.commons.logging.Log log = sieveContext.getLog();
        if (log.isFatalEnabled())
            log.fatal(message);
    }

    /**
     * Method logWarn.
     * 
     * @param message not null
     * @param context not null
     */
    protected void logWarn(String message, SieveContext context) {
        org.apache.commons.logging.Log log = context.getLog();
        if (log.isWarnEnabled())
            log.warn(message);
    }

    /**
     * Method logInfo.
     * 
     * @param message not null
     * @param context not null
     */
    protected void logInfo(String message, SieveContext context) {
        org.apache.commons.logging.Log log = context.getLog();
        if (log.isInfoEnabled())
            log.info(message);
    }

    /**
     * Method logDebug.
     * 
     * @param message not null
     * @param context not null
     */
    protected void logDebug(String message, SieveContext context) {
        org.apache.commons.logging.Log log = context.getLog();
        if (log.isDebugEnabled())
            log.debug(message);
    }

    /**
     * Method logTrace.
     * 
     * @param message not null
     * @param context not null
     */
    protected void logTrace(String message, SieveContext context) {
        org.apache.commons.logging.Log log = context.getLog();
        if (log.isTraceEnabled())
            log.trace(message);
    }

    /**
     * Method logError.
     * 
     * @param message not null
     * @param context not null
     */
    protected void logError(String message, SieveContext context) {
        org.apache.commons.logging.Log log = context.getLog();
        if (log.isErrorEnabled())
            log.error(message);
    }

    /**
     * @see org.apache.jsieve.commands.AbstractCommand#validateArguments(Arguments,
     *      SieveContext)
     */
    protected void validateArguments(Arguments arguments, SieveContext context) throws SieveException {
        // Validation is performed in executeBasic()
    }

}