/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2006-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library 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;
* version 2.1 of the License.
*
* This library 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.
*/
package org.geotools.util.logging;
import java.util.logging.Level;
import org.apache.commons.logging.Log;
/**
* An adapter that redirect all Java logging events to the Apache's
* <A HREF="http://jakarta.apache.org/commons/logging/">Commons-logging</A> framework.
*
* @since 2.4
* @source $URL$
* @version $Id$
* @author Martin Desruisseaux
* @author Saul Farber (MassGIS)
*
* @see CommonsLoggerFactory
* @see Logging
*/
final class CommonsLogger extends LoggerAdapter {
/**
* The Apache logger to use.
*/
final Log logger;
/**
* Creates a new logger.
*
* @param name The logger name.
* @param logger The result of {@code LogFactory.getLog(name)}.
*/
public CommonsLogger(final String name, final Log logger) {
super(name);
this.logger = logger;
}
/**
* Do nothing since Commons-Logging doesn't support programmatic change of logging level.
*/
public void setLevel(Level level) {
}
/**
* Returns the level for this logger.
*/
public Level getLevel() {
if (logger.isTraceEnabled()) return Level.FINEST;
if (logger.isDebugEnabled()) return Level.FINE;
if (logger.isInfoEnabled ()) return Level.CONFIG;
if (logger.isWarnEnabled ()) return Level.WARNING;
if (logger.isErrorEnabled()) return Level.SEVERE;
if (logger.isFatalEnabled()) return Level.SEVERE;
return Level.OFF;
}
/**
* Returns {@code true} if the specified level is loggable.
*/
@SuppressWarnings("fallthrough")
public boolean isLoggable(final Level level) {
final int n = level.intValue();
switch (n / 100) {
default: {
switch (n) { // Special cases (should not occur often).
case Integer.MIN_VALUE: return true; // ALL
case Integer.MAX_VALUE: return false; // OFF
default: return n>=0 && logger.isFatalEnabled();
}
}
case 10: return logger.isErrorEnabled(); // SEVERE
case 9: return logger.isWarnEnabled(); // WARNING
case 8: // INFO
case 7: return logger.isInfoEnabled(); // CONFIG
case 6: // (not allocated)
case 5: return logger.isDebugEnabled(); // FINE
case 4: // FINER
case 3: // FINEST
case 2: // (not allocated)
case 1: // (not allocated)
case 0: return logger.isTraceEnabled(); // ALL
}
}
/**
* Logs a record at the specified level.
*/
@Override
@SuppressWarnings("fallthrough")
public void log(final Level level, final String message, final Throwable thrown) {
final int n = level.intValue();
switch (n / 100) {
default: {
// MAX_VALUE is a special value for Level.OFF. Otherwise and
// if positive, log to fatal since we are greater than SEVERE.
if (n != Integer.MAX_VALUE || n >= 0) {
logger.fatal(message, thrown);
}
break;
}
case 10: logger.error(message, thrown); break; // SEVERE
case 9: logger.warn (message, thrown); break; // WARNING
case 8: // INFO
case 7: logger.info (message, thrown); break; // CONFIG
case 6: // (not allocated)
case 5: logger.debug(message, thrown); break; // FINE
case 4: // FINER
case 3: // FINEST
case 2: // (not allocated)
case 1: // (not allocated)
case 0: logger.trace(message, thrown); break; // ALL
}
}
public void severe (String message) {logger.error(message);}
public void warning(String message) {logger.warn (message);}
public void info (String message) {logger.info (message);}
public void config (String message) {logger.info (message);}
public void fine (String message) {logger.debug(message);}
public void finer (String message) {logger.debug(message);}
public void finest (String message) {logger.trace(message);}
}