You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2022/02/20 18:07:03 UTC

[logging-log4j2] branch release-2.x updated: Internal refactoring.

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

ggregory pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new 7254541  Internal refactoring.
7254541 is described below

commit 7254541045be96046cb494e2472f5a11a0b5e228
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Feb 20 13:07:00 2022 -0500

    Internal refactoring.
---
 .../org/apache/log4j/builders/AbstractBuilder.java |  4 +-
 .../java/org/apache/log4j/builders/Builder.java    |  4 +-
 .../org/apache/log4j/builders/BuilderManager.java  | 70 +++++++---------------
 .../{appender/AppenderBuilder.java => Parser.java} | 29 ++++++---
 .../log4j/builders/appender/AppenderBuilder.java   |  4 +-
 .../builders/appender/RewriteAppenderBuilder.java  |  3 +-
 .../builders/filter/DenyAllFilterBuilder.java      |  4 +-
 .../log4j/builders/filter/FilterBuilder.java       | 13 +---
 .../builders/filter/LevelMatchFilterBuilder.java   |  6 +-
 .../builders/filter/LevelRangeFilterBuilder.java   |  6 +-
 .../builders/filter/StringMatchFilterBuilder.java  |  6 +-
 .../log4j/builders/layout/HtmlLayoutBuilder.java   |  6 +-
 .../log4j/builders/layout/LayoutBuilder.java       | 12 +---
 .../builders/layout/PatternLayoutBuilder.java      |  6 +-
 .../log4j/builders/layout/SimpleLayoutBuilder.java |  4 +-
 .../log4j/builders/layout/TTCCLayoutBuilder.java   |  6 +-
 .../log4j/builders/layout/XmlLayoutBuilder.java    |  6 +-
 .../builders/rewrite/RewritePolicyBuilder.java     | 12 +---
 .../log4j/config/PropertiesConfiguration.java      |  4 +-
 19 files changed, 88 insertions(+), 117 deletions(-)

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 4b1ef5b..e2b2d6f 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
@@ -39,8 +39,10 @@ import org.w3c.dom.Element;
 
 /**
  * Base class for Log4j 1 component builders.
+ *
+ * @param <T> The type to build.
  */
-public abstract class AbstractBuilder implements Builder {
+public abstract class AbstractBuilder<T> implements Builder<T> {
 
     private static Logger LOGGER = StatusLogger.getLogger();
     protected static final String FILE_PARAM = "File";
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/Builder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/Builder.java
index 7ff5879..8a9b670 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/Builder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/Builder.java
@@ -19,7 +19,9 @@ package org.apache.log4j.builders;
 
 /**
  * A marker interface for Log4j 1.x component builders.
+ * 
+ * @param <T> The type to build.
  */
-public interface Builder {
+public interface Builder<T> {
     // empty
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
index 60c9e68..9202d92 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
@@ -44,19 +44,23 @@ import org.w3c.dom.Element;
  */
 public class BuilderManager {
 
+    /** Plugin category. */
     public static final String CATEGORY = "Log4j Builder";
+
     private static final Logger LOGGER = StatusLogger.getLogger();
     private static Class<?>[] CONSTRUCTOR_PARAMS = new Class[] {String.class, Properties.class};
     private final Map<String, PluginType<?>> plugins;
 
+    /**
+     * Constructs a new instance.
+     */
     public BuilderManager() {
         final PluginManager manager = new PluginManager(CATEGORY);
         manager.collectPlugins();
         plugins = manager.getPlugins();
     }
 
-    @SuppressWarnings("unchecked")
-    private <T extends Builder> T createBuilder(final PluginType<T> plugin, final String prefix, final Properties props) {
+    private <T extends Builder<U>, U> T createBuilder(final PluginType<T> plugin, final String prefix, final Properties props) {
         if (plugin == null) {
             return null;
         }
@@ -65,13 +69,13 @@ public class BuilderManager {
             if (AbstractBuilder.class.isAssignableFrom(clazz)) {
                 return clazz.getConstructor(CONSTRUCTOR_PARAMS).newInstance(prefix, props);
             }
-            final Object builder = LoaderUtil.newInstanceOf(clazz);
+            final T builder = LoaderUtil.newInstanceOf(clazz);
             // Reasonable message instead of `ClassCastException`
             if (!Builder.class.isAssignableFrom(clazz)) {
                 LOGGER.warn("Unable to load plugin: builder {} does not implement {}", clazz, Builder.class);
                 return null;
             }
-            return (T) builder;
+            return builder;
         } catch (final ReflectiveOperationException ex) {
             LOGGER.warn("Unable to load plugin: {} due to: {}", plugin.getKey(), ex.getMessage());
             return null;
@@ -90,7 +94,7 @@ public class BuilderManager {
         return (PluginType<T>) pluginType;
     }
 
-    private <T extends Builder, U> U newInstance(final PluginType<T> plugin, final Function<T, U> consumer) {
+    private <T extends Builder<U>, U> U newInstance(final PluginType<T> plugin, final Function<T, U> consumer) {
         if (plugin != null) {
             try {
                 final T builder = LoaderUtil.newInstanceOf(plugin.getPluginClass());
@@ -104,61 +108,31 @@ public class BuilderManager {
         return null;
     }
 
-    public Appender parseAppender(final String className, final Element appenderElement, final XmlConfiguration config) {
-        final PluginType<AppenderBuilder> plugin = getPlugin(className);
-        return newInstance(plugin, b -> b.parseAppender(appenderElement, config));
+    public <P extends Parser<T>, T> T parse(final String className, final String prefix, final Properties props, final PropertiesConfiguration config) {
+        final P parser = createBuilder(getPlugin(className), prefix, props);
+        return parser != null ? parser.parse(config) : null;
     }
 
-    public Appender parseAppender(final String name, final String className, final String prefix, final String layoutPrefix, final String filterPrefix, final Properties props,
-        final PropertiesConfiguration config) {
-        final PluginType<AppenderBuilder> plugin = getPlugin(className);
-        final AppenderBuilder builder = createBuilder(plugin, prefix, props);
-        if (builder != null) {
-            return builder.parseAppender(name, prefix, layoutPrefix, filterPrefix, props, config);
-        }
-        return null;
+    public Appender parseAppender(final String className, final Element appenderElement, final XmlConfiguration config) {
+        return newInstance(this.<AppenderBuilder<Appender>>getPlugin(className), b -> b.parseAppender(appenderElement, config));
     }
 
-    public Filter parseFilter(final String className, final Element filterElement, final XmlConfiguration config) {
-        final PluginType<FilterBuilder> plugin = getPlugin(className);
-        return newInstance(plugin, b -> b.parseFilter(filterElement, config));
+    public Appender parseAppender(final String name, final String className, final String prefix, final String layoutPrefix, final String filterPrefix,
+        final Properties props, final PropertiesConfiguration config) {
+        final AppenderBuilder<Appender> builder = createBuilder(getPlugin(className), prefix, props);
+        return builder != null ? builder.parseAppender(name, prefix, layoutPrefix, filterPrefix, props, config) : null;
     }
 
-    public Filter parseFilter(final String className, final String filterPrefix, final Properties props, final PropertiesConfiguration config) {
-        final PluginType<FilterBuilder> plugin = getPlugin(className);
-        final FilterBuilder builder = createBuilder(plugin, filterPrefix, props);
-        if (builder != null) {
-            return builder.parseFilter(config);
-        }
-        return null;
+    public Filter parseFilter(final String className, final Element filterElement, final XmlConfiguration config) {
+        return newInstance(this.<FilterBuilder>getPlugin(className), b -> b.parse(filterElement, config));
     }
 
     public Layout parseLayout(final String className, final Element layoutElement, final XmlConfiguration config) {
-        final PluginType<LayoutBuilder> plugin = getPlugin(className);
-        return newInstance(plugin, b -> b.parseLayout(layoutElement, config));
-    }
-
-    public Layout parseLayout(final String className, final String layoutPrefix, final Properties props, final PropertiesConfiguration config) {
-        final PluginType<LayoutBuilder> plugin = getPlugin(className);
-        final LayoutBuilder builder = createBuilder(plugin, layoutPrefix, props);
-        if (builder != null) {
-            return builder.parseLayout(config);
-        }
-        return null;
+        return newInstance(this.<LayoutBuilder>getPlugin(className), b -> b.parse(layoutElement, config));
     }
 
     public RewritePolicy parseRewritePolicy(final String className, final Element rewriteElement, final XmlConfiguration config) {
-        final PluginType<RewritePolicyBuilder> plugin = getPlugin(className);
-        return newInstance(plugin, b -> b.parseRewritePolicy(rewriteElement, config));
-    }
-
-    public RewritePolicy parseRewritePolicy(final String className, final String policyPrefix, final Properties props, final PropertiesConfiguration config) {
-        final PluginType<RewritePolicyBuilder> plugin = getPlugin(className);
-        final RewritePolicyBuilder builder = createBuilder(plugin, policyPrefix, props);
-        if (builder != null) {
-            return builder.parseRewritePolicy(config);
-        }
-        return null;
+        return newInstance(this.<RewritePolicyBuilder>getPlugin(className), b -> b.parse(rewriteElement, config));
     }
 
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/Parser.java
similarity index 62%
copy from log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AppenderBuilder.java
copy to log4j-1.2-api/src/main/java/org/apache/log4j/builders/Parser.java
index 4dffaf1..01812ef 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/Parser.java
@@ -14,24 +14,35 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.log4j.builders.appender;
 
-import java.util.Properties;
+package org.apache.log4j.builders;
 
-import org.apache.log4j.Appender;
-import org.apache.log4j.builders.Builder;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.xml.XmlConfiguration;
 import org.w3c.dom.Element;
 
 /**
- * Define an Appender Builder.
+ * Parses DOM and properties.
+ *
+ * @param <T> The type to build.
  */
-public interface AppenderBuilder extends Builder {
+public interface Parser<T> extends Builder<T> {
 
-    Appender parseAppender(Element element, XmlConfiguration configuration);
+    /**
+     * Parses a DOM Element.
+     * 
+     * @param element the DOM Element.
+     * @param config the XML configuration.
+     * @return parse result.
+     */
+    T parse(Element element, XmlConfiguration config);
 
-    Appender parseAppender(String name, String appenderPrefix, String layoutPrefix, String filterPrefix,
-            Properties props, PropertiesConfiguration configuration);
+    /**
+     * Parses a PropertiesConfigurationt.
+     * 
+     * @param element the PropertiesConfiguration.
+     * @return parse result.
+     */
+    T parse(PropertiesConfiguration config);
 
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AppenderBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AppenderBuilder.java
index 4dffaf1..aacbc80 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AppenderBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/appender/AppenderBuilder.java
@@ -26,8 +26,10 @@ import org.w3c.dom.Element;
 
 /**
  * Define an Appender Builder.
+ *
+ * @param <T> The type to build.
  */
-public interface AppenderBuilder extends Builder {
+public interface AppenderBuilder<T extends Appender> extends Builder<T> {
 
     Appender parseAppender(Element element, XmlConfiguration configuration);
 
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 28102be..7ceb9ce 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
@@ -106,8 +106,7 @@ public class RewriteAppenderBuilder extends AbstractBuilder implements AppenderB
         final Filter filter = configuration.parseAppenderFilters(props, filterPrefix, name);
         final String policyPrefix = appenderPrefix + ".rewritePolicy";
         final String className = getProperty(policyPrefix);
-        final RewritePolicy policy = configuration.getBuilderManager().parseRewritePolicy(className, policyPrefix,
-                props, configuration);
+        final RewritePolicy policy = configuration.getBuilderManager().parse(className, policyPrefix, props, configuration);
         final String level = getProperty(THRESHOLD_PARAM);
         if (appenderRef == null) {
             LOGGER.warn("No appender references configured for AsyncAppender {}", name);
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/DenyAllFilterBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/DenyAllFilterBuilder.java
index caa119a..20f756a 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/DenyAllFilterBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/DenyAllFilterBuilder.java
@@ -33,12 +33,12 @@ import org.w3c.dom.Element;
 public class DenyAllFilterBuilder implements FilterBuilder {
 
     @Override
-    public Filter parseFilter(Element filterElement, XmlConfiguration config) {
+    public Filter parse(Element filterElement, XmlConfiguration config) {
         return new FilterWrapper(DenyAllFilter.newBuilder().build());
     }
 
     @Override
-    public Filter parseFilter(PropertiesConfiguration config) {
+    public Filter parse(PropertiesConfiguration config) {
         return new FilterWrapper(DenyAllFilter.newBuilder().build());
     }
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/FilterBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/FilterBuilder.java
index e331927..8153bdd 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/FilterBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/filter/FilterBuilder.java
@@ -16,19 +16,12 @@
  */
 package org.apache.log4j.builders.filter;
 
-import org.apache.log4j.builders.Builder;
-import org.apache.log4j.config.PropertiesConfiguration;
+import org.apache.log4j.builders.Parser;
 import org.apache.log4j.spi.Filter;
-import org.apache.log4j.xml.XmlConfiguration;
-import org.w3c.dom.Element;
 
 /**
  * Define a Filter Builder.
  */
-public interface FilterBuilder extends Builder {
-
-    Filter parseFilter(Element element, XmlConfiguration config);
-
-    Filter parseFilter(PropertiesConfiguration config);
-
+public interface FilterBuilder extends Parser<Filter> {
+    // empty
 }
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 49a9c7a..2c5dd92 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
@@ -37,7 +37,7 @@ import org.w3c.dom.Element;
  * Build a Level match failter.
  */
 @Plugin(name = "org.apache.log4j.varia.LevelMatchFilter", category = CATEGORY)
-public class LevelMatchFilterBuilder extends AbstractBuilder implements FilterBuilder {
+public class LevelMatchFilterBuilder extends AbstractBuilder<Filter> implements FilterBuilder {
 
     private static final String LEVEL = "LevelToMatch";
     private static final String ACCEPT_ON_MATCH = "AcceptOnMatch";
@@ -50,7 +50,7 @@ public class LevelMatchFilterBuilder extends AbstractBuilder implements FilterBu
     }
 
     @Override
-    public Filter parseFilter(Element filterElement, XmlConfiguration config) {
+    public Filter parse(Element filterElement, XmlConfiguration config) {
         final AtomicReference<String> level = new AtomicReference<>();
         final AtomicBoolean acceptOnMatch = new AtomicBoolean();
         forEachElement(filterElement.getElementsByTagName("param"), currentElement -> {
@@ -69,7 +69,7 @@ public class LevelMatchFilterBuilder extends AbstractBuilder implements FilterBu
     }
 
     @Override
-    public Filter parseFilter(PropertiesConfiguration config) {
+    public Filter parse(PropertiesConfiguration config) {
         String level = getProperty(LEVEL);
         boolean acceptOnMatch = getBooleanProperty(ACCEPT_ON_MATCH);
         return createFilter(level, acceptOnMatch);
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 7162ecf..a1f3918 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
@@ -37,7 +37,7 @@ import org.w3c.dom.Element;
  * Build a Level match failter.
  */
 @Plugin(name = "org.apache.log4j.varia.LevelRangeFilter", category = CATEGORY)
-public class LevelRangeFilterBuilder extends AbstractBuilder implements FilterBuilder {
+public class LevelRangeFilterBuilder extends AbstractBuilder<Filter> implements FilterBuilder {
 
     private static final String LEVEL_MAX = "LevelMax";
     private static final String LEVEL_MIN = "LevelMin";
@@ -51,7 +51,7 @@ public class LevelRangeFilterBuilder extends AbstractBuilder implements FilterBu
     }
 
     @Override
-    public Filter parseFilter(Element filterElement, XmlConfiguration config) {
+    public Filter parse(Element filterElement, XmlConfiguration config) {
         final AtomicReference<String> levelMax = new AtomicReference<>();
         final AtomicReference<String> levelMin = new AtomicReference<>();
         final AtomicBoolean acceptOnMatch = new AtomicBoolean();
@@ -74,7 +74,7 @@ public class LevelRangeFilterBuilder extends AbstractBuilder implements FilterBu
     }
 
     @Override
-    public Filter parseFilter(PropertiesConfiguration config) {
+    public Filter parse(PropertiesConfiguration config) {
         String levelMax = getProperty(LEVEL_MAX);
         String levelMin = getProperty(LEVEL_MIN);
         boolean acceptOnMatch = getBooleanProperty(ACCEPT_ON_MATCH);
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 00101c0..b7ae6a0 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
@@ -37,14 +37,14 @@ import org.w3c.dom.Element;
  * Build a String match filter.
  */
 @Plugin(name = "org.apache.log4j.varia.StringMatchFilter", category = CATEGORY)
-public class StringMatchFilterBuilder extends AbstractBuilder implements FilterBuilder {
+public class StringMatchFilterBuilder extends AbstractBuilder<Filter> implements FilterBuilder {
 
     private static final Logger LOGGER = StatusLogger.getLogger();
     private static final String STRING_TO_MATCH = "StringToMatch";
     private static final String ACCEPT_ON_MATCH = "AcceptOnMatch";
 
     @Override
-    public Filter parseFilter(Element filterElement, XmlConfiguration config) {
+    public Filter parse(Element filterElement, XmlConfiguration config) {
         final AtomicBoolean acceptOnMatch = new AtomicBoolean();
         final AtomicReference<String> text = new AtomicReference<>();
         forEachElement(filterElement.getElementsByTagName("param"), currentElement -> {
@@ -64,7 +64,7 @@ public class StringMatchFilterBuilder extends AbstractBuilder implements FilterB
     }
 
     @Override
-    public Filter parseFilter(PropertiesConfiguration config) {
+    public Filter parse(PropertiesConfiguration config) {
         String text = getProperty(STRING_TO_MATCH);
         boolean acceptOnMatch = getBooleanProperty(ACCEPT_ON_MATCH);
         return createFilter(text, acceptOnMatch);
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 5d209eb..db08f6f 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
@@ -37,7 +37,7 @@ import org.w3c.dom.Element;
  * Build a Pattern Layout
  */
 @Plugin(name = "org.apache.log4j.HTMLLayout", category = CATEGORY)
-public class HtmlLayoutBuilder extends AbstractBuilder implements LayoutBuilder {
+public class HtmlLayoutBuilder extends AbstractBuilder<Layout> implements LayoutBuilder {
 
     private static final String DEFAULT_TITLE = "Log4J Log Messages";
     private static final String TITLE_PARAM = "Title";
@@ -52,7 +52,7 @@ public class HtmlLayoutBuilder extends AbstractBuilder implements LayoutBuilder
 
 
     @Override
-    public Layout parseLayout(Element layoutElement, XmlConfiguration config) {
+    public Layout parse(Element layoutElement, XmlConfiguration config) {
         final AtomicReference<String> title = new AtomicReference<>("Log4J Log Messages");
         final AtomicBoolean locationInfo = new AtomicBoolean();
         forEachElement(layoutElement.getElementsByTagName("param"), currentElement -> {
@@ -68,7 +68,7 @@ public class HtmlLayoutBuilder extends AbstractBuilder implements LayoutBuilder
     }
 
     @Override
-    public Layout parseLayout(PropertiesConfiguration config) {
+    public Layout parse(PropertiesConfiguration config) {
         String title = getProperty(TITLE_PARAM, DEFAULT_TITLE);
         boolean locationInfo = getBooleanProperty(LOCATION_INFO_PARAM);
         return createLayout(title, locationInfo);
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/LayoutBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/LayoutBuilder.java
index 0a3ecb2..72c1763 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/LayoutBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/LayoutBuilder.java
@@ -17,17 +17,11 @@
 package org.apache.log4j.builders.layout;
 
 import org.apache.log4j.Layout;
-import org.apache.log4j.builders.Builder;
-import org.apache.log4j.config.PropertiesConfiguration;
-import org.apache.log4j.xml.XmlConfiguration;
-import org.w3c.dom.Element;
+import org.apache.log4j.builders.Parser;
 
 /**
  * Define a Layout Builder.
  */
-public interface LayoutBuilder extends Builder {
-
-    Layout parseLayout(Element element, XmlConfiguration config);
-
-    Layout parseLayout(PropertiesConfiguration config);
+public interface LayoutBuilder extends Parser<Layout> {
+    // empty
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/PatternLayoutBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/PatternLayoutBuilder.java
index f43cc65..3bf241e 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/PatternLayoutBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/PatternLayoutBuilder.java
@@ -41,7 +41,7 @@ import org.w3c.dom.NodeList;
  */
 @Plugin(name = "org.apache.log4j.PatternLayout", category = CATEGORY)
 @PluginAliases("org.apache.log4j.EnhancedPatternLayout")
-public class PatternLayoutBuilder extends AbstractBuilder implements LayoutBuilder {
+public class PatternLayoutBuilder extends AbstractBuilder<Layout> implements LayoutBuilder {
 
     private static final Logger LOGGER = StatusLogger.getLogger();
     private static final String PATTERN = "ConversionPattern";
@@ -54,7 +54,7 @@ public class PatternLayoutBuilder extends AbstractBuilder implements LayoutBuild
     }
 
     @Override
-    public Layout parseLayout(final Element layoutElement, final XmlConfiguration config) {
+    public Layout parse(final Element layoutElement, final XmlConfiguration config) {
         NodeList params = layoutElement.getElementsByTagName("param");
         final int length = params.getLength();
         String pattern = null;
@@ -74,7 +74,7 @@ public class PatternLayoutBuilder extends AbstractBuilder implements LayoutBuild
     }
 
     @Override
-    public Layout parseLayout(final PropertiesConfiguration config) {
+    public Layout parse(final PropertiesConfiguration config) {
         String pattern = getProperty(PATTERN);
         return createLayout(pattern, config);
     }
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 5d8ba52..5119ce8 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
@@ -33,7 +33,7 @@ import org.w3c.dom.Element;
 public class SimpleLayoutBuilder implements LayoutBuilder {
 
     @Override
-    public Layout parseLayout(Element layoutElement, XmlConfiguration config) {
+    public Layout parse(Element layoutElement, XmlConfiguration config) {
         return new LayoutWrapper(PatternLayout.newBuilder()
                 .withPattern("%level - %m%n")
                 .withConfiguration(config)
@@ -41,7 +41,7 @@ public class SimpleLayoutBuilder implements LayoutBuilder {
     }
 
     @Override
-    public Layout parseLayout(PropertiesConfiguration config) {
+    public Layout parse(PropertiesConfiguration config) {
         return new LayoutWrapper(PatternLayout.newBuilder()
                 .withPattern("%level - %m%n")
                 .withConfiguration(config)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java
index e6f9718..cc78781 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/TTCCLayoutBuilder.java
@@ -38,7 +38,7 @@ import org.w3c.dom.Element;
  * Build a Pattern Layout
  */
 @Plugin(name = "org.apache.log4j.TTCCLayout", category = CATEGORY)
-public class TTCCLayoutBuilder extends AbstractBuilder implements LayoutBuilder {
+public class TTCCLayoutBuilder extends AbstractBuilder<Layout> implements LayoutBuilder {
 
     private static final String THREAD_PRINTING_PARAM = "ThreadPrinting";
     private static final String CATEGORY_PREFIXING_PARAM = "CategoryPrefixing";
@@ -54,7 +54,7 @@ public class TTCCLayoutBuilder extends AbstractBuilder implements LayoutBuilder
     }
 
     @Override
-    public Layout parseLayout(Element layoutElement, XmlConfiguration config) {
+    public Layout parse(Element layoutElement, XmlConfiguration config) {
         final AtomicBoolean threadPrinting = new AtomicBoolean(Boolean.TRUE);
         final AtomicBoolean categoryPrefixing = new AtomicBoolean(Boolean.TRUE);
         final AtomicBoolean contextPrinting = new AtomicBoolean(Boolean.TRUE);
@@ -86,7 +86,7 @@ public class TTCCLayoutBuilder extends AbstractBuilder implements LayoutBuilder
     }
 
     @Override
-    public Layout parseLayout(PropertiesConfiguration config) {
+    public Layout parse(PropertiesConfiguration config) {
         boolean threadPrinting = getBooleanProperty(THREAD_PRINTING_PARAM, true);
         boolean categoryPrefixing = getBooleanProperty(CATEGORY_PREFIXING_PARAM, true);
         boolean contextPrinting = getBooleanProperty(CONTEXT_PRINTING_PARAM, true);
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java
index 7b321c4..81a9c2e 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java
@@ -36,7 +36,7 @@ import org.w3c.dom.Element;
  * Build an XML Layout
  */
 @Plugin(name = "org.apache.log4j.xml.XMLLayout", category = CATEGORY)
-public class XmlLayoutBuilder extends AbstractBuilder implements LayoutBuilder {
+public class XmlLayoutBuilder extends AbstractBuilder<Layout> implements LayoutBuilder {
 
     private static final String LOCATION_INFO = "LocationInfo";
     private static final String PROPERTIES = "Properties";
@@ -50,7 +50,7 @@ public class XmlLayoutBuilder extends AbstractBuilder implements LayoutBuilder {
 
 
     @Override
-    public Layout parseLayout(Element layoutElement, XmlConfiguration config) {
+    public Layout parse(Element layoutElement, XmlConfiguration config) {
         final AtomicBoolean properties = new AtomicBoolean();
         final AtomicBoolean locationInfo = new AtomicBoolean();
         forEachElement(layoutElement.getElementsByTagName(PARAM_TAG), currentElement -> {
@@ -64,7 +64,7 @@ public class XmlLayoutBuilder extends AbstractBuilder implements LayoutBuilder {
     }
 
     @Override
-    public Layout parseLayout(PropertiesConfiguration config) {
+    public Layout parse(PropertiesConfiguration config) {
         boolean properties = getBooleanProperty(PROPERTIES);
         boolean locationInfo = getBooleanProperty(LOCATION_INFO);
         return createLayout(properties, locationInfo);
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/rewrite/RewritePolicyBuilder.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/rewrite/RewritePolicyBuilder.java
index 94500ae..e83d033 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/rewrite/RewritePolicyBuilder.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/rewrite/RewritePolicyBuilder.java
@@ -16,18 +16,12 @@
  */
 package org.apache.log4j.builders.rewrite;
 
-import org.apache.log4j.builders.Builder;
-import org.apache.log4j.config.PropertiesConfiguration;
+import org.apache.log4j.builders.Parser;
 import org.apache.log4j.rewrite.RewritePolicy;
-import org.apache.log4j.xml.XmlConfiguration;
-import org.w3c.dom.Element;
 
 /**
  * Define a RewritePolicy Builder.
  */
-public interface RewritePolicyBuilder extends Builder {
-
-    RewritePolicy parseRewritePolicy(Element element, XmlConfiguration config);
-
-    RewritePolicy parseRewritePolicy(PropertiesConfiguration config);
+public interface RewritePolicyBuilder extends Parser<RewritePolicy> {
+    // empty
 }
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
index 06b8854..0a0cb45 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
@@ -484,7 +484,7 @@ public class PropertiesConfiguration extends Log4j1Configuration {
         if (layoutClass == null) {
             return null;
         }
-        Layout layout = manager.parseLayout(layoutClass, layoutPrefix, props, this);
+        Layout layout = manager.parse(layoutClass, layoutPrefix, props, this);
         if (layout == null) {
             layout = buildLayout(layoutPrefix, layoutClass, appenderName, props);
         }
@@ -560,7 +560,7 @@ public class PropertiesConfiguration extends Log4j1Configuration {
             final String clazz = props.getProperty(entry.getKey());
             Filter filter = null;
             if (clazz != null) {
-                filter = manager.parseFilter(clazz, entry.getKey(), props, this);
+                filter = manager.parse(clazz, entry.getKey(), props, this);
                 if (filter == null) {
                     LOGGER.debug("Filter key: [{}] class: [{}] props: {}", entry.getKey(), clazz, entry.getValue());
                     filter = buildFilter(clazz, appenderName, entry.getValue());