You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2016/03/06 21:01:22 UTC

[1/2] logging-log4j2 git commit: Extract config parsing from factory class.

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 73e19c6b1 -> 60922b3e6


Extract config parsing from factory class.

Other config factory classes are really simple, so this one should be, too. Also reduces code duplication.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/722aa88b
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/722aa88b
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/722aa88b

Branch: refs/heads/master
Commit: 722aa88b62ef1ca26b44236e6e1f900340811655
Parents: 73e19c6
Author: Matt Sicker <bo...@gmail.com>
Authored: Sun Mar 6 13:11:26 2016 -0600
Committer: Matt Sicker <bo...@gmail.com>
Committed: Sun Mar 6 13:11:26 2016 -0600

----------------------------------------------------------------------
 .../PropertiesConfigurationBuilder.java         | 376 ++++++++++++++++++
 .../PropertiesConfigurationFactory.java         | 378 +------------------
 2 files changed, 383 insertions(+), 371 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/722aa88b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
new file mode 100644
index 0000000..589971a
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
@@ -0,0 +1,376 @@
+/*
+ * 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.logging.log4j.core.config.properties;
+
+import java.util.Properties;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.config.ConfigurationException;
+import org.apache.logging.log4j.core.config.LoggerConfig;
+import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.AppenderRefComponentBuilder;
+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.FilterableComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.LayoutComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.LoggableComponentBuilder;
+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.api.ScriptComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.ScriptFileComponentBuilder;
+import org.apache.logging.log4j.core.util.Builder;
+import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.Strings;
+
+/**
+ * Helper builder for parsing properties files into a PropertiesConfiguration.
+ *
+ * @since 2.6
+ */
+public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
+    implements Builder<PropertiesConfiguration> {
+
+    private static final String ADVERTISER_KEY = "advertiser";
+    private static final String STATUS_KEY = "status";
+    private static final String SHUTDOWN_HOOK = "shutdownHook";
+    private static final String VERBOSE = "verbose";
+    private static final String PACKAGES = "packages";
+    private static final String CONFIG_NAME = "name";
+    private static final String MONITOR_INTERVAL = "monitorInterval";
+    private static final String CONFIG_TYPE = "type";
+
+    private final ConfigurationBuilder<PropertiesConfiguration> builder;
+    private Properties rootProperties;
+
+    public PropertiesConfigurationBuilder() {
+        this.builder = newConfigurationBuilder(PropertiesConfiguration.class);
+    }
+
+    public PropertiesConfigurationBuilder setRootProperties(final Properties rootProperties) {
+        this.rootProperties = rootProperties;
+        return this;
+    }
+
+    @Override
+    public PropertiesConfiguration build() {
+        String value = rootProperties.getProperty(STATUS_KEY);
+        if (value != null) {
+            builder.setStatusLevel(Level.toLevel(value, Level.ERROR));
+        } else {
+            builder.setStatusLevel(Level.ERROR);
+        }
+        value = rootProperties.getProperty(SHUTDOWN_HOOK);
+        if (value != null) {
+            builder.setShutdownHook(value);
+        }
+        value = rootProperties.getProperty(VERBOSE);
+        if (value != null) {
+            builder.setVerbosity(value);
+        }
+        value = rootProperties.getProperty(PACKAGES);
+        if (value != null) {
+            builder.setPackages(value);
+        }
+        value = rootProperties.getProperty(CONFIG_NAME);
+        if (value != null) {
+            builder.setConfigurationName(value);
+        }
+        value = rootProperties.getProperty(MONITOR_INTERVAL);
+        if (value != null) {
+            builder.setMonitorInterval(value);
+        }
+        value = rootProperties.getProperty(ADVERTISER_KEY);
+        if (value != null) {
+            builder.setAdvertiser(value);
+        }
+        Properties props = PropertiesUtil.extractSubset(rootProperties, "property");
+        for (String key : props.stringPropertyNames()) {
+            builder.addProperty(key, props.getProperty(key));
+        }
+
+        String scriptProp = rootProperties.getProperty("scripts");
+        if (scriptProp != null) {
+            String[] scriptNames = scriptProp.split(",");
+            for (String scriptName : scriptNames) {
+                String name = scriptName.trim();
+                Properties scriptProps = PropertiesUtil.extractSubset(rootProperties, "script." + name);
+                String type = scriptProps.getProperty("type");
+                if (type == null) {
+                    throw new ConfigurationException("No type provided for script - must be Script or ScriptFile");
+                }
+                scriptProps.remove("type");
+                if (type.equalsIgnoreCase("script")) {
+                    builder.add(createScript(scriptProps));
+                } else {
+                    builder.add(createScriptFile(scriptProps));
+                }
+            }
+        }
+
+        Properties levelProps = PropertiesUtil.extractSubset(rootProperties, "customLevel");
+        if (levelProps.size() > 0) {
+            for (String key : levelProps.stringPropertyNames()) {
+                builder.add(builder.newCustomLevel(key, Integer.parseInt(props.getProperty(key))));
+            }
+        }
+
+        String filterProp = rootProperties.getProperty("filters");
+        if (filterProp != null) {
+            String[] filterNames = filterProp.split(",");
+            for (String filterName : filterNames) {
+                String name = filterName.trim();
+                builder.add(createFilter(name, PropertiesUtil.extractSubset(rootProperties, "filter." + name)));
+            }
+        }
+        String appenderProp = rootProperties.getProperty("appenders");
+        if (appenderProp != null) {
+            String[] appenderNames = appenderProp.split(",");
+            for (String appenderName : appenderNames) {
+                String name = appenderName.trim();
+                builder.add(createAppender(name, PropertiesUtil.extractSubset(rootProperties, "appender." + name)));
+            }
+        }
+        String loggerProp = rootProperties.getProperty("loggers");
+        if (loggerProp != null) {
+            String[] loggerNames = loggerProp.split(",");
+            for (String loggerName : loggerNames) {
+                String name = loggerName.trim();
+                if (!name.equals(LoggerConfig.ROOT)) {
+                    builder.add(createLogger(name, PropertiesUtil.extractSubset(rootProperties, "logger." + name)));
+                }
+            }
+        }
+
+        props = PropertiesUtil.extractSubset(rootProperties, "rootLogger");
+        if (props.size() > 0) {
+            builder.add(createRootLogger(props));
+        }
+
+
+        return builder.build();
+    }
+
+    private ScriptComponentBuilder createScript(final Properties properties) {
+        String name = properties.getProperty("name");
+        if (name != null) {
+            properties.remove("name");
+        }
+        String language = properties.getProperty("language");
+        if (language != null) {
+            properties.remove("language");
+        }
+        String text = properties.getProperty("text");
+        if (text != null) {
+            properties.remove("text");
+        }
+        ScriptComponentBuilder scriptBuilder = builder.newScript(name, language, text);
+        return processRemainingProperties(scriptBuilder, properties);
+    }
+
+
+    private ScriptFileComponentBuilder createScriptFile(final Properties properties) {
+        String name = properties.getProperty("name");
+        if (name != null) {
+            properties.remove("name");
+        }
+        String path = properties.getProperty("path");
+        if (path != null) {
+            properties.remove("path");
+        }
+        ScriptFileComponentBuilder scriptFileBuilder = builder.newScriptFile(name, path);
+        return processRemainingProperties(scriptFileBuilder, properties);
+    }
+
+    private AppenderComponentBuilder createAppender(final String key, final Properties properties) {
+        String name = properties.getProperty(CONFIG_NAME);
+        if (Strings.isEmpty(name)) {
+            throw new ConfigurationException("No name attribute provided for Appender " + key);
+        }
+        properties.remove(CONFIG_NAME);
+        String type = properties.getProperty(CONFIG_TYPE);
+        if (Strings.isEmpty(type)) {
+            throw new ConfigurationException("No type attribute provided for Appender " + key);
+        }
+        properties.remove(CONFIG_TYPE);
+        AppenderComponentBuilder appenderBuilder = builder.newAppender(name, type);
+        addFiltersToComponent(appenderBuilder, properties);
+        Properties layoutProps = PropertiesUtil.extractSubset(properties, "layout");
+        if (layoutProps.size() > 0) {
+            appenderBuilder.add(createLayout(name, layoutProps));
+        }
+
+        return processRemainingProperties(appenderBuilder, properties);
+    }
+
+    private FilterComponentBuilder createFilter(final String key, final Properties properties) {
+        String type = properties.getProperty(CONFIG_TYPE);
+        if (Strings.isEmpty(type)) {
+            throw new ConfigurationException("No type attribute provided for Appender " + key);
+        }
+        properties.remove(CONFIG_TYPE);
+        String onMatch = properties.getProperty("onMatch");
+        if (onMatch != null) {
+            properties.remove("onMatch");
+        }
+        String onMisMatch = properties.getProperty("onMisMatch");
+        if (onMisMatch != null) {
+            properties.remove("onMisMatch");
+        }
+        FilterComponentBuilder filterBuilder = builder.newFilter(type, onMatch, onMisMatch);
+        return processRemainingProperties(filterBuilder, properties);
+    }
+
+    private AppenderRefComponentBuilder createAppenderRef(final String key, final Properties properties) {
+        String ref = properties.getProperty("ref");
+        if (Strings.isEmpty(ref)) {
+            throw new ConfigurationException("No ref attribute provided for AppenderRef " + key);
+        }
+        properties.remove("ref");
+        AppenderRefComponentBuilder appenderRefBuilder = builder.newAppenderRef(ref);
+        String level = properties.getProperty("level");
+        if (!Strings.isEmpty(level)) {
+            appenderRefBuilder.addAttribute("level", level);
+        }
+        return addFiltersToComponent(appenderRefBuilder, properties);
+    }
+
+    private LoggerComponentBuilder createLogger(final String key, final Properties properties) {
+        String name = properties.getProperty(CONFIG_NAME);
+        if (Strings.isEmpty(name)) {
+            throw new ConfigurationException("No name attribute provided for Logger " + key);
+        }
+        properties.remove(CONFIG_NAME);
+        String level = properties.getProperty("level");
+        if (level != null) {
+            properties.remove("level");
+        }
+        LoggerComponentBuilder loggerBuilder;
+        String type = properties.getProperty(CONFIG_TYPE);
+        if (type != null) {
+            if (type.equalsIgnoreCase("asyncLogger")) {
+                loggerBuilder = builder.newAsyncLogger(name, level);
+            } else {
+                throw new ConfigurationException("Unknown Logger type " + type + " for Logger " + name);
+            }
+        } else {
+            loggerBuilder = builder.newLogger(name, level);
+        }
+        addLoggersToComponent(loggerBuilder, properties);
+        addFiltersToComponent(loggerBuilder, properties);
+        String additivity = properties.getProperty("additivity");
+        if (!Strings.isEmpty(additivity)) {
+            loggerBuilder.addAttribute("additivity", additivity);
+        }
+        return loggerBuilder;
+    }
+
+    private RootLoggerComponentBuilder createRootLogger(final Properties properties) {
+        String level = properties.getProperty("level");
+        if (level != null) {
+            properties.remove("level");
+        }
+        RootLoggerComponentBuilder loggerBuilder;
+        String type = properties.getProperty(CONFIG_TYPE);
+        if (type != null) {
+            if (type.equalsIgnoreCase("asyncRoot")) {
+                loggerBuilder = builder.newAsyncRootLogger(level);
+            } else {
+                throw new ConfigurationException("Unknown Logger type for root logger" + type);
+            }
+        } else {
+            loggerBuilder = builder.newRootLogger(level);
+        }
+        addLoggersToComponent(loggerBuilder, properties);
+        return addFiltersToComponent(loggerBuilder, properties);
+    }
+
+    private LayoutComponentBuilder createLayout(final String appenderName, final Properties properties) {
+        String type = properties.getProperty(CONFIG_TYPE);
+        if (Strings.isEmpty(type)) {
+            throw new ConfigurationException("No type attribute provided for Layout on Appender " + appenderName);
+        }
+        properties.remove(CONFIG_TYPE);
+        LayoutComponentBuilder layoutBuilder = builder.newLayout(type);
+        return processRemainingProperties(layoutBuilder, properties);
+    }
+
+    private static <B extends ComponentBuilder<B>> ComponentBuilder<B> createComponent(final ComponentBuilder<?> parent,
+                                                                                       final String key,
+                                                                                       final Properties properties) {
+        String name = properties.getProperty(CONFIG_NAME);
+        if (name != null) {
+            properties.remove(CONFIG_NAME);
+        }
+        String type = properties.getProperty(CONFIG_TYPE);
+        if (Strings.isEmpty(type)) {
+            throw new ConfigurationException("No type attribute provided for component " + key);
+        }
+        properties.remove(CONFIG_TYPE);
+        ComponentBuilder<B> componentBuilder = parent.getBuilder().newComponent(name, type);
+        return processRemainingProperties(componentBuilder, properties);
+    }
+
+    private static <B extends ComponentBuilder<?>> B processRemainingProperties(final B builder,
+                                                                                final Properties properties) {
+        while (properties.size() > 0) {
+            String propertyName = properties.stringPropertyNames().iterator().next();
+            int index = propertyName.indexOf('.');
+            if (index > 0) {
+                String prefix = propertyName.substring(0, index);
+                Properties componentProperties = PropertiesUtil.extractSubset(properties, prefix);
+                builder.addComponent(createComponent(builder, prefix, componentProperties));
+            } else {
+                builder.addAttribute(propertyName, properties.getProperty(propertyName));
+                properties.remove(propertyName);
+            }
+        }
+        return builder;
+    }
+
+    private <B extends FilterableComponentBuilder<? extends ComponentBuilder<?>>> B addFiltersToComponent(
+        final B componentBuilder, final Properties properties) {
+        final String filters = properties.getProperty("filters");
+        if (filters != null) {
+            properties.remove("filters");
+            final String[] filterNames = filters.split(",");
+            for (final String name : filterNames) {
+                final String filterName = name.trim();
+                final Properties filterProps = PropertiesUtil.extractSubset(properties, "filter." + filterName);
+                componentBuilder.add(createFilter(filterName, filterProps));
+            }
+        }
+        return componentBuilder;
+    }
+
+    private <B extends LoggableComponentBuilder<? extends ComponentBuilder<?>>> B addLoggersToComponent(
+        final B loggerBuilder, final Properties properties) {
+        final String appenderRefs = properties.getProperty("appenderRefs");
+        if (appenderRefs != null) {
+            properties.remove("appenderRefs");
+            final String[] refNames = appenderRefs.split(",");
+            for (final String refName : refNames) {
+                final String appenderRef = refName.trim();
+                final Properties refProps = PropertiesUtil.extractSubset(properties, "appenderRef." + appenderRef);
+                loggerBuilder.add(createAppenderRef(appenderRef, refProps));
+            }
+        }
+        return loggerBuilder;
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/722aa88b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationFactory.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationFactory.java
index 6be8683..5742d7b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationFactory.java
@@ -16,29 +16,15 @@
  */
 package org.apache.logging.log4j.core.config.properties;
 
-import org.apache.logging.log4j.Level;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
 import org.apache.logging.log4j.core.config.ConfigurationException;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
 import org.apache.logging.log4j.core.config.ConfigurationSource;
-import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.config.Order;
-import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
-import org.apache.logging.log4j.core.config.builder.api.AppenderRefComponentBuilder;
-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.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.api.ScriptComponentBuilder;
-import org.apache.logging.log4j.core.config.builder.api.ScriptFileComponentBuilder;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.util.PropertiesUtil;
-import org.apache.logging.log4j.util.Strings;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
 
 /**
  * Creates a PropertiesConfiguration from a properties file.
@@ -48,14 +34,6 @@ import java.util.Properties;
 @Plugin(name = "PropertiesConfigurationFactory", category = ConfigurationFactory.CATEGORY)
 @Order(8)
 public class PropertiesConfigurationFactory extends ConfigurationFactory {
-    private static final String ADVERTISER_KEY = "advertiser";
-    private static final String STATUS_KEY = "status";
-    private static final String SHUTDOWN_HOOK = "shutdownHook";
-    private static final String VERBOSE = "verbose";
-    private static final String PACKAGES = "packages";
-    private static final String CONFIG_NAME = "name";
-    private static final String MONITOR_INTERVAL = "monitorInterval";
-    private static final String CONFIG_TYPE = "type";
 
     @Override
     protected String[] getSupportedTypes() {
@@ -63,356 +41,14 @@ public class PropertiesConfigurationFactory extends ConfigurationFactory {
     }
 
     @Override
-    public PropertiesConfiguration getConfiguration(ConfigurationSource source) {
+    public PropertiesConfiguration getConfiguration(final ConfigurationSource source) {
         final InputStream configStream = source.getInputStream();
-        Properties properties = new Properties();
+        final Properties properties = new Properties();
         try {
             properties.load(configStream);
         } catch (IOException ioe) {
             throw new ConfigurationException("Unable to load " + source.toString(), ioe);
         }
-        ConfigurationBuilder<PropertiesConfiguration> builder = newConfigurationBuilder(PropertiesConfiguration.class);
-        String value = properties.getProperty(STATUS_KEY);
-        if (value != null) {
-            builder.setStatusLevel(Level.toLevel(value, Level.ERROR));
-        } else {
-            builder.setStatusLevel(Level.ERROR);
-        }
-        value = properties.getProperty(SHUTDOWN_HOOK);
-        if (value != null) {
-            builder.setShutdownHook(value);
-        }
-        value = properties.getProperty(VERBOSE);
-        if (value != null) {
-            builder.setVerbosity(value);
-        }
-        value = properties.getProperty(PACKAGES);
-        if (value != null) {
-            builder.setPackages(value);
-        }
-        value = properties.getProperty(CONFIG_NAME);
-        if (value != null) {
-            builder.setConfigurationName(value);
-        }
-        value = properties.getProperty(MONITOR_INTERVAL);
-        if (value != null) {
-            builder.setMonitorInterval(value);
-        }
-        value = properties.getProperty(ADVERTISER_KEY);
-        if (value != null) {
-            builder.setAdvertiser(value);
-        }
-        Properties props = PropertiesUtil.extractSubset(properties, "property");
-        for (String key : props.stringPropertyNames()) {
-            builder.addProperty(key, props.getProperty(key));
-        }
-
-        String scriptProp = properties.getProperty("scripts");
-        if (scriptProp != null) {
-            String[] scriptNames = scriptProp.split(",");
-            for (String scriptName : scriptNames) {
-                String name = scriptName.trim();
-                Properties scriptProps = PropertiesUtil.extractSubset(properties, "script." + name);
-                String type = scriptProps.getProperty("type");
-                if (type == null) {
-                    throw new ConfigurationException("No type provided for script - must be Script or ScriptFile");
-                }
-                scriptProps.remove("type");
-                if (type.equalsIgnoreCase("script")) {
-                    builder.add(createScript(builder, name, scriptProps));
-                } else {
-                    builder.add(createScriptFile(builder, name, scriptProps));
-                }
-            }
-        }
-
-        Properties levelProps = PropertiesUtil.extractSubset(properties, "customLevel");
-        if (levelProps.size() > 0) {
-            for (String key : levelProps.stringPropertyNames()) {
-                builder.add(builder.newCustomLevel(key, Integer.parseInt(props.getProperty(key))));
-            }
-        }
-
-        String filterProp = properties.getProperty("filters");
-        if (filterProp != null) {
-            String[] filterNames = filterProp.split(",");
-            for (String filterName : filterNames) {
-                String name = filterName.trim();
-                builder.add(createFilter(builder, name, PropertiesUtil.extractSubset(properties, "filter." + name)));
-            }
-        }
-        String appenderProp = properties.getProperty("appenders");
-        if (appenderProp != null) {
-            String[] appenderNames = appenderProp.split(",");
-            for (String appenderName : appenderNames) {
-                String name = appenderName.trim();
-                builder.add(createAppender(builder, name, PropertiesUtil.extractSubset(properties, "appender." +
-                        name)));
-            }
-        }
-        String loggerProp = properties.getProperty("loggers");
-        if (loggerProp != null) {
-            String[] loggerNames = loggerProp.split(",");
-            for (String loggerName : loggerNames) {
-                String name = loggerName.trim();
-                if (!name.equals(LoggerConfig.ROOT)) {
-                    builder.add(createLogger(builder, name, PropertiesUtil.extractSubset(properties, "logger." +
-                            name)));
-                }
-            }
-        }
-
-        props = PropertiesUtil.extractSubset(properties, "rootLogger");
-        if (props.size() > 0) {
-            builder.add(createRootLogger(builder, props));
-        }
-
-        return builder.build();
-    }
-
-
-    private ScriptComponentBuilder createScript(ConfigurationBuilder<PropertiesConfiguration> builder, String key,
-                                                Properties properties) {
-        String name = properties.getProperty("name");
-        if (name != null) {
-            properties.remove("name");
-        }
-        String language = properties.getProperty("language");
-        if (language!= null) {
-            properties.remove("language");
-        }
-        String text = properties.getProperty("text");
-        if (text != null) {
-            properties.remove("text");
-        }
-        ScriptComponentBuilder scriptBuilder = builder.newScript(name, language, text);
-        processRemainingProperties(scriptBuilder, key, properties);
-        return scriptBuilder;
-    }
-
-    private ScriptFileComponentBuilder createScriptFile(ConfigurationBuilder<PropertiesConfiguration> builder, String key,
-                                                Properties properties) {
-        String name = properties.getProperty("name");
-        if (name != null) {
-            properties.remove("name");
-        }
-        String path = properties.getProperty("path");
-        if (path != null) {
-            properties.remove("path");
-        }
-        ScriptFileComponentBuilder scriptFileBuilder = builder.newScriptFile(name, path);
-        processRemainingProperties(scriptFileBuilder, key, properties);
-        return scriptFileBuilder;
-    }
-
-
-    private AppenderComponentBuilder createAppender(ConfigurationBuilder<PropertiesConfiguration> builder, String key,
-            Properties properties) {
-        String name = properties.getProperty(CONFIG_NAME);
-        if (Strings.isEmpty(name)) {
-            throw new ConfigurationException("No name attribute provided for Appender " + key);
-        }
-        properties.remove(CONFIG_NAME);
-        String type = properties.getProperty(CONFIG_TYPE);
-        if (Strings.isEmpty(type)) {
-            throw new ConfigurationException("No type attribute provided for Appender " + key);
-        }
-        properties.remove(CONFIG_TYPE);
-        AppenderComponentBuilder appenderBuilder = builder.newAppender(name, type);
-        String filters = properties.getProperty("filters");
-        if (filters != null) {
-            properties.remove("filters");
-            String[] filterNames = filters.split(",");
-            for (String filterName : filterNames) {
-                filterName = filterName.trim();
-                Properties filterProps = PropertiesUtil.extractSubset(properties, "filter." + filterName);
-                appenderBuilder.add(createFilter(builder, filterName, filterProps));
-            }
-        }
-        Properties layoutProps = PropertiesUtil.extractSubset(properties, "layout");
-        if (layoutProps.size() > 0) {
-            appenderBuilder.add(createLayout(builder, name, layoutProps));
-        }
-
-        processRemainingProperties(appenderBuilder, name, properties);
-        return appenderBuilder;
-    }
-
-    private FilterComponentBuilder createFilter(ConfigurationBuilder<PropertiesConfiguration> builder, String key,
-            Properties properties) {
-        String type = properties.getProperty(CONFIG_TYPE);
-        if (Strings.isEmpty(type)) {
-            throw new ConfigurationException("No type attribute provided for Appender " + key);
-        }
-        properties.remove(CONFIG_TYPE);
-        String onMatch = properties.getProperty("onMatch");
-        if (onMatch != null) {
-            properties.remove("onMatch");
-        }
-        String onMisMatch = properties.getProperty("onMisMatch");
-        if (onMisMatch != null) {
-            properties.remove("onMisMatch");
-        }
-        FilterComponentBuilder filterBuilder = builder.newFilter(type, onMatch, onMisMatch);
-        processRemainingProperties(filterBuilder, key, properties);
-        return filterBuilder;
-    }
-
-    private AppenderRefComponentBuilder createAppenderRef(ConfigurationBuilder<PropertiesConfiguration> builder,
-            String key, Properties properties) {
-        String ref = properties.getProperty("ref");
-        if (Strings.isEmpty(ref)) {
-            throw new ConfigurationException("No ref attribute provided for AppenderRef " + key);
-        }
-        properties.remove("ref");
-        AppenderRefComponentBuilder appenderRefBuilder = builder.newAppenderRef(ref);
-        String level = properties.getProperty("level");
-        if (!Strings.isEmpty(level)) {
-            appenderRefBuilder.addAttribute("level", level);
-        }
-        String filters = properties.getProperty("filters");
-        if (filters != null) {
-            properties.remove("filters");
-            String[] filterNames = filters.split(",");
-            for (String filterName : filterNames) {
-                filterName = filterName.trim();
-                Properties filterProps = PropertiesUtil.extractSubset(properties, "filter." + filterName);
-                appenderRefBuilder.add(createFilter(builder, filterName, filterProps));
-            }
-        }
-        return appenderRefBuilder;
-    }
-
-    private LoggerComponentBuilder createLogger(ConfigurationBuilder<PropertiesConfiguration> builder, String key,
-            Properties properties) {
-        String name = properties.getProperty(CONFIG_NAME);
-        if (Strings.isEmpty(name)) {
-            throw new ConfigurationException("No name attribute provided for Logger " + key);
-        }
-        properties.remove(CONFIG_NAME);
-        String level = properties.getProperty("level");
-        if (level != null) {
-            properties.remove("level");
-        }
-        LoggerComponentBuilder loggerBuilder;
-        String type = properties.getProperty(CONFIG_TYPE);
-        if (type != null) {
-            if (type.equalsIgnoreCase("asyncLogger")) {
-                loggerBuilder = builder.newAsyncLogger(name, level);
-            } else {
-                throw new ConfigurationException("Unknown Logger type " + type + " for Logger " + name);
-            }
-        } else {
-            loggerBuilder = builder.newLogger(name, level);
-        }
-        String appenderRefs = properties.getProperty("appenderRefs");
-        if (appenderRefs != null) {
-            properties.remove("appenderRefs");
-            String[] refNames = appenderRefs.split(",");
-            for (String appenderRef : refNames) {
-                appenderRef = appenderRef.trim();
-                Properties refProps = PropertiesUtil.extractSubset(properties, "appenderRef." + appenderRef);
-                loggerBuilder.add(createAppenderRef(builder, appenderRef, refProps));
-            }
-        }
-        String filters = properties.getProperty("filters");
-        if (filters != null) {
-            properties.remove("filters");
-            String[] filterNames = filters.split(",");
-            for (String filterName : filterNames) {
-                filterName = filterName.trim();
-                Properties filterProps = PropertiesUtil.extractSubset(properties, "filter." + filterName);
-                loggerBuilder.add(createFilter(builder, filterName, filterProps));
-            }
-        }
-        String additivity = properties.getProperty("additivity");
-        if (!Strings.isEmpty(additivity)) {
-            loggerBuilder.addAttribute("additivity", additivity);
-        }
-        return loggerBuilder;
-    }
-
-    private RootLoggerComponentBuilder createRootLogger(ConfigurationBuilder<PropertiesConfiguration> builder,
-            Properties properties) {
-        String level = properties.getProperty("level");
-        if (level != null) {
-            properties.remove("level");
-        }
-        RootLoggerComponentBuilder loggerBuilder;
-        String type = properties.getProperty(CONFIG_TYPE);
-        if (type != null) {
-            if (type.equalsIgnoreCase("asyncRoot")) {
-                loggerBuilder = builder.newAsyncRootLogger(level);
-            } else {
-                throw new ConfigurationException("Unknown Logger type for root logger" + type);
-            }
-        } else {
-            loggerBuilder = builder.newRootLogger(level);
-        }
-        String appenderRefs = properties.getProperty("appenderRefs");
-        if (appenderRefs != null) {
-            properties.remove("appenderRefs");
-            String[] refNames = appenderRefs.split(",");
-            for (String appenderRef : refNames) {
-                appenderRef = appenderRef.trim();
-                Properties refProps = PropertiesUtil.extractSubset(properties, "appenderRef." + appenderRef);
-                loggerBuilder.add(createAppenderRef(builder, appenderRef, refProps));
-            }
-        }
-        String filters = properties.getProperty("filters");
-        if (filters != null) {
-            properties.remove("filters");
-            String[] filterNames = filters.split(",");
-            for (String filterName : filterNames) {
-                filterName = filterName.trim();
-                Properties filterProps = PropertiesUtil.extractSubset(properties, "filter." + filterName);
-                loggerBuilder.add(createFilter(builder, filterName, filterProps));
-            }
-        }
-        return loggerBuilder;
-    }
-
-    private LayoutComponentBuilder createLayout(ConfigurationBuilder<PropertiesConfiguration> builder,
-            String appenderName, Properties properties) {
-        String type = properties.getProperty(CONFIG_TYPE);
-        if (Strings.isEmpty(type)) {
-            throw new ConfigurationException("No type attribute provided for Layout on Appender " + appenderName);
-        }
-        properties.remove(CONFIG_TYPE);
-        LayoutComponentBuilder layoutBuilder = builder.newLayout(type);
-        processRemainingProperties(layoutBuilder, appenderName, properties);
-        return layoutBuilder;
-    }
-
-    private <B extends ComponentBuilder<B>> ComponentBuilder<B> createComponent(ComponentBuilder<?> parent, String key,
-            Properties properties) {
-        String name = properties.getProperty(CONFIG_NAME);
-        if (name != null) {
-            properties.remove(CONFIG_NAME);
-        }
-        String type = properties.getProperty(CONFIG_TYPE);
-        if (Strings.isEmpty(type)) {
-            throw new ConfigurationException("No type attribute provided for component " + key);
-        }
-        properties.remove(CONFIG_TYPE);
-        ComponentBuilder<B> componentBuilder = parent.getBuilder().newComponent(name, type);
-        processRemainingProperties(componentBuilder, name, properties);
-        return componentBuilder;
-    }
-
-    private void processRemainingProperties(ComponentBuilder<?> builder, String name, Properties properties) {
-        while (properties.size() > 0) {
-            String propertyName = properties.stringPropertyNames().iterator().next();
-
-            int index = propertyName.indexOf('.');
-            if (index > 0) {
-                String prefix = propertyName.substring(0, index);
-                Properties componentProperties = PropertiesUtil.extractSubset(properties, prefix);
-                builder.addComponent(createComponent(builder, prefix, componentProperties));
-            } else {
-                builder.addAttribute(propertyName, properties.getProperty(propertyName));
-                properties.remove(propertyName);
-            }
-        }
+        return new PropertiesConfigurationBuilder().setRootProperties(properties).build();
     }
 }


[2/2] logging-log4j2 git commit: Use final and reduce code redundancy.

Posted by ma...@apache.org.
Use final and reduce code redundancy.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/60922b3e
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/60922b3e
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/60922b3e

Branch: refs/heads/master
Commit: 60922b3e6d45d8c3ff1912c7e2fcb18a0ec14844
Parents: 722aa88
Author: Matt Sicker <bo...@gmail.com>
Authored: Sun Mar 6 14:00:33 2016 -0600
Committer: Matt Sicker <bo...@gmail.com>
Committed: Sun Mar 6 14:00:45 2016 -0600

----------------------------------------------------------------------
 .../PropertiesConfigurationBuilder.java         | 204 +++++++------------
 1 file changed, 72 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/60922b3e/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
index 589971a..41802d4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
@@ -70,52 +70,30 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
 
     @Override
     public PropertiesConfiguration build() {
-        String value = rootProperties.getProperty(STATUS_KEY);
-        if (value != null) {
-            builder.setStatusLevel(Level.toLevel(value, Level.ERROR));
-        } else {
-            builder.setStatusLevel(Level.ERROR);
-        }
-        value = rootProperties.getProperty(SHUTDOWN_HOOK);
-        if (value != null) {
-            builder.setShutdownHook(value);
-        }
-        value = rootProperties.getProperty(VERBOSE);
-        if (value != null) {
-            builder.setVerbosity(value);
-        }
-        value = rootProperties.getProperty(PACKAGES);
-        if (value != null) {
-            builder.setPackages(value);
-        }
-        value = rootProperties.getProperty(CONFIG_NAME);
-        if (value != null) {
-            builder.setConfigurationName(value);
-        }
-        value = rootProperties.getProperty(MONITOR_INTERVAL);
-        if (value != null) {
-            builder.setMonitorInterval(value);
-        }
-        value = rootProperties.getProperty(ADVERTISER_KEY);
-        if (value != null) {
-            builder.setAdvertiser(value);
-        }
-        Properties props = PropertiesUtil.extractSubset(rootProperties, "property");
-        for (String key : props.stringPropertyNames()) {
-            builder.addProperty(key, props.getProperty(key));
+        builder
+            .setStatusLevel(Level.toLevel(rootProperties.getProperty(STATUS_KEY), Level.ERROR))
+            .setShutdownHook(rootProperties.getProperty(SHUTDOWN_HOOK))
+            .setVerbosity(rootProperties.getProperty(VERBOSE))
+            .setPackages(rootProperties.getProperty(PACKAGES))
+            .setConfigurationName(rootProperties.getProperty(CONFIG_NAME))
+            .setMonitorInterval(rootProperties.getProperty(MONITOR_INTERVAL, "0"))
+            .setAdvertiser(rootProperties.getProperty(ADVERTISER_KEY));
+
+        final Properties propertyPlaceholders = PropertiesUtil.extractSubset(rootProperties, "property");
+        for (final String key : propertyPlaceholders.stringPropertyNames()) {
+            builder.addProperty(key, propertyPlaceholders.getProperty(key));
         }
 
-        String scriptProp = rootProperties.getProperty("scripts");
+        final String scriptProp = (String) rootProperties.remove("scripts");
         if (scriptProp != null) {
-            String[] scriptNames = scriptProp.split(",");
-            for (String scriptName : scriptNames) {
-                String name = scriptName.trim();
-                Properties scriptProps = PropertiesUtil.extractSubset(rootProperties, "script." + name);
-                String type = scriptProps.getProperty("type");
+            final String[] scriptNames = scriptProp.split(",");
+            for (final String scriptName : scriptNames) {
+                final String name = scriptName.trim();
+                final Properties scriptProps = PropertiesUtil.extractSubset(rootProperties, "script." + name);
+                final String type = (String) scriptProps.remove("type");
                 if (type == null) {
                     throw new ConfigurationException("No type provided for script - must be Script or ScriptFile");
                 }
-                scriptProps.remove("type");
                 if (type.equalsIgnoreCase("script")) {
                     builder.add(createScript(scriptProps));
                 } else {
@@ -124,94 +102,78 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
             }
         }
 
-        Properties levelProps = PropertiesUtil.extractSubset(rootProperties, "customLevel");
+        final Properties levelProps = PropertiesUtil.extractSubset(rootProperties, "customLevel");
         if (levelProps.size() > 0) {
-            for (String key : levelProps.stringPropertyNames()) {
-                builder.add(builder.newCustomLevel(key, Integer.parseInt(props.getProperty(key))));
+            for (final String key : levelProps.stringPropertyNames()) {
+                builder.add(builder.newCustomLevel(key, Integer.parseInt(levelProps.getProperty(key))));
             }
         }
 
-        String filterProp = rootProperties.getProperty("filters");
+        final String filterProp = (String) rootProperties.remove("filters");
         if (filterProp != null) {
-            String[] filterNames = filterProp.split(",");
-            for (String filterName : filterNames) {
-                String name = filterName.trim();
+            final String[] filterNames = filterProp.split(",");
+            for (final String filterName : filterNames) {
+                final String name = filterName.trim();
                 builder.add(createFilter(name, PropertiesUtil.extractSubset(rootProperties, "filter." + name)));
             }
         }
-        String appenderProp = rootProperties.getProperty("appenders");
+
+        final String appenderProp = (String) rootProperties.remove("appenders");
         if (appenderProp != null) {
-            String[] appenderNames = appenderProp.split(",");
-            for (String appenderName : appenderNames) {
-                String name = appenderName.trim();
+            final String[] appenderNames = appenderProp.split(",");
+            for (final String appenderName : appenderNames) {
+                final String name = appenderName.trim();
                 builder.add(createAppender(name, PropertiesUtil.extractSubset(rootProperties, "appender." + name)));
             }
         }
-        String loggerProp = rootProperties.getProperty("loggers");
+
+        final String loggerProp = (String) rootProperties.remove("loggers");
         if (loggerProp != null) {
-            String[] loggerNames = loggerProp.split(",");
-            for (String loggerName : loggerNames) {
-                String name = loggerName.trim();
+            final String[] loggerNames = loggerProp.split(",");
+            for (final String loggerName : loggerNames) {
+                final String name = loggerName.trim();
                 if (!name.equals(LoggerConfig.ROOT)) {
                     builder.add(createLogger(name, PropertiesUtil.extractSubset(rootProperties, "logger." + name)));
                 }
             }
         }
 
-        props = PropertiesUtil.extractSubset(rootProperties, "rootLogger");
+        final Properties props = PropertiesUtil.extractSubset(rootProperties, "rootLogger");
         if (props.size() > 0) {
             builder.add(createRootLogger(props));
         }
 
-
         return builder.build();
     }
 
     private ScriptComponentBuilder createScript(final Properties properties) {
-        String name = properties.getProperty("name");
-        if (name != null) {
-            properties.remove("name");
-        }
-        String language = properties.getProperty("language");
-        if (language != null) {
-            properties.remove("language");
-        }
-        String text = properties.getProperty("text");
-        if (text != null) {
-            properties.remove("text");
-        }
-        ScriptComponentBuilder scriptBuilder = builder.newScript(name, language, text);
+        final String name = (String) properties.remove("name");
+        final String language = (String) properties.remove("language");
+        final String text = (String) properties.remove("text");
+        final ScriptComponentBuilder scriptBuilder = builder.newScript(name, language, text);
         return processRemainingProperties(scriptBuilder, properties);
     }
 
 
     private ScriptFileComponentBuilder createScriptFile(final Properties properties) {
-        String name = properties.getProperty("name");
-        if (name != null) {
-            properties.remove("name");
-        }
-        String path = properties.getProperty("path");
-        if (path != null) {
-            properties.remove("path");
-        }
-        ScriptFileComponentBuilder scriptFileBuilder = builder.newScriptFile(name, path);
+        final String name = (String) properties.remove("name");
+        final String path = (String) properties.remove("path");
+        final ScriptFileComponentBuilder scriptFileBuilder = builder.newScriptFile(name, path);
         return processRemainingProperties(scriptFileBuilder, properties);
     }
 
     private AppenderComponentBuilder createAppender(final String key, final Properties properties) {
-        String name = properties.getProperty(CONFIG_NAME);
+        final String name = (String) properties.remove(CONFIG_NAME);
         if (Strings.isEmpty(name)) {
             throw new ConfigurationException("No name attribute provided for Appender " + key);
         }
-        properties.remove(CONFIG_NAME);
-        String type = properties.getProperty(CONFIG_TYPE);
+        final String type = (String) properties.remove(CONFIG_TYPE);
         if (Strings.isEmpty(type)) {
             throw new ConfigurationException("No type attribute provided for Appender " + key);
         }
-        properties.remove(CONFIG_TYPE);
-        AppenderComponentBuilder appenderBuilder = builder.newAppender(name, type);
+        final AppenderComponentBuilder appenderBuilder = builder.newAppender(name, type);
         addFiltersToComponent(appenderBuilder, properties);
-        Properties layoutProps = PropertiesUtil.extractSubset(properties, "layout");
+        final Properties layoutProps = PropertiesUtil.extractSubset(properties, "layout");
         if (layoutProps.size() > 0) {
             appenderBuilder.add(createLayout(name, layoutProps));
         }
@@ -220,31 +182,23 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
     }
 
     private FilterComponentBuilder createFilter(final String key, final Properties properties) {
-        String type = properties.getProperty(CONFIG_TYPE);
+        final String type = (String) properties.remove(CONFIG_TYPE);
         if (Strings.isEmpty(type)) {
             throw new ConfigurationException("No type attribute provided for Appender " + key);
         }
-        properties.remove(CONFIG_TYPE);
-        String onMatch = properties.getProperty("onMatch");
-        if (onMatch != null) {
-            properties.remove("onMatch");
-        }
-        String onMisMatch = properties.getProperty("onMisMatch");
-        if (onMisMatch != null) {
-            properties.remove("onMisMatch");
-        }
-        FilterComponentBuilder filterBuilder = builder.newFilter(type, onMatch, onMisMatch);
+        final String onMatch = (String) properties.remove("onMatch");
+        final String onMisMatch = (String) properties.remove("onMisMatch");
+        final FilterComponentBuilder filterBuilder = builder.newFilter(type, onMatch, onMisMatch);
         return processRemainingProperties(filterBuilder, properties);
     }
 
     private AppenderRefComponentBuilder createAppenderRef(final String key, final Properties properties) {
-        String ref = properties.getProperty("ref");
+        final String ref = (String) properties.remove("ref");
         if (Strings.isEmpty(ref)) {
             throw new ConfigurationException("No ref attribute provided for AppenderRef " + key);
         }
-        properties.remove("ref");
-        AppenderRefComponentBuilder appenderRefBuilder = builder.newAppenderRef(ref);
-        String level = properties.getProperty("level");
+        final AppenderRefComponentBuilder appenderRefBuilder = builder.newAppenderRef(ref);
+        final String level = (String) properties.remove("level");
         if (!Strings.isEmpty(level)) {
             appenderRefBuilder.addAttribute("level", level);
         }
@@ -252,17 +206,13 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
     }
 
     private LoggerComponentBuilder createLogger(final String key, final Properties properties) {
-        String name = properties.getProperty(CONFIG_NAME);
+        final String name = (String) properties.remove(CONFIG_NAME);
         if (Strings.isEmpty(name)) {
             throw new ConfigurationException("No name attribute provided for Logger " + key);
         }
-        properties.remove(CONFIG_NAME);
-        String level = properties.getProperty("level");
-        if (level != null) {
-            properties.remove("level");
-        }
-        LoggerComponentBuilder loggerBuilder;
-        String type = properties.getProperty(CONFIG_TYPE);
+        final String level = (String) properties.remove("level");
+        final String type = (String) properties.remove(CONFIG_TYPE);
+        final LoggerComponentBuilder loggerBuilder;
         if (type != null) {
             if (type.equalsIgnoreCase("asyncLogger")) {
                 loggerBuilder = builder.newAsyncLogger(name, level);
@@ -274,7 +224,7 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
         }
         addLoggersToComponent(loggerBuilder, properties);
         addFiltersToComponent(loggerBuilder, properties);
-        String additivity = properties.getProperty("additivity");
+        final String additivity = (String) properties.remove("additivity");
         if (!Strings.isEmpty(additivity)) {
             loggerBuilder.addAttribute("additivity", additivity);
         }
@@ -282,12 +232,9 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
     }
 
     private RootLoggerComponentBuilder createRootLogger(final Properties properties) {
-        String level = properties.getProperty("level");
-        if (level != null) {
-            properties.remove("level");
-        }
-        RootLoggerComponentBuilder loggerBuilder;
-        String type = properties.getProperty(CONFIG_TYPE);
+        final String level = (String) properties.remove("level");
+        final String type = (String) properties.remove(CONFIG_TYPE);
+        final RootLoggerComponentBuilder loggerBuilder;
         if (type != null) {
             if (type.equalsIgnoreCase("asyncRoot")) {
                 loggerBuilder = builder.newAsyncRootLogger(level);
@@ -302,39 +249,34 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
     }
 
     private LayoutComponentBuilder createLayout(final String appenderName, final Properties properties) {
-        String type = properties.getProperty(CONFIG_TYPE);
+        final String type = (String) properties.remove(CONFIG_TYPE);
         if (Strings.isEmpty(type)) {
             throw new ConfigurationException("No type attribute provided for Layout on Appender " + appenderName);
         }
-        properties.remove(CONFIG_TYPE);
-        LayoutComponentBuilder layoutBuilder = builder.newLayout(type);
+        final LayoutComponentBuilder layoutBuilder = builder.newLayout(type);
         return processRemainingProperties(layoutBuilder, properties);
     }
 
     private static <B extends ComponentBuilder<B>> ComponentBuilder<B> createComponent(final ComponentBuilder<?> parent,
                                                                                        final String key,
                                                                                        final Properties properties) {
-        String name = properties.getProperty(CONFIG_NAME);
-        if (name != null) {
-            properties.remove(CONFIG_NAME);
-        }
-        String type = properties.getProperty(CONFIG_TYPE);
+        final String name = (String) properties.remove(CONFIG_NAME);
+        final String type = (String) properties.remove(CONFIG_TYPE);
         if (Strings.isEmpty(type)) {
             throw new ConfigurationException("No type attribute provided for component " + key);
         }
-        properties.remove(CONFIG_TYPE);
-        ComponentBuilder<B> componentBuilder = parent.getBuilder().newComponent(name, type);
+        final ComponentBuilder<B> componentBuilder = parent.getBuilder().newComponent(name, type);
         return processRemainingProperties(componentBuilder, properties);
     }
 
     private static <B extends ComponentBuilder<?>> B processRemainingProperties(final B builder,
                                                                                 final Properties properties) {
         while (properties.size() > 0) {
-            String propertyName = properties.stringPropertyNames().iterator().next();
+            final String propertyName = properties.stringPropertyNames().iterator().next();
             int index = propertyName.indexOf('.');
             if (index > 0) {
-                String prefix = propertyName.substring(0, index);
-                Properties componentProperties = PropertiesUtil.extractSubset(properties, prefix);
+                final String prefix = propertyName.substring(0, index);
+                final Properties componentProperties = PropertiesUtil.extractSubset(properties, prefix);
                 builder.addComponent(createComponent(builder, prefix, componentProperties));
             } else {
                 builder.addAttribute(propertyName, properties.getProperty(propertyName));
@@ -346,9 +288,8 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
 
     private <B extends FilterableComponentBuilder<? extends ComponentBuilder<?>>> B addFiltersToComponent(
         final B componentBuilder, final Properties properties) {
-        final String filters = properties.getProperty("filters");
+        final String filters = (String) properties.remove("filters");
         if (filters != null) {
-            properties.remove("filters");
             final String[] filterNames = filters.split(",");
             for (final String name : filterNames) {
                 final String filterName = name.trim();
@@ -361,9 +302,8 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
 
     private <B extends LoggableComponentBuilder<? extends ComponentBuilder<?>>> B addLoggersToComponent(
         final B loggerBuilder, final Properties properties) {
-        final String appenderRefs = properties.getProperty("appenderRefs");
+        final String appenderRefs = (String) properties.remove("appenderRefs");
         if (appenderRefs != null) {
-            properties.remove("appenderRefs");
             final String[] refNames = appenderRefs.split(",");
             for (final String refName : refNames) {
                 final String appenderRef = refName.trim();