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/01 17:55:35 UTC

logging-log4j2 git commit: [LOG4J2-1930] Add forEach() methods to org.apache.logging.log4j.message.MapMessage.

Repository: logging-log4j2
Updated Branches:
  refs/heads/master bda86100d -> 1b980d882


[LOG4J2-1930] Add forEach() methods to
org.apache.logging.log4j.message.MapMessage.

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

Branch: refs/heads/master
Commit: 1b980d8827fa0f568a515765dea7715a89bf28ff
Parents: bda8610
Author: Gary Gregory <gg...@apache.org>
Authored: Thu Jun 1 10:55:33 2017 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Thu Jun 1 10:55:33 2017 -0700

----------------------------------------------------------------------
 .../logging/log4j/message/MapMessage.java       | 54 ++++++++++++++++++++
 .../log4j/core/appender/mom/JmsManager.java     | 23 ++++++---
 src/changes/changes.xml                         |  3 ++
 3 files changed, 72 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1b980d88/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 1e17b53..1bc23bc 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
@@ -20,14 +20,17 @@ import java.util.Collections;
 import java.util.Map;
 import java.util.TreeMap;
 
+import org.apache.logging.log4j.util.BiConsumer;
 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.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;
 
 /**
  * Represents a Message that consists of a Map.
@@ -214,6 +217,57 @@ public class MapMessage implements MultiformatMessage, StringBuilderFormattable
     }
     
     /**
+     * Performs the given action for each key-value pair in this data structure
+     * until all entries have been processed or the action throws an exception.
+     * <p>
+     * Some implementations may not support structural modifications (adding new elements or removing elements) while
+     * iterating over the contents. In such implementations, attempts to add or remove elements from the
+     * {@code BiConsumer}'s {@link BiConsumer#accept(Object, Object)} accept} method may cause a
+     * {@code ConcurrentModificationException} to be thrown.
+     * </p>
+     *
+     * @param action The action to be performed for each key-value pair in this collection
+     * @param <V> type of the 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) {
+        data.forEach(action);
+    }
+
+    /**
+     * Performs the given action for each key-value pair in this data structure
+     * until all entries have been processed or the action throws an exception.
+     * <p>
+     * The third parameter lets callers pass in a stateful object to be modified with the key-value pairs,
+     * so the TriConsumer implementation itself can be stateless and potentially reusable.
+     * </p>
+     * <p>
+     * Some implementations may not support structural modifications (adding new elements or removing elements) while
+     * iterating over the contents. In such implementations, attempts to add or remove elements from the
+     * {@code TriConsumer}'s {@link TriConsumer#accept(Object, Object, Object) accept} method may cause a
+     * {@code ConcurrentModificationException} to be thrown.
+     * </p>
+     *
+     * @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 <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
+     *          {@link #forEach(TriConsumer, Object)}.
+     * @see ReadOnlyStringMap#forEach(TriConsumer, Object)
+     * @since 2.9
+     */
+    public <V, S> void forEach(final TriConsumer<String, ? super V, S> action, final S state) {
+        data.forEach(action, state);
+    }
+    
+    /**
      * Format the Structured data as described in RFC 5424.
      *
      * @param format The format identifier. Ignored in this implementation.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1b980d88/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 6556eac..cddf791 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
@@ -18,7 +18,6 @@
 package org.apache.logging.log4j.core.appender.mom;
 
 import java.io.Serializable;
-import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 import javax.jms.Connection;
@@ -37,6 +36,7 @@ import org.apache.logging.log4j.core.appender.AbstractManager;
 import org.apache.logging.log4j.core.appender.ManagerFactory;
 import org.apache.logging.log4j.core.net.JndiManager;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.BiConsumer;
 
 /**
  * JMS connection and session manager. Can be used to access MessageProducer, MessageConsumer, and Message objects
@@ -139,16 +139,23 @@ public class JmsManager extends AbstractManager {
         return this.session.createObjectMessage(object);
     }
 
-    private MapMessage map(final org.apache.logging.log4j.message.MapMessage log4jMapMessage, final MapMessage jmsMapMessage)
-            throws JMSException {
-        // Call getData() only once.
-        final Map<String, String> data = log4jMapMessage.getData();
-        for (Map.Entry<String, String> entry : data.entrySet()) {
-            jmsMapMessage.setString(entry.getKey(), entry.getValue());
-        }
+    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>() {
+            @Override
+            public void accept(final String key, final String value) {
+                try {
+                    jmsMapMessage.setString(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);
+                }
+            }
+        });
         return jmsMapMessage;
     }
 
+
     @Override
     protected boolean releaseSub(final long timeout, final TimeUnit timeUnit) {
         boolean closed = true;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/1b980d88/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 9be1872..61c0496 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-1930" dev="ggregory" type="add">
+        Add forEach() methods to org.apache.logging.log4j.message.MapMessage.
+      </action>
       <action issue="LOG4J2-1917" dev="rgoers" type="update">
         Support using java.util.ServiceLoader to locate Log4j 2 API providers.
       </action>