Skip to content

Commit d751752

Browse files
committed
Fix-ups due to #2230 review
1 parent e7b386a commit d751752

File tree

4 files changed

+34
-21
lines changed

4 files changed

+34
-21
lines changed

log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,9 @@ protected AsyncLoggerConfig(
108108
@Override
109109
public void initialize() {
110110
final Configuration configuration = getConfiguration();
111-
DisruptorConfiguration disruptorConfig = configuration.getExtension(DisruptorConfiguration.class);
112-
if (disruptorConfig == null) {
113-
disruptorConfig = DisruptorConfiguration.newBuilder().build();
114-
configuration.addExtension(disruptorConfig);
115-
}
111+
final DisruptorConfiguration disruptorConfig = configuration.addExtensionIfAbsent(
112+
DisruptorConfiguration.class,
113+
() -> DisruptorConfiguration.newBuilder().build());
116114
delegate = disruptorConfig.getAsyncLoggerConfigDelegate();
117115
delegate.setLogEventFactory(getLogEventFactory());
118116
super.initialize();

log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,6 @@
9191
@ServiceConsumer(value = ScriptManagerFactory.class, cardinality = Cardinality.SINGLE, resolution = Resolution.OPTIONAL)
9292
public abstract class AbstractConfiguration extends AbstractFilterable implements Configuration {
9393

94-
private static final ConfigurationExtension[] EMPTY_EXTENSIONS = new ConfigurationExtension[0];
95-
9694
/**
9795
* The instance factory for this configuration. This may be a child factory to a LoggerContext
9896
* in most cases, though this might be a root level factory for null configurations.
@@ -159,7 +157,7 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
159157
private final WeakReference<LoggerContext> loggerContext;
160158
private final PropertyEnvironment contextProperties;
161159
private final Lock configLock = new ReentrantLock();
162-
private ConfigurationExtension[] extensions = EMPTY_EXTENSIONS;
160+
private final List<ConfigurationExtension> extensions = new CopyOnWriteArrayList<>();
163161

164162
/**
165163
* Constructor.
@@ -1154,19 +1152,28 @@ public void setNanoClock(final NanoClock nanoClock) {
11541152
}
11551153

11561154
@Override
1157-
public void addExtension(ConfigurationExtension extension) {
1158-
Objects.requireNonNull(extension);
1159-
extensions = Arrays.copyOf(extensions, extensions.length + 1);
1160-
extensions[extensions.length - 1] = extension;
1155+
public <T extends ConfigurationExtension> T addExtensionIfAbsent(
1156+
final Class<T> extensionType, final Supplier<? extends T> supplier) {
1157+
for (final ConfigurationExtension extension : extensions) {
1158+
if (extensionType.isInstance(extension)) {
1159+
return extensionType.cast(extension);
1160+
}
1161+
}
1162+
return addExtension(supplier.get());
1163+
}
1164+
1165+
private <T extends ConfigurationExtension> T addExtension(final T extension) {
1166+
extensions.add(Objects.requireNonNull(extension));
1167+
return extension;
11611168
}
11621169

11631170
@Override
1164-
public <T extends ConfigurationExtension> T getExtension(Class<T> extensionType) {
1171+
public <T extends ConfigurationExtension> T getExtension(final Class<T> extensionType) {
11651172
T result = null;
11661173
for (final ConfigurationExtension extension : extensions) {
11671174
if (extensionType.isInstance(extension)) {
11681175
if (result == null) {
1169-
result = (T) extension;
1176+
result = extensionType.cast(extension);
11701177
} else {
11711178
LOGGER.warn(
11721179
"Multiple configuration elements found for type {}. Only the first will be used.",

log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -238,17 +238,25 @@ default RecyclerFactory getRecyclerFactory() {
238238
}
239239

240240
/**
241-
* Registers a new configuration extension.
242-
*
243-
* @param extension a configuration extension.
241+
* Registers a new configuration extension, if it doesn't exist.
242+
* <p>
243+
* To preventing polluting the main configuration element,
244+
* each JAR that wishes to extend the {@link Configuration} should use a single child element.
245+
* </p>
246+
* @param extensionType the concrete type of the extension,
247+
* @param supplier a factory to create a new extension element,
248+
* @return the current extension if present or a newly generated one.
244249
* @since 3.0
250+
* @see #getExtension(Class)
245251
*/
246-
void addExtension(ConfigurationExtension extension);
252+
<T extends ConfigurationExtension> T addExtensionIfAbsent(Class<T> extensionType, Supplier<? extends T> supplier);
247253

248254
/**
249255
* Returns an extension of the given type.
250-
*
251-
* @param extensionType a type of extension,
256+
* <p>
257+
* Only the first extension of the given type is returned.
258+
* </p>
259+
* @param extensionType a concrete type of the extension,
252260
* @return an extension the matches the given type.
253261
* @since 3.0
254262
*/

log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationExtension.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@
1717
package org.apache.logging.log4j.core.config;
1818

1919
/**
20-
* A {@link ConfigurationExtension} is used to add new child elements to a {@link Configuration}.
20+
* Marker interface used by new child elements of a {@link Configuration}.
2121
*/
2222
public interface ConfigurationExtension {}

0 commit comments

Comments
 (0)