blob: 6081a6567c579177fb04bc01deceb5d548f3c891 [file] [log] [blame]
/****************************************************************
* 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()
}
}