From 06f64ca95ed4c3a9e3e8d376a619a7d3cb738e1c Mon Sep 17 00:00:00 2001 From: Jonas Holtkamp Date: Thu, 25 May 2017 21:17:40 +0200 Subject: [PATCH 1/2] Null-safe implementation of CollectionUtils#isEqualCollection --- .../commons/collections4/CollectionUtils.java | 20 ++++++++++++++ .../collections4/CollectionUtilsTest.java | 26 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/main/java/org/apache/commons/collections4/CollectionUtils.java b/src/main/java/org/apache/commons/collections4/CollectionUtils.java index 5bab383dfa..f65f5c12bc 100644 --- a/src/main/java/org/apache/commons/collections4/CollectionUtils.java +++ b/src/main/java/org/apache/commons/collections4/CollectionUtils.java @@ -503,12 +503,21 @@ public static boolean isProperSubCollection(final Collection a, final Collect * That is, iff the cardinality of e in a is * equal to the cardinality of e in b, * for each element e in a or b. + *

+ * {@code null}s are handled without exceptions. Two {@code null} + * references are considered to be equal. * * @param a the first collection, must not be null * @param b the second collection, must not be null * @return true iff the collections contain the same elements with the same cardinalities. */ public static boolean isEqualCollection(final Collection a, final Collection b) { + if(a == null && b == null) { + return true; + } + if(a == null || b == null) { + return false; + } if(a.size() != b.size()) { return false; } @@ -532,6 +541,9 @@ public static boolean isEqualCollection(final Collection a, final Collection< * equal to the cardinality of e in b, * for each element e in a or b. *

+ * {@code null}s are handled without exceptions. Two {@code null} + * references are considered to be equal. + *

* Note: from version 4.1 onwards this method requires the input * collections and equator to be of compatible type (using bounded wildcards). * Providing incompatible arguments (e.g. by casting to their rawtypes) @@ -548,6 +560,14 @@ public static boolean isEqualCollection(final Collection a, final Collection< public static boolean isEqualCollection(final Collection a, final Collection b, final Equator equator) { + if(a == null && b == null) { + return true; + } + + if(a == null || b == null) { + return false; + } + if (equator == null) { throw new NullPointerException("Equator must not be null."); } diff --git a/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java b/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java index 0765dca8fd..70f661332e 100644 --- a/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java +++ b/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java @@ -559,6 +559,13 @@ public void testIsEqualCollection2() { assertTrue(CollectionUtils.isEqualCollection(b, a)); } + @Test + public void testIsEqualCollectionWithNulls() { + assertTrue(CollectionUtils.isEqualCollection(null, null)); + assertFalse(CollectionUtils.isEqualCollection(collectionA, null)); + assertFalse(CollectionUtils.isEqualCollection(null, collectionA)); + } + @Test public void testIsEqualCollectionEquator() { final Collection collB = CollectionUtils.collect(collectionB, TRANSFORM_TO_INTEGER); @@ -594,6 +601,25 @@ public void testIsEqualCollectionNullEquator() { CollectionUtils.isEqualCollection(collectionA, collectionA, null); } + @Test + public void testIsEqualCollectionEquatorWithNulls() { + Equator equator = new Equator() { + @Override + public boolean equate(Object o1, Object o2) { + return false; + } + + @Override + public int hash(Object o) { + return 0; + } + }; + + assertTrue(CollectionUtils.isEqualCollection(null, null, equator)); + assertFalse(CollectionUtils.isEqualCollection(collectionA, null, equator)); + assertFalse(CollectionUtils.isEqualCollection(null, collectionA, equator)); + } + @Test public void testIsProperSubCollection() { final Collection a = new ArrayList(); From bdaef5dfd3c705aec8271a3a33a3cf5364d0d515 Mon Sep 17 00:00:00 2001 From: Jonas Holtkamp Date: Sat, 27 May 2017 18:03:13 +0200 Subject: [PATCH 2/2] Removed redundant null checks in overloaded isEqualCollection --- .../apache/commons/collections4/CollectionUtils.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/java/org/apache/commons/collections4/CollectionUtils.java b/src/main/java/org/apache/commons/collections4/CollectionUtils.java index f65f5c12bc..7f047e796e 100644 --- a/src/main/java/org/apache/commons/collections4/CollectionUtils.java +++ b/src/main/java/org/apache/commons/collections4/CollectionUtils.java @@ -560,22 +560,10 @@ public static boolean isEqualCollection(final Collection a, final Collection< public static boolean isEqualCollection(final Collection a, final Collection b, final Equator equator) { - if(a == null && b == null) { - return true; - } - - if(a == null || b == null) { - return false; - } - if (equator == null) { throw new NullPointerException("Equator must not be null."); } - if(a.size() != b.size()) { - return false; - } - @SuppressWarnings({ "unchecked", "rawtypes" }) final Transformer transformer = new Transformer() { @Override