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);
+            }
+        }
+    }
+
 }

Reply via email to