You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rd...@apache.org on 2006/02/07 21:48:06 UTC

svn commit: r375696 - in /jakarta/commons/proper/logging/trunk/src: java/org/apache/commons/logging/impl/LogFactoryImpl.java test/org/apache/commons/logging/tccl/BadTCCLTestCase.java test/org/apache/commons/logging/tccl/NullTCCLTestCase.java

Author: rdonkin
Date: Tue Feb  7 12:48:02 2006
New Revision: 375696

URL: http://svn.apache.org/viewcvs?rev=375696&view=rev
Log:
Added catch and retry using class classloader block. This should hopefully address the cases where the TCCL is not set reasonably.

Added:
    jakarta/commons/proper/logging/trunk/src/test/org/apache/commons/logging/tccl/BadTCCLTestCase.java
    jakarta/commons/proper/logging/trunk/src/test/org/apache/commons/logging/tccl/NullTCCLTestCase.java
Modified:
    jakarta/commons/proper/logging/trunk/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java

Modified: jakarta/commons/proper/logging/trunk/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/logging/trunk/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java?rev=375696&r1=375695&r2=375696&view=diff
==============================================================================
--- jakarta/commons/proper/logging/trunk/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java (original)
+++ jakarta/commons/proper/logging/trunk/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java Tue Feb  7 12:48:02 2006
@@ -853,7 +853,41 @@
                     + " from classloader "
                     + objectId(currentCL));
             try {
-                Class c = Class.forName(logAdapterClassName, true, currentCL);
+                Class c = null;
+                try {
+                    c = Class.forName(logAdapterClassName, true, currentCL);
+                } catch (ClassNotFoundException originalClassNotFoundException) {
+                    // The current classloader was unable to find the log adapter 
+                    // in this or any ancestor classloader. There's no point in
+                    // trying higher up in the hierarchy in this case..
+                    String msg = "" + originalClassNotFoundException.getMessage();
+                    logDiagnostic(
+                        "The log adapter "
+                        + logAdapterClassName
+                        + " is not available via classloader " 
+                        + objectId(currentCL)
+                        + ": "
+                        + msg.trim());
+                    try {
+                        // Try the class classloader.
+                        // This may work in cases where the TCCL
+                        // does not contain the code executed or JCL.
+                        // This behaviour indicates that the application 
+                        // classloading strategy is not consistent with the
+                        // Java 1.2 classloading guidelines but JCL can
+                        // and so should handle this case.
+                        c = Class.forName(logAdapterClassName);
+                    } catch (ClassNotFoundException secondaryClassNotFoundException) {
+                        // no point continuing: this adapter isn't available
+                        msg = "" + secondaryClassNotFoundException.getMessage();
+                        logDiagnostic(
+                            "The log adapter "
+                            + logAdapterClassName
+                            + " is not available via the LogFactoryImpl class classloader: "
+                            + msg.trim());
+                        break;
+                    }
+                }
                 constructor = c.getConstructor(logConstructorSignature);
                 Object o = constructor.newInstance(params);
 
@@ -879,19 +913,6 @@
                 // LogConfigurationException if it regards this problem as
                 // fatal, and just return if not.
                 handleFlawedHierarchy(currentCL, c);
-            } catch (ClassNotFoundException e) {
-                // The current classloader was unable to find the log adapter 
-                // in this or any ancestor classloader. There's no point in
-                // trying higher up in the hierarchy in this case..
-                String msg = "" + e.getMessage();
-                logDiagnostic(
-                    "The log adapter "
-                    + logAdapterClassName
-                    + " is not available via classloader " 
-                    + objectId(currentCL)
-                    + ": "
-                    + msg.trim());
-                break;
             } catch (NoClassDefFoundError e) {
                 // We were able to load the adapter but it had references to
                 // other classes that could not be found. This simply means that

Added: jakarta/commons/proper/logging/trunk/src/test/org/apache/commons/logging/tccl/BadTCCLTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/logging/trunk/src/test/org/apache/commons/logging/tccl/BadTCCLTestCase.java?rev=375696&view=auto
==============================================================================
--- jakarta/commons/proper/logging/trunk/src/test/org/apache/commons/logging/tccl/BadTCCLTestCase.java (added)
+++ jakarta/commons/proper/logging/trunk/src/test/org/apache/commons/logging/tccl/BadTCCLTestCase.java Tue Feb  7 12:48:02 2006
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.logging.tccl;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.logging.PathableClassLoader;
+import org.apache.commons.logging.PathableTestSuite;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+/**
+ * Simulates the case when TCCL is badly set and cannot load JCL.
+ */
+public class BadTCCLTestCase extends TestCase {
+
+    public static Test suite() throws Exception {
+        PathableClassLoader contextClassLoader = new PathableClassLoader(null);
+        contextClassLoader.useSystemLoader("junit.");
+        PathableTestSuite suite = new PathableTestSuite(BadTCCLTestCase.class, contextClassLoader);
+        return suite;
+    }
+
+    // test methods
+    
+    /**
+     * This test just tests that a log implementation can be found
+     * by the LogFactory.
+     */
+    public void testGetLog() {
+         Log log = LogFactory.getLog(BadTCCLTestCase.class);
+         log.debug("Hello, Mum");
+    }
+}

Added: jakarta/commons/proper/logging/trunk/src/test/org/apache/commons/logging/tccl/NullTCCLTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/logging/trunk/src/test/org/apache/commons/logging/tccl/NullTCCLTestCase.java?rev=375696&view=auto
==============================================================================
--- jakarta/commons/proper/logging/trunk/src/test/org/apache/commons/logging/tccl/NullTCCLTestCase.java (added)
+++ jakarta/commons/proper/logging/trunk/src/test/org/apache/commons/logging/tccl/NullTCCLTestCase.java Tue Feb  7 12:48:02 2006
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.logging.tccl;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.logging.PathableTestSuite;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+/**
+ * Simulates the case when TCCL is set to NULL.
+ */
+public class NullTCCLTestCase extends TestCase {
+
+    public static Test suite() throws Exception {;
+        PathableTestSuite suite = new PathableTestSuite(NullTCCLTestCase.class, null);
+        return suite;
+    }
+
+    // test methods
+    
+    /**
+     * This test just tests that a log implementation can be found
+     * by the LogFactory.
+     */
+    public void testGetLog() {
+         Log log = LogFactory.getLog(NullTCCLTestCase.class);
+         log.debug("Hello, Mum");
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org