001package gudusoft.gsqlparser.util;
002
003import java.util.logging.Level;
004
005/**
006 * A factory for {@link Logger} instances that uses SLF4J if present, falling back on a
007 * java.util.logging implementation otherwise.
008 */
009public class LoggerFactory {
010    static final boolean USE_SLF4J;
011
012    static {
013        boolean useSLF4J;
014        try {
015            Class.forName("org.slf4j.impl.StaticLoggerBinder");
016            useSLF4J = true;
017        } catch (Exception e) {
018            useSLF4J = false;
019        }
020        USE_SLF4J = useSLF4J;
021    }
022
023    /**
024     * Get a {@link Logger} instance for the given host class.
025     *
026     * @param hostClass the host class from which log messages will be issued
027     * @return a Logger
028     */
029    public static Logger getLogger(Class<?> hostClass) {
030        if (USE_SLF4J) {
031            return new SLF4JLogger(hostClass);
032        }
033
034        return new JDKLogger(hostClass);
035    }
036
037    private static class JDKLogger implements Logger {
038        final java.util.logging.Logger logger;
039
040        public JDKLogger(Class<?> hostClass) {
041            logger = java.util.logging.Logger.getLogger(hostClass.getCanonicalName());
042        }
043
044        @Override
045        public void trace(String message) {
046            if (logger.isLoggable(Level.FINEST)) {
047                logger.log(Level.FINEST, message);
048            }
049        }
050
051        @Override
052        public void info(String message) {
053            if (logger.isLoggable(Level.INFO)) {
054                logger.log(Level.INFO, message);
055            }
056        }
057
058        @Override
059        public void warn(String message) {
060            if (logger.isLoggable(Level.WARNING)) {
061                logger.log(Level.WARNING, message);
062            }
063        }
064
065        @Override
066        public void error(String message, Throwable t) {
067            if (logger.isLoggable(Level.SEVERE)) {
068                logger.log(Level.SEVERE, message, t);
069            }
070        }
071    }
072
073    private static class SLF4JLogger implements Logger {
074        final org.slf4j.Logger logger;
075
076        SLF4JLogger(Class<?> hostClass) {
077            logger = org.slf4j.LoggerFactory.getLogger(hostClass);
078        }
079
080        @Override
081        public void trace(String message) {
082            if (logger.isTraceEnabled()) {
083                logger.trace(message);
084            }
085        }
086
087        @Override
088        public void info(String message) {
089            if (logger.isInfoEnabled()) {
090                logger.info(message);
091            }
092        }
093
094        @Override
095        public void warn(String message) {
096            if (logger.isWarnEnabled()) {
097                logger.warn(message);
098            }
099        }
100
101        @Override
102        public void error(String message, Throwable t) {
103            if (logger.isErrorEnabled()) {
104                logger.error(message, t);
105            }
106        }
107    }
108}