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

pkarwasz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 30f527e02b1dcedb85eb9881bffb9afcc64f6c19
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Sat Mar 5 21:16:50 2022 +0100

    [LOG4J2-3426] Refactors wrapping code
    
    Refactors the wrapping logic into single `wrap` or `adapt` methods to be
    sure we always perform the correct logic.
    
    Conflicts:
        
log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java
        
log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RollingFileAppenderBuilder.java
        
log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/HtmlLayoutBuilder.java
        
log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/PatternLayoutBuilder.java
        
log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java
---
 .../src/main/java/org/apache/log4j/Category.java   |  2 +-
 .../org/apache/log4j/bridge/AppenderAdapter.java   | 26 ++++++++++++++++++--
 .../org/apache/log4j/bridge/AppenderWrapper.java   | 28 +++++++++++++++++++++-
 .../org/apache/log4j/bridge/FilterAdapter.java     | 25 ++++++++++++-------
 .../org/apache/log4j/bridge/FilterWrapper.java     | 21 ++++++++++++++++
 .../org/apache/log4j/bridge/LayoutAdapter.java     | 24 ++++++++++++++++++-
 .../org/apache/log4j/bridge/LayoutWrapper.java     | 18 ++++++++++++++
 .../org/apache/log4j/builders/AbstractBuilder.java |  2 +-
 .../builders/appender/AsyncAppenderBuilder.java    |  4 ++--
 .../builders/appender/ConsoleAppenderBuilder.java  |  9 ++-----
 .../appender/DailyRollingFileAppenderBuilder.java  |  9 ++-----
 .../builders/appender/FileAppenderBuilder.java     |  9 ++-----
 .../builders/appender/NullAppenderBuilder.java     |  4 ++--
 .../builders/appender/RewriteAppenderBuilder.java  |  2 +-
 .../appender/RollingFileAppenderBuilder.java       |  9 ++-----
 .../builders/appender/SocketAppenderBuilder.java   |  9 ++-----
 .../builders/appender/SyslogAppenderBuilder.java   | 10 +++-----
 .../builders/filter/LevelMatchFilterBuilder.java   |  2 +-
 .../builders/filter/LevelRangeFilterBuilder.java   |  2 +-
 .../builders/filter/StringMatchFilterBuilder.java  |  2 +-
 .../log4j/builders/layout/HtmlLayoutBuilder.java   |  2 +-
 .../builders/layout/PatternLayoutBuilder.java      |  2 +-
 .../log4j/builders/layout/TTCCLayoutBuilder.java   |  2 +-
 .../log4j/builders/layout/XmlLayoutBuilder.java    |  2 +-
 .../log4j/config/PropertiesConfiguration.java      | 12 ++--------
 .../org/apache/log4j/xml/XmlConfiguration.java     |  6 +----
 .../log4j/builders/Log4j2ListAppenderBuilder.java  |  9 ++-----
 27 files changed, 161 insertions(+), 91 deletions(-)

diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java 
b/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
index 82a6e1b..cce2c86 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
@@ -376,7 +376,7 @@ public class Category implements AppenderAttachable {
         if (appender == null && LogManager.isLog4jCorePresent()) {
             final org.apache.logging.log4j.core.Appender coreAppender = 
CategoryUtil.getAppenders(logger).get(name);
             if (coreAppender != null) {
-                addAppender(appender = new AppenderWrapper(coreAppender));
+                addAppender(appender = AppenderWrapper.adapt(coreAppender));
             }
         }
         return appender;
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderAdapter.java 
b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderAdapter.java
index 1d36c45..f57e29d 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderAdapter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderAdapter.java
@@ -34,12 +34,34 @@ public class AppenderAdapter {
     private final Adapter adapter;
 
     /**
+     * Adapts a Log4j 1.x appender into a Log4j 2.x appender. Applying this 
method
+     * on the result of
+     * {@link AppenderWrapper#adapt(org.apache.logging.log4j.core.Appender)} 
should
+     * return the original Log4j 2.x appender.
+     * 
+     * @param appender a Log4j 1.x appender
+     * @return a Log4j 2.x appender or {@code null} if the parameter is {@code 
null}
+     */
+    public static org.apache.logging.log4j.core.Appender adapt(Appender 
appender) {
+        if (appender instanceof org.apache.logging.log4j.core.Appender) {
+            return (org.apache.logging.log4j.core.Appender) appender;
+        }
+        if (appender instanceof AppenderWrapper) {
+            return ((AppenderWrapper) appender).getAppender();
+        }
+        if (appender != null) {
+            return new AppenderAdapter(appender).getAdapter();
+        }
+        return null;
+    }
+
+    /**
      * Constructor.
      * @param appender The Appender to wrap.
      */
-    public AppenderAdapter(Appender appender) {
+    private AppenderAdapter(Appender appender) {
         this.appender = appender;
-        final org.apache.logging.log4j.core.Filter appenderFilter = 
FilterAdapter.convertFilter(appender.getFilter());
+        final org.apache.logging.log4j.core.Filter appenderFilter = 
FilterAdapter.adapt(appender.getFilter());
         this.adapter = new Adapter(appender.getName(), appenderFilter, null, 
true, null);
     }
 
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderWrapper.java 
b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderWrapper.java
index 3d28fd7..d4b1869 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderWrapper.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/AppenderWrapper.java
@@ -18,6 +18,7 @@ package org.apache.log4j.bridge;
 
 import org.apache.log4j.Appender;
 import org.apache.log4j.Layout;
+import org.apache.log4j.bridge.AppenderAdapter.Adapter;
 import org.apache.log4j.spi.ErrorHandler;
 import org.apache.log4j.spi.Filter;
 import org.apache.log4j.spi.LoggingEvent;
@@ -35,6 +36,31 @@ public class AppenderWrapper implements Appender {
     private final org.apache.logging.log4j.core.Appender appender;
 
     /**
+     * Adapts a Log4j 2.x appender into a Log4j 1.x appender. Applying this 
method
+     * on the result of {@link AppenderAdapter#adapt(Appender)} should return 
the
+     * original Log4j 1.x appender.
+     * 
+     * @param appender a Log4j 2.x appender
+     * @return a Log4j 1.x appender or {@code null} if the parameter is {@code 
null}
+     */
+    public static Appender adapt(org.apache.logging.log4j.core.Appender 
appender) {
+        if (appender instanceof Appender) {
+            return (Appender) appender;
+        }
+        if (appender instanceof Adapter) {
+            Adapter adapter = (Adapter) appender;
+            // Don't unwrap an appender with filters
+            if (!adapter.hasFilter()) {
+                return adapter.getAppender();
+            }
+        }
+        if (appender != null) {
+            return new AppenderWrapper(appender);
+        }
+        return null;
+    }
+
+    /**
      * Constructs a new instance for a Core Appender.
      *
      * @param appender a Core Appender.
@@ -55,7 +81,7 @@ public class AppenderWrapper implements Appender {
     @Override
     public void addFilter(Filter newFilter) {
         if (appender instanceof AbstractFilterable) {
-            ((AbstractFilterable) 
appender).addFilter(FilterAdapter.convertFilter(newFilter));
+            ((AbstractFilterable) 
appender).addFilter(FilterAdapter.adapt(newFilter));
         } else {
             LOGGER.warn("Unable to add filter to appender {}, it does not 
support filters", appender.getName());
         }
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/FilterAdapter.java 
b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/FilterAdapter.java
index e10478c..7110433 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/FilterAdapter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/FilterAdapter.java
@@ -30,16 +30,23 @@ public class FilterAdapter extends AbstractFilter {
     private final Filter filter;
 
     /**
-     * Converts a Log4j 1.x filter into a Log4j 2.x filter.
+     * Adapts a Log4j 1.x filter into a Log4j 2.x filter. Applying this method 
to
+     * the result of
+     * {@link FilterWrapper#adapt(org.apache.logging.log4j.core.Filter)} should
+     * return the original Log4j 2.x filter.
      * 
-     * @param filter
-     *            a Log4j 1.x filter
-     * @return a Log4j 2.x filter
+     * @param filter a Log4j 1.x filter
+     * @return a Log4j 2.x filter or {@code null} if the parameter is {@code 
null}
      */
-    public static org.apache.logging.log4j.core.Filter convertFilter(Filter 
filter) {
+    public static org.apache.logging.log4j.core.Filter adapt(Filter filter) {
+        if (filter instanceof org.apache.logging.log4j.core.Filter) {
+            return (org.apache.logging.log4j.core.Filter) filter;
+        }
+        // Don't unwrap the head of a filter chain
         if (filter instanceof FilterWrapper && filter.getNext() == null) {
             return ((FilterWrapper) filter).getFilter();
-        } else if (filter != null) {
+        }
+        if (filter != null) {
             return new FilterAdapter(filter);
         }
         return null;
@@ -62,12 +69,12 @@ public class FilterAdapter extends AbstractFilter {
         if (first instanceof FilterWrapper && ((FilterWrapper) 
first).getFilter() instanceof CompositeFilter) {
             composite = (CompositeFilter) ((FilterWrapper) first).getFilter();
         } else {
-            composite = CompositeFilter.createFilters(new 
org.apache.logging.log4j.core.Filter[] {convertFilter(first)});
+            composite = CompositeFilter.createFilters(new 
org.apache.logging.log4j.core.Filter[] {adapt(first)});
         }
-        return new FilterWrapper(composite.addFilter(convertFilter(second)));
+        return FilterWrapper.adapt(composite.addFilter(adapt(second)));
     }
 
-    public FilterAdapter(Filter filter) {
+    private FilterAdapter(Filter filter) {
         this.filter = filter;
     }
 
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/FilterWrapper.java 
b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/FilterWrapper.java
index b2855cd..9783be3 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/FilterWrapper.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/FilterWrapper.java
@@ -27,6 +27,27 @@ public class FilterWrapper extends Filter {
 
     private final org.apache.logging.log4j.core.Filter filter;
 
+    /**
+     * Adapts a Log4j 2.x filter into a Log4j 1.x filter. Applying this method 
to
+     * the result of {@link FilterAdapter#adapt(Filter)} should return the 
original
+     * Log4j 1.x filter.
+     * 
+     * @param filter a Log4j 2.x filter
+     * @return a Log4j 1.x filter or {@code null} if the parameter is {@code 
null}
+     */
+    public static Filter adapt(org.apache.logging.log4j.core.Filter filter) {
+        if (filter instanceof Filter) {
+            return (Filter) filter;
+        }
+        if (filter instanceof FilterAdapter) {
+            return ((FilterAdapter) filter).getFilter();
+        }
+        if (filter != null) {
+            return new FilterWrapper(filter);
+        }
+        return null;
+    }
+
     public FilterWrapper(org.apache.logging.log4j.core.Filter filter) {
         this.filter = filter;
     }
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LayoutAdapter.java 
b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LayoutAdapter.java
index 818e1fd..a98b0a8 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LayoutAdapter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LayoutAdapter.java
@@ -29,10 +29,32 @@ import 
org.apache.logging.log4j.core.layout.ByteBufferDestination;
 public class LayoutAdapter implements 
org.apache.logging.log4j.core.Layout<String> {
     private final Layout layout;
 
-    public LayoutAdapter(Layout layout) {
+    /**
+     * Adapts a Log4j 1.x layout into a Log4j 2.x layout. Applying this method 
to
+     * the result of
+     * {@link LayoutWrapper#adapt(org.apache.logging.log4j.core.Layout)} should
+     * return the original Log4j 2.x layout.
+     * 
+     * @param layout a Log4j 1.x layout
+     * @return a Log4j 2.x layout or {@code null} if the parameter is {@code 
null}
+     */
+    public static org.apache.logging.log4j.core.Layout<?> adapt(Layout layout) 
{
+        if (layout instanceof LayoutWrapper) {
+            return ((LayoutWrapper) layout).getLayout();
+        }
+        if (layout != null) {
+            return new LayoutAdapter(layout);
+        }
+        return null;
+    }
+
+    private LayoutAdapter(Layout layout) {
         this.layout = layout;
     }
 
+    public Layout getLayout() {
+        return layout;
+    }
 
     @Override
     public byte[] getFooter() {
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LayoutWrapper.java 
b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LayoutWrapper.java
index b7ac317..76d6d5d 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LayoutWrapper.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LayoutWrapper.java
@@ -27,6 +27,24 @@ public class LayoutWrapper extends Layout {
     private final org.apache.logging.log4j.core.Layout<?> layout;
 
     /**
+     * Adapts a Log4j 2.x layout into a Log4j 1.x layout. Applying this method 
to
+     * the result of {@link LayoutAdapter#adapt(Layout)} should return the 
original
+     * Log4j 1.x layout.
+     * 
+     * @param layout a Log4j 2.x layout
+     * @return a Log4j 1.x layout or {@code null} if the parameter is {@code 
null}
+     */
+    public static Layout adapt(org.apache.logging.log4j.core.Layout<?> layout) 
{
+        if (layout instanceof LayoutAdapter) {
+            return ((LayoutAdapter) layout).getLayout();
+        }
+        if (layout != null) {
+            return new LayoutWrapper(layout);
+        }
+        return null;
+    }
+
+    /**
      * Constructs a new instance.
      *
      * @param layout The layout to wrap.
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/AbstractBuilder.java 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/AbstractBuilder.java
index 56a143f..0969ef0 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/AbstractBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/AbstractBuilder.java
@@ -83,7 +83,7 @@ public abstract class AbstractBuilder<T> implements 
Builder<T> {
         if (filter != null) {
             head = FilterAdapter.addFilter(head, filter);
         }
-        return FilterAdapter.convertFilter(head);
+        return FilterAdapter.adapt(head);
     }
 
     private String capitalize(final String value) {
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java
index 5aece66..b3856b7 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AsyncAppenderBuilder.java
@@ -145,8 +145,8 @@ public class AsyncAppenderBuilder extends AbstractBuilder 
implements AppenderBui
             refs[index++] = AppenderRef.createAppenderRef(appenderRef, 
logLevel, null);
         }
         Builder builder = AsyncAppender.newBuilder();
-        builder.setFilter(FilterAdapter.convertFilter(filter));
-        return new AppenderWrapper(builder.setName(name)
+        builder.setFilter(FilterAdapter.adapt(filter));
+        return AppenderWrapper.adapt(builder.setName(name)
                 .setAppenderRefs(refs)
                 .setBlocking(blocking)
                 .setBufferSize(bufferSize)
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/ConsoleAppenderBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/ConsoleAppenderBuilder.java
index 95db77a..b82057b 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/ConsoleAppenderBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/ConsoleAppenderBuilder.java
@@ -130,17 +130,12 @@ public class ConsoleAppenderBuilder extends 
AbstractBuilder implements AppenderB
 
     private <T extends Log4j1Configuration> Appender createAppender(final 
String name, final Layout layout, final Filter filter,
             final String level, final String target, final boolean 
immediateFlush, final boolean follow, final T configuration) {
-        org.apache.logging.log4j.core.Layout<?> consoleLayout = null;
+        org.apache.logging.log4j.core.Layout<?> consoleLayout = 
LayoutAdapter.adapt(layout);
 
-        if (layout instanceof LayoutWrapper) {
-            consoleLayout = ((LayoutWrapper) layout).getLayout();
-        } else if (layout != null) {
-            consoleLayout = new LayoutAdapter(layout);
-        }
         final org.apache.logging.log4j.core.Filter consoleFilter = 
buildFilters(level, filter);
         final ConsoleAppender.Target consoleTarget = SYSTEM_ERR.equals(target)
                 ? ConsoleAppender.Target.SYSTEM_ERR : 
ConsoleAppender.Target.SYSTEM_OUT;
-        return new AppenderWrapper(ConsoleAppender.newBuilder()
+        return AppenderWrapper.adapt(ConsoleAppender.newBuilder()
                 .setName(name)
                 .setTarget(consoleTarget)
                 .setFollow(follow)
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/DailyRollingFileAppenderBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/DailyRollingFileAppenderBuilder.java
index c0704a1..10666f3 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/DailyRollingFileAppenderBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/DailyRollingFileAppenderBuilder.java
@@ -141,15 +141,10 @@ public class DailyRollingFileAppenderBuilder extends 
AbstractBuilder implements
             final String level, final boolean bufferedIo, final int 
bufferSize, final String datePattern,
             final T configuration, final Clock clock) {
 
-        org.apache.logging.log4j.core.Layout<?> fileLayout = null;
+        org.apache.logging.log4j.core.Layout<?> fileLayout = 
LayoutAdapter.adapt(layout);
         if (bufferedIo) {
             immediateFlush = false;
         }
-        if (layout instanceof LayoutWrapper) {
-            fileLayout = ((LayoutWrapper) layout).getLayout();
-        } else if (layout != null) {
-            fileLayout = new LayoutAdapter(layout);
-        }
         final org.apache.logging.log4j.core.Filter fileFilter = 
buildFilters(level, filter);
         if (fileName == null) {
             LOGGER.error("Unable to create DailyRollingFileAppender, no file 
name provided");
@@ -162,7 +157,7 @@ public class DailyRollingFileAppenderBuilder extends 
AbstractBuilder implements
                 .setConfig(configuration)
                 .setMax(Integer.toString(Integer.MAX_VALUE))
                 .build();
-        return new AppenderWrapper(RollingFileAppender.newBuilder()
+        return AppenderWrapper.adapt(RollingFileAppender.newBuilder()
                 .setName(name)
                 .setConfiguration(configuration)
                 .setLayout(fileLayout)
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/FileAppenderBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/FileAppenderBuilder.java
index 65bd489..9eada23 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/FileAppenderBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/FileAppenderBuilder.java
@@ -125,21 +125,16 @@ public class FileAppenderBuilder extends AbstractBuilder 
implements AppenderBuil
     private Appender createAppender(final String name, final 
Log4j1Configuration configuration, final Layout layout,
             final Filter filter, final String fileName, final String level, 
boolean immediateFlush, final boolean append,
             final boolean bufferedIo, final int bufferSize) {
-        org.apache.logging.log4j.core.Layout<?> fileLayout = null;
+        org.apache.logging.log4j.core.Layout<?> fileLayout = 
LayoutAdapter.adapt(layout);
         if (bufferedIo) {
             immediateFlush = false;
         }
-        if (layout instanceof LayoutWrapper) {
-            fileLayout = ((LayoutWrapper) layout).getLayout();
-        } else if (layout != null) {
-            fileLayout = new LayoutAdapter(layout);
-        }
         final org.apache.logging.log4j.core.Filter fileFilter = 
buildFilters(level, filter);
         if (fileName == null) {
             LOGGER.error("Unable to create FileAppender, no file name 
provided");
             return null;
         }
-        return new AppenderWrapper(FileAppender.newBuilder()
+        return AppenderWrapper.adapt(FileAppender.newBuilder()
                 .setName(name)
                 .setConfiguration(configuration)
                 .setLayout(fileLayout)
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/NullAppenderBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/NullAppenderBuilder.java
index 960a9fe..cfb7749 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/NullAppenderBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/NullAppenderBuilder.java
@@ -37,13 +37,13 @@ public class NullAppenderBuilder implements AppenderBuilder 
{
     @Override
     public Appender parseAppender(final Element appenderElement, final 
XmlConfiguration config) {
         final String name = appenderElement.getAttribute("name");
-        return new AppenderWrapper(NullAppender.createAppender(name));
+        return AppenderWrapper.adapt(NullAppender.createAppender(name));
     }
 
 
     @Override
     public Appender parseAppender(final String name, final String 
appenderPrefix, final String layoutPrefix,
             final String filterPrefix, final Properties props, final 
PropertiesConfiguration configuration) {
-        return new AppenderWrapper(NullAppender.createAppender(name));
+        return AppenderWrapper.adapt(NullAppender.createAppender(name));
     }
 }
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java
index 9e1b3b5..8143915 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RewriteAppenderBuilder.java
@@ -141,7 +141,7 @@ public class RewriteAppenderBuilder extends AbstractBuilder 
implements AppenderB
         } else {
             rewritePolicy = new RewritePolicyAdapter(policy);
         }
-        return new AppenderWrapper(RewriteAppender.createAppender(name, true, 
refs, configuration,
+        return AppenderWrapper.adapt(RewriteAppender.createAppender(name, 
true, refs, configuration,
                 rewritePolicy, rewriteFilter));
     }
 }
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RollingFileAppenderBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RollingFileAppenderBuilder.java
index 4cd8bb4..5390854 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RollingFileAppenderBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/RollingFileAppenderBuilder.java
@@ -146,15 +146,10 @@ public class RollingFileAppenderBuilder extends 
AbstractBuilder implements Appen
             final Filter filter, final boolean append, final boolean 
bufferedIo, final int bufferSize,
             boolean immediateFlush, final String fileName, final String level, 
final String maxSize,
             final String maxBackups, final Clock clock) {
-        org.apache.logging.log4j.core.Layout<?> fileLayout = null;
+        org.apache.logging.log4j.core.Layout<?> fileLayout = 
LayoutAdapter.adapt(layout);
         if (!bufferedIo) {
             immediateFlush = false;
         }
-        if (layout instanceof LayoutWrapper) {
-            fileLayout = ((LayoutWrapper) layout).getLayout();
-        } else if (layout != null) {
-            fileLayout = new LayoutAdapter(layout);
-        }
         final org.apache.logging.log4j.core.Filter fileFilter = 
buildFilters(level, filter);
         if (fileName == null) {
             LOGGER.error("Unable to create RollingFileAppender, no file name 
provided");
@@ -168,7 +163,7 @@ public class RollingFileAppenderBuilder extends 
AbstractBuilder implements Appen
                 .setConfig(config)
                 .setMax(maxBackups)
                 .build();
-        return new AppenderWrapper(RollingFileAppender.newBuilder()
+        return AppenderWrapper.adapt(RollingFileAppender.newBuilder()
                 .setName(name)
                 .setConfiguration(config)
                 .setLayout(fileLayout)
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SocketAppenderBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SocketAppenderBuilder.java
index a5fa418..a35b369 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SocketAppenderBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SocketAppenderBuilder.java
@@ -71,15 +71,10 @@ public class SocketAppenderBuilder extends AbstractBuilder 
implements AppenderBu
 
     private <T extends Log4j1Configuration> Appender createAppender(final 
String name, final String host, final int port, final Layout layout,
         final Filter filter, final String level, final boolean immediateFlush, 
final int reconnectDelayMillis, final T configuration) {
-        org.apache.logging.log4j.core.Layout<?> actualLayout = null;
-        if (layout instanceof LayoutWrapper) {
-            actualLayout = ((LayoutWrapper) layout).getLayout();
-        } else if (layout != null) {
-            actualLayout = new LayoutAdapter(layout);
-        }
+        org.apache.logging.log4j.core.Layout<?> actualLayout = 
LayoutAdapter.adapt(layout);
         final org.apache.logging.log4j.core.Filter actualFilter = 
buildFilters(level, filter);
         // @formatter:off
-        return new AppenderWrapper(SocketAppender.newBuilder()
+        return AppenderWrapper.adapt(SocketAppender.newBuilder()
             .setHost(host)
             .setPort(port)
             .setReconnectDelayMillis(reconnectDelayMillis)
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java
index 3987fad..dd5be72 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/SyslogAppenderBuilder.java
@@ -127,12 +127,8 @@ public class SyslogAppenderBuilder extends AbstractBuilder 
implements AppenderBu
         final AtomicReference<String> host = new AtomicReference<>();
         final AtomicInteger port = new AtomicInteger();
         resolveSyslogHost(syslogHost, host, port);
-        org.apache.logging.log4j.core.Layout<? extends Serializable> 
appenderLayout;
-        if (layout instanceof LayoutWrapper) {
-            appenderLayout = ((LayoutWrapper) layout).getLayout();
-        } else if (layout != null) {
-            appenderLayout = new LayoutAdapter(layout);
-        } else {
+        org.apache.logging.log4j.core.Layout<? extends Serializable> 
appenderLayout = LayoutAdapter.adapt(layout);
+        if (appenderLayout == null) {
             appenderLayout = SyslogLayout.newBuilder()
                     .setFacility(Facility.toFacility(facility))
                     .setConfiguration(configuration)
@@ -140,7 +136,7 @@ public class SyslogAppenderBuilder extends AbstractBuilder 
implements AppenderBu
         }
 
         final org.apache.logging.log4j.core.Filter fileFilter = 
buildFilters(level, filter);
-        return new AppenderWrapper(SyslogAppender.newSyslogAppenderBuilder()
+        return AppenderWrapper.adapt(SyslogAppender.newSyslogAppenderBuilder()
                 .setName(name)
                 .setConfiguration(configuration)
                 .setLayout(appenderLayout)
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelMatchFilterBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelMatchFilterBuilder.java
index 2c45b10..60b838f 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelMatchFilterBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelMatchFilterBuilder.java
@@ -83,7 +83,7 @@ public class LevelMatchFilterBuilder extends 
AbstractBuilder<Filter> implements
         org.apache.logging.log4j.core.Filter.Result onMatch = acceptOnMatch
                 ? org.apache.logging.log4j.core.Filter.Result.ACCEPT
                 : org.apache.logging.log4j.core.Filter.Result.DENY;
-        return new FilterWrapper(LevelMatchFilter.newBuilder()
+        return FilterWrapper.adapt(LevelMatchFilter.newBuilder()
                 .setLevel(lvl)
                 .setOnMatch(onMatch)
                 
.setOnMismatch(org.apache.logging.log4j.core.Filter.Result.NEUTRAL)
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelRangeFilterBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelRangeFilterBuilder.java
index 88f45cd..bcdd382 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelRangeFilterBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/LevelRangeFilterBuilder.java
@@ -94,7 +94,7 @@ public class LevelRangeFilterBuilder extends 
AbstractBuilder<Filter> implements
                 ? org.apache.logging.log4j.core.Filter.Result.ACCEPT
                 : org.apache.logging.log4j.core.Filter.Result.NEUTRAL;
 
-        return new FilterWrapper(LevelRangeFilter.createFilter(min, max, 
onMatch,
+        return FilterWrapper.adapt(LevelRangeFilter.createFilter(min, max, 
onMatch,
                 org.apache.logging.log4j.core.Filter.Result.DENY));
     }
 }
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/StringMatchFilterBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/StringMatchFilterBuilder.java
index cce3344..57a9524 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/StringMatchFilterBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/StringMatchFilterBuilder.java
@@ -87,7 +87,7 @@ public class StringMatchFilterBuilder extends 
AbstractBuilder<Filter> implements
         org.apache.logging.log4j.core.Filter.Result onMatch = acceptOnMatch
                 ? org.apache.logging.log4j.core.Filter.Result.ACCEPT
                 : org.apache.logging.log4j.core.Filter.Result.DENY;
-        return new FilterWrapper(StringMatchFilter.newBuilder()
+        return FilterWrapper.adapt(StringMatchFilter.newBuilder()
                 .setMatchString(text)
                 .setOnMatch(onMatch)
                 
.setOnMismatch(org.apache.logging.log4j.core.Filter.Result.NEUTRAL)
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/HtmlLayoutBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/HtmlLayoutBuilder.java
index 75ca290..397f9e1 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/HtmlLayoutBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/HtmlLayoutBuilder.java
@@ -75,7 +75,7 @@ public class HtmlLayoutBuilder extends 
AbstractBuilder<Layout> implements Layout
     }
 
     private Layout createLayout(String title, boolean locationInfo) {
-        return new LayoutWrapper(HtmlLayout.newBuilder()
+        return LayoutWrapper.adapt(HtmlLayout.newBuilder()
                 .setTitle(title)
                 .setLocationInfo(locationInfo)
                 .build());
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/PatternLayoutBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/PatternLayoutBuilder.java
index 2e341b8..1d1dd2c 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/PatternLayoutBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/PatternLayoutBuilder.java
@@ -84,7 +84,7 @@ public class PatternLayoutBuilder extends 
AbstractBuilder<Layout> implements Lay
             LOGGER.info("No pattern provided for pattern layout, using default 
pattern");
             pattern = PatternLayout.DEFAULT_CONVERSION_PATTERN;
         }
-        return new LayoutWrapper(PatternLayout.newBuilder()
+        return LayoutWrapper.adapt(PatternLayout.newBuilder()
                 .setPattern(pattern
                         // Log4j 2's %x (NDC) is not compatible with Log4j 1's
                         // %x
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java
index fc14802..511c857 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java
@@ -122,7 +122,7 @@ public class TTCCLayoutBuilder extends 
AbstractBuilder<Layout> implements Layout
             sb.append("%notEmpty{%ndc }");
         }
         sb.append("- %m%n");
-        return new LayoutWrapper(PatternLayout.newBuilder()
+        return LayoutWrapper.adapt(PatternLayout.newBuilder()
                 .setPattern(sb.toString())
                 .setConfiguration(config)
                 .build());
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java
index 1d6e4f9..221127d 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java
@@ -71,6 +71,6 @@ public class XmlLayoutBuilder extends AbstractBuilder<Layout> 
implements LayoutB
     }
 
     private Layout createLayout(boolean properties, boolean locationInfo) {
-        return new LayoutWrapper(Log4j1XmlLayout.createLayout(locationInfo, 
properties));
+        return LayoutWrapper.adapt(Log4j1XmlLayout.createLayout(locationInfo, 
properties));
     }
 }
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
index f5774f1..5e9b576 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
@@ -457,11 +457,7 @@ public class PropertiesConfiguration extends 
Log4j1Configuration {
             appender = buildAppender(appenderName, className, prefix, 
layoutPrefix, filterPrefix, props);
         } else {
             registry.put(appenderName, appender);
-            if (appender instanceof AppenderWrapper) {
-                addAppender(((AppenderWrapper) appender).getAppender());
-            } else {
-                addAppender(new AppenderAdapter(appender).getAdapter());
-            }
+            addAppender(AppenderAdapter.adapt(appender));
         }
         return appender;
     }
@@ -485,11 +481,7 @@ public class PropertiesConfiguration extends 
Log4j1Configuration {
         appender.addFilter(parseAppenderFilters(props, filterPrefix, 
appenderName));
         final String[] keys = new String[] {layoutPrefix};
         addProperties(appender, keys, props, prefix);
-        if (appender instanceof AppenderWrapper) {
-            addAppender(((AppenderWrapper) appender).getAppender());
-        } else {
-            addAppender(new AppenderAdapter(appender).getAdapter());
-        }
+        addAppender(AppenderAdapter.adapt(appender));
         registry.put(appenderName, appender);
         return appender;
     }
diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java 
b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java
index 50c355b..4c817ec 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java
@@ -782,11 +782,7 @@ public class XmlConfiguration extends Log4j1Configuration {
                 case APPENDER_TAG:
                     Appender appender = parseAppender(currentElement);
                     appenderMap.put(appender.getName(), appender);
-                    if (appender instanceof AppenderWrapper) {
-                        addAppender(((AppenderWrapper) 
appender).getAppender());
-                    } else {
-                        addAppender(new 
AppenderAdapter(appender).getAdapter());
-                    }
+                    addAppender(AppenderAdapter.adapt(appender));
                     break;
                 default:
                     quietParseUnrecognizedElement(null, currentElement, props);
diff --git 
a/log4j-1.2-api/src/test/java/org/apache/log4j/builders/Log4j2ListAppenderBuilder.java
 
b/log4j-1.2-api/src/test/java/org/apache/log4j/builders/Log4j2ListAppenderBuilder.java
index 37b247c..3295bbf 100644
--- 
a/log4j-1.2-api/src/test/java/org/apache/log4j/builders/Log4j2ListAppenderBuilder.java
+++ 
b/log4j-1.2-api/src/test/java/org/apache/log4j/builders/Log4j2ListAppenderBuilder.java
@@ -78,13 +78,8 @@ public class Log4j2ListAppenderBuilder extends 
AbstractBuilder implements Append
     }
 
     private Appender createAppender(String name, Layout layout, Filter filter) 
{
-        final org.apache.logging.log4j.core.Layout<?> log4j2Layout;
-        if (layout instanceof LayoutWrapper) {
-            log4j2Layout = ((LayoutWrapper) layout).getLayout();
-        } else {
-            log4j2Layout = layout != null ? new LayoutAdapter(layout) : null;
-        }
-        return new AppenderWrapper(
+        final org.apache.logging.log4j.core.Layout<?> log4j2Layout = 
LayoutAdapter.adapt(layout);
+        return AppenderWrapper.adapt(
                 ListAppender.newBuilder()
                         .setName(name)
                         .setLayout(log4j2Layout)

Reply via email to