Repository: logging-log4j2 Updated Branches: refs/heads/release-2.x 940a798d8 -> 2c5008bea
[LOG4J2-2482] BasicContextSelector cannot be used in a OSGI application. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/2c5008be Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2c5008be Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2c5008be Branch: refs/heads/release-2.x Commit: 2c5008bea17160f17b6c4909c7e8c51fa5aa1c12 Parents: 940a798 Author: Rob Gansevles <[email protected]> Authored: Mon Oct 22 12:16:13 2018 -0600 Committer: Gary Gregory <[email protected]> Committed: Mon Oct 22 12:16:13 2018 -0600 ---------------------------------------------------------------------- log4j-api/pom.xml | 3 - .../logging/log4j/core/LoggerContext.java | 6 +- .../log4j/core/appender/ConsoleAppender.java | 20 ++-- .../db/jdbc/FactoryMethodConnectionSource.java | 5 +- .../core/async/AsyncQueueFullPolicyFactory.java | 4 +- .../logging/log4j/core/async/DisruptorUtil.java | 14 ++- .../log4j/core/config/ConfigurationFactory.java | 3 +- .../logging/log4j/core/config/LoggerConfig.java | 4 +- .../core/config/ReliabilityStrategyFactory.java | 4 +- .../composite/CompositeConfiguration.java | 3 +- .../log4j/core/impl/ContextDataFactory.java | 4 +- .../core/impl/ContextDataInjectorFactory.java | 4 +- .../log4j/core/impl/Log4jContextFactory.java | 5 +- .../apache/logging/log4j/core/util/Loader.java | 97 ++++++++++++++++---- .../log4j/core/util/OptionConverter.java | 3 +- .../osgi/tests/AbstractLoadBundleTest.java | 9 +- src/changes/changes.xml | 3 + 17 files changed, 128 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-api/pom.xml ---------------------------------------------------------------------- diff --git a/log4j-api/pom.xml b/log4j-api/pom.xml index 8d66d84..6384007 100644 --- a/log4j-api/pom.xml +++ b/log4j-api/pom.xml @@ -222,9 +222,6 @@ <Export-Package>org.apache.logging.log4j.*</Export-Package> <Import-Package> sun.reflect;resolution:=optional, - org.apache.logging.log4j.core.osgi;resolution:=optional, - org.apache.logging.log4j.core.util;resolution:=optional, - org.apache.logging.log4j.core.async;resolution:=optional, * </Import-Package> <Bundle-Activator>org.apache.logging.log4j.util.Activator</Bundle-Activator> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java index 2a9343c..7a552cc 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java @@ -42,6 +42,7 @@ import org.apache.logging.log4j.core.impl.Log4jLogEvent; import org.apache.logging.log4j.core.jmx.Server; import org.apache.logging.log4j.core.util.Cancellable; import org.apache.logging.log4j.core.util.ExecutorServices; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.core.util.NetUtils; import org.apache.logging.log4j.core.util.ShutdownCallbackRegistry; import org.apache.logging.log4j.message.MessageFactory; @@ -50,7 +51,6 @@ import org.apache.logging.log4j.spi.LoggerContextFactory; import org.apache.logging.log4j.spi.LoggerRegistry; import org.apache.logging.log4j.spi.Terminable; import org.apache.logging.log4j.spi.ThreadContextMapFactory; -import org.apache.logging.log4j.util.LoaderUtil; import org.apache.logging.log4j.util.PropertiesUtil; @@ -65,7 +65,7 @@ public class LoggerContext extends AbstractLifeCycle static { try { // LOG4J2-1642 preload ExecutorServices as it is used in shutdown hook - LoaderUtil.loadClass(ExecutorServices.class.getName()); + Loader.loadClass(ExecutorServices.class.getName()); } catch (final Exception e) { LOGGER.error("Failed to preload ExecutorServices class.", e); } @@ -678,7 +678,7 @@ public class LoggerContext extends AbstractLifeCycle } } - private void initApiModule() { + private void initApiModule() { ThreadContextMapFactory.init(); // Or make public and call ThreadContext.init() which calls ThreadContextMapFactory.init(). } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java index c04a9f5..8e3b453 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java @@ -16,17 +16,6 @@ */ package org.apache.logging.log4j.core.appender; -import java.io.FileDescriptor; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintStream; -import java.io.Serializable; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Constructor; -import java.nio.charset.Charset; -import java.util.concurrent.atomic.AtomicInteger; - import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Core; import org.apache.logging.log4j.core.Filter; @@ -38,11 +27,16 @@ import org.apache.logging.log4j.core.config.plugins.validation.constraints.Requi import org.apache.logging.log4j.core.layout.PatternLayout; import org.apache.logging.log4j.core.util.Booleans; import org.apache.logging.log4j.core.util.CloseShieldOutputStream; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.core.util.Throwables; import org.apache.logging.log4j.util.Chars; -import org.apache.logging.log4j.util.LoaderUtil; import org.apache.logging.log4j.util.PropertiesUtil; +import java.io.*; +import java.lang.reflect.Constructor; +import java.nio.charset.Charset; +import java.util.concurrent.atomic.AtomicInteger; + /** * Appends log events to <code>System.out</code> or <code>System.err</code> using a layout specified by the user. The * default target is <code>System.out</code>. @@ -266,7 +260,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt } try { // We type the parameter as a wildcard to avoid a hard reference to Jansi. - final Class<?> clazz = LoaderUtil.loadClass(JANSI_CLASS); + final Class<?> clazz = Loader.loadClass(JANSI_CLASS); final Constructor<?> constructor = clazz.getConstructor(OutputStream.class); return new CloseShieldOutputStream((OutputStream) constructor.newInstance(outputStream)); } catch (final ClassNotFoundException cnfe) { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/FactoryMethodConnectionSource.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/FactoryMethodConnectionSource.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/FactoryMethodConnectionSource.java index 20bf2f3..cf2d34e 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/FactoryMethodConnectionSource.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/FactoryMethodConnectionSource.java @@ -20,7 +20,6 @@ import java.io.PrintWriter; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.SQLException; - import javax.sql.DataSource; import org.apache.logging.log4j.Logger; @@ -28,8 +27,8 @@ import org.apache.logging.log4j.core.Core; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginAttribute; import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.status.StatusLogger; -import org.apache.logging.log4j.util.LoaderUtil; import org.apache.logging.log4j.util.Strings; /** @@ -80,7 +79,7 @@ public final class FactoryMethodConnectionSource extends AbstractConnectionSourc final Method method; try { - final Class<?> factoryClass = LoaderUtil.loadClass(className); + final Class<?> factoryClass = Loader.loadClass(className); method = factoryClass.getMethod(methodName); } catch (final Exception e) { LOGGER.error(e.toString(), e); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java index 534a899..9dd4e85 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java @@ -18,8 +18,8 @@ package org.apache.logging.log4j.core.async; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.status.StatusLogger; -import org.apache.logging.log4j.util.LoaderUtil; import org.apache.logging.log4j.util.PropertiesUtil; /** @@ -81,7 +81,7 @@ public class AsyncQueueFullPolicyFactory { private static AsyncQueueFullPolicy createCustomRouter(final String router) { try { - final Class<? extends AsyncQueueFullPolicy> cls = LoaderUtil.loadClass(router).asSubclass(AsyncQueueFullPolicy.class); + final Class<? extends AsyncQueueFullPolicy> cls = Loader.loadClass(router).asSubclass(AsyncQueueFullPolicy.class); LOGGER.debug("Creating custom AsyncQueueFullPolicy '{}'", router); return cls.newInstance(); } catch (final Exception ex) { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java index 4fc5ea0..9e946f9 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java @@ -23,12 +23,18 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import com.lmax.disruptor.*; +import com.lmax.disruptor.BlockingWaitStrategy; +import com.lmax.disruptor.BusySpinWaitStrategy; +import com.lmax.disruptor.ExceptionHandler; +import com.lmax.disruptor.SleepingWaitStrategy; +import com.lmax.disruptor.TimeoutBlockingWaitStrategy; +import com.lmax.disruptor.WaitStrategy; +import com.lmax.disruptor.YieldingWaitStrategy; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.util.Constants; import org.apache.logging.log4j.core.util.Integers; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.status.StatusLogger; -import org.apache.logging.log4j.util.LoaderUtil; import org.apache.logging.log4j.util.PropertiesUtil; /** @@ -101,7 +107,7 @@ final class DisruptorUtil { try { @SuppressWarnings("unchecked") final Class<? extends ExceptionHandler<RingBufferLogEvent>> klass = - (Class<? extends ExceptionHandler<RingBufferLogEvent>>) LoaderUtil.loadClass(cls); + (Class<? extends ExceptionHandler<RingBufferLogEvent>>) Loader.loadClass(cls); return klass.newInstance(); } catch (final Exception ignored) { LOGGER.debug("Invalid AsyncLogger.ExceptionHandler value: error creating {}: ", cls, ignored); @@ -117,7 +123,7 @@ final class DisruptorUtil { try { @SuppressWarnings("unchecked") final Class<? extends ExceptionHandler<AsyncLoggerConfigDisruptor.Log4jEventWrapper>> klass = - (Class<? extends ExceptionHandler<AsyncLoggerConfigDisruptor.Log4jEventWrapper>>) LoaderUtil.loadClass(cls); + (Class<? extends ExceptionHandler<AsyncLoggerConfigDisruptor.Log4jEventWrapper>>) Loader.loadClass(cls); return klass.newInstance(); } catch (final Exception ignored) { LOGGER.debug("Invalid AsyncLoggerConfig.ExceptionHandler value: error creating {}: ", cls, ignored); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java index 7e6dfb2..8c05959 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java @@ -39,6 +39,7 @@ import org.apache.logging.log4j.core.config.plugins.util.PluginType; import org.apache.logging.log4j.core.lookup.Interpolator; import org.apache.logging.log4j.core.lookup.StrSubstitutor; import org.apache.logging.log4j.core.util.FileUtils; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.core.util.NetUtils; import org.apache.logging.log4j.core.util.ReflectionUtil; import org.apache.logging.log4j.status.StatusLogger; @@ -173,7 +174,7 @@ public abstract class ConfigurationFactory extends ConfigurationBuilderFactory { private static void addFactory(final Collection<ConfigurationFactory> list, final String factoryClass) { try { - addFactory(list, LoaderUtil.loadClass(factoryClass).asSubclass(ConfigurationFactory.class)); + addFactory(list, Loader.loadClass(factoryClass).asSubclass(ConfigurationFactory.class)); } catch (final Exception ex) { LOGGER.error("Unable to load class {}", factoryClass, ex); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java index 8db7c32..1022f2d 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java @@ -48,8 +48,8 @@ import org.apache.logging.log4j.core.impl.ReusableLogEventFactory; import org.apache.logging.log4j.core.lookup.StrSubstitutor; import org.apache.logging.log4j.core.util.Booleans; import org.apache.logging.log4j.core.util.Constants; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.message.Message; -import org.apache.logging.log4j.util.LoaderUtil; import org.apache.logging.log4j.util.PerformanceSensitive; import org.apache.logging.log4j.util.PropertiesUtil; import org.apache.logging.log4j.util.Strings; @@ -81,7 +81,7 @@ public class LoggerConfig extends AbstractFilterable { final String factory = PropertiesUtil.getProperties().getStringProperty(Constants.LOG4J_LOG_EVENT_FACTORY); if (factory != null) { try { - final Class<?> clazz = LoaderUtil.loadClass(factory); + final Class<?> clazz = Loader.loadClass(factory); if (clazz != null && LogEventFactory.class.isAssignableFrom(clazz)) { LOG_EVENT_FACTORY = (LogEventFactory) clazz.newInstance(); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java index 1e9fc05..953d96f 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java @@ -17,8 +17,8 @@ package org.apache.logging.log4j.core.config; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.status.StatusLogger; -import org.apache.logging.log4j.util.LoaderUtil; import org.apache.logging.log4j.util.PropertiesUtil; /** @@ -58,7 +58,7 @@ public final class ReliabilityStrategyFactory { return new LockingReliabilityStrategy(loggerConfig); } try { - final Class<? extends ReliabilityStrategy> cls = LoaderUtil.loadClass(strategy).asSubclass( + final Class<? extends ReliabilityStrategy> cls = Loader.loadClass(strategy).asSubclass( ReliabilityStrategy.class); return cls.getConstructor(LoggerConfig.class).newInstance(loggerConfig); } catch (final Exception dynamicFailed) { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java index aee0281..063059a 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java @@ -35,6 +35,7 @@ import org.apache.logging.log4j.core.config.Reconfigurable; import org.apache.logging.log4j.core.config.plugins.util.ResolverUtil; import org.apache.logging.log4j.core.config.status.StatusConfiguration; import org.apache.logging.log4j.core.util.FileWatcher; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.core.util.Patterns; import org.apache.logging.log4j.core.util.WatchManager; import org.apache.logging.log4j.util.LoaderUtil; @@ -68,7 +69,7 @@ public class CompositeConfiguration extends AbstractConfiguration implements Rec final String mergeStrategyClassName = PropertiesUtil.getProperties().getStringProperty(MERGE_STRATEGY_PROPERTY, DefaultMergeStrategy.class.getName()); try { - mergeStrategy = LoaderUtil.newInstanceOf(mergeStrategyClassName); + mergeStrategy = Loader.newInstanceOf(mergeStrategyClassName); } catch (ClassNotFoundException | IllegalAccessException | NoSuchMethodException | InvocationTargetException | InstantiationException ex) { mergeStrategy = new DefaultMergeStrategy(); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java index b1adb78..70b548d 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java @@ -24,8 +24,8 @@ import java.util.Map.Entry; import org.apache.logging.log4j.core.ContextDataInjector; import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.util.IndexedStringMap; -import org.apache.logging.log4j.util.LoaderUtil; import org.apache.logging.log4j.util.PropertiesUtil; import org.apache.logging.log4j.util.ReadOnlyStringMap; import org.apache.logging.log4j.util.SortedArrayStringMap; @@ -65,7 +65,7 @@ public class ContextDataFactory { return null; } try { - return LoaderUtil.loadClass(className).asSubclass(IndexedStringMap.class); + return Loader.loadClass(className).asSubclass(IndexedStringMap.class); } catch (final Exception any) { return null; } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java index fb1c330..050d1e0 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java @@ -19,11 +19,11 @@ package org.apache.logging.log4j.core.impl; import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.core.ContextDataInjector; import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.spi.CopyOnWrite; import org.apache.logging.log4j.spi.DefaultThreadContextMap; import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap; import org.apache.logging.log4j.status.StatusLogger; -import org.apache.logging.log4j.util.LoaderUtil; import org.apache.logging.log4j.util.PropertiesUtil; import org.apache.logging.log4j.util.ReadOnlyStringMap; @@ -67,7 +67,7 @@ public class ContextDataInjectorFactory { return createDefaultInjector(); } try { - final Class<? extends ContextDataInjector> cls = LoaderUtil.loadClass(className).asSubclass( + final Class<? extends ContextDataInjector> cls = Loader.loadClass(className).asSubclass( ContextDataInjector.class); return cls.newInstance(); } catch (final Exception dynamicFailed) { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java index bfd6df2..42bd52a 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java @@ -33,6 +33,7 @@ import org.apache.logging.log4j.core.selector.ContextSelector; import org.apache.logging.log4j.core.util.Cancellable; import org.apache.logging.log4j.core.util.Constants; import org.apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry; +import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.core.util.ShutdownCallbackRegistry; import org.apache.logging.log4j.spi.LoggerContextFactory; import org.apache.logging.log4j.status.StatusLogger; @@ -95,7 +96,7 @@ public class Log4jContextFactory implements LoggerContextFactory, ShutdownCallba private static ContextSelector createContextSelector() { try { - final ContextSelector selector = LoaderUtil.newCheckedInstanceOfProperty(Constants.LOG4J_CONTEXT_SELECTOR, + final ContextSelector selector = Loader.newCheckedInstanceOfProperty(Constants.LOG4J_CONTEXT_SELECTOR, ContextSelector.class); if (selector != null) { return selector; @@ -108,7 +109,7 @@ public class Log4jContextFactory implements LoggerContextFactory, ShutdownCallba private static ShutdownCallbackRegistry createShutdownCallbackRegistry() { try { - final ShutdownCallbackRegistry registry = LoaderUtil.newCheckedInstanceOfProperty( + final ShutdownCallbackRegistry registry = Loader.newCheckedInstanceOfProperty( ShutdownCallbackRegistry.SHUTDOWN_CALLBACK_REGISTRY, ShutdownCallbackRegistry.class ); if (registry != null) { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java index d1013f7..1380b7a 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java @@ -23,6 +23,7 @@ import java.net.URL; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.status.StatusLogger; import org.apache.logging.log4j.util.LoaderUtil; +import org.apache.logging.log4j.util.PropertiesUtil; /** * Load resources (or images) from various sources. @@ -238,8 +239,8 @@ public final class Loader { public static Class<?> loadClass(final String className, final ClassLoader loader) throws ClassNotFoundException { return loader != null ? loader.loadClass(className) : null; - } - + } + /** * Load a Class in the {@code java.*} namespace by name. Useful for peculiar scenarios typically involving * Google App Engine. @@ -268,13 +269,20 @@ public final class Loader { * @throws NoSuchMethodException if there isn't a no-args constructor on the class * @throws InvocationTargetException if there was an exception whilst constructing the class */ - public static Object newInstanceOf(final String className) - throws ClassNotFoundException, - IllegalAccessException, - InstantiationException, - NoSuchMethodException, - InvocationTargetException { - return LoaderUtil.newInstanceOf(className); + @SuppressWarnings("unchecked") + public static <T> T newInstanceOf(final String className) + throws ClassNotFoundException, + IllegalAccessException, + InstantiationException, + NoSuchMethodException, + InvocationTargetException { + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(getClassLoader()); + return LoaderUtil.newInstanceOf(className); + } finally { + Thread.currentThread().setContextClassLoader(contextClassLoader); + } } /** @@ -292,12 +300,45 @@ public final class Loader { * @throws ClassCastException if the constructed object isn't type compatible with {@code T} */ public static <T> T newCheckedInstanceOf(final String className, final Class<T> clazz) - throws ClassNotFoundException, - NoSuchMethodException, - IllegalAccessException, - InvocationTargetException, - InstantiationException { - return LoaderUtil.newCheckedInstanceOf(className, clazz); + throws ClassNotFoundException, + NoSuchMethodException, + IllegalAccessException, + InvocationTargetException, + InstantiationException { + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(getClassLoader()); + return LoaderUtil.newCheckedInstanceOf(className, clazz); + } finally { + Thread.currentThread().setContextClassLoader(contextClassLoader); + } + } + + /** + * Loads and instantiates a class given by a property name. + * + * @param propertyName The property name to look up a class name for. + * @param clazz The class to cast it to. + * @param <T> The type to cast it to. + * @return new instance of the class given in the property or {@code null} if the property was unset. + * @throws ClassNotFoundException if the class isn't available to the usual ClassLoaders + * @throws IllegalAccessException if the class can't be instantiated through a public constructor + * @throws InstantiationException if there was an exception whilst instantiating the class + * @throws NoSuchMethodException if there isn't a no-args constructor on the class + * @throws InvocationTargetException if there was an exception whilst constructing the class + * @throws ClassCastException if the constructed object isn't type compatible with {@code T} + */ + public static <T> T newCheckedInstanceOfProperty(final String propertyName, final Class<T> clazz) + throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, + IllegalAccessException { + final String className = PropertiesUtil.getProperties().getStringProperty(propertyName); + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(getClassLoader()); + return LoaderUtil.newCheckedInstanceOfProperty(propertyName, clazz); + } finally { + Thread.currentThread().setContextClassLoader(contextClassLoader); + } } /** @@ -307,11 +348,35 @@ public final class Loader { * @return {@code true} if the class could be found or {@code false} otherwise. */ public static boolean isClassAvailable(final String className) { - return LoaderUtil.isClassAvailable(className); + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(getClassLoader()); + return LoaderUtil.isClassAvailable(className); + } finally { + Thread.currentThread().setContextClassLoader(contextClassLoader); + } } public static boolean isJansiAvailable() { return isClassAvailable("org.fusesource.jansi.AnsiRenderer"); } + /** + * Loads a class by name. This method respects the {@link #IGNORE_TCCL_PROPERTY} Log4j property. If this property is + * specified and set to anything besides {@code false}, then the default ClassLoader will be used. + * + * @param className The class name. + * @return the Class for the given name. + * @throws ClassNotFoundException if the specified class name could not be found + */ + public static Class<?> loadClass(final String className) throws ClassNotFoundException { + + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(getClassLoader()); + return LoaderUtil.loadClass(className); + } finally { + Thread.currentThread().setContextClassLoader(contextClassLoader); + } + } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java index 9970d61..aad31be 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java @@ -21,7 +21,6 @@ import java.util.Properties; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.status.StatusLogger; -import org.apache.logging.log4j.util.LoaderUtil; import org.apache.logging.log4j.util.PropertiesUtil; import org.apache.logging.log4j.util.Strings; @@ -226,7 +225,7 @@ public final class OptionConverter { final Object defaultValue) { if (className != null) { try { - final Class<?> classObj = LoaderUtil.loadClass(className); + final Class<?> classObj = Loader.loadClass(className); if (!superClass.isAssignableFrom(classObj)) { LOGGER.error("A \"{}\" object is not assignable to a \"{}\" variable.", className, superClass.getName()); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java ---------------------------------------------------------------------- diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java index ac10880..f22c4a1 100644 --- a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java +++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/AbstractLoadBundleTest.java @@ -232,7 +232,7 @@ public abstract class AbstractLoadBundleTest { * Tests LOG4J2-920. */ @Test - public void testMissingImportOfCoreOsgiPackage() throws BundleException, ReflectiveOperationException { + public void testLoadingOfConfigurableCoreClasses() throws BundleException, ReflectiveOperationException { final Bundle api = getApiBundle(); final Bundle core = getCoreBundle(); @@ -249,10 +249,9 @@ public abstract class AbstractLoadBundleTest { setupStream(api, bakStream); - final boolean result = baos.toString().contains( - "ERROR StatusLogger Unable to create context org.apache.logging.log4j.core.osgi.BundleContextSelector"); - Assert.assertFalse( - "org.apache.logging.log4j.core.osgi;resolution:=optional is missing in Import-Package in the POM", result); + // org.apache.logging.log4j.core.osgi.BundleContextSelector cannot be found by org.apache.logging.log4j.api + final boolean result = baos.toString().contains("BundleContextSelector cannot be found"); + Assert.assertFalse("Core class BundleContextSelector cannot be loaded in OSGI setup", result); stop(api, core, dummy); uninstall(api, core, dummy); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2c5008be/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index ebf0b46..392948d 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -97,6 +97,9 @@ <action issue="LOG4J2-2457" dev="ggregory" type="fix" due-to="Heiko Schwanke, Gary Gregory"> RollingRandomAccessFileManager ignores new file patterns from programmatic reconfiguration. </action> + <action issue="LOG4J2-2482" dev="ggregory" type="fix" due-to="Rob Gansevles"> + BasicContextSelector cannot be used in a OSGI application. + </action> </release> <release version="2.11.1" date="2018-07-22" description="GA Release 2.11.1"> <action issue="LOG4J2-2389" dev="rgoers" type="fix" due-to="Liu Wen">
