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        private void log(Level level, String message, Throwable error) {
050            if (julLogger.isLoggable(level)) {
051                if (error == null) {
052                    julLogger.log(level, message);
053                } else {
054                    julLogger.log(level, message, error);
055                }
056            }
057        }
058    }
059
060    private static class Slf4jDelegate implements Logger {
061        private final org.slf4j.Logger slf4jLogger;
062
063        Slf4jDelegate(Class<?> type) {
064            this.slf4jLogger = org.slf4j.LoggerFactory.getLogger(type);
065        }
066
067        @Override
068        public void trace(String msg) {
069            if (slf4jLogger.isTraceEnabled()) slf4jLogger.trace(msg);
070        }
071
072        @Override
073        public void info(String msg) {
074            if (slf4jLogger.isInfoEnabled()) slf4jLogger.info(msg);
075        }
076
077        @Override
078        public void warn(String msg) {
079            if (slf4jLogger.isWarnEnabled()) slf4jLogger.warn(msg);
080        }
081
082        @Override
083        public void error(String msg, Throwable ex) {
084            if (slf4jLogger.isErrorEnabled()) slf4jLogger.error(msg, ex);
085        }
086    }
087}