Well, this is a pretty trivial utility class that extracts the ProviderUtil.findClassLoader() method into a more appropriately named method. Also, it does proper security checks. :)
On 19 July 2014 21:02, Remko Popma <[email protected]> wrote: > Matt, > Does this have to be in log4j-api? > Can we keep this in core until we are sure this is the way to go, and > _then_ consider moving this class to api? > The thing is, adding to log4j-api is easy, but taking it out might break > other people's code (even if it turned out it did not work well for us)... > > > On Sun, Jul 20, 2014 at 10:44 AM, <[email protected]> wrote: > >> Author: mattsicker >> Date: Sun Jul 20 01:44:45 2014 >> New Revision: 1611991 >> >> URL: http://svn.apache.org/r1611991 >> Log: >> Add LoaderUtil class to isolate ClassLoader utility class. >> >> - Code based on the Loader class in log4j-core. >> - Provides the functionality from ProviderUtil.findClassLoader() (which >> will delegate to this class in an upcoming revision). >> >> Added: >> >> logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java >> >> Added: >> logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java >> URL: >> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java?rev=1611991&view=auto >> >> ============================================================================== >> --- >> logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java >> (added) >> +++ >> logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java >> Sun Jul 20 01:44:45 2014 >> @@ -0,0 +1,52 @@ >> +/* >> + * 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.logging.log4j.util; >> + >> +import java.security.AccessController; >> +import java.security.PrivilegedAction; >> + >> +/** >> + * Utility class for ClassLoaders. Consider this class private. >> + */ >> +// TODO: migrate any other useful methods from Loader in log4j-core >> +public final class LoaderUtil { >> + private LoaderUtil() {} >> + >> + private static final PrivilegedAction<ClassLoader> TCCL_GETTER = new >> ThreadContextClassLoaderGetter(); >> + >> + static { >> + final SecurityManager sm = System.getSecurityManager(); >> + if (sm != null) { >> + sm.checkPermission(new RuntimePermission("getClassLoader")); >> + } >> + } >> + >> + public static ClassLoader getThreadContextClassLoader() { >> + return System.getSecurityManager() == null >> + ? TCCL_GETTER.run() >> + : AccessController.doPrivileged(TCCL_GETTER); >> + } >> + >> + private static class ThreadContextClassLoaderGetter implements >> PrivilegedAction<ClassLoader> { >> + @Override >> + public ClassLoader run() { >> + final ClassLoader cl = >> Thread.currentThread().getContextClassLoader(); >> + // if the TCCL is null, that means we're using the system CL >> + return cl == null ? ClassLoader.getSystemClassLoader() : cl; >> + } >> + } >> +} >> >> >> > -- Matt Sicker <[email protected]>
