/[Apache-SVN]/jakarta/commons/proper/logging/trunk/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java
ViewVC logotype

Diff of /jakarta/commons/proper/logging/trunk/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

--- jakarta/commons/proper/logging/trunk/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java	2005/06/02 07:31:22	179545
+++ jakarta/commons/proper/logging/trunk/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java	2005/06/02 07:39:39	179546
@@ -468,20 +468,9 @@ public class LogFactoryImpl extends LogF
      *              it will be.
      */
     protected boolean isJdk13LumberjackAvailable() {
-        
-        logDiagnostic("Checking for Jdk13Lumberjack.");
-        try {
-            createLogFromClass("org.apache.commons.logging.impl.Jdk13LumberjackLogger",
-                               getClass().getName(),
-                               false);
-            // No exception means success
-            logDiagnostic("Found Jdk13Lumberjack.");
-            return true;
-        } catch (Throwable t) {
-            logDiagnostic("Did not find Jdk13Lumberjack.");
-            return false;
-        }
-        
+        return isLogLibraryAvailable(
+                "Jdk13Lumberjack",
+                "org.apache.commons.logging.impl.Jdk13LumberjackLogger");
     }
 
 
@@ -495,19 +484,9 @@ public class LogFactoryImpl extends LogF
      *              it will be.
      */
     protected boolean isJdk14Available() {
-
-        logDiagnostic("Checking for Jdk14.");
-        try {
-            createLogFromClass("org.apache.commons.logging.impl.Jdk14Logger",
-                               getClass().getName(),
-                               false);
-            // No exception means success
-            logDiagnostic("Found Jdk14.");
-            return true;
-        } catch (Throwable t) {
-            logDiagnostic("Did not find Jdk14.");
-            return false;
-        }
+        return isLogLibraryAvailable(
+                "Jdk14",
+                "org.apache.commons.logging.impl.Jdk14Logger");
     }
 
 
@@ -518,19 +497,9 @@ public class LogFactoryImpl extends LogF
      *              it will be.
      */
     protected boolean isLog4JAvailable() {
-
-        logDiagnostic("Checking for Log4J");
-        try {
-            createLogFromClass("org.apache.commons.logging.impl.Log4JLogger",
-                               getClass().getName(),
-                               false);
-            // No exception means success
-            logDiagnostic("Found Log4J.");
-            return true;
-        } catch (Throwable t) {
-            logDiagnostic("Did not find Log4J");
-            return false;
-        }
+        return isLogLibraryAvailable(
+                "Log4J",
+                "org.apache.commons.logging.impl.Log4JLogger");
     }
 
 
@@ -589,6 +558,33 @@ public class LogFactoryImpl extends LogF
     //  ------------------------------------------------------ Private Methods
     
     /**
+     * Utility method to check whether a particular logging library is
+     * present and available for use. Note that this does <i>not</i>
+     * affect the future behaviour of this class.
+     */
+    private boolean isLogLibraryAvailable(String name, String classname) {
+        logDiagnostic("Checking for " + name + ".");
+        try {
+            Log log = createLogFromClass(
+                        classname, 
+                        this.getClass().getName(), // dummy category
+                        false);
+
+            if (log == null) {
+                logDiagnostic("Did not find " + name + ".");
+                return false;
+            } else {
+                logDiagnostic("Found " + name + ".");
+                return true;
+            }
+        } catch(LogConfigurationException e) {
+            logDiagnostic("Logging system " + name + " is available but not useable.");
+            return false;
+        }
+    }
+  
+
+    /**
      * Attempts to create a Log instance for the given category name.
      * Follows the discovery process described in the class javadoc.
      * 
@@ -599,6 +595,7 @@ public class LogFactoryImpl extends LogF
      *                                   instantiated
      */
     private Log discoverLogImplementation(String logCategory)
+    throws LogConfigurationException
     {
         logDiagnostic("Attempting to discover a Log implementation.");
         
@@ -608,101 +605,42 @@ public class LogFactoryImpl extends LogF
         String specifiedLogClassName = findUserSpecifiedLogClassName();
 
         if (specifiedLogClassName != null) {
-            try {
-                // note: createLogFromClass never returns null..
-                result = createLogFromClass(specifiedLogClassName,
-                                            logCategory,
-                                            true);
-                return result;
-            } catch (LogConfigurationException ex) {
-                // this type of exception means we've already output
-                // diagnostics about this issue, etc.; just pass it on
-                throw ex;
-            } catch (Throwable t) {
-                // log problem, and throw a LogConfigurationException
-                // wrapping the Throwable
-                handleFlawedDiscovery(specifiedLogClassName, null, t);
-                
-                // handleFlawedDiscovery should have thrown an LCE, but
-                // in case it didn't we'll throw one.  Inability to
-                // instantiate a user specified class is a fatal error
-                throw new LogConfigurationException("Unable to instantiate "
-                                                    + specifiedLogClassName,
-                                                    t);
+            // note: createLogFromClass never returns null..
+            result = createLogFromClass(specifiedLogClassName,
+                                        logCategory,
+                                        true);
+            if (result == null) {
+                throw new LogConfigurationException(
+                        "User-specified log class " + specifiedLogClassName
+                        + " cannot be found or is not useable.");
             }
-
-            // this if-statement never exits!
+            
+            return result;
         }
         
         // No user specified log; try to discover what's on the classpath
         
         // Try Log4j
-        try {
-            result = createLogFromClass("org.apache.commons.logging.impl.Log4JLogger",
-                                        logCategory,
-                                        true);
-        } catch (LogConfigurationException lce) {
-            
-            // LCE means we had a flawed discovery and already
-            // output diagnostics; just pass it on 
-            throw (LogConfigurationException) lce;
-            
-        } catch (Throwable t) {
-            // Other throwables just mean couldn't load the adapter 
-            // or log4j; continue with discovery
-        }        
+        result = createLogFromClass("org.apache.commons.logging.impl.Log4JLogger",
+                                    logCategory,
+                                    true);
 
         if (result == null) {
-            // Try JDK 1.4 Logging
-            try {
-                result = createLogFromClass("org.apache.commons.logging.impl.Jdk14Logger",
-                                            logCategory,
-                                            true);
-            } catch (LogConfigurationException lce) {
-                
-                // LCE means we had a flawed discovery and already
-                // output diagnostics; just pass it on 
-                throw (LogConfigurationException) lce;
-                
-            } catch (Throwable t) {
-                // Other throwables just mean couldn't load the adapter 
-                // or j.u.l; continue with discovery
-            }
+            result = createLogFromClass("org.apache.commons.logging.impl.Jdk14Logger",
+                                        logCategory,
+                                        true);
         }
 
         if (result == null) {
-            // Try Lumberjack
-            try {
-                result = createLogFromClass("org.apache.commons.logging.impl.Jdk13LumberjackLogger",
-                                            logCategory,
-                                            true);
-            } catch (LogConfigurationException lce) {
-                
-                // LCE means we had a flawed discovery and already
-                // output diagnostics; just pass it on 
-                throw (LogConfigurationException) lce;
-                
-            } catch (Throwable t) {
-                // Other throwables just mean couldn't load the adapter 
-                // or j.u.l; continue with discovery
-            }
+            result = createLogFromClass("org.apache.commons.logging.impl.Jdk13LumberjackLogger",
+                                        logCategory,
+                                        true);
         }
 
         if (result == null) {
-            // Try SimpleLog
-            try {
-                result = createLogFromClass("org.apache.commons.logging.impl.SimpleLog",
-                                            logCategory,
-                                            true);
-            } catch (LogConfigurationException lce) {
-                
-                // LCE means we had a flawed discovery and already
-                // output diagnostics; just pass it up 
-                throw (LogConfigurationException) lce;
-                
-            } catch (Throwable t) {
-                // Other throwables just mean couldn't load the adapter 
-            }
+            result = createLogFromClass("org.apache.commons.logging.impl.SimpleLog",
+                                        logCategory,
+                                        true);
         }
         
         if (result == null) {
@@ -768,57 +706,61 @@ public class LogFactoryImpl extends LogF
      *                       be affected by this method call, <code>false</code>
      *                       otherwise.
      * 
-     * @return  an instance of the given class.  Will not return 
-     *          <code>null</code>.
+     * @return  an instance of the given class, or null if the logging
+     * library associated with the specified adapter is not available.
      *                          
-     * @throws LinkageError if any linkage provoked by this method fails
-     * @throws ExceptionInInitializerError if any initialization provoked
-     *            by this method fails
-     * @throws ClassNotFoundException if the class cannot be located
-     * @throws NoClassDefFoundError if <code>logImplClass</code> could be
-     *                              loaded but the logging implementation it
-     *                              relies on could not be located
-     * @throws LogConfigurationException if the class was loaded but no suitable
-     *                                   logger could be created and this object
-     *                                   is configured to fail in such a
-     *                                   situation
+     * @throws LogConfigurationException if there was a serious error with
+     * configuration and the handleFlawedDiscovery method decided this
+     * problem was fatal.
      */                                  
     private Log createLogFromClass(String logAdapterClass,
                                    String logCategory,
                                    boolean affectState) 
-            throws Throwable {       
+            throws LogConfigurationException {       
 
         logDiagnostic("Attempting to instantiate " + logAdapterClass);
         
-        Class logClass = loadClass(logAdapterClass);
+        Class logClass = null;
         
         Object[] params = { logCategory };
-        Log result = null;
+        Log logAdapter = null;
         Constructor constructor = null;
         try {
+            logClass = loadClass(logAdapterClass);
             constructor = logClass.getConstructor(logConstructorSignature);
-            result = (Log) constructor.newInstance(params);
+            logAdapter = (Log) constructor.newInstance(params);
         } catch (NoClassDefFoundError e) {
-            // We were able to load the adapter but its underlying
-            // logger library could not be found.  This is normal and not
-            // a "flawed discovery", so just throw the error on
-            logDiagnostic("Unable to load logging library used by "
-                          + logAdapterClass);
-            throw e;
-        } catch (Throwable t) {
-            // ExceptionInInitializerError
-            // NoSuchMethodException
-            // InvocationTargetException
-            // ClassCastException
-            // All mean the adapter and underlying logger library were found
-            // but there was a problem creating an instance.
-            // This is a "flawed discovery"            
-            
+            // We were able to load the adapter but it had references to
+            // other classes that could not be found. This simply means that
+            // the underlying logger library could not be found.
+            String msg = "" + e.getMessage();
+            logDiagnostic(
+                    "The logging library used by "
+                    + logAdapterClass
+                    + " is not available: " 
+                    + msg.trim());
+            return null;
+        } catch (ExceptionInInitializerError e) {
+            // A static initializer block or the initializer code associated 
+            // with a static variable on the log adapter class has thrown
+            // an exception.
+            //
+            // We treat this as meaning the adapter's underlying logging
+            // library could not be found.
+            String msg = "" + e.getMessage();
+            logDiagnostic(
+                    "The logging library used by "
+                    + logAdapterClass
+                    + " is not available: "
+                    + msg.trim());
+            return null;
+        } catch(Throwable t) {
+            // handleFlawedDiscovery will determine whether this is a fatal
+            // problem or not. If it is fatal, then a LogConfigurationException
+            // will be thrown.
             handleFlawedDiscovery(logAdapterClass, logClass, t);
-            // handleFlawedDiscovery should have thrown an LCE, but
-            // in case it didn't we'll throw one
-            throw new LogConfigurationException(t);
-        }        
+            return null;
+        }
         
         if (affectState) {
             // We've succeeded, so set instance fields
@@ -838,8 +780,7 @@ public class LogFactoryImpl extends LogF
             }
         }
         
-        return result;      
-        
+        return logAdapter;
     }
     
     

 

infrastructure at apache.org
ViewVC Help
Powered by ViewVC 1.1.26