No problem! I agree completely with what you said about adding to the API, though. :)
On 19 July 2014 21:21, Remko Popma <[email protected]> wrote: > Ah, I did not see that ProviderUtil was already in log4j-api. My mistake, > please ignore my message. > > > On Sun, Jul 20, 2014 at 11:18 AM, Matt Sicker <[email protected]> wrote: > >> 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]> >> > > -- Matt Sicker <[email protected]>
