Author: niallp
Date: Sun Jan  9 20:38:33 2011
New Revision: 1057022

URL: http://svn.apache.org/viewvc?rev=1057022&view=rev
Log:
Port LANG-667 to LANG 2.x Branch - Add a Null-safe compare() method to 
ObjectUtils

Modified:
    
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/ObjectUtils.java
    
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/ObjectUtilsTest.java

Modified: 
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/ObjectUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/ObjectUtils.java?rev=1057022&r1=1057021&r2=1057022&view=diff
==============================================================================
--- 
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/ObjectUtils.java
 (original)
+++ 
commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/ObjectUtils.java
 Sun Jan  9 20:38:33 2011
@@ -287,11 +287,7 @@ public class ObjectUtils {
      *  </ul>
      */
     public static Object min(Comparable c1, Comparable c2) {
-        if (c1 != null && c2 != null) {
-            return c1.compareTo(c2) < 1 ? c1 : c2;
-        } else {
-            return c1 != null ? c1 : c2;
-        }                              
+        return (compare(c1, c2, true) <= 0 ? c1 : c2);
     }
 
     /**
@@ -308,11 +304,45 @@ public class ObjectUtils {
      *  </ul>
      */
     public static Object max(Comparable c1, Comparable c2) {
-        if (c1 != null && c2 != null) {
-            return c1.compareTo(c2) >= 0 ? c1 : c2;
-        } else {
-            return c1 != null ? c1 : c2;
+        return (compare(c1, c2, false) >= 0 ? c1 : c2);
+    }
+
+    /**
+     * Null safe comparison of Comparables.
+     * {...@code null} is assumed to be less than a no...@code null} value.
+     * 
+     * @param c1  the first comparable, may be null
+     * @param c2  the second comparable, may be null
+     * @return a negative value if c1 < c2, zero if c1 = c2
+     * and a positive value if c1 > c2
+     * @since 2.6
+     */
+    public static int compare(Comparable c1, Comparable c2) {
+        return compare(c1, c2, false);
+    }
+
+    /**
+     * Null safe comparison of Comparables.
+     * 
+     * @param c1  the first comparable, may be null
+     * @param c2  the second comparable, may be null
+     * @param nullGreater if true <code>null</code> is considered greater
+     * than a Non-<code>null</code> value or if false <code>null</code> is
+     * considered less than a Non-<code>null</code> value
+     * @return a negative value if c1 < c2, zero if c1 = c2
+     * and a positive value if c1 > c2
+     * @see java.util.Comparator#compare(Object, Object)
+     * @since 2.6
+     */
+    public static int compare(Comparable c1, Comparable c2, boolean 
nullGreater) {
+        if (c1 == c2) {
+            return 0;
+        } else if (c1 == null) {
+            return (nullGreater ? 1 : -1);
+        } else if (c2 == null) {
+            return (nullGreater ? -1 : 1);
         }
+        return c1.compareTo(c2);
     }
     
     /**

Modified: 
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/ObjectUtilsTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/ObjectUtilsTest.java?rev=1057022&r1=1057021&r2=1057022&view=diff
==============================================================================
--- 
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/ObjectUtilsTest.java
 (original)
+++ 
commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/ObjectUtilsTest.java
 Sun Jan  9 20:38:33 2011
@@ -210,6 +210,27 @@ public class ObjectUtilsTest extends Tes
     }
 
     /**
+     * Tests {...@link ObjectUtils#compare(Comparable, Comparable, boolean)}.
+     */
+    public void testCompare() {
+        Integer one = new Integer(1);
+        Integer two = new Integer(2);
+        Integer nullValue = null;
+
+        assertEquals("Null Null false", 0, ObjectUtils.compare(nullValue, 
nullValue));
+        assertEquals("Null Null true",  0, ObjectUtils.compare(nullValue, 
nullValue, true));
+
+        assertEquals("Null one false", -1, ObjectUtils.compare(nullValue, 
one));
+        assertEquals("Null one true",   1, ObjectUtils.compare(nullValue, one, 
true));
+        
+        assertEquals("one Null false", 1, ObjectUtils.compare(one, nullValue));
+        assertEquals("one Null true", -1, ObjectUtils.compare(one, nullValue, 
true));
+
+        assertEquals("one two false", -1, ObjectUtils.compare(one, two));
+        assertEquals("one two true",  -1, ObjectUtils.compare(one, two, true));
+    }
+
+    /**
      * Tests {...@link ObjectUtils#clone(Object)} with a cloneable object.
      */
     public void testCloneOfCloneable() {


Reply via email to