Repository: logging-log4j2
Updated Branches:
  refs/heads/master b0bc4c843 -> 80354c6d2


[LOG4J2-1770]: Add Builder to JdbcAppender


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

Branch: refs/heads/master
Commit: 80354c6d272a8975f129f8f40b848d6a389ea54d
Parents: b0bc4c8
Author: Matt Sicker <[email protected]>
Authored: Fri Jan 6 23:34:09 2017 -0600
Committer: Matt Sicker <[email protected]>
Committed: Fri Jan 6 23:34:09 2017 -0600

----------------------------------------------------------------------
 .../core/appender/db/jdbc/JdbcAppender.java     | 162 ++++++++++++++-----
 src/changes/changes.xml                         |   3 +
 2 files changed, 128 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/80354c6d/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java
index ccc0fa5..3aa5644 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java
@@ -16,15 +16,23 @@
  */
 package org.apache.logging.log4j.core.appender.db.jdbc;
 
+import java.io.Serializable;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Objects;
+
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import 
org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+import org.apache.logging.log4j.core.util.Assert;
 import org.apache.logging.log4j.core.util.Booleans;
 
 /**
@@ -55,52 +63,132 @@ public final class JdbcAppender extends 
AbstractDatabaseAppender<JdbcDatabaseMan
     /**
      * Factory method for creating a JDBC appender within the plugin manager.
      *
-     * @param name The name of the appender.
-     * @param ignore If {@code "true"} (default) exceptions encountered when 
appending events are logged; otherwise
-     *               they are propagated to the caller.
-     * @param filter The filter, if any, to use.
-     * @param connectionSource The connections source from which database 
connections should be retrieved.
-     * @param bufferSize If an integer greater than 0, this causes the 
appender to buffer log events and flush whenever
-     *                   the buffer reaches this size.
-     * @param tableName The name of the database table to insert log events 
into.
-     * @param columnConfigs Information about the columns that log event data 
should be inserted into and how to insert
-     *                      that data.
-     * @return a new JDBC appender.
+     * @see Builder
+     * @deprecated use {@link #newBuilder()}
      */
-    @PluginFactory
-    public static JdbcAppender createAppender(
-            @PluginAttribute("name") final String name,
-            @PluginAttribute("ignoreExceptions") final String ignore,
-            @PluginElement("Filter") final Filter filter,
-            @PluginElement("ConnectionSource") final ConnectionSource 
connectionSource,
-            @PluginAttribute("bufferSize") final String bufferSize,
-            @PluginAttribute("tableName") final String tableName,
-            @PluginElement("ColumnConfigs") final ColumnConfig[] 
columnConfigs) {
+    @Deprecated
+    public static <B extends Builder<B>> JdbcAppender createAppender(final 
String name, final String ignore,
+                                                                     final 
Filter filter,
+                                                                     final 
ConnectionSource connectionSource,
+                                                                     final 
String bufferSize, final String tableName,
+                                                                     final 
ColumnConfig[] columnConfigs) {
+        Assert.requireNonEmpty(name, "Name cannot be empty");
+        Objects.requireNonNull(connectionSource, "ConnectionSource cannot be 
null");
+        Assert.requireNonEmpty(tableName, "Table name cannot be empty");
+        Assert.requireNonEmpty(columnConfigs, "ColumnConfigs cannot be empty");
 
         final int bufferSizeInt = AbstractAppender.parseInt(bufferSize, 0);
         final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
 
-        final StringBuilder managerName = new StringBuilder("jdbcManager{ 
description=").append(name)
-                .append(", bufferSize=").append(bufferSizeInt).append(", 
connectionSource=")
-                .append(connectionSource.toString()).append(", 
tableName=").append(tableName).append(", columns=[ ");
+        return JdbcAppender.<B>newBuilder()
+            .setBufferSize(bufferSizeInt)
+            .setColumnConfigs(columnConfigs)
+            .setConnectionSource(connectionSource)
+            .setTableName(tableName)
+            .withName(name)
+            .withIgnoreExceptions(ignoreExceptions)
+            .withFilter(filter)
+            .build();
+    }
+
+    @PluginBuilderFactory
+    public static <B extends Builder<B>> B newBuilder() {
+        return new Builder<B>().asBuilder();
+    }
+
+    public static class Builder<B extends Builder<B>> extends 
AbstractAppender.Builder<B>
+        implements org.apache.logging.log4j.core.util.Builder<JdbcAppender> {
+
+        @PluginElement("ConnectionSource")
+        @Required(message = "No ConnectionSource provided")
+        private ConnectionSource connectionSource;
+
+        @PluginBuilderAttribute
+        private int bufferSize;
+
+        @PluginBuilderAttribute
+        @Required(message = "No table name provided")
+        private String tableName;
+
+        @PluginElement("ColumnConfigs")
+        private ColumnConfig[] columnConfigs;
+
+        // TODO: LOG4J2-424
+//        @PluginElement("ColumnMappings")
+//        private ColumnMapping[] columnMappings;
+
+        /**
+         * The connections source from which database connections should be 
retrieved.
+         */
+        public B setConnectionSource(final ConnectionSource connectionSource) {
+            this.connectionSource = connectionSource;
+            return asBuilder();
+        }
 
-        int i = 0;
-        for (final ColumnConfig column : columnConfigs) {
-            if (i++ > 0) {
-                managerName.append(", ");
+        /**
+         * If an integer greater than 0, this causes the appender to buffer 
log events and flush whenever the buffer
+         * reaches this size.
+         */
+        public B setBufferSize(final int bufferSize) {
+            this.bufferSize = bufferSize;
+            return asBuilder();
+        }
+
+        /**
+         * The name of the database table to insert log events into.
+         */
+        public B setTableName(final String tableName) {
+            this.tableName = tableName;
+            return asBuilder();
+        }
+
+        /**
+         * Information about the columns that log event data should be 
inserted into and how to insert that data.
+         */
+        public B setColumnConfigs(final ColumnConfig... columnConfigs) {
+            this.columnConfigs = columnConfigs;
+            return asBuilder();
+        }
+
+//        public B setColumnMappings(final ColumnMapping... columnMappings) {
+//            this.columnMappings = columnMappings;
+//            return asBuilder();
+//        }
+
+        @Override
+        public JdbcAppender build() {
+            final String managerName = "JdbcManager{name=" + getName() + ", 
bufferSize=" + bufferSize + ", tableName=" +
+                tableName + ", columnConfigs=" + 
Arrays.toString(columnConfigs) + '}';
+            final JdbcDatabaseManager manager = 
JdbcDatabaseManager.getJDBCDatabaseManager(managerName, bufferSize,
+                connectionSource, tableName, columnConfigs);
+            if (manager == null) {
+                return null;
             }
-            managerName.append(column.toString());
+            return new JdbcAppender(getName(), getFilter(), 
isIgnoreExceptions(), manager);
         }
 
-        managerName.append(" ] }");
+        @Override
+        @Deprecated
+        public Layout<? extends Serializable> getLayout() {
+            throw new UnsupportedOperationException();
+        }
 
-        final JdbcDatabaseManager manager = 
JdbcDatabaseManager.getJDBCDatabaseManager(
-                managerName.toString(), bufferSizeInt, connectionSource, 
tableName, columnConfigs
-        );
-        if (manager == null) {
-            return null;
+        @Override
+        @Deprecated
+        public B withLayout(final Layout<? extends Serializable> layout) {
+            throw new UnsupportedOperationException();
         }
 
-        return new JdbcAppender(name, filter, ignoreExceptions, manager);
+        @Override
+        @Deprecated
+        public Layout<? extends Serializable> getOrCreateLayout() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        @Deprecated
+        public Layout<? extends Serializable> getOrCreateLayout(final Charset 
charset) {
+            throw new UnsupportedOperationException();
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/80354c6d/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index a1280fc..690a3fd 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -228,6 +228,9 @@
       <action issue="LOG4J2-1302" dev="rpopma" type="update">
         The log4j-slf4j-impl module now declares a runtime dependency on 
log4j-core. While not technically required, this makes the log4j-slf4j-impl 
module behave similarly to slf4j-log4j12, and facilitates migration to Log4j 2.
       </action>
+      <action issue="LOG4J2-1770" dev="mattsicker" type="add">
+        Add a Builder to JdbcAppender and deprecate 
JdbcAppender.createAppender().
+      </action>
       <action issue="LOG4J2-1764" dev="mattsicker" type="add">
         Use MethodHandle in ContextDataFactory cached constructor.
       </action>

Reply via email to