This is an automated email from the ASF dual-hosted git repository.

vy pushed a commit to branch recycler-api-3.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 7299ef4ca6b61c0ad80664a45a6440b4192c8794
Author: Volkan Yazıcı <[email protected]>
AuthorDate: Sat Mar 25 13:29:30 2023 +0100

    More changes
---
 .../core/impl/ReusableLogEventFactoryTest.java     |  8 +--
 .../core/layout/AbstractStringLayoutTest.java      | 60 +++++++++++++---------
 .../logging/log4j/core/layout/GelfLayout.java      | 53 +++++--------------
 .../logging/log4j/core/layout/PatternLayout.java   | 42 ++++++++++++---
 .../logging/log4j/core/layout/Rfc5424Layout.java   | 36 ++++++-------
 .../apache/logging/log4j/core/util/Constants.java  |  2 +-
 .../layout/template/json/JsonTemplateLayout.java   | 55 ++++++--------------
 .../template/json/JsonTemplateLayoutDefaults.java  | 14 ++---
 .../template/json/resolver/CounterResolver.java    |  1 +
 .../json/resolver/EventResolverContext.java        | 26 ++--------
 .../json/resolver/MessageParameterResolver.java    |  1 +
 .../json/resolver/ReadOnlyStringMapResolver.java   |  2 +-
 .../json/resolver/StackTraceStringResolver.java    |  2 +-
 13 files changed, 135 insertions(+), 167 deletions(-)

diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java
index 4769cf652a..f0d8c346bc 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactoryTest.java
@@ -42,7 +42,7 @@ public class ReusableLogEventFactoryTest {
     }
 
     @Test
-    public void testCreateEventReturnsDifferentInstanceIfNotReleased() throws 
Exception {
+    public void testCreateEventReturnsDifferentInstanceIfNotReleased() {
         final LogEvent event1 = callCreateEvent("a", Level.DEBUG, new 
SimpleMessage("abc"), null);
         final LogEvent event2 = callCreateEvent("b", Level.INFO, new 
SimpleMessage("xyz"), null);
         assertNotSame(event1, event2);
@@ -51,7 +51,7 @@ public class ReusableLogEventFactoryTest {
     }
 
     @Test
-    public void testCreateEventReturnsSameInstance() throws Exception {
+    public void testCreateEventReturnsSameInstance() {
         final LogEvent event1 = callCreateEvent("a", Level.DEBUG, new 
SimpleMessage("abc"), null);
         factory.recycle(event1);
         final LogEvent event2 = callCreateEvent("b", Level.INFO, new 
SimpleMessage("xyz"), null);
@@ -64,7 +64,7 @@ public class ReusableLogEventFactoryTest {
     }
 
     @Test
-    public void testCreateEventOverwritesFields() throws Exception {
+    public void testCreateEventOverwritesFields() {
         final LogEvent event1 = callCreateEvent("a", Level.DEBUG, new 
SimpleMessage("abc"), null);
         assertEquals("a", event1.getLoggerName(), "logger");
         assertEquals(Level.DEBUG, event1.getLevel(), "level");
@@ -125,7 +125,7 @@ public class ReusableLogEventFactoryTest {
     }
 
     @Test
-    public void testCreateEventInitFieldsProperly() throws Exception {
+    public void testCreateEventInitFieldsProperly() {
         final LogEvent event = callCreateEvent("logger", Level.INFO, new 
SimpleMessage("xyz"), null);
         try {
             assertNotNull(event.getContextData());
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java
index 257a291b16..175bacc9ae 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java
@@ -43,39 +43,51 @@ public class AbstractStringLayoutTest {
     }
 
     @Test
-    public void testGetStringBuilderCapacityRestrictedToMax() throws Exception 
{
+    public void testGetStringBuilderCapacityRestrictedToMax() {
+
         final ConcreteStringLayout layout = new ConcreteStringLayout();
         final StringBuilder sb = layout.acquireStringBuilder();
         final int initialCapacity = sb.capacity();
-        assertEquals(ConcreteStringLayout.DEFAULT_STRING_BUILDER_SIZE, 
sb.capacity(), "initial capacity");
+        try {
+            assertEquals(ConcreteStringLayout.DEFAULT_STRING_BUILDER_SIZE, 
sb.capacity(), "initial capacity");
 
-        final int SMALL = 100;
-        final String smallMessage = new String(new char[SMALL]);
-        sb.append(smallMessage);
-        assertEquals(initialCapacity, sb.capacity(), "capacity not grown");
-        assertEquals(SMALL, sb.length(), "length=msg length");
-        layout.releaseStringBuilder(sb);
+            final int SMALL = 100;
+            final String smallMessage = new String(new char[SMALL]);
+            sb.append(smallMessage);
+            assertEquals(initialCapacity, sb.capacity(), "capacity not grown");
+            assertEquals(SMALL, sb.length(), "length=msg length");
+        } finally {
+            layout.releaseStringBuilder(sb);
+        }
 
         final StringBuilder sb2 = layout.acquireStringBuilder();
-        assertEquals(sb2.capacity(), initialCapacity, "capacity unchanged");
-        assertEquals(0, sb2.length(), "empty, ready for use");
+        try {
+            assertEquals(sb2.capacity(), initialCapacity, "capacity 
unchanged");
+            assertEquals(0, sb2.length(), "empty, ready for use");
 
-        final int LARGE = ConcreteStringLayout.MAX_STRING_BUILDER_SIZE * 2;
-        final String largeMessage = new String(new char[LARGE]);
-        sb2.append(largeMessage);
-        assertTrue(sb2.capacity() >= LARGE, "capacity grown to fit msg 
length");
-        assertTrue(sb2.capacity() >= 
ConcreteStringLayout.MAX_STRING_BUILDER_SIZE,
-                "capacity is now greater than max length");
-        assertEquals(LARGE, sb2.length(), "length=msg length");
-        sb2.setLength(0); // set 0 before next getStringBuilder() call
-        assertEquals(0, sb2.length(), "empty, cleared");
-        assertTrue(sb2.capacity() >= 
ConcreteStringLayout.MAX_STRING_BUILDER_SIZE, "capacity remains very large");
-        layout.releaseStringBuilder(sb2);
+            final int LARGE = ConcreteStringLayout.MAX_STRING_BUILDER_SIZE * 2;
+            final String largeMessage = new String(new char[LARGE]);
+            sb2.append(largeMessage);
+            assertTrue(sb2.capacity() >= LARGE, "capacity grown to fit msg 
length");
+            assertTrue(sb2.capacity() >= 
ConcreteStringLayout.MAX_STRING_BUILDER_SIZE,
+                    "capacity is now greater than max length");
+            assertEquals(LARGE, sb2.length(), "length=msg length");
+            sb2.setLength(0); // set 0 before next getStringBuilder() call
+            assertEquals(0, sb2.length(), "empty, cleared");
+            assertTrue(sb2.capacity() >= 
ConcreteStringLayout.MAX_STRING_BUILDER_SIZE, "capacity remains very large");
+        } finally {
+            layout.releaseStringBuilder(sb2);
+        }
 
         final StringBuilder sb3 = layout.acquireStringBuilder();
-        assertEquals(ConcreteStringLayout.MAX_STRING_BUILDER_SIZE, 
sb3.capacity(),
-                "capacity, trimmed to MAX_STRING_BUILDER_SIZE");
-        assertEquals(0, sb3.length(), "empty, ready for use");
+        try {
+            assertEquals(ConcreteStringLayout.MAX_STRING_BUILDER_SIZE, 
sb3.capacity(),
+                    "capacity, trimmed to MAX_STRING_BUILDER_SIZE");
+            assertEquals(0, sb3.length(), "empty, ready for use");
+        } finally {
+            layout.releaseStringBuilder(sb3);
+        }
+
     }
 
 }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
index 69baf2f181..bd911e8e8b 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
@@ -16,19 +16,6 @@
  */
 package org.apache.logging.log4j.core.layout;
 
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.zip.DeflaterOutputStream;
-import java.util.zip.GZIPOutputStream;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
@@ -38,28 +25,26 @@ import 
org.apache.logging.log4j.core.layout.internal.IncludeChecker;
 import org.apache.logging.log4j.core.layout.internal.ListChecker;
 import org.apache.logging.log4j.core.lookup.StrSubstitutor;
 import org.apache.logging.log4j.core.net.Severity;
-import org.apache.logging.log4j.core.util.JsonUtils;
-import org.apache.logging.log4j.core.util.KeyValuePair;
-import org.apache.logging.log4j.core.util.NetUtils;
-import org.apache.logging.log4j.core.util.Patterns;
-import org.apache.logging.log4j.core.util.StringBuilderWriter;
+import org.apache.logging.log4j.core.util.*;
 import org.apache.logging.log4j.message.MapMessage;
 import org.apache.logging.log4j.message.Message;
-import org.apache.logging.log4j.plugins.Configurable;
-import org.apache.logging.log4j.plugins.Inject;
-import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.plugins.PluginElement;
-import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.spi.LoggingSystem;
+import org.apache.logging.log4j.plugins.*;
 import org.apache.logging.log4j.spi.Recycler;
-import org.apache.logging.log4j.spi.RecyclerFactory;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
 import org.apache.logging.log4j.util.StringBuilders;
 import org.apache.logging.log4j.util.Strings;
 import org.apache.logging.log4j.util.TriConsumer;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.zip.DeflaterOutputStream;
+import java.util.zip.GZIPOutputStream;
+
 /**
  * Lays out events in the Graylog Extended Log Format (GELF) 1.1.
  * <p>
@@ -176,8 +161,6 @@ public final class GelfLayout extends AbstractStringLayout {
         @PluginElement("PatternSelector")
         private PatternSelector patternSelector = null;
 
-        private RecyclerFactory recyclerFactory;
-
         public Builder() {
             super();
             setCharset(StandardCharsets.UTF_8);
@@ -206,13 +189,10 @@ public final class GelfLayout extends 
AbstractStringLayout {
                         .setConfiguration(config)
                         .build();
             }
-            if (recyclerFactory == null) {
-                recyclerFactory = config != null ? config.getRecyclerFactory() 
: LoggingSystem.getRecyclerFactory();
-            }
             return new GelfLayout(config, host, additionalFields, 
compressionType, compressionThreshold,
                     includeStacktrace, includeThreadContext, 
includeMapMessage, includeNullDelimiter,
                     includeNewLineDelimiter, omitEmptyFields, mdcChecker, 
mapChecker, patternLayout,
-                    threadContextPrefix, mapPrefix, recyclerFactory);
+                    threadContextPrefix, mapPrefix);
         }
 
         private ListChecker createChecker(final String excludes, final String 
includes) {
@@ -449,11 +429,6 @@ public final class GelfLayout extends AbstractStringLayout 
{
             return asBuilder();
         }
 
-        @Inject
-        public B setRecyclerFactory(final RecyclerFactory recyclerFactory) {
-            this.recyclerFactory = recyclerFactory;
-            return asBuilder();
-        }
     }
 
     private GelfLayout(final Configuration config, final String host, final 
KeyValuePair[] additionalFields,
@@ -461,7 +436,7 @@ public final class GelfLayout extends AbstractStringLayout {
             final boolean includeThreadContext, final boolean 
includeMapMessage, final boolean includeNullDelimiter,
             final boolean includeNewLineDelimiter, final boolean 
omitEmptyFields, final ListChecker mdcChecker,
             final ListChecker mapChecker, final PatternLayout patternLayout, 
final String mdcPrefix,
-            final String mapPrefix, final RecyclerFactory recyclerFactory) {
+            final String mapPrefix) {
         super(config, StandardCharsets.UTF_8, null, null);
         this.host = host != null ? host : NetUtils.getLocalHostname();
         this.additionalFields = additionalFields != null ? additionalFields : 
new KeyValuePair[0];
@@ -486,7 +461,7 @@ public final class GelfLayout extends AbstractStringLayout {
         this.mdcWriter = new FieldWriter(mdcChecker, mdcPrefix);
         this.mapWriter = new FieldWriter(mapChecker, mapPrefix);
         this.layout = patternLayout;
-        stacktraceRecycler = recyclerFactory.create(
+        stacktraceRecycler = config.getRecyclerFactory().create(
                 () -> new StringBuilderWriter(MAX_STRING_BUILDER_SIZE),
                 writer -> {
                     final StringBuilder stringBuilder = writer.getBuilder();
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index 2f365b47a4..b34f25c249 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -106,9 +106,17 @@ public final class PatternLayout extends 
AbstractStringLayout {
      * @param headerPattern header conversion pattern.
      * @param footerPattern footer conversion pattern.
      */
-    private PatternLayout(final Configuration config, final RegexReplacement 
replace, final String eventPattern,
-            final PatternSelector patternSelector, final Charset charset, 
final boolean alwaysWriteExceptions,
-            final boolean disableAnsi, final boolean noConsoleNoAnsi, final 
String headerPattern,
+    private PatternLayout(
+            final Configuration config,
+            final RecyclerFactory recyclerFactory,
+            final RegexReplacement replace,
+            final String eventPattern,
+            final PatternSelector patternSelector,
+            final Charset charset,
+            final boolean alwaysWriteExceptions,
+            final boolean disableAnsi,
+            final boolean noConsoleNoAnsi,
+            final String headerPattern,
             final String footerPattern) {
         super(config, charset,
                 newSerializerBuilder()
@@ -371,6 +379,7 @@ public final class PatternLayout extends 
AbstractStringLayout {
     public static class SerializerBuilder implements 
org.apache.logging.log4j.plugins.util.Builder<Serializer> {
 
         private Configuration configuration;
+        private RecyclerFactory recyclerFactory;
         private RegexReplacement replace;
         private String pattern;
         private String defaultPattern;
@@ -384,9 +393,11 @@ public final class PatternLayout extends 
AbstractStringLayout {
             if (Strings.isEmpty(pattern) && Strings.isEmpty(defaultPattern)) {
                 return null;
             }
-            final RecyclerFactory recyclerFactory = configuration != null
-                    ? configuration.getRecyclerFactory()
-                    : LoggingSystem.getRecyclerFactory();
+            if (recyclerFactory == null) {
+                recyclerFactory = configuration != null
+                        ? configuration.getRecyclerFactory()
+                        : LoggingSystem.getRecyclerFactory();
+            }
             final Recycler<StringBuilder> recycler = 
createRecycler(recyclerFactory);
             if (patternSelector == null) {
                 try {
@@ -420,6 +431,11 @@ public final class PatternLayout extends 
AbstractStringLayout {
             return this;
         }
 
+        public SerializerBuilder setRecyclerFactory(final RecyclerFactory 
recyclerFactory) {
+            this.recyclerFactory = recyclerFactory;
+            return this;
+        }
+
         public SerializerBuilder setReplace(final RegexReplacement replace) {
             this.replace = replace;
             return this;
@@ -561,6 +577,9 @@ public final class PatternLayout extends 
AbstractStringLayout {
         @PluginConfiguration
         private Configuration configuration;
 
+        @PluginBuilderAttribute
+        private RecyclerFactory recyclerFactory;
+
         @PluginElement("Replace")
         private RegexReplacement regexReplacement;
 
@@ -620,6 +639,14 @@ public final class PatternLayout extends 
AbstractStringLayout {
             return this;
         }
 
+        /**
+         * @param recyclerFactory a recycler factory
+         */
+        public Builder setRecyclerFactory(final RecyclerFactory 
recyclerFactory) {
+            this.recyclerFactory = recyclerFactory;
+            return this;
+        }
+
         /**
          * @param regexReplacement
          *        A Regex replacement
@@ -693,7 +720,8 @@ public final class PatternLayout extends 
AbstractStringLayout {
             if (configuration == null) {
                 configuration = new DefaultConfiguration();
             }
-            return new PatternLayout(configuration, regexReplacement, pattern, 
patternSelector, charset,
+            return new PatternLayout(
+                    configuration, recyclerFactory, regexReplacement, pattern, 
patternSelector, charset,
                 alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi, header, 
footer);
         }
     }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
index 23bfacf544..71f8497f65 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
@@ -594,25 +594,25 @@ public final class Rfc5424Layout extends 
AbstractStringLayout {
     /**
      * Create the RFC 5424 Layout.
      *
-     * @param facility            The Facility is used to try to classify the 
message.
-     * @param id                  The default structured data id to use when 
formatting according to RFC 5424.
-     * @param enterpriseNumber    The IANA enterprise number.
-     * @param includeMDC          Indicates whether data from the 
ThreadContextMap will be included in the RFC 5424 Syslog
-     *                            record. Defaults to "true:.
-     * @param mdcId               The id to use for the MDC Structured Data 
Element.
-     * @param mdcPrefix           The prefix to add to MDC key names.
-     * @param eventPrefix         The prefix to add to event key names.
-     * @param newLine             If true, a newline will be appended to the 
end of the syslog record. The default is false.
-     * @param escapeNL            String that should be used to replace 
newlines within the message text.
-     * @param appName             The value to use as the APP-NAME in the RFC 
5424 syslog record.
-     * @param msgId               The default value to be used in the MSGID 
field of RFC 5424 syslog records.
-     * @param excludes            A comma separated list of MDC keys that 
should be excluded from the LogEvent.
-     * @param includes            A comma separated list of MDC keys that 
should be included in the FlumeEvent.
-     * @param required            A comma separated list of MDC keys that must 
be present in the MDC.
-     * @param exceptionPattern    The pattern for formatting exceptions.
+     * @param facility The Facility is used to try to classify the message.
+     * @param id The default structured data id to use when formatting 
according to RFC 5424.
+     * @param enterpriseNumber The IANA enterprise number.
+     * @param includeMDC Indicates whether data from the ThreadContextMap will 
be included in the RFC 5424 Syslog
+     *            record. Defaults to "true:.
+     * @param mdcId The id to use for the MDC Structured Data Element.
+     * @param mdcPrefix The prefix to add to MDC key names.
+     * @param eventPrefix The prefix to add to event key names.
+     * @param newLine If true, a newline will be appended to the end of the 
syslog record. The default is false.
+     * @param escapeNL String that should be used to replace newlines within 
the message text.
+     * @param appName The value to use as the APP-NAME in the RFC 5424 syslog 
record.
+     * @param msgId The default value to be used in the MSGID field of RFC 
5424 syslog records.
+     * @param excludes A comma separated list of MDC keys that should be 
excluded from the LogEvent.
+     * @param includes A comma separated list of MDC keys that should be 
included in the FlumeEvent.
+     * @param required A comma separated list of MDC keys that must be present 
in the MDC.
+     * @param exceptionPattern The pattern for formatting exceptions.
      * @param useTlsMessageFormat If true the message will be formatted 
according to RFC 5425.
-     * @param loggerFields        Container for the KeyValuePairs containing 
the patterns
-     * @param config              The Configuration. Some Converters require 
access to the Interpolator.
+     * @param loggerFields Container for the KeyValuePairs containing the 
patterns
+     * @param config The Configuration. Some Converters require access to the 
Interpolator.
      * @return An Rfc5424Layout.
      * @deprecated Use {@link Rfc5424LayoutBuilder instead}
      */
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java
index 578da7717d..62fc657e36 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java
@@ -112,7 +112,7 @@ public final class Constants {
      * Maximum size of the StringBuilders used in RingBuffer LogEvents to 
store the contents of reusable Messages.
      * After a large message has been delivered to the appenders, the 
StringBuilder is trimmed to this size.
      * <p>
-     * The default value is 518, which allows the StringBuilder to resize 
three times from its initial size.
+     * The default value is {@value}, which allows the StringBuilder to resize 
three times from its initial size.
      * Users can override with system property "log4j.maxReusableMsgSize".
      * </p>
      * @since 2.6
diff --git 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
index 1bd4895de1..a9edfb8b76 100644
--- 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
+++ 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
@@ -16,16 +16,6 @@
  */
 package org.apache.logging.log4j.layout.template.json;
 
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.CodingErrorAction;
-import java.util.*;
-import java.util.function.Function;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.StringLayout;
@@ -42,10 +32,19 @@ import 
org.apache.logging.log4j.layout.template.json.util.Uris;
 import org.apache.logging.log4j.plugins.*;
 import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.spi.Recycler;
-import org.apache.logging.log4j.spi.RecyclerFactory;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
 
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CodingErrorAction;
+import java.util.*;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
 @Configurable(elementType = Layout.ELEMENT_TYPE)
 @Plugin
 public class JsonTemplateLayout implements StringLayout {
@@ -94,11 +93,7 @@ public class JsonTemplateLayout implements StringLayout {
                 .setMaxStringLength(builder.maxStringLength)
                 .setTruncatedStringSuffix(builder.truncatedStringSuffix)
                 .build();
-        this.eventResolver = createEventResolver(
-                builder,
-                configuration,
-                charset,
-                jsonWriter);
+        this.eventResolver = createEventResolver(builder, configuration, 
charset, jsonWriter);
         this.contextRecycler = createContextRecycler(builder, jsonWriter);
     }
 
@@ -149,7 +144,6 @@ public class JsonTemplateLayout implements StringLayout {
                 .setSubstitutor(substitutor)
                 .setCharset(charset)
                 .setJsonWriter(jsonWriter)
-                .setRecyclerFactory(builder.recyclerFactory)
                 .setMaxStringByteCount(maxStringByteCount)
                 .setTruncatedStringSuffix(builder.truncatedStringSuffix)
                 .setLocationInfoEnabled(builder.locationInfoEnabled)
@@ -187,14 +181,9 @@ public class JsonTemplateLayout implements StringLayout {
                 : template;
     }
 
-    private static Recycler<Context> createContextRecycler(
-            final Builder builder,
-            final JsonWriter jsonWriter) {
-        final Supplier<Context> supplier =
-                createContextSupplier(builder.charset, jsonWriter);
-        return builder
-                .recyclerFactory
-                .create(supplier, Context::close);
+    private static Recycler<Context> createContextRecycler(final Builder 
builder, final JsonWriter jsonWriter) {
+        final Supplier<Context> supplier = 
createContextSupplier(builder.charset, jsonWriter);
+        return builder.configuration.getRecyclerFactory().create(supplier, 
Context::close);
     }
 
     private static Supplier<Context> createContextSupplier(
@@ -393,10 +382,6 @@ public class JsonTemplateLayout implements StringLayout {
         private String truncatedStringSuffix =
                 JsonTemplateLayoutDefaults.getTruncatedStringSuffix();
 
-        @PluginBuilderAttribute
-        private RecyclerFactory recyclerFactory =
-                JsonTemplateLayoutDefaults.getRecyclerFactory();
-
         private Builder() {
             // Do nothing.
         }
@@ -531,15 +516,6 @@ public class JsonTemplateLayout implements StringLayout {
             return this;
         }
 
-        public RecyclerFactory getRecyclerFactory() {
-            return recyclerFactory;
-        }
-
-        public Builder setRecyclerFactory(final RecyclerFactory 
recyclerFactory) {
-            this.recyclerFactory = recyclerFactory;
-            return this;
-        }
-
         @Override
         public JsonTemplateLayout build() {
             validate();
@@ -547,7 +523,7 @@ public class JsonTemplateLayout implements StringLayout {
         }
 
         private void validate() {
-            Objects.requireNonNull(configuration, "config");
+            Objects.requireNonNull(configuration, "configuration");
             if (Strings.isBlank(eventTemplate) && 
Strings.isBlank(eventTemplateUri)) {
                     throw new IllegalArgumentException(
                             "both eventTemplate and eventTemplateUri are 
blank");
@@ -564,7 +540,6 @@ public class JsonTemplateLayout implements StringLayout {
                                 maxStringLength);
             }
             Objects.requireNonNull(truncatedStringSuffix, 
"truncatedStringSuffix");
-            Objects.requireNonNull(recyclerFactory, "recyclerFactory");
         }
 
     }
diff --git 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
index db77071681..962853fa81 100644
--- 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
+++ 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
@@ -16,16 +16,14 @@
  */
 package org.apache.logging.log4j.layout.template.json;
 
+import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
+
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.Locale;
 import java.util.TimeZone;
 
-import org.apache.logging.log4j.spi.RecyclerFactories;
-import org.apache.logging.log4j.spi.RecyclerFactory;
-import org.apache.logging.log4j.util.PropertiesUtil;
-import org.apache.logging.log4j.util.PropertyEnvironment;
-
 public final class JsonTemplateLayoutDefaults {
 
     private JsonTemplateLayoutDefaults() {}
@@ -138,10 +136,4 @@ public final class JsonTemplateLayoutDefaults {
                 "…");
     }
 
-    public static RecyclerFactory getRecyclerFactory() {
-        final String recyclerFactorySpec = PROPERTIES.getStringProperty(
-                "log4j.layout.jsonTemplate.recyclerFactory");
-        return RecyclerFactories.ofSpec(recyclerFactorySpec);
-    }
-
 }
diff --git 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/CounterResolver.java
 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/CounterResolver.java
index 139a699f19..39892ee880 100644
--- 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/CounterResolver.java
+++ 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/CounterResolver.java
@@ -145,6 +145,7 @@ public class CounterResolver implements EventResolver {
     private static Recycler<StringBuilder> createStringBuilderRecycler(
             final EventResolverContext context) {
         return context
+                .getConfiguration()
                 .getRecyclerFactory()
                 .create(
                         StringBuilder::new,
diff --git 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverContext.java
 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverContext.java
index 28038ae81f..aa5cf04261 100644
--- 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverContext.java
+++ 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverContext.java
@@ -16,18 +16,17 @@
  */
 package org.apache.logging.log4j.layout.template.json.resolver;
 
-import java.nio.charset.Charset;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import 
org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.EventTemplateAdditionalField;
 import org.apache.logging.log4j.layout.template.json.util.JsonWriter;
-import org.apache.logging.log4j.spi.RecyclerFactory;
 import org.apache.logging.log4j.util.Strings;
 
+import java.nio.charset.Charset;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
 /**
  * {@link TemplateResolverContext} specialized for {@link LogEvent}s.
  *
@@ -48,8 +47,6 @@ public final class EventResolverContext implements 
TemplateResolverContext<LogEv
 
     private final JsonWriter jsonWriter;
 
-    private final RecyclerFactory recyclerFactory;
-
     private final int maxStringByteCount;
 
     private final String truncatedStringSuffix;
@@ -71,7 +68,6 @@ public final class EventResolverContext implements 
TemplateResolverContext<LogEv
         this.substitutor = builder.substitutor;
         this.charset = builder.charset;
         this.jsonWriter = builder.jsonWriter;
-        this.recyclerFactory = builder.recyclerFactory;
         this.maxStringByteCount = builder.maxStringByteCount;
         this.truncatedStringSuffix = builder.truncatedStringSuffix;
         this.locationInfoEnabled = builder.locationInfoEnabled;
@@ -114,10 +110,6 @@ public final class EventResolverContext implements 
TemplateResolverContext<LogEv
         return jsonWriter;
     }
 
-    public RecyclerFactory getRecyclerFactory() {
-        return recyclerFactory;
-    }
-
     public int getMaxStringByteCount() {
         return maxStringByteCount;
     }
@@ -164,8 +156,6 @@ public final class EventResolverContext implements 
TemplateResolverContext<LogEv
 
         private JsonWriter jsonWriter;
 
-        private RecyclerFactory recyclerFactory;
-
         private int maxStringByteCount;
 
         private String truncatedStringSuffix;
@@ -216,11 +206,6 @@ public final class EventResolverContext implements 
TemplateResolverContext<LogEv
             return this;
         }
 
-        public Builder setRecyclerFactory(final RecyclerFactory 
recyclerFactory) {
-            this.recyclerFactory = recyclerFactory;
-            return this;
-        }
-
         public Builder setMaxStringByteCount(final int maxStringByteCount) {
             this.maxStringByteCount = maxStringByteCount;
             return this;
@@ -272,7 +257,6 @@ public final class EventResolverContext implements 
TemplateResolverContext<LogEv
             Objects.requireNonNull(substitutor, "substitutor");
             Objects.requireNonNull(charset, "charset");
             Objects.requireNonNull(jsonWriter, "jsonWriter");
-            Objects.requireNonNull(recyclerFactory, "recyclerFactory");
             if (maxStringByteCount <= 0) {
                 throw new IllegalArgumentException(
                         "was expecting maxStringByteCount > 0: " +
diff --git 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/MessageParameterResolver.java
 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/MessageParameterResolver.java
index 3dc80ad16a..da935e0419 100644
--- 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/MessageParameterResolver.java
+++ 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/MessageParameterResolver.java
@@ -83,6 +83,7 @@ public final class MessageParameterResolver implements 
EventResolver {
             final EventResolverContext context,
             final TemplateResolverConfig config) {
         this.parameterConsumerStateRecycler = context
+                .getConfiguration()
                 .getRecyclerFactory()
                 .create(ParameterConsumerState::new);
         this.stringified = config.getBoolean("stringified", false);
diff --git 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ReadOnlyStringMapResolver.java
 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ReadOnlyStringMapResolver.java
index 7ea4730186..b5065d46f2 100644
--- 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ReadOnlyStringMapResolver.java
+++ 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/ReadOnlyStringMapResolver.java
@@ -212,7 +212,7 @@ class ReadOnlyStringMapResolver implements EventResolver {
         if (key != null) {
             return createKeyResolver(key, stringified, mapAccessor);
         } else {
-            final RecyclerFactory recyclerFactory = 
context.getRecyclerFactory();
+            final RecyclerFactory recyclerFactory = 
context.getConfiguration().getRecyclerFactory();
             return createResolver(
                     recyclerFactory,
                     flatten,
diff --git 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java
 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java
index c02f8f11b4..0b1a890d49 100644
--- 
a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java
+++ 
b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java
@@ -56,7 +56,7 @@ final class StackTraceStringResolver implements 
StackTraceResolver {
         final Supplier<TruncatingBufferedPrintWriter> writerSupplier =
                 () -> TruncatingBufferedPrintWriter.ofCapacity(
                         context.getMaxStringByteCount());
-        final RecyclerFactory recyclerFactory = context.getRecyclerFactory();
+        final RecyclerFactory recyclerFactory = 
context.getConfiguration().getRecyclerFactory();
         this.srcWriterRecycler =
                 recyclerFactory.create(
                         writerSupplier, TruncatingBufferedPrintWriter::close);


Reply via email to