You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2022/03/30 22:44:46 UTC

[logging-log4j2] branch master updated: `final` synchronization with 2.17.2

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


The following commit(s) were added to refs/heads/master by this push:
     new d2a0d94  `final` synchronization with 2.17.2
d2a0d94 is described below

commit d2a0d9415a79f4250d4daf7791e07fb746af6a5b
Author: Piotr P. Karwasz <pi...@karwasz.org>
AuthorDate: Thu Mar 31 00:44:38 2022 +0200

    `final` synchronization with 2.17.2
    
    Synchronizes `log4j-1.2-api` main source with version 2.17.2. It mainly
    consists of:
    
    * formatting,
    * `final` modifiers,
    * the removal of the deprecated `Holder` class.
---
 .../java/org/apache/log4j/AppenderSkeleton.java    |   4 +-
 .../src/main/java/org/apache/log4j/LogManager.java |   2 +-
 .../src/main/java/org/apache/log4j/MDC.java        |   3 +-
 .../main/java/org/apache/log4j/SimpleLayout.java   |  33 +-
 .../main/java/org/apache/log4j/WriterAppender.java |  11 +-
 .../org/apache/log4j/bridge/FilterAdapter.java     |  23 +-
 .../org/apache/log4j/bridge/LayoutWrapper.java     |   2 -
 .../org/apache/log4j/bridge/LogEventAdapter.java   |   8 +-
 .../org/apache/log4j/bridge/LogEventWrapper.java   |   1 -
 .../org/apache/log4j/builders/AbstractBuilder.java |  13 +-
 .../org/apache/log4j/builders/BooleanHolder.java   |  37 -
 .../java/org/apache/log4j/builders/Holder.java     |  39 -
 .../builders/appender/AsyncAppenderBuilder.java    |  29 +-
 .../builders/appender/ConsoleAppenderBuilder.java  |  29 +-
 .../appender/DailyRollingFileAppenderBuilder.java  |  59 +-
 .../builders/appender/FileAppenderBuilder.java     |  59 +-
 .../builders/appender/NullAppenderBuilder.java     |  12 +-
 .../builders/appender/RewriteAppenderBuilder.java  |  44 +-
 .../appender/RollingFileAppenderBuilder.java       |  76 +-
 .../builders/appender/SocketAppenderBuilder.java   |  29 +-
 .../builders/appender/SyslogAppenderBuilder.java   |  62 +-
 .../builders/filter/LevelMatchFilterBuilder.java   |  23 +-
 .../builders/filter/LevelRangeFilterBuilder.java   |  26 +-
 .../builders/filter/StringMatchFilterBuilder.java  |  21 +-
 .../log4j/builders/layout/HtmlLayoutBuilder.java   |  24 +-
 .../log4j/builders/layout/SimpleLayoutBuilder.java |   4 +-
 .../log4j/config/Log4j1ConfigurationFactory.java   |   2 +-
 .../log4j/config/Log4j1ConfigurationParser.java    |   5 +-
 .../org/apache/log4j/config/PropertySetter.java    |   3 +-
 .../log4j/config/PropertySetterException.java      |   1 -
 .../log4j/helpers/AppenderAttachableImpl.java      |   2 +-
 .../org/apache/log4j/helpers/OptionConverter.java  |  16 +-
 .../org/apache/log4j/helpers/PatternParser.java    | 930 ++++++++++-----------
 .../java/org/apache/log4j/helpers/QuietWriter.java |   5 +-
 .../org/apache/log4j/layout/Log4j1XmlLayout.java   |  40 +-
 .../org/apache/log4j/or/ThreadGroupRenderer.java   |  14 +-
 .../log4j/pattern/Log4j1MdcPatternConverter.java   |   2 +-
 .../org/apache/log4j/rewrite/MapRewritePolicy.java |   5 +-
 .../log4j/rewrite/PropertyRewritePolicy.java       |  21 +-
 .../org/apache/log4j/spi/ThrowableInformation.java |   9 +-
 .../org/apache/log4j/xml/Log4jEntityResolver.java  |  15 +-
 .../log4j/xml/UnrecognizedElementHandler.java      |   2 +-
 .../org/apache/log4j/xml/XmlConfiguration.java     | 110 +--
 .../log4j/builders/Log4j2ListAppenderBuilder.java  |   4 +-
 .../AbstractLog4j1ConfigurationConverterTest.java  |   1 -
 .../org/apache/logging/log4j/util/Constants.java   |  10 +
 46 files changed, 880 insertions(+), 990 deletions(-)

diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/AppenderSkeleton.java b/log4j-1.2-api/src/main/java/org/apache/log4j/AppenderSkeleton.java
index 3660a19..7fbd92a 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/AppenderSkeleton.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/AppenderSkeleton.java
@@ -44,11 +44,9 @@ public abstract class AppenderSkeleton implements Appender, OptionHandler {
      * Create new instance.
      */
     public AppenderSkeleton() {
-        super();
     }
 
     protected AppenderSkeleton(final boolean isActive) {
-        super();
     }
 
     @Override
@@ -115,7 +113,7 @@ public abstract class AppenderSkeleton implements Appender, OptionHandler {
     }
 
     /**
-     * Set the {@link ErrorHandler} for this Appender.
+     * Sets the {@link ErrorHandler} for this Appender.
      *
      * @since 0.9.0
      */
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java b/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java
index b4d8b7b..4d0bbd7 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java
@@ -202,7 +202,7 @@ public final class LogManager {
         if (selector == null) {
             throw new IllegalArgumentException("RepositorySelector must be non-null.");
         }
-        repositorySelector = selector;
+        LogManager.repositorySelector = selector;
     }
 
     /**
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/MDC.java b/log4j-1.2-api/src/main/java/org/apache/log4j/MDC.java
index ef99df9..ad902d2 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/MDC.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/MDC.java
@@ -28,7 +28,6 @@ import org.apache.logging.log4j.ThreadContext;
  */
 public final class MDC {
 
-
     private static final ThreadLocal<Map<String, Object>> localMap =
         new InheritableThreadLocal<Map<String, Object>>() {
             @Override
@@ -38,7 +37,7 @@ public final class MDC {
 
             @Override
             protected Map<String, Object> childValue(final Map<String, Object> parentValue) {
-                return parentValue == null ? new HashMap<String, Object>() : new HashMap<>(parentValue);
+                return parentValue == null ? new HashMap<>() : new HashMap<>(parentValue);
             }
         };
 
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/SimpleLayout.java b/log4j-1.2-api/src/main/java/org/apache/log4j/SimpleLayout.java
index c77b9be..2ed850d 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/SimpleLayout.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/SimpleLayout.java
@@ -22,25 +22,22 @@ import org.apache.logging.log4j.util.Strings;
 /**
  * Simple-layout.
  */
-public class SimpleLayout extends Layout
-{
+public class SimpleLayout extends Layout {
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String format(final LoggingEvent theEvent)
-  {
-    return Strings.EMPTY;
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String format(final LoggingEvent theEvent) {
+        return Strings.EMPTY;
+    }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public boolean ignoresThrowable()
-  {
-    return true;
-  }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean ignoresThrowable() {
+        return true;
+    }
 
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/WriterAppender.java b/log4j-1.2-api/src/main/java/org/apache/log4j/WriterAppender.java
index db69696..760449c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/WriterAppender.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/WriterAppender.java
@@ -84,7 +84,8 @@ public class WriterAppender extends AppenderSkeleton {
     }
 
     /**
-     * Instantiate a WriterAppender and set the output destination to <code>writer</code>.
+     * Instantiate a WriterAppender and set the output destination to
+     * <code>writer</code>.
      *
      * <p>The <code>writer</code> must have been previously opened by
      * the user.
@@ -128,6 +129,7 @@ public class WriterAppender extends AppenderSkeleton {
     /**
      * Does nothing.
      */
+    @Override
     public void activateOptions() {
     }
 
@@ -143,6 +145,7 @@ public class WriterAppender extends AppenderSkeleton {
      * <p>The format of the output will depend on this appender's
      * layout.
      */
+    @Override
     public void append(LoggingEvent event) {
 
         // Reminder: the nesting of calls is:
@@ -196,8 +199,8 @@ public class WriterAppender extends AppenderSkeleton {
      * @see #setWriter
      * @since 0.8.4
      */
-    public
-    synchronized void close() {
+    @Override
+    public synchronized void close() {
         if (this.closed) {
             return;
         }
@@ -267,6 +270,7 @@ public class WriterAppender extends AppenderSkeleton {
      * Set the {@link ErrorHandler} for this WriterAppender and also the
      * underlying {@link QuietWriter} if any.
      */
+    @Override
     public synchronized void setErrorHandler(ErrorHandler eh) {
         if (eh == null) {
             LOGGER.warn("You have tried to set a null error-handler.");
@@ -333,6 +337,7 @@ public class WriterAppender extends AppenderSkeleton {
      * The WriterAppender requires a layout. Hence, this method returns
      * <code>true</code>.
      */
+    @Override
     public boolean requiresLayout() {
         return true;
     }
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 5ce599e..e10478c 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
@@ -71,15 +71,6 @@ public class FilterAdapter extends AbstractFilter {
         this.filter = filter;
     }
 
-    public Filter getFilter() {
-        return filter;
-    }
-
-    @Override
-    public void start() {
-        filter.activateOptions();
-    }
-
     @Override
     public Result filter(LogEvent event) {
         LoggingEvent loggingEvent = new LogEventAdapter(event);
@@ -97,4 +88,18 @@ public class FilterAdapter extends AbstractFilter {
         return Result.NEUTRAL;
     }
 
+    /**
+     * Gets the actual filter.
+     *
+     * @return the actual filter.
+     * @since 2.17.1
+     */
+    public Filter getFilter() {
+        return filter;
+    }
+
+    @Override
+    public void start() {
+        filter.activateOptions();
+    }
 }
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 a7f8b7f..b7ac317 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
@@ -16,11 +16,9 @@
  */
 package org.apache.log4j.bridge;
 
-
 import org.apache.log4j.Layout;
 import org.apache.log4j.spi.LoggingEvent;
 
-
 /**
  * Bridge between the Log4j 1 Layout and a Log4j 2 Layout.
  */
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventAdapter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventAdapter.java
index 3fe6a28..5fbb51b 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventAdapter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventAdapter.java
@@ -30,6 +30,7 @@ import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.core.util.Throwables;
 import org.apache.logging.log4j.spi.StandardLevel;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Strings;
 
 /**
  * Converts a Log4j 2 LogEvent into the components needed by a Log4j 1.x LoggingEvent.
@@ -164,9 +165,8 @@ public class LogEventAdapter extends LoggingEvent {
     public Object getMDC(String key) {
         if (event.getContextData() != null) {
             return event.getContextData().getValue(key);
-        } else {
-            return null;
         }
+        return null;
     }
 
     /**
@@ -205,12 +205,12 @@ public class LogEventAdapter extends LoggingEvent {
     }
 
     /**
-     * Return this event's throwable's string[] representation.
+     * Return this event's throwable's string[] representaion.
      */
     @Override
     public String[] getThrowableStrRep() {
         if (event.getThrown() != null) {
-            return Throwables.toStringList(event.getThrown()).toArray(new String[0]);
+            return Throwables.toStringList(event.getThrown()).toArray(Strings.EMPTY_ARRAY);
         }
         return null;
     }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventWrapper.java b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventWrapper.java
index 91d338a..600f69f 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventWrapper.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/bridge/LogEventWrapper.java
@@ -181,7 +181,6 @@ public class LogEventWrapper implements LogEvent {
         return 0;
     }
 
-
     private static class ContextDataMap extends HashMap<String, String> implements ReadOnlyStringMap {
 
         ContextDataMap(Map<String, String> map) {
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 96a775f..56a143f 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
@@ -22,6 +22,9 @@ import static org.apache.log4j.xml.XmlConfiguration.VALUE_ATTR;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.log4j.bridge.FilterAdapter;
 import org.apache.log4j.bridge.FilterWrapper;
@@ -137,7 +140,7 @@ public abstract class AbstractBuilder<T> implements Builder<T> {
         String value = properties.getProperty(prefix + toJavaKey(key));
         value = value != null ? value : properties.getProperty(prefix + toBeanKey(key), defaultValue);
         value = value != null ? substVars(value) : defaultValue;
-        return value != null ? value : defaultValue;
+        return value != null ? value.trim() : defaultValue;
     }
 
     protected String getValueAttribute(final Element element) {
@@ -146,7 +149,7 @@ public abstract class AbstractBuilder<T> implements Builder<T> {
 
     protected String getValueAttribute(final Element element, final String defaultValue) {
         final String attribute = element.getAttribute(VALUE_ATTR);
-        return substVars(attribute != null ? attribute : defaultValue);
+        return substVars(attribute != null ? attribute.trim() : defaultValue);
     }
 
     protected String substVars(final String value) {
@@ -170,7 +173,7 @@ public abstract class AbstractBuilder<T> implements Builder<T> {
         return new String(chars);
     }
 
-    protected void setBoolean(final String name, final Element element, Holder<Boolean> ref) {
+    protected void set(final String name, final Element element, AtomicBoolean ref) {
         final String value = getValueAttribute(element);
         if (value == null) {
             LOGGER.warn("No value for {} parameter, using default {}", name, ref);
@@ -179,7 +182,7 @@ public abstract class AbstractBuilder<T> implements Builder<T> {
         }
     }
 
-    protected void setInteger(final String name, final Element element, Holder<Integer> ref) {
+    protected void set(final String name, final Element element, AtomicInteger ref) {
         final String value = getValueAttribute(element);
         if (value == null) {
             LOGGER.warn("No value for {} parameter, using default {}", name, ref);
@@ -192,7 +195,7 @@ public abstract class AbstractBuilder<T> implements Builder<T> {
         }
     }
 
-    protected void setString(final String name, final Element element, Holder<String> ref) {
+    protected void set(final String name, final Element element, AtomicReference<String> ref) {
         final String value = getValueAttribute(element);
         if (value == null) {
             LOGGER.warn("No value for {} parameter, using default {}", name, ref);
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BooleanHolder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BooleanHolder.java
deleted file mode 100644
index d5319b0..0000000
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BooleanHolder.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache license, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the license for the specific language governing permissions and
- * limitations under the license.
- */
-package org.apache.log4j.builders;
-
-/**
- * Holds Boolean values created inside of a Lambda expression.
- */
-public class BooleanHolder extends Holder<Boolean> {
-    public BooleanHolder() {
-        this(false);
-    }
-
-    public BooleanHolder(boolean value) {
-        super(value);
-    }
-
-    @Override
-    public void set(Boolean value) {
-        if (value != null) {
-            super.set(value);
-        }
-    }
-}
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/Holder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/Holder.java
deleted file mode 100644
index b9ce2bf..0000000
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/Holder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache license, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the license for the specific language governing permissions and
- * limitations under the license.
- */
-package org.apache.log4j.builders;
-
-/**
- * Provides a place to hold values generated inside of a Lambda expression.
- */
-public class Holder<T> {
-    private T value;
-
-    public Holder() {
-    }
-
-    public Holder(T defaultValue) {
-        this.value = defaultValue;
-    }
-
-    public void set(T value) {
-        this.value = value;
-    }
-
-    public T get() {
-        return 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 ca1aa80..1801dfa 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
@@ -26,13 +26,14 @@ import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.log4j.Appender;
 import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.FilterAdapter;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.BooleanHolder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.helpers.OptionConverter;
@@ -66,14 +67,14 @@ public class AsyncAppenderBuilder extends AbstractBuilder implements AppenderBui
 
     @Override
     public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
-        String name = getNameAttribute(appenderElement);
-        Holder<List<String>> appenderRefs = new Holder<>(new ArrayList<>());
-        Holder<Boolean> blocking = new BooleanHolder();
-        Holder<Boolean> includeLocation = new BooleanHolder();
-        Holder<String> level = new Holder<>("trace");
-        Holder<Integer> bufferSize = new Holder<>(1024);
-        Holder<Filter> filter = new Holder<>();
-        forEachElement(appenderElement.getChildNodes(), (currentElement) -> {
+        final String name = getNameAttribute(appenderElement);
+        final AtomicReference<List<String>> appenderRefs = new AtomicReference<>(new ArrayList<>());
+        final AtomicBoolean blocking = new AtomicBoolean();
+        final AtomicBoolean includeLocation = new AtomicBoolean();
+        final AtomicReference<String> level = new AtomicReference<>("trace");
+        final AtomicInteger bufferSize = new AtomicInteger(1024);
+        final AtomicReference<Filter> filter = new AtomicReference<>();
+        forEachElement(appenderElement.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
                 case APPENDER_REF_TAG:
                     final Appender appender = config.findAppenderByReference(currentElement);
@@ -87,16 +88,16 @@ public class AsyncAppenderBuilder extends AbstractBuilder implements AppenderBui
                 case PARAM_TAG: {
                     switch (getNameAttributeKey(currentElement)) {
                         case BUFFER_SIZE_PARAM:
-                            setInteger(BUFFER_SIZE_PARAM, currentElement, bufferSize);
+                            set(BUFFER_SIZE_PARAM, currentElement, bufferSize);
                             break;
                         case BLOCKING_PARAM:
-                            setBoolean(BLOCKING_PARAM, currentElement, blocking);
+                            set(BLOCKING_PARAM, currentElement, blocking);
                             break;
                         case INCLUDE_LOCATION_PARAM:
-                            setBoolean(INCLUDE_LOCATION_PARAM, currentElement, includeLocation);
+                            set(INCLUDE_LOCATION_PARAM, currentElement, includeLocation);
                             break;
                         case THRESHOLD_PARAM:
-                            setString(THRESHOLD_PARAM, currentElement, level);
+                            set(THRESHOLD_PARAM, currentElement, level);
                             break;
                     }
                     break;
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 333807a..95db77a 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
@@ -16,7 +16,6 @@
  */
 package org.apache.log4j.builders.appender;
 
-
 import static org.apache.log4j.builders.BuilderManager.CATEGORY;
 import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
 import static org.apache.log4j.xml.XmlConfiguration.FILTER_TAG;
@@ -25,6 +24,8 @@ import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
 import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
 
 import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.log4j.Appender;
 import org.apache.log4j.Layout;
@@ -32,8 +33,6 @@ import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.LayoutAdapter;
 import org.apache.log4j.bridge.LayoutWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.BooleanHolder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.spi.Filter;
@@ -60,20 +59,20 @@ public class ConsoleAppenderBuilder extends AbstractBuilder implements AppenderB
     public ConsoleAppenderBuilder() {
     }
 
-    public ConsoleAppenderBuilder(String prefix, Properties props) {
+    public ConsoleAppenderBuilder(final String prefix, final Properties props) {
         super(prefix, props);
     }
 
     @Override
     public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
-        String name = getNameAttribute(appenderElement);
-        Holder<String> target = new Holder<>(SYSTEM_OUT);
-        Holder<Layout> layout = new Holder<>();
-        Holder<Filter> filter = new Holder<>();
-        Holder<String> level = new Holder<>();
-        Holder<Boolean> follow = new BooleanHolder();
-        Holder<Boolean> immediateFlush = new BooleanHolder(true);
-        forEachElement(appenderElement.getChildNodes(), (currentElement) -> {
+        final String name = getNameAttribute(appenderElement);
+        final AtomicReference<String> target = new AtomicReference<>(SYSTEM_OUT);
+        final AtomicReference<Layout> layout = new AtomicReference<>();
+        final AtomicReference<Filter> filter = new AtomicReference<>();
+        final AtomicReference<String> level = new AtomicReference<>();
+        final AtomicBoolean follow = new AtomicBoolean();
+        final AtomicBoolean immediateFlush = new AtomicBoolean(true);
+        forEachElement(appenderElement.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
                 case LAYOUT_TAG:
                     layout.set(config.parseLayout(currentElement));
@@ -101,13 +100,13 @@ public class ConsoleAppenderBuilder extends AbstractBuilder implements AppenderB
                             }
                             break;
                         case THRESHOLD_PARAM:
-                            setString(THRESHOLD_PARAM, currentElement, level);
+                            set(THRESHOLD_PARAM, currentElement, level);
                             break;
                         case FOLLOW_PARAM:
-                            setBoolean(FOLLOW_PARAM, currentElement, follow);
+                            set(FOLLOW_PARAM, currentElement, follow);
                             break;
                         case IMMEDIATE_FLUSH_PARAM:
-                            setBoolean(IMMEDIATE_FLUSH_PARAM, currentElement, immediateFlush);
+                            set(IMMEDIATE_FLUSH_PARAM, currentElement, immediateFlush);
                             break;
                     }
                     break;
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 78ade8c..a0dacac 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
@@ -16,14 +16,24 @@
  */
 package org.apache.log4j.builders.appender;
 
+import static org.apache.log4j.builders.BuilderManager.CATEGORY;
+import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
+import static org.apache.log4j.xml.XmlConfiguration.FILTER_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.LAYOUT_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
+
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.log4j.Appender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.LayoutAdapter;
 import org.apache.log4j.bridge.LayoutWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.BooleanHolder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.spi.Filter;
@@ -40,12 +50,6 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.w3c.dom.Element;
 
-import java.util.Properties;
-
-import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
-import static org.apache.log4j.xml.XmlConfiguration.*;
-
 /**
  * Build a Daily Rolling File Appender
  */
@@ -66,17 +70,17 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
 
     @Override
     public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
-        String name = getNameAttribute(appenderElement);
-        Holder<Layout> layout = new Holder<>();
-        Holder<Filter> filter = new Holder<>();
-        Holder<String> fileName = new Holder<>();
-        Holder<String> level = new Holder<>();
-        Holder<Boolean> immediateFlush = new BooleanHolder(true);
-        Holder<Boolean> append = new BooleanHolder(true);
-        Holder<Boolean> bufferedIo = new BooleanHolder();
-        Holder<Integer> bufferSize = new Holder<>(8192);
-        Holder<String> datePattern = new Holder<>(DEFAULT_DATE_PATTERN);
-        forEachElement(appenderElement.getChildNodes(), (currentElement) -> {
+        final String name = getNameAttribute(appenderElement);
+        final AtomicReference<Layout> layout = new AtomicReference<>();
+        final AtomicReference<Filter> filter = new AtomicReference<>();
+        final AtomicReference<String> fileName = new AtomicReference<>();
+        final AtomicReference<String> level = new AtomicReference<>();
+        final AtomicBoolean immediateFlush = new AtomicBoolean(true);
+        final AtomicBoolean append = new AtomicBoolean(true);
+        final AtomicBoolean bufferedIo = new AtomicBoolean();
+        final AtomicInteger bufferSize = new AtomicInteger(8192);
+        final AtomicReference<String> datePattern = new AtomicReference<>(DEFAULT_DATE_PATTERN);
+        forEachElement(appenderElement.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
                 case LAYOUT_TAG:
                     layout.set(config.parseLayout(currentElement));
@@ -87,25 +91,25 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
                 case PARAM_TAG:
                     switch (getNameAttributeKey(currentElement)) {
                         case FILE_PARAM:
-                            setString(FILE_PARAM, currentElement, fileName);
+                            set(FILE_PARAM, currentElement, fileName);
                             break;
                         case APPEND_PARAM:
-                            setBoolean(APPEND_PARAM, currentElement, append);
+                            set(APPEND_PARAM, currentElement, append);
                             break;
                         case BUFFERED_IO_PARAM:
-                            setBoolean(BUFFERED_IO_PARAM, currentElement, bufferedIo);
+                            set(BUFFERED_IO_PARAM, currentElement, bufferedIo);
                             break;
                         case BUFFER_SIZE_PARAM:
-                            setInteger(BUFFER_SIZE_PARAM, currentElement, bufferSize);
+                            set(BUFFER_SIZE_PARAM, currentElement, bufferSize);
                             break;
                         case THRESHOLD_PARAM:
-                            setString(THRESHOLD_PARAM, currentElement, level);
+                            set(THRESHOLD_PARAM, currentElement, level);
                             break;
                         case DATE_PATTERN_PARAM:
-                            setString(DATE_PATTERN_PARAM, currentElement, datePattern);
+                            set(DATE_PATTERN_PARAM, currentElement, datePattern);
                             break;
                         case IMMEDIATE_FLUSH_PARAM:
-                            setBoolean(IMMEDIATE_FLUSH_PARAM, currentElement, immediateFlush);
+                            set(IMMEDIATE_FLUSH_PARAM, currentElement, immediateFlush);
                             break;
                     }
                     break;
@@ -134,7 +138,7 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
 
     private <T extends Log4j1Configuration> Appender createAppender(final String name, final Layout layout,
             final Filter filter, final String fileName, final boolean append, boolean immediateFlush,
-            final String level, final boolean bufferedIo, final int bufferSize, String datePattern,
+            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;
@@ -160,7 +164,6 @@ public class DailyRollingFileAppenderBuilder extends AbstractBuilder implements
                 .build();
         return new AppenderWrapper(RollingFileAppender.newBuilder()
                 .setName(name)
-                .setAppend(append)
                 .setConfiguration(configuration)
                 .setLayout(fileLayout)
                 .setFilter(fileFilter)
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 8ead958..0327218 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
@@ -16,14 +16,24 @@
  */
 package org.apache.log4j.builders.appender;
 
+import static org.apache.log4j.builders.BuilderManager.CATEGORY;
+import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
+import static org.apache.log4j.xml.XmlConfiguration.FILTER_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.LAYOUT_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
+
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.log4j.Appender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.LayoutAdapter;
 import org.apache.log4j.bridge.LayoutWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.BooleanHolder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.spi.Filter;
@@ -34,17 +44,6 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.w3c.dom.Element;
 
-import java.util.Properties;
-
-import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
-import static org.apache.log4j.xml.XmlConfiguration.FILTER_TAG;
-import static org.apache.log4j.xml.XmlConfiguration.LAYOUT_TAG;
-import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
-import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
-import static org.apache.log4j.xml.XmlConfiguration.NAME_ATTR;
-import static org.apache.log4j.xml.XmlConfiguration.VALUE_ATTR;
-
 /**
  * Build a File Appender
  */
@@ -61,17 +60,17 @@ public class FileAppenderBuilder extends AbstractBuilder implements AppenderBuil
     }
 
     @Override
-    public Appender parseAppender(Element appenderElement, XmlConfiguration config) {
-        String name = getNameAttribute(appenderElement);
-        Holder<Layout> layout = new Holder<>();
-        Holder<Filter> filter = new Holder<>();
-        Holder<String> fileName = new Holder<>();
-        Holder<String> level = new Holder<>();
-        Holder<Boolean> immediateFlush = new BooleanHolder(true);
-        Holder<Boolean> append = new BooleanHolder(true);
-        Holder<Boolean> bufferedIo = new BooleanHolder();
-        Holder<Integer> bufferSize = new Holder<>(8192);
-        forEachElement(appenderElement.getChildNodes(), (currentElement) -> {
+    public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
+        final String name = getNameAttribute(appenderElement);
+        final AtomicReference<Layout> layout = new AtomicReference<>();
+        final AtomicReference<Filter> filter = new AtomicReference<>();
+        final AtomicReference<String> fileName = new AtomicReference<>();
+        final AtomicReference<String> level = new AtomicReference<>();
+        final AtomicBoolean immediateFlush = new AtomicBoolean(true);
+        final AtomicBoolean append = new AtomicBoolean(true);
+        final AtomicBoolean bufferedIo = new AtomicBoolean();
+        final AtomicInteger bufferSize = new AtomicInteger(8192);
+        forEachElement(appenderElement.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
                 case LAYOUT_TAG:
                     layout.set(config.parseLayout(currentElement));
@@ -82,22 +81,22 @@ public class FileAppenderBuilder extends AbstractBuilder implements AppenderBuil
                 case PARAM_TAG:
                     switch (getNameAttributeKey(currentElement)) {
                         case FILE_PARAM:
-                            setString(FILE_PARAM, currentElement, fileName);
+                            set(FILE_PARAM, currentElement, fileName);
                             break;
                         case APPEND_PARAM:
-                            setBoolean(APPEND_PARAM, currentElement, append);
+                            set(APPEND_PARAM, currentElement, append);
                             break;
                         case BUFFERED_IO_PARAM:
-                            setBoolean(BUFFERED_IO_PARAM, currentElement, bufferedIo);
+                            set(BUFFERED_IO_PARAM, currentElement, bufferedIo);
                             break;
                         case BUFFER_SIZE_PARAM:
-                            setInteger(BUFFER_SIZE_PARAM, currentElement, bufferSize);
+                            set(BUFFER_SIZE_PARAM, currentElement, bufferSize);
                             break;
                         case THRESHOLD_PARAM:
-                            setString(THRESHOLD_PARAM, currentElement, level);
+                            set(THRESHOLD_PARAM, currentElement, level);
                             break;
                         case IMMEDIATE_FLUSH_PARAM:
-                            setBoolean(IMMEDIATE_FLUSH_PARAM, currentElement, immediateFlush);
+                            set(IMMEDIATE_FLUSH_PARAM, currentElement, immediateFlush);
                             break;
                     }
                     break;
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 98af6a8..960a9fe 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
@@ -16,28 +16,24 @@
  */
 package org.apache.log4j.builders.appender;
 
+import static org.apache.log4j.builders.BuilderManager.CATEGORY;
+
+import java.util.Properties;
+
 import org.apache.log4j.Appender;
 import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.xml.XmlConfiguration;
-import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.appender.NullAppender;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.status.StatusLogger;
 import org.w3c.dom.Element;
 
-import java.util.Properties;
-
-import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-
 /**
  * Build a Null Appender
  */
 @Plugin(name = "org.apache.log4j.varia.NullAppender", category = CATEGORY)
 public class NullAppenderBuilder implements AppenderBuilder {
 
-    private static final Logger LOGGER = StatusLogger.getLogger();
-
     @Override
     public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
         final String name = appenderElement.getAttribute("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 d61770b..d8b61ba 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
@@ -16,12 +16,23 @@
  */
 package org.apache.log4j.builders.appender;
 
+import static org.apache.log4j.builders.BuilderManager.CATEGORY;
+import static org.apache.log4j.config.Log4j1Configuration.APPENDER_REF_TAG;
+import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
+import static org.apache.log4j.xml.XmlConfiguration.FILTER_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.log4j.Appender;
 import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.RewritePolicyAdapter;
 import org.apache.log4j.bridge.RewritePolicyWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.helpers.OptionConverter;
@@ -33,22 +44,9 @@ import org.apache.logging.log4j.core.appender.rewrite.RewriteAppender;
 import org.apache.logging.log4j.core.config.AppenderRef;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Strings;
 import org.w3c.dom.Element;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.config.Log4j1Configuration.APPENDER_REF_TAG;
-import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
-import static org.apache.log4j.xml.XmlConfiguration.FILTER_TAG;
-import static org.apache.log4j.xml.XmlConfiguration.NAME_ATTR;
-import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
-import static org.apache.log4j.xml.XmlConfiguration.VALUE_ATTR;
-import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
-
-
 /**
  * Build an Rewrite Appender
  */
@@ -67,12 +65,12 @@ public class RewriteAppenderBuilder extends AbstractBuilder implements AppenderB
 
     @Override
     public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
-        String name = getNameAttribute(appenderElement);
-        Holder<List<String>> appenderRefs = new Holder<>(new ArrayList<>());
-        Holder<RewritePolicy> rewritePolicyHolder = new Holder<>();
-        Holder<String> level = new Holder<>();
-        Holder<Filter> filter = new Holder<>();
-        forEachElement(appenderElement.getChildNodes(), (currentElement) -> {
+        final String name = getNameAttribute(appenderElement);
+        final AtomicReference<List<String>> appenderRefs = new AtomicReference<>(new ArrayList<>());
+        final AtomicReference<RewritePolicy> rewritePolicyHolder = new AtomicReference<>();
+        final AtomicReference<String> level = new AtomicReference<>();
+        final AtomicReference<Filter> filter = new AtomicReference<>();
+        forEachElement(appenderElement.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
                 case APPENDER_REF_TAG:
                     final Appender appender = config.findAppenderByReference(currentElement);
@@ -91,12 +89,12 @@ public class RewriteAppenderBuilder extends AbstractBuilder implements AppenderB
                     break;
                 case PARAM_TAG:
                     if (getNameAttributeKey(currentElement).equalsIgnoreCase(THRESHOLD_PARAM)) {
-                        setString(THRESHOLD_PARAM, currentElement, level);
+                        set(THRESHOLD_PARAM, currentElement, level);
                     }
                     break;
             }
         });
-        return createAppender(name, level.get(), appenderRefs.get().toArray(new String[0]), rewritePolicyHolder.get(),
+        return createAppender(name, level.get(), appenderRefs.get().toArray(Strings.EMPTY_ARRAY), rewritePolicyHolder.get(),
                 filter.get(), config);
     }
 
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 3ab8086..9664756 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
@@ -16,14 +16,24 @@
  */
 package org.apache.log4j.builders.appender;
 
+import static org.apache.log4j.builders.BuilderManager.CATEGORY;
+import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
+import static org.apache.log4j.xml.XmlConfiguration.FILTER_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.LAYOUT_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
+
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.log4j.Appender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.LayoutAdapter;
 import org.apache.log4j.bridge.LayoutWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.BooleanHolder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.spi.Filter;
@@ -41,12 +51,6 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.w3c.dom.Element;
 
-import java.util.Properties;
-
-import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
-import static org.apache.log4j.xml.XmlConfiguration.*;
-
 /**
  * Build a File Appender
  */
@@ -61,24 +65,24 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
     public RollingFileAppenderBuilder() {
     }
 
-    public RollingFileAppenderBuilder(String prefix, Properties props) {
-        super(prefix, props);
+    public RollingFileAppenderBuilder(final String prefix, final Properties properties) {
+        super(prefix, properties);
     }
 
     @Override
-    public Appender parseAppender(Element appenderElement, XmlConfiguration config) {
-        String name = getNameAttribute(appenderElement);
-        Holder<Layout> layout = new Holder<>();
-        Holder<Filter> filter = new Holder<>();
-        Holder<String> fileName = new Holder<>();
-        Holder<Boolean> immediateFlush = new BooleanHolder(true);
-        Holder<Boolean> append = new BooleanHolder(true);
-        Holder<Boolean> bufferedIo = new BooleanHolder();
-        Holder<Integer> bufferSize = new Holder<>(8192);
-        Holder<String> maxSize = new Holder<>(DEFAULT_MAX_SIZE);
-        Holder<String> maxBackups = new Holder<>(DEFAULT_MAX_BACKUPS);
-        Holder<String> level = new Holder<>();
-        forEachElement(appenderElement.getChildNodes(), (currentElement) -> {
+    public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
+        final String name = getNameAttribute(appenderElement);
+        final AtomicReference<Layout> layout = new AtomicReference<>();
+        final AtomicReference<Filter> filter = new AtomicReference<>();
+        final AtomicReference<String> fileName = new AtomicReference<>();
+        final AtomicBoolean immediateFlush = new AtomicBoolean(true);
+        final AtomicBoolean append = new AtomicBoolean(true);
+        final AtomicBoolean bufferedIo = new AtomicBoolean();
+        final AtomicInteger bufferSize = new AtomicInteger(8192);
+        final AtomicReference<String> maxSize = new AtomicReference<>(DEFAULT_MAX_SIZE);
+        final AtomicReference<String> maxBackups = new AtomicReference<>(DEFAULT_MAX_BACKUPS);
+        final AtomicReference<String> level = new AtomicReference<>();
+        forEachElement(appenderElement.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
                 case LAYOUT_TAG:
                     layout.set(config.parseLayout(currentElement));
@@ -89,28 +93,28 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
                 case PARAM_TAG:
                     switch (getNameAttributeKey(currentElement)) {
                         case FILE_PARAM:
-                            setString(FILE_PARAM, currentElement, fileName);
+                            set(FILE_PARAM, currentElement, fileName);
                             break;
                         case APPEND_PARAM:
-                            setBoolean(APPEND_PARAM, currentElement, append);
+                            set(APPEND_PARAM, currentElement, append);
                             break;
                         case BUFFERED_IO_PARAM:
-                            setBoolean(BUFFERED_IO_PARAM, currentElement, bufferedIo);
+                            set(BUFFERED_IO_PARAM, currentElement, bufferedIo);
                             break;
                         case BUFFER_SIZE_PARAM:
-                            setInteger(BUFFER_SIZE_PARAM, currentElement, bufferSize);
+                            set(BUFFER_SIZE_PARAM, currentElement, bufferSize);
                             break;
                         case MAX_BACKUP_INDEX:
-                            setString(MAX_BACKUP_INDEX, currentElement, maxBackups);
+                            set(MAX_BACKUP_INDEX, currentElement, maxBackups);
                             break;
                         case MAX_SIZE_PARAM:
-                            setString(MAX_SIZE_PARAM, currentElement, maxSize);
+                            set(MAX_SIZE_PARAM, currentElement, maxSize);
                             break;
                         case THRESHOLD_PARAM:
-                            setString(THRESHOLD_PARAM, currentElement, level);
+                            set(THRESHOLD_PARAM, currentElement, level);
                             break;
                         case IMMEDIATE_FLUSH_PARAM:
-                            setBoolean(IMMEDIATE_FLUSH_PARAM, currentElement, immediateFlush);
+                            set(IMMEDIATE_FLUSH_PARAM, currentElement, immediateFlush);
                             break;
                     }
                     break;
@@ -156,11 +160,11 @@ public class RollingFileAppenderBuilder extends AbstractBuilder implements Appen
             LOGGER.warn("Unable to create File Appender, no file name provided");
             return null;
         }
-        String filePattern = fileName + ".%i";
-        TriggeringPolicy timePolicy = TimeBasedTriggeringPolicy.newBuilder().setClock(clock).setModulate(true).build();
-        SizeBasedTriggeringPolicy sizePolicy = SizeBasedTriggeringPolicy.createPolicy(maxSize);
-        CompositeTriggeringPolicy policy = CompositeTriggeringPolicy.createPolicy(sizePolicy);
-        RolloverStrategy strategy = DefaultRolloverStrategy.newBuilder()
+        final String filePattern = fileName + ".%i";
+        final TriggeringPolicy timePolicy = TimeBasedTriggeringPolicy.newBuilder().setClock(clock).setModulate(true).build();
+        final SizeBasedTriggeringPolicy sizePolicy = SizeBasedTriggeringPolicy.createPolicy(maxSize);
+        final CompositeTriggeringPolicy policy = CompositeTriggeringPolicy.createPolicy(sizePolicy);
+        final RolloverStrategy strategy = DefaultRolloverStrategy.newBuilder()
                 .setConfig(config)
                 .setMax(maxBackups)
                 .build();
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 116f3b7..a5fa418 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
@@ -24,6 +24,9 @@ import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
 import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
 
 import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.log4j.Appender;
 import org.apache.log4j.Layout;
@@ -31,8 +34,6 @@ import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.LayoutAdapter;
 import org.apache.log4j.bridge.LayoutWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.BooleanHolder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.spi.Filter;
@@ -94,13 +95,13 @@ public class SocketAppenderBuilder extends AbstractBuilder implements AppenderBu
     @Override
     public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
         final String name = getNameAttribute(appenderElement);
-        final Holder<String> host = new Holder<>("localhost");
-        final Holder<Integer> port = new Holder<>(DEFAULT_PORT);
-        final Holder<Integer> reconnectDelay = new Holder<>(DEFAULT_RECONNECTION_DELAY);
-        final Holder<Layout> layout = new Holder<>();
-        final Holder<Filter> filter = new Holder<>();
-        final Holder<String> level = new Holder<>();
-        final Holder<Boolean> immediateFlush = new BooleanHolder(true);
+        final AtomicReference<String> host = new AtomicReference<>("localhost");
+        final AtomicInteger port = new AtomicInteger(DEFAULT_PORT);
+        final AtomicInteger reconnectDelay = new AtomicInteger(DEFAULT_RECONNECTION_DELAY);
+        final AtomicReference<Layout> layout = new AtomicReference<>();
+        final AtomicReference<Filter> filter = new AtomicReference<>();
+        final AtomicReference<String> level = new AtomicReference<>();
+        final AtomicBoolean immediateFlush = new AtomicBoolean(true);
         forEachElement(appenderElement.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
             case LAYOUT_TAG:
@@ -112,19 +113,19 @@ public class SocketAppenderBuilder extends AbstractBuilder implements AppenderBu
             case PARAM_TAG:
                 switch (getNameAttributeKey(currentElement)) {
                 case HOST_PARAM:
-                    setString(HOST_PARAM, currentElement, host);
+                    set(HOST_PARAM, currentElement, host);
                     break;
                 case PORT_PARAM:
-                    setInteger(PORT_PARAM, currentElement, port);
+                    set(PORT_PARAM, currentElement, port);
                     break;
                 case RECONNECTION_DELAY_PARAM:
-                    setInteger(RECONNECTION_DELAY_PARAM, currentElement, reconnectDelay);
+                    set(RECONNECTION_DELAY_PARAM, currentElement, reconnectDelay);
                     break;
                 case THRESHOLD_PARAM:
-                    setString(THRESHOLD_PARAM, currentElement, level);
+                    set(THRESHOLD_PARAM, currentElement, level);
                     break;
                 case IMMEDIATE_FLUSH_PARAM:
-                    setBoolean(IMMEDIATE_FLUSH_PARAM, currentElement, immediateFlush);
+                    set(IMMEDIATE_FLUSH_PARAM, currentElement, immediateFlush);
                     break;
                 }
                 break;
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 ffbdedf..3987fad 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
@@ -34,7 +34,6 @@ import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.LayoutAdapter;
 import org.apache.log4j.bridge.LayoutWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.spi.Filter;
@@ -66,19 +65,19 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
     public SyslogAppenderBuilder() {
     }
 
-    public SyslogAppenderBuilder(String prefix, Properties props) {
+    public SyslogAppenderBuilder(final String prefix, final Properties props) {
         super(prefix, props);
     }
 
     @Override
-    public Appender parseAppender(Element appenderElement, XmlConfiguration config) {
-        String name = getNameAttribute(appenderElement);
-        Holder<Layout> layout = new Holder<>();
-        Holder<Filter> filter = new Holder<>();
-        Holder<String> facility = new Holder<>(DEFAULT_FACILITY);
-        Holder<String> level = new Holder<>();
-        Holder<String> host = new Holder<>(DEFAULT_HOST + ":" + DEFAULT_PORT);
-        Holder<Protocol> protocol = new Holder<>(Protocol.TCP);
+    public Appender parseAppender(final Element appenderElement, final XmlConfiguration config) {
+        final String name = getNameAttribute(appenderElement);
+        final AtomicReference<Layout> layout = new AtomicReference<>();
+        final AtomicReference<Filter> filter = new AtomicReference<>();
+        final AtomicReference<String> facility = new AtomicReference<>();
+        final AtomicReference<String> level = new AtomicReference<>();
+        final AtomicReference<String> host = new AtomicReference<>();
+        final AtomicReference<Protocol> protocol = new AtomicReference<>(Protocol.TCP);
         forEachElement(appenderElement.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
                 case LAYOUT_TAG:
@@ -87,29 +86,22 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
                 case FILTER_TAG:
                     config.addFilter(filter, currentElement);
                     break;
-                case PARAM_TAG: {
+                case PARAM_TAG:
                     switch (getNameAttributeKey(currentElement)) {
                         case SYSLOG_HOST_PARAM:
-                            setString(SYSLOG_HOST_PARAM, currentElement, host);
+                            set(SYSLOG_HOST_PARAM, currentElement, host);
                             break;
                         case FACILITY_PARAM:
-                            setString(FACILITY_PARAM, currentElement, facility);
+                            set(FACILITY_PARAM, currentElement, facility);
                             break;
-                        case THRESHOLD_PARAM: {
-                            String value = getValueAttribute(currentElement);
-                            if (value == null) {
-                                LOGGER.warn("No value supplied for Threshold parameter, ignoring.");
-                            } else {
-                                level.set(value);
-                            }
+                        case THRESHOLD_PARAM:
+                            set(THRESHOLD_PARAM, currentElement, level);
                             break;
-                        }
                         case PROTOCOL_PARAM:
                             protocol.set(Protocol.valueOf(getValueAttribute(currentElement, Protocol.TCP.name())));
                             break;
                     }
                     break;
-                }
             }
         });
 
@@ -120,20 +112,20 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
     @Override
     public Appender parseAppender(final String name, final String appenderPrefix, final String layoutPrefix,
             final String filterPrefix, final Properties props, final PropertiesConfiguration configuration) {
-        Filter filter = configuration.parseAppenderFilters(props, filterPrefix, name);
-        Layout layout = configuration.parseLayout(layoutPrefix, name, props);
-        String level = getProperty(THRESHOLD_PARAM);
-        String facility = getProperty(FACILITY_PARAM, DEFAULT_FACILITY);
-        String syslogHost = getProperty(SYSLOG_HOST_PARAM, DEFAULT_HOST + ":" + DEFAULT_PORT);
-        String protocol = getProperty(PROTOCOL_PARAM, Protocol.TCP.name());
+        final Filter filter = configuration.parseAppenderFilters(props, filterPrefix, name);
+        final Layout layout = configuration.parseLayout(layoutPrefix, name, props);
+        final String level = getProperty(THRESHOLD_PARAM);
+        final String facility = getProperty(FACILITY_PARAM, DEFAULT_FACILITY);
+        final String syslogHost = getProperty(SYSLOG_HOST_PARAM, DEFAULT_HOST + ":" + DEFAULT_PORT);
+        final String protocol = getProperty(PROTOCOL_PARAM, Protocol.TCP.name());
 
         return createAppender(name, configuration, layout, facility, filter, syslogHost, level, Protocol.valueOf(protocol));
     }
 
-    private Appender createAppender(final String name, final Log4j1Configuration configuration, Layout layout,
-            String facility, final Filter filter, final String syslogHost, final String level, final Protocol protocol) {
-        AtomicReference<String> host = new AtomicReference<>();
-        AtomicInteger port = new AtomicInteger();
+    private Appender createAppender(final String name, final Log4j1Configuration configuration, final Layout layout,
+            final String facility, final Filter filter, final String syslogHost, final String level, final Protocol protocol) {
+        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) {
@@ -147,7 +139,7 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
                     .build();
         }
 
-        org.apache.logging.log4j.core.Filter fileFilter = buildFilters(level, filter);
+        final org.apache.logging.log4j.core.Filter fileFilter = buildFilters(level, filter);
         return new AppenderWrapper(SyslogAppender.newSyslogAppenderBuilder()
                 .setName(name)
                 .setConfiguration(configuration)
@@ -159,7 +151,7 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
                 .build());
     }
 
-    private void resolveSyslogHost(String syslogHost, AtomicReference<String> host, AtomicInteger port) {
+    private void resolveSyslogHost(final String syslogHost, final AtomicReference<String> host, final AtomicInteger port) {
         //
         //  If not an unbracketed IPv6 address then
         //      parse as a URL
@@ -170,7 +162,7 @@ public class SyslogAppenderBuilder extends AbstractBuilder implements AppenderBu
             port.set(DEFAULT_PORT);
         } else if (parts.length == 2) {
             host.set(parts[0]);
-            port.set(Integer.parseInt(parts[1]));
+            port.set(Integer.parseInt(parts[1].trim()));
         } else {
             LOGGER.warn("Invalid {} setting: {}. Using default.", SYSLOG_HOST_PARAM, syslogHost);
             host.set(DEFAULT_HOST);
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 d4768bb..2c45b10 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
@@ -16,24 +16,23 @@
  */
 package org.apache.log4j.builders.filter;
 
+import static org.apache.log4j.builders.BuilderManager.CATEGORY;
+import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
+
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.log4j.bridge.FilterWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.BooleanHolder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.spi.Filter;
 import org.apache.log4j.xml.XmlConfiguration;
 import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.core.filter.LevelMatchFilter;
+import org.apache.logging.log4j.plugins.Plugin;
 import org.w3c.dom.Element;
 
-import java.util.Properties;
-
-import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.xml.XmlConfiguration.*;
-import static org.apache.log4j.xml.XmlConfiguration.VALUE_ATTR;
-
 /**
  * Build a Level match filter.
  */
@@ -52,9 +51,9 @@ public class LevelMatchFilterBuilder extends AbstractBuilder<Filter> implements
 
     @Override
     public Filter parse(Element filterElement, XmlConfiguration config) {
-        final Holder<String> level = new Holder<>();
-        final Holder<Boolean> acceptOnMatch = new BooleanHolder();
-        forEachElement(filterElement.getElementsByTagName("param"), (currentElement) -> {
+        final AtomicReference<String> level = new AtomicReference<>();
+        final AtomicBoolean acceptOnMatch = new AtomicBoolean();
+        forEachElement(filterElement.getElementsByTagName("param"), currentElement -> {
             if (currentElement.getTagName().equals("param")) {
                 switch (getNameAttributeKey(currentElement)) {
                     case LEVEL:
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 d3fd09a..88f45cd 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
@@ -16,25 +16,23 @@
  */
 package org.apache.log4j.builders.filter;
 
+import static org.apache.log4j.builders.BuilderManager.CATEGORY;
+import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
+
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.log4j.bridge.FilterWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.BooleanHolder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.spi.Filter;
 import org.apache.log4j.xml.XmlConfiguration;
 import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.core.filter.LevelRangeFilter;
+import org.apache.logging.log4j.plugins.Plugin;
 import org.w3c.dom.Element;
 
-
-import java.util.Properties;
-
-import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.xml.XmlConfiguration.*;
-
 /**
  * Build a Level match filter.
  */
@@ -54,10 +52,10 @@ public class LevelRangeFilterBuilder extends AbstractBuilder<Filter> implements
 
     @Override
     public Filter parse(Element filterElement, XmlConfiguration config) {
-        final Holder<String> levelMax = new Holder<>();
-        final Holder<String> levelMin = new Holder<>();
-        final Holder<Boolean> acceptOnMatch = new BooleanHolder();
-        forEachElement(filterElement.getElementsByTagName("param"), (currentElement) -> {
+        final AtomicReference<String> levelMax = new AtomicReference<>();
+        final AtomicReference<String> levelMin = new AtomicReference<>();
+        final AtomicBoolean acceptOnMatch = new AtomicBoolean();
+        forEachElement(filterElement.getElementsByTagName("param"), currentElement -> {
             if (currentElement.getTagName().equals("param")) {
                 switch (getNameAttributeKey(currentElement)) {
                     case LEVEL_MAX:
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 375e239..616e9f8 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
@@ -16,24 +16,23 @@
  */
 package org.apache.log4j.builders.filter;
 
+import static org.apache.log4j.builders.BuilderManager.CATEGORY;
+import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.log4j.bridge.FilterWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.BooleanHolder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.spi.Filter;
 import org.apache.log4j.xml.XmlConfiguration;
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.core.filter.StringMatchFilter;
+import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.w3c.dom.Element;
 
-import java.util.Properties;
-
-import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.xml.XmlConfiguration.*;
-
 /**
  * Build a String match filter.
  */
@@ -46,9 +45,9 @@ public class StringMatchFilterBuilder extends AbstractBuilder<Filter> implements
 
     @Override
     public Filter parse(Element filterElement, XmlConfiguration config) {
-        final Holder<Boolean> acceptOnMatch = new BooleanHolder();
-        final Holder<String> text = new Holder<>();
-        forEachElement(filterElement.getElementsByTagName("param"), (currentElement) -> {
+        final AtomicBoolean acceptOnMatch = new AtomicBoolean();
+        final AtomicReference<String> text = new AtomicReference<>();
+        forEachElement(filterElement.getElementsByTagName("param"), currentElement -> {
             if (currentElement.getTagName().equals("param")) {
                 switch (getNameAttributeKey(currentElement)) {
                     case STRING_TO_MATCH:
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 6b735f2..75ca290 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
@@ -16,23 +16,23 @@
  */
 package org.apache.log4j.builders.layout;
 
+import static org.apache.log4j.builders.BuilderManager.CATEGORY;
+import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
+import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
+
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
 import org.apache.log4j.Layout;
 import org.apache.log4j.bridge.LayoutWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
-import org.apache.log4j.builders.BooleanHolder;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.xml.XmlConfiguration;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.core.layout.HtmlLayout;
+import org.apache.logging.log4j.plugins.Plugin;
 import org.w3c.dom.Element;
 
-import java.util.Properties;
-
-import static org.apache.log4j.builders.BuilderManager.CATEGORY;
-import static org.apache.log4j.xml.XmlConfiguration.*;
-
 /**
  * Build a Pattern Layout
  */
@@ -53,9 +53,9 @@ public class HtmlLayoutBuilder extends AbstractBuilder<Layout> implements Layout
 
     @Override
     public Layout parse(Element layoutElement, XmlConfiguration config) {
-        final Holder<String> title = new Holder<>("Log4J Log Messages");
-        final Holder<Boolean> locationInfo = new BooleanHolder();
-        forEachElement(layoutElement.getElementsByTagName("param"), (currentElement) -> {
+        final AtomicReference<String> title = new AtomicReference<>("Log4J Log Messages");
+        final AtomicBoolean locationInfo = new AtomicBoolean();
+        forEachElement(layoutElement.getElementsByTagName("param"), currentElement -> {
             if (currentElement.getTagName().equals(PARAM_TAG)) {
                 if (TITLE_PARAM.equalsIgnoreCase(currentElement.getAttribute("name"))) {
                     title.set(currentElement.getAttribute("value"));
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/SimpleLayoutBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/SimpleLayoutBuilder.java
index 9bb0d64..00d7c2c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/SimpleLayoutBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/SimpleLayoutBuilder.java
@@ -22,12 +22,10 @@ import org.apache.log4j.Layout;
 import org.apache.log4j.bridge.LayoutWrapper;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.xml.XmlConfiguration;
-import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.plugins.Plugin;
 import org.w3c.dom.Element;
 
-import java.util.Properties;
-
 /**
  * Build a Pattern Layout
  */
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
index 83f6675..467d88d 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationFactory.java
@@ -37,7 +37,7 @@ import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
 // @Order(50)
 public class Log4j1ConfigurationFactory extends ConfigurationFactory {
 
-    private static final String[] SUFFIXES = {".properties"};
+    private static final String[] SUFFIXES = { ".properties" };
 
     @Override
     public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
index 927c154..985594c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/Log4j1ConfigurationParser.java
@@ -25,7 +25,6 @@ import java.util.Objects;
 import java.util.Properties;
 import java.util.TreeMap;
 
-import org.apache.log4j.LogManager;
 import org.apache.log4j.helpers.OptionConverter;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Filter.Result;
@@ -38,12 +37,10 @@ import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder
 import org.apache.logging.log4j.core.config.builder.api.ComponentBuilder;
 import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
 import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
-import org.apache.logging.log4j.core.config.builder.api.FilterComponentBuilder;
 import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
 import org.apache.logging.log4j.core.config.builder.api.LoggerComponentBuilder;
 import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
 import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
-import org.apache.logging.log4j.core.filter.ThresholdFilter;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
 
@@ -104,7 +101,7 @@ public class Log4j1ConfigurationParser {
             builder.setConfigurationName("Log4j1");
             // DEBUG
             final String debugValue = getLog4jValue("debug");
-            if (Boolean.valueOf(debugValue)) {
+            if (Boolean.parseBoolean(debugValue)) {
                 builder.setStatusLevel(Level.DEBUG);
             }
             // global threshold
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetter.java
index 69fa1e5..f51f173 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetter.java
@@ -56,6 +56,7 @@ import java.util.Properties;
  * Otherwise an {@link IntrospectionException} are thrown.
  */
 public class PropertySetter {
+    private static final PropertyDescriptor[] EMPTY_PROPERTY_DESCRIPTOR_ARRAY = {};
     private static final Logger LOGGER = StatusLogger.getLogger();
     protected Object obj;
     protected PropertyDescriptor[] props;
@@ -93,7 +94,7 @@ public class PropertySetter {
             props = bi.getPropertyDescriptors();
         } catch (IntrospectionException ex) {
             LOGGER.error("Failed to introspect {}: {}", obj, ex.getMessage());
-            props = new PropertyDescriptor[0];
+            props = EMPTY_PROPERTY_DESCRIPTOR_ARRAY;
         }
     }
 
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetterException.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetterException.java
index c9dc4cf..703900c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetterException.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertySetterException.java
@@ -45,7 +45,6 @@ public class PropertySetterException extends Exception {
      * @param rootCause The root cause
      */
     public PropertySetterException(final Throwable rootCause) {
-        super();
         this.rootCause = rootCause;
     }
 
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/AppenderAttachableImpl.java b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/AppenderAttachableImpl.java
index 9589b50..3b72848 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/AppenderAttachableImpl.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/AppenderAttachableImpl.java
@@ -68,7 +68,7 @@ public class AppenderAttachableImpl implements AppenderAttachable {
     }
 
     @Override
-    public Enumeration getAllAppenders() {
+    public Enumeration<Appender> getAllAppenders() {
         return Collections.enumeration(appenders.values());
     }
 
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
index 424c5c8..74a38f8 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
@@ -55,14 +55,14 @@ public class OptionConverter {
     private static final Logger LOGGER = StatusLogger.getLogger();
 
     private static final CharMap[] charMap = new CharMap[] {
-            new CharMap('n', '\n'),
-            new CharMap('r', '\r'),
-            new CharMap('t', '\t'),
-            new CharMap('f', '\f'),
-            new CharMap('\b', '\b'),
-            new CharMap('\"', '\"'),
-            new CharMap('\'', '\''),
-            new CharMap('\\', '\\')
+        new CharMap('n', '\n'),
+        new CharMap('r', '\r'),
+        new CharMap('t', '\t'),
+        new CharMap('f', '\f'),
+        new CharMap('\b', '\b'),
+        new CharMap('\"', '\"'),
+        new CharMap('\'', '\''),
+        new CharMap('\\', '\\')
     };
 
     public static String[] concatanateArrays(final String[] l, final String[] r) {
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/PatternParser.java b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/PatternParser.java
index 5b5e65d..f418ace 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/PatternParser.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/PatternParser.java
@@ -31,541 +31,493 @@ import org.apache.log4j.spi.LoggingEvent;
 //                 Reinhard Deschler <re...@web.de>
 
 /**
-   Most of the work of the {@link org.apache.log4j.PatternLayout} class
-   is delegated to the PatternParser class.
-
-   <p>It is this class that parses conversion patterns and creates
-   a chained list of {@link OptionConverter OptionConverters}.
-
-   @author <a href=mailto:"cakalijp@Maritz.com">James P. Cakalic</a>
-   @author Ceki G&uuml;lc&uuml;
-   @author Anders Kristensen
-
-   @since 0.8.2
-*/
+ * Most of the work of the {@link org.apache.log4j.PatternLayout} class is delegated to the PatternParser class.
+ * 
+ * <p>
+ * It is this class that parses conversion patterns and creates a chained list of {@link OptionConverter
+ * OptionConverters}.
+ * 
+ * @author <a href=mailto:"cakalijp@Maritz.com">James P. Cakalic</a>
+ * @author Ceki G&uuml;lc&uuml;
+ * @author Anders Kristensen
+ * 
+ * @since 0.8.2
+ */
 public class PatternParser {
 
-  private static final char ESCAPE_CHAR = '%';
-
-  private static final int LITERAL_STATE = 0;
-  private static final int CONVERTER_STATE = 1;
-  private static final int DOT_STATE = 3;
-  private static final int MIN_STATE = 4;
-  private static final int MAX_STATE = 5;
-
-  static final int FULL_LOCATION_CONVERTER = 1000;
-  static final int METHOD_LOCATION_CONVERTER = 1001;
-  static final int CLASS_LOCATION_CONVERTER = 1002;
-  static final int LINE_LOCATION_CONVERTER = 1003;
-  static final int FILE_LOCATION_CONVERTER = 1004;
-
-  static final int RELATIVE_TIME_CONVERTER = 2000;
-  static final int THREAD_CONVERTER = 2001;
-  static final int LEVEL_CONVERTER = 2002;
-  static final int NDC_CONVERTER = 2003;
-  static final int MESSAGE_CONVERTER = 2004;
-
-  int state;
-  protected StringBuffer currentLiteral = new StringBuffer(32);
-  protected int patternLength;
-  protected int i;
-  PatternConverter head;
-  PatternConverter tail;
-  protected FormattingInfo formattingInfo = new FormattingInfo();
-  protected String pattern;
-
-  public
-  PatternParser(String pattern) {
-    this.pattern = pattern;
-    patternLength =  pattern.length();
-    state = LITERAL_STATE;
-  }
-
-  private
-  void  addToList(PatternConverter pc) {
-    if(head == null) {
-      head = tail = pc;
-    } else {
-      tail.next = pc;
-      tail = pc;
+    private static final char ESCAPE_CHAR = '%';
+
+    private static final int LITERAL_STATE = 0;
+    private static final int CONVERTER_STATE = 1;
+    private static final int DOT_STATE = 3;
+    private static final int MIN_STATE = 4;
+    private static final int MAX_STATE = 5;
+
+    static final int FULL_LOCATION_CONVERTER = 1000;
+    static final int METHOD_LOCATION_CONVERTER = 1001;
+    static final int CLASS_LOCATION_CONVERTER = 1002;
+    static final int LINE_LOCATION_CONVERTER = 1003;
+    static final int FILE_LOCATION_CONVERTER = 1004;
+
+    static final int RELATIVE_TIME_CONVERTER = 2000;
+    static final int THREAD_CONVERTER = 2001;
+    static final int LEVEL_CONVERTER = 2002;
+    static final int NDC_CONVERTER = 2003;
+    static final int MESSAGE_CONVERTER = 2004;
+
+    int state;
+    protected StringBuffer currentLiteral = new StringBuffer(32);
+    protected int patternLength;
+    protected int i;
+    PatternConverter head;
+    PatternConverter tail;
+    protected FormattingInfo formattingInfo = new FormattingInfo();
+    protected String pattern;
+
+    public PatternParser(String pattern) {
+        this.pattern = pattern;
+        patternLength = pattern.length();
+        state = LITERAL_STATE;
     }
-  }
-
-  protected
-  String extractOption() {
-    if((i < patternLength) && (pattern.charAt(i) == '{')) {
-      int end = pattern.indexOf('}', i);
-      if (end > i) {
-	String r = pattern.substring(i + 1, end);
-	i = end+1;
-	return r;
-      }
+
+    private void addToList(PatternConverter pc) {
+        if (head == null) {
+            head = tail = pc;
+        } else {
+            tail.next = pc;
+            tail = pc;
+        }
     }
-    return null;
-  }
-
-
-  /**
-     The option is expected to be in decimal and positive. In case of
-     error, zero is returned.  */
-  protected
-  int extractPrecisionOption() {
-    String opt = extractOption();
-    int r = 0;
-    if(opt != null) {
-      try {
-	r = Integer.parseInt(opt);
-	if(r <= 0) {
-	    LogLog.error(
-	        "Precision option (" + opt + ") isn't a positive integer.");
-	    r = 0;
-	}
-      }
-      catch (NumberFormatException e) {
-	LogLog.error("Category option \""+opt+"\" not a decimal integer.", e);
-      }
+
+    protected String extractOption() {
+        if ((i < patternLength) && (pattern.charAt(i) == '{')) {
+            int end = pattern.indexOf('}', i);
+            if (end > i) {
+                String r = pattern.substring(i + 1, end);
+                i = end + 1;
+                return r;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * The option is expected to be in decimal and positive. In case of error, zero is returned.
+     */
+    protected int extractPrecisionOption() {
+        String opt = extractOption();
+        int r = 0;
+        if (opt != null) {
+            try {
+                r = Integer.parseInt(opt);
+                if (r <= 0) {
+                    LogLog.error("Precision option (" + opt + ") isn't a positive integer.");
+                    r = 0;
+                }
+            } catch (NumberFormatException e) {
+                LogLog.error("Category option \"" + opt + "\" not a decimal integer.", e);
+            }
+        }
+        return r;
     }
-    return r;
-  }
-
-  public
-  PatternConverter parse() {
-    char c;
-    i = 0;
-    while(i < patternLength) {
-      c = pattern.charAt(i++);
-      switch(state) {
-      case LITERAL_STATE:
-        // In literal state, the last char is always a literal.
-        if(i == patternLength) {
-          currentLiteral.append(c);
-          continue;
+
+    public PatternConverter parse() {
+        char c;
+        i = 0;
+        while (i < patternLength) {
+            c = pattern.charAt(i++);
+            switch (state) {
+            case LITERAL_STATE:
+                // In literal state, the last char is always a literal.
+                if (i == patternLength) {
+                    currentLiteral.append(c);
+                    continue;
+                }
+                if (c == ESCAPE_CHAR) {
+                    // peek at the next char.
+                    switch (pattern.charAt(i)) {
+                    case ESCAPE_CHAR:
+                        currentLiteral.append(c);
+                        i++; // move pointer
+                        break;
+                    case 'n':
+                        currentLiteral.append(Layout.LINE_SEP);
+                        i++; // move pointer
+                        break;
+                    default:
+                        if (currentLiteral.length() != 0) {
+                            addToList(new LiteralPatternConverter(currentLiteral.toString()));
+                            // LogLog.debug("Parsed LITERAL converter: \""
+                            // +currentLiteral+"\".");
+                        }
+                        currentLiteral.setLength(0);
+                        currentLiteral.append(c); // append %
+                        state = CONVERTER_STATE;
+                        formattingInfo.reset();
+                    }
+                } else {
+                    currentLiteral.append(c);
+                }
+                break;
+            case CONVERTER_STATE:
+                currentLiteral.append(c);
+                switch (c) {
+                case '-':
+                    formattingInfo.leftAlign = true;
+                    break;
+                case '.':
+                    state = DOT_STATE;
+                    break;
+                default:
+                    if (c >= '0' && c <= '9') {
+                        formattingInfo.min = c - '0';
+                        state = MIN_STATE;
+                    } else
+                        finalizeConverter(c);
+                } // switch
+                break;
+            case MIN_STATE:
+                currentLiteral.append(c);
+                if (c >= '0' && c <= '9')
+                    formattingInfo.min = formattingInfo.min * 10 + (c - '0');
+                else if (c == '.')
+                    state = DOT_STATE;
+                else {
+                    finalizeConverter(c);
+                }
+                break;
+            case DOT_STATE:
+                currentLiteral.append(c);
+                if (c >= '0' && c <= '9') {
+                    formattingInfo.max = c - '0';
+                    state = MAX_STATE;
+                } else {
+                    LogLog.error("Error occured in position " + i + ".\n Was expecting digit, instead got char \"" + c + "\".");
+                    state = LITERAL_STATE;
+                }
+                break;
+            case MAX_STATE:
+                currentLiteral.append(c);
+                if (c >= '0' && c <= '9')
+                    formattingInfo.max = formattingInfo.max * 10 + (c - '0');
+                else {
+                    finalizeConverter(c);
+                    state = LITERAL_STATE;
+                }
+                break;
+            } // switch
+        } // while
+        if (currentLiteral.length() != 0) {
+            addToList(new LiteralPatternConverter(currentLiteral.toString()));
+            // LogLog.debug("Parsed LITERAL converter: \""+currentLiteral+"\".");
         }
-        if(c == ESCAPE_CHAR) {
-          // peek at the next char.
-          switch(pattern.charAt(i)) {
-          case ESCAPE_CHAR:
-            currentLiteral.append(c);
-            i++; // move pointer
+        return head;
+    }
+
+    protected void finalizeConverter(char c) {
+        PatternConverter pc = null;
+        switch (c) {
+        case 'c':
+            pc = new CategoryPatternConverter(formattingInfo, extractPrecisionOption());
+            // LogLog.debug("CATEGORY converter.");
+            // formattingInfo.dump();
+            currentLiteral.setLength(0);
             break;
-          case 'n':
-            currentLiteral.append(Layout.LINE_SEP);
-            i++; // move pointer
+        case 'C':
+            pc = new ClassNamePatternConverter(formattingInfo, extractPrecisionOption());
+            // LogLog.debug("CLASS_NAME converter.");
+            // formattingInfo.dump();
+            currentLiteral.setLength(0);
             break;
-          default:
-            if(currentLiteral.length() != 0) {
-              addToList(new LiteralPatternConverter(
-                                                  currentLiteral.toString()));
-              //LogLog.debug("Parsed LITERAL converter: \""
-              //           +currentLiteral+"\".");
+        case 'd':
+            String dateFormatStr = AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT;
+            DateFormat df;
+            String dOpt = extractOption();
+            if (dOpt != null)
+                dateFormatStr = dOpt;
+
+            if (dateFormatStr.equalsIgnoreCase(AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT))
+                df = new ISO8601DateFormat();
+            else if (dateFormatStr.equalsIgnoreCase(AbsoluteTimeDateFormat.ABS_TIME_DATE_FORMAT))
+                df = new AbsoluteTimeDateFormat();
+            else if (dateFormatStr.equalsIgnoreCase(AbsoluteTimeDateFormat.DATE_AND_TIME_DATE_FORMAT))
+                df = new DateTimeDateFormat();
+            else {
+                try {
+                    df = new SimpleDateFormat(dateFormatStr);
+                } catch (IllegalArgumentException e) {
+                    LogLog.error("Could not instantiate SimpleDateFormat with " + dateFormatStr, e);
+                    df = (DateFormat) OptionConverter.instantiateByClassName("org.apache.log4j.helpers.ISO8601DateFormat", DateFormat.class, null);
+                }
             }
+            pc = new DatePatternConverter(formattingInfo, df);
+            // LogLog.debug("DATE converter {"+dateFormatStr+"}.");
+            // formattingInfo.dump();
+            currentLiteral.setLength(0);
+            break;
+        case 'F':
+            pc = new LocationPatternConverter(formattingInfo, FILE_LOCATION_CONVERTER);
+            // LogLog.debug("File name converter.");
+            // formattingInfo.dump();
+            currentLiteral.setLength(0);
+            break;
+        case 'l':
+            pc = new LocationPatternConverter(formattingInfo, FULL_LOCATION_CONVERTER);
+            // LogLog.debug("Location converter.");
+            // formattingInfo.dump();
+            currentLiteral.setLength(0);
+            break;
+        case 'L':
+            pc = new LocationPatternConverter(formattingInfo, LINE_LOCATION_CONVERTER);
+            // LogLog.debug("LINE NUMBER converter.");
+            // formattingInfo.dump();
+            currentLiteral.setLength(0);
+            break;
+        case 'm':
+            pc = new BasicPatternConverter(formattingInfo, MESSAGE_CONVERTER);
+            // LogLog.debug("MESSAGE converter.");
+            // formattingInfo.dump();
+            currentLiteral.setLength(0);
+            break;
+        case 'M':
+            pc = new LocationPatternConverter(formattingInfo, METHOD_LOCATION_CONVERTER);
+            // LogLog.debug("METHOD converter.");
+            // formattingInfo.dump();
+            currentLiteral.setLength(0);
+            break;
+        case 'p':
+            pc = new BasicPatternConverter(formattingInfo, LEVEL_CONVERTER);
+            // LogLog.debug("LEVEL converter.");
+            // formattingInfo.dump();
+            currentLiteral.setLength(0);
+            break;
+        case 'r':
+            pc = new BasicPatternConverter(formattingInfo, RELATIVE_TIME_CONVERTER);
+            // LogLog.debug("RELATIVE time converter.");
+            // formattingInfo.dump();
+            currentLiteral.setLength(0);
+            break;
+        case 't':
+            pc = new BasicPatternConverter(formattingInfo, THREAD_CONVERTER);
+            // LogLog.debug("THREAD converter.");
+            // formattingInfo.dump();
+            currentLiteral.setLength(0);
+            break;
+        /*
+         * case 'u': if(i < patternLength) { char cNext = pattern.charAt(i); if(cNext >= '0' && cNext <= '9') { pc = new
+         * UserFieldPatternConverter(formattingInfo, cNext - '0'); LogLog.debug("USER converter ["+cNext+"].");
+         * formattingInfo.dump(); currentLiteral.setLength(0); i++; } else LogLog.error("Unexpected char"
+         * +cNext+" at position "+i); } break;
+         */
+        case 'x':
+            pc = new BasicPatternConverter(formattingInfo, NDC_CONVERTER);
+            // LogLog.debug("NDC converter.");
+            currentLiteral.setLength(0);
+            break;
+        case 'X':
+            String xOpt = extractOption();
+            pc = new MDCPatternConverter(formattingInfo, xOpt);
+            currentLiteral.setLength(0);
+            break;
+        default:
+            LogLog.error("Unexpected char [" + c + "] at position " + i + " in conversion patterrn.");
+            pc = new LiteralPatternConverter(currentLiteral.toString());
             currentLiteral.setLength(0);
-            currentLiteral.append(c); // append %
-            state = CONVERTER_STATE;
-            formattingInfo.reset();
-          }
-        }
-        else {
-          currentLiteral.append(c);
         }
-        break;
-      case CONVERTER_STATE:
-	currentLiteral.append(c);
-	switch(c) {
-	case '-':
-	  formattingInfo.leftAlign = true;
-	  break;
-	case '.':
-	  state = DOT_STATE;
-	  break;
-	default:
-	  if(c >= '0' && c <= '9') {
-	    formattingInfo.min = c - '0';
-	    state = MIN_STATE;
-	  }
-	  else
-	    finalizeConverter(c);
-	} // switch
-	break;
-      case MIN_STATE:
-	currentLiteral.append(c);
-	if(c >= '0' && c <= '9')
-	  formattingInfo.min = formattingInfo.min*10 + (c - '0');
-	else if(c == '.')
-	  state = DOT_STATE;
-	else {
-	  finalizeConverter(c);
-	}
-	break;
-      case DOT_STATE:
-	currentLiteral.append(c);
-	if(c >= '0' && c <= '9') {
-	  formattingInfo.max = c - '0';
-	   state = MAX_STATE;
-	}
-	else {
-	  LogLog.error("Error occured in position "+i
-		     +".\n Was expecting digit, instead got char \""+c+"\".");
-	  state = LITERAL_STATE;
-	}
-	break;
-      case MAX_STATE:
-	currentLiteral.append(c);
-	if(c >= '0' && c <= '9')
-	  formattingInfo.max = formattingInfo.max*10 + (c - '0');
-	else {
-	  finalizeConverter(c);
-	  state = LITERAL_STATE;
-	}
-	break;
-      } // switch
-    } // while
-    if(currentLiteral.length() != 0) {
-      addToList(new LiteralPatternConverter(currentLiteral.toString()));
-      //LogLog.debug("Parsed LITERAL converter: \""+currentLiteral+"\".");
-    }
-    return head;
-  }
-
-  protected
-  void finalizeConverter(char c) {
-    PatternConverter pc = null;
-    switch(c) {
-    case 'c':
-      pc = new CategoryPatternConverter(formattingInfo,
-					extractPrecisionOption());
-      //LogLog.debug("CATEGORY converter.");
-      //formattingInfo.dump();
-      currentLiteral.setLength(0);
-      break;
-    case 'C':
-      pc = new ClassNamePatternConverter(formattingInfo,
-					 extractPrecisionOption());
-      //LogLog.debug("CLASS_NAME converter.");
-      //formattingInfo.dump();
-      currentLiteral.setLength(0);
-      break;
-    case 'd':
-      String dateFormatStr = AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT;
-      DateFormat df;
-      String dOpt = extractOption();
-      if(dOpt != null)
-	dateFormatStr = dOpt;
-
-      if(dateFormatStr.equalsIgnoreCase(
-                                    AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT))
-	df = new  ISO8601DateFormat();
-      else if(dateFormatStr.equalsIgnoreCase(
-                                   AbsoluteTimeDateFormat.ABS_TIME_DATE_FORMAT))
-	df = new AbsoluteTimeDateFormat();
-      else if(dateFormatStr.equalsIgnoreCase(
-                              AbsoluteTimeDateFormat.DATE_AND_TIME_DATE_FORMAT))
-	df = new DateTimeDateFormat();
-      else {
-	try {
-	  df = new SimpleDateFormat(dateFormatStr);
-	}
-	catch (IllegalArgumentException e) {
-	  LogLog.error("Could not instantiate SimpleDateFormat with " +
-		       dateFormatStr, e);
-	  df = (DateFormat) OptionConverter.instantiateByClassName(
-			           "org.apache.log4j.helpers.ISO8601DateFormat",
-				   DateFormat.class, null);
-	}
-      }
-      pc = new DatePatternConverter(formattingInfo, df);
-      //LogLog.debug("DATE converter {"+dateFormatStr+"}.");
-      //formattingInfo.dump();
-      currentLiteral.setLength(0);
-      break;
-    case 'F':
-      pc = new LocationPatternConverter(formattingInfo,
-					FILE_LOCATION_CONVERTER);
-      //LogLog.debug("File name converter.");
-      //formattingInfo.dump();
-      currentLiteral.setLength(0);
-      break;
-    case 'l':
-      pc = new LocationPatternConverter(formattingInfo,
-					FULL_LOCATION_CONVERTER);
-      //LogLog.debug("Location converter.");
-      //formattingInfo.dump();
-      currentLiteral.setLength(0);
-      break;
-    case 'L':
-      pc = new LocationPatternConverter(formattingInfo,
-					LINE_LOCATION_CONVERTER);
-      //LogLog.debug("LINE NUMBER converter.");
-      //formattingInfo.dump();
-      currentLiteral.setLength(0);
-      break;
-    case 'm':
-      pc = new BasicPatternConverter(formattingInfo, MESSAGE_CONVERTER);
-      //LogLog.debug("MESSAGE converter.");
-      //formattingInfo.dump();
-      currentLiteral.setLength(0);
-      break;
-    case 'M':
-      pc = new LocationPatternConverter(formattingInfo,
-					METHOD_LOCATION_CONVERTER);
-      //LogLog.debug("METHOD converter.");
-      //formattingInfo.dump();
-      currentLiteral.setLength(0);
-      break;
-    case 'p':
-      pc = new BasicPatternConverter(formattingInfo, LEVEL_CONVERTER);
-      //LogLog.debug("LEVEL converter.");
-      //formattingInfo.dump();
-      currentLiteral.setLength(0);
-      break;
-    case 'r':
-      pc = new BasicPatternConverter(formattingInfo,
-					 RELATIVE_TIME_CONVERTER);
-      //LogLog.debug("RELATIVE time converter.");
-      //formattingInfo.dump();
-      currentLiteral.setLength(0);
-      break;
-    case 't':
-      pc = new BasicPatternConverter(formattingInfo, THREAD_CONVERTER);
-      //LogLog.debug("THREAD converter.");
-      //formattingInfo.dump();
-      currentLiteral.setLength(0);
-      break;
-      /*case 'u':
-      if(i < patternLength) {
-	char cNext = pattern.charAt(i);
-	if(cNext >= '0' && cNext <= '9') {
-	  pc = new UserFieldPatternConverter(formattingInfo, cNext - '0');
-	  LogLog.debug("USER converter ["+cNext+"].");
-	  formattingInfo.dump();
-	  currentLiteral.setLength(0);
-	  i++;
-	}
-	else
-	  LogLog.error("Unexpected char" +cNext+" at position "+i);
-      }
-      break;*/
-    case 'x':
-      pc = new BasicPatternConverter(formattingInfo, NDC_CONVERTER);
-      //LogLog.debug("NDC converter.");
-      currentLiteral.setLength(0);
-      break;
-    case 'X':
-      String xOpt = extractOption();
-      pc = new MDCPatternConverter(formattingInfo, xOpt);
-      currentLiteral.setLength(0);
-      break;
-    default:
-      LogLog.error("Unexpected char [" +c+"] at position "+i
-		   +" in conversion patterrn.");
-      pc = new LiteralPatternConverter(currentLiteral.toString());
-      currentLiteral.setLength(0);
-    }
 
-    addConverter(pc);
-  }
-
-  protected
-  void addConverter(PatternConverter pc) {
-    currentLiteral.setLength(0);
-    // Add the pattern converter to the list.
-    addToList(pc);
-    // Next pattern is assumed to be a literal.
-    state = LITERAL_STATE;
-    // Reset formatting info
-    formattingInfo.reset();
-  }
-
-  // ---------------------------------------------------------------------
-  //                      PatternConverters
-  // ---------------------------------------------------------------------
-
-  private static class BasicPatternConverter extends PatternConverter {
-    int type;
-
-    BasicPatternConverter(FormattingInfo formattingInfo, int type) {
-      super(formattingInfo);
-      this.type = type;
+        addConverter(pc);
     }
 
-    public
-    String convert(LoggingEvent event) {
-      switch(type) {
-      case RELATIVE_TIME_CONVERTER:
-	return (Long.toString(event.timeStamp - LoggingEvent.getStartTime()));
-      case THREAD_CONVERTER:
-	return event.getThreadName();
-      case LEVEL_CONVERTER:
-	return event.getLevel().toString();
-      case NDC_CONVERTER:
-	return event.getNDC();
-      case MESSAGE_CONVERTER: {
-	return event.getRenderedMessage();
-      }
-      default: return null;
-      }
+    protected void addConverter(PatternConverter pc) {
+        currentLiteral.setLength(0);
+        // Add the pattern converter to the list.
+        addToList(pc);
+        // Next pattern is assumed to be a literal.
+        state = LITERAL_STATE;
+        // Reset formatting info
+        formattingInfo.reset();
     }
-  }
 
-  private static class LiteralPatternConverter extends PatternConverter {
-    private String literal;
+    // ---------------------------------------------------------------------
+    // PatternConverters
+    // ---------------------------------------------------------------------
 
-    LiteralPatternConverter(String value) {
-      literal = value;
-    }
+    private static class BasicPatternConverter extends PatternConverter {
+        int type;
 
-    public
-    final
-    void format(StringBuffer sbuf, LoggingEvent event) {
-      sbuf.append(literal);
-    }
+        BasicPatternConverter(FormattingInfo formattingInfo, int type) {
+            super(formattingInfo);
+            this.type = type;
+        }
 
-    public
-    String convert(LoggingEvent event) {
-      return literal;
+        public String convert(LoggingEvent event) {
+            switch (type) {
+            case RELATIVE_TIME_CONVERTER:
+                return (Long.toString(event.timeStamp - LoggingEvent.getStartTime()));
+            case THREAD_CONVERTER:
+                return event.getThreadName();
+            case LEVEL_CONVERTER:
+                return event.getLevel().toString();
+            case NDC_CONVERTER:
+                return event.getNDC();
+            case MESSAGE_CONVERTER: {
+                return event.getRenderedMessage();
+            }
+            default:
+                return null;
+            }
+        }
     }
-  }
 
-  private static class DatePatternConverter extends PatternConverter {
-    private DateFormat df;
-    private Date date;
+    private static class LiteralPatternConverter extends PatternConverter {
+        private String literal;
 
-    DatePatternConverter(FormattingInfo formattingInfo, DateFormat df) {
-      super(formattingInfo);
-      date = new Date();
-      this.df = df;
-    }
+        LiteralPatternConverter(String value) {
+            literal = value;
+        }
+
+        public final void format(StringBuffer sbuf, LoggingEvent event) {
+            sbuf.append(literal);
+        }
 
-    public
-    String convert(LoggingEvent event) {
-      date.setTime(event.timeStamp);
-      String converted = null;
-      try {
-        converted = df.format(date);
-      }
-      catch (Exception ex) {
-        LogLog.error("Error occured while converting date.", ex);
-      }
-      return converted;
+        public String convert(LoggingEvent event) {
+            return literal;
+        }
     }
-  }
 
-  private static class MDCPatternConverter extends PatternConverter {
-    private String key;
+    private static class DatePatternConverter extends PatternConverter {
+        private DateFormat df;
+        private Date date;
 
-    MDCPatternConverter(FormattingInfo formattingInfo, String key) {
-      super(formattingInfo);
-      this.key = key;
-    }
+        DatePatternConverter(FormattingInfo formattingInfo, DateFormat df) {
+            super(formattingInfo);
+            date = new Date();
+            this.df = df;
+        }
 
-    public
-    String convert(LoggingEvent event) {
-      if (key == null) {
-          StringBuffer buf = new StringBuffer("{");
-          Map properties = event.getProperties();
-          if (properties.size() > 0) {
-            Object[] keys = properties.keySet().toArray();
-            Arrays.sort(keys);
-            for (int i = 0; i < keys.length; i++) {
-                buf.append('{');
-                buf.append(keys[i]);
-                buf.append(',');
-                buf.append(properties.get(keys[i]));
-                buf.append('}');
+        public String convert(LoggingEvent event) {
+            date.setTime(event.timeStamp);
+            String converted = null;
+            try {
+                converted = df.format(date);
+            } catch (Exception ex) {
+                LogLog.error("Error occured while converting date.", ex);
             }
-          }
-          buf.append('}');
-          return buf.toString();
-      } else {
-        Object val = event.getMDC(key);
-        if(val == null) {
-	        return null;
-        } else {
-	        return val.toString();
+            return converted;
         }
-      }
     }
-  }
 
+    private static class MDCPatternConverter extends PatternConverter {
+        private String key;
 
-  private class LocationPatternConverter extends PatternConverter {
-    int type;
+        MDCPatternConverter(FormattingInfo formattingInfo, String key) {
+            super(formattingInfo);
+            this.key = key;
+        }
 
-    LocationPatternConverter(FormattingInfo formattingInfo, int type) {
-      super(formattingInfo);
-      this.type = type;
+        public String convert(LoggingEvent event) {
+            if (key == null) {
+                StringBuffer buf = new StringBuffer("{");
+                Map properties = event.getProperties();
+                if (properties.size() > 0) {
+                    Object[] keys = properties.keySet().toArray();
+                    Arrays.sort(keys);
+                    for (int i = 0; i < keys.length; i++) {
+                        buf.append('{');
+                        buf.append(keys[i]);
+                        buf.append(',');
+                        buf.append(properties.get(keys[i]));
+                        buf.append('}');
+                    }
+                }
+                buf.append('}');
+                return buf.toString();
+            } else {
+                Object val = event.getMDC(key);
+                if (val == null) {
+                    return null;
+                } else {
+                    return val.toString();
+                }
+            }
+        }
     }
 
-    public
-    String convert(LoggingEvent event) {
-      LocationInfo locationInfo = event.getLocationInformation();
-      switch(type) {
-      case FULL_LOCATION_CONVERTER:
-	return locationInfo.fullInfo;
-      case METHOD_LOCATION_CONVERTER:
-	return locationInfo.getMethodName();
-      case LINE_LOCATION_CONVERTER:
-	return locationInfo.getLineNumber();
-      case FILE_LOCATION_CONVERTER:
-	return locationInfo.getFileName();
-      default: return null;
-      }
-    }
-  }
+    private class LocationPatternConverter extends PatternConverter {
+        int type;
 
-  private static abstract class NamedPatternConverter extends PatternConverter {
-    int precision;
+        LocationPatternConverter(FormattingInfo formattingInfo, int type) {
+            super(formattingInfo);
+            this.type = type;
+        }
 
-    NamedPatternConverter(FormattingInfo formattingInfo, int precision) {
-      super(formattingInfo);
-      this.precision =  precision;
+        public String convert(LoggingEvent event) {
+            LocationInfo locationInfo = event.getLocationInformation();
+            switch (type) {
+            case FULL_LOCATION_CONVERTER:
+                return locationInfo.fullInfo;
+            case METHOD_LOCATION_CONVERTER:
+                return locationInfo.getMethodName();
+            case LINE_LOCATION_CONVERTER:
+                return locationInfo.getLineNumber();
+            case FILE_LOCATION_CONVERTER:
+                return locationInfo.getFileName();
+            default:
+                return null;
+            }
+        }
     }
 
-    abstract
-    String getFullyQualifiedName(LoggingEvent event);
-
-    public
-    String convert(LoggingEvent event) {
-      String n = getFullyQualifiedName(event);
-      if(precision <= 0)
-	return n;
-      else {
-	int len = n.length();
-
-	// We substract 1 from 'len' when assigning to 'end' to avoid out of
-	// bounds exception in return r.substring(end+1, len). This can happen if
-	// precision is 1 and the category name ends with a dot.
-	int end = len -1 ;
-	for(int i = precision; i > 0; i--) {
-	  end = n.lastIndexOf('.', end-1);
-	  if(end == -1)
-	    return n;
-	}
-	return n.substring(end+1, len);
-      }
-    }
-  }
+    private static abstract class NamedPatternConverter extends PatternConverter {
+        int precision;
 
-  private class ClassNamePatternConverter extends NamedPatternConverter {
+        NamedPatternConverter(FormattingInfo formattingInfo, int precision) {
+            super(formattingInfo);
+            this.precision = precision;
+        }
 
-    ClassNamePatternConverter(FormattingInfo formattingInfo, int precision) {
-      super(formattingInfo, precision);
+        abstract String getFullyQualifiedName(LoggingEvent event);
+
+        public String convert(LoggingEvent event) {
+            String n = getFullyQualifiedName(event);
+            if (precision <= 0)
+                return n;
+            else {
+                int len = n.length();
+
+                // We substract 1 from 'len' when assigning to 'end' to avoid out of
+                // bounds exception in return r.substring(end+1, len). This can happen if
+                // precision is 1 and the category name ends with a dot.
+                int end = len - 1;
+                for (int i = precision; i > 0; i--) {
+                    end = n.lastIndexOf('.', end - 1);
+                    if (end == -1)
+                        return n;
+                }
+                return n.substring(end + 1, len);
+            }
+        }
     }
 
-    String getFullyQualifiedName(LoggingEvent event) {
-      return event.getLocationInformation().getClassName();
-    }
-  }
+    private class ClassNamePatternConverter extends NamedPatternConverter {
 
-  private class CategoryPatternConverter extends NamedPatternConverter {
+        ClassNamePatternConverter(FormattingInfo formattingInfo, int precision) {
+            super(formattingInfo, precision);
+        }
 
-    CategoryPatternConverter(FormattingInfo formattingInfo, int precision) {
-      super(formattingInfo, precision);
+        String getFullyQualifiedName(LoggingEvent event) {
+            return event.getLocationInformation().getClassName();
+        }
     }
 
-    String getFullyQualifiedName(LoggingEvent event) {
-      return event.getLoggerName();
+    private class CategoryPatternConverter extends NamedPatternConverter {
+
+        CategoryPatternConverter(FormattingInfo formattingInfo, int precision) {
+            super(formattingInfo, precision);
+        }
+
+        String getFullyQualifiedName(LoggingEvent event) {
+            return event.getLoggerName();
+        }
     }
-  }
 }
-
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/QuietWriter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/QuietWriter.java
index 1b33ff3..42120d9 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/QuietWriter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/QuietWriter.java
@@ -37,6 +37,7 @@ public class QuietWriter extends FilterWriter {
         setErrorHandler(errorHandler);
     }
 
+    @Override
     public void write(String string) {
         if (string != null) {
             try {
@@ -48,6 +49,7 @@ public class QuietWriter extends FilterWriter {
         }
     }
 
+    @Override
     public void flush() {
         try {
             out.flush();
@@ -62,8 +64,7 @@ public class QuietWriter extends FilterWriter {
         if (eh == null) {
             // This is a programming error on the part of the enclosing appender.
             throw new IllegalArgumentException("Attempted to set null ErrorHandler.");
-        } else {
-            this.errorHandler = eh;
         }
+        this.errorHandler = eh;
     }
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
index 420c455..0f39a9c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
@@ -20,6 +20,7 @@ import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
@@ -30,7 +31,6 @@ import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.BiConsumer;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.Strings;
 
@@ -42,14 +42,17 @@ import org.apache.logging.log4j.util.Strings;
 @Plugin(name = "Log4j1XmlLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
 public final class Log4j1XmlLayout extends AbstractStringLayout {
 
+    /** We yield to the \r\n heresy. */
+    private static final String EOL = "\r\n";
+
     private final boolean locationInfo;
     private final boolean properties;
 
     @PluginFactory
     public static Log4j1XmlLayout createLayout(
             // @formatter:off
-            @PluginAttribute final boolean locationInfo,
-            @PluginAttribute final boolean properties
+            @PluginAttribute(value = "locationInfo") final boolean locationInfo,
+            @PluginAttribute(value = "properties") final boolean properties
             // @formatter:on
     ) {
         return new Log4j1XmlLayout(locationInfo, properties);
@@ -84,8 +87,6 @@ public final class Log4j1XmlLayout extends AbstractStringLayout {
     }
 
     private void formatTo(final LogEvent event, final StringBuilder buf) {
-        // We yield to the \r\n heresy.
-
         buf.append("<log4j:event logger=\"");
         buf.append(Transform.escapeHtmlTags(event.getLoggerName()));
         buf.append("\" timestamp=\"");
@@ -94,18 +95,21 @@ public final class Log4j1XmlLayout extends AbstractStringLayout {
         buf.append(Transform.escapeHtmlTags(String.valueOf(event.getLevel())));
         buf.append("\" thread=\"");
         buf.append(Transform.escapeHtmlTags(event.getThreadName()));
-        buf.append("\">\r\n");
+        buf.append("\">");
+        buf.append(EOL);
 
         buf.append("<log4j:message><![CDATA[");
         // Append the rendered message. Also make sure to escape any existing CDATA sections.
         Transform.appendEscapingCData(buf, event.getMessage().getFormattedMessage());
-        buf.append("]]></log4j:message>\r\n");
+        buf.append("]]></log4j:message>");
+        buf.append(EOL);
 
         final List<String> ndc = event.getContextStack().asList();
         if (!ndc.isEmpty()) {
             buf.append("<log4j:NDC><![CDATA[");
             Transform.appendEscapingCData(buf, Strings.join(ndc, ' '));
-            buf.append("]]></log4j:NDC>\r\n");
+            buf.append("]]></log4j:NDC>");
+            buf.append(EOL);
         }
 
         @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
@@ -115,7 +119,8 @@ public final class Log4j1XmlLayout extends AbstractStringLayout {
             final StringWriter w = new StringWriter();
             thrown.printStackTrace(new PrintWriter(w));
             Transform.appendEscapingCData(buf, w.toString());
-            buf.append("]]></log4j:throwable>\r\n");
+            buf.append("]]></log4j:throwable>");
+            buf.append(EOL);
         }
 
         if (locationInfo) {
@@ -129,7 +134,8 @@ public final class Log4j1XmlLayout extends AbstractStringLayout {
                 buf.append(Transform.escapeHtmlTags(source.getFileName()));
                 buf.append("\" line=\"");
                 buf.append(source.getLineNumber());
-                buf.append("\"/>\r\n");
+                buf.append("\"/>");
+                buf.append(EOL);
             }
         }
 
@@ -137,20 +143,24 @@ public final class Log4j1XmlLayout extends AbstractStringLayout {
             final ReadOnlyStringMap contextMap = event.getContextData();
             if (!contextMap.isEmpty()) {
                 buf.append("<log4j:properties>\r\n");
-                contextMap.forEach((BiConsumer<String, String>) (key, val) -> {
+                contextMap.forEach((key, val) -> {
                     if (val != null) {
                         buf.append("<log4j:data name=\"");
                         buf.append(Transform.escapeHtmlTags(key));
                         buf.append("\" value=\"");
-                        buf.append(Transform.escapeHtmlTags(val));
-                        buf.append("\"/>\r\n");
+                        buf.append(Transform.escapeHtmlTags(Objects.toString(val, null)));
+                        buf.append("\"/>");
+                        buf.append(EOL);
                     }
                 });
-                buf.append("</log4j:properties>\r\n");
+                buf.append("</log4j:properties>");
+                buf.append(EOL);
             }
         }
 
-        buf.append("</log4j:event>\r\n\r\n");
+        buf.append("</log4j:event>");
+        buf.append(EOL);
+        buf.append(EOL);
     }
 
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/or/ThreadGroupRenderer.java b/log4j-1.2-api/src/main/java/org/apache/log4j/or/ThreadGroupRenderer.java
index 08233bf..959d927 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/or/ThreadGroupRenderer.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/or/ThreadGroupRenderer.java
@@ -22,6 +22,7 @@ import org.apache.log4j.Layout;
  */
 public class ThreadGroupRenderer implements ObjectRenderer {
 
+    @Override
     public
     String  doRender(Object obj) {
         if(obj instanceof ThreadGroup) {
@@ -45,13 +46,12 @@ public class ThreadGroupRenderer implements ObjectRenderer {
                 sb.append("]");
             }
             return sb.toString();
-        } else {
-            try {
-                // this is the best we can do
-                return obj.toString();
-            } catch(Exception ex) {
-                return ex.toString();
-            }
+        }
+        try {
+            // this is the best we can do
+            return obj.toString();
+        } catch(Exception ex) {
+            return ex.toString();
         }
     }
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java
index 0d82aa6..13b7266 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java
@@ -79,5 +79,5 @@ public final class Log4j1MdcPatternConverter extends LogEventPatternConverter {
         }
     }
 
-    private static final TriConsumer<String, Object, StringBuilder> APPEND_EACH = (key, value, toAppendTo) -> toAppendTo.append('{').append(key).append(',').append(value).append('}');
+    private static TriConsumer<String, Object, StringBuilder> APPEND_EACH = (key, value, toAppendTo) -> toAppendTo.append('{').append(key).append(',').append(value).append('}');
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/rewrite/MapRewritePolicy.java b/log4j-1.2-api/src/main/java/org/apache/log4j/rewrite/MapRewritePolicy.java
index 9cd42a1..f16ed38 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/rewrite/MapRewritePolicy.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/rewrite/MapRewritePolicy.java
@@ -44,11 +44,13 @@ import org.apache.logging.log4j.util.SortedArrayStringMap;
  * <p>
  * The combination of the RewriteAppender and this policy
  * performs the same actions as the MapFilter from log4j 1.3.
+ * </p>
  */
 public class MapRewritePolicy implements RewritePolicy {
     /**
      * {@inheritDoc}
      */
+    @Override
     public LoggingEvent rewrite(final LoggingEvent source) {
         Object msg = source.getMessage();
         if (msg instanceof MapMessage || msg instanceof Map) {
@@ -105,9 +107,8 @@ public class MapRewritePolicy implements RewritePolicy {
                         .build();
             }
             return new LogEventAdapter(event);
-        } else {
-            return source;
         }
+        return source;
 
     }
 
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java b/log4j-1.2-api/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java
index ab9b2b2..a84deac 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java
@@ -37,8 +37,8 @@ import org.apache.logging.log4j.util.SortedArrayStringMap;
  * <p>
  * The combination of the RewriteAppender and this policy
  * performs the same actions as the PropertyFilter from log4j 1.3.
+ * </p>
  */
-
 public class PropertyRewritePolicy implements RewritePolicy {
     private Map<String, String> properties = Collections.EMPTY_MAP;
 
@@ -48,25 +48,30 @@ public class PropertyRewritePolicy implements RewritePolicy {
     /**
      * Set a string representing the property name/value pairs.
      * <p>
-     * Form: propname1=propvalue1,propname2=propvalue2
+     * Form:
+     * </p>
+     * <pre>
+     * propname1=propvalue1,propname2=propvalue2
+     * </pre>
      *
-     * @param props The properties.
+     * @param properties The properties.
      */
-    public void setProperties(String props) {
-        Map hashTable = new HashMap();
-        StringTokenizer pairs = new StringTokenizer(props, ",");
+    public void setProperties(String properties) {
+        Map<String, String> newMap = new HashMap<>();
+        StringTokenizer pairs = new StringTokenizer(properties, ",");
         while (pairs.hasMoreTokens()) {
             StringTokenizer entry = new StringTokenizer(pairs.nextToken(), "=");
-            hashTable.put(entry.nextElement().toString().trim(), entry.nextElement().toString().trim());
+            newMap.put(entry.nextElement().toString().trim(), entry.nextElement().toString().trim());
         }
         synchronized (this) {
-            properties = hashTable;
+            this.properties = newMap;
         }
     }
 
     /**
      * {@inheritDoc}
      */
+    @Override
     public LoggingEvent rewrite(final LoggingEvent source) {
         if (!properties.isEmpty()) {
             Map<String, String> rewriteProps = source.getProperties() != null ? new HashMap<>(source.getProperties())
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/spi/ThrowableInformation.java b/log4j-1.2-api/src/main/java/org/apache/log4j/spi/ThrowableInformation.java
index cf0002c..2b46dd5 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/spi/ThrowableInformation.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/spi/ThrowableInformation.java
@@ -21,7 +21,7 @@ import java.lang.reflect.Method;
 import java.util.List;
 
 import org.apache.log4j.Category;
-import org.apache.logging.log4j.core.util.Throwables;
+import org.apache.logging.log4j.util.Strings;
 
 /**
  * Log4j's internal representation of throwables.
@@ -59,7 +59,7 @@ public class ThrowableInformation implements Serializable {
     /**
      * Constructs new instance.
      */
-    public ThrowableInformation(Throwable throwable) {
+    public ThrowableInformation(final Throwable throwable) {
         this.throwable = throwable;
     }
 
@@ -76,8 +76,7 @@ public class ThrowableInformation implements Serializable {
         this.rep = null;
     }
 
-    public
-    Throwable getThrowable() {
+    public Throwable getThrowable() {
         return throwable;
     }
 
@@ -87,7 +86,7 @@ public class ThrowableInformation implements Serializable {
                 @SuppressWarnings("unchecked")
                 final List<String> elements = (List<String>) TO_STRING_LIST.invoke(null, throwable);
                 if (elements != null) {
-                    return elements.toArray(new String[0]);
+                    return elements.toArray(Strings.EMPTY_ARRAY);
                 }
             } catch (final ReflectiveOperationException ex) {
                 // Ignore the exception.
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java
index edda022..9c9226b 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java
@@ -17,14 +17,15 @@
 
 package org.apache.log4j.xml;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Constants;
 import org.xml.sax.EntityResolver;
 import org.xml.sax.InputSource;
 
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
 /**
  * An {@link EntityResolver} specifically designed to return
  * <code>log4j.dtd</code> which is embedded within the log4j jar
@@ -34,18 +35,18 @@ public class Log4jEntityResolver implements EntityResolver {
     private static final Logger LOGGER = StatusLogger.getLogger();
     private static final String PUBLIC_ID = "-//APACHE//DTD LOG4J 1.2//EN";
 
+    @Override
     public InputSource resolveEntity(String publicId, String systemId) {
         if (systemId.endsWith("log4j.dtd") || PUBLIC_ID.equals(publicId)) {
-            Class clazz = getClass();
+            Class<?> clazz = getClass();
             InputStream in = clazz.getResourceAsStream("/org/apache/log4j/xml/log4j.dtd");
             if (in == null) {
                 LOGGER.warn("Could not find [log4j.dtd] using [{}] class loader, parsed without DTD.",
                         clazz.getClassLoader());
-                in = new ByteArrayInputStream(new byte[0]);
+                in = new ByteArrayInputStream(Constants.EMPTY_BYTE_ARRAY);
             }
             return new InputSource(in);
-        } else {
-            return null;
         }
+        return null;
     }
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/UnrecognizedElementHandler.java b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/UnrecognizedElementHandler.java
index 44c832a..81e290b 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/UnrecognizedElementHandler.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/UnrecognizedElementHandler.java
@@ -40,4 +40,4 @@ public interface UnrecognizedElementHandler {
      * of the configured object.
      */
     boolean parseUnrecognizedElement(Element element, Properties props) throws Exception;
-}
+}
\ No newline at end of file
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 dc8e940..50c355b 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
@@ -16,13 +16,13 @@
  */
 package org.apache.log4j.xml;
 
-
 import java.io.IOException;
 import java.io.InterruptedIOException;
 import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
 import java.util.stream.IntStream;
 
@@ -36,7 +36,6 @@ import org.apache.log4j.Level;
 import org.apache.log4j.bridge.AppenderAdapter;
 import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.FilterAdapter;
-import org.apache.log4j.builders.Holder;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertySetter;
 import org.apache.log4j.helpers.OptionConverter;
@@ -44,8 +43,8 @@ import org.apache.log4j.rewrite.RewritePolicy;
 import org.apache.log4j.spi.AppenderAttachable;
 import org.apache.log4j.spi.ErrorHandler;
 import org.apache.log4j.spi.Filter;
-import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.Filter.Result;
+import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.ConfigurationSource;
 import org.apache.logging.log4j.core.config.LoggerConfig;
@@ -93,11 +92,12 @@ public class XmlConfiguration extends Log4j1Configuration {
     private static final String INTERNAL_DEBUG_ATTR = "debug";
     private static final String THRESHOLD_ATTR = "threshold";
     private static final String EMPTY_STR = "";
-    private static final Class[] ONE_STRING_PARAM = new Class[]{String.class};
+    private static final Class<?>[] ONE_STRING_PARAM = new Class[] { String.class };
     private static final String dbfKey = "javax.xml.parsers.DocumentBuilderFactory";
     private static final String THROWABLE_RENDERER_TAG = "throwableRenderer";
 
     public static final long DEFAULT_DELAY = 60000;
+
     /**
      * File name prefix for test configurations.
      */
@@ -124,19 +124,22 @@ public class XmlConfiguration extends Log4j1Configuration {
     }
 
     /**
-     * Configure log4j by reading in a log4j.dtd compliant XML
+     * Configures log4j by reading in a log4j.dtd compliant XML
      * configuration file.
      */
     @Override
     public void doConfigure() throws FactoryConfigurationError {
         ConfigurationSource source = getConfigurationSource();
         ParseAction action = new ParseAction() {
+            @Override
             public Document parse(final DocumentBuilder parser) throws SAXException, IOException {
+                @SuppressWarnings("resource") // The ConfigurationSource and its caller manages the InputStream.
                 InputSource inputSource = new InputSource(source.getInputStream());
                 inputSource.setSystemId("dummy://log4j.dtd");
                 return parser.parse(inputSource);
             }
 
+            @Override
             public String toString() {
                 return getConfigurationSource().getLocation();
             }
@@ -319,36 +322,31 @@ public class XmlConfiguration extends Log4j1Configuration {
 
         if (appender != null) {
             return appender;
-        } else {
-            // Doesn't work on DOM Level 1 :
-            // Element element = doc.getElementById(appenderName);
-
-            // Endre's hack:
-            Element element = null;
-            NodeList list = doc.getElementsByTagName("appender");
-            for (int t = 0; t < list.getLength(); t++) {
-                Node node = list.item(t);
-                NamedNodeMap map = node.getAttributes();
-                Node attrNode = map.getNamedItem("name");
-                if (appenderName.equals(attrNode.getNodeValue())) {
-                    element = (Element) node;
-                    break;
-                }
+        }
+        // Endre's hack:
+        Element element = null;
+        NodeList list = doc.getElementsByTagName("appender");
+        for (int t = 0; t < list.getLength(); t++) {
+            Node node = list.item(t);
+            NamedNodeMap map = node.getAttributes();
+            Node attrNode = map.getNamedItem("name");
+            if (appenderName.equals(attrNode.getNodeValue())) {
+                element = (Element) node;
+                break;
             }
-            // Hack finished.
+        }
+        // Hack finished.
 
-            if (element == null) {
+        if (element == null) {
 
-                LOGGER.error("No appender named [{}] could be found.", appenderName);
-                return null;
-            } else {
-                appender = parseAppender(element);
-                if (appender != null) {
-                    appenderMap.put(appenderName, appender);
-                }
-                return appender;
-            }
+            LOGGER.error("No appender named [{}] could be found.", appenderName);
+            return null;
         }
+        appender = parseAppender(element);
+        if (appender != null) {
+            appenderMap.put(appenderName, appender);
+        }
+        return appender;
     }
 
     /**
@@ -383,7 +381,7 @@ public class XmlConfiguration extends Log4j1Configuration {
             PropertySetter propSetter = new PropertySetter(appender);
 
             appender.setName(subst(appenderElement.getAttribute(NAME_ATTR)));
-            final Holder<Filter> filterChain = new Holder<>();
+            final AtomicReference<Filter> filterChain = new AtomicReference<>();
             forEachElement(appenderElement.getChildNodes(), currentElement -> {
                 // Parse appender parameters
                 switch (currentElement.getTagName()) {
@@ -442,9 +440,7 @@ public class XmlConfiguration extends Log4j1Configuration {
         return null;
     }
 
-
     public RewritePolicy parseRewritePolicy(Element rewritePolicyElement) {
-
         String className = subst(rewritePolicyElement.getAttribute(CLASS_ATTR));
         LOGGER.debug("Class name: [" + className + ']');
         RewritePolicy policy = manager.parseRewritePolicy(className, rewritePolicyElement, this);
@@ -459,7 +455,7 @@ public class XmlConfiguration extends Log4j1Configuration {
             RewritePolicy policy = LoaderUtil.newInstanceOf(className);
             PropertySetter propSetter = new PropertySetter(policy);
 
-            forEachElement(element.getChildNodes(), (currentElement) -> {
+            forEachElement(element.getChildNodes(), currentElement -> {
                 if (currentElement.getTagName().equalsIgnoreCase(PARAM_TAG)) {
                     setParameter(currentElement, propSetter);
                 }
@@ -494,7 +490,7 @@ public class XmlConfiguration extends Log4j1Configuration {
             eh.setAppender(appender);
 
             PropertySetter propSetter = new PropertySetter(eh);
-            forEachElement(element.getChildNodes(), (currentElement) -> {
+            forEachElement(element.getChildNodes(), currentElement -> {
                 String tagName = currentElement.getTagName();
                 if (tagName.equals(PARAM_TAG)) {
                     setParameter(currentElement, propSetter);
@@ -510,10 +506,9 @@ public class XmlConfiguration extends Log4j1Configuration {
      * @param filterElement The Filter Element.
      * @return The Filter.
      */
-    public void addFilter(final Holder<Filter> ref, final Element filterElement) {
-        final Filter filter = parseFilters(filterElement);
-        final Filter newFilter = FilterAdapter.addFilter(ref.get(), filter);
-        ref.set(newFilter);
+    public void addFilter(final AtomicReference<Filter> ref, final Element filterElement) {
+        final Filter value = parseFilters(filterElement);
+        ref.accumulateAndGet(value, FilterAdapter::addFilter);
     }
 
     /**
@@ -534,12 +529,12 @@ public class XmlConfiguration extends Log4j1Configuration {
             Filter filter = LoaderUtil.newInstanceOf(className);
             PropertySetter propSetter = new PropertySetter(filter);
 
-            forEachElement(filterElement.getChildNodes(), (currentElement) -> {
-                String tagName = currentElement.getTagName();
-                if (tagName.equals(PARAM_TAG)) {
-                    setParameter(currentElement, propSetter);
-                } else {
-                    quietParseUnrecognizedElement(filter, currentElement, props);
+            forEachElement(filterElement.getChildNodes(), currentElement -> {
+                // Parse appender parameters
+                switch (currentElement.getTagName()) {
+                    case PARAM_TAG :
+                        setParameter(currentElement, propSetter);
+                        break;
                 }
             });
             propSetter.activate();
@@ -591,7 +586,7 @@ public class XmlConfiguration extends Log4j1Configuration {
 
         final PropertySetter propSetter = new PropertySetter(loggerConfig);
         loggerConfig.getAppenderRefs().clear();
-        forEachElement(catElement.getChildNodes(), (currentElement) -> {
+        forEachElement(catElement.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
                 case APPENDER_REF_TAG: {
                     Appender appender = findAppenderByReference(currentElement);
@@ -640,7 +635,7 @@ public class XmlConfiguration extends Log4j1Configuration {
         try {
             Layout layout = LoaderUtil.newInstanceOf(className);
             PropertySetter propSetter = new PropertySetter(layout);
-            forEachElement(layout_element.getChildNodes(), (currentElement) -> {
+            forEachElement(layout_element.getChildNodes(), currentElement -> {
                 String tagName = currentElement.getTagName();
                 if (tagName.equals(PARAM_TAG)) {
                     setParameter(currentElement, propSetter);
@@ -695,14 +690,14 @@ public class XmlConfiguration extends Log4j1Configuration {
                 try {
                     Class<?> clazz = LoaderUtil.loadClass(className);
                     Method toLevelMethod = clazz.getMethod("toLevel", ONE_STRING_PARAM);
-                    Level pri = (Level) toLevelMethod.invoke(null, new Object[]{priStr});
+                    Level pri = (Level) toLevelMethod.invoke(null, priStr);
                     logger.setLevel(OptionConverter.convertLevel(pri));
-                } catch (Exception oops) {
-                    if (oops instanceof InterruptedException || oops instanceof InterruptedIOException) {
+                } catch (Exception e) {
+                    if (e instanceof InterruptedException || e instanceof InterruptedIOException) {
                         Thread.currentThread().interrupt();
                     }
                     LOGGER.error("Could not create level [" + priStr +
-                            "]. Reported error follows.", oops);
+                            "]. Reported error follows.", e);
                     return;
                 }
             }
@@ -765,9 +760,10 @@ public class XmlConfiguration extends Log4j1Configuration {
             addFilter(ThresholdFilter.createFilter(level, Result.NEUTRAL, Result.DENY));
         }
 
-        forEachElement(element.getChildNodes(), (currentElement) -> {
+        forEachElement(element.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
-                case CATEGORY: case LOGGER_ELEMENT:
+                case CATEGORY: 
+                case LOGGER_ELEMENT:
                     parseCategory(currentElement);
                     break;
                 case ROOT_TAG:
@@ -779,7 +775,8 @@ public class XmlConfiguration extends Log4j1Configuration {
                 case THROWABLE_RENDERER_TAG:
                     LOGGER.warn("Log4j 1 throwable renderers are not supported by Log4j 2 and will be ignored.");
                     break;
-                case CATEGORY_FACTORY_TAG: case LOGGER_FACTORY_TAG:
+                case CATEGORY_FACTORY_TAG: 
+                case LOGGER_FACTORY_TAG:
                     LOGGER.warn("Log4j 1 logger factories are not supported by Log4j 2 and will be ignored.");
                     break;
                 case APPENDER_TAG:
@@ -814,14 +811,17 @@ public class XmlConfiguration extends Log4j1Configuration {
     private static class SAXErrorHandler implements org.xml.sax.ErrorHandler {
         private static final org.apache.logging.log4j.Logger LOGGER = StatusLogger.getLogger();
 
+        @Override
         public void error(final SAXParseException ex) {
             emitMessage("Continuable parsing error ", ex);
         }
 
+        @Override
         public void fatalError(final SAXParseException ex) {
             emitMessage("Fatal parsing error ", ex);
         }
 
+        @Override
         public void warning(final SAXParseException ex) {
             emitMessage("Parsing warning ", ex);
         }
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 d7d9021..37b247c 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
@@ -53,8 +53,8 @@ public class Log4j2ListAppenderBuilder extends AbstractBuilder implements Append
     @Override
     public Appender parseAppender(Element element, XmlConfiguration configuration) {
         final String name = getNameAttribute(element);
-        final Holder<Layout> layout = new Holder<>();
-        final Holder<Filter> filter = new Holder<>();
+        final AtomicReference<Layout> layout = new AtomicReference<>();
+        final AtomicReference<Filter> filter = new AtomicReference<>();
         forEachElement(element.getChildNodes(), currentElement -> {
             switch (currentElement.getTagName()) {
                 case LAYOUT_TAG :
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/config/AbstractLog4j1ConfigurationConverterTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/config/AbstractLog4j1ConfigurationConverterTest.java
index 40e8ad8..bee8a50 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/config/AbstractLog4j1ConfigurationConverterTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/config/AbstractLog4j1ConfigurationConverterTest.java
@@ -55,7 +55,6 @@ public abstract class AbstractLog4j1ConfigurationConverterTest {
     private final Path pathIn;
 
     public AbstractLog4j1ConfigurationConverterTest(final Path path) {
-        super();
         this.pathIn = path;
     }
 
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java
index acbd2b9..65b6fac 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java
@@ -85,6 +85,16 @@ public final class Constants {
     }
 
     /**
+     * The empty array.
+     */
+    public static final Object[] EMPTY_OBJECT_ARRAY = {};
+
+    /**
+     * The empty array.
+     */
+    public static final byte[] EMPTY_BYTE_ARRAY = {};
+
+    /**
      * Prevent class instantiation.
      */
     private Constants() {