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 2018/10/22 18:16:17 UTC
logging-log4j2 git commit: [LOG4J2-2482] BasicContextSelector cannot
be used in a OSGI application.
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 <rg...@gmail.com>
Authored: Mon Oct 22 12:16:13 2018 -0600
Committer: Gary Gregory <ga...@gmail.com>
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">