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