LOG4J2-1860 Shortcut to add Property and KeyValuePair component in 
ConfigurationBuilder


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

Branch: refs/heads/java9NoMultiRelease
Commit: df1b3e8846246988d6119f65e7fcb3e5a9a3f1cb
Parents: 1c99c7b
Author: Mikael StÃ¥ldal <[email protected]>
Authored: Wed Apr 5 18:03:27 2017 +0200
Committer: Mikael StÃ¥ldal <[email protected]>
Committed: Wed Apr 5 18:03:27 2017 +0200

----------------------------------------------------------------------
 .../builder/api/ConfigurationBuilder.java       | 15 +++++++++
 .../api/KeyValuePairComponentBuilder.java       | 25 ++++++++++++++
 .../builder/api/PropertyComponentBuilder.java   | 25 ++++++++++++++
 .../impl/DefaultConfigurationBuilder.java       | 11 +++++++
 .../DefaultKeyValuePairComponentBuilder.java    | 34 ++++++++++++++++++++
 .../impl/DefaultPropertyComponentBuilder.java   | 32 ++++++++++++++++++
 .../builder/ConfigurationAssemblerTest.java     |  6 +++-
 .../builder/ConfigurationBuilderTest.java       | 16 +++++++++
 .../builder/CustomConfigurationFactory.java     | 11 +++++++
 9 files changed, 174 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
index 8141c25..c88cb09 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
@@ -227,6 +227,21 @@ public interface ConfigurationBuilder<T extends 
Configuration> extends Builder<T
      */
     <B extends ComponentBuilder<B>> ComponentBuilder<B> newComponent(String 
name, String pluginName, String value);
 
+    /**
+     * Returns a builder for creating Property:s
+     * @param name The name of the property.
+     * @param value The value of the component.
+     * @return A new PropertyComponentBuilder.
+     */
+    PropertyComponentBuilder newProperty(String name, String value);
+
+    /**
+     * Returns a builder for creating KeyValuePair:s
+     * @param key The name
+     * @param value The value
+     * @return A new KeyValuePairComponentBuilder.
+     */
+    KeyValuePairComponentBuilder newKeyValuePair(String key, String value);
 
     /**
      * Returns a builder for creating CustomLevels

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/KeyValuePairComponentBuilder.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/KeyValuePairComponentBuilder.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/KeyValuePairComponentBuilder.java
new file mode 100644
index 0000000..d836a94
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/KeyValuePairComponentBuilder.java
@@ -0,0 +1,25 @@
+/*
+ * 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.builder.api;
+
+/**
+ * Assembler for constructing KeyValuePair Components.
+ * @since 2.9
+ */
+public interface KeyValuePairComponentBuilder extends 
ComponentBuilder<KeyValuePairComponentBuilder> {
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/PropertyComponentBuilder.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/PropertyComponentBuilder.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/PropertyComponentBuilder.java
new file mode 100644
index 0000000..bbf3995
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/PropertyComponentBuilder.java
@@ -0,0 +1,25 @@
+/*
+ * 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.builder.api;
+
+/**
+ * Assembler for constructing Property Components.
+ * @since 2.9
+ */
+public interface PropertyComponentBuilder extends 
ComponentBuilder<PropertyComponentBuilder> {
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
index 183094d..29acea4 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
@@ -41,8 +41,10 @@ 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.CustomLevelComponentBuilder;
 import org.apache.logging.log4j.core.config.builder.api.FilterComponentBuilder;
+import 
org.apache.logging.log4j.core.config.builder.api.KeyValuePairComponentBuilder;
 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.PropertyComponentBuilder;
 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;
@@ -410,6 +412,15 @@ public class DefaultConfigurationBuilder<T extends 
BuiltConfiguration> implement
         return new DefaultComponentBuilder<>(this, name, type, value);
     }
 
+    @Override
+    public PropertyComponentBuilder newProperty(String name, String value) {
+        return new DefaultPropertyComponentBuilder(this, name, value);
+    }
+
+    @Override
+    public KeyValuePairComponentBuilder newKeyValuePair(String key, String 
value) {
+        return new DefaultKeyValuePairComponentBuilder(this, key, value);
+    }
 
     @Override
     public CustomLevelComponentBuilder newCustomLevel(final String name, final 
int level) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultKeyValuePairComponentBuilder.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultKeyValuePairComponentBuilder.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultKeyValuePairComponentBuilder.java
new file mode 100644
index 0000000..a21e010
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultKeyValuePairComponentBuilder.java
@@ -0,0 +1,34 @@
+/*
+ * 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.builder.impl;
+
+import org.apache.logging.log4j.core.config.Configuration;
+import 
org.apache.logging.log4j.core.config.builder.api.KeyValuePairComponentBuilder;
+
+/**
+ * @since 2.9
+ */
+class DefaultKeyValuePairComponentBuilder extends 
DefaultComponentAndConfigurationBuilder<KeyValuePairComponentBuilder>
+        implements KeyValuePairComponentBuilder {
+
+    public DefaultKeyValuePairComponentBuilder(final 
DefaultConfigurationBuilder<? extends Configuration> builder,
+                                               final String key, final String 
value) {
+        super(builder,"KeyValuePair");
+        addAttribute("key", key);
+        addAttribute("value", value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultPropertyComponentBuilder.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultPropertyComponentBuilder.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultPropertyComponentBuilder.java
new file mode 100644
index 0000000..cc81a53
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultPropertyComponentBuilder.java
@@ -0,0 +1,32 @@
+/*
+ * 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.builder.impl;
+
+import org.apache.logging.log4j.core.config.Configuration;
+import 
org.apache.logging.log4j.core.config.builder.api.PropertyComponentBuilder;
+
+/**
+ * @since 2.9
+ */
+class DefaultPropertyComponentBuilder extends 
DefaultComponentAndConfigurationBuilder<PropertyComponentBuilder>
+        implements PropertyComponentBuilder {
+
+    public DefaultPropertyComponentBuilder(final DefaultConfigurationBuilder<? 
extends Configuration> builder,
+                                           final String name, final String 
value) {
+        super(builder, name, "Property", value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java
index ccb2cc5..ec4f541 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationAssemblerTest.java
@@ -31,6 +31,7 @@ import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LifeCycle;
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
 import org.apache.logging.log4j.core.config.Configurator;
@@ -40,6 +41,7 @@ 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.impl.BuiltConfiguration;
 import org.apache.logging.log4j.core.filter.ThresholdFilter;
+import org.apache.logging.log4j.core.layout.GelfLayout;
 import org.apache.logging.log4j.core.util.Constants;
 import org.junit.Test;
 
@@ -87,7 +89,9 @@ public class ConfigurationAssemblerTest {
         assertEquals("Incorrect State: " + config.getState(), 
config.getState(), LifeCycle.State.STARTED);
         final Map<String, Appender> appenders = config.getAppenders();
         assertNotNull(appenders);
-        assertTrue("Incorrect number of Appenders: " + appenders.size(), 
appenders.size() == 1);
+        assertTrue("Incorrect number of Appenders: " + appenders.size(), 
appenders.size() == 2);
+        final KafkaAppender kafkaAppender = 
(KafkaAppender)appenders.get("Kafka");
+        final GelfLayout gelfLayout = (GelfLayout)kafkaAppender.getLayout();
         final Map<String, LoggerConfig> loggers = config.getLoggers();
         assertNotNull(loggers);
         assertTrue("Incorrect number of LoggerConfigs: " + loggers.size(), 
loggers.size() == 2);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java
index 431ac01..7ac91e5 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java
@@ -42,16 +42,26 @@ public class ConfigurationBuilderTest {
         
builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true));
         builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, 
Filter.Result.NEUTRAL)
                 .addAttribute("level", Level.DEBUG));
+
         final AppenderComponentBuilder appenderBuilder = 
builder.newAppender("Stdout", "CONSOLE").addAttribute("target", 
ConsoleAppender.Target.SYSTEM_OUT);
         appenderBuilder.add(builder.newLayout("PatternLayout").
                 addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
         appenderBuilder.add(builder.newFilter("MarkerFilter", 
Filter.Result.DENY,
                 Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
         builder.add(appenderBuilder);
+
+        final AppenderComponentBuilder appenderBuilder2 = 
builder.newAppender("Kafka", "Kafka").addAttribute("topic", "my-topic");
+        appenderBuilder2.addComponent(builder.newProperty("bootstrap.servers", 
"localhost:9092"));
+        appenderBuilder2.add(builder.newLayout("GelfLayout").
+            addAttribute("host", "my-host").
+            addComponent(builder.newKeyValuePair("extraField", "extraValue")));
+        builder.add(appenderBuilder2);
+
         builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG, 
true).
                     add(builder.newAppenderRef("Stdout")).
                     addAttribute("additivity", false));
         
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
+
         builder.addProperty("MyKey", "MyValue");
         builder.add(builder.newCustomLevel("Panic", 17));
         builder.setPackages("foo,bar");
@@ -75,6 +85,12 @@ public class ConfigurationBuilderTest {
                 INDENT + INDENT + INDENT + "<PatternLayout pattern=\"%d [%t] 
%-5level: %msg%n%throwable\"/>" + EOL +
                 INDENT + INDENT + INDENT + "<MarkerFilter onMatch=\"DENY\" 
onMisMatch=\"NEUTRAL\" marker=\"FLOW\"/>" + EOL +
                 INDENT + INDENT + "</CONSOLE>" + EOL +
+                INDENT + INDENT + "<Kafka name=\"Kafka\" topic=\"my-topic\">" 
+ EOL +
+                INDENT + INDENT + INDENT + "<Property 
name=\"bootstrap.servers\">localhost:9092</Property>" + EOL +
+                INDENT + INDENT + INDENT + "<GelfLayout host=\"my-host\">" + 
EOL +
+                INDENT + INDENT + INDENT + INDENT + "<KeyValuePair 
key=\"extraField\" value=\"extraValue\"/>" + EOL +
+                INDENT + INDENT + INDENT + "</GelfLayout>" + EOL +
+                INDENT + INDENT + "</Kafka>" + EOL +
                 INDENT + "</Appenders>" + EOL +
                 INDENT + "<Loggers>" + EOL +
                 INDENT + INDENT + "<Logger name=\"org.apache.logging.log4j\" 
level=\"DEBUG\" includeLocation=\"true\" additivity=\"false\">" + EOL +

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df1b3e88/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java
index ab6bb88..847f79e 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/CustomConfigurationFactory.java
@@ -43,17 +43,28 @@ public class CustomConfigurationFactory extends 
ConfigurationFactory {
         
builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true));
         builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, 
Filter.Result.NEUTRAL)
                 .addAttribute("level", Level.DEBUG));
+
         final AppenderComponentBuilder appenderBuilder = 
builder.newAppender("Stdout", "CONSOLE").addAttribute("target", 
ConsoleAppender.Target.SYSTEM_OUT);
         appenderBuilder.add(builder.newLayout("PatternLayout").
                 addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
         appenderBuilder.add(builder.newFilter("MarkerFilter", 
Filter.Result.DENY,
                 Filter.Result.NEUTRAL).addAttribute("marker", "FLOW"));
         builder.add(appenderBuilder);
+
+        final AppenderComponentBuilder appenderBuilder2 = 
builder.newAppender("Kafka", "Kafka").addAttribute("topic", "my-topic");
+        appenderBuilder2.addComponent(builder.newProperty("bootstrap.servers", 
"localhost:9092"));
+        appenderBuilder2.add(builder.newLayout("GelfLayout").
+            addAttribute("host", "my-host").
+            addComponent(builder.newKeyValuePair("extraField", "extraValue")));
+        builder.add(appenderBuilder2);
+
         builder.add(builder.newLogger("org.apache.logging.log4j", Level.DEBUG, 
true).
                     add(builder.newAppenderRef("Stdout")).
                     addAttribute("additivity", false));
         
builder.add(builder.newRootLogger(Level.ERROR).add(builder.newAppenderRef("Stdout")));
+
         builder.add(builder.newCustomLevel("Panic", 17));
+
         return builder.build();
     }
 

Reply via email to