/*
* Copyright (C) 2014 University of Freiburg
*
* This file is part of SMTInterpol.
*
* SMTInterpol is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* SMTInterpol is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with SMTInterpol. If not, see <http://www.gnu.org/licenses/>.
*/
package de.uni_freiburg.informatik.ultimate.smtinterpol.samples.util;
import java.io.IOException;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import de.uni_freiburg.informatik.ultimate.smtinterpol.LogProxy;
/**
* Sample LogProxy implementation for the Log4j version 1.2 logging system.
* This implementation might serve as a basic for implementing the LogProxy
* interface interface for different logging systems.
* @author Juergen Christ
*/
public class Log4jProxy implements LogProxy {
/**
* A wrapper used to call <code>String.format</code> to produce the string
* representation of this object.
* @author Juergen Christ
*/
private static class StringFormatter {
private final String mFormat;
private final Object[] mArgs;
public StringFormatter(String format, Object[] args) {
mFormat = format;
mArgs = args;
}
@Override
public String toString() {
return String.format(mFormat, mArgs);
}
}
private final Logger mLogger;
public Log4jProxy(Logger logger) {
mLogger = logger;
}
@Override
public void setLoglevel(int level) {
switch(level) {
case LogProxy.LOGLEVEL_OFF:
mLogger.setLevel(Level.OFF);
break;
case LogProxy.LOGLEVEL_FATAL:
mLogger.setLevel(Level.FATAL);
break;
case LogProxy.LOGLEVEL_ERROR:
mLogger.setLevel(Level.ERROR);
break;
case LogProxy.LOGLEVEL_WARN:
mLogger.setLevel(Level.WARN);
break;
case LogProxy.LOGLEVEL_INFO:
mLogger.setLevel(Level.INFO);
break;
case LogProxy.LOGLEVEL_DEBUG:
mLogger.setLevel(Level.DEBUG);
break;
case LogProxy.LOGLEVEL_TRACE:
mLogger.setLevel(Level.TRACE);
break;
default:
throw new InternalError("Unknown loglevel: " + level);
}
}
@Override
public int getLoglevel() {
final Level lvl = mLogger.getLevel();
if (lvl == Level.OFF) {
return LogProxy.LOGLEVEL_OFF;
}
if (lvl == Level.FATAL) {
return LogProxy.LOGLEVEL_FATAL;
}
if (lvl == Level.ERROR) {
return LogProxy.LOGLEVEL_ERROR;
}
if (lvl == Level.WARN) {
return LogProxy.LOGLEVEL_WARN;
}
if (lvl == Level.INFO) {
return LogProxy.LOGLEVEL_INFO;
}
if (lvl == Level.DEBUG) {
return LogProxy.LOGLEVEL_DEBUG;
}
if (lvl == Level.TRACE) {
return LogProxy.LOGLEVEL_TRACE;
}
throw new InternalError("Unknown loglevel: " + lvl);
}
@Override
public boolean isFatalEnabled() {
return mLogger.isEnabledFor(Level.FATAL);
}
@Override
public void fatal(String msg, Object... params) {
mLogger.fatal(new StringFormatter(msg, params));
}
@Override
public void fatal(Object msg) {
mLogger.fatal(msg);
}
@Override
public void outOfMemory(String msg) {
/* Do not implement this. Log4j produces a LogRecord that needs
* additional memory quite likely causing the next OutOfMemoryError to
* be thrown.
*/
}
@Override
public boolean isErrorEnabled() {
return mLogger.isEnabledFor(Level.ERROR);
}
@Override
public void error(String msg, Object... params) {
mLogger.error(new StringFormatter(msg, params));
}
@Override
public void error(Object msg) {
mLogger.error(msg);
}
@Override
public boolean isWarnEnabled() {
return mLogger.isEnabledFor(Level.WARN);
}
@Override
public void warn(String msg, Object... params) {
mLogger.warn(new StringFormatter(msg, params));
}
@Override
public void warn(Object msg) {
mLogger.warn(msg);
}
@Override
public boolean isInfoEnabled() {
return mLogger.isInfoEnabled();
}
@Override
public void info(String msg, Object... params) {
mLogger.info(new StringFormatter(msg, params));
}
@Override
public void info(Object msg) {
mLogger.info(msg);
}
@Override
public boolean isDebugEnabled() {
return mLogger.isDebugEnabled();
}
@Override
public void debug(String msg, Object... params) {
mLogger.debug(new StringFormatter(msg, params));
}
@Override
public void debug(Object msg) {
mLogger.debug(msg);
}
@Override
public boolean isTraceEnabled() {
return mLogger.isTraceEnabled();
}
@Override
public void trace(String msg, Object... params) {
mLogger.trace(new StringFormatter(msg, params));
}
@Override
public void trace(Object msg) {
mLogger.trace(msg);
}
@Override
public boolean canChangeDestination() {
// I assume the loger is managed by some external log4j configurator.
return false;
}
@Override
public void changeDestination(String newDest) throws IOException {
throw new InternalError("This should never be called!");
}
@Override
public String getDestination() {
return mLogger.getName(); // Essentially a dummy
}
}