You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/08/12 12:11:47 UTC

[01/50] logging-log4j2 git commit: LOG4J2-1448 un-ignore Unit test

Repository: logging-log4j2
Updated Branches:
  refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure b3a4e9e7e -> a12913d7c


LOG4J2-1448 un-ignore Unit test


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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 5e1bb8b90b3160a9526363fdae134c43fec69a5d
Parents: c89af8e
Author: rpopma <rp...@apache.org>
Authored: Mon Aug 8 00:17:42 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Mon Aug 8 00:17:42 2016 +0900

----------------------------------------------------------------------
 .../org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5e1bb8b9/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
index 90470b9..10dfb83 100644
--- a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
+++ b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumeAppenderTest.java
@@ -245,7 +245,7 @@ public class FlumeAppenderTest {
         eventSource.stop();
     }
 
-    @Ignore
+    //@Ignore //(Remko: this test hangs my build...)
     @Test
     public void testIncompleteBatch() throws IOException {
         final Agent[] agents = new Agent[] { Agent.createAgent("localhost",


[10/50] logging-log4j2 git commit: Sort: fix, add, update.

Posted by rp...@apache.org.
Sort: fix, add, update.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 0482817088ea61f6c1f219fc11dd45b63e3f0b9f
Parents: 714bfaf
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 08:48:36 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 08:48:36 2016 -0700

----------------------------------------------------------------------
 src/changes/changes.xml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/04828170/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 87578dd..1f1fa85 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -57,12 +57,12 @@
       <action issue="LOG4J2-351" dev="rpopma, ggregory" type="fix" due-to="Roland Weiglhofer">
         [OSGi] wrong Fragment-Host in manifest files.
       </action>
-      <action issue="LOG4J2-1471" dev="ggregory" type="add" due-to="Gary Gregory">
-        [PatternLayout] Add an ANSI option to %xThrowable.
-      </action>
       <action issue="LOG4J2-1313" dev="rpopma" type="fix" due-to="Philipp Knobel">
         Properties declared in configuration can now have their value either in the element body or in an attribute named "value".
       </action>
+      <action issue="LOG4J2-1471" dev="ggregory" type="add" due-to="Gary Gregory">
+        [PatternLayout] Add an ANSI option to %xThrowable.
+      </action>
       <action issue="LOG4J2-1472" dev="ggregory" type="add" due-to="Gary Gregory">
         Make org.apache.logging.log4j.core.LoggerContext implement Closeable.
       </action>


[46/50] logging-log4j2 git commit: Javadoc: Use the active voice.

Posted by rp...@apache.org.
Javadoc: Use the active voice.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: df2d248dd79e2da8b79d681918658e4a9b431f08
Parents: 3fde6e7
Author: Gary Gregory <gg...@apache.org>
Authored: Thu Aug 11 14:57:23 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Thu Aug 11 14:57:23 2016 -0700

----------------------------------------------------------------------
 .../log4j/core/appender/rolling/DefaultRolloverStrategy.java | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/df2d248d/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
index ab31f30..833db41 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
@@ -180,7 +180,7 @@ public class DefaultRolloverStrategy implements RolloverStrategy {
     private static final int DEFAULT_WINDOW_SIZE = 7;
 
     /**
-     * Create the DefaultRolloverStrategy.
+     * Creates the DefaultRolloverStrategy.
      *
      * @param max The maximum number of files to keep.
      * @param min The minimum number of files to keep.
@@ -307,7 +307,7 @@ public class DefaultRolloverStrategy implements RolloverStrategy {
     }
 
     /**
-     * Purge and rename old log files in preparation for rollover. The oldest file will have the smallest index, the
+     * Purges and renames old log files in preparation for rollover. The oldest file will have the smallest index, the
      * newest the highest.
      *
      * @param lowIndex low index
@@ -414,7 +414,7 @@ public class DefaultRolloverStrategy implements RolloverStrategy {
     }
 
     /**
-     * Purge and rename old log files in preparation for rollover. The newest file will have the smallest index, the
+     * Purges and renames old log files in preparation for rollover. The newest file will have the smallest index, the
      * oldest will have the highest.
      *
      * @param lowIndex low index
@@ -509,7 +509,7 @@ public class DefaultRolloverStrategy implements RolloverStrategy {
     }
 
     /**
-     * Perform the rollover.
+     * Performs the rollover.
      *
      * @param manager The RollingFileManager name for current active log file.
      * @return A RolloverDescription.


[03/50] logging-log4j2 git commit: Comment.

Posted by rp...@apache.org.
Comment.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: cc284d18377c5ae8ce1d2d58f0b31fe66c5ddee4
Parents: 8bb88df
Author: Gary Gregory <gg...@apache.org>
Authored: Sun Aug 7 10:38:21 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Sun Aug 7 10:38:21 2016 -0700

----------------------------------------------------------------------
 .../src/test/java/org/apache/logging/log4j/junit/CleanFiles.java    | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/cc284d18/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
index 3504bf4..5de9c63 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
@@ -59,6 +59,7 @@ public class CleanFiles extends AbstractExternalFileCleaner {
                 try {
                     Thread.sleep(200);
                 } catch (final InterruptedException ignored) {
+                    // ignore
                 }
             }
         }


[06/50] logging-log4j2 git commit: Comments.

Posted by rp...@apache.org.
Comments.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: e81c6a11d5c5f07c83ad81fc47cbb94f2cbbfc2b
Parents: 96f7d65
Author: Gary Gregory <gg...@apache.org>
Authored: Sun Aug 7 11:27:56 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Sun Aug 7 11:27:56 2016 -0700

----------------------------------------------------------------------
 .../test/java/org/apache/logging/log4j/junit/CleanFolders.java    | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e81c6a11/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
index a4d9023..ea75a55 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
@@ -53,7 +53,7 @@ public class CleanFolders extends AbstractExternalFileCleaner {
     @Override
     protected void clean() {
         Map<Path, IOException> failures = new HashMap<>();
-
+        // Clean and gather failures
         for (final File folder : getFiles()) {
             if (folder.exists()) {
                 final Path path = folder.toPath();
@@ -72,6 +72,7 @@ public class CleanFolders extends AbstractExternalFileCleaner {
                 }
             }
         }
+        // Fail on failures
         if (failures.size() > 0) {
             StringBuilder sb = new StringBuilder();
             boolean first = true;


[21/50] logging-log4j2 git commit: [LOG4J2-1501] FileAppender should be able to create files lazily.

Posted by rp...@apache.org.
[LOG4J2-1501] FileAppender should be able to create files lazily.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 4fc1c5f07d4be5109bb229542258490b0bf39239
Parents: 16d06e8
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 10:42:54 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 10:42:54 2016 -0700

----------------------------------------------------------------------
 .../logging/log4j/core/config/CustomConfigurationTest.java       | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4fc1c5f0/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
index b8dad5e..6888204 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
@@ -80,8 +80,8 @@ public class CustomConfigurationTest {
             .withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
             .withConfiguration(config)
             .build();
-        final Appender appender = FileAppender.createAppender(LOG_FILE, "false", "false", "File", "true",
-            "false", "false", "4000", layout, null, "false", null, config);
+        final Appender appender = FileAppender.createAppender(LOG_FILE, false, false, "File", true,
+            false, false, 4000, layout, null, false, null, false, config);
         appender.start();
         config.addAppender(appender);
         final AppenderRef ref = AppenderRef.createAppenderRef("File", null, null);


[09/50] logging-log4j2 git commit: Improve Kafka appender documentation.

Posted by rp...@apache.org.
Improve Kafka appender documentation.


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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 34ee617a3d667f36b21732a5e274c420183fa010
Parents: 714bfaf
Author: Mikael St�ldal <mi...@magine.com>
Authored: Mon Aug 8 10:35:02 2016 +0200
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Mon Aug 8 10:35:02 2016 +0200

----------------------------------------------------------------------
 src/site/xdoc/manual/appenders.xml | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/34ee617a/src/site/xdoc/manual/appenders.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/appenders.xml b/src/site/xdoc/manual/appenders.xml
index c04c491..51caab6 100644
--- a/src/site/xdoc/manual/appenders.xml
+++ b/src/site/xdoc/manual/appenders.xml
@@ -1261,7 +1261,7 @@ public class JpaLogEntity extends AbstractLogEventWrapperEntity {
         </subsection>
         <a name="KafkaAppender"/>
         <subsection name="KafkaAppender">
-          <p>The KafkaAppender logs events to an <a href="https://kafka.apache.org/">Apache Kafka</a> topic.</p>
+          <p>The KafkaAppender logs events to an <a href="https://kafka.apache.org/">Apache Kafka</a> topic.</p> Each log event is sent as a Kafka record with no key.
           <table>
             <caption align="top">KafkaAppender Parameters</caption>
             <tr>
@@ -1306,8 +1306,9 @@ public class JpaLogEntity extends AbstractLogEventWrapperEntity {
               <td>properties</td>
               <td>Property[]</td>
               <td>
-                You can set any properties in <a href="http://kafka.apache.org/documentation.html#producerconfigs">Kafka producer properties</a>.
+                You can set properties in <a href="http://kafka.apache.org/documentation.html#producerconfigs">Kafka producer properties</a>.
                 You need to set the <code>bootstrap.servers</code> property, there are sensible default values for the others.
+                Do not set the <code>value.serializer</code> property.
               </td>
             </tr>
           </table>


[43/50] logging-log4j2 git commit: Refactor for ConsoleAppender (and others next) to use inherited Builders.

Posted by rp...@apache.org.
Refactor for ConsoleAppender (and others next) to use inherited
Builders.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 2207cae2a1213fda34cf94e5f08c49c2c9433e50
Parents: e3e37cc
Author: Gary Gregory <gg...@apache.org>
Authored: Wed Aug 10 20:09:29 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Wed Aug 10 20:09:29 2016 -0700

----------------------------------------------------------------------
 .../log4j/core/appender/AbstractAppender.java   | 58 +++++++++++++++
 .../appender/AbstractOutputStreamAppender.java  | 21 ++++++
 .../log4j/core/appender/ConsoleAppender.java    | 78 +++++++-------------
 .../log4j/core/filter/AbstractFilterable.java   | 27 +++++++
 .../core/appender/ConsoleAppenderTest.java      |  6 +-
 5 files changed, 134 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2207cae2/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
index 9f253a0..8df298f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
@@ -23,7 +23,11 @@ import org.apache.logging.log4j.core.ErrorHandler;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
 import org.apache.logging.log4j.core.filter.AbstractFilterable;
+import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.util.Integers;
 
 /**
@@ -32,6 +36,60 @@ import org.apache.logging.log4j.core.util.Integers;
  */
 public abstract class AbstractAppender extends AbstractFilterable implements Appender {
 
+    /**
+     * Subclasses can extend this abstract Builder. 
+     * 
+     * @param <B> This builder class.
+     */
+    public abstract static class Builder<B extends Builder<B>> extends AbstractFilterable.Builder<B> {
+
+        @PluginBuilderAttribute
+        private boolean ignoreExceptions = true;
+        
+        @PluginElement("Layout")
+        @Required
+        private Layout<? extends Serializable> layout;
+
+        @PluginBuilderAttribute
+        @Required
+        private String name;
+
+        public String getName() {
+            return name;
+        }
+
+        public boolean isIgnoreExceptions() {
+            return ignoreExceptions;
+        }
+
+        public Layout<? extends Serializable> getLayout() {
+            return layout;
+        }
+
+        public B withName(String name) {
+            this.name = name;
+            return asBuilder();
+        }
+
+        public B withIgnoreExceptions(boolean ignoreExceptions) {
+            this.ignoreExceptions = ignoreExceptions;
+            return asBuilder();
+        }
+
+        public B withLayout(Layout<? extends Serializable> layout) {
+            this.layout = layout;
+            return asBuilder();
+        }
+
+        public Layout<? extends Serializable> getOrCreateLayout() {
+            if (layout == null) {
+                return PatternLayout.createDefaultLayout();
+            }
+            return layout;
+        }
+        
+    }
+    
     private final String name;
     private final boolean ignoreExceptions;
     private final Layout<? extends Serializable> layout;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2207cae2/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
index 4a95098..67e835a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
@@ -21,6 +21,7 @@ import java.io.Serializable;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.util.Constants;
 
 /**
@@ -31,6 +32,26 @@ import org.apache.logging.log4j.core.util.Constants;
 public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager> extends AbstractAppender {
 
     /**
+     * Subclasses can extend this abstract Builder. 
+     * 
+     * @param <B> This builder class.
+     */
+    public abstract static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B> {
+    
+        @PluginBuilderAttribute
+        private boolean immediateFlush;
+
+        public boolean isImmediateFlush() {
+            return immediateFlush;
+        }
+
+        public B withImmediateFlush(boolean immediateFlush) {
+            this.immediateFlush = immediateFlush;
+            return asBuilder();
+        }
+    }
+    
+    /**
      * Immediate flush means that the underlying writer or output stream will be flushed at the end of each append
      * operation. Immediate flush is slower but ensures that each append request is actually written. If
      * <code>immediateFlush</code> is set to {@code false}, then there is a good chance that the last few logs events

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2207cae2/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
index 9747088..eed9319 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
@@ -29,6 +29,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.appender.FileAppender.Builder;
 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;
@@ -87,7 +88,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
      * @param ignore If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise they
      *            are propagated to the caller.
      * @return The ConsoleAppender.
-     * @deprecated Use {@link #createAppender(Layout, Filter, Target, String, boolean, boolean, boolean)}.
+     * @deprecated Use {@link #newBuilder()}.
      */
     @Deprecated
     public static ConsoleAppender createAppender(Layout<? extends Serializable> layout,
@@ -122,17 +123,18 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
      * @param ignoreExceptions If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise they
      *            are propagated to the caller.
      * @return The ConsoleAppender.
+     * @deprecated Use {@link #newBuilder()}.
      */
-    @PluginFactory
+    @Deprecated
     public static ConsoleAppender createAppender(
             // @formatter:off
-            @PluginElement("Layout") Layout<? extends Serializable> layout,
-            @PluginElement("Filter") final Filter filter,
-            @PluginAttribute(value = "target") Target target,
-            @PluginAttribute("name") final String name,
-            @PluginAttribute(value = "follow", defaultBoolean = false) final boolean follow,
-            @PluginAttribute(value = "direct", defaultBoolean = false) final boolean direct,
-            @PluginAttribute(value = "ignoreExceptions", defaultBoolean = true) final boolean ignoreExceptions) {
+            Layout<? extends Serializable> layout,
+            final Filter filter,
+            Target target,
+            final String name,
+            final boolean follow,
+            final boolean direct,
+            final boolean ignoreExceptions) {
             // @formatter:on
         if (name == null) {
             LOGGER.error("No name provided for ConsoleAppender");
@@ -156,72 +158,40 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
     }
 
     @PluginBuilderFactory
-    public static Builder newBuilder() {
-        return new Builder();
+    public static <B extends Builder<B>> B newBuilder() {
+        return new Builder<B>().asBuilder();
     }
 
     /**
      * Builds ConsoleAppender instances.
+     * @param <B> This builder class
      */
-    public static class Builder implements org.apache.logging.log4j.core.util.Builder<ConsoleAppender> {
-
-        @PluginElement("Layout")
-        @Required
-        private Layout<? extends Serializable> layout = PatternLayout.createDefaultLayout();
-
-        @PluginElement("Filter")
-        private Filter filter;
+    public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B>
+            implements org.apache.logging.log4j.core.util.Builder<ConsoleAppender> {
 
         @PluginBuilderAttribute
         @Required
         private Target target = DEFAULT_TARGET;
 
         @PluginBuilderAttribute
-        @Required
-        private String name;
-
-        @PluginBuilderAttribute
         private boolean follow;
 
         @PluginBuilderAttribute
         private boolean direct;
 
-        @PluginBuilderAttribute
-        private boolean ignoreExceptions = true;
-
-        public Builder setLayout(final Layout<? extends Serializable> aLayout) {
-            this.layout = aLayout;
-            return this;
-        }
-
-        public Builder setFilter(final Filter aFilter) {
-            this.filter = aFilter;
-            return this;
-        }
-
-        public Builder setTarget(final Target aTarget) {
+        public B setTarget(final Target aTarget) {
             this.target = aTarget;
-            return this;
+            return asBuilder();
         }
 
-        public Builder setName(final String aName) {
-            this.name = aName;
-            return this;
-        }
-
-        public Builder setFollow(final boolean shouldFollow) {
+        public B setFollow(final boolean shouldFollow) {
             this.follow = shouldFollow;
-            return this;
+            return asBuilder();
         }
 
-        public Builder setDirect(final boolean shouldDirect) {
+        public B setDirect(final boolean shouldDirect) {
             this.direct = shouldDirect;
-            return this;
-        }
-
-        public Builder setIgnoreExceptions(final boolean shouldIgnoreExceptions) {
-            this.ignoreExceptions = shouldIgnoreExceptions;
-            return this;
+            return asBuilder();
         }
 
         @Override
@@ -229,7 +199,9 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
             if (follow && direct) {
                 throw new IllegalArgumentException("Cannot use both follow and direct on ConsoleAppender");
             }
-            return new ConsoleAppender(name, layout, filter, getManager(target, follow, direct, layout), ignoreExceptions, target);
+            Layout<? extends Serializable> layout = getOrCreateLayout();
+            return new ConsoleAppender(getName(), layout, getFilter(), getManager(target, follow, direct, layout),
+                    isIgnoreExceptions(), target);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2207cae2/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
index 140a735..e57b58d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
@@ -21,6 +21,7 @@ import java.util.Iterator;
 import org.apache.logging.log4j.core.AbstractLifeCycle;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.plugins.PluginElement;
 
 /**
  * Enhances a Class by allowing it to contain Filters.
@@ -28,6 +29,32 @@ import org.apache.logging.log4j.core.LogEvent;
 public abstract class AbstractFilterable extends AbstractLifeCycle implements Filterable {
 
     /**
+     * Subclasses can extend this abstract Builder. 
+     * 
+     * @param <B> This builder class.
+     */
+    public abstract static class Builder<B extends Builder<B>> {
+
+        @PluginElement("Filter")
+        private Filter filter;
+
+        public Filter getFilter() {
+            return filter;
+        }
+
+        @SuppressWarnings("unchecked")
+        public B asBuilder() {
+            return (B) this;
+        }
+
+        public B withFilter(Filter filter) {
+            this.filter = filter;
+            return asBuilder();
+        }
+
+    }
+    
+    /**
      * May be null.
      */
     private volatile Filter filter;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2207cae2/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
index 9190359..80d024d 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
@@ -98,8 +98,8 @@ public class ConsoleAppenderTest {
             mocks.replayAll();
             systemSetter.systemSet(psMock);
             final Layout<String> layout = PatternLayout.newBuilder().withAlwaysWriteExceptions(true).build();
-            final ConsoleAppender app = ConsoleAppender.createAppender(layout, null, targetName, "Console", false, false,
-                    false);
+            final ConsoleAppender app = ConsoleAppender.newBuilder().withLayout(layout).setTarget(targetName)
+                    .withName("Console").withIgnoreExceptions(false).build();
             app.start();
             assertTrue("Appender did not start", app.isStarted());
 
@@ -131,7 +131,7 @@ public class ConsoleAppenderTest {
 
     private void testFollowSystemPrintStream(final PrintStream ps, final Target target, final SystemSetter systemSetter) {
         final ConsoleAppender app = ConsoleAppender.newBuilder().setTarget(target).setFollow(true)
-                .setIgnoreExceptions(false).build();
+                .withIgnoreExceptions(false).build();
         Assert.assertEquals(target, app.getTarget());
         app.start();
         try {


[25/50] logging-log4j2 git commit: [LOG4J2-1505] Create a Builder for FileAppender.

Posted by rp...@apache.org.
[LOG4J2-1505] Create a Builder for FileAppender.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 06022018216a54d950ae34afa03f8786f6878f23
Parents: 1b5bcb9
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 12:00:09 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 12:00:09 2016 -0700

----------------------------------------------------------------------
 .../log4j/core/appender/FileAppender.java       | 390 ++++++++++++-------
 .../log4j/core/appender/FileAppenderTest.java   |  59 ++-
 .../core/appender/OutputStreamAppenderTest.java |  14 +-
 .../core/config/CustomConfigurationTest.java    |  13 +-
 src/changes/changes.xml                         |   3 +
 5 files changed, 327 insertions(+), 152 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/06022018/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
index b4eb6f6..3f364cc 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
@@ -24,10 +24,10 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.config.Configuration;
 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.PluginConfiguration;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.net.Advertiser;
 import org.apache.logging.log4j.core.util.Booleans;
@@ -39,43 +39,213 @@ import org.apache.logging.log4j.core.util.Integers;
 @Plugin(name = "File", category = "Core", elementType = "appender", printObject = true)
 public final class FileAppender extends AbstractOutputStreamAppender<FileManager> {
 
-    static final int DEFAULT_BUFFER_SIZE = 8192;
-    private final String fileName;
-    private final Advertiser advertiser;
-    private Object advertisement;
+    /**
+     * Builds FileAppender instances.
+     */
+    public static class Builder implements org.apache.logging.log4j.core.util.Builder<FileAppender> {
 
-    private FileAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
-            final FileManager manager, final String filename, final boolean ignoreExceptions,
-            final boolean immediateFlush, final Advertiser advertiser) {
+        @PluginBuilderAttribute
+        private String fileName;
 
-        super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
-        if (advertiser != null) {
-            final Map<String, String> configuration = new HashMap<>(layout.getContentFormat());
-            configuration.putAll(manager.getContentFormat());
-            configuration.put("contentType", layout.getContentType());
-            configuration.put("name", name);
-            advertisement = advertiser.advertise(configuration);
+        @PluginBuilderAttribute
+        private boolean append = true;
+
+        @PluginBuilderAttribute
+        private boolean locking;
+
+        @PluginBuilderAttribute
+        private String name;
+
+        @PluginBuilderAttribute
+        private boolean immediateFlush = true;
+
+        @PluginBuilderAttribute
+        private boolean ignoreExceptions = true;
+
+        @PluginBuilderAttribute
+        private boolean bufferedIo = true;
+
+        @PluginBuilderAttribute
+        private int bufferSize = DEFAULT_BUFFER_SIZE;
+
+        @PluginElement("Layout")
+        private Layout<? extends Serializable> layout;
+
+        @PluginElement("Filter")
+        private Filter filter;
+
+        @PluginBuilderAttribute
+        private boolean advertise;
+
+        @PluginBuilderAttribute
+        private String advertiseUri;
+
+        @PluginBuilderAttribute
+        private boolean lazyCreate;
+
+        @PluginConfiguration
+        private Configuration config;
+
+        @Override
+        public FileAppender build() {
+            if (locking && bufferedIo) {
+                LOGGER.warn("Locking and buffering are mutually exclusive. No buffering will occur for {}", fileName);
+                bufferedIo = false;
+            }
+            if (!bufferedIo && bufferSize > 0) {
+                LOGGER.warn("The bufferSize is set to {} but bufferedIo is not true: {}", bufferSize, bufferedIo);
+            }
+            if (name == null) {
+                LOGGER.error("No name provided for FileAppender");
+                return null;
+            }
+            if (fileName == null) {
+                LOGGER.error("No filename provided for FileAppender with name {}", name);
+                return null;
+            }
+            if (layout == null) {
+                layout = PatternLayout.createDefaultLayout();
+            }
+
+            final FileManager manager = FileManager.getFileManager(fileName, append, locking, bufferedIo, lazyCreate,
+                    advertiseUri, layout, bufferSize, immediateFlush);
+            if (manager == null) {
+                return null;
+            }
+
+            return new FileAppender(name, layout, filter, manager, fileName, ignoreExceptions,
+                    !bufferedIo || immediateFlush, advertise ? config.getAdvertiser() : null);
         }
-        this.fileName = filename;
-        this.advertiser = advertiser;
-    }
 
-    @Override
-    public void stop() {
-        super.stop();
-        if (advertiser != null) {
-            advertiser.unadvertise(advertisement);
+        public String getAdvertiseUri() {
+            return advertiseUri;
         }
-    }
 
-    /**
-     * Returns the file name this appender is associated with.
-     * @return The File name.
-     */
-    public String getFileName() {
-        return this.fileName;
-    }
+        public int getBufferSize() {
+            return bufferSize;
+        }
+
+        public Configuration getConfig() {
+            return config;
+        }
+
+        public String getFileName() {
+            return fileName;
+        }
+
+        public Filter getFilter() {
+            return filter;
+        }
+
+        public Layout<? extends Serializable> getLayout() {
+            return layout;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public boolean isAdvertise() {
+            return advertise;
+        }
+
+        public boolean isAppend() {
+            return append;
+        }
+
+        public boolean isBufferedIo() {
+            return bufferedIo;
+        }
+
+        public boolean isIgnoreExceptions() {
+            return ignoreExceptions;
+        }
+
+        public boolean isImmediateFlush() {
+            return immediateFlush;
+        }
+
+        public boolean isLazyCreate() {
+            return lazyCreate;
+        }
+
+        public boolean isLocking() {
+            return locking;
+        }
+
+        public Builder withAdvertise(final boolean advertise) {
+            this.advertise = advertise;
+            return this;
+        }
+
+        public Builder withAdvertiseUri(final String advertiseUri) {
+            this.advertiseUri = advertiseUri;
+            return this;
+        }
 
+        public Builder withAppend(final boolean append) {
+            this.append = append;
+            return this;
+        }
+
+        public Builder withBufferedIo(final boolean bufferedIo) {
+            this.bufferedIo = bufferedIo;
+            return this;
+        }
+
+        public Builder withBufferSize(final int bufferSize) {
+            this.bufferSize = bufferSize;
+            return this;
+        }
+
+        public Builder withConfig(final Configuration config) {
+            this.config = config;
+            return this;
+        }
+
+        public Builder withFileName(final String fileName) {
+            this.fileName = fileName;
+            return this;
+        }
+
+        public Builder withFilter(final Filter filter) {
+            this.filter = filter;
+            return this;
+        }
+
+        public Builder withIgnoreExceptions(final boolean ignoreExceptions) {
+            this.ignoreExceptions = ignoreExceptions;
+            return this;
+        }
+
+        public Builder withImmediateFlush(final boolean immediateFlush) {
+            this.immediateFlush = immediateFlush;
+            return this;
+        }
+
+        public Builder withLayout(final Layout<? extends Serializable> layout) {
+            this.layout = layout;
+            return this;
+        }
+
+        public Builder withLazyCreate(final boolean lazyCreate) {
+            this.lazyCreate = lazyCreate;
+            return this;
+        }
+
+        public Builder withLocking(final boolean locking) {
+            this.locking = locking;
+            return this;
+        }
+
+        public Builder withName(final String name) {
+            this.name = name;
+            return this;
+        }
+    }
+    
+    private static final int DEFAULT_BUFFER_SIZE = 8192;
+    
     /**
      * Create a File Appender.
      * @param fileName The name and path of the file.
@@ -96,7 +266,7 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
      * @param advertiseUri The advertised URI which can be used to retrieve the file contents.
      * @param config The Configuration
      * @return The FileAppender.
-     * @deprecated Use {@link #createAppender(String, boolean, boolean, String, String, String, boolean, String, Layout<? extends Serializable>, Filter, String, String, boolean, Configuration)}
+     * @deprecated Use {@link #newBuilder()}
      */
     @Deprecated
     public static FileAppender createAppender(
@@ -109,119 +279,71 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             final String ignore,
             final String bufferedIo,
             final String bufferSizeStr,
-            Layout<? extends Serializable> layout,
+            final Layout<? extends Serializable> layout,
             final Filter filter,
             final String advertise,
             final String advertiseUri,
             final Configuration config) {
+        return newBuilder()
+            .withAdvertise(Boolean.parseBoolean(advertise))
+            .withAdvertiseUri(advertiseUri)
+            .withAppend(Booleans.parseBoolean(append, true))
+            .withBufferedIo(Booleans.parseBoolean(bufferedIo, true))
+            .withBufferSize(Integers.parseInt(bufferSizeStr, DEFAULT_BUFFER_SIZE))
+            .withConfig(config)
+            .withFileName(fileName)
+            .withFilter(filter)
+            .withIgnoreExceptions(Booleans.parseBoolean(ignore, true))
+            .withImmediateFlush(Booleans.parseBoolean(immediateFlush, true))
+            .withLayout(layout)
+            .withLocking(Boolean.parseBoolean(locking))
+            .withName(name)
+            .build();
         // @formatter:on
-        final boolean isAppend = Booleans.parseBoolean(append, true);
-        final boolean isLocking = Boolean.parseBoolean(locking);
-        boolean isBuffered = Booleans.parseBoolean(bufferedIo, true);
-        final boolean isAdvertise = Boolean.parseBoolean(advertise);
-        if (isLocking && isBuffered) {
-            if (bufferedIo != null) {
-                LOGGER.warn("Locking and buffering are mutually exclusive. No buffering will occur for " + fileName);
-            }
-            isBuffered = false;
-        }
-        final int bufferSize = Integers.parseInt(bufferSizeStr, DEFAULT_BUFFER_SIZE);
-        if (!isBuffered && bufferSize > 0) {
-            LOGGER.warn("The bufferSize is set to {} but bufferedIO is not true: {}", bufferSize, bufferedIo);
-        }
-        final boolean isFlush = Booleans.parseBoolean(immediateFlush, true);
-        final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
+    }
+    
+    @PluginBuilderFactory
+    public static Builder newBuilder() {
+        return new Builder();
+    }
+    
+    private final String fileName;
 
-        if (name == null) {
-            LOGGER.error("No name provided for FileAppender");
-            return null;
-        }
+    private final Advertiser advertiser;
 
-        if (fileName == null) {
-            LOGGER.error("No filename provided for FileAppender with name "  + name);
-            return null;
-        }
-        if (layout == null) {
-            layout = PatternLayout.createDefaultLayout();
-        }
+    private final Object advertisement;
 
-        final FileManager manager = FileManager.getFileManager(fileName, isAppend, isLocking, isBuffered, false,
-                advertiseUri, layout, bufferSize, isFlush);
-        if (manager == null) {
-            return null;
-        }
+    private FileAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
+            final FileManager manager, final String filename, final boolean ignoreExceptions,
+            final boolean immediateFlush, final Advertiser advertiser) {
 
-        return new FileAppender(name, layout, filter, manager, fileName, ignoreExceptions, !isBuffered || isFlush,
-                isAdvertise ? config.getAdvertiser() : null);
+        super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
+        if (advertiser != null) {
+            final Map<String, String> configuration = new HashMap<>(layout.getContentFormat());
+            configuration.putAll(manager.getContentFormat());
+            configuration.put("contentType", layout.getContentType());
+            configuration.put("name", name);
+            advertisement = advertiser.advertise(configuration);
+        } else {
+            advertisement = null;
+        }
+        this.fileName = filename;
+        this.advertiser = advertiser;
     }
 
     /**
-     * Create a File Appender.
-     * @param fileName The name and path of the file.
-     * @param append "True" if the file should be appended to, "false" if it should be overwritten.
-     * The default is "true".
-     * @param locking "True" if the file should be locked. The default is "false".
-     * @param name The name of the Appender.
-     * @param immediateFlush "true" if the contents should be flushed on every write, "false" otherwise. The default
-     * is "true".
-     * @param ignoreExceptions If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise
-     *               they are propagated to the caller.
-     * @param bufferedIo "true" if I/O should be buffered, "false" otherwise. The default is "true".
-     * @param bufferSize buffer size for buffered IO (default is 8192).
-     * @param layout The layout to use to format the event. If no layout is provided the default PatternLayout
-     * will be used.
-     * @param filter The filter, if any, to use.
-     * @param advertise "true" if the appender configuration should be advertised, "false" otherwise.
-     * @param advertiseUri The advertised URI which can be used to retrieve the file contents.
-     * @param lazyCreate true if you want to lazy-create the file (a.k.a. on-demand.)
-     * @param config The Configuration
-     * @return The FileAppender.
-     * @since 2.7
+     * Returns the file name this appender is associated with.
+     * @return The File name.
      */
-    @PluginFactory
-    public static FileAppender createAppender(
-            // @formatter:off
-            @PluginAttribute("fileName") final String fileName,
-            @PluginAttribute(value = "append", defaultBoolean = true) final boolean append,
-            @PluginAttribute("locking") final boolean locking,
-            @PluginAttribute("name") final String name,
-            @PluginAttribute(value = "immediateFlush", defaultBoolean = true) final boolean immediateFlush,
-            @PluginAttribute(value = "ignoreExceptions", defaultBoolean = true) final boolean ignoreExceptions,
-            @PluginAttribute(value = "bufferedIo", defaultBoolean = true) boolean bufferedIo,
-            @PluginAttribute(value = "bufferSize", defaultInt = DEFAULT_BUFFER_SIZE) final int bufferSize,
-            @PluginElement("Layout") Layout<? extends Serializable> layout,
-            @PluginElement("Filter") final Filter filter,
-            @PluginAttribute("advertise") final boolean advertise,
-            @PluginAttribute("advertiseUri") final String advertiseUri,
-            @PluginAttribute("lazyCreate") final boolean lazyCreate,
-            @PluginConfiguration final Configuration config) {
-             // @formatter:on
-        if (locking && bufferedIo) {
-            LOGGER.warn("Locking and buffering are mutually exclusive. No buffering will occur for {}", fileName);
-            bufferedIo = false;
-        }
-        if (!bufferedIo && bufferSize > 0) {
-            LOGGER.warn("The bufferSize is set to {} but bufferedIo is not true: {}", bufferSize, bufferedIo);
-        }
-        if (name == null) {
-            LOGGER.error("No name provided for FileAppender");
-            return null;
-        }
-        if (fileName == null) {
-            LOGGER.error("No filename provided for FileAppender with name {}", name);
-            return null;
-        }
-        if (layout == null) {
-            layout = PatternLayout.createDefaultLayout();
-        }
-
-        final FileManager manager = FileManager.getFileManager(fileName, append, locking, bufferedIo, lazyCreate,
-                advertiseUri, layout, bufferSize, immediateFlush);
-        if (manager == null) {
-            return null;
-        }
-
-        return new FileAppender(name, layout, filter, manager, fileName, ignoreExceptions, !bufferedIo || immediateFlush,
-                advertise ? config.getAdvertiser() : null);
+    public String getFileName() {
+        return this.fileName;
+    }
+
+    @Override
+    public void stop() {
+        super.stop();
+        if (advertiser != null) {
+            advertiser.unadvertise(advertisement);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/06022018/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
index 8a9603c..b706c31 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
@@ -33,6 +33,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
@@ -89,10 +90,19 @@ public class FileAppenderTest {
 
     @Test
     public void testLazyCreate() throws Exception {
-        final Layout<String> layout = PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
-                .build();
-        final FileAppender appender = FileAppender.createAppender(FILE_NAME, true, false, "test", false, false, false,
-                1, layout, null, false, null, lazyCreate, null);
+        final Layout<String> layout = createPatternLayout();
+        // @formatter:off
+        final FileAppender appender = FileAppender.newBuilder()
+            .withFileName(FILE_NAME)
+            .withName("test")
+            .withImmediateFlush(false)
+            .withIgnoreExceptions(false)
+            .withBufferedIo(false)
+            .withBufferSize(1)
+            .withLayout(layout)
+            .withLazyCreate(lazyCreate)
+            .build();
+        // @formatter:on
         Assert.assertEquals(lazyCreate, appender.getManager().isLazyCreate());
         try {
             Assert.assertNotEquals(lazyCreate, Files.exists(PATH));
@@ -104,12 +114,26 @@ public class FileAppenderTest {
         Assert.assertNotEquals(lazyCreate, Files.exists(PATH));
     }
 
+    private static PatternLayout createPatternLayout() {
+        return PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
+                .build();
+    }
+
     @Test
     public void testSmallestBufferSize() throws Exception {
-        final Layout<String> layout = PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
-                .build();
-        final FileAppender appender = FileAppender.createAppender(FILE_NAME, true, false, "test", false, false, false,
-                1, layout, null, false, null, lazyCreate, null);
+        final Layout<String> layout = createPatternLayout();
+        // @formatter:off
+        final FileAppender appender = FileAppender.newBuilder()
+            .withFileName(FILE_NAME)
+            .withName("test")
+            .withImmediateFlush(false)
+            .withIgnoreExceptions(false)
+            .withBufferedIo(false)
+            .withBufferSize(1)
+            .withLayout(layout)
+            .withLazyCreate(lazyCreate)
+            .build();
+        // @formatter:on
         try {
             appender.start();
             final File file = new File(FILE_NAME);
@@ -204,12 +228,21 @@ public class FileAppenderTest {
         verifyFile(logEventCount * processCount);
     }
 
-    private static void writer(final boolean lock, final int logEventCount, final String name, boolean lazyCreate,
+    private static void writer(final boolean locking, final int logEventCount, final String name, boolean lazyCreate,
             boolean concurrent) throws Exception {
-        final Layout<String> layout = PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
-                .build();
-        final FileAppender appender = FileAppender.createAppender(FILE_NAME, true, lock, "test", false, false, false,
-                FileAppender.DEFAULT_BUFFER_SIZE, layout, null, false, null, lazyCreate, null);
+        final Layout<String> layout = createPatternLayout();
+        // @formatter:off
+        final FileAppender appender = FileAppender.newBuilder()
+            .withFileName(FILE_NAME)
+            .withName("test")
+            .withImmediateFlush(false)
+            .withIgnoreExceptions(false)
+            .withLocking(locking)
+            .withBufferedIo(false)
+            .withLayout(layout)
+            .withLazyCreate(lazyCreate)
+            .build();
+        // @formatter:on
         Assert.assertEquals(lazyCreate, appender.getManager().isLazyCreate());
         try {
             appender.start();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/06022018/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
index dd17dfb..845f88f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
@@ -92,9 +92,17 @@ public class OutputStreamAppenderTest {
     public void testUpdatePatternWithFileAppender() {
         final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
         final Configuration config = ctx.getConfiguration();
-        final Layout<?> layout = PatternLayout.createDefaultLayout();
-        final Appender appender = FileAppender.createAppender("target/" + getClass().getName() + ".log", false,
-                false, "File", true, false, false, 4000, layout, null, false, null, false, config);
+        // @formatter:off
+        final Appender appender = FileAppender.newBuilder()
+            .withFileName("target/" + getClass().getName() + ".log")
+            .withAppend(false)
+            .withName("File")
+            .withIgnoreExceptions(false)
+            .withBufferedIo(false)
+            .withBufferSize(4000)
+            .withConfig(config)
+            .build();
+        // @formatter:on
         appender.start();
         config.addAppender(appender);
         ConfigurationTestUtils.updateLoggers(appender, config);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/06022018/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
index 6888204..6c7b5f0 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
@@ -80,8 +80,17 @@ public class CustomConfigurationTest {
             .withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
             .withConfiguration(config)
             .build();
-        final Appender appender = FileAppender.createAppender(LOG_FILE, false, false, "File", true,
-            false, false, 4000, layout, null, false, null, false, config);
+        // @formatter:off
+        final FileAppender appender = FileAppender.newBuilder()
+            .withFileName(LOG_FILE)
+            .withAppend(false)
+            .withName("File")
+            .withIgnoreExceptions(false)
+            .withBufferSize(4000)
+            .withBufferedIo(false)
+            .withLayout(layout)
+            .build();
+        // @formatter:on
         appender.start();
         config.addAppender(appender);
         final AppenderRef ref = AppenderRef.createAppenderRef("File", null, null);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/06022018/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 922aef0..ad03663 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -72,6 +72,9 @@
       <action issue="LOG4J2-1458" dev="ggregory" type="add" due-to="Gary Gregory">
         [PatternLayout] Add an ANSI option to %message.
       </action>
+      <action issue="LOG4J2-1505" dev="ggregory" type="add" due-to="Gary Gregory">
+        Create a Builder for FileAppender.
+      </action>
       <action issue="LOG4J2-1458" dev="ggregory" type="update" due-to="Gary Gregory">
         Update Jackson from 2.7.5 to 2.8.0.
       </action>


[45/50] logging-log4j2 git commit: Unnecessary semicolon.

Posted by rp...@apache.org.
Unnecessary semicolon.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 3fde6e792a2c69cb679a685c257d08103ddf3b6e
Parents: 7b973ef
Author: Gary Gregory <gg...@apache.org>
Authored: Thu Aug 11 14:56:26 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Thu Aug 11 14:56:26 2016 -0700

----------------------------------------------------------------------
 .../log4j/core/appender/rolling/DefaultRolloverStrategy.java       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3fde6e79/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
index dd1f42c..ab31f30 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/DefaultRolloverStrategy.java
@@ -169,7 +169,7 @@ public class DefaultRolloverStrategy implements RolloverStrategy {
         File target(final String fileName) {
             return new File(fileName);
         }
-    };
+    }
 
     /**
      * Allow subclasses access to the status logger without creating another instance.


[33/50] logging-log4j2 git commit: Javadoc: Use the active voice.

Posted by rp...@apache.org.
Javadoc: Use the active voice.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 4eae71ba75f6b4a147076af0eafeb8b13ddd9a61
Parents: a80ec9d
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 17:16:48 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 17:16:48 2016 -0700

----------------------------------------------------------------------
 .../java/org/apache/logging/log4j/core/config/AppendersPlugin.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4eae71ba/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java
index fc939e9..e5ae0db 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java
@@ -34,7 +34,7 @@ public final class AppendersPlugin {
     }
 
     /**
-     * Create a Map of the Appenders.
+     * Creates a Map of the Appenders.
      * @param appenders An array of Appenders.
      * @return The Appender Map.
      */


[38/50] logging-log4j2 git commit: Add test case of a typed Builder (Builder).

Posted by rp...@apache.org.
Add test case of a typed Builder (Builder<T>).

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: f95a85b8dc87704a678f70e4f6c5061c67cf26c4
Parents: ba677d8
Author: Gary Gregory <gg...@apache.org>
Authored: Tue Aug 9 17:21:56 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Tue Aug 9 17:21:56 2016 -0700

----------------------------------------------------------------------
 .../ValidatingPluginWithTypedBuilder.java       | 70 +++++++++++++++++++
 .../ValidatingPluginWithTypedBuilderTest.java   | 71 ++++++++++++++++++++
 2 files changed, 141 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f95a85b8/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
new file mode 100644
index 0000000..9ebb85e
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithTypedBuilder.java
@@ -0,0 +1,70 @@
+/*
+ * 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.plugins.validation;
+
+import java.util.Objects;
+
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+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.PluginFactory;
+import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+
+/**
+ *
+ */
+@Plugin(name = "ValidatingPluginWithTypedBuilder", category = "Test")
+public class ValidatingPluginWithTypedBuilder {
+
+    private final String name;
+
+    public ValidatingPluginWithTypedBuilder(final String name) {
+        this.name = Objects.requireNonNull(name, "name");
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @PluginFactory
+    public static ValidatingPluginWithTypedBuilder newValidatingPlugin(
+        @Required(message = "The name given by the factory is null") final String name) {
+        return new ValidatingPluginWithTypedBuilder(name);
+    }
+
+    @PluginBuilderFactory
+    public static Builder<Integer> newBuilder() {
+        return new Builder<>();
+    }
+
+    public static class Builder<T> implements org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithTypedBuilder> {
+
+        @PluginBuilderAttribute
+        @Required(message = "The name given by the builder is null")
+        private String name;
+
+        public Builder<T> withName(final String name) {
+            this.name = name;
+            return this;
+        }
+
+        @Override
+        public ValidatingPluginWithTypedBuilder build() {
+            return new ValidatingPluginWithTypedBuilder(name);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f95a85b8/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithTypedBuilderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithTypedBuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithTypedBuilderTest.java
new file mode 100644
index 0000000..ae236b4
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithTypedBuilderTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.plugins.validation.validators;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.core.config.NullConfiguration;
+import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
+import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
+import org.apache.logging.log4j.core.config.plugins.util.PluginType;
+import org.apache.logging.log4j.core.config.plugins.validation.ValidatingPluginWithTypedBuilder;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ValidatingPluginWithTypedBuilderTest {
+
+    private PluginType<ValidatingPluginWithTypedBuilder> plugin;
+    private Node node;
+
+    @SuppressWarnings("unchecked")
+    @Before
+    public void setUp() throws Exception {
+        final PluginManager manager = new PluginManager("Test");
+        manager.collectPlugins();
+        plugin = (PluginType<ValidatingPluginWithTypedBuilder>) manager
+                .getPluginType("ValidatingPluginWithTypedBuilder");
+        assertNotNull("Rebuild this module to make sure annotaion processing kicks in.", plugin);
+        node = new Node(null, "Validator", plugin);
+    }
+
+    @Test
+    public void testNullDefaultValue() throws Exception {
+        // @formatter:off
+        final ValidatingPluginWithTypedBuilder validatingPlugin = (ValidatingPluginWithTypedBuilder) 
+                new PluginBuilder(plugin).
+                withConfiguration(new NullConfiguration()).
+                withConfigurationNode(node).build();
+        // @formatter:on
+        assertNull(validatingPlugin);
+    }
+
+    @Test
+    public void testNonNullValue() throws Exception {
+        node.getAttributes().put("name", "foo");
+        // @formatter:off
+        final ValidatingPluginWithTypedBuilder validatingPlugin = (ValidatingPluginWithTypedBuilder) 
+                new PluginBuilder(plugin).
+                withConfiguration(new NullConfiguration()).
+                withConfigurationNode(node).build();
+        // @formatter:on
+        assertNotNull(validatingPlugin);
+        assertEquals("foo", validatingPlugin.getName());
+    }
+}


[30/50] logging-log4j2 git commit: Revert.

Posted by rp...@apache.org.
Revert.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: eee314cdb3eb189a3b0f7d9e239e3e6b303bcb37
Parents: 4b4a07b
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 13:52:21 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 13:52:21 2016 -0700

----------------------------------------------------------------------
 .../core/appender/rolling/OnStartupTriggeringPolicyTest.java      | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/eee314cd/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
index b21a7e7..c809ddb 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
@@ -28,6 +28,7 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.util.datetime.FastDateFormat;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -67,7 +68,7 @@ public class OnStartupTriggeringPolicyTest {
                 configuration);
         final OnStartupTriggeringPolicy policy = OnStartupTriggeringPolicy.createPolicy(1);
         final RollingFileManager manager = RollingFileManager.getFileManager(TARGET_FILE, TARGET_PATTERN, true, false,
-                policy, strategy, null, layout, 8192, true, false);
+                policy, strategy, null, layout, 8192, true);
         try {
             manager.initialize();
             assertTrue(Files.exists(target));


[16/50] logging-log4j2 git commit: Javadoc. Clean up formatting.

Posted by rp...@apache.org.
Javadoc. Clean up formatting.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 69f02bd8a38ed3a31a17274969b63b105eb2c910
Parents: 262f30d
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 09:25:05 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 09:25:05 2016 -0700

----------------------------------------------------------------------
 .../apache/logging/log4j/core/appender/rolling/FileSizeTest.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/69f02bd8/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/FileSizeTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/FileSizeTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/FileSizeTest.java
index 4b7b6bb..8121ce7 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/FileSizeTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/FileSizeTest.java
@@ -20,14 +20,14 @@ import org.junit.Test;
 import static org.junit.Assert.*;
 
 /**
- *
+ * Tests {@link FileSize}.
  */
 public class FileSizeTest {
 
     private final static long EXPECTED = 10 * 1024;
+    
     @Test
     public void testFileSize() throws Exception {
-
         long value = FileSize.parse("10KB", 0);
         assertTrue("unexpected value " + value, value == EXPECTED);
         value = FileSize.parse("10 KB", 0);


[14/50] logging-log4j2 git commit: [LOG4J2-1501] FileAppender should be able to create files lazily.

Posted by rp...@apache.org.
[LOG4J2-1501] FileAppender should be able to create files lazily.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: e718a64d5a4dec9108c369fc11370f03734177ea
Parents: 8ff0863
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 09:15:14 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 09:15:14 2016 -0700

----------------------------------------------------------------------
 .../log4j/core/appender/FileAppender.java       | 26 ++++++++++----------
 1 file changed, 13 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e718a64d/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
index a69758b..b4eb6f6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
@@ -101,19 +101,19 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
     @Deprecated
     public static FileAppender createAppender(
             // @formatter:off
-            @PluginAttribute("fileName") final String fileName,
-            @PluginAttribute("append") final String append,
-            @PluginAttribute("locking") final String locking,
-            @PluginAttribute("name") final String name,
-            @PluginAttribute("immediateFlush") final String immediateFlush,
-            @PluginAttribute("ignoreExceptions") final String ignore,
-            @PluginAttribute("bufferedIo") final String bufferedIo,
-            @PluginAttribute("bufferSize") final String bufferSizeStr,
-            @PluginElement("Layout") Layout<? extends Serializable> layout,
-            @PluginElement("Filter") final Filter filter,
-            @PluginAttribute("advertise") final String advertise,
-            @PluginAttribute("advertiseUri") final String advertiseUri,
-            @PluginConfiguration final Configuration config) {
+            final String fileName,
+            final String append,
+            final String locking,
+            final String name,
+            final String immediateFlush,
+            final String ignore,
+            final String bufferedIo,
+            final String bufferSizeStr,
+            Layout<? extends Serializable> layout,
+            final Filter filter,
+            final String advertise,
+            final String advertiseUri,
+            final Configuration config) {
         // @formatter:on
         final boolean isAppend = Booleans.parseBoolean(append, true);
         final boolean isLocking = Boolean.parseBoolean(locking);


[04/50] logging-log4j2 git commit: Do not go through the delete retry loop if a file or folder does not exist.

Posted by rp...@apache.org.
Do not go through the delete retry loop if a file or folder does not
exist.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: a3b5f73a6e08e9d91ba1a82f22727213c7382e46
Parents: cc284d1
Author: Gary Gregory <gg...@apache.org>
Authored: Sun Aug 7 11:19:37 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Sun Aug 7 11:19:37 2016 -0700

----------------------------------------------------------------------
 .../apache/logging/log4j/junit/CleanFiles.java  | 26 +++++++++++---------
 .../logging/log4j/junit/CleanFolders.java       | 24 +++++++++---------
 2 files changed, 27 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a3b5f73a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
index 5de9c63..1021bf1 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
@@ -47,19 +47,21 @@ public class CleanFiles extends AbstractExternalFileCleaner {
     @Override
     protected void clean() {
         for (final File file : getFiles()) {
-            for (int i = 0; i < MAX_TRIES; i++) {
-                try {
-                    if (Files.deleteIfExists(file.toPath())) {
-                        // Break from MAX_TRIES and move on to the next file.
-                        break;
+            if (file.exists()) {
+                for (int i = 0; i < MAX_TRIES; i++) {
+                    try {
+                        if (Files.deleteIfExists(file.toPath())) {
+                            // Break from MAX_TRIES and move on to the next file.
+                            break;
+                        }
+                    } catch (final IOException e) {
+                        Assert.fail(file + ": " + e.toString());
+                    }
+                    try {
+                        Thread.sleep(200);
+                    } catch (final InterruptedException ignored) {
+                        // ignore
                     }
-                } catch (final IOException e) {
-                    Assert.fail(file + ": " + e.toString());
-                }
-                try {
-                    Thread.sleep(200);
-                } catch (final InterruptedException ignored) {
-                    // ignore
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a3b5f73a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
index a3c84c0..6a2f8d6 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
@@ -55,18 +55,20 @@ public class CleanFolders extends AbstractExternalFileCleaner {
         Map<Path, IOException> failures = new HashMap<>();
 
         for (final File folder : getFiles()) {
-            final Path path = folder.toPath();
-            for (int i = 0; i < MAX_TRIES; i++) {
-                try {
-                    cleanFolder(path);
-                    if (failures.containsKey(path)) {
-                        failures.remove(path);
+            if (folder.exists()) {
+                final Path path = folder.toPath();
+                for (int i = 0; i < MAX_TRIES; i++) {
+                    try {
+                        cleanFolder(path);
+                        if (failures.containsKey(path)) {
+                            failures.remove(path);
+                        }
+                        // break from MAX_TRIES and goes to the next folder
+                        break;
+                    } catch (final IOException e) {
+                        // We will try again.
+                        failures.put(path, e);
                     }
-                    // break from MAX_TRIES and goes to the next folder
-                    break;
-                } catch (final IOException e) {
-                    // We will try again.
-                    failures.put(path, e);
                 }
             }
         }


[24/50] logging-log4j2 git commit: Fix commented out code.

Posted by rp...@apache.org.
Fix commented out code.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 1b5bcb9e1c7933463f2e45b3d7dcf5da3ea5600e
Parents: 93a9846
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 11:58:39 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 11:58:39 2016 -0700

----------------------------------------------------------------------
 .../appender/rolling/OnStartupTriggeringPolicyTest.java     | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1b5bcb9e/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
index 2047ae4..62f3f46 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
@@ -28,6 +28,9 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.util.datetime.FastDateFormat;
+import org.apache.logging.log4j.junit.CleanFiles;
+import org.apache.logging.log4j.junit.CleanFolders;
+import org.junit.Rule;
 import org.junit.Test;
 
 /**
@@ -42,8 +45,8 @@ public class OnStartupTriggeringPolicyTest {
     private static final String TEST_DATA = "Hello world!";
     private static final FastDateFormat formatter = FastDateFormat.getInstance("MM-dd-yyyy");
 
-    //@Rule
-    //public CleanFiles rule = new CleanFolders("target/rollOnStartup");
+    // @Rule
+    // public CleanFolders rule = new CleanFolders("target/rollOnStartup");
 
     @Test
     public void testPolicy() throws Exception {
@@ -67,7 +70,7 @@ public class OnStartupTriggeringPolicyTest {
                 configuration);
         final OnStartupTriggeringPolicy policy = OnStartupTriggeringPolicy.createPolicy(1);
         final RollingFileManager manager = RollingFileManager.getFileManager(TARGET_FILE, TARGET_PATTERN, true, false,
-                policy, strategy, null, layout, 8192, true);
+                policy, strategy, null, layout, 8192, true, false);
         try {
             manager.initialize();
             assertTrue(Files.exists(target));


[32/50] logging-log4j2 git commit: No need to initialize booleans to false.

Posted by rp...@apache.org.
No need to initialize booleans to false.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: a80ec9da0b4db12c5af5630dfb659573124b7367
Parents: 1558b36
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 16:29:32 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 16:29:32 2016 -0700

----------------------------------------------------------------------
 .../java/org/apache/logging/log4j/core/layout/PatternLayout.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a80ec9da/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index 8afc7fd..897be86 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -424,7 +424,7 @@ public final class PatternLayout extends AbstractStringLayout {
         private boolean alwaysWriteExceptions = true;
 
         @PluginBuilderAttribute
-        private boolean noConsoleNoAnsi = false;
+        private boolean noConsoleNoAnsi;
 
         @PluginBuilderAttribute
         private String header;


[36/50] logging-log4j2 git commit: Remove unused method.

Posted by rp...@apache.org.
Remove unused 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/2d40959a
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2d40959a
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2d40959a

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 2d40959a1ee273bc6e30fe62d1f8f4fe89fe3732
Parents: 9972ee5
Author: ggregory <gg...@US-L-GG02.rocketsoftware.com>
Authored: Tue Aug 9 10:21:15 2016 -0700
Committer: ggregory <gg...@US-L-GG02.rocketsoftware.com>
Committed: Tue Aug 9 10:21:15 2016 -0700

----------------------------------------------------------------------
 .../config/plugins/util/PluginManagerPackagesTest.java    | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2d40959a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/PluginManagerPackagesTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/PluginManagerPackagesTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/PluginManagerPackagesTest.java
index 2ebefe0..5808b10 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/PluginManagerPackagesTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/PluginManagerPackagesTest.java
@@ -16,6 +16,9 @@
  */
 package org.apache.logging.log4j.core.config.plugins.util;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -39,20 +42,13 @@ import org.apache.logging.log4j.core.config.Configurator;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.test.appender.ListAppender;
 import org.junit.AfterClass;
-import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.junit.Assert.*;
-
 public class PluginManagerPackagesTest {
     private static Configuration config;
     private static ListAppender listAppender;
     private static LoggerContext ctx;
 
-    @BeforeClass
-    public static void setupClass() {
-    }
-
     @AfterClass
     public static void cleanupClass() {
         System.clearProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY);


[13/50] logging-log4j2 git commit: Javadoc: Use the active voice.

Posted by rp...@apache.org.
Javadoc: Use the active voice.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 8ff086371372022700e6bee3da4088e51cd66874
Parents: 61f706f
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 08:52:58 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 08:52:58 2016 -0700

----------------------------------------------------------------------
 .../core/appender/RollingFileAppender.java      | 404 +++++++++----------
 1 file changed, 202 insertions(+), 202 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8ff08637/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
index 88bbb9a..2b06287 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
@@ -1,202 +1,202 @@
-/*
- * 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.appender;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.zip.Deflater;
-
-import org.apache.logging.log4j.core.Filter;
-import org.apache.logging.log4j.core.Layout;
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy;
-import org.apache.logging.log4j.core.appender.rolling.RollingFileManager;
-import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy;
-import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy;
-import org.apache.logging.log4j.core.config.Configuration;
-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.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
-import org.apache.logging.log4j.core.layout.PatternLayout;
-import org.apache.logging.log4j.core.net.Advertiser;
-import org.apache.logging.log4j.core.util.Booleans;
-import org.apache.logging.log4j.core.util.Integers;
-
-/**
- * An appender that writes to files and can roll over at intervals.
- */
-@Plugin(name = "RollingFile", category = "Core", elementType = "appender", printObject = true)
-public final class RollingFileAppender extends AbstractOutputStreamAppender<RollingFileManager> {
-
-    private static final int DEFAULT_BUFFER_SIZE = 8192;
-
-    private final String fileName;
-    private final String filePattern;
-    private Object advertisement;
-    private final Advertiser advertiser;
-
-    private RollingFileAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
-            final RollingFileManager manager, final String fileName, final String filePattern,
-            final boolean ignoreExceptions, final boolean immediateFlush, final Advertiser advertiser) {
-        super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
-        if (advertiser != null) {
-            final Map<String, String> configuration = new HashMap<>(layout.getContentFormat());
-            configuration.put("contentType", layout.getContentType());
-            configuration.put("name", name);
-            advertisement = advertiser.advertise(configuration);
-        }
-        this.fileName = fileName;
-        this.filePattern = filePattern;
-        this.advertiser = advertiser;
-    }
-
-    @Override
-    public void stop() {
-        super.stop();
-        if (advertiser != null) {
-            advertiser.unadvertise(advertisement);
-        }
-    }
-
-    /**
-     * Write the log entry rolling over the file when required.
-
-     * @param event The LogEvent.
-     */
-    @Override
-    public void append(final LogEvent event) {
-        getManager().checkRollover(event);
-        super.append(event);
-    }
-
-    /**
-     * Returns the File name for the Appender.
-     * @return The file name.
-     */
-    public String getFileName() {
-        return fileName;
-    }
-
-    /**
-     * Returns the file pattern used when rolling over.
-     * @return The file pattern.
-     */
-    public String getFilePattern() {
-        return filePattern;
-    }
-
-    /**
-     * Returns the triggering policy.
-     * @param <T> TriggeringPolicy type
-     * @return The TriggeringPolicy
-     */
-    public <T extends TriggeringPolicy> T getTriggeringPolicy() {
-        return getManager().getTriggeringPolicy();
-    }
-
-    /**
-     * Create a RollingFileAppender.
-     * @param fileName The name of the file that is actively written to. (required).
-     * @param filePattern The pattern of the file name to use on rollover. (required).
-     * @param append If true, events are appended to the file. If false, the file
-     * is overwritten when opened. Defaults to "true"
-     * @param name The name of the Appender (required).
-     * @param bufferedIO When true, I/O will be buffered. Defaults to "true".
-     * @param bufferSizeStr buffer size for buffered IO (default is 8192).
-     * @param immediateFlush When true, events are immediately flushed. Defaults to "true".
-     * @param policy The triggering policy. (required).
-     * @param strategy The rollover strategy. Defaults to DefaultRolloverStrategy.
-     * @param layout The layout to use (defaults to the default PatternLayout).
-     * @param filter The Filter or null.
-     * @param ignore If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise
-     *               they are propagated to the caller.
-     * @param advertise "true" if the appender configuration should be advertised, "false" otherwise.
-     * @param advertiseURI The advertised URI which can be used to retrieve the file contents.
-     * @param config The Configuration.
-     * @return A RollingFileAppender.
-     */
-    @PluginFactory
-    public static RollingFileAppender createAppender(
-            @PluginAttribute("fileName") final String fileName,
-            @PluginAttribute("filePattern") final String filePattern,
-            @PluginAttribute("append") final String append,
-            @PluginAttribute("name") final String name,
-            @PluginAttribute("bufferedIO") final String bufferedIO,
-            @PluginAttribute("bufferSize") final String bufferSizeStr,
-            @PluginAttribute("immediateFlush") final String immediateFlush,
-            @PluginElement("Policy") final TriggeringPolicy policy,
-            @PluginElement("Strategy") RolloverStrategy strategy,
-            @PluginElement("Layout") Layout<? extends Serializable> layout,
-            @PluginElement("Filter") final Filter filter,
-            @PluginAttribute("ignoreExceptions") final String ignore,
-            @PluginAttribute("advertise") final String advertise,
-            @PluginAttribute("advertiseURI") final String advertiseURI,
-            @PluginConfiguration final Configuration config) {
-
-        final boolean isAppend = Booleans.parseBoolean(append, true);
-        final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
-        final boolean isBuffered = Booleans.parseBoolean(bufferedIO, true);
-        final boolean isFlush = Booleans.parseBoolean(immediateFlush, true);
-        final boolean isAdvertise = Boolean.parseBoolean(advertise);
-        final int bufferSize = Integers.parseInt(bufferSizeStr, DEFAULT_BUFFER_SIZE);
-        if (!isBuffered && bufferSize > 0) {
-            LOGGER.warn("The bufferSize is set to {} but bufferedIO is not true: {}", bufferSize, bufferedIO);
-        }
-        if (name == null) {
-            LOGGER.error("No name provided for FileAppender");
-            return null;
-        }
-
-        if (fileName == null) {
-            LOGGER.error("No filename was provided for FileAppender with name "  + name);
-            return null;
-        }
-
-        if (filePattern == null) {
-            LOGGER.error("No filename pattern provided for FileAppender with name "  + name);
-            return null;
-        }
-
-        if (policy == null) {
-            LOGGER.error("A TriggeringPolicy must be provided");
-            return null;
-        }
-
-        if (strategy == null) {
-            strategy = DefaultRolloverStrategy.createStrategy(null, null, null,
-                    String.valueOf(Deflater.DEFAULT_COMPRESSION), null, true, config);
-        }
-
-        if (layout == null) {
-            layout = PatternLayout.createDefaultLayout();
-        }
-
-        final RollingFileManager manager = RollingFileManager.getFileManager(fileName, filePattern, isAppend,
-            isBuffered, policy, strategy, advertiseURI, layout, bufferSize, isFlush);
-        if (manager == null) {
-            return null;
-        }
-
-        manager.initialize();
-
-        return new RollingFileAppender(name, layout, filter, manager, fileName, filePattern,
-                ignoreExceptions, isFlush, isAdvertise ? config.getAdvertiser() : null);
-    }
-}
+/*
+ * 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.appender;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.zip.Deflater;
+
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy;
+import org.apache.logging.log4j.core.appender.rolling.RollingFileManager;
+import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy;
+import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy;
+import org.apache.logging.log4j.core.config.Configuration;
+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.PluginConfiguration;
+import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.core.net.Advertiser;
+import org.apache.logging.log4j.core.util.Booleans;
+import org.apache.logging.log4j.core.util.Integers;
+
+/**
+ * An appender that writes to files and can roll over at intervals.
+ */
+@Plugin(name = "RollingFile", category = "Core", elementType = "appender", printObject = true)
+public final class RollingFileAppender extends AbstractOutputStreamAppender<RollingFileManager> {
+
+    private static final int DEFAULT_BUFFER_SIZE = 8192;
+
+    private final String fileName;
+    private final String filePattern;
+    private Object advertisement;
+    private final Advertiser advertiser;
+
+    private RollingFileAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
+            final RollingFileManager manager, final String fileName, final String filePattern,
+            final boolean ignoreExceptions, final boolean immediateFlush, final Advertiser advertiser) {
+        super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
+        if (advertiser != null) {
+            final Map<String, String> configuration = new HashMap<>(layout.getContentFormat());
+            configuration.put("contentType", layout.getContentType());
+            configuration.put("name", name);
+            advertisement = advertiser.advertise(configuration);
+        }
+        this.fileName = fileName;
+        this.filePattern = filePattern;
+        this.advertiser = advertiser;
+    }
+
+    @Override
+    public void stop() {
+        super.stop();
+        if (advertiser != null) {
+            advertiser.unadvertise(advertisement);
+        }
+    }
+
+    /**
+     * Writes the log entry rolling over the file when required.
+
+     * @param event The LogEvent.
+     */
+    @Override
+    public void append(final LogEvent event) {
+        getManager().checkRollover(event);
+        super.append(event);
+    }
+
+    /**
+     * Returns the File name for the Appender.
+     * @return The file name.
+     */
+    public String getFileName() {
+        return fileName;
+    }
+
+    /**
+     * Returns the file pattern used when rolling over.
+     * @return The file pattern.
+     */
+    public String getFilePattern() {
+        return filePattern;
+    }
+
+    /**
+     * Returns the triggering policy.
+     * @param <T> TriggeringPolicy type
+     * @return The TriggeringPolicy
+     */
+    public <T extends TriggeringPolicy> T getTriggeringPolicy() {
+        return getManager().getTriggeringPolicy();
+    }
+
+    /**
+     * Creates a RollingFileAppender.
+     * @param fileName The name of the file that is actively written to. (required).
+     * @param filePattern The pattern of the file name to use on rollover. (required).
+     * @param append If true, events are appended to the file. If false, the file
+     * is overwritten when opened. Defaults to "true"
+     * @param name The name of the Appender (required).
+     * @param bufferedIO When true, I/O will be buffered. Defaults to "true".
+     * @param bufferSizeStr buffer size for buffered IO (default is 8192).
+     * @param immediateFlush When true, events are immediately flushed. Defaults to "true".
+     * @param policy The triggering policy. (required).
+     * @param strategy The rollover strategy. Defaults to DefaultRolloverStrategy.
+     * @param layout The layout to use (defaults to the default PatternLayout).
+     * @param filter The Filter or null.
+     * @param ignore If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise
+     *               they are propagated to the caller.
+     * @param advertise "true" if the appender configuration should be advertised, "false" otherwise.
+     * @param advertiseURI The advertised URI which can be used to retrieve the file contents.
+     * @param config The Configuration.
+     * @return A RollingFileAppender.
+     */
+    @PluginFactory
+    public static RollingFileAppender createAppender(
+            @PluginAttribute("fileName") final String fileName,
+            @PluginAttribute("filePattern") final String filePattern,
+            @PluginAttribute("append") final String append,
+            @PluginAttribute("name") final String name,
+            @PluginAttribute("bufferedIO") final String bufferedIO,
+            @PluginAttribute("bufferSize") final String bufferSizeStr,
+            @PluginAttribute("immediateFlush") final String immediateFlush,
+            @PluginElement("Policy") final TriggeringPolicy policy,
+            @PluginElement("Strategy") RolloverStrategy strategy,
+            @PluginElement("Layout") Layout<? extends Serializable> layout,
+            @PluginElement("Filter") final Filter filter,
+            @PluginAttribute("ignoreExceptions") final String ignore,
+            @PluginAttribute("advertise") final String advertise,
+            @PluginAttribute("advertiseURI") final String advertiseURI,
+            @PluginConfiguration final Configuration config) {
+
+        final boolean isAppend = Booleans.parseBoolean(append, true);
+        final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
+        final boolean isBuffered = Booleans.parseBoolean(bufferedIO, true);
+        final boolean isFlush = Booleans.parseBoolean(immediateFlush, true);
+        final boolean isAdvertise = Boolean.parseBoolean(advertise);
+        final int bufferSize = Integers.parseInt(bufferSizeStr, DEFAULT_BUFFER_SIZE);
+        if (!isBuffered && bufferSize > 0) {
+            LOGGER.warn("The bufferSize is set to {} but bufferedIO is not true: {}", bufferSize, bufferedIO);
+        }
+        if (name == null) {
+            LOGGER.error("No name provided for FileAppender");
+            return null;
+        }
+
+        if (fileName == null) {
+            LOGGER.error("No filename was provided for FileAppender with name "  + name);
+            return null;
+        }
+
+        if (filePattern == null) {
+            LOGGER.error("No filename pattern provided for FileAppender with name "  + name);
+            return null;
+        }
+
+        if (policy == null) {
+            LOGGER.error("A TriggeringPolicy must be provided");
+            return null;
+        }
+
+        if (strategy == null) {
+            strategy = DefaultRolloverStrategy.createStrategy(null, null, null,
+                    String.valueOf(Deflater.DEFAULT_COMPRESSION), null, true, config);
+        }
+
+        if (layout == null) {
+            layout = PatternLayout.createDefaultLayout();
+        }
+
+        final RollingFileManager manager = RollingFileManager.getFileManager(fileName, filePattern, isAppend,
+            isBuffered, policy, strategy, advertiseURI, layout, bufferSize, isFlush);
+        if (manager == null) {
+            return null;
+        }
+
+        manager.initialize();
+
+        return new RollingFileAppender(name, layout, filter, manager, fileName, filePattern,
+                ignoreExceptions, isFlush, isAdvertise ? config.getAdvertiser() : null);
+    }
+}


[19/50] logging-log4j2 git commit: Save lazy-create setting for asserts.

Posted by rp...@apache.org.
Save lazy-create setting for asserts.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 32c9b9923253a2122686f736b27c450fcbce8b11
Parents: dce2134
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 10:21:41 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 10:21:41 2016 -0700

----------------------------------------------------------------------
 .../apache/logging/log4j/core/appender/FileManager.java  | 11 +++++++++++
 .../logging/log4j/core/appender/FileAppenderTest.java    |  2 ++
 2 files changed, 13 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/32c9b992/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
index f88005a..c71bd95 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
@@ -40,6 +40,7 @@ public class FileManager extends OutputStreamManager {
     private static final FileManagerFactory FACTORY = new FileManagerFactory();
 
     private final boolean isAppend;
+    private final boolean isLazyCreate;
     private final boolean isLocking;
     private final String advertiseURI;
     private final int bufferSize;
@@ -61,6 +62,7 @@ public class FileManager extends OutputStreamManager {
             final ByteBuffer buffer) {
         super(os, fileName, layout, writeHeader, buffer);
         this.isAppend = append;
+        this.isLazyCreate = false;
         this.isLocking = locking;
         this.advertiseURI = advertiseURI;
         this.bufferSize = buffer.capacity();
@@ -75,6 +77,7 @@ public class FileManager extends OutputStreamManager {
             final ByteBuffer buffer) throws IOException {
         super(fileName, lazyCreate, layout, writeHeader, buffer);
         this.isAppend = append;
+        this.isLazyCreate = lazyCreate;
         this.isLocking = locking;
         this.advertiseURI = advertiseURI;
         this.bufferSize = buffer.capacity();
@@ -153,6 +156,14 @@ public class FileManager extends OutputStreamManager {
     }
 
     /**
+     * Returns the lazy-create.
+     * @return true if the file will be lazy-created.
+     */
+    public boolean isLazyCreate() {
+        return isLazyCreate;
+    }
+
+    /**
      * Returns the lock status.
      * @return true if the file will be locked when writing, false otherwise.
      */

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/32c9b992/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
index 7e2ba46..8a9603c 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
@@ -93,6 +93,7 @@ public class FileAppenderTest {
                 .build();
         final FileAppender appender = FileAppender.createAppender(FILE_NAME, true, false, "test", false, false, false,
                 1, layout, null, false, null, lazyCreate, null);
+        Assert.assertEquals(lazyCreate, appender.getManager().isLazyCreate());
         try {
             Assert.assertNotEquals(lazyCreate, Files.exists(PATH));
             appender.start();
@@ -209,6 +210,7 @@ public class FileAppenderTest {
                 .build();
         final FileAppender appender = FileAppender.createAppender(FILE_NAME, true, lock, "test", false, false, false,
                 FileAppender.DEFAULT_BUFFER_SIZE, layout, null, false, null, lazyCreate, null);
+        Assert.assertEquals(lazyCreate, appender.getManager().isLazyCreate());
         try {
             appender.start();
             assertTrue("Appender did not start", appender.isStarted());


[44/50] logging-log4j2 git commit: FileAppender uses inherited Builders.

Posted by rp...@apache.org.
FileAppender uses inherited Builders.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 7b973efa8a02666ee00f6031c795a17181e15dba
Parents: 2207cae
Author: Gary Gregory <gg...@apache.org>
Authored: Wed Aug 10 21:19:57 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Wed Aug 10 21:19:57 2016 -0700

----------------------------------------------------------------------
 .../log4j/core/appender/FileAppender.java       | 118 +++++--------------
 1 file changed, 29 insertions(+), 89 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7b973efa/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
index a026850..e93e05f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
@@ -27,9 +27,7 @@ import org.apache.logging.log4j.core.config.plugins.Plugin;
 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.PluginConfiguration;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.net.Advertiser;
 import org.apache.logging.log4j.core.util.Booleans;
 import org.apache.logging.log4j.core.util.Integers;
@@ -42,8 +40,12 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
 
     /**
      * Builds FileAppender instances.
+     * 
+     * @param <B>
+     *            This builder class
      */
-    public static class Builder implements org.apache.logging.log4j.core.util.Builder<FileAppender> {
+    public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B>
+            implements org.apache.logging.log4j.core.util.Builder<FileAppender> {
 
         @PluginBuilderAttribute
         @Required
@@ -56,27 +58,11 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
         private boolean locking;
 
         @PluginBuilderAttribute
-        @Required
-        private String name;
-
-        @PluginBuilderAttribute
-        private boolean immediateFlush = true;
-
-        @PluginBuilderAttribute
-        private boolean ignoreExceptions = true;
-
-        @PluginBuilderAttribute
         private boolean bufferedIo = true;
 
         @PluginBuilderAttribute
         private int bufferSize = DEFAULT_BUFFER_SIZE;
 
-        @PluginElement("Layout")
-        private Layout<? extends Serializable> layout;
-
-        @PluginElement("Filter")
-        private Filter filter;
-
         @PluginBuilderAttribute
         private boolean advertise;
 
@@ -98,18 +84,16 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             if (!bufferedIo && bufferSize > 0) {
                 LOGGER.warn("The bufferSize is set to {} but bufferedIo is not true: {}", bufferSize, bufferedIo);
             }
-            if (layout == null) {
-                layout = PatternLayout.createDefaultLayout();
-            }
+            Layout<? extends Serializable> layout = getOrCreateLayout();
 
             final FileManager manager = FileManager.getFileManager(fileName, append, locking, bufferedIo, lazyCreate,
-                    advertiseUri, layout, bufferSize, immediateFlush);
+                    advertiseUri, layout, bufferSize, isImmediateFlush());
             if (manager == null) {
                 return null;
             }
 
-            return new FileAppender(name, layout, filter, manager, fileName, ignoreExceptions,
-                    !bufferedIo || immediateFlush, advertise ? config.getAdvertiser() : null);
+            return new FileAppender(getName(), layout, getFilter(), manager, fileName, isIgnoreExceptions(),
+                    !bufferedIo || isImmediateFlush(), advertise ? config.getAdvertiser() : null);
         }
 
         public String getAdvertiseUri() {
@@ -128,18 +112,6 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             return fileName;
         }
 
-        public Filter getFilter() {
-            return filter;
-        }
-
-        public Layout<? extends Serializable> getLayout() {
-            return layout;
-        }
-
-        public String getName() {
-            return name;
-        }
-
         public boolean isAdvertise() {
             return advertise;
         }
@@ -152,14 +124,6 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             return bufferedIo;
         }
 
-        public boolean isIgnoreExceptions() {
-            return ignoreExceptions;
-        }
-
-        public boolean isImmediateFlush() {
-            return immediateFlush;
-        }
-
         public boolean isLazyCreate() {
             return lazyCreate;
         }
@@ -168,75 +132,51 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             return locking;
         }
 
-        public Builder withAdvertise(final boolean advertise) {
+        public B withAdvertise(final boolean advertise) {
             this.advertise = advertise;
-            return this;
+            return asBuilder();
         }
 
-        public Builder withAdvertiseUri(final String advertiseUri) {
+        public B withAdvertiseUri(final String advertiseUri) {
             this.advertiseUri = advertiseUri;
-            return this;
+            return asBuilder();
         }
 
-        public Builder withAppend(final boolean append) {
+        public B withAppend(final boolean append) {
             this.append = append;
-            return this;
+            return asBuilder();
         }
 
-        public Builder withBufferedIo(final boolean bufferedIo) {
+        public B withBufferedIo(final boolean bufferedIo) {
             this.bufferedIo = bufferedIo;
-            return this;
+            return asBuilder();
         }
 
-        public Builder withBufferSize(final int bufferSize) {
+        public B withBufferSize(final int bufferSize) {
             this.bufferSize = bufferSize;
-            return this;
+            return asBuilder();
         }
 
-        public Builder withConfig(final Configuration config) {
+        public B withConfig(final Configuration config) {
             this.config = config;
-            return this;
+            return asBuilder();
         }
 
-        public Builder withFileName(final String fileName) {
+        public B withFileName(final String fileName) {
             this.fileName = fileName;
-            return this;
-        }
-
-        public Builder withFilter(final Filter filter) {
-            this.filter = filter;
-            return this;
+            return asBuilder();
         }
 
-        public Builder withIgnoreExceptions(final boolean ignoreExceptions) {
-            this.ignoreExceptions = ignoreExceptions;
-            return this;
-        }
-
-        public Builder withImmediateFlush(final boolean immediateFlush) {
-            this.immediateFlush = immediateFlush;
-            return this;
-        }
-
-        public Builder withLayout(final Layout<? extends Serializable> layout) {
-            this.layout = layout;
-            return this;
-        }
-
-        public Builder withLazyCreate(final boolean lazyCreate) {
+        public B withLazyCreate(final boolean lazyCreate) {
             this.lazyCreate = lazyCreate;
-            return this;
+            return asBuilder();
         }
 
-        public Builder withLocking(final boolean locking) {
+        public B withLocking(final boolean locking) {
             this.locking = locking;
-            return this;
+            return asBuilder();
         }
 
-        public Builder withName(final String name) {
-            this.name = name;
-            return this;
-        }
     }
     
     private static final int DEFAULT_BUFFER_SIZE = 8192;
@@ -298,8 +238,8 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
     }
     
     @PluginBuilderFactory
-    public static Builder newBuilder() {
-        return new Builder();
+    public static <B extends Builder<B>> B newBuilder() {
+        return new Builder<B>().asBuilder();
     }
     
     private final String fileName;


[29/50] logging-log4j2 git commit: Better panme.

Posted by rp...@apache.org.
Better panme.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 4b4a07b41ef54f88fb6811ce935108ac86dd6aac
Parents: 50a1422
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 13:48:46 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 13:48:46 2016 -0700

----------------------------------------------------------------------
 .../org/apache/logging/log4j/core/appender/FileAppender.java   | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4b4a07b4/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
index b13cb01..a026850 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
@@ -250,7 +250,7 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
      * @param name The name of the Appender.
      * @param immediateFlush "true" if the contents should be flushed on every write, "false" otherwise. The default
      * is "true".
-     * @param ignore If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise
+     * @param ignoreExceptions If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise
      *               they are propagated to the caller.
      * @param bufferedIo "true" if I/O should be buffered, "false" otherwise. The default is "true".
      * @param bufferSizeStr buffer size for buffered IO (default is 8192).
@@ -271,7 +271,7 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             final String locking,
             final String name,
             final String immediateFlush,
-            final String ignore,
+            final String ignoreExceptions,
             final String bufferedIo,
             final String bufferSizeStr,
             final Layout<? extends Serializable> layout,
@@ -288,7 +288,7 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             .withConfig(config)
             .withFileName(fileName)
             .withFilter(filter)
-            .withIgnoreExceptions(Booleans.parseBoolean(ignore, true))
+            .withIgnoreExceptions(Booleans.parseBoolean(ignoreExceptions, true))
             .withImmediateFlush(Booleans.parseBoolean(immediateFlush, true))
             .withLayout(layout)
             .withLocking(Boolean.parseBoolean(locking))


[41/50] logging-log4j2 git commit: Update test with a better logging message. Add a comment.

Posted by rp...@apache.org.
Update test with a better logging message. Add a comment.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 685881a249f261b18bfd11838796054b6da6fc3c
Parents: 2404f7c
Author: Gary Gregory <gg...@apache.org>
Authored: Wed Aug 10 13:49:05 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Wed Aug 10 13:49:05 2016 -0700

----------------------------------------------------------------------
 .../log4j/core/appender/rolling/RollingAppenderCronTest.java      | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/685881a2/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderCronTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderCronTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderCronTest.java
index a6498bf..6de7d7d 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderCronTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderCronTest.java
@@ -56,6 +56,7 @@ public class RollingAppenderCronTest {
 
     @Test
     public void testAppender() throws Exception {
+        // TODO Is there a better way to test than putting the thread to sleep all over the place?
         final Logger logger = loggerContextRule.getLogger();
         File file = new File(FILE);
         assertTrue("Log file does not exist", file.exists());
@@ -73,7 +74,7 @@ public class RollingAppenderCronTest {
                 succeeded = true;
                 break;
             }
-            logger.debug("Adding additional event " + i);
+            logger.debug("Sleeping #" + i);
             Thread.sleep(100); // Allow time for rollover to complete
         }
         if (!succeeded) {


[23/50] logging-log4j2 git commit: Build PatternLayout with a builder instead of the create API.

Posted by rp...@apache.org.
Build PatternLayout with a builder instead of the create API.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 93a9846f3464a765720583497eb2b53fe0648b6d
Parents: 4edd7ad
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 11:01:36 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 11:01:36 2016 -0700

----------------------------------------------------------------------
 .../apache/logging/log4j/core/appender/ConsoleAppenderTest.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/93a9846f/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
index 78ca50e..9190359 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
@@ -97,7 +97,7 @@ public class ConsoleAppenderTest {
 
             mocks.replayAll();
             systemSetter.systemSet(psMock);
-            final Layout<String> layout = PatternLayout.createLayout(null, null, null, null, null, false, false, null, null);
+            final Layout<String> layout = PatternLayout.newBuilder().withAlwaysWriteExceptions(true).build();
             final ConsoleAppender app = ConsoleAppender.createAppender(layout, null, targetName, "Console", false, false,
                     false);
             app.start();


[11/50] logging-log4j2 git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/logging-log4j2.git

Posted by rp...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/logging-log4j2.git

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 887e028a1521f6696b399573043b558495191b4e
Parents: 0482817 34ee617
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 08:48:46 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 08:48:46 2016 -0700

----------------------------------------------------------------------
 src/site/xdoc/manual/appenders.xml | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------



[18/50] logging-log4j2 git commit: Better test name.

Posted by rp...@apache.org.
Better test name.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: dce2134184de90a53270f6dfa66b5f7de87a2e59
Parents: e950cb5
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 10:19:05 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 10:19:05 2016 -0700

----------------------------------------------------------------------
 .../org/apache/logging/log4j/core/appender/FileAppenderTest.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/dce21341/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
index 760715d..7e2ba46 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
@@ -88,7 +88,7 @@ public class FileAppenderTest {
     }
 
     @Test
-    public void testLazyStart() throws Exception {
+    public void testLazyCreate() throws Exception {
         final Layout<String> layout = PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
                 .build();
         final FileAppender appender = FileAppender.createAppender(FILE_NAME, true, false, "test", false, false, false,


[15/50] logging-log4j2 git commit: Port from String to native types. Deprecate previous API.

Posted by rp...@apache.org.
Port from String to native types. Deprecate previous API.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 262f30d310805d8e277e0d95adaf835de89f1044
Parents: e718a64
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 09:21:03 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 09:21:03 2016 -0700

----------------------------------------------------------------------
 .../core/appender/RollingFileAppender.java      | 119 ++++++++++++++++---
 .../rolling/RollingFileAppenderAccessTest.java  |  23 +++-
 2 files changed, 125 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/262f30d3/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
index 2b06287..01ef50d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
@@ -132,23 +132,25 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
      * @param config The Configuration.
      * @return A RollingFileAppender.
      */
-    @PluginFactory
+    @Deprecated
     public static RollingFileAppender createAppender(
-            @PluginAttribute("fileName") final String fileName,
-            @PluginAttribute("filePattern") final String filePattern,
-            @PluginAttribute("append") final String append,
-            @PluginAttribute("name") final String name,
-            @PluginAttribute("bufferedIO") final String bufferedIO,
-            @PluginAttribute("bufferSize") final String bufferSizeStr,
-            @PluginAttribute("immediateFlush") final String immediateFlush,
-            @PluginElement("Policy") final TriggeringPolicy policy,
-            @PluginElement("Strategy") RolloverStrategy strategy,
-            @PluginElement("Layout") Layout<? extends Serializable> layout,
-            @PluginElement("Filter") final Filter filter,
-            @PluginAttribute("ignoreExceptions") final String ignore,
-            @PluginAttribute("advertise") final String advertise,
-            @PluginAttribute("advertiseURI") final String advertiseURI,
-            @PluginConfiguration final Configuration config) {
+            // @formatter:off
+            final String fileName,
+            final String filePattern,
+            final String append,
+            final String name,
+            final String bufferedIO,
+            final String bufferSizeStr,
+            final String immediateFlush,
+            final TriggeringPolicy policy,
+            RolloverStrategy strategy,
+            Layout<? extends Serializable> layout,
+            final Filter filter,
+            final String ignore,
+            final String advertise,
+            final String advertiseURI,
+            final Configuration config) {
+            // @formatter:on
 
         final boolean isAppend = Booleans.parseBoolean(append, true);
         final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
@@ -199,4 +201,89 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
         return new RollingFileAppender(name, layout, filter, manager, fileName, filePattern,
                 ignoreExceptions, isFlush, isAdvertise ? config.getAdvertiser() : null);
     }
+
+    /**
+     * Creates a RollingFileAppender.
+     * @param fileName The name of the file that is actively written to. (required).
+     * @param filePattern The pattern of the file name to use on rollover. (required).
+     * @param append If true, events are appended to the file. If false, the file
+     * is overwritten when opened. Defaults to "true"
+     * @param name The name of the Appender (required).
+     * @param bufferedIo When true, I/O will be buffered. Defaults to "true".
+     * @param bufferSize buffer size for buffered IO (default is 8192).
+     * @param immediateFlush When true, events are immediately flushed. Defaults to "true".
+     * @param policy The triggering policy. (required).
+     * @param strategy The rollover strategy. Defaults to DefaultRolloverStrategy.
+     * @param layout The layout to use (defaults to the default PatternLayout).
+     * @param filter The Filter or null.
+     * @param ignoreExceptions If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise
+     *               they are propagated to the caller.
+     * @param advertise "true" if the appender configuration should be advertised, "false" otherwise.
+     * @param advertiseURI The advertised URI which can be used to retrieve the file contents.
+     * @param config The Configuration.
+     * @return A RollingFileAppender.
+     * @since 2.7
+     */
+    @PluginFactory
+    public static RollingFileAppender createAppender(
+            // @formatter:off
+            @PluginAttribute("fileName") final String fileName,
+            @PluginAttribute("filePattern") final String filePattern,
+            @PluginAttribute(value = "append", defaultBoolean = true) final boolean append,
+            @PluginAttribute("name") final String name,
+            @PluginAttribute(value = "bufferedIO", defaultBoolean = true) final boolean bufferedIo,
+            @PluginAttribute(value = "bufferSize", defaultInt = DEFAULT_BUFFER_SIZE) final int bufferSize,
+            @PluginAttribute(value = "immediateFlush" , defaultBoolean = true) final boolean immediateFlush,
+            @PluginElement("Policy") final TriggeringPolicy policy,
+            @PluginElement("Strategy") RolloverStrategy strategy,
+            @PluginElement("Layout") Layout<? extends Serializable> layout,
+            @PluginElement("Filter") final Filter filter,
+            @PluginAttribute(value = "ignoreExceptions", defaultBoolean = true) final boolean ignoreExceptions,
+            @PluginAttribute("advertise") final boolean advertise,
+            @PluginAttribute("advertiseURI") final String advertiseURI,
+            @PluginConfiguration final Configuration config) {
+            // @formatter:on
+        if (!bufferedIo && bufferSize > 0) {
+            LOGGER.warn("The bufferSize is set to {} but bufferedIO is not true: {}", bufferSize, bufferedIo);
+        }
+        if (name == null) {
+            LOGGER.error("No name provided for FileAppender");
+            return null;
+        }
+
+        if (fileName == null) {
+            LOGGER.error("No filename was provided for FileAppender with name "  + name);
+            return null;
+        }
+
+        if (filePattern == null) {
+            LOGGER.error("No filename pattern provided for FileAppender with name "  + name);
+            return null;
+        }
+
+        if (policy == null) {
+            LOGGER.error("A TriggeringPolicy must be provided");
+            return null;
+        }
+
+        if (strategy == null) {
+            strategy = DefaultRolloverStrategy.createStrategy(null, null, null,
+                    String.valueOf(Deflater.DEFAULT_COMPRESSION), null, true, config);
+        }
+
+        if (layout == null) {
+            layout = PatternLayout.createDefaultLayout();
+        }
+
+        final RollingFileManager manager = RollingFileManager.getFileManager(fileName, filePattern, append,
+            bufferedIo, policy, strategy, advertiseURI, layout, bufferSize, immediateFlush);
+        if (manager == null) {
+            return null;
+        }
+
+        manager.initialize();
+
+        return new RollingFileAppender(name, layout, filter, manager, fileName, filePattern,
+                ignoreExceptions, immediateFlush, advertise ? config.getAdvertiser() : null);
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/262f30d3/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
index ad6cd4c..d22fc6a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
@@ -32,7 +32,7 @@ public class RollingFileAppenderAccessTest {
      * @throws IOException
      */
     @Test
-    public void testAccessManager() throws IOException {
+    public void testAccessManagerWithStrings() throws IOException {
         final LoggerContext ctx = LoggerContext.getContext(false);
         final Configuration config = ctx.getConfiguration();
         final File file = File.createTempFile("RollingFileAppenderAccessTest", ".tmp");
@@ -46,4 +46,25 @@ public class RollingFileAppenderAccessTest {
         manager.getRolloverStrategy();
         manager.getTriggeringPolicy();
     }
+
+    /**
+     * Not a real test, just make sure we can compile access to the typed manager.
+     *
+     * @throws IOException
+     */
+    @Test
+    public void testAccessManagerWithPrimitives() throws IOException {
+        final LoggerContext ctx = LoggerContext.getContext(false);
+        final Configuration config = ctx.getConfiguration();
+        final File file = File.createTempFile("RollingFileAppenderAccessTest", ".tmp");
+        file.deleteOnExit();
+        final RollingFileAppender appender = RollingFileAppender.createAppender(file.getCanonicalPath(), "FilePattern",
+                true, "Name", true, 8192, true, OnStartupTriggeringPolicy.createPolicy(1), null, null, null, true, false,
+                null, config);
+        final RollingFileManager manager = appender.getManager();
+        // Since the RolloverStrategy and TriggeringPolicy are immutable, we could also use generics to type their
+        // access.
+        manager.getRolloverStrategy();
+        manager.getTriggeringPolicy();
+    }
 }


[08/50] logging-log4j2 git commit: Refactor cleaners to be Path-based (I am using this in a WIP test.)

Posted by rp...@apache.org.
Refactor cleaners to be Path-based (I am using this in a WIP test.)

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 714bfafddfcea9986a0079fe1395760336ba393c
Parents: e52b016
Author: Gary Gregory <gg...@apache.org>
Authored: Sun Aug 7 11:51:30 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Sun Aug 7 11:51:30 2016 -0700

----------------------------------------------------------------------
 .../junit/AbstractExternalFileCleaner.java      | 40 +++++++++++++-------
 .../apache/logging/log4j/junit/CleanFiles.java  |  4 ++
 .../logging/log4j/junit/CleanFolders.java       |  4 ++
 3 files changed, 34 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/714bfafd/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
index fa15c67..ce7eafd 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
@@ -18,7 +18,9 @@ package org.apache.logging.log4j.junit;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -33,26 +35,37 @@ public abstract class AbstractExternalFileCleaner extends ExternalResource {
     private static final int SLEEP_RETRY_MILLIS = 200;
     private final boolean cleanAfter;
     private final boolean cleanBefore;
-    private final Set<File> files;
+    private final Set<Path> files;
     private final int maxTries;
 
     public AbstractExternalFileCleaner(final boolean before, final boolean after, final int maxTries,
             final File... files) {
         this.cleanBefore = before;
         this.cleanAfter = after;
-        this.files = new HashSet<>(Arrays.asList(files));
         this.maxTries = maxTries;
+        this.files = new HashSet<>(files.length);
+        for (final File file : files) {
+            this.files.add(file.toPath());
+        }
+    }
+
+    public AbstractExternalFileCleaner(final boolean before, final boolean after, final int maxTries,
+            final Path... files) {
+        this.cleanBefore = before;
+        this.cleanAfter = after;
+        this.maxTries = maxTries;
+        this.files = new HashSet<>(Arrays.asList(files));
     }
 
     public AbstractExternalFileCleaner(final boolean before, final boolean after, final int maxTries,
             final String... fileNames) {
         this.cleanBefore = before;
         this.cleanAfter = after;
+        this.maxTries = maxTries;
         this.files = new HashSet<>(fileNames.length);
         for (final String fileName : fileNames) {
-            this.files.add(new File(fileName));
+            this.files.add(Paths.get(fileName));
         }
-        this.maxTries = maxTries;
     }
 
     @Override
@@ -70,11 +83,10 @@ public abstract class AbstractExternalFileCleaner extends ExternalResource {
     }
 
     protected void clean() {
-        Map<Path, IOException> failures = new HashMap<>();
+        final Map<Path, IOException> failures = new HashMap<>();
         // Clean and gather failures
-        for (final File file : getFiles()) {
-            if (file.exists()) {
-                final Path path = file.toPath();
+        for (final Path path : getPaths()) {
+            if (Files.exists(path)) {
                 for (int i = 0; i < getMaxTries(); i++) {
                     try {
                         if (clean(path, i)) {
@@ -97,9 +109,9 @@ public abstract class AbstractExternalFileCleaner extends ExternalResource {
         }
         // Fail on failures
         if (failures.size() > 0) {
-            StringBuilder sb = new StringBuilder();
+            final StringBuilder sb = new StringBuilder();
             boolean first = true;
-            for (Map.Entry<Path, IOException> failure : failures.entrySet()) {
+            for (final Map.Entry<Path, IOException> failure : failures.entrySet()) {
                 failure.getValue().printStackTrace();
                 if (!first) {
                     sb.append(", ");
@@ -122,14 +134,14 @@ public abstract class AbstractExternalFileCleaner extends ExternalResource {
         return cleanBefore;
     }
 
-    public Set<File> getFiles() {
-        return files;
-    }
-
     public int getMaxTries() {
         return maxTries;
     }
 
+    public Set<Path> getPaths() {
+        return files;
+    }
+
     @Override
     public String toString() {
         return getClass().getSimpleName() + " [files=" + files + ", cleanAfter=" + cleanAfter + ", cleanBefore="

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/714bfafd/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
index fdd4cdd..39a2324 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
@@ -39,6 +39,10 @@ public class CleanFiles extends AbstractExternalFileCleaner {
         super(true, true, MAX_TRIES, files);
     }
 
+    public CleanFiles(final Path... paths) {
+        super(true, true, MAX_TRIES, paths);
+    }
+
     public CleanFiles(final String... fileNames) {
         super(true, true, MAX_TRIES, fileNames);
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/714bfafd/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
index 52ade89..5bddd12 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
@@ -42,6 +42,10 @@ public class CleanFolders extends AbstractExternalFileCleaner {
         super(true, true, MAX_TRIES, folders);
     }
 
+    public CleanFolders(final Path... paths) {
+        super(true, true, MAX_TRIES, paths);
+    }
+
     public CleanFolders(final String... folderNames) {
         super(true, true, MAX_TRIES, folderNames);
     }


[42/50] logging-log4j2 git commit: [LOG4J2-1508] Allow a Builder to sublcass another Builder.

Posted by rp...@apache.org.
[LOG4J2-1508] Allow a Builder to sublcass another Builder.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: e3e37ccbd6ff8237cc693d32a1b687589b11d059
Parents: 685881a
Author: Gary Gregory <gg...@apache.org>
Authored: Wed Aug 10 13:50:13 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Wed Aug 10 13:50:13 2016 -0700

----------------------------------------------------------------------
 .../core/config/plugins/util/PluginBuilder.java |  6 +-
 .../logging/log4j/core/util/TypeUtil.java       | 21 ++++++
 .../AbstractPluginWithGenericBuilder.java       | 59 +++++++++++++++++
 .../PluginWithGenericSubclassFoo1Builder.java   | 55 ++++++++++++++++
 .../ValidatingPluginWithGenericBuilder.java     |  2 +-
 ...luginWithGenericSubclassFoo1BuilderTest.java | 68 ++++++++++++++++++++
 src/changes/changes.xml                         |  6 ++
 7 files changed, 214 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e3e37ccb/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
index 7ba9981..8da7356 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
@@ -23,6 +23,8 @@ import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -156,8 +158,8 @@ public class PluginBuilder implements Builder<Object> {
     }
 
     private void injectFields(final Builder<?> builder) throws IllegalAccessException {
-        final Field[] fields = builder.getClass().getDeclaredFields();
-        AccessibleObject.setAccessible(fields, true);
+        final List<Field> fields = TypeUtil.getAllDeclaredFields(builder.getClass());
+        AccessibleObject.setAccessible(fields.toArray(new Field[] {}), true);
         final StringBuilder log = new StringBuilder();
         boolean invalid = false;
         for (final Field field : fields) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e3e37ccb/log4j-core/src/main/java/org/apache/logging/log4j/core/util/TypeUtil.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/TypeUtil.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/TypeUtil.java
index 81a8de2..e8db1ed 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/TypeUtil.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/TypeUtil.java
@@ -16,10 +16,13 @@
  */
 package org.apache.logging.log4j.core.util;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.GenericArrayType;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.WildcardType;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -36,10 +39,28 @@ import java.util.Objects;
  * @since 2.1
  */
 public final class TypeUtil {
+    
     private TypeUtil() {
     }
 
     /**
+     * Gets all declared fields for the given class (including superclasses).
+     * 
+     * @param cls the class to examine
+     * @return all declared fields for the given class (including superclasses).
+     * @see Class#getDeclaredFields()
+     */
+    public static List<Field> getAllDeclaredFields(Class<?> cls) {
+        final List<Field> fields = new ArrayList<>();
+        while (cls != null) {
+            for (Field field : cls.getDeclaredFields()) {
+                fields.add(field);
+            }
+            cls = cls.getSuperclass();
+        }
+        return fields;
+    }
+    /**
      * Indicates if two {@link Type}s are assignment compatible.
      *
      * @param lhs the left hand side to check assignability to

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e3e37ccb/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
new file mode 100644
index 0000000..7b2a0f8
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/AbstractPluginWithGenericBuilder.java
@@ -0,0 +1,59 @@
+/*
+ * 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.plugins.validation;
+
+import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
+import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+
+/**
+ *
+ */
+public class AbstractPluginWithGenericBuilder {
+
+    public static abstract class Builder<B extends Builder<B>> {
+
+        @PluginBuilderAttribute
+        @Required(message = "The thing given by the builder is null")
+        private String thing;
+
+        @SuppressWarnings("unchecked")
+        public B asBuilder() {
+            return (B) this;
+        }
+
+        public String getThing() {
+            return thing;
+        }
+
+        public B withThing(final String name) {
+            this.thing = name;
+            return asBuilder();
+        }
+
+    }
+
+    private final String thing;
+
+    public AbstractPluginWithGenericBuilder(final String thing) {
+        super();
+        this.thing = thing;
+    }
+
+    public String getThing() {
+        return thing;
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e3e37ccb/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
new file mode 100644
index 0000000..727b848
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/PluginWithGenericSubclassFoo1Builder.java
@@ -0,0 +1,55 @@
+package org.apache.logging.log4j.core.config.plugins.validation;
+
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+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.validation.constraints.Required;
+
+@Plugin(name = "PluginWithGenericSubclassFoo1Builder", category = "Test")
+public class PluginWithGenericSubclassFoo1Builder extends AbstractPluginWithGenericBuilder {
+
+    public static class Builder<B extends Builder<B>> extends AbstractPluginWithGenericBuilder.Builder<B>
+            implements org.apache.logging.log4j.core.util.Builder<PluginWithGenericSubclassFoo1Builder> {
+
+        @PluginBuilderFactory
+        public static <B extends Builder<B>> B newBuilder() {
+            return new Builder<B>().asBuilder();
+        }
+
+        @PluginBuilderAttribute
+        @Required(message = "The foo1 given by the builder is null")
+        private String foo1;
+
+        @Override
+        public PluginWithGenericSubclassFoo1Builder build() {
+            return new PluginWithGenericSubclassFoo1Builder(getThing(), getFoo1());
+        }
+
+        public String getFoo1() {
+            return foo1;
+        }
+
+        public B withFoo1(final String foo1) {
+            this.foo1 = foo1;
+            return asBuilder();
+        }
+
+    }
+    
+    @PluginBuilderFactory
+    public static <B extends Builder<B>> B newBuilder() {
+        return new Builder<B>().asBuilder();
+    }
+
+    private final String foo1;
+
+    public PluginWithGenericSubclassFoo1Builder(final String thing, final String foo1) {
+        super(thing);
+        this.foo1 = foo1;
+    }
+
+    public String getFoo1() {
+        return foo1;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e3e37ccb/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
index 34297e2..5ca9b6e 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
@@ -63,7 +63,7 @@ public class ValidatingPluginWithGenericBuilder {
         }
 
         @SuppressWarnings("unchecked")
-        private B asBuilder() {
+        public B asBuilder() {
             return (B) this;
         }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e3e37ccb/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericSubclassFoo1BuilderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericSubclassFoo1BuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericSubclassFoo1BuilderTest.java
new file mode 100644
index 0000000..d6f3966
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericSubclassFoo1BuilderTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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.plugins.validation.validators;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.core.config.NullConfiguration;
+import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
+import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
+import org.apache.logging.log4j.core.config.plugins.util.PluginType;
+import org.apache.logging.log4j.core.config.plugins.validation.PluginWithGenericSubclassFoo1Builder;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ValidatingPluginWithGenericSubclassFoo1BuilderTest {
+
+    private PluginType<PluginWithGenericSubclassFoo1Builder> plugin;
+    private Node node;
+
+    @SuppressWarnings("unchecked")
+    @Before
+    public void setUp() throws Exception {
+        final PluginManager manager = new PluginManager("Test");
+        manager.collectPlugins();
+        plugin = (PluginType<PluginWithGenericSubclassFoo1Builder>) manager.getPluginType("PluginWithGenericSubclassFoo1Builder");
+        assertNotNull("Rebuild this module to make sure annotaion processing kicks in.", plugin);
+        node = new Node(null, "Validator", plugin);
+    }
+
+    @Test
+    public void testNullDefaultValue() throws Exception {
+        final PluginWithGenericSubclassFoo1Builder validatingPlugin = (PluginWithGenericSubclassFoo1Builder) new PluginBuilder(plugin)
+            .withConfiguration(new NullConfiguration())
+            .withConfigurationNode(node)
+            .build();
+        assertNull(validatingPlugin);
+    }
+
+    @Test
+    public void testNonNullValue() throws Exception {
+        node.getAttributes().put("thing", "thing1");
+        node.getAttributes().put("foo1", "foo1");
+        final PluginWithGenericSubclassFoo1Builder validatingPlugin = (PluginWithGenericSubclassFoo1Builder) new PluginBuilder(plugin)
+            .withConfiguration(new NullConfiguration())
+            .withConfigurationNode(node)
+            .build();
+        assertNotNull(validatingPlugin);
+        assertEquals("thing1", validatingPlugin.getThing());
+        assertEquals("foo1", validatingPlugin.getFoo1());
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e3e37ccb/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ad03663..a4fac9e 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -75,6 +75,12 @@
       <action issue="LOG4J2-1505" dev="ggregory" type="add" due-to="Gary Gregory">
         Create a Builder for FileAppender.
       </action>
+      <action issue="LOG4J2-1507" dev="ggregory" type="add" due-to="Gary Gregory">
+        Allow Builders to be completely generic.
+      </action>
+      <action issue="LOG4J2-1508" dev="ggregory" type="add" due-to="Gary Gregory">
+        Allow a Builder to sublcass another Builder.
+      </action>
       <action issue="LOG4J2-1458" dev="ggregory" type="update" due-to="Gary Gregory">
         Update Jackson from 2.7.5 to 2.8.0.
       </action>


[26/50] logging-log4j2 git commit: Fix commented out code.

Posted by rp...@apache.org.
Fix commented out code.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: de528c5f8a590098ce6ffc6cd5151e6ae3595ea5
Parents: 0602201
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 12:00:19 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 12:00:19 2016 -0700

----------------------------------------------------------------------
 .../core/appender/rolling/OnStartupTriggeringPolicyTest.java      | 3 ---
 1 file changed, 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/de528c5f/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
index 62f3f46..b21a7e7 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
@@ -28,9 +28,6 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.util.datetime.FastDateFormat;
-import org.apache.logging.log4j.junit.CleanFiles;
-import org.apache.logging.log4j.junit.CleanFolders;
-import org.junit.Rule;
 import org.junit.Test;
 
 /**


[07/50] logging-log4j2 git commit: Refactor clean files and clean folder rules.

Posted by rp...@apache.org.
Refactor clean files and clean folder rules.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: e52b01618474ee5888b3698171ee381d6ae2add5
Parents: e81c6a1
Author: Gary Gregory <gg...@apache.org>
Authored: Sun Aug 7 11:43:50 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Sun Aug 7 11:43:50 2016 -0700

----------------------------------------------------------------------
 .../junit/AbstractExternalFileCleaner.java      | 69 +++++++++++++++++---
 .../apache/logging/log4j/junit/CleanFiles.java  | 25 +------
 .../logging/log4j/junit/CleanFolders.java       | 48 ++------------
 3 files changed, 69 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e52b0161/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
index 7860917..fa15c67 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
@@ -17,30 +17,38 @@
 package org.apache.logging.log4j.junit;
 
 import java.io.File;
-import java.util.ArrayList;
+import java.io.IOException;
+import java.nio.file.Path;
 import java.util.Arrays;
-import java.util.List;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 
+import org.junit.Assert;
 import org.junit.rules.ExternalResource;
 
 public abstract class AbstractExternalFileCleaner extends ExternalResource {
 
+    private static final int SLEEP_RETRY_MILLIS = 200;
     private final boolean cleanAfter;
     private final boolean cleanBefore;
-    private final List<File> files;
+    private final Set<File> files;
     private final int maxTries;
 
-    public AbstractExternalFileCleaner(final boolean before, final boolean after, final int maxTries, final File... files) {
+    public AbstractExternalFileCleaner(final boolean before, final boolean after, final int maxTries,
+            final File... files) {
         this.cleanBefore = before;
         this.cleanAfter = after;
-        this.files = Arrays.asList(files);
+        this.files = new HashSet<>(Arrays.asList(files));
         this.maxTries = maxTries;
     }
 
-    public AbstractExternalFileCleaner(final boolean before, final boolean after, final int maxTries, final String... fileNames) {
+    public AbstractExternalFileCleaner(final boolean before, final boolean after, final int maxTries,
+            final String... fileNames) {
         this.cleanBefore = before;
         this.cleanAfter = after;
-        this.files = new ArrayList<>(fileNames.length);
+        this.files = new HashSet<>(fileNames.length);
         for (final String fileName : fileNames) {
             this.files.add(new File(fileName));
         }
@@ -61,7 +69,50 @@ public abstract class AbstractExternalFileCleaner extends ExternalResource {
         }
     }
 
-    abstract protected void clean();
+    protected void clean() {
+        Map<Path, IOException> failures = new HashMap<>();
+        // Clean and gather failures
+        for (final File file : getFiles()) {
+            if (file.exists()) {
+                final Path path = file.toPath();
+                for (int i = 0; i < getMaxTries(); i++) {
+                    try {
+                        if (clean(path, i)) {
+                            if (failures.containsKey(path)) {
+                                failures.remove(path);
+                            }
+                            break;
+                        }
+                    } catch (final IOException e) {
+                        // We will try again.
+                        failures.put(path, e);
+                    }
+                    try {
+                        Thread.sleep(SLEEP_RETRY_MILLIS);
+                    } catch (final InterruptedException ignored) {
+                        // ignore
+                    }
+                }
+            }
+        }
+        // Fail on failures
+        if (failures.size() > 0) {
+            StringBuilder sb = new StringBuilder();
+            boolean first = true;
+            for (Map.Entry<Path, IOException> failure : failures.entrySet()) {
+                failure.getValue().printStackTrace();
+                if (!first) {
+                    sb.append(", ");
+                }
+                sb.append(failure.getKey()).append(" failed with ").append(failure.getValue());
+                first = false;
+            }
+            Assert.fail(sb.toString());
+        }
+
+    }
+
+    protected abstract boolean clean(Path path, int tryIndex) throws IOException;
 
     public boolean cleanAfter() {
         return cleanAfter;
@@ -71,7 +122,7 @@ public abstract class AbstractExternalFileCleaner extends ExternalResource {
         return cleanBefore;
     }
 
-    public List<File> getFiles() {
+    public Set<File> getFiles() {
         return files;
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e52b0161/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
index d38ca85..fdd4cdd 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
@@ -19,8 +19,7 @@ package org.apache.logging.log4j.junit;
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
-
-import org.junit.Assert;
+import java.nio.file.Path;
 
 /**
  * A JUnit test rule to automatically delete files after a test is run.
@@ -45,26 +44,8 @@ public class CleanFiles extends AbstractExternalFileCleaner {
     }
 
     @Override
-    protected void clean() {
-        for (final File file : getFiles()) {
-            if (file.exists()) {
-                for (int i = 0; i < getMaxTries(); i++) {
-                    try {
-                        if (Files.deleteIfExists(file.toPath())) {
-                            // Break from MAX_TRIES and move on to the next file.
-                            break;
-                        }
-                    } catch (final IOException e) {
-                        Assert.fail(file + ": " + e.toString());
-                    }
-                    try {
-                        Thread.sleep(200);
-                    } catch (final InterruptedException ignored) {
-                        // ignore
-                    }
-                }
-            }
-        }
+    protected boolean clean(Path path, int tryIndex) throws IOException {
+        return Files.deleteIfExists(path);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e52b0161/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
index ea75a55..52ade89 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
@@ -23,10 +23,6 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.SimpleFileVisitor;
 import java.nio.file.attribute.BasicFileAttributes;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.Assert;
 
 /**
  * A JUnit test rule to automatically delete folders recursively before (optional) and after (optional) a test is run.
@@ -50,44 +46,6 @@ public class CleanFolders extends AbstractExternalFileCleaner {
         super(true, true, MAX_TRIES, folderNames);
     }
 
-    @Override
-    protected void clean() {
-        Map<Path, IOException> failures = new HashMap<>();
-        // Clean and gather failures
-        for (final File folder : getFiles()) {
-            if (folder.exists()) {
-                final Path path = folder.toPath();
-                for (int i = 0; i < getMaxTries(); i++) {
-                    try {
-                        cleanFolder(path);
-                        if (failures.containsKey(path)) {
-                            failures.remove(path);
-                        }
-                        // break from MAX_TRIES and goes to the next folder
-                        break;
-                    } catch (final IOException e) {
-                        // We will try again.
-                        failures.put(path, e);
-                    }
-                }
-            }
-        }
-        // Fail on failures
-        if (failures.size() > 0) {
-            StringBuilder sb = new StringBuilder();
-            boolean first = true;
-            for (Map.Entry<Path, IOException> failure : failures.entrySet()) {
-                failure.getValue().printStackTrace();
-                if (!first) {
-                    sb.append(", ");
-                }
-                sb.append(failure.getKey()).append(" failed with ").append(failure.getValue());
-                first = false;
-            }
-            Assert.fail(sb.toString());
-        }
-    }
-
     private void cleanFolder(final Path folder) throws IOException {
         if (Files.exists(folder) && Files.isDirectory(folder)) {
             Files.walkFileTree(folder, new SimpleFileVisitor<Path>() {
@@ -105,4 +63,10 @@ public class CleanFolders extends AbstractExternalFileCleaner {
             });
         }
     }
+
+    @Override
+    protected boolean clean(Path path, int tryIndex) throws IOException {
+        cleanFolder(path);
+        return true;
+    }
 }


[12/50] logging-log4j2 git commit: [LOG4J2-1501] FileAppender should be able to create files lazily.

Posted by rp...@apache.org.
[LOG4J2-1501] FileAppender should be able to create files lazily.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 61f706fc0a811c3184e941f2e8d1e012b5cbdb39
Parents: 887e028
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 08:50:11 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 08:50:11 2016 -0700

----------------------------------------------------------------------
 .../log4j/core/appender/FileAppender.java       |  79 +++++-
 .../log4j/core/appender/FileManager.java        |  79 ++++--
 .../core/appender/OutputStreamManager.java      |  59 +++-
 .../log4j/core/appender/FileAppenderTest.java   | 270 +++++++++++--------
 .../log4j/test/appender/InMemoryAppender.java   |   7 +-
 src/changes/changes.xml                         |   3 +
 6 files changed, 346 insertions(+), 151 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61f706fc/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
index 90c088e..a69758b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
@@ -39,7 +39,7 @@ import org.apache.logging.log4j.core.util.Integers;
 @Plugin(name = "File", category = "Core", elementType = "appender", printObject = true)
 public final class FileAppender extends AbstractOutputStreamAppender<FileManager> {
 
-    private static final int DEFAULT_BUFFER_SIZE = 8192;
+    static final int DEFAULT_BUFFER_SIZE = 8192;
     private final String fileName;
     private final Advertiser advertiser;
     private Object advertisement;
@@ -96,8 +96,9 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
      * @param advertiseUri The advertised URI which can be used to retrieve the file contents.
      * @param config The Configuration
      * @return The FileAppender.
+     * @deprecated Use {@link #createAppender(String, boolean, boolean, String, String, String, boolean, String, Layout<? extends Serializable>, Filter, String, String, boolean, Configuration)}
      */
-    @PluginFactory
+    @Deprecated
     public static FileAppender createAppender(
             // @formatter:off
             @PluginAttribute("fileName") final String fileName,
@@ -144,8 +145,8 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             layout = PatternLayout.createDefaultLayout();
         }
 
-        final FileManager manager = FileManager.getFileManager(fileName, isAppend, isLocking, isBuffered, advertiseUri,
-                layout, bufferSize, isFlush);
+        final FileManager manager = FileManager.getFileManager(fileName, isAppend, isLocking, isBuffered, false,
+                advertiseUri, layout, bufferSize, isFlush);
         if (manager == null) {
             return null;
         }
@@ -153,4 +154,74 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
         return new FileAppender(name, layout, filter, manager, fileName, ignoreExceptions, !isBuffered || isFlush,
                 isAdvertise ? config.getAdvertiser() : null);
     }
+
+    /**
+     * Create a File Appender.
+     * @param fileName The name and path of the file.
+     * @param append "True" if the file should be appended to, "false" if it should be overwritten.
+     * The default is "true".
+     * @param locking "True" if the file should be locked. The default is "false".
+     * @param name The name of the Appender.
+     * @param immediateFlush "true" if the contents should be flushed on every write, "false" otherwise. The default
+     * is "true".
+     * @param ignoreExceptions If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise
+     *               they are propagated to the caller.
+     * @param bufferedIo "true" if I/O should be buffered, "false" otherwise. The default is "true".
+     * @param bufferSize buffer size for buffered IO (default is 8192).
+     * @param layout The layout to use to format the event. If no layout is provided the default PatternLayout
+     * will be used.
+     * @param filter The filter, if any, to use.
+     * @param advertise "true" if the appender configuration should be advertised, "false" otherwise.
+     * @param advertiseUri The advertised URI which can be used to retrieve the file contents.
+     * @param lazyCreate true if you want to lazy-create the file (a.k.a. on-demand.)
+     * @param config The Configuration
+     * @return The FileAppender.
+     * @since 2.7
+     */
+    @PluginFactory
+    public static FileAppender createAppender(
+            // @formatter:off
+            @PluginAttribute("fileName") final String fileName,
+            @PluginAttribute(value = "append", defaultBoolean = true) final boolean append,
+            @PluginAttribute("locking") final boolean locking,
+            @PluginAttribute("name") final String name,
+            @PluginAttribute(value = "immediateFlush", defaultBoolean = true) final boolean immediateFlush,
+            @PluginAttribute(value = "ignoreExceptions", defaultBoolean = true) final boolean ignoreExceptions,
+            @PluginAttribute(value = "bufferedIo", defaultBoolean = true) boolean bufferedIo,
+            @PluginAttribute(value = "bufferSize", defaultInt = DEFAULT_BUFFER_SIZE) final int bufferSize,
+            @PluginElement("Layout") Layout<? extends Serializable> layout,
+            @PluginElement("Filter") final Filter filter,
+            @PluginAttribute("advertise") final boolean advertise,
+            @PluginAttribute("advertiseUri") final String advertiseUri,
+            @PluginAttribute("lazyCreate") final boolean lazyCreate,
+            @PluginConfiguration final Configuration config) {
+             // @formatter:on
+        if (locking && bufferedIo) {
+            LOGGER.warn("Locking and buffering are mutually exclusive. No buffering will occur for {}", fileName);
+            bufferedIo = false;
+        }
+        if (!bufferedIo && bufferSize > 0) {
+            LOGGER.warn("The bufferSize is set to {} but bufferedIo is not true: {}", bufferSize, bufferedIo);
+        }
+        if (name == null) {
+            LOGGER.error("No name provided for FileAppender");
+            return null;
+        }
+        if (fileName == null) {
+            LOGGER.error("No filename provided for FileAppender with name {}", name);
+            return null;
+        }
+        if (layout == null) {
+            layout = PatternLayout.createDefaultLayout();
+        }
+
+        final FileManager manager = FileManager.getFileManager(fileName, append, locking, bufferedIo, lazyCreate,
+                advertiseUri, layout, bufferSize, immediateFlush);
+        if (manager == null) {
+            return null;
+        }
+
+        return new FileAppender(name, layout, filter, manager, fileName, ignoreExceptions, !bufferedIo || immediateFlush,
+                advertise ? config.getAdvertiser() : null);
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61f706fc/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
index af10d25..71d152b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
@@ -51,7 +51,11 @@ public class FileManager extends OutputStreamManager {
         this(fileName, os, append, locking, advertiseURI, layout, writeHeader, ByteBuffer.wrap(new byte[bufferSize]));
     }
 
-    /** @since 2.6 */
+    /**
+     * @deprecated 
+     * @since 2.6 
+     */
+    @Deprecated
     protected FileManager(final String fileName, final OutputStream os, final boolean append, final boolean locking,
             final String advertiseURI, final Layout<? extends Serializable> layout, final boolean writeHeader,
             final ByteBuffer buffer) {
@@ -62,12 +66,27 @@ public class FileManager extends OutputStreamManager {
         this.bufferSize = buffer.capacity();
     }
 
+    /** 
+     * @throws IOException 
+     * @since 2.7 
+     */
+    protected FileManager(final String fileName, final boolean append, final boolean locking, final boolean lazyCreate,
+            final String advertiseURI, final Layout<? extends Serializable> layout, final boolean writeHeader,
+            final ByteBuffer buffer) throws IOException {
+        super(fileName, lazyCreate, layout, writeHeader, buffer);
+        this.isAppend = append;
+        this.isLocking = locking;
+        this.advertiseURI = advertiseURI;
+        this.bufferSize = buffer.capacity();
+    }
+
     /**
      * Returns the FileManager.
      * @param fileName The name of the file to manage.
      * @param append true if the file should be appended to, false if it should be overwritten.
      * @param locking true if the file should be locked while writing, false otherwise.
      * @param bufferedIo true if the contents should be buffered as they are written.
+     * @param lazyCreate true if you want to lazy-create the file (a.k.a. on-demand.)
      * @param advertiseUri the URI to use when advertising the file
      * @param layout The layout
      * @param bufferSize buffer size for buffered IO
@@ -75,31 +94,40 @@ public class FileManager extends OutputStreamManager {
      * @return A FileManager for the File.
      */
     public static FileManager getFileManager(final String fileName, final boolean append, boolean locking,
-            final boolean bufferedIo, final String advertiseUri, final Layout<? extends Serializable> layout,
-            final int bufferSize, final boolean immediateFlush) {
+            final boolean bufferedIo, boolean lazyCreate, final String advertiseUri,
+            final Layout<? extends Serializable> layout, final int bufferSize, final boolean immediateFlush) {
 
         if (locking && bufferedIo) {
             locking = false;
         }
-        return (FileManager) getManager(fileName, new FactoryData(append, locking, bufferedIo, bufferSize,
-                immediateFlush, advertiseUri, layout), FACTORY);
+        return (FileManager) getManager(fileName,
+                new FactoryData(append, locking, bufferedIo, bufferSize, immediateFlush, lazyCreate, advertiseUri, layout),
+                FACTORY);
     }
 
     @Override
-    protected synchronized void write(final byte[] bytes, final int offset, final int length, final boolean immediateFlush)  {
-
+    protected OutputStream createOutputStream() throws FileNotFoundException {
+        return new FileOutputStream(getFileName(), isAppend);
+    }
+    
+    @Override
+    protected synchronized void write(final byte[] bytes, final int offset, final int length,
+            final boolean immediateFlush) {
         if (isLocking) {
-            final FileChannel channel = ((FileOutputStream) getOutputStream()).getChannel();
-            /*
-             * Lock the whole file. This could be optimized to only lock from the current file position. Note that
-             * locking may be advisory on some systems and mandatory on others, so locking just from the current
-             * position would allow reading on systems where locking is mandatory. Also, Java 6 will throw an exception
-             * if the region of the file is already locked by another FileChannel in the same JVM. Hopefully, that will
-             * be avoided since every file should have a single file manager - unless two different files strings are
-             * configured that somehow map to the same file.
-             */
-            try (final FileLock lock = channel.lock(0, Long.MAX_VALUE, false)) {
-                super.write(bytes, offset, length, immediateFlush);
+            try {
+                @SuppressWarnings("resource")
+                final FileChannel channel = ((FileOutputStream) getOutputStream()).getChannel();
+                /*
+                 * Lock the whole file. This could be optimized to only lock from the current file position. Note that
+                 * locking may be advisory on some systems and mandatory on others, so locking just from the current
+                 * position would allow reading on systems where locking is mandatory. Also, Java 6 will throw an
+                 * exception if the region of the file is already locked by another FileChannel in the same JVM.
+                 * Hopefully, that will be avoided since every file should have a single file manager - unless two
+                 * different files strings are configured that somehow map to the same file.
+                 */
+                try (final FileLock lock = channel.lock(0, Long.MAX_VALUE, false)) {
+                    super.write(bytes, offset, length, immediateFlush);
+                }
             } catch (final IOException ex) {
                 throw new AppenderLoggingException("Unable to obtain lock on " + getName(), ex);
             }
@@ -162,6 +190,7 @@ public class FileManager extends OutputStreamManager {
         private final boolean bufferedIO;
         private final int bufferSize;
         private final boolean immediateFlush;
+        private final boolean lazyCreate;
         private final String advertiseURI;
         private final Layout<? extends Serializable> layout;
 
@@ -172,15 +201,19 @@ public class FileManager extends OutputStreamManager {
          * @param bufferedIO Buffering flag.
          * @param bufferSize Buffer size.
          * @param immediateFlush flush on every write or not
+         * @param lazyCreate if you want to lazy-create the file (a.k.a. on-demand.)
          * @param advertiseURI the URI to use when advertising the file
+         * @param layout The layout
          */
         public FactoryData(final boolean append, final boolean locking, final boolean bufferedIO, final int bufferSize,
-                final boolean immediateFlush, final String advertiseURI, final Layout<? extends Serializable> layout) {
+                final boolean immediateFlush, final boolean lazyCreate, final String advertiseURI,
+                final Layout<? extends Serializable> layout) {
             this.append = append;
             this.locking = locking;
             this.bufferedIO = bufferedIO;
             this.bufferSize = bufferSize;
             this.immediateFlush = immediateFlush;
+            this.lazyCreate = lazyCreate;
             this.advertiseURI = advertiseURI;
             this.layout = layout;
         }
@@ -192,12 +225,11 @@ public class FileManager extends OutputStreamManager {
     private static class FileManagerFactory implements ManagerFactory<FileManager, FactoryData> {
 
         /**
-         * Create a FileManager.
+         * Creates a FileManager.
          * @param name The name of the File.
          * @param data The FactoryData
          * @return The FileManager for the File.
          */
-        @SuppressWarnings("resource")
         @Override
         public FileManager createManager(final String name, final FactoryData data) {
             final File file = new File(name);
@@ -208,12 +240,11 @@ public class FileManager extends OutputStreamManager {
 
             final boolean writeHeader = !data.append || !file.exists();
             try {
-                final FileOutputStream fos = new FileOutputStream(name, data.append);
                 final int actualSize = data.bufferedIO ? data.bufferSize : Constants.ENCODER_BYTE_BUFFER_SIZE;
                 final ByteBuffer buffer = ByteBuffer.wrap(new byte[actualSize]);
-                return new FileManager(name, fos, data.append, data.locking, data.advertiseURI, data.layout,
+                return new FileManager(name, data.append, data.locking, data.lazyCreate, data.advertiseURI, data.layout,
                         writeHeader, buffer);
-            } catch (final FileNotFoundException ex) {
+            } catch (final IOException ex) {
                 LOGGER.error("FileManager (" + name + ") " + ex, ex);
             }
             return null;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61f706fc/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
index 794610c..e707bea 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
@@ -18,6 +18,7 @@ package org.apache.logging.log4j.core.appender;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.util.Objects;
 
@@ -37,6 +38,7 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
 
     protected OutputStreamManager(final OutputStream os, final String streamName, final Layout<?> layout,
             final boolean writeHeader) {
+        // Can't use new ctor because it throws an exception
         this(os, streamName, layout, writeHeader, ByteBuffer.wrap(new byte[Constants.ENCODER_BYTE_BUFFER_SIZE]));
     }
 
@@ -48,7 +50,9 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
      * @param writeHeader
      * @param byteBuffer
      * @since 2.6
+     * @deprecated
      */
+    @Deprecated
     protected OutputStreamManager(final OutputStream os, final String streamName, final Layout<?> layout,
             final boolean writeHeader, final ByteBuffer byteBuffer) {
         super(streamName);
@@ -58,7 +62,7 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
             final byte[] header = layout.getHeader();
             if (header != null) {
                 try {
-                    this.os.write(header, 0, header.length);
+                    getOutputStream().write(header, 0, header.length);
                 } catch (final IOException e) {
                     logError("Unable to write header", e);
                 }
@@ -68,6 +72,30 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
     }
 
     /**
+     * @param byteBuffer
+     * @throws IOException 
+     * @since 2.7
+     */
+    protected OutputStreamManager(final String streamName, final boolean lazyCreate, final Layout<? extends Serializable> layout,
+            final boolean writeHeader, final ByteBuffer byteBuffer)
+            throws IOException {
+        super(streamName);
+        this.layout = layout;
+        this.byteBuffer = Objects.requireNonNull(byteBuffer, "byteBuffer");
+        this.os = lazyCreate ? null : createOutputStream();
+        if (writeHeader && layout != null) {
+            final byte[] header = layout.getHeader();
+            if (header != null) {
+                try {
+                    getOutputStream().write(header, 0, header.length);
+                } catch (final IOException e) {
+                    logError("Unable to write header for " + streamName, e);
+                }
+            }
+        }
+    }
+
+    /**
      * Creates a Manager.
      *
      * @param name The name of the stream to manage.
@@ -81,6 +109,11 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
         return AbstractManager.getManager(name, factory, data);
     }
 
+    @SuppressWarnings("unused")
+    protected OutputStream createOutputStream() throws IOException {
+        throw new IllegalStateException(getClass().getCanonicalName() + " must implement createOutputStream()");
+    }
+    
     /**
      * Indicate whether the footer should be skipped or not.
      * @param skipFooter true if the footer should be skipped.
@@ -119,7 +152,10 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
         return getCount() > 0;
     }
 
-    protected OutputStream getOutputStream() {
+    protected OutputStream getOutputStream() throws IOException {
+        if (os == null) {
+            os = createOutputStream();
+        }
         return os;
     }
 
@@ -208,10 +244,9 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
      */
     protected synchronized void writeToDestination(final byte[] bytes, final int offset, final int length) {
         try {
-            os.write(bytes, offset, length);
+            getOutputStream().write(bytes, offset, length);
         } catch (final IOException ex) {
-            final String msg = "Error writing to stream " + getName();
-            throw new AppenderLoggingException(msg, ex);
+            throw new AppenderLoggingException("Error writing to stream " + getName(), ex);
         }
     }
 
@@ -220,11 +255,13 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
      * @since 2.6
      */
     protected synchronized void flushDestination() {
-        try {
-            os.flush();
-        } catch (final IOException ex) {
-            final String msg = "Error flushing stream " + getName();
-            throw new AppenderLoggingException(msg, ex);
+        final OutputStream stream = os; // access volatile field only once per method
+        if (stream != null) {
+            try {
+                stream.flush();
+            } catch (final IOException ex) {
+                throw new AppenderLoggingException("Error flushing stream " + getName(), ex);
+            }
         }
     }
 
@@ -255,7 +292,7 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
     protected synchronized void close() {
         flush();
         final OutputStream stream = os; // access volatile field only once per method
-        if (stream == System.out || stream == System.err) {
+        if (stream == null || stream == System.out || stream == System.err) {
             return;
         }
         try {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61f706fc/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
index 9934d10..760715d 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
@@ -24,6 +24,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStreamReader;
 import java.nio.file.Files;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -44,117 +45,151 @@ import org.junit.Assert;
 import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
 /**
- *
+ * Tests {@link FileAppender}.
  */
+@RunWith(Parameterized.class)
 public class FileAppenderTest {
 
-    private static final String FILENAME = "target/fileAppenderTest.log";
+    @Parameters(name = "lazyCreate = {0}")
+    public static Boolean[] getParameters() {
+        return new Boolean[] { false, true };
+    }
+
+    private static final String FILE_NAME = "target/fileAppenderTest.log";
+    private static final Path PATH = Paths.get(FILE_NAME);
     private static final int THREADS = 2;
 
+    public FileAppenderTest(boolean lazyCreate) {
+        super();
+        this.lazyCreate = lazyCreate;
+    }
+
+    private final boolean lazyCreate;
+    private final int threadCount = THREADS;
+
     @Rule
-    public CleanFiles files = new CleanFiles(FILENAME);
+    public CleanFiles files = new CleanFiles(PATH);
 
     @AfterClass
     public static void cleanupClass() {
-        assertTrue("Manager for " + FILENAME + " not removed", !AbstractManager.hasManager(FILENAME));
+        assertTrue("Manager for " + FILE_NAME + " not removed", !AbstractManager.hasManager(FILE_NAME));
     }
 
     @Test
     public void testAppender() throws Exception {
-        writer(false, 1, "test");
-        verifyFile(1);
+        final int logEventCount = 1;
+        writer(false, logEventCount, "test", lazyCreate, false);
+        verifyFile(logEventCount);
+    }
+
+    @Test
+    public void testLazyStart() throws Exception {
+        final Layout<String> layout = PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
+                .build();
+        final FileAppender appender = FileAppender.createAppender(FILE_NAME, true, false, "test", false, false, false,
+                1, layout, null, false, null, lazyCreate, null);
+        try {
+            Assert.assertNotEquals(lazyCreate, Files.exists(PATH));
+            appender.start();
+            Assert.assertNotEquals(lazyCreate, Files.exists(PATH));
+        } finally {
+            appender.stop();
+        }
+        Assert.assertNotEquals(lazyCreate, Files.exists(PATH));
     }
 
     @Test
     public void testSmallestBufferSize() throws Exception {
-        final Layout<String> layout = PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN).build();
-        final String bufferSizeStr = "1";
-        final FileAppender appender = FileAppender.createAppender(FILENAME, "true", "false", "test", "false", "false",
-                "false", bufferSizeStr, layout, null, "false", null, null);
-        appender.start();
-        final File file = new File(FILENAME);
-        assertTrue("Appender did not start", appender.isStarted());
-        long curLen = file.length();
-        long prevLen = curLen;
-        assertTrue("File length: " + curLen, curLen == 0);
-        for (int i = 0; i < 100; ++i) {
-            final LogEvent event = Log4jLogEvent.newBuilder().setLoggerName("TestLogger") //
-                    .setLoggerFqcn(FileAppenderTest.class.getName()).setLevel(Level.INFO) //
-                    .setMessage(new SimpleMessage("Test")).setThreadName(this.getClass().getSimpleName()) //
-                    .setTimeMillis(System.currentTimeMillis()).build();
-            try {
-                appender.append(event);
-                curLen = file.length();
-                assertTrue("File length: " + curLen, curLen > prevLen);
-                Thread.sleep(25); // Give up control long enough for another thread/process to occasionally do
-                                  // something.
-            } catch (final Exception ex) {
-                throw ex;
+        final Layout<String> layout = PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
+                .build();
+        final FileAppender appender = FileAppender.createAppender(FILE_NAME, true, false, "test", false, false, false,
+                1, layout, null, false, null, lazyCreate, null);
+        try {
+            appender.start();
+            final File file = new File(FILE_NAME);
+            assertTrue("Appender did not start", appender.isStarted());
+            Assert.assertNotEquals(lazyCreate, Files.exists(PATH));
+            long curLen = file.length();
+            long prevLen = curLen;
+            assertTrue("File length: " + curLen, curLen == 0);
+            for (int i = 0; i < 100; ++i) {
+                final LogEvent event = Log4jLogEvent.newBuilder().setLoggerName("TestLogger") //
+                        .setLoggerFqcn(FileAppenderTest.class.getName()).setLevel(Level.INFO) //
+                        .setMessage(new SimpleMessage("Test")).setThreadName(this.getClass().getSimpleName()) //
+                        .setTimeMillis(System.currentTimeMillis()).build();
+                try {
+                    appender.append(event);
+                    curLen = file.length();
+                    assertTrue("File length: " + curLen, curLen > prevLen);
+                    // Give up control long enough for another thread/process to occasionally do something.
+                    Thread.sleep(25);
+                } catch (final Exception ex) {
+                    throw ex;
+                }
+                prevLen = curLen;
             }
-            prevLen = curLen;
+        } finally {
+            appender.stop();
         }
-        appender.stop();
         assertFalse("Appender did not stop", appender.isStarted());
     }
 
     @Test
     public void testLockingAppender() throws Exception {
-        writer(true, 1, "test");
-        verifyFile(1);
+        final int logEventCount = 1;
+        writer(true, logEventCount, "test", lazyCreate, false);
+        verifyFile(logEventCount);
     }
 
     @Test
-    public void testMultipleAppenders() throws Exception {
-        final ExecutorService pool = Executors.newFixedThreadPool(THREADS);
-        final Exception[] error = new Exception[1];
-        final int count = 100;
-        final Runnable runnable = new FileWriterRunnable(false, count, error);
-        for (int i = 0; i < THREADS; ++i) {
-            pool.execute(runnable);
+    public void testMultipleAppenderThreads() throws Exception {
+        testMultipleLockingAppenderThreads(false, threadCount);
+    }
+
+    private void testMultipleLockingAppenderThreads(final boolean lock, int threadCount)
+            throws InterruptedException, Exception {
+        final ExecutorService threadPool = Executors.newFixedThreadPool(threadCount);
+        final Exception[] exceptionRef = new Exception[1];
+        final int logEventCount = 100;
+        final Runnable runnable = new FileWriterRunnable(lock, logEventCount, exceptionRef);
+        for (int i = 0; i < threadCount; ++i) {
+            threadPool.execute(runnable);
         }
-        pool.shutdown();
-        pool.awaitTermination(10, TimeUnit.SECONDS);
-        if (error[0] != null) {
-            throw error[0];
+        threadPool.shutdown();
+        Assert.assertTrue("The thread pool has not shutdown: " + threadPool,
+                threadPool.awaitTermination(10, TimeUnit.SECONDS));
+        if (exceptionRef[0] != null) {
+            throw exceptionRef[0];
         }
-        verifyFile(THREADS * count);
+        verifyFile(threadCount * logEventCount);
     }
 
     @Test
-    public void testMultipleLockedAppenders() throws Exception {
-        final ExecutorService pool = Executors.newFixedThreadPool(THREADS);
-        final Exception[] error = new Exception[1];
-        final int count = 100;
-        final Runnable runnable = new FileWriterRunnable(true, count, error);
-        for (int i = 0; i < THREADS; ++i) {
-            pool.execute(runnable);
-        }
-        pool.shutdown();
-        pool.awaitTermination(10, TimeUnit.SECONDS);
-        if (error[0] != null) {
-            throw error[0];
-        }
-        verifyFile(THREADS * count);
+    public void testMultipleLockingAppenders() throws Exception {
+        testMultipleLockingAppenderThreads(true, threadCount);
     }
 
     @Test
     @Ignore
     public void testMultipleVMs() throws Exception {
         final String classPath = System.getProperty("java.class.path");
-        final Integer count = 10;
-        final int processeCount = 3;
-        final Process[] processes = new Process[processeCount];
-        final ProcessBuilder[] builders = new ProcessBuilder[processeCount];
-        for (int index = 0; index < processeCount; ++index) {
+        final Integer logEventCount = 10;
+        final int processCount = 3;
+        final Process[] processes = new Process[processCount];
+        final ProcessBuilder[] builders = new ProcessBuilder[processCount];
+        for (int index = 0; index < processCount; ++index) {
             builders[index] = new ProcessBuilder("java", "-cp", classPath, ProcessTest.class.getName(),
-                    "Process " + index, count.toString(), "true");
+                    "Process " + index, logEventCount.toString(), "true", Boolean.toString(lazyCreate));
         }
-        for (int index = 0; index < processeCount; ++index) {
+        for (int index = 0; index < processCount; ++index) {
             processes[index] = builders[index].start();
         }
-        for (int index = 0; index < processeCount; ++index) {
+        for (int index = 0; index < processCount; ++index) {
             final Process process = processes[index];
             // System.out.println("Process " + index + " exited with " + p.waitFor());
             try (final BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
@@ -165,63 +200,75 @@ public class FileAppenderTest {
             }
             process.destroy();
         }
-        verifyFile(count * processeCount);
+        verifyFile(logEventCount * processCount);
     }
 
-    private static void writer(final boolean lock, final int count, final String name) throws Exception {
-        final Layout<String> layout = PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN).build();
-        final FileAppender app = FileAppender.createAppender(FILENAME, "true", Boolean.toString(lock), "test", "false",
-                "false", "false", null, layout, null, "false", null, null);
-        app.start();
-        assertTrue("Appender did not start", app.isStarted());
-        Assert.assertTrue(Files.exists(Paths.get(FILENAME)));
-        for (int i = 0; i < count; ++i) {
-            final LogEvent event = Log4jLogEvent.newBuilder().setLoggerName("TestLogger")
-                    .setLoggerFqcn(FileAppenderTest.class.getName()).setLevel(Level.INFO)
-                    .setMessage(new SimpleMessage("Test")).setThreadName(name).setTimeMillis(System.currentTimeMillis())
-                    .build();
-            try {
-                app.append(event);
-                Thread.sleep(25); // Give up control long enough for another thread/process to occasionally do
-                                  // something.
-            } catch (final Exception ex) {
-                throw ex;
+    private static void writer(final boolean lock, final int logEventCount, final String name, boolean lazyCreate,
+            boolean concurrent) throws Exception {
+        final Layout<String> layout = PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
+                .build();
+        final FileAppender appender = FileAppender.createAppender(FILE_NAME, true, lock, "test", false, false, false,
+                FileAppender.DEFAULT_BUFFER_SIZE, layout, null, false, null, lazyCreate, null);
+        try {
+            appender.start();
+            assertTrue("Appender did not start", appender.isStarted());
+            final boolean exists = Files.exists(PATH);
+            String msg = String.format("concurrent = %s, lazyCreate = %s, file exists = %s", concurrent, lazyCreate,
+                    exists);
+            // If concurrent the file might have been created (or not.)
+            // Can't really test lazyCreate && concurrent.
+            final boolean expectFileCreated = !lazyCreate;
+            if (concurrent && expectFileCreated) {
+                Assert.assertTrue(msg, exists);
+            } else if (expectFileCreated) {
+                Assert.assertNotEquals(msg, lazyCreate, exists);
             }
+            for (int i = 0; i < logEventCount; ++i) {
+                final LogEvent logEvent = Log4jLogEvent.newBuilder().setLoggerName("TestLogger")
+                        .setLoggerFqcn(FileAppenderTest.class.getName()).setLevel(Level.INFO)
+                        .setMessage(new SimpleMessage("Test")).setThreadName(name)
+                        .setTimeMillis(System.currentTimeMillis()).build();
+                try {
+                    appender.append(logEvent);
+                    Thread.sleep(25); // Give up control long enough for another thread/process to occasionally do
+                                      // something.
+                } catch (final Exception ex) {
+                    throw ex;
+                }
+            }
+        } finally {
+            appender.stop();
         }
-        app.stop();
-        assertFalse("Appender did not stop", app.isStarted());
+        assertFalse("Appender did not stop", appender.isStarted());
     }
 
     private void verifyFile(final int count) throws Exception {
         // String expected = "[\\w]* \\[\\s*\\] INFO TestLogger - Test$";
         final String expected = "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3} \\[[^\\]]*\\] INFO TestLogger - Test";
         final Pattern pattern = Pattern.compile(expected);
-        final FileInputStream fis = new FileInputStream(FILENAME);
-        final BufferedReader is = new BufferedReader(new InputStreamReader(fis));
-        int counter = 0;
-        String str = Strings.EMPTY;
-        while (is.ready()) {
-            str = is.readLine();
-            // System.out.println(str);
-            ++counter;
-            final Matcher matcher = pattern.matcher(str);
-            assertTrue("Bad data: " + str, matcher.matches());
+        int lines = 0;
+        try (final BufferedReader is = new BufferedReader(new InputStreamReader(new FileInputStream(FILE_NAME)))) {
+            String str = Strings.EMPTY;
+            while (is.ready()) {
+                str = is.readLine();
+                // System.out.println(str);
+                ++lines;
+                final Matcher matcher = pattern.matcher(str);
+                assertTrue("Unexpected data: " + str, matcher.matches());
+            }
         }
-        fis.close();
-        assertTrue("Incorrect count: was " + counter + " should be " + count, count == counter);
-        fis.close();
-
+        Assert.assertEquals(count, lines);
     }
 
     public class FileWriterRunnable implements Runnable {
         private final boolean lock;
-        private final int count;
-        private final Exception[] error;
+        private final int logEventCount;
+        private final Exception[] exceptionRef;
 
-        public FileWriterRunnable(final boolean lock, final int count, final Exception[] error) {
+        public FileWriterRunnable(final boolean lock, final int logEventCount, final Exception[] exceptionRef) {
             this.lock = lock;
-            this.count = count;
-            this.error = error;
+            this.logEventCount = logEventCount;
+            this.exceptionRef = exceptionRef;
         }
 
         @Override
@@ -229,10 +276,9 @@ public class FileAppenderTest {
             final Thread thread = Thread.currentThread();
 
             try {
-                writer(lock, count, thread.getName());
-
+                writer(lock, logEventCount, thread.getName(), lazyCreate, true);
             } catch (final Exception ex) {
-                error[0] = ex;
+                exceptionRef[0] = ex;
                 throw new RuntimeException(ex);
             }
         }
@@ -256,10 +302,12 @@ public class FileAppenderTest {
             }
             final boolean lock = Boolean.parseBoolean(args[2]);
 
+            final boolean lazyCreate = Boolean.parseBoolean(args[2]);
+
             // System.out.println("Got arguments " + id + ", " + count + ", " + lock);
 
             try {
-                writer(lock, count, id);
+                writer(lock, count, id, lazyCreate, true);
                 // thread.sleep(50);
 
             } catch (final Exception ex) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61f706fc/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/InMemoryAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/InMemoryAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/InMemoryAppender.java
index 2d7ccaa..da8b71a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/InMemoryAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/InMemoryAppender.java
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j.test.appender;
 
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.Serializable;
 
 import org.apache.logging.log4j.core.Layout;
@@ -48,7 +49,11 @@ public class InMemoryAppender extends AbstractOutputStreamAppender<InMemoryAppen
 
         @Override
         public String toString() {
-            return getOutputStream().toString();
+            try {
+                return getOutputStream().toString();
+            } catch (IOException e) {
+                throw new IllegalStateException(e);
+            }
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61f706fc/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 1f1fa85..922aef0 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -60,6 +60,9 @@
       <action issue="LOG4J2-1313" dev="rpopma" type="fix" due-to="Philipp Knobel">
         Properties declared in configuration can now have their value either in the element body or in an attribute named "value".
       </action>
+      <action issue="LOG4J2-1501" dev="ggregory" type="add" due-to="Gary Gregory">
+        [LOG4J2-1501] FileAppender should be able to create files lazily.        
+      </action>
       <action issue="LOG4J2-1471" dev="ggregory" type="add" due-to="Gary Gregory">
         [PatternLayout] Add an ANSI option to %xThrowable.
       </action>


[37/50] logging-log4j2 git commit: Add assert.

Posted by rp...@apache.org.
Add assert.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: ba677d82dc4bf8bec3c9f129653ac13862bbcf38
Parents: 2d40959
Author: ggregory <gg...@US-L-GG02.rocketsoftware.com>
Authored: Tue Aug 9 10:41:22 2016 -0700
Committer: ggregory <gg...@US-L-GG02.rocketsoftware.com>
Committed: Tue Aug 9 10:41:22 2016 -0700

----------------------------------------------------------------------
 .../config/plugins/validation/validators/RequiredValidatorTest.java | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ba677d82/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java
index fbb7660..15a51ae 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java
@@ -38,6 +38,7 @@ public class RequiredValidatorTest {
         final PluginManager manager = new PluginManager("Test");
         manager.collectPlugins();
         plugin = (PluginType<ValidatingPlugin>) manager.getPluginType("Validator");
+        assertNotNull("Rebuild this module to make sure annotaion processing kicks in.", plugin);
         node = new Node(null, "Validator", plugin);
     }
 


[02/50] logging-log4j2 git commit: Make AbstractStringLayout.getLogEventFactory() private per Remko's suggestion.

Posted by rp...@apache.org.
Make AbstractStringLayout.getLogEventFactory() private per Remko's
suggestion.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 8bb88dfa137c63936e719834d8e688ca764e2809
Parents: 5e1bb8b
Author: Gary Gregory <gg...@apache.org>
Authored: Sun Aug 7 09:48:43 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Sun Aug 7 09:48:43 2016 -0700

----------------------------------------------------------------------
 .../org/apache/logging/log4j/core/layout/AbstractStringLayout.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8bb88dfa/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
index 9e7deb5..52ca082 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
@@ -212,7 +212,7 @@ public abstract class AbstractStringLayout extends AbstractLayout<String> implem
         return headerSerializer;
     }
 
-    protected DefaultLogEventFactory getLogEventFactory() {
+    private DefaultLogEventFactory getLogEventFactory() {
         return DefaultLogEventFactory.getInstance();
     }
 


[50/50] logging-log4j2 git commit: Merge remote-tracking branch 'remotes/origin/master' into LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure

Posted by rp...@apache.org.
Merge remote-tracking branch 'remotes/origin/master' into LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure


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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: a12913d7ca2c109e31cc2c65eca1631d8b0d6d81
Parents: 6b5a80a c0cb21e
Author: rpopma <rp...@apache.org>
Authored: Fri Aug 12 21:11:44 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Fri Aug 12 21:11:44 2016 +0900

----------------------------------------------------------------------
 src/site/xdoc/manual/layouts.xml.vm | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[20/50] logging-log4j2 git commit: [LOG4J2-1501] FileAppender should be able to create files lazily. Use final.

Posted by rp...@apache.org.
[LOG4J2-1501] FileAppender should be able to create files lazily. Use
final.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 16d06e8c0450548ec155f68a1f75adc47f1384a8
Parents: 32c9b99
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 10:42:09 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 10:42:09 2016 -0700

----------------------------------------------------------------------
 .../core/appender/OutputStreamAppenderTest.java | 206 +++++++++----------
 1 file changed, 103 insertions(+), 103 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/16d06e8c/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
index 206e98b..dd17dfb 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
@@ -1,103 +1,103 @@
-/*
- * 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.appender;
-
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.OutputStream;
-import java.sql.SQLException;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.Appender;
-import org.apache.logging.log4j.core.Layout;
-import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.layout.PatternLayout;
-import org.junit.Assert;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestName;
-
-/**
- * Tests {@link OutputStreamAppender}.
- */
-public class OutputStreamAppenderTest {
-
-    private static final String TEST_MSG = "FOO ERROR";
-
-    @Rule
-    public TestName testName = new TestName();
-
-    private String getName(final OutputStream out) {
-        return out.getClass().getSimpleName() + "." + testName.getMethodName();
-    }
-
-    /**
-     * Tests that you can add an output stream appender dynamically.
-     */
-    private void addAppender(final OutputStream outputStream, final String outputStreamName) {
-        final LoggerContext context = LoggerContext.getContext(false);
-        final Configuration config = context.getConfiguration();
-        final PatternLayout layout = PatternLayout.createDefaultLayout(config);
-        final Appender appender = OutputStreamAppender.createAppender(layout, null, outputStream, outputStreamName, false, true);
-        appender.start();
-        config.addAppender(appender);
-        ConfigurationTestUtils.updateLoggers(appender, config);
-    }
-
-    @Test
-    public void testOutputStreamAppenderToBufferedOutputStream() throws SQLException {
-        final ByteArrayOutputStream out = new ByteArrayOutputStream();
-        final OutputStream os = new BufferedOutputStream(out);
-        final String name = getName(out);
-        final Logger logger = LogManager.getLogger(name);
-        addAppender(os, name);
-        logger.error(TEST_MSG);
-        final String actual = out.toString();
-        Assert.assertTrue(actual, actual.contains(TEST_MSG));
-    }
-
-    @Test
-    public void testOutputStreamAppenderToByteArrayOutputStream() throws SQLException {
-        final OutputStream out = new ByteArrayOutputStream();
-        final String name = getName(out);
-        final Logger logger = LogManager.getLogger(name);
-        addAppender(out, name);
-        logger.error(TEST_MSG);
-        final String actual = out.toString();
-        Assert.assertTrue(actual, actual.contains(TEST_MSG));
-    }
-
-    /**
-     * Validates that the code pattern we use to add an appender on the fly
-     * works with a basic appender that is not the new OutputStream appender or
-     * new Writer appender.
-     */
-    @Test
-    public void testUpdatePatternWithFileAppender() {
-        final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
-        final Configuration config = ctx.getConfiguration();
-        final Layout<?> layout = PatternLayout.createDefaultLayout();
-        final Appender appender = FileAppender.createAppender("target/" + getClass().getName() + ".log", "false",
-                "false", "File", "true", "false", "false", "4000", layout, null, "false", null, config);
-        appender.start();
-        config.addAppender(appender);
-        ConfigurationTestUtils.updateLoggers(appender, config);
-        LogManager.getLogger().error("FOO MSG");
-    }
-}
+/*
+ * 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.appender;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.sql.SQLException;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestName;
+
+/**
+ * Tests {@link OutputStreamAppender}.
+ */
+public class OutputStreamAppenderTest {
+
+    private static final String TEST_MSG = "FOO ERROR";
+
+    @Rule
+    public TestName testName = new TestName();
+
+    private String getName(final OutputStream out) {
+        return out.getClass().getSimpleName() + "." + testName.getMethodName();
+    }
+
+    /**
+     * Tests that you can add an output stream appender dynamically.
+     */
+    private void addAppender(final OutputStream outputStream, final String outputStreamName) {
+        final LoggerContext context = LoggerContext.getContext(false);
+        final Configuration config = context.getConfiguration();
+        final PatternLayout layout = PatternLayout.createDefaultLayout(config);
+        final Appender appender = OutputStreamAppender.createAppender(layout, null, outputStream, outputStreamName, false, true);
+        appender.start();
+        config.addAppender(appender);
+        ConfigurationTestUtils.updateLoggers(appender, config);
+    }
+
+    @Test
+    public void testOutputStreamAppenderToBufferedOutputStream() throws SQLException {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final OutputStream os = new BufferedOutputStream(out);
+        final String name = getName(out);
+        final Logger logger = LogManager.getLogger(name);
+        addAppender(os, name);
+        logger.error(TEST_MSG);
+        final String actual = out.toString();
+        Assert.assertTrue(actual, actual.contains(TEST_MSG));
+    }
+
+    @Test
+    public void testOutputStreamAppenderToByteArrayOutputStream() throws SQLException {
+        final OutputStream out = new ByteArrayOutputStream();
+        final String name = getName(out);
+        final Logger logger = LogManager.getLogger(name);
+        addAppender(out, name);
+        logger.error(TEST_MSG);
+        final String actual = out.toString();
+        Assert.assertTrue(actual, actual.contains(TEST_MSG));
+    }
+
+    /**
+     * Validates that the code pattern we use to add an appender on the fly
+     * works with a basic appender that is not the new OutputStream appender or
+     * new Writer appender.
+     */
+    @Test
+    public void testUpdatePatternWithFileAppender() {
+        final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
+        final Configuration config = ctx.getConfiguration();
+        final Layout<?> layout = PatternLayout.createDefaultLayout();
+        final Appender appender = FileAppender.createAppender("target/" + getClass().getName() + ".log", false,
+                false, "File", true, false, false, 4000, layout, null, false, null, false, config);
+        appender.start();
+        config.addAppender(appender);
+        ConfigurationTestUtils.updateLoggers(appender, config);
+        LogManager.getLogger().error("FOO MSG");
+    }
+}


[39/50] logging-log4j2 git commit: Use "with" as the Builder setter method prefix.

Posted by rp...@apache.org.
Use "with" as the Builder setter method prefix.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: e9cec779d2f6722f97c6e403502a5789ebcaeaa8
Parents: f95a85b
Author: Gary Gregory <gg...@apache.org>
Authored: Tue Aug 9 17:27:19 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Tue Aug 9 17:27:19 2016 -0700

----------------------------------------------------------------------
 .../log4j/core/config/plugins/validation/ValidatingPlugin.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e9cec779/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
index 95a4209..6068f46 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPlugin.java
@@ -57,7 +57,7 @@ public class ValidatingPlugin {
         @Required(message = "The name given by the builder is null")
         private String name;
 
-        public Builder setName(final String name) {
+        public Builder withName(final String name) {
             this.name = name;
             return this;
         }


[34/50] logging-log4j2 git commit: (GC) We know the length in advance, so use it.

Posted by rp...@apache.org.
(GC) We know the length in advance, so use it.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: d4dca3f27643053ba53651b5e446fcf44157975f
Parents: 4eae71b
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 17:19:42 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 17:19:42 2016 -0700

----------------------------------------------------------------------
 .../java/org/apache/logging/log4j/core/config/AppendersPlugin.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d4dca3f2/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java
index e5ae0db..3545d2c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppendersPlugin.java
@@ -42,7 +42,7 @@ public final class AppendersPlugin {
     public static ConcurrentMap<String, Appender> createAppenders(
                 @PluginElement("Appenders") final Appender[] appenders) {
 
-        final ConcurrentMap<String, Appender> map =  new ConcurrentHashMap<>();
+        final ConcurrentMap<String, Appender> map =  new ConcurrentHashMap<>(appenders.length);
 
         for (final Appender appender : appenders) {
             map.put(appender.getName(), appender);


[27/50] logging-log4j2 git commit: [LOG4J2-1505] Create a Builder for FileAppender. Use @Required per Matt's suggestion. Thank you Matt!

Posted by rp...@apache.org.
[LOG4J2-1505] Create a Builder for FileAppender. Use @Required per
Matt's suggestion. Thank you Matt!

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 9401a1f1e52e271727c2b07a5b7aeafcb7f1768b
Parents: de528c5
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 12:54:49 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 12:54:49 2016 -0700

----------------------------------------------------------------------
 .../apache/logging/log4j/core/appender/FileAppender.java | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9401a1f1/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
index 3f364cc..b13cb01 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
@@ -28,6 +28,7 @@ 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.PluginConfiguration;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.net.Advertiser;
 import org.apache.logging.log4j.core.util.Booleans;
@@ -45,6 +46,7 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
     public static class Builder implements org.apache.logging.log4j.core.util.Builder<FileAppender> {
 
         @PluginBuilderAttribute
+        @Required
         private String fileName;
 
         @PluginBuilderAttribute
@@ -54,6 +56,7 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
         private boolean locking;
 
         @PluginBuilderAttribute
+        @Required
         private String name;
 
         @PluginBuilderAttribute
@@ -95,14 +98,6 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             if (!bufferedIo && bufferSize > 0) {
                 LOGGER.warn("The bufferSize is set to {} but bufferedIo is not true: {}", bufferSize, bufferedIo);
             }
-            if (name == null) {
-                LOGGER.error("No name provided for FileAppender");
-                return null;
-            }
-            if (fileName == null) {
-                LOGGER.error("No filename provided for FileAppender with name {}", name);
-                return null;
-            }
             if (layout == null) {
                 layout = PatternLayout.createDefaultLayout();
             }


[17/50] logging-log4j2 git commit: [LOG4J2-1501] FileAppender should be able to create files lazily. Use final.

Posted by rp...@apache.org.
[LOG4J2-1501] FileAppender should be able to create files lazily. Use
final.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: e950cb5173ef15e6e7c5346f74b1b8193c3aa340
Parents: 69f02bd
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 09:51:55 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 09:51:55 2016 -0700

----------------------------------------------------------------------
 .../java/org/apache/logging/log4j/core/appender/FileManager.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e950cb51/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
index 71d152b..f88005a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileManager.java
@@ -94,7 +94,7 @@ public class FileManager extends OutputStreamManager {
      * @return A FileManager for the File.
      */
     public static FileManager getFileManager(final String fileName, final boolean append, boolean locking,
-            final boolean bufferedIo, boolean lazyCreate, final String advertiseUri,
+            final boolean bufferedIo, final boolean lazyCreate, final String advertiseUri,
             final Layout<? extends Serializable> layout, final int bufferSize, final boolean immediateFlush) {
 
         if (locking && bufferedIo) {


[05/50] logging-log4j2 git commit: Parameterize MAX_TRIES.

Posted by rp...@apache.org.
Parameterize MAX_TRIES.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 96f7d65c7c14dd92022a42a09d9787f7f81e67bb
Parents: a3b5f73
Author: Gary Gregory <gg...@apache.org>
Authored: Sun Aug 7 11:26:39 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Sun Aug 7 11:26:39 2016 -0700

----------------------------------------------------------------------
 .../junit/AbstractExternalFileCleaner.java      | 169 ++++++++++---------
 .../apache/logging/log4j/junit/CleanFiles.java  |  14 +-
 .../logging/log4j/junit/CleanFolders.java       |  14 +-
 .../logging/log4j/junit/LoggerContextRule.java  |   4 +-
 4 files changed, 104 insertions(+), 97 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/96f7d65c/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
index 393b847..7860917 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/AbstractExternalFileCleaner.java
@@ -1,81 +1,88 @@
-/*
- * 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.junit;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.rules.ExternalResource;
-
-public abstract class AbstractExternalFileCleaner extends ExternalResource {
-
-    private final boolean cleanAfter;
-    private final boolean cleanBefore;
-    private final List<File> files;
-
-    public AbstractExternalFileCleaner(final boolean before, final boolean after, final File... files) {
-        this.cleanBefore = before;
-        this.cleanAfter = after;
-        this.files = Arrays.asList(files);
-    }
-
-    public AbstractExternalFileCleaner(final boolean before, final boolean after, final String... fileNames) {
-        this.cleanBefore = before;
-        this.cleanAfter = after;
-        this.files = new ArrayList<>(fileNames.length);
-        for (final String fileName : fileNames) {
-            this.files.add(new File(fileName));
-        }
-    }
-
-    @Override
-    protected void after() {
-        if (cleanAfter()) {
-            this.clean();
-        }
-    }
-
-    @Override
-    protected void before() {
-        if (cleanBefore()) {
-            this.clean();
-        }
-    }
-
-    abstract protected void clean();
-
-    public boolean cleanAfter() {
-        return cleanAfter;
-    }
-
-    public boolean cleanBefore() {
-        return cleanBefore;
-    }
-
-    public List<File> getFiles() {
-        return files;
-    }
-
-    @Override
-    public String toString() {
-        return getClass().getSimpleName() + " [files=" + files + ", cleanAfter=" + cleanAfter + ", cleanBefore="
-                + cleanBefore + "]";
-    }
-
-}
+/*
+ * 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.junit;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.rules.ExternalResource;
+
+public abstract class AbstractExternalFileCleaner extends ExternalResource {
+
+    private final boolean cleanAfter;
+    private final boolean cleanBefore;
+    private final List<File> files;
+    private final int maxTries;
+
+    public AbstractExternalFileCleaner(final boolean before, final boolean after, final int maxTries, final File... files) {
+        this.cleanBefore = before;
+        this.cleanAfter = after;
+        this.files = Arrays.asList(files);
+        this.maxTries = maxTries;
+    }
+
+    public AbstractExternalFileCleaner(final boolean before, final boolean after, final int maxTries, final String... fileNames) {
+        this.cleanBefore = before;
+        this.cleanAfter = after;
+        this.files = new ArrayList<>(fileNames.length);
+        for (final String fileName : fileNames) {
+            this.files.add(new File(fileName));
+        }
+        this.maxTries = maxTries;
+    }
+
+    @Override
+    protected void after() {
+        if (cleanAfter()) {
+            this.clean();
+        }
+    }
+
+    @Override
+    protected void before() {
+        if (cleanBefore()) {
+            this.clean();
+        }
+    }
+
+    abstract protected void clean();
+
+    public boolean cleanAfter() {
+        return cleanAfter;
+    }
+
+    public boolean cleanBefore() {
+        return cleanBefore;
+    }
+
+    public List<File> getFiles() {
+        return files;
+    }
+
+    public int getMaxTries() {
+        return maxTries;
+    }
+
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + " [files=" + files + ", cleanAfter=" + cleanAfter + ", cleanBefore="
+                + cleanBefore + "]";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/96f7d65c/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
index 1021bf1..d38ca85 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFiles.java
@@ -28,27 +28,27 @@ import org.junit.Assert;
 public class CleanFiles extends AbstractExternalFileCleaner {
     private static final int MAX_TRIES = 10;
 
-    public CleanFiles(final boolean before, final boolean after, final File... files) {
-        super(before, after, files);
+    public CleanFiles(final boolean before, final boolean after, final int maxTries, final File... files) {
+        super(before, after, maxTries, files);
     }
 
-    public CleanFiles(final boolean before, final boolean after, final String... fileNames) {
-        super(before, after, fileNames);
+    public CleanFiles(final boolean before, final boolean after, final int maxTries, final String... fileNames) {
+        super(before, after, maxTries, fileNames);
     }
 
     public CleanFiles(final File... files) {
-        super(true, true, files);
+        super(true, true, MAX_TRIES, files);
     }
 
     public CleanFiles(final String... fileNames) {
-        super(true, true, fileNames);
+        super(true, true, MAX_TRIES, fileNames);
     }
 
     @Override
     protected void clean() {
         for (final File file : getFiles()) {
             if (file.exists()) {
-                for (int i = 0; i < MAX_TRIES; i++) {
+                for (int i = 0; i < getMaxTries(); i++) {
                     try {
                         if (Files.deleteIfExists(file.toPath())) {
                             // Break from MAX_TRIES and move on to the next file.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/96f7d65c/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
index 6a2f8d6..a4d9023 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/CleanFolders.java
@@ -34,20 +34,20 @@ import org.junit.Assert;
 public class CleanFolders extends AbstractExternalFileCleaner {
     private static final int MAX_TRIES = 10;
 
-    public CleanFolders(final boolean before, final boolean after, final File... files) {
-        super(before, after, files);
+    public CleanFolders(final boolean before, final boolean after, final int maxTries, final File... files) {
+        super(before, after, maxTries, files);
     }
 
-    public CleanFolders(final boolean before, final boolean after, final String... fileNames) {
-        super(before, after, fileNames);
+    public CleanFolders(final boolean before, final boolean after, final int maxTries, final String... fileNames) {
+        super(before, after, maxTries, fileNames);
     }
 
     public CleanFolders(final File... folders) {
-        super(true, true, folders);
+        super(true, true, MAX_TRIES, folders);
     }
 
     public CleanFolders(final String... folderNames) {
-        super(true, true, folderNames);
+        super(true, true, MAX_TRIES, folderNames);
     }
 
     @Override
@@ -57,7 +57,7 @@ public class CleanFolders extends AbstractExternalFileCleaner {
         for (final File folder : getFiles()) {
             if (folder.exists()) {
                 final Path path = folder.toPath();
-                for (int i = 0; i < MAX_TRIES; i++) {
+                for (int i = 0; i < getMaxTries(); i++) {
                     try {
                         cleanFolder(path);
                         if (failures.containsKey(path)) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/96f7d65c/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextRule.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextRule.java b/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextRule.java
index 3468e3f..c9b07aa 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextRule.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/junit/LoggerContextRule.java
@@ -248,8 +248,8 @@ public class LoggerContextRule implements TestRule {
         return RuleChain.outerRule(new CleanFiles(files)).around(this);
     }
 
-    public RuleChain withCleanFoldersRule(final boolean before, final boolean after, final String... folders) {
-        return RuleChain.outerRule(new CleanFolders(before, after, folders)).around(this);
+    public RuleChain withCleanFoldersRule(final boolean before, final boolean after, final int maxTries, final String... folders) {
+        return RuleChain.outerRule(new CleanFolders(before, after, maxTries, folders)).around(this);
     }
 
     public RuleChain withCleanFoldersRule(final String... folders) {


[28/50] logging-log4j2 git commit: Remove unused import.

Posted by rp...@apache.org.
Remove unused import.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 50a142272ed243a0f74d9ef33c23fbdab8295f84
Parents: 9401a1f
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 13:01:47 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 13:01:47 2016 -0700

----------------------------------------------------------------------
 .../org/apache/logging/log4j/core/appender/FileAppenderTest.java    | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/50a14227/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
index b706c31..feb9f11 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
@@ -33,7 +33,6 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;


[47/50] logging-log4j2 git commit: Javadoc.

Posted by rp...@apache.org.
Javadoc.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 87026a9d38473ba644f0fa57003f278d706761df
Parents: df2d248
Author: Gary Gregory <gg...@apache.org>
Authored: Thu Aug 11 14:58:43 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Thu Aug 11 14:58:43 2016 -0700

----------------------------------------------------------------------
 .../org/apache/logging/log4j/core/appender/rolling/FileSize.java    | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/87026a9d/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileSize.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileSize.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileSize.java
index 08e6b9e..bd5dce8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileSize.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileSize.java
@@ -51,6 +51,7 @@ public final class FileSize {
      * abbreviations KB, MB, and GB are also accepted. Matching is case insensitive.
      *
      * @param string The string to convert
+     * @param defaultValue The default value if a problem is detected parsing.
      * @return The Bytes value for the string
      */
     public static long parse(final String string, final long defaultValue) {


[31/50] logging-log4j2 git commit: No need to initialize objects to null.

Posted by rp...@apache.org.
No need to initialize objects to null.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 1558b3625ecf2c54e27269bfb1b4c671574c93d7
Parents: eee314c
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 16:29:08 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 16:29:08 2016 -0700

----------------------------------------------------------------------
 .../apache/logging/log4j/core/layout/PatternLayout.java   | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1558b362/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index 7fde3c8..8afc7fd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -408,13 +408,13 @@ public final class PatternLayout extends AbstractStringLayout {
         private String pattern = PatternLayout.DEFAULT_CONVERSION_PATTERN;
 
         @PluginElement("PatternSelector")
-        private PatternSelector patternSelector = null;
+        private PatternSelector patternSelector;
 
         @PluginConfiguration
-        private Configuration configuration = null;
+        private Configuration configuration;
 
         @PluginElement("Replace")
-        private RegexReplacement regexReplacement = null;
+        private RegexReplacement regexReplacement;
 
         // LOG4J2-783 use platform default by default
         @PluginBuilderAttribute
@@ -427,10 +427,10 @@ public final class PatternLayout extends AbstractStringLayout {
         private boolean noConsoleNoAnsi = false;
 
         @PluginBuilderAttribute
-        private String header = null;
+        private String header;
 
         @PluginBuilderAttribute
-        private String footer = null;
+        private String footer;
 
         private Builder() {
         }


[49/50] logging-log4j2 git commit: Merge remote-tracking branch 'remotes/origin/master' into LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure

Posted by rp...@apache.org.
Merge remote-tracking branch 'remotes/origin/master' into LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure


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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 6b5a80ab8ca417c577075f0cdd8849f368d442e6
Parents: b3a4e9e 87026a9
Author: rpopma <rp...@apache.org>
Authored: Fri Aug 12 20:47:12 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Fri Aug 12 20:47:12 2016 +0900

----------------------------------------------------------------------
 .../apache/logging/log4j/util/Constants.java    |   2 +-
 .../log4j/core/appender/AbstractAppender.java   |  58 +++
 .../appender/AbstractOutputStreamAppender.java  |  21 +
 .../log4j/core/appender/ConsoleAppender.java    |  82 +---
 .../log4j/core/appender/FileAppender.java       | 292 +++++++----
 .../log4j/core/appender/FileManager.java        |  90 +++-
 .../core/appender/MemoryMappedFileAppender.java |   2 +-
 .../core/appender/OutputStreamManager.java      |  59 ++-
 .../core/appender/RandomAccessFileAppender.java |   2 +-
 .../core/appender/RollingFileAppender.java      | 491 +++++++++++--------
 .../RollingRandomAccessFileAppender.java        |   2 +-
 .../rolling/DefaultRolloverStrategy.java        |  10 +-
 .../log4j/core/appender/rolling/FileSize.java   |   1 +
 .../core/async/AsyncQueueFullPolicyFactory.java |   4 +-
 .../log4j/core/config/AppendersPlugin.java      |   4 +-
 .../core/config/plugins/util/PluginBuilder.java |   8 +-
 .../log4j/core/filter/AbstractFilterable.java   |  27 +
 .../log4j/core/layout/AbstractStringLayout.java |   2 +-
 .../log4j/core/layout/PatternLayout.java        |  12 +-
 .../logging/log4j/core/util/Constants.java      |   4 +-
 .../logging/log4j/core/util/TypeUtil.java       |  21 +
 .../core/appender/ConsoleAppenderTest.java      |   8 +-
 .../log4j/core/appender/FileAppenderTest.java   | 304 +++++++-----
 .../core/appender/OutputStreamAppenderTest.java | 214 ++++----
 .../core/appender/rolling/FileSizeTest.java     |   4 +-
 .../rolling/OnStartupTriggeringPolicyTest.java  |  34 +-
 .../rolling/RollingAppenderCronTest.java        |   3 +-
 .../rolling/RollingFileAppenderAccessTest.java  |  23 +-
 .../core/config/CustomConfigurationTest.java    |  13 +-
 .../plugins/util/PluginManagerPackagesTest.java |  10 +-
 .../AbstractPluginWithGenericBuilder.java       |  59 +++
 .../PluginWithGenericSubclassFoo1Builder.java   |  55 +++
 .../plugins/validation/ValidatingPlugin.java    |   2 +-
 .../ValidatingPluginWithGenericBuilder.java     |  75 +++
 .../ValidatingPluginWithTypedBuilder.java       |  70 +++
 .../validators/RequiredValidatorTest.java       |   1 +
 .../ValidatingPluginWithGenericBuilderTest.java |  66 +++
 ...luginWithGenericSubclassFoo1BuilderTest.java |  68 +++
 .../ValidatingPluginWithTypedBuilderTest.java   |  71 +++
 .../junit/AbstractExternalFileCleaner.java      | 232 ++++++---
 .../apache/logging/log4j/junit/CleanFiles.java  |  38 +-
 .../logging/log4j/junit/CleanFolders.java       |  59 +--
 .../logging/log4j/junit/LoggerContextRule.java  |   4 +-
 .../log4j/test/appender/InMemoryAppender.java   |   7 +-
 .../log4j/flume/appender/FlumeAppender.java     |  41 +-
 .../log4j/flume/appender/FlumeAppenderTest.java |  49 +-
 src/changes/changes.xml                         |  21 +-
 src/site/xdoc/manual/appenders.xml              |   5 +-
 48 files changed, 1903 insertions(+), 827 deletions(-)
----------------------------------------------------------------------



[40/50] logging-log4j2 git commit: [LOG4J2-1507] Allow Builders to be completely generic.

Posted by rp...@apache.org.
[LOG4J2-1507] Allow Builders to be completely generic.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 2404f7cb6877f42ddc4818480c13ecec4d1d2739
Parents: e9cec77
Author: Gary Gregory <gg...@apache.org>
Authored: Tue Aug 9 17:36:10 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Tue Aug 9 17:36:10 2016 -0700

----------------------------------------------------------------------
 .../core/config/plugins/util/PluginBuilder.java |  2 +-
 .../ValidatingPluginWithGenericBuilder.java     | 75 ++++++++++++++++++++
 .../ValidatingPluginWithGenericBuilderTest.java | 66 +++++++++++++++++
 3 files changed, 142 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2404f7cb/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
index 1827caf..7ba9981 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
@@ -147,7 +147,7 @@ public class PluginBuilder implements Builder<Object> {
         for (final Method method : clazz.getDeclaredMethods()) {
             if (method.isAnnotationPresent(PluginBuilderFactory.class) &&
                 Modifier.isStatic(method.getModifiers()) &&
-                TypeUtil.isAssignable(Builder.class, method.getGenericReturnType())) {
+                TypeUtil.isAssignable(Builder.class, method.getReturnType())) {
                 ReflectionUtil.makeAccessible(method);
                 return (Builder<?>) method.invoke(null);
             }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2404f7cb/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
new file mode 100644
index 0000000..34297e2
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/ValidatingPluginWithGenericBuilder.java
@@ -0,0 +1,75 @@
+/*
+ * 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.plugins.validation;
+
+import java.util.Objects;
+
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+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.PluginFactory;
+import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
+
+/**
+ *
+ */
+@Plugin(name = "ValidatingPluginWithGenericBuilder", category = "Test")
+public class ValidatingPluginWithGenericBuilder {
+
+    private final String name;
+
+    public ValidatingPluginWithGenericBuilder(final String name) {
+        this.name = Objects.requireNonNull(name, "name");
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @PluginFactory
+    public static ValidatingPluginWithGenericBuilder newValidatingPlugin(
+        @Required(message = "The name given by the factory is null") final String name) {
+        return new ValidatingPluginWithGenericBuilder(name);
+    }
+
+    @PluginBuilderFactory
+    public static <B extends Builder<B>> B newBuilder() {
+        return new Builder<B>().asBuilder();
+    }
+
+    public static class Builder<B extends Builder<B>> implements org.apache.logging.log4j.core.util.Builder<ValidatingPluginWithGenericBuilder> {
+
+        @PluginBuilderAttribute
+        @Required(message = "The name given by the builder is null")
+        private String name;
+
+        public B withName(final String name) {
+            this.name = name;
+            return asBuilder();
+        }
+
+        @SuppressWarnings("unchecked")
+        private B asBuilder() {
+            return (B) this;
+        }
+
+        @Override
+        public ValidatingPluginWithGenericBuilder build() {
+            return new ValidatingPluginWithGenericBuilder(name);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2404f7cb/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
new file mode 100644
index 0000000..8e02f20
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithGenericBuilderTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.plugins.validation.validators;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.core.config.NullConfiguration;
+import org.apache.logging.log4j.core.config.plugins.util.PluginBuilder;
+import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
+import org.apache.logging.log4j.core.config.plugins.util.PluginType;
+import org.apache.logging.log4j.core.config.plugins.validation.ValidatingPluginWithGenericBuilder;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ValidatingPluginWithGenericBuilderTest {
+
+    private PluginType<ValidatingPluginWithGenericBuilder> plugin;
+    private Node node;
+
+    @SuppressWarnings("unchecked")
+    @Before
+    public void setUp() throws Exception {
+        final PluginManager manager = new PluginManager("Test");
+        manager.collectPlugins();
+        plugin = (PluginType<ValidatingPluginWithGenericBuilder>) manager.getPluginType("ValidatingPluginWithGenericBuilder");
+        assertNotNull("Rebuild this module to make sure annotaion processing kicks in.", plugin);
+        node = new Node(null, "Validator", plugin);
+    }
+
+    @Test
+    public void testNullDefaultValue() throws Exception {
+        final ValidatingPluginWithGenericBuilder validatingPlugin = (ValidatingPluginWithGenericBuilder) new PluginBuilder(plugin)
+            .withConfiguration(new NullConfiguration())
+            .withConfigurationNode(node)
+            .build();
+        assertNull(validatingPlugin);
+    }
+
+    @Test
+    public void testNonNullValue() throws Exception {
+        node.getAttributes().put("name", "foo");
+        final ValidatingPluginWithGenericBuilder validatingPlugin = (ValidatingPluginWithGenericBuilder) new PluginBuilder(plugin)
+            .withConfiguration(new NullConfiguration())
+            .withConfigurationNode(node)
+            .build();
+        assertNotNull(validatingPlugin);
+        assertEquals("foo", validatingPlugin.getName());
+    }
+}


[22/50] logging-log4j2 git commit: No need to initialize booleans to false.

Posted by rp...@apache.org.
No need to initialize booleans to false.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 4edd7add11a71171d139058e1adbf95e14f8289f
Parents: 4fc1c5f
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 10:51:09 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 10:51:09 2016 -0700

----------------------------------------------------------------------
 .../org/apache/logging/log4j/core/appender/ConsoleAppender.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4edd7add/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
index 2e3b38f..9747088 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
@@ -181,10 +181,10 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
         private String name;
 
         @PluginBuilderAttribute
-        private boolean follow = false;
+        private boolean follow;
 
         @PluginBuilderAttribute
-        private boolean direct = false;
+        private boolean direct;
 
         @PluginBuilderAttribute
         private boolean ignoreExceptions = true;


[35/50] logging-log4j2 git commit: Bullet proofing.

Posted by rp...@apache.org.
Bullet proofing.

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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 9972ee5f8bef6086b284e023203ac0a7389b65bf
Parents: d4dca3f
Author: Gary Gregory <gg...@apache.org>
Authored: Mon Aug 8 19:33:07 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Mon Aug 8 19:33:07 2016 -0700

----------------------------------------------------------------------
 .../rolling/OnStartupTriggeringPolicyTest.java  | 31 +++++++++++++-------
 1 file changed, 20 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9972ee5f/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
index c809ddb..eacf7c6 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/OnStartupTriggeringPolicyTest.java
@@ -16,29 +16,35 @@
  */
 package org.apache.logging.log4j.core.appender.rolling;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
+import java.io.File;
 import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.Arrays;
 
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.util.datetime.FastDateFormat;
-import org.junit.Ignore;
+import org.junit.Assert;
 import org.junit.Test;
 
 /**
- *
+ * Tests {@link OnStartupTriggeringPolicy}.
  */
+//@Ignore
 public class OnStartupTriggeringPolicyTest {
 
-    private static final String TARGET_FILE = "target/rollOnStartup/testfile";
-    private static final String TARGET_PATTERN = "target/rollOnStartup/test1-%d{MM-dd-yyyy}-%i.log";
-    private static final String ROLLED_FILE_PREFIX = "target/rollOnStartup/test1-";
+    private static final String TARGET_FOLDER = "target/rollOnStartup";
+    private static final String TARGET_FILE = TARGET_FOLDER + "/testfile";
+    private static final String TARGET_PATTERN = TARGET_FOLDER + "/test1-%d{MM-dd-yyyy}-%i.log";
+    private static final String ROLLED_FILE_PREFIX = TARGET_FOLDER + "/test1-";
     private static final String ROLLED_FILE_SUFFIX = "-1.log";
     private static final String TEST_DATA = "Hello world!";
     private static final FastDateFormat formatter = FastDateFormat.getInstance("MM-dd-yyyy");
@@ -55,13 +61,15 @@ public class OnStartupTriggeringPolicyTest {
         final String expectedDate = formatter.format(timeStamp);
         final String rolledFileName = ROLLED_FILE_PREFIX + expectedDate + ROLLED_FILE_SUFFIX;
         final Path rolled = Paths.get(rolledFileName);
+        final long copied;
         try (final InputStream is = new ByteArrayInputStream(TEST_DATA.getBytes("UTF-8"))) {
-            Files.copy(is, target);
+            copied = Files.copy(is, target, StandardCopyOption.REPLACE_EXISTING);
         }
         final long size = Files.size(target);
         assertTrue(size > 0);
+        assertEquals(copied, size);
 
-        target.toFile().setLastModified(timeStamp);
+        Assert.assertTrue(target.toFile().setLastModified(timeStamp));
         final PatternLayout layout = PatternLayout.newBuilder().withPattern("%msg").withConfiguration(configuration)
                 .build();
         final RolloverStrategy strategy = DefaultRolloverStrategy.createStrategy(null, null, null, "0", null, true,
@@ -71,10 +79,11 @@ public class OnStartupTriggeringPolicyTest {
                 policy, strategy, null, layout, 8192, true);
         try {
             manager.initialize();
-            assertTrue(Files.exists(target));
-            assertTrue(Files.size(target) == 0);
-            assertTrue(Files.exists(rolled));
-            assertTrue(Files.size(rolled) == size);
+            String files = Arrays.toString(new File(TARGET_FOLDER).listFiles());
+            assertTrue(target.toString() + ", files = " + files, Files.exists(target));
+            assertEquals(target.toString(), 0, Files.size(target));
+            assertTrue(rolled.toString() + ", files = " + files, Files.exists(rolled));
+            assertEquals(rolled.toString(), size, Files.size(rolled));
         } finally {
             manager.release();
         }


[48/50] logging-log4j2 git commit: Clarify GelfLayout documentation

Posted by rp...@apache.org.
Clarify GelfLayout documentation


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

Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: c0cb21e8aed2389e72f38392ea52daacf6f3cd23
Parents: 87026a9
Author: Mikael St�ldal <mi...@staldal.nu>
Authored: Fri Aug 12 13:00:55 2016 +0200
Committer: Mikael St�ldal <mi...@staldal.nu>
Committed: Fri Aug 12 13:00:55 2016 +0200

----------------------------------------------------------------------
 src/site/xdoc/manual/layouts.xml.vm | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c0cb21e8/src/site/xdoc/manual/layouts.xml.vm
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/layouts.xml.vm b/src/site/xdoc/manual/layouts.xml.vm
index 0a5123b..8607604 100644
--- a/src/site/xdoc/manual/layouts.xml.vm
+++ b/src/site/xdoc/manual/layouts.xml.vm
@@ -230,7 +230,9 @@ logger.debug("one={}, two={}, three={}", 1, 2, 3);
             <tr>
               <td>includeStacktrace</td>
               <td>boolean</td>
-              <td>Whether to include full stacktrace of logged Throwables (optional, default to true)</td>
+              <td>Whether to include full stacktrace of logged Throwables (optional, default to true).
+                  If set to false, only the class name and message of the #javadoc('java/lang', 'Throwable')
+                  will be included.</td>
             </tr>
             <caption align="top">GELF Layout Parameters</caption>
           </table>