You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2022/02/10 19:53:36 UTC
[tomcat] branch main updated: Based on #464. Avoid using null for class loader during lookups
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push:
new e276edc Based on #464. Avoid using null for class loader during lookups
e276edc is described below
commit e276edcee0dd2747909ac7f87e10f3bcf3182413
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Feb 10 19:53:15 2022 +0000
Based on #464. Avoid using null for class loader during lookups
Fall back to the class loader used to load JULI when the thread context
class loader is not set. In a normal Tomcat configuration, this will be
the system class loader.
Based on a pull request by jackshirazi.
---
java/org/apache/juli/ClassLoaderLogManager.java | 49 +++++++++++++++++--------
java/org/apache/juli/FileHandler.java | 2 +-
webapps/docs/changelog.xml | 6 +++
3 files changed, 40 insertions(+), 17 deletions(-)
diff --git a/java/org/apache/juli/ClassLoaderLogManager.java b/java/org/apache/juli/ClassLoaderLogManager.java
index 91d8871..fc51067 100644
--- a/java/org/apache/juli/ClassLoaderLogManager.java
+++ b/java/org/apache/juli/ClassLoaderLogManager.java
@@ -133,8 +133,7 @@ public class ClassLoaderLogManager extends LogManager {
final String loggerName = logger.getName();
- ClassLoader classLoader =
- Thread.currentThread().getContextClassLoader();
+ ClassLoader classLoader = getClassLoader();
ClassLoaderLogInfo info = getClassLoaderInfo(classLoader);
if (info.loggers.containsKey(loggerName)) {
return false;
@@ -224,8 +223,7 @@ public class ClassLoaderLogManager extends LogManager {
*/
@Override
public synchronized Logger getLogger(final String name) {
- ClassLoader classLoader = Thread.currentThread()
- .getContextClassLoader();
+ ClassLoader classLoader = getClassLoader();
return getClassLoaderInfo(classLoader).loggers.get(name);
}
@@ -236,8 +234,7 @@ public class ClassLoaderLogManager extends LogManager {
*/
@Override
public synchronized Enumeration<String> getLoggerNames() {
- ClassLoader classLoader = Thread.currentThread()
- .getContextClassLoader();
+ ClassLoader classLoader = getClassLoader();
return Collections.enumeration(getClassLoaderInfo(classLoader).loggers.keySet());
}
@@ -280,7 +277,7 @@ public class ClassLoaderLogManager extends LogManager {
private synchronized String findProperty(String name) {
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ ClassLoader classLoader = getClassLoader();
ClassLoaderLogInfo info = getClassLoaderInfo(classLoader);
String result = info.props.getProperty(name);
// If the property was not found, and the current classloader had no
@@ -313,7 +310,7 @@ public class ClassLoaderLogManager extends LogManager {
checkAccess();
- readConfiguration(Thread.currentThread().getContextClassLoader());
+ readConfiguration(getClassLoader());
}
@@ -324,7 +321,7 @@ public class ClassLoaderLogManager extends LogManager {
checkAccess();
reset();
- readConfiguration(is, Thread.currentThread().getContextClassLoader());
+ readConfiguration(is, getClassLoader());
}
@@ -337,7 +334,7 @@ public class ClassLoaderLogManager extends LogManager {
// because we have our own shutdown hook
return;
}
- ClassLoader classLoader = thread.getContextClassLoader();
+ ClassLoader classLoader = getClassLoader();
ClassLoaderLogInfo clLogInfo = getClassLoaderInfo(classLoader);
resetLoggers(clLogInfo);
// Do not call super.reset(). It should be a NO-OP as all loggers should
@@ -389,16 +386,17 @@ public class ClassLoaderLogManager extends LogManager {
/**
* Retrieve the configuration associated with the specified classloader. If
- * it does not exist, it will be created.
+ * it does not exist, it will be created. If no class loader is specified,
+ * the class loader used to load this class is used.
*
- * @param classLoader The classloader for which we will retrieve or build the
- * configuration
+ * @param classLoader The class loader for which we will retrieve or build
+ * the configuration
* @return the log configuration
*/
protected synchronized ClassLoaderLogInfo getClassLoaderInfo(ClassLoader classLoader) {
if (classLoader == null) {
- classLoader = ClassLoader.getSystemClassLoader();
+ classLoader = this.getClass().getClassLoader();
}
ClassLoaderLogInfo info = classLoaderLoggers.get(classLoader);
if (info == null) {
@@ -652,7 +650,7 @@ public class ClassLoaderLogManager extends LogManager {
private String replaceWebApplicationProperties(String propName) {
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ ClassLoader cl = getClassLoader();
if (cl instanceof WebappProperties) {
WebappProperties wProps = (WebappProperties) cl;
if ("classloader.webappName".equals(propName)) {
@@ -670,9 +668,28 @@ public class ClassLoaderLogManager extends LogManager {
}
- // ---------------------------------------------------- LogNode Inner Class
+ /**
+ * Obtain the class loader to use to lookup loggers, obtain configuration
+ * etc. The search order is:
+ * <ol>
+ * <li>Thread.currentThread().getContextClassLoader()</li>
+ * <li>The class laoder of this class</li>
+ * </ol>
+ *
+ * @return The class loader to use to lookup loggers, obtain configuration
+ * etc.
+ */
+ static ClassLoader getClassLoader() {
+ ClassLoader result = Thread.currentThread().getContextClassLoader();
+ if (result == null) {
+ result = ClassLoaderLogManager.class.getClassLoader();
+ }
+ return result;
+ }
+ // ---------------------------------------------------- LogNode Inner Class
+
protected static final class LogNode {
Logger logger;
diff --git a/java/org/apache/juli/FileHandler.java b/java/org/apache/juli/FileHandler.java
index ec5bbc8..1895297 100644
--- a/java/org/apache/juli/FileHandler.java
+++ b/java/org/apache/juli/FileHandler.java
@@ -377,7 +377,7 @@ public class FileHandler extends Handler {
String className = this.getClass().getName(); //allow classes to override
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ ClassLoader cl = ClassLoaderLogManager.getClassLoader();
// Retrieve configuration of logging file name
if (rotatable == null) {
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 0bf6ed7..4f4d576 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -129,6 +129,12 @@
Patch provided by Carsten Klein. (michaelo)
</add>
<fix>
+ <pr>464</pr>: Fall back to the class loader used to load JULI when the
+ thread context class loader is not set. In a normal Tomcat
+ configuration, this will be the system class loader. Based on a pull
+ request by jackshirazi. (markt)
+ </fix>
+ <fix>
<pr>469</pr>: Include the Jakarata Annotations API in the classes that
Tomcat will not load from web applications. Pull request provided by
ppkarwasz. (markt)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org