Repository: logging-log4j2
Updated Branches:
  refs/heads/master c696e8055 -> 0049d85a4


[LOG4J2-1216] Nested pattern layout options broken. Apply slightly
tweaked patch for 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/0049d85a
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/0049d85a
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/0049d85a

Branch: refs/heads/master
Commit: 0049d85a4c789974ea6354d390ba65173db8937a
Parents: c696e80
Author: Barna Zsombor Klara <[email protected]>
Authored: Tue Oct 10 16:24:31 2017 -0600
Committer: Gary Gregory <[email protected]>
Committed: Tue Oct 10 16:24:31 2017 -0600

----------------------------------------------------------------------
 .../log4j/core/pattern/PatternParser.java       | 37 +++++++++-----------
 .../log4j/core/pattern/PatternParserTest.java   | 20 ++++++++++-
 src/changes/changes.xml                         |  3 ++
 3 files changed, 38 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0049d85a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
index 065ab9c..5260b11 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
@@ -272,31 +272,26 @@ public final class PatternParser {
     private static int extractOptions(final String pattern, final int start, 
final List<String> options) {
         int i = start;
         while (i < pattern.length() && pattern.charAt(i) == '{') {
-            final int begin = i++;
-            int end;
-            int depth = 0;
-            do {
-                end = pattern.indexOf('}', i);
-                if (end == -1) {
-                    break;
-                }
-                final int next = pattern.indexOf("{", i);
-                if (next != -1 && next < end) {
-                    i = end + 1;
-                    ++depth;
-                } else if (depth > 0) {
-                    --depth;
+            i++; // skip opening "{"
+            final int begin = i; // position of first real char
+            int depth = 1; // already inside one level
+            while (depth > 0 && i < pattern.length()) {
+                char c = pattern.charAt(i);
+                if (c == '{') {
+                    depth++;
+                } else if (c == '}') {
+                    depth--;
+                    // TODO(?) maybe escaping of { and } with \ or %
                 }
-            } while (depth > 0);
+                i++;
+            } // while
 
-            if (end == -1) {
-                break;
+            if (depth > 0) { // option not closed, continue with pattern after 
closing bracket
+                return pattern.indexOf('}', start) + 1;
             }
 
-            final String r = pattern.substring(begin + 1, end);
-            options.add(r);
-            i = end + 1;
-        }
+            options.add(pattern.substring(begin, i - 1));
+        } // while
 
         return i;
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0049d85a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
index 1e4cd92..1b68c0d 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
@@ -54,6 +54,7 @@ public class PatternParserTest {
     private final String mdcMsgPattern3 = "%m : %X{key2}%n";
     private final String mdcMsgPattern4 = "%m : %X{key3}%n";
     private final String mdcMsgPattern5 = "%m : %X{key1},%X{key2},%X{key3}%n";
+    private final String deeplyNestedPattern = "%notEmpty{ %maxLen{%X{var}}{3} 
}";
 
     private static String badPattern = "[%d{yyyyMMdd HH:mm:ss,SSS] %-5p 
[%c{10}] - %m%n";
     private static String customPattern = "[%d{yyyyMMdd HH:mm:ss,SSS}] %-5p 
[%-25.25c{1}:%-4L] - %m%n";
@@ -114,7 +115,7 @@ public class PatternParserTest {
             formatter.format(event, buf);
         }
         final String str = buf.toString();
-        final String expected = "INFO  [PatternParserTest        :100 ] - 
Hello, world" + Strings.LINE_SEPARATOR;
+        final String expected = "INFO  [PatternParserTest        :101 ] - 
Hello, world" + Strings.LINE_SEPARATOR;
         assertTrue("Expected to end with: " + expected + ". Actual: " + str, 
str.endsWith(expected));
     }
 
@@ -332,4 +333,21 @@ public class PatternParserTest {
         pp.parse("%N");
         assertTrue(config.getNanoClock() instanceof SystemNanoClock);
     }
+
+    @Test
+    public void testDeeplyNestedPattern() {
+        final List<PatternFormatter> formatters = 
parser.parse(deeplyNestedPattern);
+        assertNotNull(formatters);
+        assertEquals(1, formatters.size());
+
+        final Map<String, String> mdc = new HashMap<>();
+        mdc.put("var", "1234");
+        final Log4jLogEvent event = Log4jLogEvent.newBuilder() //
+            .setContextMap(mdc).build();
+        final StringBuilder buf = new StringBuilder();
+        formatters.get(0).format(event, buf);
+        final String expected = " 123 ";
+        assertEquals(expected, buf.toString());
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0049d85a/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 578cc6d..d73d54c 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -62,6 +62,9 @@
       <action issue="LOG4J2-2053" dev="ggregory" type="fix">
         Exception java.nio.charset.UnsupportedCharsetException: cp65001 in 
2.9.0.
       </action>
+      <action issue="LOG4J2-1216" dev="ggregory" type="fix" due-to="Thies 
Wellpott, Barna Zsombor Klara">
+        Nested pattern layout options broken.
+      </action>
     </release>
     <release version="2.9.1" date="2017-09-17" description="GA Release 2.9.1">
       <action issue="LOG4J2-1988" dev="rpopma" type="fix">

Reply via email to