You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/09/24 16:49:02 UTC

[1/2] logging-log4j2 git commit: LOG4J2-1611 ensure JdkMapAdapterStringMap::forEach returns consistent (alphabetic) order for predictable test results

Repository: logging-log4j2
Updated Branches:
  refs/heads/master cfa4aa577 -> 1c0359314


LOG4J2-1611 ensure JdkMapAdapterStringMap::forEach returns consistent (alphabetic) order for predictable test results


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

Branch: refs/heads/master
Commit: 2621cfd5cc08cdb109e4f8bdfb99c7bcf6b9540a
Parents: 11101ce
Author: rpopma <rp...@apache.org>
Authored: Sun Sep 25 01:41:59 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Sep 25 01:41:59 2016 +0900

----------------------------------------------------------------------
 .../log4j/core/impl/JdkMapAdapterStringMap.java | 50 +++++++++++++++++---
 .../core/impl/JdkMapAdapterStringMapTest.java   | 33 +++++++------
 2 files changed, 60 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2621cfd5/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMap.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMap.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMap.java
index 4e22a25..4efc6e8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMap.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMap.java
@@ -16,10 +16,11 @@
  */
 package org.apache.logging.log4j.core.impl;
 
+import java.util.Arrays;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
-import java.util.TreeMap;
 
 import org.apache.logging.log4j.util.BiConsumer;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
@@ -32,9 +33,22 @@ import org.apache.logging.log4j.util.TriConsumer;
 class JdkMapAdapterStringMap implements StringMap {
     private static final long serialVersionUID = -7348247784983193612L;
     private static final String FROZEN = "Frozen collection cannot be modified";
+    private static final Comparator<? super String> NULL_FIRST_COMPARATOR = new Comparator<String>() {
+        @Override
+        public int compare(final String left, final String right) {
+            if (left == null) {
+                return -1;
+            }
+            if (right == null) {
+                return 1;
+            }
+            return left.compareTo(right);
+        }
+    };
 
     private final Map<String, String> map;
     private boolean immutable = false;
+    private transient String[] sortedKeys;
 
     public JdkMapAdapterStringMap() {
         this(new HashMap<String, String>());
@@ -63,19 +77,29 @@ class JdkMapAdapterStringMap implements StringMap {
     @SuppressWarnings("unchecked")
     @Override
     public <V> void forEach(final BiConsumer<String, ? super V> action) {
-        for (Map.Entry<String, String> entry : map.entrySet()) {
-            action.accept(entry.getKey(), (V) entry.getValue());
+        final String[] keys = getSortedKeys();
+        for (int i = 0; i < keys.length; i++) {
+            action.accept(keys[i], (V) map.get(keys[i]));
         }
     }
 
     @SuppressWarnings("unchecked")
     @Override
     public <V, S> void forEach(final TriConsumer<String, ? super V, S> action, final S state) {
-        for (Map.Entry<String, String> entry : map.entrySet()) {
-            action.accept(entry.getKey(), (V) entry.getValue(), state);
+        final String[] keys = getSortedKeys();
+        for (int i = 0; i < keys.length; i++) {
+            action.accept(keys[i], (V) map.get(keys[i]), state);
         }
     }
 
+    private String[] getSortedKeys() {
+        if (sortedKeys == null) {
+            sortedKeys = map.keySet().toArray(new String[map.size()]);
+            Arrays.sort(sortedKeys, NULL_FIRST_COMPARATOR);
+        }
+        return sortedKeys;
+    }
+
     @SuppressWarnings("unchecked")
     @Override
     public <V> V getValue(final String key) {
@@ -99,6 +123,7 @@ class JdkMapAdapterStringMap implements StringMap {
         }
         assertNotFrozen();
         map.clear();
+        sortedKeys = null;
     }
 
     @Override
@@ -115,6 +140,7 @@ class JdkMapAdapterStringMap implements StringMap {
     public void putAll(final ReadOnlyStringMap source) {
         assertNotFrozen();
         source.forEach(PUT_ALL, map);
+        sortedKeys = null;
     }
 
     private static TriConsumer<String, String, Map<String, String>> PUT_ALL = new TriConsumer<String, String, Map<String, String>>() {
@@ -128,6 +154,7 @@ class JdkMapAdapterStringMap implements StringMap {
     public void putValue(final String key, final Object value) {
         assertNotFrozen();
         map.put(key, value == null ? null : String.valueOf(value));
+        sortedKeys = null;
     }
 
     @Override
@@ -137,11 +164,22 @@ class JdkMapAdapterStringMap implements StringMap {
         }
         assertNotFrozen();
         map.remove(key);
+        sortedKeys = null;
     }
 
     @Override
     public String toString() {
-        return new TreeMap<>(map).toString();
+        final StringBuilder result = new StringBuilder(map.size() * 13);
+        result.append('{');
+        final String[] keys = getSortedKeys();
+        for (int i = 0; i < keys.length; i++) {
+            if (i > 0) {
+                result.append(", ");
+            }
+            result.append(keys[i]).append('=').append(map.get(keys[i]));
+        }
+        result.append('}');
+        return result.toString();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2621cfd5/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java
index 027ca45..c8c8db1 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMapTest.java
@@ -21,7 +21,6 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-import java.util.ConcurrentModificationException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -451,8 +450,8 @@ public class JdkMapAdapterStringMapTest {
         assertEquals("ccc", original.getValue("c"));
     }
 
-    @Test(expected = ConcurrentModificationException.class)
-    public void testConcurrentModificationBiConsumerPut() {
+    @Test
+    public void testNoConcurrentModificationBiConsumerPut() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         original.putValue("a", "aaa");
         original.putValue("b", "aaa");
@@ -467,8 +466,8 @@ public class JdkMapAdapterStringMapTest {
         });
     }
 
-    @Test(expected = ConcurrentModificationException.class)
-    public void testConcurrentModificationBiConsumerPutValue() {
+    @Test
+    public void testNoConcurrentModificationBiConsumerPutValue() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         original.putValue("a", "aaa");
         original.putValue("b", "aaa");
@@ -483,8 +482,8 @@ public class JdkMapAdapterStringMapTest {
         });
     }
 
-    @Test(expected = ConcurrentModificationException.class)
-    public void testConcurrentModificationBiConsumerRemove() {
+    @Test
+    public void testNoConcurrentModificationBiConsumerRemove() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         original.putValue("a", "aaa");
         original.putValue("b", "aaa");
@@ -497,8 +496,8 @@ public class JdkMapAdapterStringMapTest {
         });
     }
 
-    @Test(expected = ConcurrentModificationException.class)
-    public void testConcurrentModificationBiConsumerClear() {
+    @Test
+    public void testNoConcurrentModificationBiConsumerClear() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         original.putValue("a", "aaa");
         original.putValue("b", "aaa");
@@ -513,8 +512,8 @@ public class JdkMapAdapterStringMapTest {
         });
     }
 
-    @Test(expected = ConcurrentModificationException.class)
-    public void testConcurrentModificationTriConsumerPut() {
+    @Test
+    public void testNoConcurrentModificationTriConsumerPut() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         original.putValue("a", "aaa");
         original.putValue("b", "aaa");
@@ -528,8 +527,8 @@ public class JdkMapAdapterStringMapTest {
         }, null);
     }
 
-    @Test(expected = ConcurrentModificationException.class)
-    public void testConcurrentModificationTriConsumerPutValue() {
+    @Test
+    public void testNoConcurrentModificationTriConsumerPutValue() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         original.putValue("a", "aaa");
         original.putValue("b", "aaa");
@@ -544,8 +543,8 @@ public class JdkMapAdapterStringMapTest {
         }, null);
     }
 
-    @Test(expected = ConcurrentModificationException.class)
-    public void testConcurrentModificationTriConsumerRemove() {
+    @Test
+    public void testNoConcurrentModificationTriConsumerRemove() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         original.putValue("a", "aaa");
         original.putValue("b", "aaa");
@@ -558,8 +557,8 @@ public class JdkMapAdapterStringMapTest {
         }, null);
     }
 
-    @Test(expected = ConcurrentModificationException.class)
-    public void testConcurrentModificationTriConsumerClear() {
+    @Test
+    public void testNoConcurrentModificationTriConsumerClear() {
         final JdkMapAdapterStringMap original = new JdkMapAdapterStringMap();
         original.putValue("a", "aaa");
         original.putValue("b", "aaa");


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

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

Branch: refs/heads/master
Commit: 1c0359314cb03e9ae77fdf1d1dafe9e7fd8e702e
Parents: 2621cfd cfa4aa5
Author: rpopma <rp...@apache.org>
Authored: Sun Sep 25 01:48:49 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Sep 25 01:48:49 2016 +0900

----------------------------------------------------------------------
 .../config/Log4j1ConfigurationFactoryTest.java      | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)
----------------------------------------------------------------------