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