Repository: struts Updated Branches: refs/heads/develop 951a4f8f2 -> 326e89daf
Refactors logger factory to simplify adding new implementations Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/326e89da Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/326e89da Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/326e89da Branch: refs/heads/develop Commit: 326e89daf387db6e906083463974095b6bb0e242 Parents: 951a4f8 Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Sun Apr 19 14:03:27 2015 +0200 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Sun Apr 19 14:03:27 2015 +0200 ---------------------------------------------------------------------- .../xwork2/util/logging/LoggerFactory.java | 93 +++++++++++++------- 1 file changed, 61 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/326e89da/xwork-core/src/main/java/com/opensymphony/xwork2/util/logging/LoggerFactory.java ---------------------------------------------------------------------- diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/util/logging/LoggerFactory.java b/xwork-core/src/main/java/com/opensymphony/xwork2/util/logging/LoggerFactory.java index 6326cfc..0e7445b 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/util/logging/LoggerFactory.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/util/logging/LoggerFactory.java @@ -17,10 +17,13 @@ package com.opensymphony.xwork2.util.logging; import com.opensymphony.xwork2.XWorkConstants; import com.opensymphony.xwork2.XWorkException; +import com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory; import com.opensymphony.xwork2.util.logging.jdk.JdkLoggerFactory; import com.opensymphony.xwork2.util.logging.log4j2.Log4j2LoggerFactory; import com.opensymphony.xwork2.util.logging.slf4j.Slf4jLoggerFactory; +import java.util.LinkedList; +import java.util.List; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -32,6 +35,14 @@ public abstract class LoggerFactory { private static final ReadWriteLock lock = new ReentrantReadWriteLock(); private static LoggerFactory factory; + private static final List<LoggerClass> loggers = new LinkedList<LoggerClass>(){ + { + add(new LoggerClass<CommonsLoggerFactory>("org.apache.commons.logging.LogFactory", CommonsLoggerFactory.class)); + add(new LoggerClass<Slf4jLoggerFactory>("org.slf4j.LoggerFactory", Slf4jLoggerFactory.class)); + add(new LoggerClass<Log4j2LoggerFactory>("org.apache.logging.log4j.LogManager", Log4j2LoggerFactory.class)); + } + }; + public static void setLoggerFactory(LoggerFactory factory) { lock.writeLock().lock(); try { @@ -39,7 +50,6 @@ public abstract class LoggerFactory { } finally { lock.writeLock().unlock(); } - } public static Logger getLogger(Class<?> cls) { @@ -62,37 +72,7 @@ public abstract class LoggerFactory { lock.writeLock().lock(); try { if (factory == null) { - String userLoggerFactory = System.getProperty(XWorkConstants.XWORK_LOGGER_FACTORY); - if (userLoggerFactory != null) { - try { - Class clazz = Class.forName(userLoggerFactory); - factory = (LoggerFactory) clazz.newInstance(); - } catch (Exception e) { - throw new XWorkException("System property [" + XWorkConstants.XWORK_LOGGER_FACTORY + - "] was defined as [" + userLoggerFactory + "] but there is a problem to use that LoggerFactory!", e); - } - } else { - try { - Class.forName("org.apache.commons.logging.LogFactory"); - factory = new com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory(); - } catch (ClassNotFoundException ex) { - //commons-logging not found try slf4j LogFactory - try { - Class.forName("org.slf4j.LoggerFactory"); - factory = new Slf4jLoggerFactory(); - } catch (ClassNotFoundException cnfex) { - // slf4j not found try if log4j2 is available in classpath - try { - Class.forName("org.apache.logging.log4j.LogManager"); - factory = new Log4j2LoggerFactory(); - } catch (ClassNotFoundException cnfex2) { - // log4j2 not found, falling back to jdk logging - factory = new JdkLoggerFactory(); - } - factory = new JdkLoggerFactory(); - } - } - } + createLoggerFactory(); } return factory; } finally { @@ -100,8 +80,57 @@ public abstract class LoggerFactory { } } + private static void createLoggerFactory() { + String userLoggerFactory = System.getProperty(XWorkConstants.XWORK_LOGGER_FACTORY); + if (userLoggerFactory != null) { + try { + Class clazz = Class.forName(userLoggerFactory); + factory = (LoggerFactory) clazz.newInstance(); + } catch (Exception e) { + throw new XWorkException("System property [" + XWorkConstants.XWORK_LOGGER_FACTORY + + "] was defined as [" + userLoggerFactory + "] but there is a problem to use that LoggerFactory!", e); + } + } else { + factory = new JdkLoggerFactory(); + for (LoggerClass logger : loggers) { + if (logger.isSupported()) { + factory = logger.createInstance(); + break; + } + } + } + } + protected abstract Logger getLoggerImpl(Class<?> cls); protected abstract Logger getLoggerImpl(String name); + private static class LoggerClass<T extends LoggerFactory> { + + private final String loggerClazzName; + private final Class<T> loggerImplClazz; + + public LoggerClass(String loggerClazzName, Class<T> loggerImplClazz) { + this.loggerClazzName = loggerClazzName; + this.loggerImplClazz = loggerImplClazz; + } + + public boolean isSupported() { + try { + Class.forName(loggerClazzName); + return true; + } catch (ClassNotFoundException ignore) { + return false; + } + } + + public LoggerFactory createInstance() { + try { + return loggerImplClazz.newInstance(); + } catch (Exception e) { + throw new XWorkException(e); + } + } + } + }