Repository: logging-log4j2
Updated Branches:
  refs/heads/master 57825ccd1 -> 977095f72


[LOG4J2-1609] Add a Builder to ServletAppender and deprecate factory
method.

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

Branch: refs/heads/master
Commit: 977095f72b02afdadbc555371100b07c8825f90f
Parents: 57825cc
Author: Gary Gregory <ggreg...@apache.org>
Authored: Thu Sep 22 13:25:24 2016 -0700
Committer: Gary Gregory <ggreg...@apache.org>
Committed: Thu Sep 22 13:25:24 2016 -0700

----------------------------------------------------------------------
 .../log4j/web/appender/ServletAppender.java     | 80 +++++++++++++-------
 src/changes/changes.xml                         |  5 +-
 2 files changed, 56 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/977095f7/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
----------------------------------------------------------------------
diff --git 
a/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
 
b/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
index 8bddc47..1a592c2 100644
--- 
a/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
+++ 
b/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j.web.appender;
 
 import java.io.Serializable;
+
 import javax.servlet.ServletContext;
 
 import org.apache.logging.log4j.core.Filter;
@@ -24,10 +25,7 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 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.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.config.plugins.PluginBuilderFactory;
 import org.apache.logging.log4j.core.layout.AbstractStringLayout;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.web.WebLoggerContextUtils;
@@ -38,46 +36,72 @@ import org.apache.logging.log4j.web.WebLoggerContextUtils;
 @Plugin(name = "Servlet", category = "Core", elementType = "appender", 
printObject = true)
 public class ServletAppender extends AbstractAppender {
 
-    private final ServletContext servletContext;
+       public static class Builder<B extends Builder<B>> extends 
AbstractAppender.Builder<B>
+                       implements 
org.apache.logging.log4j.core.util.Builder<ServletAppender> {
+
+               @Override
+               public ServletAppender build() {
+                       final String name = getName();
+                       if (name == null) {
+                               LOGGER.error("No name provided for 
ServletAppender");
+                       }
+                       final ServletContext servletContext = 
WebLoggerContextUtils.getServletContext();
+                       if (servletContext == null) {
+                               LOGGER.error("No servlet context is available");
+                               return null;
+                       }
+                       Layout<? extends Serializable> layout = getLayout();
+                       if (layout == null) {
+                               layout = PatternLayout.createDefaultLayout();
+                       } else if (!(layout instanceof AbstractStringLayout)) {
+                               LOGGER.error("Layout must be a StringLayout to 
log to ServletContext");
+                               return null;
+                       }
+                       return new ServletAppender(name, layout, getFilter(), 
servletContext, isIgnoreExceptions());
+               }
 
-    private ServletAppender(final String name, final AbstractStringLayout 
layout, final Filter filter,
-                            final ServletContext servletContext, final boolean 
ignoreExceptions) {
-        super(name, filter, layout, ignoreExceptions);
-        this.servletContext = servletContext;
+       }
+    
+    @PluginBuilderFactory
+    public static <B extends Builder<B>> B newBuilder() {
+        return new Builder<B>().asBuilder();
     }
 
+    private final ServletContext servletContext;
+
+    
+       private ServletAppender(final String name, final Layout<? extends 
Serializable> layout, final Filter filter,
+                       final ServletContext servletContext, final boolean 
ignoreExceptions) {
+               super(name, filter, layout, ignoreExceptions);
+               this.servletContext = servletContext;
+       }
+
     @Override
     public void append(final LogEvent event) {
         servletContext.log(((AbstractStringLayout) 
getLayout()).toSerializable(event), event.getThrown());
     }
 
     /**
-     * Create a Servlet Appender.
+     * Creates a Servlet Appender.
      * @param layout The layout to use (required). Must extend {@link 
AbstractStringLayout}.
      * @param filter The Filter or null.
      * @param name The name of the Appender (required).
      * @param ignoreExceptions If {@code true} (default) exceptions 
encountered when appending events are logged;
      *                         otherwise they are propagated to the caller.
      * @return The ServletAppender.
+     * @deprecated Use {@link #newBuilder()}.
      */
-    @PluginFactory
-    public static ServletAppender createAppender(
-            @PluginElement("Layout") Layout<? extends Serializable> layout,
-            @PluginElement("Filter") final Filter filter,
-            @PluginAttribute("name") @Required(message = "No name provided for 
ServletAppender") final String name,
-            @PluginAttribute(value = "ignoreExceptions", defaultBoolean = 
true) final boolean ignoreExceptions) {
-        final ServletContext servletContext = 
WebLoggerContextUtils.getServletContext();
-        if (servletContext == null) {
-            LOGGER.error("No servlet context is available");
-            return null;
-        }
-        if (layout == null) {
-            layout = PatternLayout.createDefaultLayout();
-        } else if (!(layout instanceof AbstractStringLayout)) {
-            LOGGER.error("Layout must be a StringLayout to log to 
ServletContext");
-            return null;
-        }
-        return new ServletAppender(name, (AbstractStringLayout) layout, 
filter, servletContext, ignoreExceptions);
+    @Deprecated
+    public static ServletAppender createAppender(Layout<? extends 
Serializable> layout, final Filter filter,
+            final String name, final boolean ignoreExceptions) {
+        // @formatter:off
+       return newBuilder()
+                       .withFilter(filter)
+                       .withIgnoreExceptions(ignoreExceptions)
+                       .withLayout(layout)
+                       .withName(name)
+                       .build();
+       // @formatter:on
     }
 
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/977095f7/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 7e69b6d..526853c 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -202,7 +202,10 @@
         SocketAppender now supports IO buffering.
       </action>
       <action issue="LOG4J2-1557" dev="ggregory" type="add">
-        Added a Builder for the SocketAppender (deprecates factory method).
+        Add a Builder for the SocketAppender (deprecates factory method).
+      </action>
+      <action issue="LOG4J2-1609" dev="ggregory" type="add">
+        Add a Builder to ServletAppender and deprecate factory method.
       </action>
       <action issue="LOG4J2-1553" dev="ggregory" type="add">
         AbstractManager now implements AutoCloseable.

Reply via email to