You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2017/11/11 21:48:07 UTC

[01/12] logging-log4j2 git commit: LOG4J2-2112: MapMessage values use deep toString

Repository: logging-log4j2
Updated Branches:
  refs/heads/master c61f37d7d -> a23a48590


LOG4J2-2112: MapMessage values use deep toString

This allows for more efficient StringBuilder usage and usage of
StringBuilderFormattable MapMessage values.


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

Branch: refs/heads/master
Commit: 99287e87b6fb824526fc040f3fa240974f9754f1
Parents: 16c0b7e
Author: Carter Kozak <c4...@gmail.com>
Authored: Thu Nov 9 11:36:01 2017 -0500
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:09 2017 +0100

----------------------------------------------------------------------
 .../logging/log4j/message/MapMessage.java       | 17 ++---
 .../log4j/message/ParameterFormatter.java       | 39 ++---------
 .../log4j/message/ReusableObjectMessage.java    | 25 +------
 .../logging/log4j/util/StringBuilders.java      |  9 ++-
 .../logging/log4j/message/MapMessageTest.java   | 70 ++++++++++++++++++++
 5 files changed, 93 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/99287e87/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
index 57894b8..9f2aeeb 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
@@ -213,10 +213,7 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStr
      */
     public String get(final String key) {
         Object result = data.getValue(key);
-        if (result == null) {
-            return null;
-        }
-        return String.valueOf(result);
+        return ParameterFormatter.deepToString(result);
     }
 
     /**
@@ -347,7 +344,7 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStr
                     .append(data.getKeyAt(i))
                     .append("\">");
             int size = sb.length();
-            sb.append(data.<Object>getValueAt(i));
+            ParameterFormatter.recursiveDeepToString(data.getValueAt(i), sb, null);
             StringBuilders.escapeXml(sb, size);
             sb.append("</Entry>\n");
         }
@@ -396,7 +393,9 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStr
             if (i > 0) {
                 sb.append(' ');
             }
-            StringBuilders.appendKeyDqValue(sb, data.getKeyAt(i), data.getValueAt(i));
+            sb.append(data.getKeyAt(i)).append(Chars.EQ).append(Chars.DQUOTE);
+            ParameterFormatter.recursiveDeepToString(data.getValueAt(i), sb, null);
+            sb.append(Chars.DQUOTE);
         }
     }
 
@@ -412,7 +411,7 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStr
             StringBuilders.escapeJson(sb, start);
             sb.append(Chars.DQUOTE).append(':').append(Chars.DQUOTE);
             start = sb.length();
-            sb.append(data.<Object>getValueAt(i));
+            ParameterFormatter.recursiveDeepToString(data.getValueAt(i), sb, null);
             StringBuilders.escapeJson(sb, start);
             sb.append(Chars.DQUOTE);
         }
@@ -426,7 +425,9 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStr
             if (i > 0) {
                 sb.append(", ");
             }
-            StringBuilders.appendKeyDqValue(sb, data.getKeyAt(i), data.getValueAt(i));
+            sb.append(data.getKeyAt(i)).append(Chars.EQ).append(Chars.DQUOTE);
+            ParameterFormatter.recursiveDeepToString(data.getValueAt(i), sb, null);
+            sb.append(Chars.DQUOTE);
         }
         sb.append('}');
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/99287e87/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java
index 79c447a..e506d89 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java
@@ -25,6 +25,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.logging.log4j.util.StringBuilderFormattable;
+import org.apache.logging.log4j.util.StringBuilders;
 
 /**
  * Supports parameter formatting as used in ParameterizedMessage and ReusableParameterizedMessage.
@@ -395,8 +396,7 @@ final class ParameterFormatter {
             return (String) o;
         }
         final StringBuilder str = new StringBuilder();
-        final Set<String> dejaVu = new HashSet<>(); // that's actually a neat name ;)
-        recursiveDeepToString(o, str, dejaVu);
+        recursiveDeepToString(o, str, null);
         return str.toString();
     }
 
@@ -424,7 +424,7 @@ final class ParameterFormatter {
      * @param str    the StringBuilder that o will be appended to
      * @param dejaVu a list of container identities that were already used.
      */
-    private static void recursiveDeepToString(final Object o, final StringBuilder str, final Set<String> dejaVu) {
+    static void recursiveDeepToString(final Object o, final StringBuilder str, final Set<String> dejaVu) {
         if (appendSpecialTypes(o, str)) {
             return;
         }
@@ -436,38 +436,7 @@ final class ParameterFormatter {
     }
 
     private static boolean appendSpecialTypes(final Object o, final StringBuilder str) {
-        if (o == null || o instanceof String) {
-            str.append((String) o);
-            return true;
-        } else if (o instanceof CharSequence) {
-            str.append((CharSequence) o);
-            return true;
-        } else if (o instanceof StringBuilderFormattable) {
-            ((StringBuilderFormattable) o).formatTo(str);
-            return true;
-        } else if (o instanceof Integer) { // LOG4J2-1415 unbox auto-boxed primitives to avoid calling toString()
-            str.append(((Integer) o).intValue());
-            return true;
-        } else if (o instanceof Long) {
-            str.append(((Long) o).longValue());
-            return true;
-        } else if (o instanceof Double) {
-            str.append(((Double) o).doubleValue());
-            return true;
-        } else if (o instanceof Boolean) {
-            str.append(((Boolean) o).booleanValue());
-            return true;
-        } else if (o instanceof Character) {
-            str.append(((Character) o).charValue());
-            return true;
-        } else if (o instanceof Short) {
-            str.append(((Short) o).shortValue());
-            return true;
-        } else if (o instanceof Float) {
-            str.append(((Float) o).floatValue());
-            return true;
-        }
-        return appendDate(o, str);
+        return StringBuilders.appendSpecificTypes(str, o) || appendDate(o, str);
     }
 
     private static boolean appendDate(final Object o, final StringBuilder str) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/99287e87/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
index 69ad3b6..d46e859 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
@@ -18,6 +18,7 @@ package org.apache.logging.log4j.message;
 
 import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
+import org.apache.logging.log4j.util.StringBuilders;
 
 /**
  * Mutable Message wrapper around an Object message.
@@ -46,29 +47,7 @@ public class ReusableObjectMessage implements ReusableMessage {
 
     @Override
     public void formatTo(final StringBuilder buffer) {
-        if (obj == null || obj instanceof String) {
-            buffer.append((String) obj);
-        } else if (obj instanceof StringBuilderFormattable) {
-            ((StringBuilderFormattable) obj).formatTo(buffer);
-        } else if (obj instanceof CharSequence) {
-            buffer.append((CharSequence) obj);
-        } else if (obj instanceof Integer) { // LOG4J2-1437 unbox auto-boxed primitives to avoid calling toString()
-            buffer.append(((Integer) obj).intValue());
-        } else if (obj instanceof Long) {
-            buffer.append(((Long) obj).longValue());
-        } else if (obj instanceof Double) {
-            buffer.append(((Double) obj).doubleValue());
-        } else if (obj instanceof Boolean) {
-            buffer.append(((Boolean) obj).booleanValue());
-        } else if (obj instanceof Character) {
-            buffer.append(((Character) obj).charValue());
-        } else if (obj instanceof Short) {
-            buffer.append(((Short) obj).shortValue());
-        } else if (obj instanceof Float) {
-            buffer.append(((Float) obj).floatValue());
-        } else {
-            buffer.append(obj);
-        }
+        StringBuilders.appendValue(buffer, obj);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/99287e87/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
index 1ab0909..c786e30 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
@@ -69,6 +69,12 @@ public final class StringBuilders {
      * @param obj the object whose text representation to append to the StringBuilder
      */
     public static void appendValue(final StringBuilder stringBuilder, final Object obj) {
+        if (!appendSpecificTypes(stringBuilder, obj)) {
+            stringBuilder.append(obj);
+        }
+    }
+
+    public static boolean appendSpecificTypes(final StringBuilder stringBuilder, final Object obj) {
         if (obj == null || obj instanceof String) {
             stringBuilder.append((String) obj);
         } else if (obj instanceof StringBuilderFormattable) {
@@ -90,8 +96,9 @@ public final class StringBuilders {
         } else if (obj instanceof Float) {
             stringBuilder.append(((Float) obj).floatValue());
         } else {
-            stringBuilder.append(obj);
+            return false;
         }
+        return true;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/99287e87/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
index 781d46d..61fda91 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.logging.log4j.message;
 
+import org.apache.logging.log4j.util.StringBuilderFormattable;
 import org.junit.Test;
 
 import java.util.HashMap;
@@ -157,4 +158,73 @@ public class MapMessageTest {
         final String expected = "<Map>\n  <Entry key=\"key\">1</Entry>\n</Map>";
         assertEquals(expected, result);
     }
+
+    @Test
+    public void testFormatToUsedInOutputXml() {
+        final MapMessage<?, Object> msg = new MapMessage<>()
+                .with("key", new FormattableTestType());
+        final String result = msg.getFormattedMessage(new String[]{"XML"});
+        final String expected = "<Map>\n  <Entry key=\"key\">formatTo</Entry>\n</Map>";
+        assertEquals(expected, result);
+    }
+
+    @Test
+    public void testFormatToUsedInOutputJson() {
+        final MapMessage<?, Object> msg = new MapMessage<>()
+                .with("key", new FormattableTestType());
+        final String result = msg.getFormattedMessage(new String[]{"JSON"});
+        final String expected = "{\"key\":\"formatTo\"}";
+        assertEquals(expected, result);
+    }
+
+    @Test
+    public void testFormatToUsedInOutputJava() {
+        final MapMessage<?, Object> msg = new MapMessage<>()
+                .with("key", new FormattableTestType());
+        final String result = msg.getFormattedMessage(new String[]{"JAVA"});
+        final String expected = "{key=\"formatTo\"}";
+        assertEquals(expected, result);
+    }
+
+    @Test
+    public void testFormatToUsedInOutputDefault() {
+        final MapMessage<?, Object> msg = new MapMessage<>()
+                .with("key", new FormattableTestType());
+        final String result = msg.getFormattedMessage(null);
+        final String expected = "key=\"formatTo\"";
+        assertEquals(expected, result);
+    }
+
+    @Test
+    public void testGetUsesDeepToString() {
+        final String key = "key";
+        final MapMessage<?, Object> msg = new MapMessage<>()
+                .with(key, new FormattableTestType());
+        final String result = msg.get(key);
+        final String expected = "formatTo";
+        assertEquals(expected, result);
+    }
+
+    @Test
+    public void testRemoveUsesDeepToString() {
+        final String key = "key";
+        final MapMessage<?, Object> msg = new MapMessage<>()
+                .with(key, new FormattableTestType());
+        final String result = msg.remove(key);
+        final String expected = "formatTo";
+        assertEquals(expected, result);
+    }
+
+    private static final class FormattableTestType implements StringBuilderFormattable {
+
+        @Override
+        public String toString() {
+            return "toString";
+        }
+
+        @Override
+        public void formatTo(StringBuilder buffer) {
+            buffer.append("formatTo");
+        }
+    }
 }


[02/12] logging-log4j2 git commit: LOG4J2-2101: MapMessage correctly handles non-string map values

Posted by mi...@apache.org.
LOG4J2-2101: MapMessage correctly handles non-string map values

Previously formatting non-string values worked, however filtering,
which uess the "get" method would fail due to MapMessage attempting
to cast values to String.


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

Branch: refs/heads/master
Commit: f0123b1ddf236c2d1c0b23f005d0cf4f8e9dd6c5
Parents: 23bcd25
Author: Carter Kozak <c4...@gmail.com>
Authored: Mon Nov 6 13:14:36 2017 -0500
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:09 2017 +0100

----------------------------------------------------------------------
 .../logging/log4j/message/MapMessage.java       | 15 +++++---
 .../logging/log4j/message/MapMessageTest.java   | 37 ++++++++++++++++++++
 2 files changed, 48 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f0123b1d/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
index e39774c..649772d 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
@@ -200,7 +200,7 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
      * @param map The Map to add.
      */
     public void putAll(final Map<String, String> map) {
-        for (final Map.Entry<String, ?> entry : map.entrySet()) {
+        for (final Map.Entry<String, String> entry : map.entrySet()) {
             data.putValue(entry.getKey(), entry.getValue());
         }
     }
@@ -211,7 +211,11 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
      * @return The value of the element or null if the key is not present.
      */
     public String get(final String key) {
-        return data.getValue(key);
+        Object result = data.getValue(key);
+        if (result == null) {
+            return null;
+        }
+        return String.valueOf(result);
     }
 
     /**
@@ -220,7 +224,7 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
      * @return The previous value of the element.
      */
     public String remove(final String key) {
-        final String result = data.getValue(key);
+        final String result = get(key);
         data.remove(key);
         return result;
     }
@@ -338,7 +342,10 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
     public void asXml(final StringBuilder sb) {
         sb.append("<Map>\n");
         for (int i = 0; i < data.size(); i++) {
-            sb.append("  <Entry key=\"").append(data.getKeyAt(i)).append("\">").append((String)data.getValueAt(i))
+            sb.append("  <Entry key=\"")
+                    .append(data.getKeyAt(i))
+                    .append("\">")
+                    .append(data.<Object>getValueAt(i))
                     .append("</Entry>\n");
         }
         sb.append("</Map>");

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f0123b1d/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
index 1e06914..9aae448 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
@@ -18,6 +18,9 @@ package org.apache.logging.log4j.message;
 
 import org.junit.Test;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import static org.junit.Assert.*;
 
 /**
@@ -99,4 +102,38 @@ public class MapMessageTest {
         final String expected2 = "{key1=\"value1\", key2=\"value2\", key3=\"value3\"}";
         assertEquals(expected2, result2);
     }
+
+    @Test
+    public void testGetNonStringValue() {
+        final String key = "Key";
+        final MapMessage<?, Object> msg = new MapMessage<>()
+                .with(key, 1L);
+        assertEquals("1", msg.get(key));
+    }
+
+    @Test
+    public void testRemoveNonStringValue() {
+        final String key = "Key";
+        final MapMessage<?, Object> msg = new MapMessage<>()
+                .with(key, 1L);
+        assertEquals("1", msg.remove(key));
+    }
+
+    @Test
+    public void testJSONFormatNonStringValue() {
+        final MapMessage<?, Object> msg = new MapMessage<>()
+                .with("key", 1L);
+        final String result = msg.getFormattedMessage(new String[]{"JSON"});
+        final String expected = "{\"key\":\"1\"}";
+        assertEquals(expected, result);
+    }
+
+    @Test
+    public void testXMLFormatNonStringValue() {
+        final MapMessage<?, Object> msg = new MapMessage<>()
+                .with("key", 1L);
+        final String result = msg.getFormattedMessage(new String[]{"XML"});
+        final String expected = "<Map>\n  <Entry key=\"key\">1</Entry>\n</Map>";
+        assertEquals(expected, result);
+    }
 }


[09/12] logging-log4j2 git commit: Closes #126

Posted by mi...@apache.org.
Closes #126


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

Branch: refs/heads/master
Commit: 876d6642a5688c28dbb94af946d4a5f38f5e41fd
Parents: 059cdb3
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:09:07 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:09:07 2017 +0100

----------------------------------------------------------------------

----------------------------------------------------------------------



[08/12] logging-log4j2 git commit: Closes #125

Posted by mi...@apache.org.
Closes #125


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

Branch: refs/heads/master
Commit: 059cdb3725813912a2ab7a0c11a90a03021c047e
Parents: f979609
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:09:05 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:09:05 2017 +0100

----------------------------------------------------------------------

----------------------------------------------------------------------



[12/12] logging-log4j2 git commit: Fix MapMessageTest

Posted by mi...@apache.org.
Fix MapMessageTest


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

Branch: refs/heads/master
Commit: a23a48590e610cdf1dc2a4ef49e7a324809beed8
Parents: 2b93414
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:31:37 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:31:37 2017 +0100

----------------------------------------------------------------------
 .../logging/log4j/message/MapMessageTest.java   | 23 +++++++++-----------
 .../logging/log4j/message/ObjectMapMessage.java | 22 +++++++++++++++++++
 2 files changed, 32 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a23a4859/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
index 61fda91..a64e6bd 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
@@ -19,9 +19,6 @@ package org.apache.logging.log4j.message;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
 import org.junit.Test;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import static org.junit.Assert.*;
 
 /**
@@ -128,7 +125,7 @@ public class MapMessageTest {
     @Test
     public void testGetNonStringValue() {
         final String key = "Key";
-        final MapMessage<?, Object> msg = new MapMessage<>()
+        final ObjectMapMessage msg = new ObjectMapMessage()
                 .with(key, 1L);
         assertEquals("1", msg.get(key));
     }
@@ -136,14 +133,14 @@ public class MapMessageTest {
     @Test
     public void testRemoveNonStringValue() {
         final String key = "Key";
-        final MapMessage<?, Object> msg = new MapMessage<>()
+        final ObjectMapMessage msg = new ObjectMapMessage()
                 .with(key, 1L);
         assertEquals("1", msg.remove(key));
     }
 
     @Test
     public void testJSONFormatNonStringValue() {
-        final MapMessage<?, Object> msg = new MapMessage<>()
+        final ObjectMapMessage msg = new ObjectMapMessage()
                 .with("key", 1L);
         final String result = msg.getFormattedMessage(new String[]{"JSON"});
         final String expected = "{\"key\":\"1\"}";
@@ -152,7 +149,7 @@ public class MapMessageTest {
 
     @Test
     public void testXMLFormatNonStringValue() {
-        final MapMessage<?, Object> msg = new MapMessage<>()
+        final ObjectMapMessage msg = new ObjectMapMessage()
                 .with("key", 1L);
         final String result = msg.getFormattedMessage(new String[]{"XML"});
         final String expected = "<Map>\n  <Entry key=\"key\">1</Entry>\n</Map>";
@@ -161,7 +158,7 @@ public class MapMessageTest {
 
     @Test
     public void testFormatToUsedInOutputXml() {
-        final MapMessage<?, Object> msg = new MapMessage<>()
+        final ObjectMapMessage msg = new ObjectMapMessage()
                 .with("key", new FormattableTestType());
         final String result = msg.getFormattedMessage(new String[]{"XML"});
         final String expected = "<Map>\n  <Entry key=\"key\">formatTo</Entry>\n</Map>";
@@ -170,7 +167,7 @@ public class MapMessageTest {
 
     @Test
     public void testFormatToUsedInOutputJson() {
-        final MapMessage<?, Object> msg = new MapMessage<>()
+        final ObjectMapMessage msg = new ObjectMapMessage()
                 .with("key", new FormattableTestType());
         final String result = msg.getFormattedMessage(new String[]{"JSON"});
         final String expected = "{\"key\":\"formatTo\"}";
@@ -179,7 +176,7 @@ public class MapMessageTest {
 
     @Test
     public void testFormatToUsedInOutputJava() {
-        final MapMessage<?, Object> msg = new MapMessage<>()
+        final ObjectMapMessage msg = new ObjectMapMessage()
                 .with("key", new FormattableTestType());
         final String result = msg.getFormattedMessage(new String[]{"JAVA"});
         final String expected = "{key=\"formatTo\"}";
@@ -188,7 +185,7 @@ public class MapMessageTest {
 
     @Test
     public void testFormatToUsedInOutputDefault() {
-        final MapMessage<?, Object> msg = new MapMessage<>()
+        final ObjectMapMessage msg = new ObjectMapMessage()
                 .with("key", new FormattableTestType());
         final String result = msg.getFormattedMessage(null);
         final String expected = "key=\"formatTo\"";
@@ -198,7 +195,7 @@ public class MapMessageTest {
     @Test
     public void testGetUsesDeepToString() {
         final String key = "key";
-        final MapMessage<?, Object> msg = new MapMessage<>()
+        final ObjectMapMessage msg = new ObjectMapMessage()
                 .with(key, new FormattableTestType());
         final String result = msg.get(key);
         final String expected = "formatTo";
@@ -208,7 +205,7 @@ public class MapMessageTest {
     @Test
     public void testRemoveUsesDeepToString() {
         final String key = "key";
-        final MapMessage<?, Object> msg = new MapMessage<>()
+        final ObjectMapMessage msg = new ObjectMapMessage()
                 .with(key, new FormattableTestType());
         final String result = msg.remove(key);
         final String expected = "formatTo";

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a23a4859/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMapMessage.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMapMessage.java
new file mode 100644
index 0000000..83716f7
--- /dev/null
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMapMessage.java
@@ -0,0 +1,22 @@
+/*
+ * 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.message;
+
+class ObjectMapMessage extends MapMessage<ObjectMapMessage, Object> {
+
+}


[07/12] logging-log4j2 git commit: Closes #124

Posted by mi...@apache.org.
Closes #124


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

Branch: refs/heads/master
Commit: f979609546bbf1b5e259d7dfe69d3e73cdc66c4b
Parents: c6373fb
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:09:02 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:09:02 2017 +0100

----------------------------------------------------------------------

----------------------------------------------------------------------



[03/12] logging-log4j2 git commit: StructuredDataMessage implements MultiFormatStringBuilderFormattable

Posted by mi...@apache.org.
StructuredDataMessage implements MultiFormatStringBuilderFormattable


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

Branch: refs/heads/master
Commit: 16c0b7ecfd3d5702bfe38fc75951adc200b62158
Parents: 93a7235
Author: Carter Kozak <c4...@gmail.com>
Authored: Wed Nov 8 17:08:22 2017 -0500
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:09 2017 +0100

----------------------------------------------------------------------
 .../log4j/message/StructuredDataMessage.java    | 21 +++++--
 .../pattern/MessagePatternConverterTest.java    | 58 ++++++++++++++++++++
 2 files changed, 73 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/16c0b7ec/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
index 74a4542..acb95a0 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
@@ -20,7 +20,7 @@ package org.apache.logging.log4j.message;
 import java.util.Map;
 
 import org.apache.logging.log4j.util.EnglishEnums;
-import org.apache.logging.log4j.util.StringBuilderFormattable;
+import org.apache.logging.log4j.util.MultiFormatStringBuilderFormattable;
 import org.apache.logging.log4j.util.StringBuilders;
 
 /**
@@ -35,7 +35,7 @@ import org.apache.logging.log4j.util.StringBuilders;
  * @see <a href="https://tools.ietf.org/html/rfc5424">RFC 5424</a>
  */
 @AsynchronouslyFormattable
-public class StructuredDataMessage extends MapMessage<StructuredDataMessage, String> implements StringBuilderFormattable {
+public class StructuredDataMessage extends MapMessage<StructuredDataMessage, String> implements MultiFormatStringBuilderFormattable {
 
     private static final long serialVersionUID = 1703221292892071920L;
     private static final int MAX_LENGTH = 32;
@@ -253,6 +253,11 @@ public class StructuredDataMessage extends MapMessage<StructuredDataMessage, Str
         asString(Format.FULL, null, buffer);
     }
 
+    @Override
+    public void formatTo(String[] formats, StringBuilder buffer) {
+        asString(getFormat(formats), null, buffer);
+    }
+
     /**
      * Returns the message.
      * @return the message.
@@ -367,18 +372,22 @@ public class StructuredDataMessage extends MapMessage<StructuredDataMessage, Str
      */
     @Override
     public String getFormattedMessage(final String[] formats) {
+        return asString(getFormat(formats), null);
+    }
+
+    private Format getFormat(String[] formats) {
         if (formats != null && formats.length > 0) {
             for (int i = 0; i < formats.length; i++) {
                 final String format = formats[i];
                 if (Format.XML.name().equalsIgnoreCase(format)) {
-                    return asXml();
+                    return Format.XML;
                 } else if (Format.FULL.name().equalsIgnoreCase(format)) {
-                    return asString(Format.FULL, null);
+                    return Format.FULL;
                 }
             }
-            return asString(null, null);
+            return null;
         }
-        return asString(Format.FULL, null);
+        return Format.FULL;
     }
 
     private String asXml() {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/16c0b7ec/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MessagePatternConverterTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MessagePatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MessagePatternConverterTest.java
index 2d5a5be..8a1fb0c 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MessagePatternConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MessagePatternConverterTest.java
@@ -26,6 +26,8 @@ import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.ParameterizedMessage;
 import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
+import org.apache.logging.log4j.message.StructuredDataMessage;
 import org.junit.Test;
 
 /**
@@ -102,4 +104,60 @@ public class MessagePatternConverterTest {
         converter.format(event, sb);
         assertEquals("Incorrect length: " + sb, 4, sb.length());
     }
+
+    @Test
+    public void testMapMessageFormatJson() throws Exception {
+        final MessagePatternConverter converter = MessagePatternConverter.newInstance(null, new String[]{"json"});
+        Message msg = new StringMapMessage()
+                .with("key", "val");
+        LogEvent event = Log4jLogEvent.newBuilder() //
+                .setLoggerName("MyLogger") //
+                .setLevel(Level.DEBUG) //
+                .setMessage(msg).build();
+        StringBuilder sb = new StringBuilder();
+        converter.format(event, sb);
+        assertEquals("Unexpected result", "{\"key\":\"val\"}", sb.toString());
+    }
+
+    @Test
+    public void testMapMessageFormatXml() throws Exception {
+        final MessagePatternConverter converter = MessagePatternConverter.newInstance(null, new String[]{"xml"});
+        Message msg = new StringMapMessage()
+                .with("key", "val");
+        LogEvent event = Log4jLogEvent.newBuilder() //
+                .setLoggerName("MyLogger") //
+                .setLevel(Level.DEBUG) //
+                .setMessage(msg).build();
+        StringBuilder sb = new StringBuilder();
+        converter.format(event, sb);
+        assertEquals("Unexpected result", "<Map>\n  <Entry key=\"key\">val</Entry>\n</Map>", sb.toString());
+    }
+
+    @Test
+    public void testMapMessageFormatDefault() throws Exception {
+        final MessagePatternConverter converter = MessagePatternConverter.newInstance(null, null);
+        Message msg = new StringMapMessage()
+                .with("key", "val");
+        LogEvent event = Log4jLogEvent.newBuilder() //
+                .setLoggerName("MyLogger") //
+                .setLevel(Level.DEBUG) //
+                .setMessage(msg).build();
+        StringBuilder sb = new StringBuilder();
+        converter.format(event, sb);
+        assertEquals("Unexpected result", "key=\"val\"", sb.toString());
+    }
+
+    @Test
+    public void testStructuredDataFormatFull() throws Exception {
+        final MessagePatternConverter converter = MessagePatternConverter.newInstance(null, new String[]{"FULL"});
+        Message msg = new StructuredDataMessage("id", "message", "type")
+                .with("key", "val");
+        LogEvent event = Log4jLogEvent.newBuilder() //
+                .setLoggerName("MyLogger") //
+                .setLevel(Level.DEBUG) //
+                .setMessage(msg).build();
+        StringBuilder sb = new StringBuilder();
+        converter.format(event, sb);
+        assertEquals("Unexpected result", "type [id key=\"val\"] message", sb.toString());
+    }
 }


[04/12] logging-log4j2 git commit: LOG4J2-2107: MapMessage allocation-free pattern conversion

Posted by mi...@apache.org.
LOG4J2-2107: MapMessage allocation-free pattern conversion

Fixes an issue causing MessagePatternConverter to greedily format
MapMessage instances as StringBuilderFormattable ignoring format.


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

Branch: refs/heads/master
Commit: 93a7235da78c562026993cdc4e3e5775c47e8099
Parents: 6757d39
Author: Carter Kozak <c4...@gmail.com>
Authored: Wed Nov 8 16:53:31 2017 -0500
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:09 2017 +0100

----------------------------------------------------------------------
 .../logging/log4j/message/MapMessage.java       | 22 +++++++++++------
 .../MultiFormatStringBuilderFormattable.java    | 25 ++++++++++++++++++++
 .../core/pattern/MessagePatternConverter.java   |  8 +++++--
 3 files changed, 46 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/93a7235d/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
index 48f7ec7..57894b8 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
@@ -25,10 +25,10 @@ import org.apache.logging.log4j.util.Chars;
 import org.apache.logging.log4j.util.EnglishEnums;
 import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
 import org.apache.logging.log4j.util.IndexedStringMap;
+import org.apache.logging.log4j.util.MultiFormatStringBuilderFormattable;
 import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
-import org.apache.logging.log4j.util.StringBuilderFormattable;
 import org.apache.logging.log4j.util.StringBuilders;
 import org.apache.logging.log4j.util.Strings;
 import org.apache.logging.log4j.util.TriConsumer;
@@ -49,9 +49,9 @@ import org.apache.logging.log4j.util.TriConsumer;
  */
 @PerformanceSensitive("allocation")
 @AsynchronouslyFormattable
-public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMessage, StringBuilderFormattable {
+public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStringBuilderFormattable {
 
-    private static final long serialVersionUID = -5031471831131487120L;    
+    private static final long serialVersionUID = -5031471831131487120L;
 
     /**
      * When set as the format specifier causes the Map to be formatted as XML.
@@ -375,17 +375,20 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
      */
     @Override
     public String getFormattedMessage(final String[] formats) {
+        return format(getFormat(formats), new StringBuilder()).toString();
+    }
+
+    private MapFormat getFormat(final String[] formats) {
         if (formats == null || formats.length == 0) {
-            return asString();
+            return null;
         }
         for (int i = 0; i < formats.length; i++) {
             final MapFormat mapFormat = MapFormat.lookupIgnoreCase(formats[i]);
             if (mapFormat != null) {
-                return format(mapFormat, new StringBuilder()).toString();
+                return mapFormat;
             }
         }
-        return asString();
-
+        return null;
     }
 
     protected void appendMap(final StringBuilder sb) {
@@ -449,6 +452,11 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
     }
 
     @Override
+    public void formatTo(String[] formats, StringBuilder buffer) {
+        format(getFormat(formats), buffer);
+    }
+
+    @Override
     public boolean equals(final Object o) {
         if (this == o) {
             return true;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/93a7235d/log4j-api/src/main/java/org/apache/logging/log4j/util/MultiFormatStringBuilderFormattable.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/MultiFormatStringBuilderFormattable.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/MultiFormatStringBuilderFormattable.java
new file mode 100644
index 0000000..4b7cb3e
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/MultiFormatStringBuilderFormattable.java
@@ -0,0 +1,25 @@
+package org.apache.logging.log4j.util;
+
+import org.apache.logging.log4j.message.MultiformatMessage;
+
+/**
+ * A Message that can render itself in more than one way. The format string is used by the
+ * Message implementation as extra information that it may use to help it to determine how
+ * to format itself. For example, MapMessage accepts a format of "XML" to tell it to render
+ * the Map as XML instead of its default format of {key1="value1" key2="value2"}.
+ *
+ * @since 2.10
+ */
+public interface MultiFormatStringBuilderFormattable extends MultiformatMessage, StringBuilderFormattable {
+
+    /**
+     * Writes a text representation of this object into the specified {@code StringBuilder}, ideally without allocating
+     * temporary objects.
+     *
+     * @param formats An array of Strings that provide extra information about how to format the message.
+     * Each MultiFormatStringBuilderFormattable implementation is free to use the provided formats however they choose.
+     * @param buffer the StringBuilder to write into
+     */
+    void formatTo(String[] formats, StringBuilder buffer);
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/93a7235d/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
index 1cecfd5..7b1d77e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.MultiformatMessage;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.MultiFormatStringBuilderFormattable;
 import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
 
@@ -114,9 +115,12 @@ public final class MessagePatternConverter extends LogEventPatternConverter {
             final boolean doRender = textRenderer != null;
             final StringBuilder workingBuilder = doRender ? new StringBuilder(80) : toAppendTo;
 
-            final StringBuilderFormattable stringBuilderFormattable = (StringBuilderFormattable) msg;
             final int offset = workingBuilder.length();
-            stringBuilderFormattable.formatTo(workingBuilder);
+            if (msg instanceof MultiFormatStringBuilderFormattable) {
+                ((MultiFormatStringBuilderFormattable) msg).formatTo(formats, workingBuilder);
+            } else {
+                ((StringBuilderFormattable) msg).formatTo(workingBuilder);
+            }
 
             // TODO can we optimize this?
             if (config != null && !noLookups) {


[05/12] logging-log4j2 git commit: LOG4J2-2102: MapMessage Json and XML encodings escape keys and values

Posted by mi...@apache.org.
LOG4J2-2102: MapMessage Json and XML encodings escape keys and values


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

Branch: refs/heads/master
Commit: 6757d39783f62961fe9f520367799f8d6fb30bca
Parents: f0123b1
Author: Carter Kozak <c4...@gmail.com>
Authored: Mon Nov 6 13:49:36 2017 -0500
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:09 2017 +0100

----------------------------------------------------------------------
 .../logging/log4j/message/MapMessage.java       | 20 ++++++---
 .../logging/log4j/util/StringBuilders.java      | 44 ++++++++++++++++++++
 .../logging/log4j/message/MapMessageTest.java   | 21 ++++++++++
 .../core/pattern/EncodingPatternConverter.java  | 41 ++----------------
 4 files changed, 83 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6757d397/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
index 649772d..48f7ec7 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
@@ -21,6 +21,7 @@ import java.util.Map;
 import java.util.TreeMap;
 
 import org.apache.logging.log4j.util.BiConsumer;
+import org.apache.logging.log4j.util.Chars;
 import org.apache.logging.log4j.util.EnglishEnums;
 import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
 import org.apache.logging.log4j.util.IndexedStringMap;
@@ -344,9 +345,11 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
         for (int i = 0; i < data.size(); i++) {
             sb.append("  <Entry key=\"")
                     .append(data.getKeyAt(i))
-                    .append("\">")
-                    .append(data.<Object>getValueAt(i))
-                    .append("</Entry>\n");
+                    .append("\">");
+            int size = sb.length();
+            sb.append(data.<Object>getValueAt(i));
+            StringBuilders.escapeXml(sb, size);
+            sb.append("</Entry>\n");
         }
         sb.append("</Map>");
     }
@@ -400,8 +403,15 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
             if (i > 0) {
                 sb.append(", ");
             }
-            StringBuilders.appendDqValue(sb, data.getKeyAt(i)).append(':');
-            StringBuilders.appendDqValue(sb, data.getValueAt(i));
+            sb.append(Chars.DQUOTE);
+            int start = sb.length();
+            sb.append(data.getKeyAt(i));
+            StringBuilders.escapeJson(sb, start);
+            sb.append(Chars.DQUOTE).append(':').append(Chars.DQUOTE);
+            start = sb.length();
+            sb.append(data.<Object>getValueAt(i));
+            StringBuilders.escapeJson(sb, start);
+            sb.append(Chars.DQUOTE);
         }
         sb.append('}');
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6757d397/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
index 2d6ae9c..1ab0909 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
@@ -158,4 +158,48 @@ public final class StringBuilders {
             stringBuilder.trimToSize();
         }
     }
+
+    public static void escapeJson(final StringBuilder toAppendTo, final int start) {
+        for (int i = toAppendTo.length() - 1; i >= start; i--) { // backwards: length may change
+            final char c = toAppendTo.charAt(i);
+            if (Character.isISOControl(c)) {
+                // all iso control characters are in U+00xx
+                toAppendTo.setCharAt(i, '\\');
+                toAppendTo.insert(i + 1, "u0000");
+                toAppendTo.setCharAt(i + 4, Chars.getUpperCaseHex((c & 0xF0) >> 4));
+                toAppendTo.setCharAt(i + 5, Chars.getUpperCaseHex(c & 0xF));
+            } else if (c == '"' || c == '\\') {
+                // only " and \ need to be escaped; other escapes are optional
+                toAppendTo.insert(i, '\\');
+            }
+        }
+    }
+
+    public static void escapeXml(final StringBuilder toAppendTo, final int start) {
+        for (int i = toAppendTo.length() - 1; i >= start; i--) { // backwards: length may change
+            final char c = toAppendTo.charAt(i);
+            switch (c) {
+                case '&':
+                    toAppendTo.setCharAt(i, '&');
+                    toAppendTo.insert(i + 1, "amp;");
+                    break;
+                case '<':
+                    toAppendTo.setCharAt(i, '&');
+                    toAppendTo.insert(i + 1, "lt;");
+                    break;
+                case '>':
+                    toAppendTo.setCharAt(i, '&');
+                    toAppendTo.insert(i + 1, "gt;");
+                    break;
+                case '"':
+                    toAppendTo.setCharAt(i, '&');
+                    toAppendTo.insert(i + 1, "quot;");
+                    break;
+                case '\'':
+                    toAppendTo.setCharAt(i, '&');
+                    toAppendTo.insert(i + 1, "apos;");
+                    break;
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6757d397/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
index 9aae448..781d46d 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
@@ -64,6 +64,17 @@ public class MapMessageTest {
     }
 
     @Test
+    public void testXMLEscape() {
+        final String testMsg = "Test message <foo>";
+        final StringMapMessage msg = new StringMapMessage();
+        msg.put("message", testMsg);
+        final String result = msg.getFormattedMessage(new String[]{"XML"});
+        final String expected = "<Map>\n  <Entry key=\"message\">Test message &lt;foo&gt;</Entry>\n" +
+                "</Map>";
+        assertEquals(expected, result);
+    }
+
+    @Test
     public void testJSON() {
         final String testMsg = "Test message {}";
         final StringMapMessage msg = new StringMapMessage();
@@ -75,6 +86,16 @@ public class MapMessageTest {
     }
 
     @Test
+    public void testJSONEscape() {
+        final String testMsg = "Test message \"Hello, World!\"";
+        final StringMapMessage msg = new StringMapMessage();
+        msg.put("message", testMsg);
+        final String result = msg.getFormattedMessage(new String[]{"JSON"});
+        final String expected = "{\"message\":\"Test message \\\"Hello, World!\\\"\"}";
+        assertEquals(expected, result);
+    }
+
+    @Test
     public void testJava() {
         final String testMsg = "Test message {}";
         final StringMapMessage msg = new StringMapMessage();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6757d397/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
index 4d22ee0..2699b1f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
@@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.util.Chars;
 import org.apache.logging.log4j.util.EnglishEnums;
 import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util.StringBuilders;
 
 /**
  * Converter that encodes the output from a pattern using a specified format. Supported formats include HTML
@@ -139,19 +140,7 @@ public final class EncodingPatternConverter extends LogEventPatternConverter {
         JSON {
             @Override
             void escape(final StringBuilder toAppendTo, final int start) {
-                for (int i = toAppendTo.length() - 1; i >= start; i--) { // backwards: length may change
-                    final char c = toAppendTo.charAt(i);
-                    if (Character.isISOControl(c)) {
-                        // all iso control characters are in U+00xx
-                        toAppendTo.setCharAt(i, '\\');
-                        toAppendTo.insert(i + 1, "u0000");
-                        toAppendTo.setCharAt(i + 4, Chars.getUpperCaseHex((c & 0xF0) >> 4));
-                        toAppendTo.setCharAt(i + 5, Chars.getUpperCaseHex(c & 0xF));
-                    } else if (c == '"' || c == '\\') {
-                        // only " and \ need to be escaped; other escapes are optional
-                        toAppendTo.insert(i, '\\');
-                    }
-                }
+                StringBuilders.escapeJson(toAppendTo, start);
             }
         },
 
@@ -182,31 +171,7 @@ public final class EncodingPatternConverter extends LogEventPatternConverter {
         XML {
             @Override
             void escape(final StringBuilder toAppendTo, final int start) {
-                for (int i = toAppendTo.length() - 1; i >= start; i--) { // backwards: length may change
-                    final char c = toAppendTo.charAt(i);
-                    switch (c) {
-                        case '&':
-                            toAppendTo.setCharAt(i, '&');
-                            toAppendTo.insert(i + 1, "amp;");
-                            break;
-                        case '<':
-                            toAppendTo.setCharAt(i, '&');
-                            toAppendTo.insert(i + 1, "lt;");
-                            break;
-                        case '>':
-                            toAppendTo.setCharAt(i, '&');
-                            toAppendTo.insert(i + 1, "gt;");
-                            break;
-                        case '"':
-                            toAppendTo.setCharAt(i, '&');
-                            toAppendTo.insert(i + 1, "quot;");
-                            break;
-                        case '\'':
-                            toAppendTo.setCharAt(i, '&');
-                            toAppendTo.insert(i + 1, "apos;");
-                            break;
-                    }
-                }
+                StringBuilders.escapeXml(toAppendTo, start);
             }
         };
 


[11/12] logging-log4j2 git commit: Merge remote-tracking branch 'origin/master'

Posted by mi...@apache.org.
Merge remote-tracking branch 'origin/master'


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

Branch: refs/heads/master
Commit: 2b93414a403c21003774f7b0a8f92f143b5fec3c
Parents: cadb81f c61f37d
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:17:35 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:17:35 2017 +0100

----------------------------------------------------------------------
 .../org/apache/logging/log4j/appserver/jetty/Log4j2Logger.java     | 2 ++
 .../org/apache/logging/log4j/appserver/tomcat/TomcatLogger.java    | 2 ++
 2 files changed, 4 insertions(+)
----------------------------------------------------------------------



[10/12] logging-log4j2 git commit: Update changes.xml

Posted by mi...@apache.org.
Update changes.xml


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

Branch: refs/heads/master
Commit: cadb81fc56f31f1fc4aa081e1dfa33d3ce61bd72
Parents: 876d664
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:17:29 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:17:29 2017 +0100

----------------------------------------------------------------------
 src/changes/changes.xml | 12 ++++++++++++
 1 file changed, 12 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/cadb81fc/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 184432b..17ca19d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -31,6 +31,18 @@
          - "remove" - Removed
     -->
     <release version="2.10.0" date="2017-MM-DD" description="GA Release 2.10.0">
+      <action issue="LOG4J2-2112" dev="mikes" type="add" due-to="Carter Douglas Kozak ">
+        MapMessage should use deep toString for values.
+      </action>
+      <action issue="LOG4J2-2107" dev="mikes" type="fix" due-to="Carter Douglas Kozak ">
+        MapMessage supports both StringBuilderFormattable and MultiformatMessage.
+      </action>
+      <action issue="LOG4J2-2102" dev="mikes" type="fix" due-to="Carter Douglas Kozak ">
+        MapMessage JSON encoding will escape keys and values.
+      </action>
+      <action issue="LOG4J2-2101" dev="mikes" type="fix" due-to="Carter Douglas Kozak ">
+        Non-string value in MapMessage caused ClassCastException.
+      </action>
       <action issue="LOG4J2-2106" dev="rogers" type="fix">
         Reduce locking when checking for rollover.
       </action>


[06/12] logging-log4j2 git commit: Closes #129

Posted by mi...@apache.org.
Closes #129


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

Branch: refs/heads/master
Commit: c6373fbbed6842254c8aa7bc5d46dea6ea574d35
Parents: 99287e8
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:08:32 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:32 2017 +0100

----------------------------------------------------------------------

----------------------------------------------------------------------