You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2017/06/09 00:02:42 UTC

logging-log4j2 git commit: [LOG4J2-1935] Add with(String, primitive) methods to org.apache.logging.log4j.message.MapMessage. Build passes with 'mvn clean install' but I had to @Ignore HttpAppenderTest locally because it randomly fails.

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 864b7a83e -> 76aff5891


[LOG4J2-1935] Add with(String, primitive) methods to
org.apache.logging.log4j.message.MapMessage. Build passes with 'mvn
clean install' but I had to @Ignore HttpAppenderTest locally because it
randomly fails.

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

Branch: refs/heads/master
Commit: 76aff58919dc5030367ea24c7c8ef42dca3b75cd
Parents: 864b7a8
Author: Gary Gregory <gg...@apache.org>
Authored: Thu Jun 8 17:02:39 2017 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Thu Jun 8 17:02:39 2017 -0700

----------------------------------------------------------------------
 .../logging/log4j/message/MapMessage.java       | 269 +++++++++++++++++--
 .../logging/log4j/message/StringMapMessage.java |  70 +++++
 .../log4j/message/StructuredDataMessage.java    | 123 ++++++---
 .../logging/log4j/message/MapMessageTest.java   |  12 +-
 .../appender/mom/activemq/JmsAppenderIT.java    |   4 +-
 .../log4j/core/appender/mom/JmsManager.java     |  13 +-
 .../core/appender/rewrite/MapRewritePolicy.java |  16 +-
 .../logging/log4j/core/filter/MapFilter.java    |   6 +-
 .../log4j/core/layout/MessageLayout.java        |   2 +-
 .../logging/log4j/core/lookup/MapLookup.java    |   6 +-
 .../log4j/core/pattern/MapPatternConverter.java |   8 +-
 .../log4j/core/CollectionLoggingTest.java       |   4 +-
 .../log4j/core/GcFreeLoggingTestUtil.java       |   6 +-
 .../appender/rewrite/MapRewritePolicyTest.java  |  24 +-
 .../appender/rewrite/RewriteAppenderTest.java   |   5 +-
 .../log4j/core/filter/MapFilterTest.java        |   8 +-
 .../log4j/core/lookup/MapLookupTest.java        |   4 +-
 .../core/pattern/MapPatternConverterTest.java   |   6 +-
 .../log4j/flume/appender/FlumeEvent.java        |  10 +-
 .../appender/FlumePersistentAppenderTest.java   |   2 +-
 .../logging/log4j/lookup/CustomMapMessage.java  |   4 +-
 .../logging/log4j/lookup/MapMessageLookup.java  |   6 +-
 src/changes/changes.xml                         |   3 +
 23 files changed, 477 insertions(+), 134 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/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 0cbf0ff..5ca4971 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
@@ -40,10 +40,17 @@ import org.apache.logging.log4j.util.TriConsumer;
  * logged, because it is undefined whether the logged message string will contain the old values or the modified
  * values.
  * </p>
+ * <p>
+ * This class was pulled up from {@link StringMapMessage} to allow for Objects as values.
+ * </p>
+ * @param <M> Allow subclasses to use fluent APIs and override methods that return instances of subclasses.
+ * @param <V> The value type
  */
 @PerformanceSensitive("allocation")
 @AsynchronouslyFormattable
-public class MapMessage implements MultiformatMessage, StringBuilderFormattable {
+public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMessage, StringBuilderFormattable {
+
+    private static final long serialVersionUID = -5031471831131487120L;    
 
     /**
      * When set as the format specifier causes the Map to be formatted as XML.
@@ -82,8 +89,6 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
         }
     }
 
-    private static final long serialVersionUID = -5031471831131487120L;
-
     private final IndexedStringMap data;
 
     /**
@@ -94,10 +99,19 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
     }
 
     /**
+     * Constructs a new instance.
+     * 
+     * @param  initialCapacity the initial capacity.
+     */
+    public MapMessage(final int initialCapacity) {
+        data = new SortedArrayStringMap(initialCapacity);
+    }
+
+    /**
      * Constructs a new instance based on an existing Map.
      * @param map The Map.
      */
-    public MapMessage(final Map<String, String> map) {
+    public MapMessage(final Map<String, V> map) {
         this.data = new SortedArrayStringMap(map);
     }
 
@@ -132,10 +146,12 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
      * Returns the message data as an unmodifiable Map.
      * @return the message data as an unmodifiable map.
      */
-    public Map<String, String> getData() {
-        final TreeMap<String, String> result = new TreeMap<>(); // returned map must be sorted
+    @SuppressWarnings("unchecked")
+    public Map<String, V> getData() {
+        final TreeMap<String, V> result = new TreeMap<>(); // returned map must be sorted
         for (int i = 0; i < data.size(); i++) {
-            result.put(data.getKeyAt(i), (String) data.getValueAt(i));
+            // The Eclipse compiler does not need the typecast to V, but the Oracle compiler sure does.
+            result.put(data.getKeyAt(i), (V) data.getValueAt(i));
         }
         return Collections.unmodifiableMap(result);
     }
@@ -167,17 +183,6 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
     }
 
     /**
-     * Adds an item to the data Map in fluent style.
-     * @param key The name of the data item.
-     * @param value The value of the data item.
-     * @return {@code this}
-     */
-    public MapMessage with(final String key, final String value) {
-        put(key, value);
-        return this;
-    }
-
-    /**
      * Adds an item to the data Map.
      * @param key The name of the data item.
      * @param value The value of the data item.
@@ -190,10 +195,6 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
         data.putValue(key, value);
     }
 
-    protected void validate(final String key, final String value) {
-
-    }
-
     /**
      * Adds all the elements from the specified Map.
      * @param map The Map to add.
@@ -258,14 +259,14 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
      * </p>
      *
      * @param action The action to be performed for each key-value pair in this collection
-     * @param <V> type of the value
+     * @param <CV> type of the consumer value
      * @throws java.util.ConcurrentModificationException some implementations may not support structural modifications
      *          to this data structure while iterating over the contents with {@link #forEach(BiConsumer)} or
      *          {@link #forEach(TriConsumer, Object)}.
      * @see ReadOnlyStringMap#forEach(BiConsumer)
      * @since 2.9
      */
-    public <V> void forEach(final BiConsumer<String, ? super V> action) {
+    public <CV> void forEach(final BiConsumer<String, ? super CV> action) {
         data.forEach(action);
     }
 
@@ -286,7 +287,7 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
      * @param action The action to be performed for each key-value pair in this collection
      * @param state the object to be passed as the third parameter to each invocation on the specified
      *          triconsumer
-     * @param <V> type of the value
+     * @param <CV> type of the consumer value
      * @param <S> type of the third parameter
      * @throws java.util.ConcurrentModificationException some implementations may not support structural modifications
      *          to this data structure while iterating over the contents with {@link #forEach(BiConsumer)} or
@@ -294,7 +295,7 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
      * @see ReadOnlyStringMap#forEach(TriConsumer, Object)
      * @since 2.9
      */
-    public <V, S> void forEach(final TriConsumer<String, ? super V, S> action, final S state) {
+    public <CV, S> void forEach(final TriConsumer<String, ? super CV, S> action, final S state) {
         data.forEach(action, state);
     }
     
@@ -415,8 +416,9 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
      * @param map The Map.
      * @return A new MapMessage
      */
-    public MapMessage newInstance(final Map<String, String> map) {
-        return new MapMessage(map);
+    @SuppressWarnings("unchecked")
+    public M newInstance(final Map<String, V> map) {
+        return (M) new MapMessage<>(map);
     }
 
     @Override
@@ -438,7 +440,7 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
             return false;
         }
 
-        final MapMessage that = (MapMessage) o;
+        final MapMessage<?, ?> that = (MapMessage<?, ?>) o;
 
         return this.data.equals(that.data);
     }
@@ -457,4 +459,213 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
     public Throwable getThrowable() {
         return null;
     }
+    /**
+     * @since 2.9
+     */
+    protected void validate(final String key, final boolean value) {
+        // do nothing
+    }
+
+    /**
+     * @since 2.9
+     */
+    protected void validate(final String key, final byte value) {
+        // do nothing
+    }
+
+    /**
+     * @since 2.9
+     */
+    protected void validate(final String key, final char value) {
+        // do nothing
+    }
+
+    /**
+     * @since 2.9
+     */
+    protected void validate(final String key, final double value) {
+        // do nothing
+    }
+
+    /**
+     * @since 2.9
+     */
+    protected void validate(final String key, final float value) {
+        // do nothing
+    }
+    
+    /**
+     * @since 2.9
+     */
+    protected void validate(final String key, final int value) {
+        // do nothing
+    }
+
+    /**
+     * @since 2.9
+     */
+    protected void validate(final String key, final long value) {
+        // do nothing
+    }
+    
+    /**
+     * @since 2.9
+     */
+    protected void validate(final String key, final Object value) {
+        // do nothing
+    }
+
+    /**
+     * @since 2.9
+     */
+    protected void validate(final String key, final short value) {
+        // do nothing
+    }
+
+    /**
+     * @since 2.9
+     */
+    protected void validate(final String key, final String value) {
+        // do nothing
+    }
+
+    /**
+     * Adds an item to the data Map.
+     * @param key The name of the data item.
+     * @param value The value of the data item.
+     * @return this object
+     * @since 2.9
+     */
+    @SuppressWarnings("unchecked")
+    public M with(final String key, final boolean value) {
+        validate(key, value);
+        data.putValue(key, value);
+        return (M) this;
+    }
+
+    /**
+     * Adds an item to the data Map.
+     * @param key The name of the data item.
+     * @param value The value of the data item.
+     * @return this object
+     * @since 2.9
+     */
+    @SuppressWarnings("unchecked")
+    public M with(final String key, final byte value) {
+        validate(key, value);
+        data.putValue(key, value);
+        return (M) this;
+    }
+
+    /**
+     * Adds an item to the data Map.
+     * @param key The name of the data item.
+     * @param value The value of the data item.
+     * @return this object
+     * @since 2.9
+     */
+    @SuppressWarnings("unchecked")
+    public M with(final String key, final char value) {
+        validate(key, value);
+        data.putValue(key, value);
+        return (M) this;
+    }
+
+
+    /**
+     * Adds an item to the data Map.
+     * @param key The name of the data item.
+     * @param value The value of the data item.
+     * @return this object
+     * @since 2.9
+     */
+    @SuppressWarnings("unchecked")
+    public M with(final String key, final double value) {
+        validate(key, value);
+        data.putValue(key, value);
+        return (M) this;
+    }
+
+    /**
+     * Adds an item to the data Map.
+     * @param key The name of the data item.
+     * @param value The value of the data item.
+     * @return this object
+     * @since 2.9
+     */
+    @SuppressWarnings("unchecked")
+    public M with(final String key, final float value) {
+        validate(key, value);
+        data.putValue(key, value);
+        return (M) this;
+    }
+
+    /**
+     * Adds an item to the data Map.
+     * @param key The name of the data item.
+     * @param value The value of the data item.
+     * @return this object
+     * @since 2.9
+     */
+    @SuppressWarnings("unchecked")
+    public M with(final String key, final int value) {
+        validate(key, value);
+        data.putValue(key, value);
+        return (M) this;
+    }
+
+    /**
+     * Adds an item to the data Map.
+     * @param key The name of the data item.
+     * @param value The value of the data item.
+     * @return this object
+     * @since 2.9
+     */
+    @SuppressWarnings("unchecked")
+    public M with(final String key, final long value) {
+        validate(key, value);
+        data.putValue(key, value);
+        return (M) this;
+    }
+
+    /**
+     * Adds an item to the data Map.
+     * @param key The name of the data item.
+     * @param value The value of the data item.
+     * @return this object
+     * @since 2.9
+     */
+    @SuppressWarnings("unchecked")
+    public M with(final String key, final Object value) {
+        validate(key, value);
+        data.putValue(key, value);
+        return (M) this;
+    }
+
+    /**
+     * Adds an item to the data Map.
+     * @param key The name of the data item.
+     * @param value The value of the data item.
+     * @return this object
+     * @since 2.9
+     */
+    @SuppressWarnings("unchecked")
+    public M with(final String key, final short value) {
+        validate(key, value);
+        data.putValue(key, value);
+        return (M) this;
+    }
+
+    /**
+     * Adds an item to the data Map in fluent style.
+     * @param key The name of the data item.
+     * @param value The value of the data item.
+     * @return {@code this}
+     */
+    @SuppressWarnings("unchecked")
+    public M with(final String key, final String value) {
+        put(key, value);
+        return (M) this;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-api/src/main/java/org/apache/logging/log4j/message/StringMapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/StringMapMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/StringMapMessage.java
new file mode 100644
index 0000000..9c3ee18
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/StringMapMessage.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.message;
+
+import java.util.Map;
+
+import org.apache.logging.log4j.util.PerformanceSensitive;
+
+/**
+ * A {@link StringMapMessage} typed to {@link String}-only values. This is like the MapMessage class before 2.9.
+ * 
+ * @since 2.9
+ */
+@PerformanceSensitive("allocation")
+@AsynchronouslyFormattable
+public class StringMapMessage extends MapMessage<StringMapMessage, String> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new instance.
+     */
+    public StringMapMessage() {
+        super();
+    }
+
+    /**
+     * Constructs a new instance.
+     * 
+     * @param initialCapacity
+     *            the initial capacity.
+     */
+    public StringMapMessage(final int initialCapacity) {
+        super(initialCapacity);
+    }
+
+    /**
+     * Constructs a new instance based on an existing Map.
+     * 
+     * @param map
+     *            The Map.
+     */
+    public StringMapMessage(final Map<String, String> map) {
+        super(map);
+    }
+
+    /**
+     * Constructs a new instance based on an existing Map.
+     * @param map The Map.
+     * @return A new StringMapMessage
+     */
+    public StringMapMessage newInstance(final Map<String, String> map) {
+        return new StringMapMessage(map);
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/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 fcaee4d..d610cc4 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
@@ -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 implements StringBuilderFormattable {
+public class StructuredDataMessage extends MapMessage<StructuredDataMessage, String> implements StringBuilderFormattable {
 
     private static final long serialVersionUID = 1703221292892071920L;
     private static final int MAX_LENGTH = 32;
@@ -134,18 +134,6 @@ public class StructuredDataMessage extends MapMessage implements StringBuilderFo
     }
 
     /**
-     * Add an item to the data Map in fluent style.
-     * @param key The name of the data item.
-     * @param value The value of the data item.
-     * @return {@code this}
-     */
-    @Override
-    public StructuredDataMessage with(final String key, final String value) {
-        put(key, value);
-        return this;
-    }
-
-    /**
      * Returns the supported formats.
      * @return An array of the supported format names.
      */
@@ -216,25 +204,6 @@ public class StructuredDataMessage extends MapMessage implements StringBuilderFo
         this.message = msg;
     }
 
-
-    @Override
-    protected void validate(final String key, final String value) {
-        validateKey(key);
-    }
-
-    private void validateKey(final String key) {
-        if (key.length() > MAX_LENGTH) {
-            throw new IllegalArgumentException("Structured data keys are limited to 32 characters. key: " + key);
-        }
-        for (int i = 0; i < key.length(); i++) {
-            final char c = key.charAt(i);
-            if (c < '!' || c > '~' || c == '=' || c == ']' || c == '"') {
-                throw new IllegalArgumentException("Structured data keys must contain printable US ASCII characters" +
-                        "and may not contain a space, =, ], or \"");
-            }
-        }
-    }
-
     /**
      * Formats the structured data as described in RFC 5424.
      *
@@ -371,7 +340,7 @@ public class StructuredDataMessage extends MapMessage implements StringBuilderFo
 
 
     @Override
-    public MapMessage newInstance(final Map<String, String> map) {
+    public StructuredDataMessage newInstance(final Map<String, String> map) {
         return new StructuredDataMessage(this, map);
     }
 
@@ -410,4 +379,92 @@ public class StructuredDataMessage extends MapMessage implements StringBuilderFo
         result = HASHVAL * result + (message != null ? message.hashCode() : 0);
         return result;
     }
+
+    @Override
+    protected void validate(String key, boolean value) {
+        validateKey(key);
+    }
+
+    /**
+     * @since 2.9
+     */
+    @Override
+    protected void validate(String key, byte value) {
+        validateKey(key);
+    }
+
+    /**
+     * @since 2.9
+     */
+    @Override
+    protected void validate(String key, char value) {
+        validateKey(key);
+    }
+    
+    /**
+     * @since 2.9
+     */
+    @Override
+    protected void validate(String key, double value) {
+        validateKey(key);
+    }
+    
+    /**
+     * @since 2.9
+     */
+    @Override
+    protected void validate(String key, float value) {
+        validateKey(key);
+    }
+
+    /**
+     * @since 2.9
+     */
+    @Override
+    protected void validate(String key, int value) {
+        validateKey(key);
+    }
+
+    /**
+     * @since 2.9
+     */
+    @Override
+    protected void validate(String key, long value) {
+        validateKey(key);
+    }
+
+    /**
+     * @since 2.9
+     */
+    @Override
+    protected void validate(String key, Object value) {
+        validateKey(key);
+    }
+
+    /**
+     * @since 2.9
+     */
+    @Override
+    protected void validate(String key, short value) {
+        validateKey(key);
+    }
+
+    @Override
+    protected void validate(final String key, final String value) {
+        validateKey(key);
+    }
+
+    private void validateKey(final String key) {
+        if (key.length() > MAX_LENGTH) {
+            throw new IllegalArgumentException("Structured data keys are limited to 32 characters. key: " + key);
+        }
+        for (int i = 0; i < key.length(); i++) {
+            final char c = key.charAt(i);
+            if (c < '!' || c > '~' || c == '=' || c == ']' || c == '"') {
+                throw new IllegalArgumentException("Structured data keys must contain printable US ASCII characters" +
+                        "and may not contain a space, =, ], or \"");
+            }
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/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 e7bef75..1e06914 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
@@ -28,7 +28,7 @@ public class MapMessageTest {
     @Test
     public void testMap() {
         final String testMsg = "Test message {}";
-        final MapMessage msg = new MapMessage();
+        final StringMapMessage msg = new StringMapMessage();
         msg.put("message", testMsg);
         msg.put("project", "Log4j");
         final String result = msg.getFormattedMessage();
@@ -39,7 +39,7 @@ public class MapMessageTest {
     @Test
     public void testBuilder() {
         final String testMsg = "Test message {}";
-        final MapMessage msg = new MapMessage()
+        final StringMapMessage msg = new StringMapMessage()
                 .with("message", testMsg)
                 .with("project", "Log4j");
         final String result = msg.getFormattedMessage();
@@ -50,7 +50,7 @@ public class MapMessageTest {
     @Test
     public void testXML() {
         final String testMsg = "Test message {}";
-        final MapMessage msg = new MapMessage();
+        final StringMapMessage msg = new StringMapMessage();
         msg.put("message", testMsg);
         msg.put("project", "Log4j");
         final String result = msg.getFormattedMessage(new String[]{"XML"});
@@ -63,7 +63,7 @@ public class MapMessageTest {
     @Test
     public void testJSON() {
         final String testMsg = "Test message {}";
-        final MapMessage msg = new MapMessage();
+        final StringMapMessage msg = new StringMapMessage();
         msg.put("message", testMsg);
         msg.put("project", "Log4j");
         final String result = msg.getFormattedMessage(new String[]{"JSON"});
@@ -74,7 +74,7 @@ public class MapMessageTest {
     @Test
     public void testJava() {
         final String testMsg = "Test message {}";
-        final MapMessage msg = new MapMessage();
+        final StringMapMessage msg = new StringMapMessage();
         msg.put("message", testMsg);
         msg.put("project", "Log4j");
         final String result = msg.getFormattedMessage(new String[]{"Java"});
@@ -84,7 +84,7 @@ public class MapMessageTest {
 
     @Test
     public void testMutableByDesign() { // LOG4J2-763
-        final MapMessage msg = new MapMessage();
+        final StringMapMessage msg = new StringMapMessage();
 
         // modify parameter before calling msg.getFormattedMessage
         msg.put("key1", "value1");

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/mom/activemq/JmsAppenderIT.java
----------------------------------------------------------------------
diff --git a/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/mom/activemq/JmsAppenderIT.java b/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/mom/activemq/JmsAppenderIT.java
index b0bf594..989701e 100644
--- a/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/mom/activemq/JmsAppenderIT.java
+++ b/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/mom/activemq/JmsAppenderIT.java
@@ -44,7 +44,7 @@ import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.layout.MessageLayout;
 import org.apache.logging.log4j.core.layout.SerializedLayout;
 import org.apache.logging.log4j.core.net.JndiManager;
-import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.junit.After;
 import org.junit.Assert;
@@ -108,7 +108,7 @@ public class JmsAppenderIT {
 			map.put("threadName", Thread.currentThread().getName());
 			final LogEvent event = Log4jLogEvent.newBuilder().setLoggerName(loggerName) //
 					.setLoggerFqcn(loggerName).setLevel(Level.INFO) //
-					.setMessage(new MapMessage(map)) //
+					.setMessage(new StringMapMessage(map)) //
 					.setTimeMillis(System.currentTimeMillis()).build();
 			appender.append(event);
 		}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java
index cddf791..bedba18 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java
@@ -132,20 +132,19 @@ public class JmsManager extends AbstractManager {
     public Message createMessage(final Serializable object) throws JMSException {
         if (object instanceof String) {
             return this.session.createTextMessage((String) object);
-        }
-        else if (object instanceof org.apache.logging.log4j.message.MapMessage) {
-            return map((org.apache.logging.log4j.message.MapMessage) object, this.session.createMapMessage());
+        } else if (object instanceof org.apache.logging.log4j.message.MapMessage) {
+            return map((org.apache.logging.log4j.message.MapMessage<?, ?>) object, this.session.createMapMessage());
         }
         return this.session.createObjectMessage(object);
     }
 
-    private MapMessage map(final org.apache.logging.log4j.message.MapMessage log4jMapMessage, final MapMessage jmsMapMessage) {
+    private MapMessage map(final org.apache.logging.log4j.message.MapMessage<?, ?> log4jMapMessage, final MapMessage jmsMapMessage) {
         // Map without calling rg.apache.logging.log4j.message.MapMessage#getData() which makes a copy of the map.
-        log4jMapMessage.forEach(new BiConsumer<String, String>() {
+        log4jMapMessage.forEach(new BiConsumer<String, Object>() {
             @Override
-            public void accept(final String key, final String value) {
+            public void accept(final String key, final Object value) {
                 try {
-                    jmsMapMessage.setString(key, value);
+                    jmsMapMessage.setObject(key, value);
                 } catch (JMSException e) {
                     throw new IllegalArgumentException(String.format("%s mapping key '%s' to value '%s': %s",
                             e.getClass(), key, value, e.getLocalizedMessage()), e);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java
index 7735424..2084686 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java
@@ -42,11 +42,11 @@ public final class MapRewritePolicy implements RewritePolicy {
      */
     protected static final Logger LOGGER = StatusLogger.getLogger();
 
-    private final Map<String, String> map;
+    private final Map<String, Object> map;
 
     private final Mode mode;
 
-    private MapRewritePolicy(final Map<String, String> map, final Mode mode) {
+    private MapRewritePolicy(final Map<String, Object> map, final Mode mode) {
         this.map = map;
         this.mode = mode;
     }
@@ -64,21 +64,23 @@ public final class MapRewritePolicy implements RewritePolicy {
             return source;
         }
 
-        final Map<String, String> newMap = new HashMap<>(((MapMessage) msg).getData());
+        @SuppressWarnings("unchecked")
+        MapMessage<?, Object> mapMsg = (MapMessage<?, Object>) msg;
+        final Map<String, Object> newMap = new HashMap<>(mapMsg.getData());
         switch (mode) {
             case Add: {
                 newMap.putAll(map);
                 break;
             }
             default: {
-                for (final Map.Entry<String, String> entry : map.entrySet()) {
+                for (final Map.Entry<String, Object> entry : map.entrySet()) {
                     if (newMap.containsKey(entry.getKey())) {
                         newMap.put(entry.getKey(), entry.getValue());
                     }
                 }
             }
         }
-        final MapMessage message = ((MapMessage) msg).newInstance(newMap);
+        final Message message = mapMsg.newInstance(newMap);
         final LogEvent result = new Log4jLogEvent.Builder(source).setMessage(message).build();
         return result;
     }
@@ -104,7 +106,7 @@ public final class MapRewritePolicy implements RewritePolicy {
         sb.append("mode=").append(mode);
         sb.append(" {");
         boolean first = true;
-        for (final Map.Entry<String, String> entry : map.entrySet()) {
+        for (final Map.Entry<String, Object> entry : map.entrySet()) {
             if (!first) {
                 sb.append(", ");
             }
@@ -130,7 +132,7 @@ public final class MapRewritePolicy implements RewritePolicy {
             LOGGER.error("keys and values must be specified for the MapRewritePolicy");
             return null;
         }
-        final Map<String, String> map = new HashMap<>();
+        final Map<String, Object> map = new HashMap<>();
         for (final KeyValuePair pair : pairs) {
             final String key = pair.getKey();
             if (key == null) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
index c2ebc37..de17256 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
@@ -67,7 +67,7 @@ public class MapFilter extends AbstractFilter {
     public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
                          final Throwable t) {
         if (msg instanceof MapMessage) {
-            return filter((MapMessage) msg) ? onMatch : onMismatch;
+            return filter((MapMessage<?, ?>) msg) ? onMatch : onMismatch;
         }
         return Result.NEUTRAL;
     }
@@ -76,12 +76,12 @@ public class MapFilter extends AbstractFilter {
     public Result filter(final LogEvent event) {
         final Message msg = event.getMessage();
         if (msg instanceof MapMessage) {
-            return filter((MapMessage) msg) ? onMatch : onMismatch;
+            return filter((MapMessage<?, ?>) msg) ? onMatch : onMismatch;
         }
         return Result.NEUTRAL;
     }
 
-    protected boolean filter(final MapMessage mapMessage) {
+    protected boolean filter(final MapMessage<?, ?> mapMessage) {
         boolean match = false;
         for (int i = 0; i < map.size(); i++) {
             final String toMatch = mapMessage.get(map.getKeyAt(i));

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MessageLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MessageLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MessageLayout.java
index 9adb8ee..58455ee 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MessageLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MessageLayout.java
@@ -28,7 +28,7 @@ import org.apache.logging.log4j.message.Message;
 /**
  * Formats a {@link LogEvent} in its {@link Message} form.
  * <p>
- * Useful in combination with a JMS Appender to map a Log4j {@link org.apache.logging.log4j.message.MapMessage} to a JMS
+ * Useful in combination with a JMS Appender to map a Log4j {@link org.apache.logging.log4j.message.StringMapMessage} to a JMS
  * {@link javax.jms.MapMessage}.
  * </p>
  */

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MapLookup.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MapLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MapLookup.java
index c00645e..466decb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MapLookup.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/MapLookup.java
@@ -22,7 +22,7 @@ import java.util.Map;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 
 /**
  * A map-based lookup.
@@ -118,7 +118,7 @@ public class MapLookup implements StrLookup {
 
     @Override
     public String lookup(final LogEvent event, final String key) {
-        final boolean isMapMessage = event != null && event.getMessage() instanceof MapMessage;
+        final boolean isMapMessage = event != null && event.getMessage() instanceof StringMapMessage;
         if (map == null && !isMapMessage) {
             return null;
         }
@@ -129,7 +129,7 @@ public class MapLookup implements StrLookup {
             }
         }
         if (isMapMessage) {
-            return ((MapMessage) event.getMessage()).get(key);
+            return ((StringMapMessage) event.getMessage()).get(key);
         }
         return null;
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MapPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MapPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MapPatternConverter.java
index fd3c7b2..6f018bd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MapPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MapPatternConverter.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.pattern;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
 
 /**
@@ -60,9 +60,9 @@ public final class MapPatternConverter extends LogEventPatternConverter {
      */
     @Override
     public void format(final LogEvent event, final StringBuilder toAppendTo) {
-        MapMessage msg;
-        if (event.getMessage() instanceof MapMessage) {
-            msg = (MapMessage) event.getMessage();
+        StringMapMessage msg;
+        if (event.getMessage() instanceof StringMapMessage) {
+            msg = (StringMapMessage) event.getMessage();
         } else {
             return;
         }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/test/java/org/apache/logging/log4j/core/CollectionLoggingTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/CollectionLoggingTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/CollectionLoggingTest.java
index 505bf3f..d1ca640 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/CollectionLoggingTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/CollectionLoggingTest.java
@@ -24,7 +24,7 @@ import java.util.Map;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 import org.apache.logging.log4j.test.appender.ListAppender;
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -61,7 +61,7 @@ public class CollectionLoggingTest {
         final Map<String, String> map = new HashMap<>();
         map.put("MyKey1", "MyValue1");
         map.put("MyKey2", "MyValue2");
-        logger.error(new MapMessage(map));
+        logger.error(new StringMapMessage(map));
         logger.error(map);
         // TODO: some assertions
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
index 7c4abd1..69ffe2c 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
@@ -32,7 +32,7 @@ import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.MarkerManager;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.util.Constants;
-import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 import org.apache.logging.log4j.util.Strings;
 
 import com.google.monitoring.runtime.instrumentation.AllocationRecorder;
@@ -70,7 +70,7 @@ public class GcFreeLoggingTestUtil {
         logger.fatal(test, "This message is logged to the console");
         logger.error("Sample error message");
         logger.error("Test parameterized message {}", "param");
-        logger.error(new MapMessage().with("eventId", "Login")); // initialize GelfLayout's messageStringBuilder
+        logger.error(new StringMapMessage().with("eventId", "Login")); // initialize GelfLayout's messageStringBuilder
         for (int i = 0; i < 256; i++) {
             logger.debug("ensure all ringbuffer slots have been used once"); // allocate MutableLogEvent.messageText
         }
@@ -105,7 +105,7 @@ public class GcFreeLoggingTestUtil {
             }
         };
         Thread.sleep(500);
-        final MapMessage mapMessage = new MapMessage().with("eventId", "Login");
+        final StringMapMessage mapMessage = new StringMapMessage().with("eventId", "Login");
         AllocationRecorder.addSampler(sampler);
 
         // now do some steady-state logging

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicyTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicyTest.java
index e18cb00..caee345 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicyTest.java
@@ -25,7 +25,7 @@ import org.apache.logging.log4j.MarkerManager;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.util.KeyValuePair;
-import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.message.StructuredDataMessage;
 import org.apache.logging.log4j.spi.MutableThreadContextStack;
@@ -60,7 +60,7 @@ public class MapRewritePolicyTest {
                 .setTimeMillis(2).build();
 
         logEvent1 = ((Log4jLogEvent) logEvent0).asBuilder() //
-                .setMessage(new MapMessage(map)) //
+                .setMessage(new StringMapMessage(map)) //
                 .setSource(new StackTraceElement("MapRewritePolicyTest", "setupClass", "MapRewritePolicyTest", 29)) //
                 .build();
 
@@ -76,7 +76,7 @@ public class MapRewritePolicyTest {
         logEvent3 = ((Log4jLogEvent) logEvent0).asBuilder() //
                 .setContextStack(stack) //
                 .setLevel(Level.ALL) //
-                .setMessage(new MapMessage(map)) //
+                .setMessage(new StringMapMessage(map)) //
                 .setTimeMillis(Long.MAX_VALUE) //
                 .setSource(new StackTraceElement("MapRewritePolicyTest", "setupClass", "MapRewritePolicyTest", 31)) //
                 .build();
@@ -92,15 +92,15 @@ public class MapRewritePolicyTest {
 
         rewritten = addPolicy.rewrite(logEvent1);
         compareLogEvents(logEvent1, rewritten);
-        checkAdded(((MapMessage)rewritten.getMessage()).getData());
+        checkAdded(((StringMapMessage)rewritten.getMessage()).getData());
 
         rewritten = addPolicy.rewrite(logEvent2);
         compareLogEvents(logEvent2, rewritten);
-        checkAdded(((MapMessage)rewritten.getMessage()).getData());
+        checkAdded(((StructuredDataMessage)rewritten.getMessage()).getData());
 
         rewritten = addPolicy.rewrite(logEvent3);
         compareLogEvents(logEvent3, rewritten);
-        checkAdded(((MapMessage)rewritten.getMessage()).getData());
+        checkAdded(((StringMapMessage)rewritten.getMessage()).getData());
     }
 
     @Test
@@ -112,15 +112,15 @@ public class MapRewritePolicyTest {
 
         rewritten = updatePolicy.rewrite(logEvent1);
         compareLogEvents(logEvent1, rewritten);
-        checkUpdated(((MapMessage)rewritten.getMessage()).getData());
+        checkUpdated(((StringMapMessage)rewritten.getMessage()).getData());
 
         rewritten = updatePolicy.rewrite(logEvent2);
         compareLogEvents(logEvent2, rewritten);
-        checkUpdated(((MapMessage)rewritten.getMessage()).getData());
+        checkUpdated(((StructuredDataMessage)rewritten.getMessage()).getData());
 
         rewritten = updatePolicy.rewrite(logEvent3);
         compareLogEvents(logEvent3, rewritten);
-        checkUpdated(((MapMessage)rewritten.getMessage()).getData());
+        checkUpdated(((StringMapMessage)rewritten.getMessage()).getData());
     }
 
     @Test
@@ -132,15 +132,15 @@ public class MapRewritePolicyTest {
 
         rewritten = addPolicy.rewrite(logEvent1);
         compareLogEvents(logEvent1, rewritten);
-        checkAdded(((MapMessage)rewritten.getMessage()).getData());
+        checkAdded(((StringMapMessage)rewritten.getMessage()).getData());
 
         rewritten = addPolicy.rewrite(logEvent2);
         compareLogEvents(logEvent2, rewritten);
-        checkAdded(((MapMessage)rewritten.getMessage()).getData());
+        checkAdded(((StructuredDataMessage)rewritten.getMessage()).getData());
 
         rewritten = addPolicy.rewrite(logEvent3);
         compareLogEvents(logEvent3, rewritten);
-        checkAdded(((MapMessage)rewritten.getMessage()).getData());
+        checkAdded(((StringMapMessage)rewritten.getMessage()).getData());
     }
 
     private void checkAdded(final Map<String, String> addedMap) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppenderTest.java
index 1c9c9b1..fb87ad9 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppenderTest.java
@@ -29,7 +29,6 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.apache.logging.log4j.message.MapMessage;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.StructuredDataMessage;
 import org.apache.logging.log4j.test.appender.ListAppender;
@@ -71,8 +70,8 @@ public class RewriteAppenderTest {
         assertTrue("Incorrect number of events. Expected 1, got " + list.size(), list.size() == 1);
         final LogEvent event = list.get(0);
         final Message m = event.getMessage();
-        assertTrue("Message is not a MapMessage", m instanceof MapMessage);
-        final MapMessage message = (MapMessage) m;
+        assertTrue("Message is not a StringMapMessage: " + m.getClass(), m instanceof StructuredDataMessage);
+        final StructuredDataMessage message = (StructuredDataMessage) m;
         final Map<String, String> map = message.getData();
         assertNotNull("No Map", map);
         assertTrue("Incorrect number of map entries, expected 3 got " + map.size(), map.size() == 3);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java
index 61006cb..7310d38 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/MapFilterTest.java
@@ -27,7 +27,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.util.KeyValuePair;
 import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 import org.apache.logging.log4j.test.appender.ListAppender;
 import org.junit.ClassRule;
 import org.junit.Test;
@@ -48,7 +48,7 @@ public class MapFilterTest {
                                                     new KeyValuePair("ToAccount", "123456")};
         MapFilter filter = MapFilter.createFilter(pairs, "and", null, null);
         filter.start();
-        MapMessage msg = new MapMessage();
+        StringMapMessage msg = new StringMapMessage();
         msg.put("ToAccount", "123456");
         msg.put("FromAccount", "211000");
         msg.put("Amount", "1000.00");
@@ -58,7 +58,7 @@ public class MapFilterTest {
         assertSame(Filter.Result.DENY, filter.filter(null, Level.ERROR, null, msg, null));
         filter = MapFilter.createFilter(pairs, "or", null, null);
         filter.start();
-        msg = new MapMessage();
+        msg = new StringMapMessage();
         msg.put("ToAccount", "123456");
         msg.put("FromAccount", "211000");
         msg.put("Amount", "1000.00");
@@ -85,7 +85,7 @@ public class MapFilterTest {
         final Logger logger = LogManager.getLogger(MapFilterTest.class);
         final Map<String, String> eventMap = new HashMap<>();
         eventMap.put("eventId", "Login");
-        logger.debug(new MapMessage(eventMap));
+        logger.debug(new StringMapMessage(eventMap));
         final ListAppender app = context.getListAppender("LIST");
         final List<String> msgs = app.getMessages();
         assertNotNull("No messages", msgs);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/MapLookupTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/MapLookupTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/MapLookupTest.java
index 313b527..61d81ec 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/MapLookupTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/MapLookupTest.java
@@ -22,7 +22,7 @@ import java.util.HashMap;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
-import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 import org.junit.Test;
 
 /**
@@ -73,7 +73,7 @@ public class MapLookupTest {
       map.put("A", "B");
       final HashMap<String, String> eventMap = new HashMap<>();
       eventMap.put("A1", "B1");
-      final MapMessage message = new MapMessage(eventMap);
+      final StringMapMessage message = new StringMapMessage(eventMap);
       final LogEvent event = Log4jLogEvent.newBuilder()
                 .setMessage(message)
                 .build();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MapPatternConverterTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MapPatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MapPatternConverterTest.java
index 23ebd36..811924a 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MapPatternConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MapPatternConverterTest.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
-import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 import org.junit.Test;
 
 import static org.junit.Assert.*;
@@ -32,7 +32,7 @@ public class MapPatternConverterTest {
     @Test
     public void testConverter() {
 
-        final MapMessage msg = new MapMessage();
+        final StringMapMessage msg = new StringMapMessage();
         msg.put("subject", "I");
         msg.put("verb", "love");
         msg.put("object", "Log4j");
@@ -58,7 +58,7 @@ public class MapPatternConverterTest {
     @Test
     public void testConverterWithKey() {
 
-        final MapMessage msg = new MapMessage();
+        final StringMapMessage msg = new StringMapMessage();
         msg.put("subject", "I");
         msg.put("verb", "love");
         msg.put("object", "Log4j");

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
----------------------------------------------------------------------
diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
index a1059df..01559f2 100644
--- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
+++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
@@ -29,7 +29,6 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LoggingException;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.ThreadContext;
-import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.impl.ThrowableProxy;
@@ -39,6 +38,7 @@ import org.apache.logging.log4j.message.MapMessage;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.StructuredDataId;
 import org.apache.logging.log4j.message.StructuredDataMessage;
+import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.Strings;
 
 /**
@@ -133,11 +133,13 @@ public class FlumeEvent extends SimpleEvent implements LogEvent {
         final Message message = event.getMessage();
         if (message instanceof MapMessage) {
             // Add the guid to the Map so that it can be included in the Layout.
-            ((MapMessage) message).put(GUID, guid);
+        	@SuppressWarnings("unchecked")
+			MapMessage<?, String> stringMapMessage = (MapMessage<?, String>) message;
+        	stringMapMessage.put(GUID, guid);
             if (message instanceof StructuredDataMessage) {
                 addStructuredData(eventPrefix, headers, (StructuredDataMessage) message);
             }
-            addMapData(eventPrefix, headers, (MapMessage) message);
+            addMapData(eventPrefix, headers, stringMapMessage);
         } else {
             headers.put(GUID, guid);
         }
@@ -152,7 +154,7 @@ public class FlumeEvent extends SimpleEvent implements LogEvent {
         fields.put(prefix + EVENT_ID, id.getName());
     }
 
-    protected void addMapData(final String prefix, final Map<String, String> fields, final MapMessage msg) {
+    protected void addMapData(final String prefix, final Map<String, String> fields, final MapMessage<?, String> msg) {
         final Map<String, String> data = msg.getData();
         for (final Map.Entry<String, String> entry : data.entrySet()) {
             fields.put(prefix + entry.getKey(), entry.getValue());

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java
index 48397b5..4a8cfc9 100644
--- a/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java
+++ b/log4j-flume-ng/src/test/java/org/apache/logging/log4j/flume/appender/FlumePersistentAppenderTest.java
@@ -153,7 +153,7 @@ public class FlumePersistentAppenderTest {
             final Event event = primary.poll();
             Assert.assertNotNull("Received " + i + " events. Event " + (i + 1) + " is null", event);
             final String value = event.getHeaders().get("counter");
-            Assert.assertNotNull("Missing counter", value);
+            Assert.assertNotNull("Missing 'counter' in map " + event.getHeaders() + ", i = " + i, value);
             final int counter = Integer.parseInt(value);
             if (fields[counter]) {
                 Assert.fail("Duplicate event");

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-samples/loggerProperties/src/main/java/org/apache/logging/log4j/lookup/CustomMapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-samples/loggerProperties/src/main/java/org/apache/logging/log4j/lookup/CustomMapMessage.java b/log4j-samples/loggerProperties/src/main/java/org/apache/logging/log4j/lookup/CustomMapMessage.java
index dabd91e..06f78f4 100644
--- a/log4j-samples/loggerProperties/src/main/java/org/apache/logging/log4j/lookup/CustomMapMessage.java
+++ b/log4j-samples/loggerProperties/src/main/java/org/apache/logging/log4j/lookup/CustomMapMessage.java
@@ -17,7 +17,7 @@
 package org.apache.logging.log4j.lookup;
 
 import org.apache.logging.log4j.message.AsynchronouslyFormattable;
-import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 
 import java.util.Map;
 
@@ -25,7 +25,7 @@ import java.util.Map;
  *
  */
 @AsynchronouslyFormattable
-public class CustomMapMessage extends MapMessage {
+public class CustomMapMessage extends StringMapMessage {
 
     private static final long serialVersionUID = 1L;
     private final String message;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/log4j-samples/loggerProperties/src/main/java/org/apache/logging/log4j/lookup/MapMessageLookup.java
----------------------------------------------------------------------
diff --git a/log4j-samples/loggerProperties/src/main/java/org/apache/logging/log4j/lookup/MapMessageLookup.java b/log4j-samples/loggerProperties/src/main/java/org/apache/logging/log4j/lookup/MapMessageLookup.java
index 0bcd0dd..1184382 100644
--- a/log4j-samples/loggerProperties/src/main/java/org/apache/logging/log4j/lookup/MapMessageLookup.java
+++ b/log4j-samples/loggerProperties/src/main/java/org/apache/logging/log4j/lookup/MapMessageLookup.java
@@ -23,7 +23,7 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.lookup.AbstractLookup;
 import org.apache.logging.log4j.core.lookup.StrLookup;
-import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.status.StatusLogger;
 
@@ -52,9 +52,9 @@ public class MapMessageLookup extends AbstractLookup {
     @Override
     public String lookup(final LogEvent event, final String key) {
         final Message msg = event.getMessage();
-        if (msg instanceof MapMessage) {
+        if (msg instanceof StringMapMessage) {
             try {
-                final Map<String, String> properties = ((MapMessage) msg).getData();
+                final Map<String, String> properties = ((StringMapMessage) msg).getData();
                 if (properties == null) {
                     return "";
                 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/76aff589/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index b2b6b16..846eb8c 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -40,6 +40,9 @@
       <action issue="LOG4J2-1442" dev="mikes" type="add">
         Generic HTTP appender.
       </action>
+      <action issue="LOG4J2-1935" dev="ggregory" type="add">
+        Add with(String, primitive) methods to org.apache.logging.log4j.message.MapMessage.
+      </action>
       <action issue="LOG4J2-1930" dev="ggregory" type="add">
         Add forEach() methods to org.apache.logging.log4j.message.MapMessage.
       </action>