You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2022/01/05 18:11:29 UTC

[logging-log4j2] branch release-2.x updated (ffa606e -> 909c348)

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a change to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git.


    from ffa606e  Fix indentation.
     new 2827b5b  Log4j 1.2 bridge adds org.apache.log4j.helpers.Loader.
     new 909c348  Log4j 1.2 bridge adds org.apache.log4j.helpers.Loader.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../main/java/org/apache/log4j/helpers/Loader.java | 180 +++++++++++++++++++++
 src/changes/changes.xml                            |   7 +-
 2 files changed, 185 insertions(+), 2 deletions(-)
 create mode 100644 log4j-1.2-api/src/main/java/org/apache/log4j/helpers/Loader.java

[logging-log4j2] 01/02: Log4j 1.2 bridge adds org.apache.log4j.helpers.Loader.

Posted by gg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 2827b5b38c91a9d6e0a13442bf4dcb1f7617cc58
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Wed Jan 5 13:11:18 2022 -0500

    Log4j 1.2 bridge adds org.apache.log4j.helpers.Loader.
---
 .../main/java/org/apache/log4j/helpers/Loader.java | 180 +++++++++++++++++++++
 1 file changed, 180 insertions(+)

diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/Loader.java b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/Loader.java
new file mode 100644
index 0000000..9e8ed40
--- /dev/null
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/Loader.java
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.log4j.helpers;
+
+import java.io.InterruptedIOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URL;
+
+/**
+ * Loads resources (or images) from various sources.
+ */
+public class Loader {
+
+    static final String TSTR = "Caught Exception while in Loader.getResource. This may be innocuous.";
+
+    // We conservatively assume that we are running under Java 1.x
+    static private boolean java1 = true;
+
+    static private boolean ignoreTCL = false;
+
+    static {
+        String prop = OptionConverter.getSystemProperty("java.version", null);
+
+        if (prop != null) {
+            int i = prop.indexOf('.');
+            if (i != -1) {
+                if (prop.charAt(i + 1) != '1')
+                    java1 = false;
+            }
+        }
+        String ignoreTCLProp = OptionConverter.getSystemProperty("log4j.ignoreTCL", null);
+        if (ignoreTCLProp != null) {
+            ignoreTCL = OptionConverter.toBoolean(ignoreTCLProp, true);
+        }
+    }
+
+    /**
+     * This method will search for <code>resource</code> in different places. The search order is as follows:
+     * <ol>
+     * <p>
+     * <li>Search for <code>resource</code> using the thread context class loader under Java2. If that fails, search for
+     * <code>resource</code> using the class loader that loaded this class (<code>Loader</code>). Under JDK 1.1, only the
+     * the class loader that loaded this class (<code>Loader</code>) is used.
+     * </p>
+     * <p>
+     * <li>Try one last time with <code>ClassLoader.getSystemResource(resource)</code>, that is is using the system class
+     * loader in JDK 1.2 and virtual machine's built-in class loader in JDK 1.1.
+     * </p>
+     * </ol>
+     */
+    static public URL getResource(String resource) {
+        ClassLoader classLoader = null;
+        URL url = null;
+
+        try {
+            if (!java1 && !ignoreTCL) {
+                classLoader = getTCL();
+                if (classLoader != null) {
+                    LogLog.debug("Trying to find [" + resource + "] using context classloader " + classLoader + ".");
+                    url = classLoader.getResource(resource);
+                    if (url != null) {
+                        return url;
+                    }
+                }
+            }
+
+            // We could not find resource. Ler us now try with the
+            // classloader that loaded this class.
+            classLoader = Loader.class.getClassLoader();
+            if (classLoader != null) {
+                LogLog.debug("Trying to find [" + resource + "] using " + classLoader + " class loader.");
+                url = classLoader.getResource(resource);
+                if (url != null) {
+                    return url;
+                }
+            }
+        } catch (IllegalAccessException t) {
+            LogLog.warn(TSTR, t);
+        } catch (InvocationTargetException t) {
+            if (t.getTargetException() instanceof InterruptedException || t.getTargetException() instanceof InterruptedIOException) {
+                Thread.currentThread().interrupt();
+            }
+            LogLog.warn(TSTR, t);
+        } catch (Throwable t) {
+            //
+            // can't be InterruptedException or InterruptedIOException
+            // since not declared, must be error or RuntimeError.
+            LogLog.warn(TSTR, t);
+        }
+
+        // Last ditch attempt: get the resource from the class path. It
+        // may be the case that clazz was loaded by the Extentsion class
+        // loader which the parent of the system class loader. Hence the
+        // code below.
+        LogLog.debug("Trying to find [" + resource + "] using ClassLoader.getSystemResource().");
+        return ClassLoader.getSystemResource(resource);
+    }
+
+    /**
+     * Get a resource by delegating to getResource(String).
+     * 
+     * @param resource resource name
+     * @param clazz class, ignored.
+     * @return URL to resource or null.
+     * @deprecated as of 1.2.
+     */
+    @Deprecated
+    public static URL getResource(String resource, Class clazz) {
+        return getResource(resource);
+    }
+
+    /**
+     * Get the Thread Context Loader which is a JDK 1.2 feature. If we are running under JDK 1.1 or anything else goes wrong
+     * the method returns <code>null<code>.
+     *
+     */
+    private static ClassLoader getTCL() throws IllegalAccessException, InvocationTargetException {
+
+        // Are we running on a JDK 1.2 or later system?
+        Method method = null;
+        try {
+            method = Thread.class.getMethod("getContextClassLoader", (Class<?>[]) null);
+        } catch (NoSuchMethodException e) {
+            // We are running on JDK 1.1
+            return null;
+        }
+
+        return (ClassLoader) method.invoke(Thread.currentThread(), (Object[]) null);
+    }
+
+    /**
+     * Are we running under JDK 1.x?
+     */
+    public static boolean isJava1() {
+        return java1;
+    }
+
+    /**
+     * If running under JDK 1.2 load the specified class using the <code>Thread</code> <code>contextClassLoader</code> if
+     * that fails try Class.forname. Under JDK 1.1 only Class.forName is used.
+     *
+     */
+    static public Class loadClass(String clazz) throws ClassNotFoundException {
+        // Just call Class.forName(clazz) if we are running under JDK 1.1
+        // or if we are instructed to ignore the TCL.
+        if (java1 || ignoreTCL) {
+            return Class.forName(clazz);
+        }
+        try {
+            return getTCL().loadClass(clazz);
+        }
+        // we reached here because tcl was null or because of a
+        // security exception, or because clazz could not be loaded...
+        // In any case we now try one more time
+        catch (InvocationTargetException e) {
+            if (e.getTargetException() instanceof InterruptedException || e.getTargetException() instanceof InterruptedIOException) {
+                Thread.currentThread().interrupt();
+            }
+        } catch (Throwable t) {
+            // ignore
+        }
+        return Class.forName(clazz);
+    }
+}

[logging-log4j2] 02/02: Log4j 1.2 bridge adds org.apache.log4j.helpers.Loader.

Posted by gg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 909c348a405c8b855df35e247ed6cfa585115b1c
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Wed Jan 5 13:11:26 2022 -0500

    Log4j 1.2 bridge adds org.apache.log4j.helpers.Loader.
---
 src/changes/changes.xml | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 89199d5..5dde00f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -82,12 +82,15 @@
       <action dev="ggregory" type="fix" issue="LOG4J2-3316">
         Log4j 1.2 bridge should ignore case in properties file keys.
       </action>
-      <action dev="ggregory" type="fix" issue="LOG4J2-3316">
+      <action dev="ggregory" type="fix">
         Log4j 1.2 bridge adds org.apache.log4j.component.helpers.Constants.
       </action>
-      <action dev="ggregory" type="fix" issue="LOG4J2-3316">
+      <action dev="ggregory" type="fix">
         Log4j 1.2 bridge adds org.apache.log4j.helpers.LogLog.
       </action>      
+      <action dev="ggregory" type="fix">
+        Log4j 1.2 bridge adds org.apache.log4j.helpers.Loader.
+      </action>      
       <!-- ADD -->
       <!-- UPDATES -->
 	</release>