Skip to content

Commit 35c0f02

Browse files
committed
Generalize DI usage
This commit ensures that: * an `InstanceFactory` is created in the Log4j `Provider`, * the same factory is injected as parameters to all the components of the chain `Log4jContextFactory`, `ContextSelector`, `LoggerContext` (child), `Configuration` (grand-child). * `DI.createInstanceFactory` is called only when strictly necessary.
1 parent e18403a commit 35c0f02

File tree

120 files changed

+1796
-1690
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

120 files changed

+1796
-1690
lines changed

log4j-1.2-api/src/main/java/org/apache/log4j/Category.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ public void assertLog(final boolean assertion, final String msg) {
237237
*/
238238
public void callAppenders(final LoggingEvent event) {
239239
if (LogManager.isLog4jCorePresent()) {
240-
CategoryUtil.log(logger, new LogEventWrapper(event));
240+
CategoryUtil.log(logger, LogEventWrapper.adapt(event));
241241
return;
242242
}
243243
int writes = 0;

log4j-1.2-api/src/main/java/org/apache/log4j/PropertyConfigurator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.apache.log4j.spi.RendererSupport;
4848
import org.apache.log4j.spi.ThrowableRenderer;
4949
import org.apache.log4j.spi.ThrowableRendererSupport;
50+
import org.apache.logging.log4j.core.LoggerContext;
5051
import org.apache.logging.log4j.core.config.Configuration;
5152
import org.apache.logging.log4j.core.net.UrlConnectionFactory;
5253
import org.apache.logging.log4j.util.StackLocatorUtil;
@@ -307,7 +308,7 @@ public void doConfigure(final Properties properties, final LoggerRepository logg
307308
Configuration doConfigure(
308309
final Properties properties, final LoggerRepository loggerRepository, final ClassLoader classLoader) {
309310
final PropertiesConfiguration configuration =
310-
new PropertiesConfiguration(LogManager.getContext(classLoader), properties);
311+
new PropertiesConfiguration((LoggerContext) LogManager.getContext(classLoader), properties);
311312
configuration.doConfigure();
312313

313314
repository = loggerRepository;

log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ protected Adapter(
8585

8686
@Override
8787
public void append(final LogEvent event) {
88-
appender.doAppend(new LogEventAdapter(event));
88+
appender.doAppend(LogEventAdapter.adapt(event));
8989
}
9090

9191
@Override

log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventAdapter.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public class LogEventAdapter extends LoggingEvent {
4141

4242
private final LogEvent event;
4343

44+
public static LoggingEvent adapt(final LogEvent event) {
45+
return event instanceof final LogEventWrapper wrapper ? wrapper.getLoggingEvent() : new LogEventAdapter(event);
46+
}
47+
4448
public LogEventAdapter(final LogEvent event) {
4549
this.event = event;
4650
}
@@ -213,4 +217,13 @@ public Set getPropertyKeySet() {
213217
public Map getProperties() {
214218
return event.getContextData().toMap();
215219
}
220+
221+
public LoggingEvent toImmutable() {
222+
final LogEvent immutable = event.toImmutable();
223+
return event == immutable ? this : adapt(immutable);
224+
}
225+
226+
LogEvent getLogEvent() {
227+
return event;
228+
}
216229
}

log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventWrapper.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ public class LogEventWrapper implements LogEvent {
4949
private final MutableThreadContextStack contextStack;
5050
private Thread thread;
5151

52+
public static LogEvent adapt(final LoggingEvent event) {
53+
return event instanceof final LogEventAdapter adapter ? adapter.getLogEvent() : new LogEventWrapper(event);
54+
}
55+
5256
public LogEventWrapper(final LoggingEvent event) {
5357
this.event = event;
5458
this.contextData = new ContextDataMap(event.getProperties());
@@ -182,6 +186,10 @@ public long getNanoTime() {
182186
return 0;
183187
}
184188

189+
LoggingEvent getLoggingEvent() {
190+
return event;
191+
}
192+
185193
private static class ContextDataMap extends HashMap<String, String> implements ReadOnlyStringMap {
186194

187195
ContextDataMap(final Map<String, String> map) {

log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1Configuration.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@
1616
*/
1717
package org.apache.log4j.config;
1818

19+
import java.util.Optional;
1920
import org.apache.log4j.Level;
2021
import org.apache.log4j.builders.BuilderManager;
2122
import org.apache.logging.log4j.core.LoggerContext;
2223
import org.apache.logging.log4j.core.config.AbstractConfiguration;
2324
import org.apache.logging.log4j.core.config.Configuration;
2425
import org.apache.logging.log4j.core.config.ConfigurationSource;
2526
import org.apache.logging.log4j.core.config.Reconfigurable;
27+
import org.apache.logging.log4j.plugins.di.ConfigurableInstanceFactory;
28+
import org.apache.logging.log4j.plugins.di.DI;
29+
import org.apache.logging.log4j.util.PropertiesUtil;
2630

2731
/**
2832
* Base Configuration for Log4j 1.
@@ -49,7 +53,15 @@ public Log4j1Configuration(
4953
final LoggerContext loggerContext,
5054
final ConfigurationSource configurationSource,
5155
final int monitorIntervalSeconds) {
52-
super(loggerContext, configurationSource);
56+
super(
57+
loggerContext,
58+
configurationSource,
59+
Optional.ofNullable(loggerContext)
60+
.map(LoggerContext::getEnvironment)
61+
.orElseGet(PropertiesUtil::getProperties),
62+
Optional.ofNullable(loggerContext)
63+
.map(ctx -> (ConfigurableInstanceFactory) ctx.getInstanceFactory())
64+
.orElseGet(DI::createInitializedFactory));
5365
initializeWatchers(this, configurationSource, monitorIntervalSeconds);
5466
manager = instanceFactory.getInstance(BuilderManager.class);
5567
}

log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
import java.io.IOException;
2020
import java.io.InputStream;
2121
import org.apache.logging.log4j.core.LoggerContext;
22+
import org.apache.logging.log4j.core.config.AbstractConfigurationFactory;
2223
import org.apache.logging.log4j.core.config.Configuration;
2324
import org.apache.logging.log4j.core.config.ConfigurationException;
24-
import org.apache.logging.log4j.core.config.ConfigurationFactory;
2525
import org.apache.logging.log4j.core.config.ConfigurationSource;
2626
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
2727
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
@@ -35,7 +35,7 @@
3535
//
3636
// Best Value?
3737
// @Order(50)
38-
public class Log4j1ConfigurationFactory extends ConfigurationFactory {
38+
public class Log4j1ConfigurationFactory extends AbstractConfigurationFactory {
3939

4040
private static final String[] SUFFIXES = {".properties"};
4141

@@ -51,7 +51,7 @@ public Configuration getConfiguration(final LoggerContext loggerContext, final C
5151
}
5252

5353
@Override
54-
protected String[] getSupportedTypes() {
54+
public String[] getSupportedTypes() {
5555
return SUFFIXES;
5656
}
5757
}

log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,14 @@ public class PropertiesConfiguration extends Log4j1Configuration {
8181
* Constructs a new instance.
8282
*
8383
* @param loggerContext The LoggerContext.
84-
* @param source The ConfigurationSource.
84+
* @param configurationSource The ConfigurationSource.
8585
* @param monitorIntervalSeconds The monitoring interval in seconds.
8686
*/
8787
public PropertiesConfiguration(
88-
final LoggerContext loggerContext, final ConfigurationSource source, final int monitorIntervalSeconds) {
89-
super(loggerContext, source, monitorIntervalSeconds);
88+
final LoggerContext loggerContext,
89+
final ConfigurationSource configurationSource,
90+
final int monitorIntervalSeconds) {
91+
this(loggerContext, configurationSource, monitorIntervalSeconds, null);
9092
}
9193

9294
/**
@@ -96,18 +98,16 @@ public PropertiesConfiguration(
9698
* @param properties The ConfigurationSource, may be null.
9799
*/
98100
public PropertiesConfiguration(final LoggerContext loggerContext, final Properties properties) {
99-
super(loggerContext, ConfigurationSource.NULL_SOURCE, 0);
100-
this.properties = properties;
101+
this(loggerContext, ConfigurationSource.NULL_SOURCE, 0, properties);
101102
}
102103

103-
/**
104-
* Constructs a new instance.
105-
*
106-
* @param loggerContext The LoggerContext.
107-
* @param properties The ConfigurationSource.
108-
*/
109-
public PropertiesConfiguration(org.apache.logging.log4j.spi.LoggerContext loggerContext, Properties properties) {
110-
this((LoggerContext) loggerContext, properties);
104+
private PropertiesConfiguration(
105+
final LoggerContext loggerContext,
106+
final ConfigurationSource configurationSource,
107+
final int monitorIntervalSeconds,
108+
final Properties properties) {
109+
super(loggerContext, configurationSource, monitorIntervalSeconds);
110+
this.properties = properties;
111111
}
112112

113113
@Override
@@ -149,7 +149,7 @@ public Configuration reconfigure() {
149149

150150
/**
151151
* Reads a configuration from a file. <b>The existing configuration is not cleared nor reset.</b> If you require a
152-
* different behavior, then call {@link LogManager#resetConfiguration resetConfiguration} method before calling
152+
* different behavior, then call {@link LogManager#resetConfiguration()} resetConfiguration} method before calling
153153
* <code>doConfigure</code>.
154154
* <p>
155155
* The configuration file consists of statements in the format <code>key=value</code>. The syntax of different
@@ -373,7 +373,7 @@ private void parseLoggers(final Properties props) {
373373
LoggerConfig loggerConfig = getLogger(loggerName);
374374
if (loggerConfig == null) {
375375
final boolean additivity = getAdditivityForLogger(props, loggerName);
376-
loggerConfig = new LoggerConfig(loggerName, org.apache.logging.log4j.Level.ERROR, additivity);
376+
loggerConfig = new LoggerConfig(loggerName, Level.ERROR, additivity, this);
377377
addLogger(loggerName, loggerConfig);
378378
}
379379
parseLogger(props, loggerConfig, key, loggerName, value);

log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfigurationFactory.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
package org.apache.log4j.config;
1818

1919
import org.apache.logging.log4j.core.LoggerContext;
20+
import org.apache.logging.log4j.core.config.AbstractConfigurationFactory;
2021
import org.apache.logging.log4j.core.config.Configuration;
21-
import org.apache.logging.log4j.core.config.ConfigurationFactory;
2222
import org.apache.logging.log4j.core.config.ConfigurationSource;
2323
import org.apache.logging.log4j.core.config.Order;
2424
import org.apache.logging.log4j.plugins.Namespace;
@@ -28,10 +28,10 @@
2828
/**
2929
* Configures Log4j from a log4j 1 format properties file.
3030
*/
31-
@Namespace(ConfigurationFactory.NAMESPACE)
31+
@Namespace(AbstractConfigurationFactory.NAMESPACE)
3232
@Plugin("Log4j1PropertiesConfigurationFactory")
3333
@Order(2)
34-
public class PropertiesConfigurationFactory extends ConfigurationFactory {
34+
public class PropertiesConfigurationFactory extends AbstractConfigurationFactory {
3535

3636
static final String FILE_EXTENSION = ".properties";
3737

@@ -46,9 +46,9 @@ public class PropertiesConfigurationFactory extends ConfigurationFactory {
4646
protected static final String DEFAULT_PREFIX = "log4j";
4747

4848
@Override
49-
protected String[] getSupportedTypes() {
49+
public String[] getSupportedTypes() {
5050
if (!PropertiesUtil.getProperties()
51-
.getBooleanProperty(ConfigurationFactory.LOG4J1_EXPERIMENTAL, Boolean.FALSE)) {
51+
.getBooleanProperty(AbstractConfigurationFactory.LOG4J1_EXPERIMENTAL, Boolean.FALSE)) {
5252
return null;
5353
}
5454
return new String[] {FILE_EXTENSION};
@@ -61,17 +61,17 @@ public Configuration getConfiguration(final LoggerContext loggerContext, final C
6161
}
6262

6363
@Override
64-
protected String getTestPrefix() {
64+
public String getTestPrefix() {
6565
return TEST_PREFIX;
6666
}
6767

6868
@Override
69-
protected String getDefaultPrefix() {
69+
public String getDefaultPrefix() {
7070
return DEFAULT_PREFIX;
7171
}
7272

7373
@Override
74-
protected String getVersion() {
74+
public String getVersion() {
7575
return LOG4J1_VERSION;
7676
}
7777
}

log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,10 @@ public class XmlConfiguration extends Log4j1Configuration {
112112
private final Properties props = null;
113113

114114
public XmlConfiguration(
115-
final LoggerContext loggerContext, final ConfigurationSource source, final int monitorIntervalSeconds) {
116-
super(loggerContext, source, monitorIntervalSeconds);
115+
final LoggerContext loggerContext,
116+
final ConfigurationSource configurationSource,
117+
final int monitorIntervalSeconds) {
118+
super(loggerContext, configurationSource, monitorIntervalSeconds);
117119
appenderMap = new HashMap<>();
118120
}
119121

@@ -563,7 +565,7 @@ private void parseCategory(final Element loggerElement) {
563565
final boolean additivity = OptionConverter.toBoolean(subst(loggerElement.getAttribute(ADDITIVITY_ATTR)), true);
564566
LoggerConfig loggerConfig = getLogger(catName);
565567
if (loggerConfig == null) {
566-
loggerConfig = new LoggerConfig(catName, org.apache.logging.log4j.Level.ERROR, additivity);
568+
loggerConfig = new LoggerConfig(catName, org.apache.logging.log4j.Level.ERROR, additivity, this);
567569
addLogger(catName, loggerConfig);
568570
} else {
569571
loggerConfig.setAdditive(additivity);

0 commit comments

Comments
 (0)