001package gudusoft.gsqlparser.util;
002
003import java.util.logging.Level;
004
005public class LoggerFactory {
006
007    private static final boolean SLF4J_ENABLED = detectSlf4j();
008
009    private static boolean detectSlf4j() {
010        try {
011            Class.forName("org.slf4j.impl.StaticLoggerBinder");
012            return true;
013        } catch (Throwable e) {
014            return false;
015        }
016    }
017
018    public static Logger getLogger(Class<?> ownerClass) {
019        return SLF4J_ENABLED ? new Slf4jDelegate(ownerClass) : new JdkDelegate(ownerClass);
020    }
021
022    private static class JdkDelegate implements Logger {
023        private final java.util.logging.Logger julLogger;
024
025        JdkDelegate(Class<?> type) {
026            this.julLogger = java.util.logging.Logger.getLogger(type.getCanonicalName());
027        }
028
029        @Override
030        public void trace(String msg) {
031            log(Level.FINEST, msg, null);
032        }
033
034        @Override
035        public void info(String msg) {
036            log(Level.INFO, msg, null);
037        }
038
039        @Override
040        public void warn(String msg) {
041            log(Level.WARNING, msg, null);
042        }
043
044        @Override
045        public void error(String msg, Throwable ex) {
046            log(Level.SEVERE, msg, ex);
047        }
048
049        @Override
050        public void error(String msg) {
051            log(Level.SEVERE, msg, null);
052        }
053
054        private void log(Level level, String message, Throwable error) {
055            if (julLogger.isLoggable(level)) {
056                if (error == null) {
057                    julLogger.log(level, message);
058                } else {
059                    julLogger.log(level, message, error);
060                }
061            }
062        }
063    }
064
065    private static class Slf4jDelegate implements Logger {
066        private final org.slf4j.Logger slf4jLogger;
067
068        Slf4jDelegate(Class<?> type) {
069            this.slf4jLogger = org.slf4j.LoggerFactory.getLogger(type);
070        }
071
072        @Override
073        public void trace(String msg) {
074            if (slf4jLogger.isTraceEnabled()) slf4jLogger.trace(msg);
075        }
076
077        @Override
078        public void info(String msg) {
079            if (slf4jLogger.isInfoEnabled()) slf4jLogger.info(msg);
080        }
081
082        @Override
083        public void warn(String msg) {
084            if (slf4jLogger.isWarnEnabled()) slf4jLogger.warn(msg);
085        }
086
087        @Override
088        public void error(String msg, Throwable ex) {
089            if (slf4jLogger.isErrorEnabled()) slf4jLogger.error(msg, ex);
090        }
091
092        @Override
093        public void error(String msg) {
094            if (slf4jLogger.isErrorEnabled()) slf4jLogger.error(msg);
095        }
096    }
097}