/**
*
*/
package fr.cedrik.email.pop3.commands;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.impl.SimpleLogger;
import org.slf4j.impl.SimpleLoggerAccess;
import fr.cedrik.email.pop3.Context;
import fr.cedrik.email.pop3.POP3Command;
import fr.cedrik.email.pop3.ResponseStatus;
import fr.cedrik.util.IteratorChain;
/**
* @author Cédrik LIME
*/
public class LOGGER extends BasePOP3Command implements POP3Command {
public LOGGER() {
}
@Override
public boolean isValid(Context context) {
return true;
}
@Override
public Iterator<String> call(Context context) throws IOException {
if (StringUtils.isEmpty(context.inputArgs)) {
// list all available loggers
Collection<SimpleLogger> allLoggers = SimpleLoggerAccess.getAllLoggers();
List<String> result = new ArrayList<String>(allLoggers.size() + 1);
result.add(ResponseStatus.POSITIVE.toString("loggers list follows (root logger: " + Logger.ROOT_LOGGER_NAME + ')'));
for (SimpleLogger logger : allLoggers) {
result.add(SimpleLoggerAccess.getLevelName(logger) + ' ' + logger.getName());
}
return result.iterator();
} else {
// set logger level
String requestedLoggerName;
String requestedLevelName;
SimpleLogger requestedLogger;
StringTokenizer tokenizer = new StringTokenizer(context.inputArgs);
if (tokenizer.countTokens() != 2) {
return new IteratorChain<String>(ResponseStatus.NEGATIVE.toString(getClass().getSimpleName()+" loggerName levelName"));
}
requestedLoggerName = tokenizer.nextToken();
requestedLogger = SimpleLoggerAccess.getLogger(requestedLoggerName);
if (requestedLogger == null) {
return new IteratorChain<String>(ResponseStatus.NEGATIVE.toString("no such logger: " + requestedLoggerName));
}
requestedLevelName = tokenizer.nextToken();
try {
SimpleLoggerAccess.levelNameToInt(requestedLevelName);
} catch (IllegalArgumentException noInput) {
return new IteratorChain<String>(ResponseStatus.NEGATIVE.toString("bad level name: " + requestedLevelName));
}
SimpleLoggerAccess.changeLoggerLevel(requestedLogger, requestedLevelName);
return new IteratorChain<String>(ResponseStatus.POSITIVE.toString("logger " + requestedLogger.getName() + " changed to " + requestedLevelName));
}
}
}